開始使用 Fleet Engine 提升機群效能

透過以下方式模擬您的車隊活動,掌握第一和最後里程數的貨物 也就是 Fleet Engine Deliveries API您可以使用 Android 適用的 Driver SDK 使用這個 API 呼叫 iOS 裝置,或直接使用 HTTP REST 或 gRPC 呼叫

初始設定

您可以在 Google Cloud 控制台中設定 Fleet Engine Deliveries API。

驗證設定

建立服務帳戶後,請確認設定已完成 您可以建立運送車輛正在驗證設定 確實解決 設定專案。驗證設定的方法有兩種:

用戶端程式庫

如要提供較優質的開發人員體驗,而非原始 gRPC 或 REST,請使用 用戶端程式庫適用對象 有關如何取得伺服器應用程式用戶端程式庫的指示,請參閱 用戶端程式庫

本說明文件中的 Java 範例假設您已熟悉 gRPC。

資料結構

Fleet Engine Deliveries API 運用兩種資料結構為取件和交付項目建立模型 貨物:

  • 用來運送貨品的運送車輛。
  • 運送自取和外送工作。

工作也能用來模擬驅動程式中斷和排定的停靠時間 整天下來。

交車

貨運車輛從倉庫運送貨物至送貨地點 再從上車地點到倉庫在某些情況下 直接將貨物從上車地點運送至送貨地點。

使用驅動程式 SDK 在 Fleet Engine 中建立 DeliveryVehicle 物件 並傳送最新位置,在運送和車隊追蹤方面取得最新位置。

注意:您最多可以指派 500 項工作,剩下 300 項工作 車輛行駛路段到 DeliveryVehicle 物件。

工作

您可以指派車輛在白天執行的動作 動作類型:

  • 如為自取和外送服務,請指派出貨工作
  • 當司機無法使用時 (例如需要休息片刻), 指派無法使用的工作
  • 若是在集放箱或顧客地點排放以外的工作,則可指派 排定的停止工作

您指派的每項工作都必須有專屬工作 ID,但可以共用相同的工作 追蹤 IDFleet Engine 計算預計到達時間時 系統會運用所有任務及其建立的順序 並進行估算如要進一步瞭解工作 ID,請參閱 工作 ID 指南

如要在 Fleet Engine 中建立工作,請使用驅動程式 SDK 工作管理工具。

運送工作

建立取貨和出貨的運送工作 包括下列資訊:

  • 自取或外送服務的地點。
  • 追蹤號碼或 ID。
  • 完成工作的額外時間所佔的停留時間,請看 ,或走到交接地點。
  • 不重複的工作 ID。請參閱「工作 ID 指南」。

如需詳細資訊,請參閱下列主題:

Android

iOS

無法使用的工作

失誤工作涵蓋沒有車輛無法通行的時段 自取或外送餐點,例如休息車輛或駕駛人員休息時間 休息時間。

建立無法使用下列資訊的工作:

  • 廣告插播的時間長度。
  • (選用) 廣告插播位置。您不必提供 但這麼做能提供更準確的預計到達時間 整天下來。

如需詳細資訊,請參閱下列主題:

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 個半形字元。

其他資源

如何查看各項資料中包含的特定欄位 結構,請參閱 DeliveryVehicle 的 API 參考說明文件 (gRPCREST) 和 Task (gRPCREST)。

車輛的生命週期

DeliveryVehicle 物件代表第一英里或最後一英里送貨車。 您可以使用下列指令建立 DeliveryVehicle 物件:

  • 服務帳戶所屬 Google Cloud 專案的專案 ID 用來呼叫 Fleet Engine API
  • 客戶擁有的車輛 ID。

請使用每輛車的專屬 ID。請勿重複使用車輛 ID 否則原始車輛沒有進行中的工作

Fleet Engine 會自動刪除沒有任何物件的 DeliveryVehicle 個物件 已在七天後使用 UpdateDeliveryVehicle 更新。建議使用 如要在 Fleet Engine 中持續提供車輛,方法就是更新車輛位置 定期間隔更新 DeliveryVehicle 中大部分其他欄位 實體也會延長效期,前提是新的欄位值不同 現有連結

