配送追跡のための Fleet Engine のスタートガイド

Fleet Engine Deliveries API を使用して、配達のファースト ワンマイルとラスト ワンマイルのフリート アクティビティをモデル化します。この API は、Android 用と iOS 用の Driver SDK を使用するか、HTTP REST または gRPC 呼び出しを使用して直接使用できます。

初期設定

Google Cloud コンソールで Fleet Engine Deliveries API を構成します。

設定を確認する

サービス アカウントを作成したら、設定が完了しており、配送車両を作成できることを確認します。設定をすぐに確認することで、プロジェクトの設定時に発生する可能性のある、承認に関する一般的な問題に対処できます。設定を確認するには、次の 2 つの方法があります。

クライアント ライブラリ

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

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

データ構造

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

  • 荷物の輸送に使用された配送車両。
  • 荷物の集荷と配達のタスク。

また、タスクを使用して、1 日の運転手の休憩と所定の停留所をモデル化します。

配達車両

配達車両は、配送拠点から配達先へ、および受け取り場所から車両拠点に荷物を輸送します。場合によっては、受け取り場所から配達先に直接配送することもあります。

Driver SDK を使用して Fleet Engine に DeliveryVehicle オブジェクトを作成し、配送とフリートのトラッキング用に位置情報の更新を送信します。

タスク

車両が日中に行うアクションについては、アクションのタイプに応じてタスクを割り当てます。

  • 受け取りと配送の場合は、配送タスクを割り当てます。
  • 休憩時間が必要な場合など、ドライバーが利用できない時間帯には、利用不可のタスクを割り当てます。
  • ドロップ ボックスまたは顧客の所在地での非運転タスクの場合は、スケジュール設定された停止タスクを割り当てます。

タスクごとに固有のタスク ID を割り当てる必要がありますが、タスクは同じトラッキング ID を共有できます。Fleet Engine は、各タスクの到着予定時刻を計算するときに、すべてのタスクと、見積もりを行うためにスケジュールされている順序を使用します。タスク ID の詳細については、タスク ID のガイドラインをご覧ください。

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

配送タスク

荷物の集荷と配達の両方を行う配送タスクを作成し、次の情報を含めます。

  • 受け取りまたは宅配を行う場所。
  • 荷物追跡番号または ID。
  • 滞留時間。タスクの完了、駐車場の確認、ハンドオフ場所への徒歩移動などの追加時間を考慮に入れます。
  • 一意のタスク ID。タスク ID のガイドラインをご覧ください。

詳細については次のトピックをご覧ください。

Android

iOS

利用できないタスク

利用不可タスクとは、車両に給油するための休憩、ドライバーの休憩時間など、車両をピックアップまたは配達できない時間帯が該当します。

次の情報を使用して、利用不可のタスクを作成します。

  • 休憩時間。
  • (省略可)休憩の位置。特定の場所を指定する必要はありませんが、指定すると、1 日を通して到着予定時刻の精度が向上します。

詳細については次のトピックをご覧ください。

Android

iOS

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

スケジュール設定された停止タスクを作成して、配達車両に必要な停車地をモデル化します。たとえば、同じ場所での他の配達や集荷とは関係なく、特定の場所で毎日予定されている集荷所にスケジュール設定された停止タスクを作成します。また、ドロップ ボックスからの集荷用にスケジュール設定された停車タスクを作成したり、フィーダーと車両間の乗り換えやサービス センターとサービス ポイントでの停車をモデル化したりすることもできます。

詳細については次のトピックをご覧ください。

Android

iOS

タスク ID のガイドライン

タスク ID を作成する際は、内容と形式に関する次のガイドラインに従ってください。

  • 一意のタスク ID を作成する
  • 個人を特定できる情報(PII)やクリアテキストデータは公開しないでください。
  • 有効な Unicode 文字列を使用してください。
  • 64 文字以下で入力してください。
  • ASCII 文字「/」、「:」、「\"」、「?」、「#」は使用しないでください。
  • Unicode 正規化フォーム C に従って正規化します。

適切なタスク ID の例を次に示します。

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

次の表に、サポートされていないタスク ID の例を示します。

