ラスト ワンマイルのフリート ソリューションは現在、一部のお客様のみご利用いただけます。詳しくは、営業担当者までお問い合わせください。

Fleet Engine のスタートガイド

Fleet Engine Deliveries API を使用すると、配送の最初と最後の距離でフリート アクティビティをモデル化できます。Deliveries API は、Android および iOS 向けの Driver SDK を介して公開され、HTTP REST または gRPC 呼び出しを介して直接使用することもできます。

初期設定

Fleet Engine Deliveries API は Google Cloud Console を使用して構成します。コンソール内での手順と、認可用の JSON ウェブトークンを作成する方法については、認証と認可をご覧ください。コンソールの使用方法の詳細については、Google Cloud Console のドキュメントをご覧ください。

設定を確認する

サービス アカウントを作成したら、設定が完了しており、デリバリー車を作成できることを確認します。ワークフローのこの段階で確認を行うことで、プロジェクトの設定時に発生する可能性がある一般的な認証問題に対処できます。設定の確認ガイドに沿って操作します。 このガイドでは、gcloud コマンドライン ユーティリティを使用して、認証トークンの署名とトライアル配信の作成という 2 つの設定方法をテストする方法について説明します。

また、Fleet Engine Auth サンプル スクリプトを使用して設定をテストすることもできます。

クライアント ライブラリ

クライアント ライブラリは、いくつかの一般的なプログラミング言語で公開されています。これらのライブラリを使用すると、未加工の REST や gRPC よりもデベロッパーのエクスペリエンスが向上します。サーバー アプリケーションのクライアント ライブラリを取得する方法については、クライアント ライブラリをご覧ください。

このドキュメントの Java の例は、gRPC に精通していることを前提としています。

データ構造

Deliveries API は、2 つのデータ構造を使用して配送の集荷と配送をモデル化します。

  • 配送の輸送に使用される車両。
  • 配送の集荷タスク。

また、タスクを使用して 1 日の終点の停車場所と停留所をモデル化することもできます。

配送車

配送車両は、デポから配送場所への配送と、集荷場所からデポへの輸送です。場合によっては、集荷場所から配送場所に直接配送することもできます。

Driver SDK を使用すると、Fleet Engine で DeliveryVehicle オブジェクトを作成し、配送とフリート追跡の位置情報の更新を送信できます。

タスク

各車両にはタスクが割り当てられています。たとえば、集荷や配送のタスク、ドライバーの休憩時間、 直送便や顧客の所在地の停車場所などです。各タスクは一意のタスク ID を持つ必要がありますが、同じトラッキング ID を共有することもできます。タスクとそれらがスケジューリングされる順序を使用して、各タスクの到着予定時刻が計算されます。

Driver SDK タスク マネージャーを使用して Fleet Engine でタスクを作成する。

配送タスク

配送タスクとは、配送の集荷または降車に関連するタスクです。配送タスクを作成するときに、荷物追跡番号または ID を指定する必要があります。また、タスクの完了、駐車場の検索、ハンドオフの場所まで移動するための時間として、滞在時間を指定します。

  • 集荷場所と荷物追跡番号(または ID)を指定して、集荷を受け取る集荷タスクを作成します。
  • 配送の配送タスクを作成し、配送場所と荷物追跡番号(または ID)を指定する。

利用できないタスク

車両をピックアップまたは配送できない期間に利用できないタスクを作成する。車両の給油のための休憩や、運転者の休憩のための休憩などが該当します。

タスクの作成時に区切りの長さを指定します。特定の場所で休憩を取る必要はありませんが、場所を指定すると、一日を通してより正確な到着予定時刻が表示されます。

スケジュール設定された停車タスク

配送車両が行う停車地をモデル化するために、スケジュールされた停止タスクを作成します。たとえば、特定の場所での毎日の停車地の収集について、同じ場所での他の配達や集荷とは別に、スケジュールされた停止タスクを作成できます。また、ドロップ ボックス内の集荷に関するスケジュール設定された停止タスクの作成、または、サービス センターやサービス ポイントでの車両の乗り換えや停車地のモデル化も可能です。

各データ構造に含まれるフィールドについては、DeliveryVehiclegRPCREST)と TaskgRPCREST)の API リファレンス ドキュメントをご覧ください。

タスク ID に関するガイドライン

タスク ID は一意である必要があり、個人を特定できる情報(PII)やクリアテキスト データを公開することはできません。

タスク ID は次の形式要件を満たす必要があります。

  • ID は有効な Unicode 文字列にする必要があります。
  • ID は 64 文字以下にしてください。
  • ID は Unicode Normalization Form C に従って正規化されます。
  • ID に "/"、":"、"\"、"?"、"#" などの ASCII 文字を含めることはできません。

有効なタスク ID の例を以下に示します。

  • 566c33d9-2a31-4b6a-9cd4-80ba1a0c643b
  • e4708eabcfa39bf2767c9546c9273f747b4626e8cc44e9630d50f6d129013d38
  • NTA1YTliYWNkYmViMTI0ZmMzMWFmOWY2NzNkM2Jk

次の表に、無効なタスク ID の例を示します。

タスク ID が無効です 理由
2019/8/31 - 20:48-46.70746,-130.10807,-85.17909,61.33680 PII と文字の要件に反している(カンマ、ピリオド、コロン、スラッシュなど)。
JohnDoe-577b484da26f-クパチーノ-サンタクルス 個人情報(PII)の要件に違反している。
4R0oXLToF”112 Summer Dr. East Hartford、CT06118”577b484da26f8a PII と文字の要件に反している(空白、カンマ、引用符など)。64 文字を超える。

車両のライフサイクル

DeliveryVehicle オブジェクトは、最初または最後のマイルに対する配達手段を表します。 次のコマンドを使用して DeliveryVehicle オブジェクトを作成します。

  • Fleet Engine API の呼び出しに使用されるサービス アカウントを含む Google Cloud プロジェクトのプロジェクト ID。
  • お客様が所有する車両 ID。

車両 ID は車両ごとに一意である必要があります。別の車両でアクティブなタスクがない限り、別の車両で再利用しないでください。

UpdateDeliveryVehicle を呼び出すときは NOT_FOUND エラーを確認し、必要に応じて CreateDeliveryVehicle を呼び出して新しい車両を作成してください。UpdateDeliveryVehicle を使用して更新されていない DeliveryVehicle オブジェクトは、7 日後に自動的に削除されます。既存のプロジェクト ID と車両 ID のペアで CreateDeliveryVehicle を呼び出すと、エラーが発生します。

車両属性

DeliveryVehicle エンティティには、DeliveryVehicleAttribute の繰り返しフィールドが含まれています。ListDeliveryVehicles API に含まれる filter フィールドを使用すると、返された DeliveryVehicle のエンティティを、指定した属性を持つエンティティに制限できます。DeliveryVehicleAttribute は Fleet Engine のルーティング動作には影響しません。

このフィールドはユーザーに表示される可能性があるため、属性に個人情報や機密情報を含めないでください。

タスクのライフサイクル

Fleet Engine のタスクは、Deliveries API gRPC または REST インターフェースを使用して、作成、更新、調査できます。

Task オブジェクトには、そのライフサイクルを通じて進捗状況を追跡するための state フィールドがあります。値は OPEN から CLOSED に進みます。新しいタスクは OPEN 状態で作成され、以下のいずれかを示します。

  • タスクはまだ配送車両に割り当てられていません。
  • タスクの割り当て先である車両の停車ルートを通過できませんでした。