如何查看車輛是否存在:

  1. 呼叫 UpdateDeliveryVehicle
  2. 如果發生 NOT_FOUND 錯誤,請呼叫 CreateDeliveryVehicle 重建車輛 如果呼叫傳回車輛,表示該呼叫仍可更新。

車輛屬性

DeliveryVehicle 實體包含 DeliveryVehicleAttributeListDeliveryVehicles API 包含 filter 欄位可以限制只傳回 DeliveryVehicle 實體,這些實體會傳回 指定的屬性。DeliveryVehicleAttribute 不會影響 Fleet Engine 轉送行為

請勿加入個人識別資訊 (PII) 或機密資訊 ,因為使用者可能會看到這個欄位。

工作的生命週期

您可以在 Fleet Engine 中建立、更新及查詢工作,方法包括: 傳遞至 Deliveries API gRPC 或 REST 介面

Task 物件具有狀態欄位,可追蹤進度 生命週期值會從「OPEN」移至「CLOSED」。已建立新工作 處於開啟狀態,表示:

  • 這項工作尚未指派給送貨車輛。
  • 車輛尚未經過指派的車輛停靠站。

工作指南

你只能將處於「開啟」狀態的車輛指派給車輛。

如要取消工作,您可以從車輛停靠站清單中移除工作, 工作狀態會自動關閉。

工作車輛完成工作的車輛停靠站時:

  1. 將工作的結果欄位更新為「SUCCEEDED」或「FAILED」。

  2. 指定事件的時間戳記。

    這樣 JavaScript 機群追蹤程式庫就會顯示工作結果 工作狀態會自動設為「已關閉」。若需更多資訊,請參閲 使用 JavaScript 機群追蹤程式庫追蹤你的機群

和車輛一樣,Fleet Engine 會刪除 而且嘗試建立的工作 ID 已存在 會傳回錯誤

注意:Fleet Engine 不支援明確刪除工作。「服務」 在沒有更新的情況下七天後自動刪除工作。 如要保留超過七天的工作資料, 您必須自行實作該功能

工作屬性

Task 實體包含 TaskAttribute,可以具有以下 3 種類型的值:字串、數字 以及布林值ListTasks API 包含可限制傳回的 filter 欄位 Task 實體與具有指定屬性的實體。工作屬性沒有 會影響 Fleet Engine 轉送行為

請勿加入個人識別資訊 (PII) 或其他機密資訊 因為使用者可能會看到這些屬性。

管理車輛和工作生命週期

貼心小提醒:您的內部系統是可靠的資料來源 Fleet Engine Deliveries API 代您增強。

如要管理系統中車輛和任務的生命週期,請使用 Fleet Engine Deliveries API 來建立、更新及追蹤車輛與相關工作。

同時,駕駛應用程式直接與 Fleet Engine 通訊 以更新裝置位置和路線資訊。這個模型可讓 Fleet Engine 有效率地管理即時位置資訊系統會將位置資訊直接傳送給 可用來將消費者的狀態 使用者順序

舉例來說,假設您遇到以下情境:

  • 司機靠近送貨站。驅動程式應用程式將其位置傳送至 機群引擎
  • Fleet Engine 將裝置位置資訊傳送給 追蹤程式庫;供消費者應用程式用來通知消費者 方便他們找到包裹的距離。
  • 司機出貨後,點選「出貨」 按鈕。
  • 「已出貨」該動作會將資訊傳送到後端系統 執行必要的商家驗證和驗證步驟
  • 您的系統確認任務為 SUCCEEDED,並使用 Deliveries API。

下圖說明這些程序的一般層級。此外, 會顯示系統、用戶端 和 Fleet Engine

「整合 Deliveries API」圖表>

管理用戶端權杖

來自駕駛應用程式且直接傳送的位置更新 需要授權權杖才能存取 Fleet Engine。建議做法 處理從用戶端傳送至 Fleet Engine 的更新:

  1. 使用 Fleet Engine Delivery Untrusted Driver User 產生權杖 服務帳戶角色

  2. 為驅動程式應用程式提供有限範圍的憑證。這個範圍 僅允許在 Fleet Engine 中更新裝置位置資訊。

這個方法可確保來自行動裝置的來電 低信任環境 最低權限原則

其他服務帳戶角色

