Perbarui status perhentian

Dokumen ini mengasumsikan pemahaman tentang hal-hal berikut:

Seperti yang dinyatakan dalam Tugas terjadwal di Dasar-Dasar Fleet Engine, Anda membuat tugas dan mengaitkannya dengan perhentian kendaraan sebagai cara untuk memodelkan hubungan dunia nyata antara tugas dan lokasi tempat kendaraan diharapkan berhenti sehingga pengemudi dapat menyelesaikan tugas.

Dari sana, Anda mengelola progres tugas di seluruh siklus prosesnya dengan mengirimkan pembaruan ke Fleet Engine sehingga Fleet Engine dapat melakukan pembaruan perutean dan status terbaik di sepanjang perjalanan tugas. Salah satu cara utama Anda melakukannya adalah dengan memperbarui perhentian kendaraan saat kendaraan mendekati, tiba di, dan meninggalkan perhentian. Hal ini memungkinkan pelaporan dan analisis tentang progres tugas untuk operator Fleet dan pengguna akhir. Berikut adalah pembaruan status tersebut:

  • Dalam perjalanan: Enum STATE untuk VehicleStop menggunakan ENROUTE untuk menunjukkan bahwa perhentian berikutnya dalam daftar untuk rencana perjalanan kendaraan. Dari perspektif tugas, artinya setiap tugas yang terkait dengan perhentian adalah tugas berikutnya dalam daftar yang harus diselesaikan.
  • Tiba: Enum STATE untuk VehicleStop menggunakan ARRIVED untuk menunjukkan bahwa kendaraan telah tiba di perhentian. Dari perspektif tugas, ini berarti bahwa setiap tugas yang terkait dengan perhentian sedang dikerjakan secara aktif.
  • Selesai: Anda menandai perhentian sebagai selesai dengan menghapusnya dari daftar perhentian untuk kendaraan. Saat Anda melakukannya, Fleet Engine akan otomatis menandai semua tugas terkait sebagai DITUTUP. Untuk mengetahui detail selengkapnya tentang cara menutup tugas, lihat Menyelesaikan tugas.

Dokumen ini menjelaskan cara memperbarui status berhenti menggunakan pendekatan sisi server. Anda juga dapat melakukannya dari aplikasi pengemudi jika Anda memberi pengemudi kemampuan untuk mengelola tugas menggunakan perangkat tepercaya. Gunakan hanya satu metode agar Anda dapat menghindari kondisi race dan mempertahankan satu sumber kebenaran.

Kendaraan sedang dalam perjalanan menuju halte

Sistem Anda harus memberi tahu Fleet Engine saat kendaraan mulai bernavigasi ke perhentian berikutnya. Hal ini meningkatkan penghitungan ETA dan rute.

Kolom wajib diisi untuk menghentikan pembaruan

Fleet Engine mengabaikan semua kolom lain dalam entitas untuk notifikasi.

KolomNilai
remainingVehicleJourneySegments Daftar perhentian kendaraan yang tersisa dengan statusnya ditandai sebagai State.NEW.

Contoh dalam perjalanan ke lokasi pemberhentian

Contoh berikut menunjukkan cara memberi tahu Fleet Engine bahwa kendaraan sedang dalam perjalanan ke perhentian berikutnya, menggunakan library gRPC Java atau panggilan HTTP REST ke UpdateDeliveryVehicle.Semua perhentian lainnya ditandai sebagai baru.