タスクは、ステータスが OPEN の車両にのみ割り当てることができます。

タスクは車両リストから削除することでキャンセルできます。 自動的に CLOSED に設定されます。

タスクの車両のタスクの車両停止が完了したら、タスクの結果フィールドを SUCCEEDED または FAILED に更新し、イベントのタイムスタンプを指定します。タスクの結果は、タスクが完了する前後いつでも設定できますが、設定できるのは 1 回のみです。

JavaScript Shipment Tracking ライブラリはタスクの結果を示すことができます。タスクのステータスは自動的に CLOSED に設定されます。詳しくは、JavaScript 配送トラッキング ライブラリで配送を追跡するをご覧ください。

車両の場合と同様に、7 日経過しても更新されていないタスクは削除され、すでに存在する ID でタスクを作成しようとするとエラーが返されます。

注: Fleet Engine では、タスクを明示的に削除することはできません。このサービスは 7 日後に更新なしで自動的に削除されます。タスクデータを 7 日より長く保持する場合は、その機能を自分で実装する必要があります。

タスク属性

Task エンティティには TaskAttribute の繰り返しフィールドが含まれ、文字列、数値、ブール値の 3 つの値のいずれかを持つことができます。ListTasks API に含まれる filter フィールドを使用すると、返された Task エンティティを、指定した属性を持つエンティティに制限できます。TaskAttribute は Fleet Engine のルーティング動作には影響しません。

このフィールドはユーザーに表示される可能性があるため、属性に個人情報や機密情報を含めないでください。

車両とタスクのライフサイクルの管理

システム内の車両とタスクのライフサイクルを管理するには、Fleet Engine Deliveries API を使用して、車両とそれに関連するタスクを作成、更新、追跡します。内部システムは、Fleet Engine Deliveries API がユーザーに代わって増強するデータの信頼できるソースとして機能します。

同時に、ドライバ アプリは、デバイスの位置情報とルート情報を更新するために、Fleet Engine と直接通信します。このモデルを使用すると、Fleet Engine がリアルタイムの位置情報を効率的に管理してトラッキング ライブラリに直接送信し、注文ステータスの更新が必要な消費者に使用できます。

たとえば、次のシナリオがあるとします。

  • ドライバーが配送地点に近づくと、Fleet Engine からデバイスの位置情報がトラッキング ライブラリに送信されます。トラッキング ライブラリは、コンシューマ アプリケーションがパッケージの近くにいることを警告するために使われます。
  • ドライバーは配送を完了すると、ドライバー アプリの [配送済み] ボタンをクリックします。
  • これにより、情報がバックエンド システムに送信され、バックエンドのビジネス検証と検証のステップが実行されます。
  • システムはタスクを SUCCEEDED として確認し、Deliveries API を使用して Fleet Engine を更新します。

次の図は、これらのプロセスを一般的なレベルで示しています。また、システム、クライアント、Fleet Engine の標準関係も示されています。

Deliveries API の図の使用

クライアント トークンの管理

ドライバ アプリケーションから発生し、Fleet Engine に直接送信される位置情報の更新には、認証トークンが必要です。クライアントから Fleet Engine への更新を処理するには、制限された範囲のトークンをドライバ アプリケーションに提供して、Fleet Engine 内のデバイスの位置情報のみを更新することをおすすめします。このタイプのトークンには、Fleet Engine Delivery の信頼されていないドライバ ユーザーと呼ばれるサービス アカウント ロールを使用します。これにより、モバイル デバイスから発信される呼び出し(信頼度が低い環境と見なされる)が、最小権限の原則に従うようになります。

その他のサービス アカウント ロール

代わりに、特定のタスクの更新など、信頼できないドライバのロールに限定されていないフリート エンジンへの直接更新をドライバ アプリケーションに許可する場合は、Trusted Driver ロールを使用できます。Trusted Driver ロールを使用するモデルの詳細については、Trusted Driver モデルをご覧ください。

信頼できないドライバロールと信頼できるドライバロールの使用の詳細については、Cloud プロジェクトの設定をご覧ください。

勤務日のモデリング

次の表は、配送や物流の会社において、ファースト ワンマイルまたはラスト ワンマイルのドライバーの勤務日がどのようになるかを示しています。会社によって詳細は異なる場合がありますが、1 日の労働時間のモデル化方法は確認可能です。

時間アクティビティモデリング
1 日の開始時刻から 24 時間以内 ディスパッチャは、配送車両またはルートに配送を割り当てます。 発送、受け取り、休憩などのタスクは、事前に Fleet Engine で作成できます。たとえば、配送の受け取りタスク配送タスク配送不可のスケジュール停止予定を作成できます。

一連の配送パッケージと配送順序が確定したら、タスクを車両に割り当てる必要があります。
1 日の始まり 運転手は、運転手アプリにログインして現場からスタートします。 Delivery Driver API を初期化します。 必要に応じて、Fleet Engine で配送車両を作成します。
運転手が荷物を配達車両に積み込み、配送をスキャンする。 配送タスクが事前に作成されていない場合は、スキャン時に配送タスクを作成します。
ドライバーが、実行されるタスクの順序を確認しました。 事前に作成されていない場合は、配送の受け取りタスク利用不可のスケジュール経由地スケジュールを設定します。
ドライバーはデポを残し、次の完了予定のタスク数に達します。 完了順を commit して、すべてのタスクまたはタスクのサブセットを車両に割り当てます。
ドライバーが荷物を配達。 配達の駅に到着した後、その駅に到着する車両に関連するアクションを実行します。配送後の配送タスクを終了します。必要に応じて、配送ステータスなどのメタ情報も保存する。停車地ですべてのタスクを完了した後、次の停車地への運転を開始する前に、車両が停留所を完了し、次の停車地に車両で移動中に関連するアクションを実行してください。
ドライバーはフィーダー 車両と合流し、フィーチャー ビークルに追加の配送を運送車に輸送します。 フィーダーと配達の車両間の乗り換えの待ち合わせ場所は、停留所としてモデル化する必要があります。

配送の転送とスキャンが済んでいる場合は、配送タスクを作成します(まだ作成していない場合)。次に、車両にタスクを割り当てタスクの順序を更新して、タスクの完了順序を更新します。
ドライバーが集荷リクエストの通知を受け取ります。 受け取りリクエストを受け取ったら、配送の受け取りタスクを作成します。次に、車両にタスクを割り当てタスクの順序を更新して、タスクの実行順序を更新します。
正午 ドライバーが昼休みを取る。 ビジネスが対応不可のタスクに関連付けられている場合は、他のタスクと同様に扱います。停車地に到着する車両、車両が停車地に到着する車両が次の停車地に到着するなどの操作を行います。