反之,如果您想授權駕駛應用程式將 除了對「不受信任的驅動程式」角色限制以外,Fleet Engine 還會進行更新。 像是進行特定工作更新時,可以使用「信任的驅動程式」角色適用對象 使用「信任的駕駛」角色模型的相關資訊,請參閱 信任的驅動程式模型

如要進一步瞭解不受信任及信任的驅動程式角色的使用,請參閱 Cloud 專案設定

建立工作日模型

下表說明第一英里或最後一英里的駕駛人每天的工作日 比方說,他們可能會喜歡貴公司可能會 模型在細節上的差異,但您已經知道自己如何為工作日建模。

時間活動模擬
當日開始後的 24 小時內 調度員負責指派貨運給運輸車輛或路線。 也可以建立運送、取貨、取貨和休息時間等工作 與其他 Fleet Engine 團隊合作舉例來說,您可以建立 出貨自取工作 出貨/運送方式 已排定時間,或 排程停靠

包裹運送包裹設定完成後,即可指派工作到車輛 而且供應順序也完成了
當天開始時間 司機登入駕駛應用程式,在總庫當日開始導航。 初始化 Delivery Driver API。 視需要在 Fleet Engine 中建立運送車輛
駕駛人將貨物裝運到貨車上,再掃描貨物。 如果配送工作並非事先建立 建立運送運送工作
驅動程式可確認工作執行的順序。 如果非事先建立時間 出貨自取工作 排定無法使用,以及 排定停靠點
駕駛人會留下停靠站並修訂接下來要完成的任務數量 已完成 指派所有工作或部分工作 提交完整訂單內容
司機送貨, 抵達貨品停止點後,執行相關操作 抵達停靠站的車輛。 出貨後,關閉 提交工作,並視需要 商店運送狀態和其他中繼資訊。 完成停靠站和之前 已開始行駛至下一個停靠站,請執行與 車輛完成了車輛行駛到下一個停靠站
駕駛與送貨員會面,將其他貨物轉到貨運車輛上。 轉乘至餵食器和運輸車輛的開會點 應視為預定停靠點模型。

轉移並掃描運送商品後,請建立運送工作 (如果還沒有建立的話)然後更新工作完成狀態 藉由將工作指派給車輛來排序 和更新工作順序
駕駛會收到取件要求的通知。 接受取貨要求後 建立出貨取貨工作。 然後更新工作執行作業。 藉由將工作指派給車輛來排序 和更新工作順序
中午 駕駛人吃午餐休息一下。 如果位置與無法使用的工作相關聯,請視同 或啟動其他工作執行與車輛相關的動作 抵達停靠站 車輛完成停靠站車輛行駛到下一個停靠站

否則,您不需要在廣告插播結束之前採取進一步行動。 確認下一項和其餘的工作,移除工作。 更新工作排序
司機上車。 這種模型就像放送停靠站一樣。執行相關操作 到停靠站抵達的車輛關閉工作,並視需要 儲存運送狀態和其他中繼資訊。 完成停靠站和開始行駛前的所有工作後 移至下一個停靠點,執行與車輛完成停靠站相關的動作 和車輛行駛到下一個停靠站。 注意事項:為確保帳單正確計費,所有取貨地點都必須對應 內容上傳任務如果上車地點負責運送 司機當天的行走路線?我們建議您將運送工作模型 其他的傳送工作如果司機送貨 建議在倉庫內建立配送工作 目的地。
駕駛人會安排停靠站,從集貨箱取件。 這種模型與任何其他上車停靠站相同。執行相關操作 到停靠站抵達的車輛關閉工作。完成後 停下後的所有工作,並開始行駛到下一個停靠站 執行與車輛完成停靠點相關的動作 和車輛行駛到下一個停靠站
司機收到貨物轉至其他地點的通知。 將原始運送工作狀態設為「已完成」,然後建立新的運送工作 新送貨地點的運送工作如需更多資訊 請參閱重新規劃路線
駕駛人嘗試提交包裹,但未能送達。 這個模型與成功停止放送 完成上傳執行與以下項目相關的動作: 抵達停靠點的車輛。更新後 無法順利出貨 關閉工作,並視需要顯示 商店運送狀態和其他中繼資訊。 完成停靠站和開始行駛前的所有工作後 移至下一個停靠點,執行與車輛完成停靠站相關的動作 和車輛行駛到下一個停靠站
司機收到保留 (未出貨) 的通知。 收到並確認通知後 將工作狀態設為「已完成」。
司機收到後續運送特定貨品的通知,變更承諾的貨品交付訂單。 更新工作排序
司機選擇送貨到府。 更新工作排序,然後 繼續正常運作
司機能將多個貨物運送至單一地點。 這個模型與單一運送停靠站類似。 抵達停靠站後,請執行與 抵達停靠站的車輛。 每次交貨後,關閉每項工作 並視需要儲存運送狀態和其他中繼資訊。 完成停靠站和開始行駛前的所有工作後 移至下一個停靠點,執行與車輛完成停靠站相關的動作 和車輛行駛到下一個停靠站
當天結束時間 駕駛員返回庫房。 如果司機回到庫房,並在客戶自行取貨時取貨 規劃及關閉每個包裹時 確保帳單正確無誤執行模型時,系統會建立模型 其他的放送停止 如果該庫不是做為送貨停靠站,您仍可選擇 建立模型做為排程的停靠站建立停靠點模型可讓駕駛人看到 沿路追蹤路線,並掌握預估時間 。

