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

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

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

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

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

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

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

車両が次の停留所へのナビゲーションを開始したときに、システムが 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 に通知する必要があります。

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

通知のエンティティの他のフィールドはすべて無視されます。

フィールド
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 に通知する必要があります。これにより、停止に関連付けられているすべてのタスクがクローズ済み状態に設定されます。

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

通知のエンティティの他のフィールドはすべて無視されます。

フィールド
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

次のステップ