サポートされていないタスク ID 理由
8/31/2019-20:48-46.70746,-130.10807,-85.17909,61.33680 個人情報(PII)および文字の要件(カンマ、ピリオド、コロン、スラッシュ)に違反する。
JohnDoe-577b484da26f-Cupertino-SantaCruz 個人情報(PII)に関する要件に違反しています。
4R0oXLToF"112 Summer Dr. East Hartford、CT06118"577b484da26f8a 個人情報(PII)と文字の要件(空白文字、カンマ、引用符)に違反する。64 文字を超える。

その他のリソース

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

自動車の寿命

DeliveryVehicle オブジェクトは、ファースト ワンマイルまたはラスト ワンマイルの配達車両を表します。以下を使用して DeliveryVehicle オブジェクトを作成します。

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

車両ごとに一意の車両 ID を使用してください。元の車両に対するアクティブなタスクがない場合を除いて、車両 ID を再利用しないでください。

Fleet Engine は、7 日後に UpdateDeliveryVehicle を使用して更新されていない DeliveryVehicle オブジェクトを自動的に削除します。車両が存在するかどうかを確認するには:

  1. UpdateDeliveryVehicle に発信します。
  2. NOT_FOUND エラーが発生した場合は、CreateDeliveryVehicle を呼び出して車両を再作成します。通話から車両が返された場合は、引き続き更新が可能です。

車種

VehicleType エンティティには、オプション フィールド VehicleType が含まれます。このフィールドには、AUTOTWO_WHEELERBICYCLEPEDESTRIAN として指定できる Category 列挙型が含まれます。このフィールドを設定しない場合、デフォルトの AUTO が使用されます。

車両のすべてのルーティングでは、車両タイプに対応する RouteTravelMode が使用されます。

車両属性

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

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

タスクのライフサイクル

Deliveries API gRPC または REST インターフェースを使用して、Fleet Engine でタスクの作成、更新、クエリを行うことができます。

Task オブジェクトには、ライフサイクル全体の進行状況を追跡するための状態フィールドがあります。値は OPEN から CLOSED に進みます。新しいタスクは OPEN 状態で作成されます。これは、次のいずれかを意味します。

  • タスクはまだ配達車両に割り当てられていません。
  • 配達車両が、タスクに割り当てられている車両停留所をまだ通過していない。

タスクのガイドライン

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

車両停止のリストからタスクを削除すると、タスクの状態が自動的に CLOSED に設定されます。

タスクの車両がタスクの車両停止を完了した場合:

  1. タスクの結果フィールドを SUCCEEDED または FAILED に更新します。

  2. イベントのタイムスタンプを指定します。

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

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

注: Fleet Engine では、タスクの明示的な削除はサポートされていません。サービスは、更新が行われない状態で 7 日後にタスクを自動的に削除します。タスクデータを 7 日間を超えて保持する場合は、その機能を自分で実装する必要があります。

タスクの属性

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

属性には個人情報(PII)やその他の機密情報を含めないでください。これらの属性はユーザーに表示される可能性があります。

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

注: 内部システムは、Fleet Engine Deliveries API がユーザーに代わって拡張する信頼できるデータソースとして機能します。

システムで車両とタスクのライフサイクルを管理するには、Fleet Engine Deliveries API を使用して、車両とそれに関連するタスクを作成、更新、追跡します。

同時に、ドライバ アプリケーションは Fleet Engine と直接通信して、デバイスの位置情報とルート情報を更新します。このモデルにより、Fleet Engine はリアルタイムの位置情報を効率的に管理できます。位置情報がトラッキング ライブラリに直接送信され、このライブラリを使用してユーザーに注文のステータスに関する最新情報を伝えることができます。

たとえば、次のシナリオについて考えてみましょう。

  • ドライバーが配達所に近づいた。ドライバ アプリケーションがその位置情報を Fleet Engine に送信します。
  • Fleet Engine はデバイスの位置情報をトラッキング ライブラリに送信します。これにより、コンシューマ アプリケーションはこれを使用して、荷物の近さを消費者に警告します。
  • ドライバーは発送を完了したら、ドライバー アプリの [Shipment delivered](配送配送)ボタンをクリックします。
  • 「配送配送」アクションは、情報をバックエンド システムに送信します。これにより、必要なビジネス検証と検証手順が実行されます。
  • システムはタスクが「SUCCEEDED」であることを確認し、Deliveries API を使用して Fleet Engine を更新します。

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

Deliveries API の使用

クライアント トークンを管理する