位置資訊更新的運作方式

為確保 Fleet Engine 發揮最佳效能,請提供車流 位置更新。請使用下列其中一種方式提供這些更新:

  1. 使用 Driver SDK: AndroidiOS 是最簡單的選項。
  2. 使用自訂程式碼 -- 如果商家地點有 或是透過後端轉送位址,或者您使用 Android 或 Android 以外的裝置 iOS 裝置。

無論您以何種方式提供車輛位置更新,後端 負責在車輛送達時更新 Fleet Engine 轉送至停靠站 (包括庫房) 和該停靠站 抵達停靠站。Fleet Engine 無法偵測這些事件 。

車輛停靠站和送貨地點

車輛停靠站是指貨運車輛完成運送工作的位置 或執行其他工作這是存取點,例如載入座架 不肖人士入侵地點。

交貨地點是指送貨地點 或自行接收往返送貨地點可能需要步行一小段距離 再從車輛停靠站

舉例來說,假設司機送貨到購物中心裡的某間商店, 靠近購物中心的停車場 距離最近的商店入口這是車輛停靠站。駕駛人 再從車輛停靠站到購物中心裡 也就是商店所在的位置這是送貨地點。

為了讓使用者獲得最佳運送追蹤體驗,請考量以下做法: 運送工作會指派給車輛停靠站,請注意 並回報運送工作中剩餘的車輛停靠站,協助使用者 查看運送進度

例如,如果司機為一棟辦公大樓的多項送貨服務, 請考慮將所有送貨工作都分配到一輛車停靠站如果 每個貨品交付工作,都分配到專屬的車輛停靠站 追蹤對您而言沒有什麼幫助 須於車輛於少數幾個停靠站內提供 延遲時間計算的是 資訊封包從來源傳輸至目的地的時間儘管有許多車輛停靠在短時間內完成,也無法獲得 讓使用者有充分時間追蹤配送進度。

使用行動 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,並確定 ID 不含任何個人識別資訊 (PII), 例如駕駛的電話號碼

建立車輛

您可以透過 Driver SDK,或是使用 gRPC 或 REST 的伺服器環境。

gRPC

如要建立新車輛,請向 Fleet Engine 發出 CreateDeliveryVehicle 呼叫。 使用 CreateDeliveryVehicleRequest 物件來定義 。請注意,如果是 Name 欄位指定的值, 根據使用者指定 ID 的 API 指南忽略。 應使用 DeliveryVehicleId 欄位設定車輛 ID。

建立 DeliveryVehicle 時,您可以選擇指定下列欄位:

  • 屬性
  • LastLocation
  • 類型

請勿設定任何其他欄位。否則 Fleet Engine 會傳回錯誤 因為這些欄位是唯讀欄位,或只能藉由呼叫 UpdateDeliveryVehicle

如要建立車輛而不設定任何選填欄位,您可以將 已取消「CreateDeliveryVehicleRequest」中的「DeliveryVehicle」欄位。

以下範例說明如何使用 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

