يوضّح هذا المستند كيفية إنشاء رحلة متعددة الوجهات وتحديد الحقول الصحيحة وتعيينها لمركبة لتنفيذها. ويفترض أنّك أعددت Fleet Engine وأنشأت مركبات ولديك تطبيق سائق يعمل، وتطبيق مستهلك اختياريًا. يجب أيضًا أن تكون على دراية بمختلف سيناريوهات الرحلات المتاحة للرحلات عند الطلب. راجِع الأدلة ذات الصلة التالية لمعرفة ذلك:
- إعداد Fleet Engine
- إنشاء مركبة
- سيناريوهات الرحلات في نظرة عامة على الرحلات عند الطلب
أساسيات إنشاء الرحلات
يوضّح هذا القسم تفاصيل الطلب اللازمة لإنشاء رحلة في Fleet Engine. يمكنك إرسال طلب إنشاء باستخدام gRPC أو REST.
حقول الرحلة
استخدِم الحقول التالية لإنشاء رحلة في Fleet Engine. يمكنك استخدام حقول مختلفة لأنواع الرحلات المختلفة: الرحلات ذات الوجهة الواحدة أو المتعددة، أو الرحلات المتتالية، أو رحلات النقل المشترك. يمكنك تقديم الحقول الاختيارية عند إنشاء الرحلة، أو يمكنك ضبطها لاحقًا عند تعديل الرحلة.
| الاسم | مطلوب؟ | الوصف |
|---|---|---|
| parent | نعم | سلسلة تتضمّن رقم تعريف المشروع يجب أن يكون هذا المعرّف هو المعرّف نفسه المستخدَم في عملية دمج Fleet Engine بالكامل، مع أدوار حساب الخدمة نفسها. |
| trip_id | نعم | سلسلة تنشئها وتحدّد هذه الرحلة بشكل فريد تخضع أرقام تعريف الرحلات لقيود معيّنة، كما هو موضّح في المرجع. |
| trip_type | نعم | اضبط TripType على القيم التالية لنوع الرحلة التي تنشئها:
|
| pickup_point | نعم | نقطة انطلاق الرحلة |
| Intermediate destinations | نعم | الرحلات المتعددة الوجهات فقط: قائمة بالوجهات الوسيطة التي يزورها السائق بين
نقطة الانطلاق ونقطة الوصول. وكما هو الحال مع |
| vehicle_waypoints | نعم | رحلات النقل المشترك فقط: يتيح هذا الحقل دمج نقاط الطريق من رحلات متعددة.
ويحتوي على جميع نقاط الطريق المتبقية للمركبة المعيّنة، بالإضافة إلى نقاط طريق الانطلاق والوصول لهذه الرحلة. يمكنك ضبط هذا الحقل
من خلال استدعاء |
| number_of_passengers | لا | عدد الركاب في الرحلة |
| dropoff_point | لا | وجهة الرحلة |
| vehicle_id | لا | رقم تعريف المركبة المعيّنة للرحلة |
مثال: إنشاء رحلة متعددة الوجهات
يوضّح المثال التالي كيفية إنشاء رحلة حصرية متعددة الوجهات تتضمّن نقطة انطلاق ونقطة وصول ووجهة وسيطة واحدة.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// Trip initial settings.
String parent = "providers/" + PROJECT_ID;
Trip trip = Trip.newBuilder()
.setTripType(TripType.EXCLUSIVE)
.setPickupPoint(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)))
.setNumberOfPassengers(1)
.setDropoffPoint(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.1275).setLongitude(106.6537)))
// Add the list of intermediate destinations.
.addAllIntermediateDestinations(
ImmutableList.of(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)).build()))
.build();
// Create the Trip request.
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
.setParent(parent)
.setTripId(TRIP_ID) // Trip ID assigned by the Provider server.
.setTrip(trip) // Initial state is NEW.
.build();
// Error handling.
try {
Trip createdTrip =
tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS: // Trip already exists.
break;
case PERMISSION_DENIED:
break;
}
return;
}
تعديل رحلة متعددة الوجهات
عليك ضبط الرحلة باستخدام رقم تعريف المركبة ليتمكّن Fleet Engine من تتبُّع المركبة على طول مسارها. للحصول على تفاصيل حول تعديل الرحلة، يُرجى الاطّلاع على تعديل الرحلات وإدارة حالتها.
إذا لم تحدّد نقطة وصول أو وجهات وسيطة عند إنشاء الرحلة، يمكنك دائمًا إجراء ذلك في هذه المرحلة.
مثال على تعديل الرحلة
يوضّح المثال التالي كيفية تعديل رحلة لإضافة قائمة بالوجهات الوسيطة وضبط رقم تعريف المركبة.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to be updated.
Trip trip = Trip.newBuilder()
// Add the list of intermediate destinations.
.addAllIntermediateDestinations(
ImmutableList.of(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)).build()))
.setVehicleId("8241890")
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(
FieldMask.newBuilder()
.addPaths("intermediate_destinations")
.addPaths("vehicle_id")
.build())
.build();
// Error handling.
try {
Trip updatedTrip =
tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND: // The trip doesn't exist.
break;
case PERMISSION_DENIED:
break;
}
return;
}
إدارة حالة الرحلة للرحلات المتعددة الوجهات
يمكنك تحديد حالة الرحلة باستخدام إحدى قيم التعداد TripStatusenumeration
values. عندما تتغيّر حالة الرحلة، مثلاً من ENROUTE_TO_PICKUP إلى ARRIVED_AT_PICKUP، عليك تعديل حالة الرحلة في Fleet Engine. تبدأ حالة الرحلة دائمًا بالقيمة NEW وتنتهي بالقيمة COMPLETE أو CANCELED.
بالنسبة إلى الرحلة المتعددة الوجهات، بالإضافة إلى تعديل حالة الرحلة كما تفعل في الرحلة ذات الوجهة الواحدة، عليك أيضًا تعديل ما يلي في كل مرة تصل فيها مركبتك إلى وجهة وسيطة:
intermediateDestinationIndexintermediateDestinationsVersion
لإجراء ذلك، استخدِم القيم التالية من الـ TripStatus التعداد.
ENROUTE_TO_PICKUPARRIVED_AT_PICKUPENROUTE_TO_INTERMEDIATE_DESTINATIONARRIVED_AT_INTERMEDIATE_DESTINATIONENROUTE_TO_DROPOFFCOMPLETE
مثال على رحلة تتضمّن وجهات وسيطة
يوضّح المثال التالي كيفية إنشاء رحلة متعددة الوجهات تجاوزت نقطة الانطلاق وتتّجه الآن إلى أول وجهة وسيطة.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
// Get the trip object from either the Fleet Engine or storage.
Trip trip = …;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to be updated.
Trip trip = Trip.newBuilder()
// Trip status cannot return to a previous state once it has passed.
.setTripStatus(TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION)
// Enroute to the first intermediate destination.
.setIntermediateDestinationIndex(0)
// You must provide an intermediate_destinations_version to ensure that you
// have the same intermediate destinations list as the Fleet Engine.
.setIntermediateDestinationsVersion(
trip.getIntermediateDestinationsVersion())
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(
FieldMask.newBuilder()
.addPaths("trip_status")
.addPaths("intermediate_destination_index")
// intermediate_destinations_version must not be in the update mask.
.build())
.build();
// Error handling.
try {
Trip updatedTrip =
tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND: // The trip doesn't exist.
break;
case FAILED_PRECONDITION: // Either the trip status is invalid, or the
// intermediate_destinations_version doesn't
// match Fleet Engine's.
break;
case PERMISSION_DENIED:
break;
}
return;
}