ドライバ アプリケーションから Fleet Engine に直接送信される位置情報の更新には、認証トークンが必要です。クライアントから Fleet Engine への更新を処理するおすすめの方法は次のとおりです。

  1. Fleet Engine Delivery の信頼されていないドライバ ユーザーのサービス アカウントのロールを使用して、トークンを生成します。

  2. 範囲が制限されたトークンをドライバ アプリケーションに提供する。このスコープでは、Fleet Engine でデバイスの位置情報の更新のみが許可されます。

このアプローチにより、モバイル デバイスからの呼び出し(信頼性が低い環境とみなされる)が最小権限の原則に準拠するようになります。

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

特定のタスクの更新など、信頼されていないドライバのロールに制限されている範囲を超えて、ドライバ アプリケーションに Fleet Engine の直接更新を許可する場合は、信頼できるドライバのロールを使用できます。信頼できるドライバのロールを使用するモデルについては、信頼できるドライバのモデルをご覧ください。

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

勤務日のモデルを作成する

次の表は、配送 / 物流会社のファースト ワンマイルまたはラスト ワンマイルのドライバーの 1 日の業務をまとめたものです。会社によって詳細が異なる場合がありますが、勤務日をどのようにモデル化できるかがわかります。

時間アクティビティモデリング
1 日の始まりから 24 時間以内 配車担当者は、荷物を配達する車両または経路に割り当てます。 Fleet Engine では、配送、集荷、休憩などのタスクを事前に作成できます。たとえば、配送集荷タスク配送タスク配送予定なし配送予定日などを作成できます。

配達パッケージのセットと配達順序が確定したら、タスクを車両に割り当てます。
1 日の始まり ドライバーはドライバー アプリにログインして、車両センターで一日をスタートします。 Delivery Driver API を初期化します。必要に応じて Fleet Engine で配達車両を作成します。
ドライバーが配達車両に荷物を積み込み、荷物をスキャンします。 配送タスクを事前に作成していない場合は、スキャン時に配送タスクを作成します。
ドライバーがタスクの実行順序を確認します。 事前に作成していない場合は、配送集荷タスク臨時休業停車地を作成します。
ドライバはデポを離れ、次に完了するタスクの数を commit します。 完了順序を commit して、すべてのタスクまたはタスクのサブセットを車両に割り当てます
ドライバーが荷物を配達する。 配達先の停車地に到着したら、停車地に到着した車両に関連するアクションを実行します。配送を配送したら、配送タスクを閉じます。必要に応じて、配送ステータスとその他のメタ情報を保存します。その停車地ですべてのタスクを完了した後、次の停車地までの運転を開始する前に、車両が停車地を完了した場合次の停車地にルート中である場合に関連するアクションを実行します。
ドライバーがフィーダー車両に合流して、追加の荷物を配送車両に引き継ぐ。 送り主と配達車両間の乗り換えの待ち合わせ場所は、所定の停留所としてモデル化する必要があります。

配送を転送してスキャンした後、配送タスクを作成します(まだ作成していない場合)。次に、タスクを車両に割り当てタスクの順序を更新して、タスクの完了順序を更新します。
ドライバーが集荷リクエストの通知を受け取ります。 集荷リクエストを承認したら、荷物の集荷タスクを作成します。次に、タスクを車両に割り当てタスクの順序を更新して、タスクの実行順序を更新します。
正午 ドライバーは昼休み。 ロケーションが利用不可タスクに関連付けられている場合は、他のタスクと同様に扱います。停車地に到着する車両、車両が停車地を完走する次の停車地に到着する車両に関連するアクションを実行する。