如要從伺服器環境建立車輛,請發出 HTTP REST 呼叫 至 CreateDeliveryVehicle

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

&lt;id&gt; 是車隊中運輸車輛的專屬 ID

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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

針對使用者指定 ID,Fleet Engine 會根據 API 指南,忽略 DeliveryVehicle 實體的 name 欄位。 請勿設定任何其他欄位。否則 Fleet Engine 會傳回錯誤 因為這些欄位是唯讀欄位,或者只能透過 UpdateDeliveryVehicle

如要建立車輛而不設定任何欄位,請保留 POST 的主體 要求為空值。接著,新建的車輛會從 POST 網址中的 deliveryVehicleId 參數

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

建立運送自取工作

您可以透過以下任一方式建立運送取貨工作: 驅動程式 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

如要從伺服器環境建立運送取貨工作,請發出 HTTP REST 呼叫 至 CreateTask

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

&lt;id&gt; 是工作的專屬 ID。不可以是追蹤號碼 出貨。如果系統中沒有工作 ID,可以產生 通用唯一識別碼 (UUID)。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <token>Fleet Engine 權杖工廠核發的權杖

要求主體必須包含 Task 實體:

  • 必填欄位:

    欄位
    類型 Type.PICKUP
    State.OPEN
    trackingId 您用來追蹤運送狀態的號碼或 ID。
    plannedLocation 工作完成的位置,在本例中為 取貨地點。
    taskDuration 到貨時間的預計時間 (以秒為單位) 取貨地點。

  • 選填欄位:

    欄位
    targetTimeWindow 完成工作的時間範圍。這不 會影響轉送行為
    屬性 自訂工作屬性的清單。每個屬性都必須有專屬索引鍵。

系統會在建立實體時忽略實體中的所有其他欄位。機群引擎擲回 例外狀況 (如果要求包含指派的 deliveryVehicleId)。由您指派 透過 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

建立運送運送工作

如要建立運送運送工作,請從以下位置建立: 驅動程式 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 從伺服器環境建立運送運送工作,請發出 HTTP REST 呼叫 至 CreateTask

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

&lt;id&gt; 是工作的專屬 ID。不可以是追蹤號碼 出貨。如果系統中沒有工作 ID,可以產生 通用唯一識別碼 (UUID)。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <token>Fleet Engine 權杖工廠核發的權杖

要求主體必須包含 Task 實體:

  • 必填欄位:

    欄位
    類型 Type.DELIVERY
    State.OPEN
    trackingId 您用來追蹤運送狀態的號碼或 ID。
    plannedLocation 工作完成的位置,在本例中為 此貨品的送貨地點。
    taskDuration 出貨的預計時間 (以秒為單位) 交貨地點

  • 選填欄位:

    欄位
    targetTimeWindow 完成工作的時間範圍。這不 會影響轉送行為
    屬性 自訂工作屬性的清單。每個屬性都必須有專屬索引鍵。

系統會在建立實體時忽略實體中的所有其他欄位。機群引擎擲回 例外狀況,由您指派 透過 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 程式庫 建立兩個工作,一個用於送貨,另一個則用於自取 位置:

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

要求標頭中必須包含 Authorization 欄位,其中的值為 Bearer <token>,其中 <token>這個符記

要求主體必須包含 BatchCreateTasksRequest 實體:

  • 必填欄位:

    欄位
    要求 陣列<CreateTasksRequest>

  • 選填欄位:

    欄位
    標頭 `DeliveryRequestHeader`

requests 中的每個 CreateTasksRequest 元素都必須通過相同驗證 視為 CreateTask 要求來處理,但 parentheader 為選填欄位。如果設定這個引數,其必須和 頂層 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

如要從伺服器環境建立無法使用的工作,請發出 HTTP REST 呼叫 至 CreateTask

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

&lt;id&gt; 是工作的專屬 ID。如果您不 可以產生通用唯一識別碼 識別碼 (UUID)。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <token>Fleet Engine 權杖工廠核發的權杖

要求主體必須包含 Task 實體:

  • 必填欄位:

    欄位
    類型 Type.UNAVAILABLE
    State.OPEN
    taskDuration 廣告插播的時間長度 (以秒為單位)。

  • 選填欄位:

    欄位
    plannedLocation 休息地點 (如果必須在特定位置拍攝)