それ以外の場合は、広告ブレークが終了するまで特にご対応は必要ありません。 次のタスクと残りのタスクを確認し、タスクの順序を更新して、タスクを削除します。
ドライバーが荷物を迎えに行く。 これは、配達の停止と同様にモデル化されます。停車地に到着する車両タスクの終了、必要に応じて配送ステータスなどのメタ情報の保存に関連するアクションを実行します。停車地ですべてのタスクを完了した後、次の停車地への運転を開始する前に、車両が停留所を完了し、次の停車地に車両で移動中に関連するアクションを実行してください。 注: 請求を正しく行えるよう、すべての受け取りに、対応する配送タスクが必要です。集荷者がドライバーの同じルートの別の場所に配達される場合は、そのルートを、経路上の他の配送タスクとしてモデル化することをおすすめします。運転手がピックアップを倉庫に戻している場合は、配達先の場所に配達タスクを作成することをおすすめします。
ドライバーが、スケジュールされた配送でドロップボックスから荷物を集荷します。 これは、他の受け取りスポットと同様です。停車地に到着する車両タスクの終了に関連するアクションを実行します。停車地ですべてのタスクを完了し、次の停車地への運転を開始したら、車両が停車地を完了し車両が次の停車地に到着するに関連するアクションを実行します。
運転手に、荷物が別の場所に到着するという通知が届く。 元の配送タスクのステータスを [完了] に設定し、新しい配送場所向けの新しい配送タスクを作成します。詳しくは、配送のルートを変更するをご覧ください。
ドライバーが荷物を配達しようとしたが、配達できなかった。 これは、配送中止が成功する場合と同様にモデル化され、配信タスクが完了としてマークされます。停車地に到着する車両に関連するアクションを実行する。配送に失敗した場合は、タスクをクローズし、必要に応じて配送ステータスとその他のメタ情報も保管します。停車地ですべてのタスクを完了した後、次の停車地への運転を開始する前に、車両が停留所を完了し、次の停車地に車両で移動中に関連するアクションを実行してください。
ドライバーに、荷物を配達(配送しない)するよう通知されました。 通知を受け取って確認したら、タスクのステータスを COMPLETED に設定します。
ドライバーは次に確定した配送方法を変更するように、特定の配送を行うよう通知されました。 タスクの順序を更新します
運転手が注文配送の失敗を選択している。 タスクの順序を更新し、通常どおり処理します。
ドライバーが複数の場所で単一の荷物を配達。 これは、1 回の配送の配達場所に似ています。 停留所に到着したら、その停車地に到着する車両に関する操作を実施します。 各配送の配達後、各タスクをクローズし、必要に応じて配送ステータスとその他のメタ情報を保存します。停車地ですべてのタスクを完了した後、次の停車地への運転を開始する前に、車両が停留所を完了し、次の停車地に車両で移動中に関連するアクションを実行してください。
1 日の終わり 運転手が倉庫に戻る。 運転手がルート中に集荷を行った倉庫に戻る場合は、課金を正しく行うために、各荷物を配送タスクとして作成し、完了する必要があります。これは、他の配送拠点と同様に、倉庫をモデル化することで実現できます。デポが配送の停留所として使用されていない場合でも、任意でデポをスケジュール設定し、その停車地を指定できます。これにより、ドライバーはデパートまでのルートを確認し、予定到着時刻を可視化できます。

位置情報の更新について

位置情報の更新は、次の車両に到着する時点(デポを含む)で車両が停車すると、Fleet Engine に送信されます。これらのイベントは自動的に検出されないため、プログラムでマークする必要があります。交通手段の変更を検出するライブラリを使用して、必要な通知を Fleet Engine に送信するようトリガーします。

建物内にいるユーザーは、位置情報信号の質が著しく低下するため、運転していないときは位置情報の更新を停止する必要があります。

位置情報の更新頻度は、Driver SDK 内で設定できます。デフォルトでは、10 秒ごとに更新を送信します。

車両の停留所と配送場所

車両の停留所とは、配送車両が発送タスクなどのタスクを完了する場所です。読み込みホルダーなどのアクセス ポイントか、道路沿いのスナップの場所です。

配送場所とは、配送または集荷が行われる場所です。配達場所との合間に、車両の停留所まで徒歩で移動しなければならない場合があります。

たとえば、ドライバーがショッピング モールの店舗に荷物を届ける際、店舗に最も近い入口近くのショッピング モールの駐車場で配達車両が停止します。車両の停車場所です。その後、運転者は車両の停留所から、店舗があるモール内の場所まで歩きます。これは配達場所です。

ユーザーに適切な配送トラッキング機能を提供するため、配送タスクへの車両タスクの割り当て方法を検討してください。また、配送タスクについては、残りの車両停車地の数がユーザーに報告されるため、配送状況を確認できます。

たとえば、ドライバーが 1 つのオフィスビルに多数の配送を行っている場合は、すべての配送タスクを 1 つの車両駅に割り当てることを検討してください。各配達タスクがそれぞれの車両停車地に割り当てられている場合、配達先は車両が停留所の数に達すると利用できなくなるため、配送の追跡機能はユーザーに役立ちません。車両の多数の停止が短時間に完了しても、ユーザーが配送状況を追跡するための十分な時間を確保できません。

モバイル SDK の使用

Driver SDK を呼び出す前に、必ず初期化してください。

Delivery Driver API の初期化

Driver SDK で Delivery Driver API を初期化する前に、Navigation SDK を初期化してください。次に、次の例のように Delivery Driver API を初期化します。

static final String PROVIDER_ID = "provider-1234";
static final String VEHICLE_ID = "vehicle-8241890";

NavigationApi.getNavigator(
   this, // Activity.
   new NavigatorListener() {
     @Override
     public void onNavigatorReady(Navigator navigator) {
       DeliveryDriverApi.createInstance(DriverContext.builder(getApplication())
         .setNavigator(navigator)
         .setProviderId(PROVIDER_ID)
         .setVehicleId(VEHICLE_ID)
         .setAuthTokenFactory((context) -> "JWT") // AuthTokenFactory returns JWT for call context.
         .setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(getApplication()))
         .setNavigationTransactionRecorder(NavigationApi.getNavigationTransactionRecorder(getApplication()))
         .setStatusListener((statusLevel,statusCode,statusMsg) -> // Optional, surfaces polling errors.
             Log.d("TAG", String.format("New status update. %s, %s, %s", statusLevel, statusCode, statusMsg)))
         .build));
     }

     @Override
     public void onError(int errorCode) {
       Log.e("TAG", String.format("Error loading Navigator instance: %s", errorCode));
     }
   });

ユースケース

このセクションでは、Deliveries API を使用して一般的なユースケースをモデル化する方法を説明します。

一意のエンティティ ID

REST 呼び出しで使用される一意のエンティティ ID の形式と値は Fleet Engine に対して不透明です。自動増分 ID は使用せず、ドライバーの電話番号などの個人を特定できる情報(PII)が ID に含まれていないことを確認してください。

車両の作成

車両は、Driver SDK またはサーバー環境から作成できます。

gRPC

新しい車両を作成するには、Fleet Engine に対して CreateDeliveryVehicle 呼び出しを行います。CreateDeliveryVehicleRequest オブジェクトを使用して、新しい配送車両の属性を定義します。Name フィールドで指定された値は、ユーザー指定 ID の API ガイダンスに従って無視されます。車両の ID を設定するには、DeliveryVehicleId フィールドを使用します。

DeliveryVehicle を作成するときに、必要に応じて次の 2 つのフィールドを指定できます。

  • 属性
  • 最終場所

他のすべてのフィールドは設定しないでください。これらのフィールドは読み取り専用であるか、UpdateDeliveryVehicle 呼び出しを介してのみ更新できるため、Fleet Engine はエラーを返します。

オプションのフィールドを設定せずに車両を作成するには、CreateDeliveryVehicleRequestDeliveryVehicle フィールドを未設定のままにします。

