این سند نحوه ایجاد سفر اشتراکی، تنظیم فیلدهای صحیح، و واگذاری آن به خودرو برای انجام را شرح میدهد. این راهنما فرض میکند که Fleet Engine را راهاندازی کردهاید، وسایل نقلیه را ایجاد کردهاید، برنامه راننده فعال دارید، و بهطور اختیاری، برنامه مصرفکننده دارید. همچنین باید با سناریوهای مختلف سفر موجود برای سفرهای درخواستی آشنا باشید. برای این کار، راهنماهای مرتبط زیر را ببینید:
- راهاندازی Fleet Engine
- ایجاد خودرو
- سناریوهای سفر در نمای کلی سفرهای درخواستی
اصول اولیه ایجاد سفر
این بخش جزئیات درخواست لازم برای ایجاد سفر در Fleet Engine را شرح میدهد. درخواست ایجاد را بااستفاده از gRPC یا REST صادر میکنید.
فیلدهای سفر
از فیلدهای زیر برای ایجاد سفر در Fleet Engine استفاده کنید. میتوانید از فیلدهای مختلفی برای انواع مختلف سفرها استفاده کنید: تکمقصدی یا چندمقصدی، پشتسرهم، یا سفرهای اشتراکی. میتوانید فیلدهای اختیاری را هنگام ایجاد سفر ارائه دهید، یا میتوانید آنها را بعداً هنگام بهروزرسانی سفر تنظیم کنید.
| نام | الزامی است؟ | شرح |
|---|---|---|
| ولی | بله | رشتهای که شامل شناسه پروژه است. این شناسه باید همان شناسهای باشد که در سراسر ادغام Fleet Engine شما با همان نقشهای حساب سرویس استفاده میشود. |
| trip_id | بله | رشتهای که ایجاد میکنید و این سفر را بهطور منحصربهفرد شناسایی میکند. شناسههای سفر محدودیتهای خاصی دارند که در مرجع نشان داده شده است. |
| trip_type | بله | TripType را برای نوع سفری که ایجاد میکنید روی مقادیر زیر تنظیم کنید:
|
| pickup_point | بله | نقطه مبدأ سفر. |
| مقصدهای میانی | بله | فقط سفرهای چندمقصدی: فهرست مقصدهای میانی که راننده بین سوار کردن و پیاده کردن مسافر از آنها بازدید میکند. مانند |
| vehicle_waypoints | بله | فقط سفرهای اشتراکی: این فیلد از درهمبافی نقاطمسیر از چندین سفر پشتیبانی میکند.
این فهرست شامل همه نقاطمسیر باقیمانده برای خودرو اختصاصیافته و همچنین نقاطمسیر سوار کردن و پیاده کردن برای این سفر است. میتوانید این فیلد را
با فراخوانی |
| number_of_passengers | نه | تعداد مسافران در سفر. |
| dropoff_point | نه | مقصد سفر. |
| vehicle_id | نه | شناسه خودرو اختصاصدادهشده به سفر. |
مثال: ایجاد سفر اشتراکی همپولی
نمونه ادغام با پسین زیر نشان میدهد که چگونه سفری ایجاد کنید و آن را بهعنوان سفر اشتراکی به خودرویی اختصاص دهید.
// Vehicle with VEHICLE_ID ID is already created and it is assigned Trip A.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "shared-trip-A";
static final String VEHICLE_ID = "your-vehicle-id";
static final String TRIP_A_ID = "trip-a-id";
static final String TRIP_B_ID = "trip-b-id";
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
String parent = "providers/" + PROJECT_ID;
LatLng tripBPickup =
LatLng.newBuilder().setLatitude(-12.12314).setLongitude(88.142123).build();
LatLng tripBDropoff =
LatLng.newBuilder().setLatitude(-14.12314).setLongitude(90.142123).build();
TerminalLocation tripBPickupTerminalLocation =
TerminalLocation.newBuilder().setPoint(tripBPickup).build();
TerminalLocation tripBDropoffTerminalLocation =
TerminalLocation.newBuilder().setPoint(tripBDropoff).build();
// TripA already exists and it's assigned to a vehicle with VEHICLE_ID ID.
Trip tripB = Trip.newBuilder()
.setTripType(TripType.SHARED)
.setVehicleId(VEHICLE_ID)
.setPickupPoint(tripBPickupTerminalLocation)
.setDropoffPoint(tripBDropoffTerminalLocation)
.addAllVehicleWaypoints(
// This is where you define the arrival order for unvisited waypoints.
// If you don't specify an order, then the Fleet Engine adds Trip B's
// waypoints to the end of Trip A's.
ImmutableList.of(
// Trip B's pickup point.
TripWaypoint.newBuilder()
.setLocation(tripBPickupTerminalLocation)
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
.build(),
// Trip A's drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripA.getDropoffPoint())
.setTripId(TRIP_A_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build(),
// Trip B's drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripBDropoffTerminalLocation)
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build()))
.build();
// Create Trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
.setParent(parent)
.setTripId(TRIP_B_ID)
.setTrip(tripB)
.build();
try {
// createdTrip.remainingWaypoints will contain shared-pool waypoints.
// [tripB.pickup, tripA.dropoff, tripB.dropoff]
Trip createdTrip = tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS:
break;
case PERMISSION_DENIED:
break;
}
return;
}
بهروزرسانی سفرهای اشتراکی همپولی
هر سفری که در Fleet Engine ایجاد میشود باید به خودرویی اختصاص داده شود تا Fleet Engine بتواند زمان تخمینی رسیدن سفر را محاسبه و آن را ردیابی کند. میتوانید این کار را درطول ایجاد سفر یا بعداً هنگام بهروزرسانی سفر انجام دهید.
برای سفرهای اشتراکی، باید ترتیبی برای نقاطمسیر بازدیدنشده
در مجموعه نقاطمسیر خودروی سفر (Trip.vehicle_waypoints) مشخص کنید. Fleet
Engine از این فهرست برای بهروزرسانی خودکار نقاطمسیر سفر برای همه سفرهای
موجود در استخر مشترک استفاده میکند.
برای مثال، دو سفر همپیمایی سفر الف و سفر ب را درنظر بگیرید:
- سفر الف در مسیر رسیدن به مکان پیاده کردن است.
- سپس سفر ب به همان خودرو اضافه میشود.
در یک UpdateTripRequest برای سفر B،
vehicleId را تنظیم میکنید و همچنین Trip.vehicle_waypoints را روی ترتیب بهینه نقطهمسیر تنظیم میکنید: B سوار کردن
→ A پیاده کردن →
B پیاده کردن.
- فراخوانی
getVehicle()remainingWaypointsرا برمیگرداند که حاوی این موارد است:
B سوار کردن ← A پیاده کردن ← B پیاده کردن. getTrip()یاonTripRemainingWaypointsUpdatedفراخوانی برگشتی برای سفر الفremainingWaypointsرا برمیگرداند که حاوی این موارد است:
ب سوار کردن ← الف پیاده کردن.-
getTrip()یاonTripRemainingWaypointsUpdatedفراخوانی برگشتی برای سفر بremainingWaypointsرا برمیگرداند که حاوی این موارد است:
ب سوار کردن ← الف پیاده کردن ← ب پیاده کردن.
مثال
نمونه ادغام پسین زیر نشان میدهد که چگونه میتوان سفری را با شناسه وسیله نقلیه و نقطهمسیرها برای دو سفر استخر مشترک بهروز کرد.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_A_ID = "share-trip-A";
static final String TRIP_B_ID = "share-trip-B";
static final String VEHICLE_ID = "Vehicle";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_B_ID;
// Get Trip A and Trip B objects from either the Fleet Engine or storage.
Trip tripA = …;
Trip tripB = …;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to update.
Trip trip = Trip.newBuilder()
.setVehicleId(VEHICLE_ID)
.addAllVehicleWaypoints(
// This is where you define the arrival order for unvisited waypoints.
// If you don't specify an order, then the Fleet Engine adds Trip B's
// waypoints to the end of Trip A's.
ImmutableList.of(
// Trip B's pickup point.
TripWaypoint.newBuilder()
.setLocation(tripB.getPickupPoint())
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
.build(),
// Trip A's drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripA.getDropoffPoint())
.setTripId(TRIP_A_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build(),
// Trip B's drop-off point.
TripWaypoint.newBuilder()
.setLocation(tripB.getDropoffPoint())
.setTripId(TRIP_B_ID)
.setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
.build()))
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("vehicle_id")
.addPaths("vehicle_waypoints"))
.build();
// Error handling. If Fleet Engine has both a trip and vehicle with the IDs,
// and if the credentials validate, and if the given vehicle_waypoints list
// is valid, then the service updates the trip.
try {
Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND: // Either the trip or vehicle does not exist.
break;
case PERMISSION_DENIED:
break;
case INVALID_REQUEST: // vehicle_waypoints is invalid.
break;
}
return;
}