Membuat perjalanan multi-tujuan

Dokumen ini menjelaskan cara membuat perjalanan ke beberapa tujuan, menetapkan dan menugaskannya ke sebuah kendaraan untuk dipenuhi. Ini mengasumsikan bahwa Anda telah menyiapkan Fleet Engine, membuat kendaraan, memiliki aplikasi pengemudi yang berfungsi, dan secara opsional, aplikasi konsumen. Anda juga harus memahami berbagai skenario perjalanan yang tersedia untuk perjalanan on-demand. Lihat panduan terkait berikut untuk bahwa:

Dasar-dasar pembuatan perjalanan

Bagian ini menjelaskan detail permintaan yang diperlukan untuk membuat perjalanan di Fleet Engine. Anda mengirimkan permintaan pembuatan menggunakan gRPC dan REST.

  • Metode CreateTrip(): gRPC atau REST
  • Pesan CreateTripRequest: gRPC saja

Kolom Perjalanan

Gunakan kolom berikut untuk membuat perjalanan di Fleet Engine. Anda dapat menggunakan isian untuk berbagai jenis perjalanan: tujuan tunggal atau multi-tujuan, perjalanan berurutan, atau penggabungan bersama. Anda dapat menyediakan kolom opsional saat Anda membuat perjalanan, atau Anda dapat mengaturnya nanti saat Anda memperbarui perjalanan.

Kolom perjalanan
Nama Wajib? Deskripsi
parent Ya String yang menyertakan project ID. ID ini harus sama dengan ID yang digunakan di seluruh integrasi Fleet Engine Anda, dengan akun layanan yang sama peran.
trip_id Ya String yang Anda buat yang mengidentifikasi perjalanan ini secara unik. ID perjalanan memiliki batasan tertentu, seperti yang ditunjukkan dalam referensi.
trip_type Ya Tetapkan TripType ke nilai berikut untuk jenis perjalanan yang Anda buat:
  • Tujuan tunggal: Tetapkan ke SHARED atau EXCLUSIVE.
  • Multi-tujuan: Tetapkan ke EXCLUSIVE.
  • Kembali ke belakang: Setel ke EXCLUSIVE.
  • Penggabungan bersama: Tetapkan ke SHARED.
pickup_point Ya Titik asal perjalanan.
Tujuan perantara Ya

Khusus perjalanan multi-tujuan: Daftar tujuan perantara yang dikunjungi pengemudi di antara tujuan penjemputan dan pengantaran pesanan. Seperti halnya dropoff_point, kolom ini juga dapat disetel nanti dengan memanggil UpdateTrip, namun perjalanan menurut definisi berisi tujuan perantara.

vehicle_waypoints Ya

Khusus perjalanan dengan fitur berbagi tumpangan: Kolom ini mendukung interleaving titik jalan dari beberapa perjalanan. File ini berisi semua titik jalan yang tersisa untuk kendaraan yang ditetapkan, serta titik jalan pengambilan dan pengantaran untuk perjalanan ini. Anda dapat menetapkan kolom ini dengan memanggil CreateTrip atau UpdateTrip. Anda juga dapat memperbarui titik jalan kendaraan melalui kolom waypoints dengan panggilan ke UpdateVehicle. Layanan tidak menampilkan informasi ini pada panggilan GetTrip karena alasan privasi.

number_of_passengers Tidak Jumlah penumpang dalam perjalanan.
dropoff_point Tidak Tujuan perjalanan.
vehicle_id Tidak ID kendaraan yang ditetapkan untuk perjalanan.

Contoh: membuat perjalanan multi-tujuan

Berikut cara membuat perjalanan multi-tujuan eksklusif yang memiliki titik penjemputan, titik penurunan, dan satu tujuan perantara.

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

Memperbarui perjalanan multi-tujuan

Anda harus mengonfigurasi perjalanan dengan ID kendaraan agar Fleet Engine dapat melacak kendaraan di sepanjang rutenya. Untuk detail tentang cara memperbarui perjalanan, lihat Memperbarui perjalanan dan mengelola statusnya.

Jika Anda tidak menentukan tujuan drop-off atau tujuan perantara saat Anda membuat perjalanan, Anda selalu dapat melakukannya pada tahap ini.

Contoh info terbaru perjalanan

Berikut cara memperbarui perjalanan untuk menambahkan daftar perantara tujuan dan menetapkan ID kendaraan.

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

Mengelola status perjalanan untuk perjalanan multi-tujuan

Anda menentukan status perjalanan menggunakan salah satu enumerasi TripStatus masing-masing. Saat status perjalanan berubah, misalnya dari ENROUTE_TO_PICKUP menjadi ARRIVED_AT_PICKUP, Anda harus memperbarui status perjalanan di Fleet Engine. Perjalanan status selalu dimulai dengan nilai NEW, dan diakhiri dengan nilai COMPLETE atau CANCELED.

Untuk perjalanan multi-tujuan, selain memperbarui status perjalanan seperti yang Anda lakukan untuk perjalanan satu tujuan, Anda juga harus memperbarui hal berikut setiap kali kendaraan Anda mencapai tujuan perantara:

  • intermediateDestinationIndex
  • intermediateDestinationsVersion

Untuk melakukannya, gunakan nilai berikut dari enumerasi TripStatus.

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

Contoh perjalanan dengan tujuan perantara

Berikut ini cara membuat perjalanan multi-tujuan yang telah melewati titik penjemputan, dan sedang dalam perjalanan ke tujuan perantara pertamanya.

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

Langkah berikutnya