それ以外の場合は、休憩が終了するまでこれ以上のアクションは必要ありません。 タスクを削除するには、次のタスクと残りのタスクを確認し、タスクの順序を更新します。
ドライバーが荷物を引き取る。 これは配送停止と同様にモデル化されます。停車地に到着する車両タスクの終了に関連するアクションを実行します。また、必要に応じて配送ステータスとその他のメタ情報の保存を行います。その停車地ですべてのタスクを完了した後、次の停車地までの運転を開始する前に、車両が停車地を完了した次の停車地にルート中であるに関連するアクションを実行します。注: 請求が正しく行われるように、すべての受け取りに、対応する配送タスクを設定する必要があります。その日、ドライバーと同じルート上の別の場所に集荷を配達する場合は、その配達タスクを、ルート上の他の配達タスクとしてモデル化することをおすすめします。ドライバーが集荷をデポに返却する場合は、デポの宛先に配達タスクを作成することをおすすめします。
ドライバーが所定のスケジュールを設定して、ドロップ ボックスから荷物を受け取る。 他の乗車場所と同じようにモデル化されます。停車地に到着する車両タスクを終了することに関連するアクションを実行します。その停車地ですべてのタスクを完了し、次の停車地まで運転し始めたら、車両が停車地を完了した場合次の停車地にルート中である場合に関連するアクションを実行します。
別の場所に配送されるという通知がドライバーに届きます。 元の配送タスクのステータスを「COMPLETED」に設定し、新しい配送先の新しい配送タスクを作成します。詳しくは、配送先を変更するを参照してください。
ドライバーが荷物を配達しようとしましたが、できませんでした。 これは配信停止の成功と同様にモデル化され、配信タスクを完了としてマークします。停車地に到着する車両に関連するアクションを実行する。配送に失敗した場合は、タスクを閉じます。必要に応じて、配送ステータスとその他のメタ情報を保存します。その停車地ですべてのタスクを完了した後、次の停車地までの運転を開始する前に、車両が停車地を完了した次の停車地にルート中であるに関連するアクションを実行します。
荷物を留め置きする(配送しない)ようにドライバーに通知されました。 通知を受信して確認したら、タスクのステータスを COMPLETED に設定します。
ドライバーは、コミットされた配達注文を変更して、次に特定の配送を配達するよう通知されました。 タスクの順序を更新します
ドライバーが注文品から配送することを選択しました。 タスクの順序を更新してから、通常どおりに進みます。
ドライバーが 1 か所に複数の荷物を配達する。 これは、単一の配送中止と同様にモデル化されます。停車地に到着したら、停車地に到着する車両に関連するアクションを実行します。各配送を配送したら、各タスクを閉じます。必要に応じて、ストアの配送ステータスとその他のメタ情報も閉じます。その停車地ですべてのタスクを完了した後、次の停車地までの運転を開始する前に、車両が停車地を完了した次の停車地にルート中であるに関連するアクションを実行します。
日程終了 ドライバーが車両庫に戻る。 ルート内で集荷した荷物をドライバーがデポに戻った場合は、請求が正しく行われるよう、配送タスクとして各パッケージを作成してクローズする必要があります。他の配送拠点と同様に、配送拠点をモデル化することでこれを実現できます。 デポを配達の停留所として使用しない場合でも、必要に応じて、所定の停留所としてデポをモデル化できます。停車地をモデル化することで、ドライバーは車両基地までのルートを確認でき、予想到着時刻を可視化できます。

位置情報の更新の仕組み

Fleet Engine で最高のパフォーマンスを得るには、車両位置情報の更新ストリームを提供します。これらの更新を提供するには、次のいずれかの方法を使用します。

  1. Driver SDK(AndroidiOS)を使用する(最もシンプルなオプション)。
  2. カスタムコードを使用します。これは、位置情報がバックエンドを介して中継される場合や、Android または iOS 以外のデバイスを使用している場合に役立ちます。

車両の位置情報の更新を提供する方法に関係なく、配達車両が停車地に向かって(車両基地を含む)停車地に向かっているときや、停車地に到着したときに、バックエンドは Fleet Engine を更新します。Fleet Engine では、これらのイベントは自動的に検出されません。

車両の停車地と配達場所

車両の停車とは、配達車両が出荷タスクやその他のタスクを完了する場所です。ローディング ホルダーなどのアクセス ポイント、または道路が開けられた場所のいずれかである。

配達先とは、荷物の配達または集荷を行う場所のことです。配達先との間の移動には、車両停留所まで徒歩が必要になる場合があります。

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

ユーザーに最適な配送追跡機能を実現するには、配送タスクが車両の停車地にどのように割り当てられるかを考慮してください。また、配送タスクの残りの車両停車回数がユーザーに報告され、配送状況を確認しやすくなる点に留意してください。

たとえば、ドライバーが 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 を使用して一般的なユースケースをモデル化する方法について説明します。

エンティティの固有識別子

REST 呼び出しで使用される一意のエンティティ ID の形式と値は、Fleet Engine からは見えません。自動インクリメント ID を使用せず、ドライバーの電話番号などの個人を特定できる情報(PII)が ID に含まれないようにしてください。