次の例は、Java gRPC ライブラリを使用して車両を作成する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890"; // Avoid auto-incrementing IDs.

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String parent = "providers/" + PROJECT_ID;
DeliveryVehicle vehicle = DeliveryVehicle.newBuilder()
  .addAttributes(DeliveryVehicleAttribute.newBuilder()
    .setKey("route_number").setValue("1"))  // Opaque to the Fleet Engine
  .build();

// Vehicle request
CreateDeliveryVehicleRequest createVehicleRequest =
  CreateDeliveryVehicleRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setDeliveryVehicleId(VEHICLE_ID)     // Vehicle ID assigned by the Provider
      .setDeliveryVehicle(vehicle)
      .build();

// Error handling
// If Fleet Engine does not have vehicle with that ID and the credentials of the
// requestor pass, the service creates the vehicle successfully.

try {
  DeliveryVehicle createdVehicle =
    deliveryService.createDeliveryVehicle(createVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境から車両を作成するには、CreateDeliveryVehicle に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles?deliveryVehicleId=<id>

<id> はフリート内の配送車両の一意の識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

POST 本文は、作成する DeliveryVehicle エンティティを表します。次のオプション フィールドを指定できます。

  • 属性
  • lastLocation

curl コマンドの例:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
  "attributes": [{"key": "model", "value": "sedan"}],
  "lastLocation": {"location": {"latitude": 12.1, "longitude": 14.5}}
}
EOM

Fleet Engine では、ユーザー指定 ID の API ガイダンスに沿って DeliveryVehicle エンティティの name フィールドは無視されます。他のすべてのフィールドは設定しないでください。設定すると、これらのフィールドは読み取り専用であるか、UpdateDeliveryVehicle 呼び出しを介してのみ更新できるため、Fleet Engine はエラーを返します。

フィールドを設定せずに車両を作成するには、POST リクエストの本文を空のままにします。新しく作成された車両は、POST URL の deliveryVehicleId パラメータから抽出された車両 ID を持ちます。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}"

配送の受け取りタスクを作成する

配送の受け取りタスクは、Driver SDK またはサーバー環境から作成できます。

gRPC

次の例は、Java gRPC ライブラリを使用して、集荷タスクを作成する方法を示しています。

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have a task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境から配送受け取りタスクを作成するには、CreateTask に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>

<id>: タスクの一意の識別子です。配送の荷物追跡番号は使用できません。システムにタスク ID がない場合は、Universally Unique Identifier(UUID)が生成される可能性があります。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    type Type.PICKUP
    state 状態。OPEN
    trackingId 配送状況を追跡するために使用している番号または識別子。
    プランの地域 タスクが完了する場所。この場合は、配送の集荷場所です。
    タスクの所要時間 集荷場所での集荷にかかる時間(秒単位)。

  • 省略可能なフィールド:

    Field
    targetTimeWindow タスクが完了しなければならない時間枠。現時点では、これはルーティング動作には影響しません。
    属性 カスタムタスク属性のリスト。各属性には一意のキーが必要です。

エンティティの他のフィールドはすべて作成に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine が例外をスローします。タスクの割り当てには UpdateDeliveryVehicleRequest を使用します。詳細については、車両にタスクを割り当てるをご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "PICKUP",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

配送タスクを作成する

配送タスクは、Driver SDK またはサーバー環境から作成できます。

gRPC

次の例は、Java gRPC ライブラリを使用して、配送タスクを作成する方法を示しています。

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境から配送タスクを作成するには、「CreateTask」に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>

<id>: タスクの一意の識別子です。配送の荷物追跡番号は使用できません。システムにタスク ID がない場合は、Universally Unique Identifier(UUID)が生成される可能性があります。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    type Type.DELIVERY
    state 状態。OPEN
    trackingId 配送状況を追跡するために使用している番号または識別子。
    プランの地域 タスクが完了する場所。この配送の配達場所。
    タスクの所要時間 配送場所の発送準備完了までの予想時間(秒)。

  • 省略可能なフィールド:

    Field
    targetTimeWindow タスクが完了しなければならない時間枠。現時点では、これはルーティング動作には影響しません。
    属性 カスタムタスク属性のリスト。各属性には一意のキーが必要です。

エンティティの他のフィールドはすべて作成に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。UpdateDeliveryVehicleRequest を使用してタスクを割り当てます。詳細については、車両にタスクを割り当てるをご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "DELIVERY",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

タスクの一括作成

サーバー環境からタスクのバッチを作成できます。

gRPC

