停止ステータスを更新する

このドキュメントは、次の内容を理解していることを前提としています。

Fleet Engine の基本スケジュール設定されたタスクで説明されているように、タスクを作成して車両の停留所に関連付けることで、タスクと車両が停車すると想定される場所との実際の関連性をモデル化し、ドライバーがタスクを完了できるようにします。

その後、Fleet Engine に更新を送信してタスクのライフサイクル全体の進行状況を管理し、タスクの処理中にルーティングとステータスの更新を最適に実行できるようにします。これを実現する主な方法の 1 つは、車両が停留所に近づいたとき、停留所に到着したとき、停留所を出発したときに、車両の停留所を更新することです。これにより、フリート オペレーターとエンドユーザーの両方がタスクの進行状況に関するレポートと分析を作成できるようになります。ステータスの更新は次のとおりです。

  • ルート上: VehicleStopSTATE 列挙型では、ENROUTE を使用して、停留所が車両のルートのリストの次にあることを示します。タスクの観点から見ると、停止に関連付けられているタスクは、リストの次のタスクとして完了する必要があります。
  • 到着: VehicleStopSTATE 列挙型では、ARRIVED を使用して、車両が停留所に到着したことを示します。タスクの観点から、停止に関連付けられているタスクはすべてアクティブに処理中であることを意味します。
  • 完了: 停留所を完了するには、車両の停留所のリストから削除します。これを行うと、関連付けられているすべてのタスクが自動的に [クローズ済み] としてマークされます。タスクの終了の詳細については、タスクを確定をご覧ください。

このドキュメントでは、サーバーサイド アプローチを使用して更新停止ステータスを更新する方法について説明します。信頼できるデバイスを使用してタスクを管理する機能をドライバーに提供している場合は、ドライバー アプリからこの操作を行うこともできます。競合状態を回避し、信頼できる唯一の情報源を維持するために、1 つの方法のみを使用します。

車両が停留所に向かっている

車両が次の停留所へのナビゲーションを開始すると、システムが Fleet Engine に通知します。これにより、到着予定時刻とルートの計算精度が向上します。

停留所の更新に必要な項目

Fleet Engine は、通知のエンティティ内の他のすべてのフィールドを無視します。

フィールド
remainingVehicleJourneySegments 残りの車両停留所のリストと、そのステータスが State.NEW とマークされているリスト。

停留所へのルートの例

次の例は、Java gRPC ライブラリまたは UpdateDeliveryVehicle への HTTP REST 呼び出しを使用して、車両が次の停留所に向かっていることを Fleet Engine に通知する方法を示しています。他のすべての停留所は新規としてマークされます。

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> はタスクの一意の ID です。
  • リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドを含める必要があります。ここで、<token> は、サービス アカウントのロールJSON Web Token で説明されているガイドラインに従ってサーバーが発行します。
  • リクエスト本文には DeliveryVehicle エンティティを含める必要があります。

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

車両が停留所に到着する

車両が停留所に到着したときに、Fleet Engine に通知する必要があります。

停留所の更新に必要なフィールド

Fleet Engine は、通知のエンティティ内の他のすべてのフィールドを無視します。

フィールド
remainingVehicleJourneySegments 残りの車両停留所のリストと、そのステータスが State.NEW としてマークされているリスト。

停留所に到着する例

次の例は、Java gRPC ライブラリまたは UpdateDeliveryVehicle への HTTP REST 呼び出しを使用して、車両が停留所に到着したことを Fleet Engine に通知する方法を示しています。その他の停留所はすべて新規としてマークされます。

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> はタスクの一意の ID です。
  • リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドを含める必要があります。ここで、<token> は、サービス アカウントのロールJSON Web Token で説明されているガイドラインに従ってサーバーが発行します。
  • リクエスト本文には DeliveryVehicle エンティティを含める必要があります。

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

車両が停車を完了した

車両が停車を完了したときに、Fleet Engine に通知する必要があります。これにより、停止に関連付けられたすべてのタスクが CLOSED 状態に設定されます。

停留所の更新に必要なフィールド

Fleet Engine は、通知のエンティティ内の他のすべてのフィールドを無視します。

フィールド
remainingVehicleJourneySegments 残りの車両停留所のリストと、そのステータスが State.NEW とマークされているリスト。 リストの最初の停留所のステータスは State.ENROUTE にする必要があります。

停止の例を完了する

次の例は、Java gRPC ライブラリまたは UpdateDeliveryVehicle への HTTP REST 呼び出しを使用して、車両が停留所に到着したことを Fleet Engine に通知する方法を示しています。その他の停留所はすべて新規としてマークされます。

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> はタスクの一意の ID です。
  • リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドを含める必要があります。ここで、<token> は、サービス アカウントのロールJSON Web Token で説明されているガイドラインに従ってサーバーが発行します。
  • リクエスト本文には DeliveryVehicle エンティティを含める必要があります。

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

次のステップ