車両を作成する

車両は、Driver SDK から、または gRPC または REST を使用してサーバー環境から作成できます。

gRPC

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

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

  • 属性
  • LastLocation
  • タイプ

他のフィールドは設定しないでください。この操作を行うと、これらのフィールドは読み取り専用であるか、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
  • type

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 または REST を使用するサーバー環境から作成できます。

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 がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    type Type.PICKUP
    state State.OPEN
    trackingId 配送の追跡に使用する番号または ID。
    plannedLocation タスクを実施する場所。この場合は、荷物の集荷場所です。
    taskDuration 受け取り場所で荷物を受け取るまでにかかる予想時間(秒単位)。

  • 省略可能項目:

    項目価値
    targetTimeWindow タスクを完了する時間枠。これはルーティングの動作には影響しません。
    属性 カスタムタスク属性のリスト。各属性には一意のキーが必要です。

エンティティのその他のフィールドはすべて、作成の際に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクは UpdateDeliveryVehicleRequest を使用して割り当てます。詳しくは、車両にタスクを割り当てる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 または REST を使用してサーバー環境から配送タスクを作成します。

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

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

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

<id> は、タスクの一意の識別子です。配送の荷物追跡番号は使用しないでください。システムにタスク ID がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    type Type.DELIVERY
    state State.OPEN
    trackingId 配送の追跡に使用する番号または ID。
    plannedLocation タスクを完了する場所。この場合は、この配送の配送先です。
    taskDuration 配達場所での荷物の引き取りに要する予想時間(秒単位)。

  • 省略可能項目:

    項目価値
    targetTimeWindow タスクを完了する時間枠。これはルーティングの動作には影響しません。
    属性 カスタムタスク属性のリスト。各属性には一意のキーが必要です。

エンティティのその他のフィールドはすべて、作成の際に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクは UpdateDeliveryVehicleRequest を使用して割り当てます。詳しくは、車両にタスクを割り当てる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 または REST を使用して、サーバー環境からタスクのバッチを作成できます。

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 エンティティを含める必要があります。

  • 必須フィールド:

    項目価値
    リクエスト 配列<CreateTasksRequest>

  • 省略可能フィールド:

    項目価値
    header 「DeliveryRequestHeader」

requests の各 CreateTasksRequest 要素は、CreateTask リクエストと同じ検証ルールを渡す必要があります。ただし、parent フィールドと header フィールドは省略可能です。設定する場合は、最上位の 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、または gRPC または REST を使用したサーバー環境から、利用できないことを示すタスク(ドライバー ブレークや車両給油など)を作成できます。スケジュール設定された利用不能タスクにトラッキング 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 がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    type Type.UNAVAILABLE
    state State.OPEN
    taskDuration 休憩時間(秒)。

  • 省略可能項目:

    項目価値
    plannedLocation 特定の場所で撮影する必要がある場合、休憩の場所。

エンティティのその他のフィールドはすべて、作成の際に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクは UpdateDeliveryVehicleRequest を使用して割り当てます。詳しくは、車両にタスクを割り当てる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 から、または gRPC または REST を使用するサーバー環境から作成できます。スケジュール設定された停止タスクにトラッキング 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 がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    type Type.SCHEDULED_STOP
    state State.OPEN
    plannedLocation 停車地の場所。
    taskDuration 予測される停車地の所要時間(秒単位)。

  • 省略可能フィールド:

    • なし

エンティティのその他のフィールドはすべて、作成の際に無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクは UpdateDeliveryVehicleRequest を使用して割り当てます。詳しくは、車両にタスクを割り当てる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 エンティティを含める必要があります。

  • 必須フィールド:

    項目価値
    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

タスク トラッキングの公開設定を設定する

配送トラッキング ライブラリのデータと、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 エンティティを含める必要があります。

  • 必須フィールド:

    項目価値
    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 またはサーバー環境のいずれかから更新できます。競合状態を回避し、信頼できる唯一の情報源を維持するために、両方の方法を使用しないでください。

車両のタスクの順序を更新すると、次の処理も行われます。

  • 車両に新しいタスクを割り当てます。
  • 以前に車両に割り当てられていて、更新された順序ではないタスクをすべて閉じます。

輸送を車両から別の車両に変更するには、元のタスクを閉じて、新しい車両に割り当てる前にタスクを再作成します。すでに別の車両に割り当てられているタスクの順序を更新すると、エラーが発生します。

