إنشاء رحلات مشتركة مشتركة

يوضّح هذا المستند كيفية إنشاء رحلة مشتركة وضبط الحقل المناسب وتخصيصها لمركبة لتنفيذها. يفترض هذا الدليل أنّك قد أعددت "محرك الأسطول"، وأنّك أنشأت مركبات، وأنّ لديك تطبيقًا يعمل للسائقين، وتطبيقًا اختياريًا للمستهلكين. من المفترض أيضًا أن تكون على دراية بسيناريوهات الرحلات المختلفة المتاحة للرحلات عند الطلب. اطّلِع على الأدلة ذات الصلة التالية لتحديد ما يلي:

أساسيات إنشاء الرحلات

يصف هذا القسم تفاصيل الطلب اللازمة لإنشاء رحلة في Fleet Engine. يمكنك إصدار طلب إنشاء باستخدام gRPC وREST.

  • طريقة CreateTrip(): gRPC أو REST
  • رسالة CreateTripRequest: gRPC فقط

حقول الرحلة

استخدِم الحقول التالية لإنشاء رحلة في Fleet Engine. يمكنك استخدام ملفّات مختلفة للأنواع المختلفة من الرحلات: الرحلات التي تتضمن وجهة واحدة أو وجهات متعددة، والرحلات المتتالية، أو الرحلات المشتركة. يمكنك إدخال الحقول الاختيارية عند إنشاء الرحلة، أو يمكنك ضبطها لاحقًا عند تعديل الرحلة.

حقول الرحلة
الاسم مطلوب؟ الوصف
parent نعم سلسلة تتضمّن رقم تعريف المشروع يجب أن يكون هذا المعرّف هو المعرّف نفسه المستخدَم في عملية دمج Fleet Engine بالكامل، مع أدوار حساب الخدمة نفسها.
trip_id نعم سلسلة تنشئها لتحديد هذه الرحلة بشكل فريد تفرض معرّفات الرحلات بعض القيود، كما هو موضّح في المرجع.
trip_type نعم اضبط TripType على القيم التالية لنوع الرحلة التي تنشئها:
  • وجهة واحدة: اضبط القيمة على SHARED أو EXCLUSIVE.
  • الوجهات المتعددة: اضبط القيمة على EXCLUSIVE.
  • تسلسل: اضبط القيمة على EXCLUSIVE.
  • الجمع المشترَك: اضبطه على SHARED.
pickup_point نعم نقطة انطلاق الرحلة
الوجهات المتوسطة نعم

الرحلات التي تتضمّن وجهات متعددة فقط: قائمة الوجهات الوسيطة التي يزورها السائق بين نقطة المغادرة ونقطة الوصول. كما هو الحال مع dropoff_point، يمكن أيضًا ضبط هذا الحقل في وقت لاحق من خلال استدعاء UpdateTrip، ولكن الرحلات التي تتضمّن وجهات متعددة تحتوي بحكم التعريف على وجهات وسيطة.

vehicle_waypoints نعم

الرحلات المشتركة فقط: يتيح هذا الحقل تداخل نقاط التوقف من رحلات متعددة. يحتوي هذا الملف على جميع نقاط التوقف المتبقية للمركبة المحدّدة، بالإضافة إلى نقاط التوقف لتحميل الركاب وإيقافهم في هذه الرحلة. يمكنك ضبط هذا الحقل من خلال الاتصال برقم CreateTrip أو UpdateTrip. يمكنك أيضًا تعديل نقاط الطريق للمركبة من خلال حقل waypoints من خلال الاتصال برقم UpdateVehicle. لا تعرض الخدمة هذه المعلومات في المكالمات على GetTrip بسبب أسباب تتعلّق بالخصوصية.

number_of_passengers لا عدد الركاب في الرحلة
dropoff_point لا وجهة الرحلة.
vehicle_id لا معرّف المركبة المحدّد للرحلة

مثال: إنشاء رحلة مشتركة

يوضّح نموذج الدمج مع الخلفية التالي كيفية إنشاء رحلة و assigned تعيين مركبة لها كرحلة مشاركة ركوب.

// 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 لرحلة ب، يمكنك ضبط vehicleId، وضبط Trip.vehicle_waypoints أيضًا على الترتيب الأمثل لنقاط المرور: ب نقطة الاستلامأ نقطة الاستلامب نقطة الاستلام.

  • يؤدي الاتصال برقم getVehicle() إلى عرض remainingWaypoints التي تحتوي على:
    ب استلامأ تسليمب تسليم.
  • تؤدي كلّ من 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;
}

الخطوات التالية