次の例は、Java gRPC ライブラリを使用して、同じ場所で配達用と集荷用の 2 つのタスクを作成する方法を示しています。

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Delivery Task settings
Task deliveryTask = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("delivery-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Delivery Task request
CreateTaskRequest createDeliveryTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8312508")  // Task ID assigned by the Provider
      .setTask(deliveryTask)      // Initial state
      .build();

// Pickup Task settings
Task pickupTask = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("pickup-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Pickup Task request
CreateTaskRequest createPickupTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(pickupTask)        // Initial state
      .build();

// Batch Create Tasks settings
String parent = "providers/" + PROJECT_ID;

// Batch Create Tasks request
BatchCreateTasksRequest batchCreateTasksRequest =
  BatchCreateTasksRequest.newBuilder()
      .setParent(parent)
      .addRequests(createDeliveryTaskRequest)
      .addRequests(createPickupTaskRequest)
      .build();

// Error handling
// If Fleet Engine does not have any task(s) with these task ID(s) and the
// credentials of the requestor pass, the service creates the task(s)
// successfully.

try {
  BatchCreateTasksResponse createdTasks = deliveryService.batchCreateTasks(
    batchCreateTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

配送と受け取りのタスクをサーバー環境から作成するには、BatchCreateTasks に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks:batchCreate

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には BatchCreateTasksRequest エンティティを含める必要があります。

  • 必須フィールド:

    Field
    リクエスト 配列<CreateTasksRequest>

  • 省略可能フィールド:

    Field
    header 「DeliveryRequestHeader」

requests 内の各 CreateTasksRequest 要素は、parent フィールドと header フィールドは省略可能ですが、CreateTask リクエストと同じ検証ルールを渡す必要があります。設定する場合、トップレベルの BatchCreateTasksRequest の各フィールドと同じにする必要があります。具体的な検証ルールについては、配送の受け取りタスクを作成すると、配送タスクを作成するをご覧ください。

詳細については、BatchCreateTasks の API リファレンス ドキュメント(gRPCREST)をご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, $DELIVERY_TRACKING_ID, $DELIVERY_TASK_ID,
# $PICKUP_TRACKING_ID, and $PICKUP_TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks:batchCreate" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "requests" : [
    {
      "taskId": "${DELIVERY_TASK_ID}",
      "task" : {
        "type": "DELIVERY",
        "state": "OPEN",
        "trackingId": "${DELIVERY_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    },
    {
      "taskId": "${PICKUP_TASK_ID}",
      "task" : {
        "type": "PICKUP",
        "state": "OPEN",
        "trackingId": "${PICKUP_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    }
  ]
}
EOM

予約不可

Driver SDK またはサーバー環境から、利用できないことを示すタスク(ドライバー ブレークや車両給油など)を作成できます。スケジュールが設定され、利用できないタスクにはトラッキング ID を含めないでください。必要に応じて、場所を指定することもできます。

gRPC

次の例は、Java gRPC ライブラリを使用して、使用不可のタスクを作成する方法を示しています。

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.UNAVAILABLE)
  .setState(Task.State.OPEN)
  .setTaskDuration(
    Duration.newBuilder().setSeconds(60 * 60))  // 1hr break
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

使用不可のタスクをサーバー環境から作成するには、CreateTask に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>

<id>: タスクの一意の識別子です。システムにタスク ID がない場合は、Universally Unique Identifier(UUID)が生成される可能性があります。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    type データ型: 対応不可
    state 状態。OPEN
    タスクの所要時間 ブレークの長さ(秒)

  • 省略可能なフィールド:

    Field
    プランの地域 ブレークの位置(特定の位置で撮影する必要がある場合)。

エンティティの他のフィールドはすべて作成に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine が例外をスローします。タスクの割り当てには UpdateDeliveryVehicleRequest を使用します。詳細については、車両にタスクを割り当てるをご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "UNAVAILABLE",
  "state": "OPEN",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "300s"
}
EOM

経由地数

スケジュールされた停止タスクは、Driver SDK またはサーバー環境から作成できます。スケジュールされた停止タスクにトラッキング ID を含めることはできません。

gRPC

次の例は、Java gRPC ライブラリを使用して、スケジュールされた停止タスクを作成する方法を示しています。

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.SCHEDULED_STOP)
  .setState(Task.State.OPEN)
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTrip(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境からスケジュールされた停止タスクを作成するには、「CreateTask」に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>

<id>: タスクの一意の識別子です。システムにタスク ID がない場合は、Universally Unique Identifier(UUID)が生成される可能性があります。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    type Type.SCHEDULED_STOP
    state 状態。OPEN
    プランの地域 停車地の場所。
    タスクの所要時間 予想停留所の長さ(秒)。

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて作成に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine が例外をスローします。タスクの割り当てには UpdateDeliveryVehicleRequest を使用します。詳細については、車両にタスクを割り当てるをご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "SCHEDULED_STOP",
  "state": "OPEN",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "600s"
}
EOM

目標時間枠を設定する

ターゲット時間枠は、タスクが完了する必要のある TimeWindow です。たとえば、配送の時間枠を配達の受取人に伝えた場合、タスクの対象者の時間枠を使用して、この時間枠をキャプチャし、フィールドを使用してアラートを生成するか、輸送後のパフォーマンスを分析することができます。

ターゲット時間枠は、開始時刻と終了時刻で構成され、任意のタスクタイプに設定できます。現在、ターゲット時間枠はルーティング動作に影響しません。

gRPC

次の例は、Java gRPC ライブラリを使用して、タスクの時間枠を設定する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("targetTimeWindow"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

HTTP を使用してタスクの時間枠を設定するには、UpdateTask を呼び出します。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=targetTimeWindow

<id>: タスクの一意の識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって生成されるトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    targetTimeWindow タスクが完了しなければならない時間枠。現在のところ、これはルーティング動作には影響しません。

  • 省略可能フィールド:

    • なし

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

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=targetTimeWindow" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

タスク トラッキングの表示設定

Shipment Tracking ライブラリ内のデータの公開設定と GetTaskTrackingInfo の呼び出しによって返されるデータは、タスクごとに TaskTrackingViewConfig を設定することで、タスクごとに制御できます。詳しくは、アクティブな車両タスクをご覧ください。これは、タスクを作成または更新するときに行うことができます。この構成でタスクを更新する例を次に示します。

gRPC

次の例は、Java gRPC ライブラリを使用して、タスク トラッキング ビューの構成を設定する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskTrackingViewConfig(
    TaskTrackingViewConfig.newBuilder()
      .setRoutePolylinePointsVisibility(
        VisibilityOption.newBuilder().setRemainingStopCountThreshold(3))
      .setEstimatedArrivalTimeVisibility(
        VisibilityOption.newBuilder().remainingDrivingDistanceMetersThreshold(5000))
      .setRemainingStopCountVisibility(
        VisibilityOption.newBuilder().setNever(true)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("taskTrackingViewConfig"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
  }
  return;
}

REST

HTTP を使用してタスク トラッキング ビューの構成ウィンドウを設定するには、UpdateTask を呼び出します。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskTrackingViewConfig

<id>: タスクの一意の識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって生成されるトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    taskTrackingViewConfig エンドユーザーに対して、どのような状況でどのデータ要素を表示するかを指定するタスク トラッキングの構成。

  • 省略可能フィールド:

    • なし

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

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskTrackingViewConfig" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskTrackingViewConfig": {
    "routePolylinePointsVisibility": {
      "remainingStopCountThreshold": 3
    },
    "estimatedArrivalTimeVisibility": {
      "remainingDrivingDistanceMetersThreshold": 5000
    },
    "remainingStopCountVisibility": {
      "never": true
    }
  }
}
EOM

タスクを車両に割り当てる

配送車両にタスクを割り当てるには、車両のタスクの順序を更新します。車両のタスク順序は、配送車両の停車場所のリストによって決まります。各停車場所には 1 つ以上のタスクを割り当てることができます。

以前に別の車両に割り当てられていたタスクのタスク順序を更新すると、エラーが発生します。

ある車両から別の車両に配送を変更するには、元のタスクをクローズしてから、新しい車両を割り当てる前に再作成します。

タスクの順序の更新

車両に割り当てられたタスクの実行順序は、Driver SDK またはサーバー環境から更新できます。競合状態を回避するために、2 つのメソッドを混在させないでください。

タスクの順序を更新すると、以前に車両に割り当てられていなかったタスクも車両に割り当てられ、以前に車両に割り当てられていた、更新された注文が除外されたタスクが終了します。以前に別の車両に割り当てられていた場合に別の車両にタスクを割り当てると、エラーが発生します。まず既存のタスクを閉じて、新しい車両に割り当てる前に新しいタスクを作成します。

タスクの順番はいつでも更新できます。

gRPC

次の例は、Java gRPC ライブラリを使用して、車両のタスクの順序を更新する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
    .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.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 updateDeliveryRequest =
  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

サーバー環境から車両のタスク順序を更新するには、「UpdateDeliveryVehicle」に対して HTTP REST 呼び出しを行います。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    Field
    残りの Journey セグメント 実行する必要があるタスクの工程のセグメントのリスト。リストの最初のタスクが最初に実行されます。
    残りの車両の JourneySegments[i].stop リスト内のタスク i の停車地。
    残りの車両の JourneySegments [i].stop.plannedLocation 予定している停留所の場所。
    残りの車両の JourneySegments [i].stop.tasks この車両の停車場所で実行するタスクのリスト。
    残りの車両の JourneySegments [i].stop.state 状態(NEW)

  • 省略可能フィールド:

    • なし

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

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.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 への通知には、Driver SDK またはサーバー環境を使用できます。競合状態を回避し、信頼できる唯一の情報源を維持するために、2 つのメソッドを混在させないでください。

gRPC

次の例は、Java gRPC ライブラリを使用して、車両が次の停車地に到着することを Fleet Engine に通知する方法を示しています。

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

車両がサーバー環境から次の停車地に到着していることを Fleet Engine に通知するには、HTTPREST 呼び出し「UpdateDeliveryVehicle」を作成します。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    Field
    残りの Journey セグメント 状態が「State.NEW」としてマークされた残りの車両停車地のリスト。リストの最初の停車地は、State.ENROUTE としてマークされている必要があります。

  • 省略可能フィールド:

    • なし

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

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 への通知には、Driver SDK またはサーバー環境を使用できます。競合状態を回避し、信頼できる唯一の情報源を維持するために、2 つのメソッドを混在させないでください。

gRPC

次の例は、Java gRPC ライブラリを使用して、車両が停留所に到着したことを Fleet Engine に通知する方法を示しています。

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

サーバー環境から停車地に車両が到着したことを Fleet Engine に通知するには、HTTP REST 呼び出しで UpdateDeliveryVehicle を作成します。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    Field
    残りの Journey セグメント 到着した停車地で、State.ARRIVED に設定された状態と、State.NEW としてマークされた車両の停車地のリストが続いています。

  • 省略可能フィールド:

    • なし

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

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 への通知は、Driver SDK またはサーバー環境から行えます。競合状態を回避し、信頼できる唯一の情報源を維持するために、2 つのメソッドを混在させないでください。

gRPC

次の例は、Java gRPC ライブラリを使用して、車両の停車が完了したことを Fleet Engine に通知する方法を示しています。

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

サーバー環境からの停止が完了したことを Fleet Engine に通知するには、HTTPREST 呼び出し「UpdateDeliveryVehicle」を実行します。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    Field
    残りのセグメント 完了している停車地は、残りの車両停車地のリストには表示されなくなります。

  • 省略可能フィールド:

    • なし

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

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

タスクを更新する

ほとんどのタスク フィールドは変更不可です。ただし、タスク エンティティを直接更新することで、状態、タスクの結果、タスクの結果の時間、タスクの結果の場所、属性を変更できます。たとえば、タスクが車両に割り当てられていない場合、状態を直接更新してタスクを閉じることができます。

gRPC

これは、gRPC を介してタスクを更新する例です。

REST

これは、REST を使用してタスクを更新する例です。

タスクを閉じる

車両に割り当てられているタスクを閉じるには、タスクが実行される停車地を車両で完了したことを Fleet Engine に通知するか、車両リストから削除します。それには、車両のタスクの順序を更新するときと同じように、残りの車両の停止のリストを設定します。

タスクに車両が割り当てられておらず、タスクを閉じる必要がある場合は、タスクを CLOSED の状態に更新します。ただし、CLOSED タスクを再開することはできません。

タスクの終了は、成功や失敗を示すものではありません。タスクが進行中とみなされなくなったことを示します。配送追跡では、配達の成果を確認できるように、タスクの実際の結果を示すことが重要です。

gRPC

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setState(Task.State.CLOSED) // It's only possible to directly CLOSE a
  .build();                    // task which is NOT assigned to a vehicle.

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("state"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

タスクがサーバー環境から閉じているとマークするには、UpdateTask に対して HTTP REST 呼び出しを行います。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=state

<id>: タスクの一意の識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    state 状態。CLOSED

  • 省略可能なフィールド:

    Field
    タスクの成果 Outcome.SUCCEEDED または Outcome.FAILED
    taskOutcomeTime タスクが完了した時刻。
    taskOutcomeLocation タスクが完了したロケーション。Fleet Engine は、プロバイダによって手動でオーバーライドされない限り、デフォルトで最後の車両位置情報に設定されます。

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

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=state,taskOutcome,taskOutcomeTime" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "state": "CLOSED",
  "taskOutcome": "SUCCEEDED",
  "taskOutcomeTime": "$(date -u --iso-8601=seconds)"
}
EOM

タスクの結果と結果のロケーションの設定

タスクの終了は、成功または失敗を示すのではなく、タスクが進行中とみなされなくなったことを示します。配送追跡では、タスクの実際の結果を示して、配送結果を表示し、サービスに対して適切な請求が行われるようにすることが重要です。一度設定すると、タスクの結果は変更できません。タスクの結果時間とタスクの結果の場所を設定後変更できます。

クローズ状態のタスクは、結果を SUCCEEDED または FAILED に設定できます。Fleet Engine では、ステータスが SUCCEEDED の配信タスクにのみ課金されます。

タスクの結果にマークを付けると、Fleet Engine はタスクの結果の場所に、最後に認識された車両の位置を自動的に入力します。この動作はオーバーライドできます。

gRPC

結果を設定するときに、タスクの結果のロケーションを設定できます。これにより、Fleet Engine が最後に車両の位置情報をデフォルトに設定できなくなります。Fleet Engine で設定されたタスクの結果のロケーションは、後で上書きすることもできます。指定したタスクの結果の場所は、Fleet Engine によって上書きされることはありません。タスク結果を設定していないタスクに、タスク結果の場所を設定することはできません。同じリクエスト内にタスク結果とタスク結果の場所の両方を設定できます。

次の例は、Java gRPC ライブラリを使用して、タスク結果を SUCCEEDED に設定し、タスクが完了したロケーションを設定する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskOutcome(TaskOutcome.SUCCEEDED)
  .setTaskOutcomeTime(now())
  .setTaskOutcomeLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("task_outcome", "task_outcome_time", "task_outcome_location"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境からタスクを完了としてマークするには、UpdateTask に対して HTTP REST 呼び出しを行います。

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation

<id>: タスクの一意の識別子です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    Field
    タスクの成果 Outcome.SUCCEEDED または Outcome.FAILED
    taskOutcomeTime タスクの結果が設定されたときのタイムスタンプ(プロバイダから)。タスクが完了した時刻です。

  • 省略可能なフィールド:

    Field
    taskOutcomeLocation タスクが完了したロケーション。Fleet Engine は、プロバイダによって手動でオーバーライドされない限り、デフォルトで最後の車両位置情報に設定されます。

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

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskOutcome": "SUCCEEDED",
  "taskOutcomeTime": "$(date -u --iso-8601=seconds)",
  "taskOutcomeLocation": {
    "point": {
      "latitude": -6.195139,
      "longitude": 106.820826
    }
  }
}
EOM

配送のルートを変更する

配送タスクの作成後に、その予定のロケーションを変更することはできません。 配送のルートを変更するには、結果を設定せずに配送タスクを閉じ、更新した計画場所を含む新しいタスクを作成します。新しいタスクを作成したら、そのタスクを同じ車両に割り当てます。詳細については、配送タスクを閉じるタスクの割り当てをご覧ください。

餌箱や配達車両の使用

フィーダーカーを使用して 1 日を通して配送車両に輸送する場合は、配送のスケジューリングを配送車両のスケジュール設定された停止タスクとしてモデル化します。正確な位置情報の追跡を確実にするため、配送したタスクは、配送車両に積み込まれてからのみ割り当ててください。詳しくは、臨時停留所をご覧ください。

ショップの配送ステータスとその他のメタ情報

配送タスクが完了すると、タスクの状態と結果がタスクに記録されます。ただし、配送に固有のその他のメタ情報を更新することをおすすめします。Fleet Engine サービスの外部で参照できる他のメタ情報を保存するには、タスクに関連付けられた Tracking_id を外部テーブルのキーとして使用します。

詳細については、タスクのライフサイクルをご覧ください。

車両を検索

車両を検索するには、Driver SDK またはサーバー環境を使用します。

gRPC

次の例は、Java gRPC ライブラリを使用して車両を検索する方法を示しています。

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle request
String name = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
GetDeliveryVehicleRequest getVehicleRequest = GetDeliveryVehicleRequest.newBuilder()  // No need for the header
    .setName(name)
    .build();

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

REST

サーバー環境から車両を検索するには、「GetVehicle」に対して HTTP REST 呼び出しを行います。

GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<vehicleId>

<id>: タスクの一意の識別子です。

<vehicleId> は、検索する車両の ID です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文は空にする必要があります。

検索が成功した場合、レスポンスの本文には車両エンティティが含まれます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}"

タスクの検索

タスクはサーバー環境から検索できます。Driver SDK はタスクの検索をサポートしていません。

gRPC

次の例は、Java gRPC ライブラリを使用してタスクを検索する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8597549";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task request
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
GetTaskRequest getTaskRequest = GetTaskRequest.newBuilder()  // No need for the header
    .setName(taskName)
    .build();

try {
  Task task = deliveryService.getTask(getTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境からタスクを検索するには、「GetTask」に対して HTTP REST 呼び出しを行います。

GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<taskId>

<id>: タスクの一意の識別子です。

<taskId> は、検索するタスクの ID です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文は空にする必要があります。

検索が成功した場合、レスポンスの本文にはタスク エンティティが含まれます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}"

配送タスクの情報を追跡 ID で検索

配送タスクの情報は、それぞれ別の用途で検索できます。

  • タスク ID ごと: タスクデータの完全なビューにアクセスできるフリート オペレーターなどのユーザーが使用します。
  • 荷物追跡 ID: クライアント ソフトウェアがエンドユーザーに限定的な情報を提供するために使用します(荷物が顧客に到着したときなど)。

このセクションでは、トラッキング ID でタスク情報を検索する方法について説明します。タスク ID を指定してタスクを検索する場合は、タスクの検索をご覧ください。

トラッキング ID を使用して情報を検索するには、次のいずれかを使用します。

ルックアップ要件

  • トラッキング ID による配送情報は、追跡地域の公開設定の管理に記載されている公開設定ルールに準拠する必要があります。

  • Fleet Engine を使用して荷物追跡 ID で配送情報を検索する。Driver SDK は、トラッキング ID による情報検索をサポートしていません。Fleet Engine でこれを行うには、サーバー環境またはブラウザ環境を使用します。

  • 最も狭いトークンを使用して、セキュリティ リスクを制限します。たとえば、Delivery Consumer Token を使用する場合、Fleet Engine Deliveries API の呼び出しは、配送業者に関連する情報(配送業者や受取人など)のみを返します。レスポンスのその他の情報はすべて編集されます。トークンの詳細については、認可用の JSON ウェブトークン(JWT)の作成をご覧ください。

gRPC を使用した Java でのルックアップ

次の例は、Java gRPC ライブラリを使用して、配送 ID 別に配送タスクの情報を検索する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
GetTaskTrackingInfoRequest getTaskTrackingInfoRequest = GetTaskTrackingInfoRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setTrackingId(TRACKING_ID)
    .build();

try {
  TaskTrackingInfo taskTrackingInfo = deliveryService.getTaskTrackingInfo(getTaskTrackingInfoRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

HTTP を使用したルックアップ

ブラウザから配送タスクを検索するには、GetTaskTrackingInfo に対して HTTP REST 呼び出しを行います。

GET https://fleetengine.googleapis.com/v1/providers/<project_id>/taskTrackingInfo/<tracking_id>

<tracking_id> は、タスクに関連付けられたトラッキング ID です。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

検索が成功した場合、レスポンスの本文には taskTrackingInfo エンティティが含まれます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and TRACKING_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/taskTrackingInfo/${TRACKING_ID}"

タスクの一覧表示

サーバーまたはブラウザ環境からタスクを一覧表示できます。Driver SDK はタスクの一覧表示をサポートしていません。

タスクの一覧表示では、タスクに対する幅広いアクセス権がリクエストされます。タスクの一覧表示は、信頼できるユーザーのみを対象としています。タスクのリスト リクエストを行うときに、デリバリー フリート リーダーまたはデリバリー スーパー ユーザー認証トークンを使用します。

リストのタスクでは、次のフィールドが削除されます。

  • VehicleStop.planned_location
  • VehicleStop.state
  • VehicleStop.TaskInfo.taskId

表示されたタスクは、ほとんどのタスク プロパティでフィルタリングできます。フィルタクエリの構文については、AIP-160 をご覧ください。次のリストは、フィルタリングに使用できる有効なタスクのプロパティを示しています。

  • 属性
  • delivery_vehicle_id
  • state
  • 計画された場所
  • タスクの所要時間
  • task_outcome
  • task_outcome_location
  • task_outcome_location_source
  • task_outcome_time
  • トラッキング ID
  • type

Google API の改善提案に基づく、次のフィールド形式を使用します。

フィールド タイプ 形式
タイムスタンプ RFC-3339 task_outcome_time = 2022-03-01T11:30:00-08:00
期間 後に続く秒数 task_duration = 120s
列挙型 文字列 state = CLOSED AND type = PICKUP
ロケーション point.latitudepoint.longitude planned_location.point.latitude > 36.1 AND planned_location.point.longitude < -122.0

フィルタクエリ演算子の完全なリストについては、AIP-160 をご覧ください。

フィルタクエリを指定しない場合、すべてのタスクが一覧表示されます。

タスクリストはページ分けされます。ページサイズは、リストタスクのリクエストで指定できます。ページサイズを指定すると、返されるタスクの数が指定したページサイズを超えなくなります。ページサイズが存在しない場合は、妥当なデフォルトが使用されます。リクエストされたページサイズが内部最大値を超える場合は、内部最大値が使用されます。

タスクリストには、結果の次のページを読み取るためのトークンを含めることができます。前のページのリクエストとまったく同じリクエストでページトークンを使用して、次のページを取得します。返されたページトークンが空の場合、取得可能なタスクはこれ以上ありません。

gRPC

次の例は、Java gRPC ライブラリを使用して、deliveryVehicleId とタスク属性のタスクを一覧表示する方法を示しています。成功した場合のレスポンスは空のままです。空のレスポンスは、指定された deliveryVehicleId がタスクに関連付けられていないことを示します。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListTasksRequest listTasksRequest = ListTasksRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setFilter("delivery_vehicle_id = 123 AND attributes.foo = true")
    .build();

try {
  ListTasksResponse listTasksResponse = deliveryService.listTasks(listTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

ブラウザからタスクを一覧表示するには、ListTasks に対して HTTP REST 呼び出しを行います。

GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks

リストされたタスクにフィルタを適用するには、URL エスケープ フィルタクエリを値として「filter」URL パラメータを含めます。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

検索が成功した場合、レスポンスの本文には、次の構造のデータが含まれます。

// JSON representation
{
  "tasks": [
    {
      object (Task)
    }
  ],
  "nextPageToken": string,
  "totalSize": integer
}

成功した場合のレスポンスは空のままです。空のレスポンスが返された場合は、指定したフィルタ条件を満たすタスクが見つからなかったことを示します。

curl コマンドの例:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?filter=state%20%3D%20OPEN%20AND%20delivery_vehicle_id%20%3D%20${VEHICLE_ID}"

配達車両の一覧を取得する

サーバーまたはブラウザ環境から配信車両を一覧表示できます。Driver SDK は配信車両の一覧表示をサポートしていません。

配達車両の一覧表示は、信頼できるユーザーのみが行うように、配達車両への幅広いアクセスをリクエストしています。車両配達リストをリクエストする場合は、デリバリー フリート リーダーまたはデリバリー スーパー ユーザー認証トークンを使用します。

リスト上の配信手段はレスポンス サイズへの影響により、次のフィールドが削除されます。

  • CurrentRouteSegment
  • 残りの移動手段のセグメント

リスト配信車両は attributes プロパティでフィルタできます。たとえば、キーが my_key で値が my_value の属性に対してクエリを実行するには、attributes.my_key = my_value を使用します。複数の属性に対してクエリを実行するには、attributes.key1 = value1 AND attributes.key2 = value2 のように、論理演算子 ANDOR を使用してクエリを結合します。フィルタクエリ構文の詳細については、AIP-160 をご覧ください。

viewport リクエスト パラメータを使用すると、リストされた配送車両をロケーションでフィルタリングできます。viewport リクエスト パラメータは、high(北)と low(南西)の緯度と経度の 2 つの境界座標を使用してビューポートを定義します。高緯度が地理的に低緯度よりも小さい場合、リクエストは拒否されます。

配信車両リストは、デフォルトで適切なページサイズを使用してページ分けされます。ページサイズを指定すると、上限で指定された車両の数のみがリクエストで返されます。リクエストされたページサイズが内部最大値を超えている場合は、内部最大値が使用されます。デフォルトのページサイズと最大ページサイズは、どちらも 100 台の車両です。

配送車両リストには、結果の次のページを読み取るためのトークンを含めることができます。ページトークンは、それより多くの配信車両ページが取得可能な場合にのみレスポンスに含まれます。タスクの次のページを取得するには、前のリクエストとまったく同じリクエストでページトークンを使用します。

gRPC

次の例は、Java gRPC ライブラリを使用して、特定の属性で特定の属性を持つ配送車両を一覧表示する方法を示しています。成功した場合のレスポンスは空のままです。この場合、指定された属性を持つ車両は現在、指定されたビューポートに存在していません。

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListDeliveryVehiclesRequest listDeliveryVehiclesRequest =
  ListDeliveryVehiclesRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setViewport(
            Viewport.newBuilder()
              .setHigh(LatLng.newBuilder()
                  .setLatitude(37.45)
                  .setLongitude(-122.06)
                  .build())
              .setLow(LatLng.newBuilder()
                  .setLatitude(37.41)
                  .setLongitude(-122.11)
                  .build())
      .setFilter("attributes.my_key = my_value")
      .build();

try {
  ListDeliveryVehiclesResponse listDeliveryVehiclesResponse =
      deliveryService.listDeliveryVehicles(listDeliveryVehiclesRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
          break;

      case PERMISSION_DENIED:
          break;
  }
  return;
}

REST

ブラウザからタスクを一覧表示するには、ListDeliveryVehicles に対して HTTP REST 呼び出しを行います。

GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles

リストされたタスクにフィルタを適用するには、URL エスケープ フィルタクエリを値として「filter」URL パラメータを含めます。

リクエスト ヘッダーには「Bearer <token>」という値を持つ Authorization フィールドが必要です。ここで <token>Fleet Engine トークン ファクトリによって発行されたトークンです。

検索が成功した場合、レスポンスの本文には、次の構造のデータが含まれます。

// JSON representation
{
  "deliveryVehicles": [
    {
      object (DeliveryVehicle)
    }
  ],
  "nextPageToken": string,
  "totalSize": integer
}

成功した場合のレスポンスは空のままです。この場合、指定したフィルタクエリとビューポートに適合する配信車が存在しないことを意味します。

curl コマンドの例:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?filter=attributes.my_key%20%3D%20my_value%20&viewport.high.latitude=37.45&viewport.high.longitude=-122.06&viewport.low.latitude=37.41&viewport.low.longitude=-122.11"

配送追跡

Fleet Engine Deliveries API を使用して、配送トラッキングを有効にするには、次の 2 つの方法があります。

  • 推奨: JavaScript 配送トラッキング ライブラリを使用します。このライブラリを使用すると、Fleet Engine で追跡されている車両の位置と関心のある場所を可視化できます。このライブラリには、標準の google.maps.Map オブジェクトのドロップイン代替となる JavaScript マップ コンポーネントと、Fleet Engine に接続するためのデータ コンポーネントが含まれています。これにより、ウェブ アプリケーションやモバイルアプリから、カスタマイズ可能なアニメーションの配送追跡エクスペリエンスを実現できます。

  • Fleet Engine Deliveries API 上に、独自の配送トラッキングを実装します。重要なのは、トラッキング ID を使用して配送タスクを検索することです。

Delivery Consumer Role を使用する場合、Fleet Engine Deliveries API 呼び出しは、配送業者または受取人に関連する情報のみを返します。レスポンスの他のすべての情報が削除されます。デベロッパーの責任でエンドユーザーを認証します。また、位置情報は、現在実行中のタスクに基づいてフィルタリングされます。利用できないタスクの間、位置情報がエンドユーザーと共有されることはありません。

ロギング

Fleet Engine が RPC ログを Cloud Logging に送信することを許可するオプションを有効にできます。詳細については、ロギングをご覧ください。

認可ロールとトークン

車両とタスクのライフサイクルの管理と個々のユースケースの承認メモに記載されているように、Fleet Engine を呼び出すには、サービス アカウントの認証情報を使用して署名された JSON Web Token による認証が必要です。これらのトークンの作成に使用されるサービス アカウントには 1 つ以上のロールがあり、ロールごとに異なる権限セットが付与されます。

詳細については、認証と承認をご覧ください。

トラブルシューティング

復元性

Fleet Engine は信頼できる情報源とみなされません。必要に応じて、Fleet Engine に依存せずにシステムの状態を復元する責任があります。

Fleet Engine の状態の喪失

Fleet Engine を使用する場合は、障害発生時にシステムが自身を修復するようにクライアントを実装します。たとえば、Fleet Engine が車両を更新しようとすると、車両が存在しないことを示すエラーが返されることがあります。その後、クライアントは車両を新しい状態で再作成する必要があります。この状況が発生することはまれで、発生した場合でもシステムが復元力を持つ必要があります。

Fleet Engine の最悪の障害というごくまれなシナリオでは、ほとんどまたはすべての車両とタスクを再作成しなければならない場合があります。作成率が高すぎる場合は、サービス拒否(DoS)攻撃を回避するために割り当てチェックが実施されているため、割り当ての問題により一部のリクエストが再び失敗することがあります。この場合、再試行のバックオフ戦略を使用して再作成率を遅くします。

ドライバ アプリで状態を失った

ドライバ アプリがクラッシュした場合、アプリは Driver SDK 内で現在の状態を再作成する必要があります。アプリは、タスクを再作成して、タスクが存在することを確認し、現在の状態を復元する必要があります。また、アプリは Driver SDK の停車地のリストを再作成し、明示的に設定する必要があります。

これらの復元は、エンティティがすでにデータベースに存在するかどうかを示すエラーを除き、Fleet Engine の情報に依存せずに自律的に実行する必要があります。エンティティがすでに存在する場合、そのエラーを吸収し、ID を使用してエンティティを更新できます。

よくある質問

運転手がタスクの順番を間違えて停止した場合はどうなりますか?

この場合は、まずタスクの順序を更新してから通常どおりに処理し、駅や停留所に到着する時刻やタスクを完了させるなどの方法を行う必要があります。そうしないと、システムが一致しないものになる可能性があります。拡張テキスト広告が不正確になり、予期しないエラーが報告される場合があります。