タスクの順序はいつでも変更できます。

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

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    remainingVehicleJourneySegments 実行順序のタスクのジャーニー セグメントのリスト。リスト内の最初のタスクが最初に実行されます。
    残り VehicleJourneySegments[i].stop リスト内のタスク i の停止。
    残り VehicleJourneySegments[i].stop.plannedLocation 停車地の計画されている場所。
    残り VehicleJourneySegments[i].stop.tasks この停車地で実行されるタスクのリスト。
    remainingVehicleJourneySegments[i].stop.state 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 から、または gRPC または REST を使用してサーバー環境から行うことができます。競合状態を回避し、信頼できる唯一の情報源を維持するために、両方の方法を使用しないでください。

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 に通知するには、UpdateDeliveryVehicle への HTTP REST 呼び出しを行います。

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

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

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    remainingVehicleJourneySegments 状態が 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

車両の位置情報の更新

Driver SDK を使用して車両の位置情報を更新しない場合は、車両の位置情報を渡して Fleet Engine を直接呼び出すことができます。アクティブな車両の場合、Fleet Engine は少なくとも 1 分に 1 回、最大で 5 秒に 1 回、位置情報の更新を想定します。

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 myDeliveryVehicle = DeliveryVehicle.newBuilder()
    .setLastLocation(DeliveryVehicleLocation.newBuilder()
        .setSupplementalLocation(LatLng.newBuilder()
            .setLatitude(37.3382)
            .setLongitude(121.8863))
        .setSupplementalLocationTime(now())
        .setSupplementalLocationSensor(DeliveryVehicleLocationSensor.CUSTOMER_SUPPLIED_LOCATION)
        .setSupplementalLocationAccuracy(DoubleValue.of(15.0)))  // Optional
    .build();

// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
  UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
      .setName(vehicleName)
      .setDeliveryVehicle(myDeliveryVehicle)
      .setUpdateMask(FieldMask.newBuilder()
          .addPaths("last_location"))
      .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

HTTP REST を使用して Fleet Engine で車両の位置情報を更新するには、UpdateDeliveryVehicle を呼び出します。

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

<id> は、フリート内または位置情報を更新する予定の配送車両の一意の識別子です。これは、車両の作成時に指定した ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    lastLocation.supplementalLocation 車両の位置。
    lastLocation.supplementalLocationTime 車両がこの場所にいたことが最後に判明したタイムスタンプ。
    lastLocation.supplementalLocationSensor CUSTOMER_SUPPLIED_LOCATION を入力する必要があります。

  • 省略可能項目:

    項目価値
    lastLocation.supplementalLocationAccuracy 指定した場所の精度(メートル単位)。

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
{
  "lastLocation": {
    "supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
    "supplementalLocationTime": "$(date -u --iso-8601=seconds)",
    "supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
    "supplementalLocationAccuracy": 15
  }
}
EOM

車両が停車地に到着する

車両が停車地に到着したときに Fleet Engine に通知する必要があります。Fleet Engine への通知は、Driver SDK から、または gRPC または REST を使用してサーバー環境から行うことができます。競合状態を回避し、信頼できる唯一の情報源を維持するために、両方の方法を使用しないでください。

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 に通知するには、UpdateDeliveryVehicle への HTTP REST 呼び出しを行います。

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

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

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    remainingVehicleJourneySegments 到着した停車地は 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 から、または gRPC または REST を使用してサーバー環境から通知できます。競合状態を回避し、信頼できる唯一の情報源を維持するために、両方の方法を使用しないでください。

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 に通知するには、UpdateDeliveryVehicle への HTTP REST 呼び出しを行います。

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

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

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

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

  • 必須フィールド:

    項目価値
    remaining_vehicle_journey_segments 完了した停車地は、残りの停車地のリストには表示されなくなります。

  • 省略可能フィールド:

    • なし

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

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) // You can only directly CLOSE a
  .build();                    // task that 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 エンティティを含める必要があります。

  • 必須フィールド:

    項目価値
    state State.CLOSED

  • 省略可能項目:

    項目価値
    taskOutcome 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 エンティティを含める必要があります。

  • 必須フィールド:

    項目価値
    taskOutcome Outcome.SUCCEEDED または Outcome.FAILED

  • 省略可能項目:

    項目価値
    taskOutcomeLocation タスクが完了したロケーション。設定しない場合、Fleet Engine によりデフォルトで最後の車両の位置情報が使用されます。
    taskOutcomeTime タスク完了時のタイムスタンプ。

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

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 または REST を使用してサーバー環境から検索できます。

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