gRPC

 static final String PROJECT_ID = "my-delivery-co-gcp-project";
 static final String VEHICLE_ID = "vehicle-8241890";

 DeliveryServiceBlockingStub deliveryService =
   DeliveryServiceGrpc.newBlockingStub(channel);

 // Vehicle settings
 DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
     // Next stop marked as ENROUTE
     .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 1st stop
        .setStop(VehicleStop.newBuilder()
            .setPlannedLocation(LocationInfo.newBuilder()
                .setPoint(LatLng.newBuilder()
                    .setLatitude(37.7749)
                    .setLongitude(122.4194)))
            .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
            .setState(VehicleStop.State.ENROUTE)))
     // All other stops marked as NEW
     .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
        .setStop(VehicleStop.newBuilder()
            .setPlannedLocation(LocationInfo.newBuilder()
                .setPoint(LatLng.newBuilder()
                    .setLatitude(37.3382)
                    .setLongitude(121.8863)))
            .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
            .setState(VehicleStop.State.NEW)))
     .build();

 // DeliveryVehicle request
 UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
   UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
       .setName(vehicleName)
       .setDeliveryVehicle(deliveryVehicle)
       .setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
       .build();

 try {
   DeliveryVehicle updatedDeliveryVehicle =
       deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
 } catch (StatusRuntimeException e) {
   Status s = e.getStatus();
   switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
   }
   return;
 }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • <id> adalah ID unik untuk tugas.
  • Header permintaan harus berisi kolom Authorization dengan nilai Bearer <token>, dengan <token> dikeluarkan oleh server Anda sesuai dengan panduan yang dijelaskan dalam Peran akun layanan dan Token Web JSON.
  • Isi permintaan harus berisi entitas DeliveryVehicle:

Contoh perintah curl:

 # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
 # environment
 curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "remainingVehicleJourneySegments": [
     {
       "stop": {
         "state": "ENROUTE",
         "plannedLocation": {
           "point": {
             "latitude": 37.7749,
             "longitude": -122.084061
           }
         },
         "tasks": [
           {
             "taskId": "${TASK1_ID}"
           }
         ]
       }
     },
     {
       "stop": {
         "state": "NEW",
         "plannedLocation": {
           "point": {
             "latitude": 37.3382,
             "longitude": 121.8863
           }
         },
         "tasks": [
           {
             "taskId": "${TASK2_ID}"
           }
         ]
       }
     }
   ]
 }
 EOM

Kendaraan tiba di perhentian

Fleet Engine harus diberi tahu saat kendaraan tiba di perhentian.

Kolom wajib diisi untuk menghentikan pembaruan

Fleet Engine mengabaikan semua kolom lain dalam entitas untuk notifikasi.

KolomNilai
remainingVehicleJourneySegments Daftar perhentian kendaraan yang tersisa dengan statusnya ditandai sebagai State.NEW.

Contoh tiba di halte

Contoh berikut menunjukkan cara memberi tahu Fleet Engine bahwa kendaraan telah tiba di halte, menggunakan library gRPC Java atau panggilan HTTP REST ke UpdateDeliveryVehicle. Semua perhentian lainnya ditandai sebagai baru.

gRPC

  static final String PROJECT_ID = "my-delivery-co-gcp-project";
  static final String VEHICLE_ID = "vehicle-8241890";

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Vehicle settings
  String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
  DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
      // Marking the arrival at stop.
      .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
         .setStop(VehicleStop.newBuilder()
             .setPlannedLocation(LocationInfo.newBuilder()
                 .setPoint(LatLng.newBuilder()
                     .setLatitude(37.7749)
                     .setLongitude(122.4194)))
             .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
             .setState(VehicleStop.State.ARRIVED)))
      // All other remaining stops marked as NEW.
      .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
         .setStop(VehicleStop.newBuilder()
             .setPlannedLocation(LocationInfo.newBuilder()
                 .setPoint(LatLng.newBuilder()
                     .setLatitude(37.3382)
                     .setLongitude(121.8863)))
             .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
             .setState(VehicleStop.State.NEW))) // Remaining stops must be NEW.
      .build();

  // DeliveryVehicle request
  UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
    UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
        .setName(vehicleName)
        .setDeliveryVehicle(deliveryVehicle)
        .setUpdateMask(FieldMask.newBuilder()
            .addPaths("remaining_vehicle_journey_segments"))
        .build();

  try {
    DeliveryVehicle updatedDeliveryVehicle =
        deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
       case NOT_FOUND:
         break;
       case PERMISSION_DENIED:
         break;
    }
    return;
  }

REST

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • <id> adalah ID unik untuk tugas.
  • Header permintaan harus berisi kolom Authorization dengan nilai Bearer <token>, dengan <token> dikeluarkan oleh server Anda sesuai dengan panduan yang dijelaskan dalam Peran akun layanan dan Token Web JSON.
  • Isi permintaan harus berisi entitas DeliveryVehicle:

Contoh perintah curl:

  # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
  # environment
  curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
    -H "Content-type: application/json" \
    -H "Authorization: Bearer ${JWT}" \
    --data-binary @- << EOM
  {
    "remainingVehicleJourneySegments": [
      {
        "stop": {
          "state": "ARRIVED",
          "plannedLocation": {
            "point": {
              "latitude": 37.7749,
              "longitude": -122.084061
            }
          },
          "tasks": [
            {
              "taskId": "${TASK1_ID}"
            }
          ]
        }
      },
      {
        "stop": {
          "state": "NEW",
          "plannedLocation": {
            "point": {
              "latitude": 37.3382,
              "longitude": 121.8863
            }
          },
          "tasks": [
            {
              "taskId": "${TASK2_ID}"
            }
          ]
        }
      }
    ]
  }
  EOM

Kendaraan menyelesaikan pemberhentian

Fleet Engine harus diberi tahu saat kendaraan menyelesaikan perhentian. Hal ini menyebabkan semua tugas yang terkait dengan penghentian ditetapkan ke status TERTUTUP.

Kolom wajib diisi untuk menghentikan pembaruan

Fleet Engine mengabaikan semua kolom lain dalam entitas untuk notifikasi.

KolomNilai
remainingVehicleJourneySegments Daftar perhentian kendaraan yang tersisa dengan statusnya ditandai sebagai State.NEW. Perhentian pertama dalam daftar harus memiliki status yang ditandai sebagai State.ENROUTE.

Menyelesaikan contoh penghentian

Contoh berikut menunjukkan cara memberi tahu Fleet Engine bahwa kendaraan telah tiba di halte, menggunakan library gRPC Java atau panggilan HTTP REST ke UpdateDeliveryVehicle. Semua perhentian lainnya ditandai sebagai baru.

gRPC

  static final String PROJECT_ID = "my-delivery-co-gcp-project";
  static final String VEHICLE_ID = "vehicle-8241890";

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Vehicle settings
  String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
  DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
      // This stop has been completed and is commented out to indicate it
      // should be removed from the list of vehicle journey segments.
      // .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
      //    .setStop(VehicleStop.newBuilder()
      //        .setPlannedLocation(LocationInfo.newBuilder()
      //            .setPoint(LatLng.newBuilder()
      //                .setLatitude(37.7749)
      //                .setLongitude(122.4194)))
      //        .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
      //        .setState(VehicleStop.State.ARRIVED)))
      // All other remaining stops marked as NEW.
      // The next stop could be marked as ENROUTE if the vehicle has begun
      // its journey to the next stop.
      .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // Next stop
         .setStop(VehicleStop.newBuilder()
             .setPlannedLocation(LocationInfo.newBuilder()
                 .setPoint(LatLng.newBuilder()
                     .setLatitude(37.3382)
                     .setLongitude(121.8863)))
             .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
             .setState(VehicleStop.State.NEW)))
      .build();

  // DeliveryVehicle request
  UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
    UpdateDeliveryVehicleRequest.newBuilder()  // no need for the header
        .setName(vehicleName)
        .setDeliveryVehicle(deliveryVehicle)
        .setUpdateMask(FieldMask.newBuilder()
            .addPaths("remaining_vehicle_journey_segments"))
        .build();

  try {
    DeliveryVehicle updatedDeliveryVehicle =
        deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
       case NOT_FOUND:
         break;
       case PERMISSION_DENIED:
         break;
    }
    return;
  }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
  • <id> adalah ID unik untuk tugas.
  • Header permintaan harus berisi kolom Authorization dengan nilai Bearer <token>, dengan <token> dikeluarkan oleh server Anda sesuai dengan panduan yang dijelaskan dalam Peran akun layanan dan Token Web JSON.
  • Isi permintaan harus berisi entitas DeliveryVehicle:

Contoh perintah curl:

 # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
 # environment
 curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "remainingVehicleJourneySegments": [
     {
       "stop": {
         "state": "NEW",
         "plannedLocation": {
           "point": {
             "latitude": 37.3382,
             "longitude": 121.8863
           }
         },
         "tasks": [
           {
             "taskId": "${TASK2_ID}"
           }
         ]
       }
     }
   ]
 }
 EOM

Langkah berikutnya