系統會在建立實體時忽略實體中的所有其他欄位。機群引擎擲回 例外狀況,由您指派 透過 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 從伺服器環境匯入已排定的停止工作不得包含追蹤 編號。

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

如要從伺服器環境建立已排定的停止工作,請發出 HTTP REST 呼叫 至 CreateTask

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

&lt;id&gt; 是工作的專屬 ID。如果您沒用過 可以產生部分工作 ID 通用唯一識別碼 (UUID)。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <token>Fleet Engine 權杖工廠核發的權杖

要求主體必須包含 Task 實體:

  • 必填欄位:

    欄位
    類型 Type.SCHEDULED_STOP
    State.OPEN
    plannedLocation 停靠站的位置。
    taskDuration 預測停靠站長度 (以秒為單位)。

  • 選填欄位:

系統會在建立實體時忽略實體中的所有其他欄位。機群引擎擲回 例外狀況,由您指派 透過 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`

&lt;id&gt; 是工作的專屬 ID

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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`

&lt;id&gt; 是工作的專屬 ID

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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

將工作指派給車輛

只要更新工作順序,即可將工作指派給運送車輛 。車輛的任務排序取決於清單 的車輛停靠站,而且您可以指派一或多項工作 各停靠站的距離。詳情請參閱 更新工作排序

如要變更一輛車的運送狀態,請關閉原始工作 然後重新建立該物件,再將其指派到新車上如果您更新工作 排序已指派的工作 否則就會發生錯誤。

更新工作排序

你可以更新指派給車輛的訂單工作,執行位置包括 這個 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

如要從伺服器環境更新車輛的工作順序,請發出 HTTP REST 呼叫 至 UpdateDeliveryVehicle

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

&lt;id&gt; 是車隊中運輸車輛的專屬 ID 更新任務順序也就是 您在建立車輛時指定的區域。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <token>Fleet Engine 權杖工廠核發的權杖