タスクを検索する

gRPC または REST を使用して、サーバー環境からタスクを検索できます。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 Web Token(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 は、タスクの一覧表示をサポートしていません。

タスクを一覧表示するには、タスクへの幅広いアクセス権をリクエストします。タスクの一覧表示は、信頼できるユーザーのみを対象としています。リストタスクのリクエストを行う場合は、Delivery Fleet Reader または Delivery のスーパー ユーザー認証トークンを使用します。

一覧表示されたタスクの次のフィールドが削除されます。

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

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

  • 属性
  • delivery_vehicle_id
  • state
  • planned_location
  • task_duration
  • task_outcome
  • task_outcome_location
  • task_outcome_location_source
  • task_outcome_time
  • tracking_id
  • type

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

フィールド タイプ フォーマット
タイムスタンプ RFC-3339 task_outcome_time = 2022-03-01T11:30:00-08:00
所要時間 後に s が続く秒数 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`

リストされたタスクにフィルタを適用するには、「filter」という URL パラメータを追加し、その値として 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 は、配達車両のリスト表示をサポートしていません。

配達車両の一覧表示は、信頼できるユーザーのみを対象とした、配達車両への幅広いアクセスをリクエストします。リスト配信車両のリクエストを行う場合は、Delivery Fleet Reader または Delivery スーパー ユーザー認証トークンを使用します。

リストに記載されている配達車両では、レスポンス サイズに影響するため、次のフィールドが削除されます。

  • CurrentRouteSegment
  • RemainingVehicleJourneySegments

配達車両のリストは、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 で追跡されている車両の位置と関心のある場所を可視化できます。この API には、標準の google.maps.Map オブジェクトのドロップイン代替となる JavaScript 地図コンポーネントと、Fleet Engine に接続するためのデータ コンポーネントが含まれています。このコンポーネントを使用すると、ウェブまたはモバイルアプリから、カスタマイズ可能なアニメーション付きの配送追跡エクスペリエンスを提供できます。

  • Fleet Engine Deliveries API を基盤に、独自の配送追跡を実装します。

鍵となるのは、トラッキング ID で配送タスクを検索することです。

配達利用者ロールを使用する場合、Fleet Engine Deliveries API 呼び出しは配送業者または受取人に関連する情報のみを返します。レスポンス内の他のすべての情報は削除されます。エンドユーザーの認証はお客様の責任となります。さらに、位置情報はすでに実行中のタスクに基づいてフィルタされます。利用不可タスクの間、位置情報はエンドユーザーと共有されません。

ロギング

RPC ログを Cloud Logging に送信するように Fleet Engine を設定できます。詳細については、ロギングをご覧ください。

認可ロールとトークン

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

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

一般的な問題のトラブルシューティング

問題が発生した場合は、以下のセクションをご確認ください。

復元性

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

Fleet Engine の消失状態

Fleet Engine を使用する場合は、障害が発生した場合にシステムが自己修復するようにクライアントを実装します。たとえば、Fleet Engine が車両の更新を試みると、車両が存在しないことを示すエラーが返されることがあります。その後、クライアントは車両を新しい状態で再作成する必要があります。この問題が発生することはめったにありませんが、この問題に対処できるだけの復元力がシステムにあることを確認してください。

Fleet Engine に壊滅的な障害が発生した場合、ごくまれなシナリオでは、ほとんどまたはすべての車両とタスクを再作成する必要があります。作成レートが高くなりすぎると、割り当ての問題で一部のリクエストが再び失敗することがあります。これは、サービス拒否(DOS)攻撃を防ぐために、割り当てのチェックが行われているためです。この場合は、再試行のバックオフ戦略を使用して再作成の頻度を下げます。

ドライバー アプリの紛失状態

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

よくある質問

ドライバが順不同でタスクを停止した場合はどうなりますか?

この場合は、まずタスクの順序を更新してから通常どおりに処理を進め、停車地の到着、タスクの完了、その他の詳細をマークします。そうしないと、システムに一貫性がなかったり、到着予定時刻が不正確になったり、予期しないエラーが報告されたりする可能性があります。