إنشاء رحلات إلى وجهات متعددة

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

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

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

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

حقول الرحلة

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

حقول الرحلة
الاسم مطلوب؟ الوصف
أحد الوالدَين نعم سلسلة تحتوي على رقم تعريف المشروع يجب أن يكون رقم التعريف هذا هو نفسه المستخدَم. عبر عملية دمج 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 لا رقم تعريف المركبة المخصّصة للرحلة.

مثال: إنشاء رحلة متعددة الوجهات

يوضح ما يلي كيفية إنشاء رحلة حصرية متعددة الوجهات بها نقطة استلام ونقطة انزال ووجهة وسيطة واحدة.

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;
}

إدارة حالة الرحلة لرحلات متعددة الوجهات

يمكنك تحديد حالة الرحلة باستخدام أحد التعداد TripStatus. القيم. عند تغيير حالة الرحلة، مثلاً من ENROUTE_TO_PICKUP إلى ARRIVED_AT_PICKUP، يجب تعديل حالة الرحلة في Fleet Engine. الرحلة الحالة تبدأ دائمًا بقيمة NEW، وتنتهي بقيمة إحدى COMPLETE أو CANCELED.

بالنسبة إلى رحلة متعددة الوجهات، بالإضافة إلى تحديث حالة الرحلة لرحلة وجهة واحدة، يجب أيضًا تحديث ما يلي في كل مرة تصل فيها مركبتك إلى وجهة وسيطة:

  • intermediateDestinationIndex
  • intermediateDestinationsVersion

لإجراء ذلك، استخدِم القيم التالية من التعداد TripStatus.

  • ENROUTE_TO_PICKUP
  • ARRIVED_AT_PICKUP
  • ENROUTE_TO_INTERMEDIATE_DESTINATION
  • ARRIVED_AT_INTERMEDIATE_DESTINATION
  • ENROUTE_TO_DROPOFF
  • COMPLETE

مثال على رحلة مع وجهات متوسطة

يوضح ما يلي كيفية إنشاء رحلة متعددة الوجهات اجتازت وهي الآن في طريقها إلى أول وجهة متوسطة لها.

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;
}

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