要求主體必須包含 DeliveryVehicle 實體:

  • 必填欄位:

    欄位
    remainingVehicleJourneySegments 按照工作執行順序列出工作歷程區隔的清單。 系統會先執行清單中的第一個工作。
    remainingVehicleJourneySegments[i].stop 清單中工作 i 的停止。
    remainingVehicleJourneySegments[i].stop.plannedLocation 停靠站的預定位置。
    remainingVehicleJourneySegments[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`

&lt;id&gt; 是車隊中運輸車輛的專屬 ID 更新任務順序也就是 您在建立車輛時指定的區域。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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 預計每分鐘更新至少一次位置,最多不超過一次 每 5 秒執行一次

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`

&lt;id&gt; 是車輛中運輸車輛的專屬 ID 或您打算更新位置的機群。也就是 您在建立車輛時指定的區域。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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`

&lt;id&gt; 是車隊中運輸車輛的專屬 ID 更新任務順序也就是 您在建立車輛時指定的區域。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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 必須收到通知。這會導致 所有與停靠站相關的工作都會設為「已關閉」狀態。你可以 通知 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`

&lt;id&gt; 是車隊中運輸車輛的專屬 ID 更新任務順序也就是 您在建立車輛時指定的區域。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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 通知 車輛已完成工作停靠站 或是從車輛停靠站清單中移除方法是設定 其餘車輛停靠站就像更新工作排序一樣 。

如果工作尚未分配到需要關閉車輛,請更新工作 切換為「關閉」狀態不過,您無法重新開啟「已關閉」的工作。

關閉工作並不代表成功或失敗。它會指出 的工作將不再視為進行中。機群追蹤 重點在於指出工作的實際結果 就可以顯示相應的結果

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:

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

&lt;id&gt; 是工作的專屬 ID

要求標頭中必須包含 Authorization 欄位,且當中須有相應的值 Bearer <token>,其中 <token>Fleet Engine 權杖工廠核發的權杖

您必須在要求主體中加入 Task 實體:

  • 必填欄位:

    欄位
    State.CLOSED

  • 選填欄位:

    欄位
    taskOutcome 結果:成功或結果失敗
    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

設定工作結果和結果位置

關閉工作並不表示成功或失敗,而是表示 如此工作即會停止視為進行中。機群追蹤 請務必指出工作的實際結果 可以顯示交付結果,且該服務也應該有適當的帳單費用。 設定後即無法變更工作結果。不過,您可以修改 設定工作結果時間和工作結果位置。

處於「已關閉」狀態的工作,可將結果設為 成功或失敗Fleet Engine 只會針對狀態為 成功。

標記工作結果時,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`

&lt;id&gt; 是工作的專屬 ID

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <token>Fleet Engine 權杖工廠核發的權杖

要求主體必須包含 Task 實體:

  • 必填欄位:

    欄位
    taskOutcome 結果:成功或結果失敗

  • 選填欄位:

    欄位
    taskOutcomeLocation 工作完成的位置。如未設定,機群引擎 會預設為上次開車前往的車輛位置。
    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

重新安排配送訂單

建立運送工作後,就無法變更預定的地點。 如要重新規劃路線,請關閉運送工作且不設定 ,然後以更新後的位置建立新工作。 建立新工作後,請將工作指派給同一輛車。如要 相關資訊,請參閱「關閉運送工作」。 指派工作

使用餵食器和運輸車輛

如果以送貨機運送貨物至貨運車輛 將貨物轉移情況視為排定的停止工作建立模型 。為確保位置追蹤正確無誤,請僅指派 出貨商品載入後的運送工作 交車。詳情請參閱預定停靠站一文。

儲存運送狀態和其他中繼資訊

運送工作完成後,系統會記錄工作狀態和結果 在工作中不過,我們也建議您更新其他中繼資訊 訂單專屬的屬性如要儲存其他中繼資料 請在 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>`

&lt;id&gt; 是工作的專屬 ID

&lt;vehicleId&gt; 是要查詢的車輛 ID。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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 在伺服器環境中查詢工作。驅動程式 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>`

&lt;id&gt; 是工作的專屬 ID

&lt;taskId&gt; 是要查詢的工作 ID。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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 查詢運送資訊。駕駛座 SDK 不支援按追蹤 ID 查詢資訊。使用機群即可 您可以使用伺服器或瀏覽器環境

  • 盡可能使用最小的符記來降低安全性風險。舉例來說,如果您在 使用 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 查詢

如要從瀏覽器查詢運送工作,請發出 HTTP REST 呼叫至 GetTaskTrackingInfo:

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

&lt;tracking_id&gt; 是與工作相關聯的追蹤 ID。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <token>這個符記

如果查詢成功,回應主體會包含 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}"

列出工作

您可以在伺服器或瀏覽器環境中列出工作。驅動程式 SDK 不支援 支援清單工作

列出工作會要求廣泛的工作存取權。列出工作 信任的使用者使用推送機群讀取器或 Delivery 超級使用者驗證 提出清單工作要求時的符記。

列出的工作包含下列欄位:

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

大部分的工作屬性都可以篩選已列出的工作。對於篩選查詢語法, 請參閱 AIP-160。下列清單顯示有效的工作 幾個可供篩選的屬性:

  • 屬性
  • delivery_vehicle_id
  • planned_location
  • task_duration
  • task_outcome
  • task_outcome_location
  • task_outcome_location_source
  • task_outcome_time
  • tracking_id
  • 類型

根據 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 和工作屬性的工作。成功 回應也可以留空。如果回應空白,代表沒有工作 與提供的貨運車輛 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;
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`

如要將篩選器套用至列出的工作,請加入「篩選器」做為網址逸出篩選器查詢的網址參數。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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}"

列出送貨車

您可以透過伺服器或瀏覽器環境列出運輸車輛。駕駛座 SDK 不支援列出交付車輛。

刊登交車車輛要求廣泛使用貨運車輛, 只供信任的使用者使用使用 Delivery Fleet Reader 或 Delivery Super Delivery 提出清單傳遞車輛要求時,使用者驗證權杖。

刊登的貨車車輛因影響而遮蓋以下欄位 回應大小:

  • CurrentRouteSegment
  • RemainingVehicleJourneySegments

您可以按照 attributes 屬性篩選運送車輛清單。適用對象 舉例來說,如要查詢含有 my_key 鍵和 my_value 值的屬性,請使用 attributes.my_key = my_value。如要查詢多個屬性,請彙整查詢 使用邏輯 ANDOR 運算子,就像在 attributes.key1 = value1 AND attributes.key2 = value2 中一樣。如需完整資訊,請參閱 AIP-160 篩選器查詢語法的說明。

您可以使用 viewport 要求,依地點篩選列出的運輸車輛 參數。viewport 要求參數會使用兩個邊界來定義可視區域 座標:high (東北部) 和 low (西南) 經緯度 座標組。系統會拒絕含有高緯度的要求 地理位置低於低緯度

根據預設,配送車輛清單的頁面大小會以適當的頁面大小進行分頁。如果 如果指定頁面大小,該要求只會傳回車輛數量 可能會超過這個上限如果要求的頁面大小超過內部 最大值,接著使用內部最大值。預設頁面和最大頁面 尺寸都是 100 輛車

快遞車輛清單可包含用於讀取下一頁 也就是預測結果只有在提交更多頁面時,回應中才會出現網頁權杖 車輛可供擷取。如要擷取下一頁的工作,請使用 用來要求的網頁權杖與 請求。

gRPC

以下範例說明如何使用 Java gRPC 程式庫 加入特定屬性,列出特定區域的貨運車輛A 罩杯 成功的回應也可以留空。如果發生這種情況 具有指定屬性的車輛已位於指定的可視區域。

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`

如要將篩選器套用至列出的工作,請加入「篩選器」加上 做為網址逸出的篩選器查詢。

要求標頭必須包含 Authorization 欄位,當中須有相應的值 Bearer <token>,其中 <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 啟用機群追蹤功能:

  • 建議採用:請使用 JavaScript 機群追蹤程式庫。 這個程式庫可讓你以圖像方式呈現車輛位置和位置 追蹤到 Fleet Engine 的熱門程度其中包含 JavaScript 地圖元件 它能直接取代標準 google.maps.Map 物件 以及資料元件,以便與 Fleet Engine 連結這個元件可讓您 提供可自訂的機群追蹤方式 從您的網路或行動應用程式投放廣告

  • 在 Fleet Engine Deliveries API 上導入自己的機群追蹤功能。

關鍵在於透過追蹤 ID 查詢機群工作

記錄

您可以設定 Fleet Engine,將遠端程序呼叫 (RPC) 記錄傳送至 Cloud Logging。如要 資訊,請參閱 記錄

授權角色和權杖

如「管理車輛和工作生命週期」一文所述 以及個別用途的授權附註 向 Fleet Engine 發出的呼叫需要以 JSON Web Token 進行驗證 已使用服務帳戶憑證完成簽署使用的服務帳戶 核發權杖可能會有一或多個角色,每個角色都獲得 另一組權限

若需更多資訊,請參閲 驗證與授權

排解常見問題

如果遇到任何問題,請參考以下各節的說明。

彈性

我們不會使用 Fleet Engine 做為資料來源。您須負責 還原系統狀態,不必依賴 機群引擎

Fleet Engine 中的遺失狀態

使用 Fleet Engine 時實作用戶端,讓系統修復 發生故障舉例來說,當 Fleet Engine 嘗試將 車輛可能會回應,並顯示錯誤,指出車輛並未 個值。接著,用戶端應以新的狀態重新建立車輛。雖然 當這個問題很少發生時,請確保系統能夠處理 基礎架構

萬一 Fleet Engine 發生災難性故障, 您可能需要重新建立大部分或所有車輛和工作。如果建立速率 過高,則部分要求可能會因配額問題而再次失敗 配額檢查旨在避免阻斷服務 (DOS) 攻擊。 在這個例子中,請針對 嘗試重新嘗試

駕駛應用程式中的遺失狀態

如果驅動程式應用程式當機,應用程式必須重新建立目前狀態 驅動程式。應用程式應會嘗試重新建立工作,確保 並還原其目前的狀態應用程式也應該 重新建立並明確設定 Driver SDK 的停靠站清單。

常見問題

如果駕駛人停止任務順序,該怎麼辦?

在這種情況下,請先更新工作順序,然後照常繼續進行。 標記停靠站、工作完成和其他詳細資料。 否則系統可能會不一致、預計到達時間有誤。 因此可能會回報非預期的錯誤