Giải pháp cuối cùng của đội xe hiện chỉ dành cho một số khách hàng. Liên hệ với bộ phận bán hàng để tìm hiểu thêm.

Bắt đầu với Công cụ nhóm

API Fleet Engine Deliveryies cho phép bạn lập mô hình các hoạt động trong nhóm của mình cho những dặm đầu tiên và cuối cùng. API Giao hàng được hiển thị thông qua SDK trình điều khiển cho Android và iOS, đồng thời cũng có thể được sử dụng trực tiếp thông qua các lệnh gọi HTTP REST hoặc gRPC.

Thiết lập ban đầu

Fleet Engine Deliveryies API được định cấu hình thông qua Google Cloud Console. Để biết thông tin về các bước cần thực hiện trong bảng điều khiển và cách tạo Mã thông báo web JSON để uỷ quyền, hãy xem phần Xác thực và uỷ quyền. Để biết thông tin chi tiết về cách sử dụng bảng điều khiển, hãy xem tài liệu về Google Cloud Console.

Xác minh thông tin thiết lập của bạn

Sau khi tạo tài khoản dịch vụ, bạn nên xác minh rằng quá trình thiết lập đã hoàn tất và có thể tạo một xe giao hàng. Bằng cách xác minh ở giai đoạn này của quy trình làm việc, bạn sẽ đảm bảo rằng bạn đã giải quyết được các vấn đề thường gặp về việc uỷ quyền có thể phát sinh khi thiết lập dự án. Làm theo hướng dẫn Xác minh thiết lập của bạn. Hướng dẫn này cung cấp thông tin chi tiết về cách sử dụng tiện ích dòng lệnh gcloud để kiểm thử hai phần chính của quy trình thiết lập: ký mã thông báo uỷ quyền và tạo phương tiện phân phối thử.

Ngoài ra, bạn có thể sử dụng tập lệnh mẫu xác thực của Fleet Engine để kiểm thử chế độ thiết lập của mình.

Thư viện ứng dụng

Chúng tôi phát hành thư viện ứng dụng bằng một số ngôn ngữ lập trình phổ biến. Các thư viện này cung cấp trải nghiệm tốt hơn cho nhà phát triển so với REST hoặc gRPC thô. Để biết hướng dẫn về cách lấy thư viện ứng dụng cho ứng dụng máy chủ, hãy xem Thư viện ứng dụng.

Các ví dụ về Java trong tài liệu này giả định rằng bạn đã quen thuộc với gRPC.

Cấu trúc dữ liệu

API Giao hàng sử dụng hai cấu trúc dữ liệu để lập mô hình việc lấy hàng và giao hàng:

  • Phương tiện giao hàng được dùng để vận chuyển lô hàng.
  • Các công việc giao hàng và nhận hàng.

Ngoài ra, bạn có thể sử dụng tác vụ để lập mô hình các điểm ngắt của người lái xe và dừng theo lịch trình trong suốt cả ngày.

Phương tiện giao hàng

Phương tiện giao hàng vận chuyển các lô hàng từ kho đến địa điểm giao hàng và từ địa điểm nhận hàng đến kho. Trong một số trường hợp, họ cũng có thể vận chuyển một lô hàng trực tiếp từ địa điểm nhận hàng đến địa điểm giao hàng.

Bạn có thể sử dụng SDK trình điều khiển để tạo đối tượng DeliveryVehicle trong Fleet Engine và gửi thông tin cập nhật vị trí để theo dõi quá trình vận chuyển và đội xe.

Tasks

Mỗi xe có một nhiệm vụ được giao. Hoạt động này có thể bao gồm các nhiệm vụ đến lấy hàng hoặc giao hàng, các lần nghỉ cần thiết cho tài xế hoặc các điểm dừng theo lịch trình tại các điểm giao hàng hoặc vị trí khách hàng. Mỗi nhiệm vụ phải có một mã nhiệm vụ duy nhất, nhưng có thể có cùng một mã theo dõi. Các nhiệm vụ và trình tự lên lịch sử dụng các nhiệm vụ đó để tính toán thời lượng ETA cho từng nhiệm vụ.

Sử dụng Trình quản lý tác vụ SDK trình điều khiển để tạo tác vụ trong Fleet Engine.

Nhiệm vụ vận chuyển

Các công việc vận chuyển liên quan đến việc đến lấy hàng hoặc trả hàng. Bạn phải chỉ định ID hoặc số theo dõi khi tạo nhiệm vụ vận chuyển. Bạn cũng phải chỉ định thời gian dừng để tính thêm thời gian hoàn thành nhiệm vụ, tìm nơi đỗ xe hoặc đi bộ đến vị trí bàn giao.

  • Tạo một nhiệm vụ đến lấy hàng để đến lấy hàng, chỉ định vị trí đến lấy hàng và số hoặc mã theo dõi.
  • Tạo một tác vụ phân phối để phân phối một lô hàng, chỉ định vị trí phân phối và số theo dõi hoặc mã nhận dạng.

Tác vụ không khả dụng

Tạo một nhiệm vụ không hoạt động trong một khoảng thời gian khi không có thể lấy xe hoặc giao hàng. Đây có thể là thời gian nghỉ để tiếp nhiên liệu cho xe hoặc nghỉ ngơi cho người lái xe.

Chỉ định thời lượng ngắt khi bạn tạo tác vụ. Bạn không cần phải nghỉ quảng cáo ở một vị trí cụ thể, nhưng chỉ định một vị trí để cung cấp thời lượng ETA chính xác hơn trong suốt cả ngày.

Tác vụ dừng được lên lịch

Tạo nhiệm vụ tại điểm dừng đã lên lịch để lập mô hình điểm dừng do một xe giao hàng thực hiện. Ví dụ: bạn có thể tạo một nhiệm vụ dừng theo lịch biểu cho một điểm đến lấy hàng đã lên lịch hằng ngày tại một vị trí cụ thể, độc lập với các điểm giao hàng hoặc đến lấy hàng khác tại cùng một vị trí. Bạn cũng có thể tạo nhiệm vụ dừng theo lịch biểu cho các bộ sưu tập từ hộp chứa dữ liệu, hoặc để chuyển mô hình xe trung chuyển hoặc điểm dừng tại trung tâm dịch vụ và điểm dịch vụ.

Bạn có thể xem các trường cụ thể có trong mỗi cấu trúc dữ liệu bằng cách xem tài liệu Tham khảo API cho DeliveryVehicle (gRPC, REST) và Task (gRPC, REST).

Nguyên tắc về mã tác vụ

Mã tác vụ phải là mã duy nhất và không được tiết lộ bất kỳ thông tin nhận dạng cá nhân (PII) hoặc dữ liệu văn bản rõ ràng nào.

ID tác vụ phải tuân theo các yêu cầu định dạng sau:

  • Mã nhận dạng phải là chuỗi Unicode hợp lệ.
  • Mã nhận dạng không được dài quá 64 ký tự.
  • Các mã sẽ được chuẩn hóa theo Biểu mẫu chuẩn hóa Unicode C.
  • Mã nhận dạng không được chứa bất kỳ ký tự ASCII nào sau đây: "/", ":", "\", "?", hoặc "#".

Dưới đây là một số ví dụ về ID tác vụ hợp lệ:

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

Bảng sau đây cho thấy các ví dụ về mã tác vụ không hợp lệ:

ID tác vụ không hợp lệ Lý do
31/8/2019 đến 20:48-46.70746,-130.10807,-85.17909,61.33680 Vi phạm các yêu cầu về PII và ký tự: dấu phẩy, dấu chấm câu, dấu hai chấm và dấu gạch chéo.
JohnDoe-577b484da26f-Cupertino-SantaCruz Vi phạm các yêu cầu của PII.
4R0oXLToF”112 Summer Dr. East Hartford, CT06118”577b484da26f8a Vi phạm yêu cầu về PII và ký tự: khoảng trắng, dấu phẩy và dấu ngoặc kép. Dài hơn 64 ký tự.

Tuổi thọ của xe

Đối tượng DeliveryVehicle biểu thị phương tiện giao hàng dặm đầu tiên hoặc cuối cùng. Bạn tạo một đối tượng DeliveryVehicle bằng:

  • Mã dự án của dự án Google Cloud chứa tài khoản dịch vụ dùng để gọi các API Fleet Engine.
  • ID xe do khách hàng sở hữu.

Mã xe phải là duy nhất cho mỗi xe. Bạn không nên sử dụng lại chúng cho một phương tiện khác trừ khi không có tác vụ nào đang hoạt động cho xe đó.

Hãy nhớ kiểm tra lỗi NOT_FOUND khi bạn gọi đến UpdateDeliveryVehicle và sau đó, nếu cần, hãy gọi CreateDeliveryVehicle để tạo phương tiện mới. Một đối tượng DeliveryVehicle chưa được cập nhật bằng UpdateDeliveryVehicle sẽ tự động bị xoá sau 7 ngày. Lưu ý rằng việc gọi CreateDeliveryVehicle bằng cặp Mã dự án/Mã nhận dạng xe đã tồn tại sẽ gây ra lỗi.

Thuộc tính xe

Thực thể DeliveryVehicle chứa một trường lặp lại của DeliveryVehicleAttribute. API ListDeliveryVehicles bao gồm một trường filter có thể giới hạn các thực thể DeliveryVehicle được trả về cho những thực thể có thuộc tính được chỉ định. DeliveryVehicleAttribute không ảnh hưởng đến hành vi định tuyến của Fleet Engine.

Không đưa thông tin nhận dạng cá nhân hoặc thông tin nhạy cảm vào các thuộc tính vì trường này có thể hiển thị cho người dùng.

Vòng đời của một việc cần làm

Bạn có thể tạo, cập nhật và thẩm vấn các tác vụ trong Fleet Engine bằng cách sử dụng giao diện gRPC hoặc REST của API Giao hàng.

Đối tượng Task có một trường trạng thái để theo dõi tiến trình thông qua vòng đời của đối tượng đó. Các giá trị chuyển từ OPEN sang CLOSED. Các tác vụ mới được tạo ở trạng thái OPEN (MỞ), cho biết:

  • Việc cần làm chưa được giao cho xe giao hàng.
  • Xe giao hàng vẫn chưa vượt qua điểm dừng xe được giao của nhiệm vụ.

Một tác vụ chỉ có thể được giao cho một xe khi nó ở trạng thái MỞ.

Bạn có thể hủy việc cần làm bằng cách xóa việc cần làm đó khỏi danh sách trạm dừng xe. Sau đó, trạng thái của thẻ được tự động đặt thành ĐÃ ĐÓNG CỬA.

Khi xe của nhiệm vụ hoàn thành điểm dừng xe của nhiệm vụ, hãy cập nhật trường kết quả của nhiệm vụ thành SUCCEEDED hoặc FAILED và chỉ định dấu thời gian của sự kiện. Bạn có thể đặt kết quả nhiệm vụ bất cứ lúc nào trước hoặc sau khi hoàn thành nhiệm vụ, nhưng chỉ có thể đặt một lần.

Sau đó, thư viện Theo dõi lô hàng JavaScript có thể cho biết kết quả của tác vụ. Trạng thái tác vụ tự động được đặt thành ĐÓNG CỬA. Để biết thêm thông tin, hãy xem bài viết Theo dõi lô hàng với Thư viện theo dõi quá trình vận chuyển JavaScript.

Tương tự như với xe, những công việc chưa được cập nhật sau 7 ngày sẽ bị xoá và việc cố gắng tạo một tác vụ có mã nhận dạng đã tồn tại sẽ trả về lỗi.

Lưu ý: Fleet Engine không hỗ trợ việc xóa việc cần làm một cách rõ ràng. Dịch vụ này sẽ tự động xoá các tác vụ sau 7 ngày mà không cần cập nhật. Nếu muốn giữ lại dữ liệu việc cần làm lâu hơn 7 ngày, bạn phải tự triển khai chức năng đó.

Thuộc tính của tác vụ

Thực thể Task chứa một trường lặp lại có khả năng có giá trị thuộc một trong 3 loại: TaskAttribute, chuỗi và bool. API ListTasks bao gồm một trường filter có thể giới hạn các thực thể Task được trả về thành những thực thể có thuộc tính được chỉ định. TaskAttribute không ảnh hưởng đến hành vi định tuyến của Fleet Engine.

Không đưa thông tin nhận dạng cá nhân hoặc thông tin nhạy cảm vào các thuộc tính vì trường này có thể hiển thị cho người dùng.

Quản lý vòng đời xe và nhiệm vụ

Để quản lý vòng đời của xe và nhiệm vụ trong hệ thống, bạn sẽ sử dụng Fleet Engine Deliveryies để tạo, cập nhật và theo dõi các phương tiện cũng như nhiệm vụ liên quan. Hệ thống nội bộ của bạn đóng vai trò là nguồn dữ liệu đáng tin cậy mà API Fleet Engine Deliveryies bổ sung thay mặt bạn.

Đồng thời, ứng dụng lái xe giao tiếp trực tiếp với Fleet Engine để cập nhật thông tin tuyến đường và vị trí của thiết bị. Mô hình này cho phép Fleet Engine quản lý vị trí theo thời gian thực một cách hiệu quả và trực tiếp gửi thông tin đó đến thư viện theo dõi, sau đó bạn có thể sử dụng thư viện này cho những người tiêu dùng cần cập nhật trạng thái cho đơn đặt hàng.

Ví dụ: giả sử bạn có trường hợp sau:

  • Một tài xế đến gần điểm dừng giao hàng và Fleet Engine sẽ gửi vị trí thiết bị đến thư viện theo dõi mà ứng dụng tiêu dùng của bạn sử dụng để thông báo cho người tiêu dùng về sự gần gũi của gói hàng.
  • Sau khi hoàn tất lô hàng, người lái sẽ nhấp vào nút "Lô hàng đã giao" trên ứng dụng vận chuyển.
  • Thao tác này sẽ gửi thông tin đến hệ thống phụ trợ của bạn, hệ thống này thực hiện các bước xác thực và xác minh doanh nghiệp cần thiết.
  • Hệ thống của bạn xác nhận nhiệm vụ là SUCCEEDED và cập nhật Fleet Engine bằng API Deliveryies.

Sơ đồ dưới đây minh hoạ các quy trình này ở cấp độ chung. Báo cáo này cũng cho thấy mối quan hệ tiêu chuẩn giữa hệ thống của bạn, máy khách và Fleet Engine.

Sử dụng sơ đồ API Giao hàng

Quản lý mã thông báo khách hàng

Mọi thông tin cập nhật vị trí bắt nguồn từ ứng dụng của trình điều khiển và được gửi trực tiếp đến Fleet Engine đều phải có mã thông báo uỷ quyền. Phương pháp đề xuất để xử lý thông tin cập nhật từ ứng dụng cho Fleet Engine là cung cấp cho ứng dụng trình điều khiển mã thông báo trong phạm vi giới hạn để ứng dụng chỉ có thể cập nhật vị trí thiết bị trong Fleet Engine. Đối với loại mã thông báo này, bạn sử dụng vai trò tài khoản dịch vụ có tên là Người dùng tài xế điều khiển không tin cậy cho Fleet Engine Delivery. Điều này đảm bảo rằng các lệnh gọi bắt nguồn từ thiết bị di động (được coi là môi trường có mức độ tin cậy thấp) tuân thủ nguyên tắc có ít đặc quyền nhất.

Các vai trò khác trong tài khoản dịch vụ

Thay vào đó, nếu muốn ủy quyền cho các ứng dụng trình điều khiển thực hiện cập nhật trực tiếp Fleet Engine ngoài những nội dung bị hạn chế trong vai trò Người lái xe không đáng tin cậy, chẳng hạn như đối với một số bản cập nhật tác vụ nhất định, bạn có thể sử dụng vai trò Người lái xe đáng tin cậy. Để biết thông tin về một mô hình sử dụng vai trò Người lái xe đáng tin cậy, hãy xem phần Mô hình người lái xe đáng tin cậy.

Để biết thêm thông tin về cách sử dụng vai trò người lái xe không đáng tin cậy và đáng tin cậy, hãy xem bài viết Thiết lập dự án trên đám mây.

Lập mô hình một ngày làm việc

Bảng sau đây mô tả một ngày làm việc cho những người lái xe trong chặng bay đầu tiên hoặc cuối cùng trông như thế nào tại một công ty giao hàng và hậu cần. Công ty của bạn có thể chi tiết khác nhưng bạn có thể xem cách bạn có thể lập mô hình một ngày làm việc.

Thời gianHoạt độngLập mô hình
Trong vòng 24 giờ đầu ngày Điều phối viên chỉ định lô hàng cho các phương tiện giao thông hoặc tuyến đường. Bạn có thể tạo trước các công việc như giao hàng, nhận hàng, nghỉ và nhiều việc khác trong Fleet Engine. Ví dụ: bạn có thể tạo một tác vụ nhận hàng, tác vụ phân phối vận chuyển, dự kiến không có hàng hoặc lịch trình ngừng hoạt động.

Bạn phải giao nhiệm vụ cho một xe sau khi có một bộ gói phân phối và trình tự hoàn thành của những nhiệm vụ đó.
Đầu ngày Tài xế bắt đầu ngày mới tại kho hàng bằng cách đăng nhập vào ứng dụng Tài xế. Khởi chạy API trình điều khiển phân phối. Tạo xe giao hàng trong Fleet Engine nếu cần.
Tài xế tải lô hàng lên xe giao hàng, quét lô hàng. Nếu bạn không tạo trước các thao tác phân phối cho lô hàng, hãy tạo các tác vụ phân phối cho lô hàng tại thời điểm quét.
Người lái xe xác nhận thứ tự nhiệm vụ cần thực hiện. Nếu bạn không tạo các thông tin này trước thời hạn, hãy tạo các công việc vận chuyển, lên lịch cho trạng thái không có hànglịch trình ngừng hoạt động.
Người lái xe rời khỏi kho và cam kết hoàn thành số lượng công việc tiếp theo. Giao mọi nhiệm vụ hoặc một số nhiệm vụ cho xe bằng cách gửi yêu cầu hoàn thành nhiệm vụ.
Tài xế giao hàng. Sau khi đến trạm giao hàng, hãy thực hiện các hành động liên quan đến xe đang đến. Sau khi giao hàng, hãy đóng nhiệm vụ vận chuyển và bạn có thể trạng thái vận chuyển tại cửa hàng thực tế và các thông tin khác (không bắt buộc). Sau khi hoàn thành tất cả các nhiệm vụ tại điểm dừng và trước khi bắt đầu lái xe đến điểm dừng tiếp theo, hãy thực hiện các hành động liên quan đến xe cộ hoàn thành điểm dừngphương tiện trên đường đến điểm dừng tiếp theo.
Tài xế gặp xe cấp liệu để chuyển các lô hàng bổ sung lên xe giao hàng. Điểm gặp mặt để chuyển đổi giữa phương tiện giao hàng và xe giao hàng sẽ được mô hình hoá thành điểm dừng theo lịch.

Sau khi chuyển và quét các lô hàng, hãy tạo nhiệm vụ phân phối nếu chúng chưa được tạo. Sau đó, hãy cập nhật thứ tự hoàn thành việc cần làm bằng cách giao việc cần làm cho một chiếc xecập nhật thứ tự của việc cần làm.
Tài xế nhận được thông báo về yêu cầu đến lấy hàng. Sau khi chấp nhận yêu cầu đến lấy hàng, hãy tạo một nhiệm vụ đến lấy hàng trong lô hàng. Sau đó, hãy cập nhật thứ tự thực hiện nhiệm vụ bằng cách giao nhiệm vụ cho một xecập nhật thứ tự việc cần làm.
Buổi trưa Tài xế nghỉ trưa. Nếu một vị trí liên kết với nhiệm vụ không hoạt động, hãy xem vị trí đó như mọi nhiệm vụ khác. Thực hiện các hành động liên quan đến xe cộ đến điểm dừng, xe cộ hoàn thành điểm dừngphương tiện trên đường đến điểm dừng tiếp theo.

Nếu không, bạn không cần làm gì thêm cho đến khi kết thúc thời gian giải lao. Xóa việc cần làm bằng cách xác nhận các việc cần làm tiếp theo và còn lại, đồng thời cập nhật thứ tự việc cần làm.
Tài xế đến lấy hàng. Mô hình này được mô hình hóa giống như điểm dừng phân phối. Thực hiện các thao tác liên quan đến một phương tiện đang dừngđóng một nhiệm vụ cũng như lưu trữ trạng thái vận chuyển và thông tin meta khác (không bắt buộc). Sau khi hoàn thành tất cả các nhiệm vụ tại điểm dừng và trước khi bắt đầu lái xe đến trạm dừng tiếp theo, hãy thực hiện các hành động liên quan đến xe cộ hoàn thành điểm dừngphương tiện trên đường đến trạm dừng tiếp theo. Lưu ý: Để đảm bảo thông tin thanh toán chính xác, tất cả đơn đặt hàng tự đến lấy phải có một nhiệm vụ vận chuyển tương ứng. Nếu ngày đến lấy hàng sẽ được giao đến một địa điểm khác trên cùng một tuyến đường với người lái xe vào ngày hôm đó, bạn nên lập mô hình nhiệm vụ đó thành một nhiệm vụ giao hàng khác trên tuyến đường. Nếu tài xế đưa xe đến lấy hàng về, bạn nên tạo một nhiệm vụ vận chuyển tại điểm đến của kho hàng.
Người lái xe lên lịch hẹn để nhận lô hàng từ hộp vận chuyển. Mô hình này giống như bất kỳ điểm dừng đón nào khác. Thực hiện các hành động liên quan đến một phương tiện đang dừng tại điểm dừngđóng một nhiệm vụ. Sau khi hoàn thành tất cả các nhiệm vụ tại điểm dừng và bắt đầu lái xe đến điểm dừng tiếp theo, hãy thực hiện các hành động liên quan đến xe cộ hoàn thành điểm dừngphương tiện trên đường đến trạm dừng tiếp theo.
Tài xế nhận được thông báo về lô hàng đang được chuyển đến một vị trí thay thế. Đặt trạng thái nhiệm vụ giao hàng ban đầu thành COMPLETED và tạo một nhiệm vụ vận chuyển mới cho vị trí giao hàng mới. Để biết thêm thông tin, hãy xem bài viết Định tuyến lại lô hàng.
Tài xế đã cố gắng giao gói hàng nhưng không thể. Mô hình này được mô hình hoá tương tự như một điểm dừng phân phối thành công, đánh dấu nhiệm vụ phân phối là đã hoàn thành. Thực hiện các hành động liên quan đến một phương tiện dừng tại điểm đến. Sau khi không thể giao hàng, hãy đóng nhiệm vụtùy chọn đóng trạng thái vận chuyển tại cửa hàng và các thông tin khác (không bắt buộc). Sau khi hoàn thành tất cả các nhiệm vụ tại điểm dừng và trước khi bắt đầu lái xe đến trạm dừng tiếp theo, hãy thực hiện các hành động liên quan đến xe cộ hoàn thành điểm dừngphương tiện trên đường đến trạm dừng tiếp theo.
Tài xế đã được thông báo về việc giữ lại (không giao) một lô hàng. Sau khi nhận được thông báo và xác nhận, hãy đặt trạng thái công việc thành COMPLETED.
Người lái xe đã được thông báo giao một lô hàng nhất định vào lần tới, thay đổi thứ tự giao hàng đã cam kết. Cập nhật thứ tự việc cần làm.
Tài xế chọn vận chuyển một lô hàng không đúng thứ tự. Cập nhật thứ tự tác vụ rồi tiến hành như bình thường.
Tài xế giao nhiều lô hàng đến một địa điểm. Mô hình này được lập mô hình tương tự như một điểm dừng giao hàng duy nhất. Sau khi đến điểm dừng, hãy thực hiện các hành động liên quan đến phương tiện đến điểm dừng. Sau khi giao từng lô hàng, hãy đóng từng công việctùy chọn cài đặt trạng thái lô hàng tại cửa hàng và các thông tin khác (không bắt buộc). Sau khi hoàn thành tất cả các nhiệm vụ tại điểm dừng và trước khi bắt đầu lái xe đến trạm dừng tiếp theo, hãy thực hiện các hành động liên quan đến xe cộ hoàn thành điểm dừngphương tiện trên đường đến trạm dừng tiếp theo.
Cuối ngày Tài xế quay lại kho. Nếu tài xế quay lại kho hàng có các lô hàng đến lấy hàng trong quá trình vận chuyển, bạn cũng phải tạo và đóng từng gói hàng để làm nhiệm vụ vận chuyển nhằm đảm bảo thanh toán đúng cách. Bạn có thể thực hiện việc này bằng cách lập mô hình kho hàng như bất kỳ trạm giao hàng nào khác. Nếu depot không được sử dụng làm điểm dừng giao hàng, bạn vẫn có thể lập mô hình kho hàng theo hình thức tùy chọn. Tính năng này sẽ giúp tài xế nhìn thấy tuyến đường về nhà kho và cung cấp thông tin về thời gian đến dự kiến.

Hiểu cập nhật vị trí

Thông tin cập nhật về vị trí sẽ được gửi đến Fleet Engine sau khi phương tiện giao hàng đang trên đường từ điểm dừng (bao gồm cả tổng kho) cho đến khi xe sẽ đến điểm dừng tiếp theo. Vì các sự kiện này không được phát hiện tự động nên bạn phải đánh dấu các sự kiện đó theo phương thức lập trình. Sử dụng các thư viện phát hiện sự thay đổi trong phương thức di chuyển để kích hoạt việc gửi các thông báo bắt buộc đến Fleet Engine.

Bạn nên tạm ngừng cập nhật vị trí khi người lái xe không lái xe vì chất lượng tín hiệu vị trí sẽ giảm đáng kể khi ai đó ở trong một tòa nhà.

Bạn có thể đặt tần suất cập nhật vị trí trong SDK trình điều khiển. Theo mặc định, hệ thống sẽ gửi bản cập nhật 10 giây một lần.

Điểm dừng xe và địa điểm giao hàng

Trạm dừng xe là nơi xe giao hàng hoàn thành một công việc vận chuyển hoặc một công việc khác. Đó có thể là một điểm truy cập, chẳng hạn như một bến tàu hoặc một vị trí chỉ đường.

Địa điểm giao hàng là địa điểm giao hàng hoặc nhận hàng. Bạn có thể phải đi bộ từ điểm dừng xe để đến và đi từ vị trí giao hàng.

Ví dụ: khi tài xế đang giao hàng đến một cửa hàng trong trung tâm mua sắm, phương tiện giao hàng sẽ dừng ở bãi đỗ xe của trung tâm mua sắm gần lối vào gần nhất của cửa hàng. Đây là điểm dừng của phương tiện. Sau đó, người lái xe đi bộ từ trạm dừng xe đến vị trí trong trung tâm mua sắm có cửa hàng. Đây là địa điểm giao hàng.

Để người dùng có được trải nghiệm theo dõi lô hàng tốt nhất, hãy xem xét cách chỉ định các công việc vận chuyển cho các điểm dừng của phương tiện và lưu ý rằng số lượng điểm dừng của phương tiện còn lại cho các công việc vận chuyển sẽ được báo cáo cho người dùng để giúp họ xem tiến trình thực hiện lô hàng.

Ví dụ: nếu một tài xế đang giao hàng nhiều lần cho một toà nhà văn phòng, hãy cân nhắc chỉ định tất cả các nhiệm vụ giao hàng cho một điểm dừng xe. Nếu mỗi nhiệm vụ giao hàng được chỉ định cho điểm dừng xe riêng, thì trải nghiệm theo dõi lô hàng của bạn sẽ ít hữu ích hơn cho người dùng vì tính năng theo dõi chỉ có sẵn khi xe nằm trong số lượng điểm dừng của phương tiện có giới hạn trước khi đến. Việc có nhiều điểm dừng xe hoàn tất trong một thời gian ngắn sẽ không cho người dùng nhiều thời gian sử dụng để theo dõi tiến trình giao hàng của họ.

Sử dụng SDK dành cho thiết bị di động

Trước khi thực hiện bất kỳ lệnh gọi nào, hãy sử dụng SDK của trình điều khiển.

Khởi chạy API trình điều khiển phân phối

Trước khi khởi chạy API Trình điều khiển phân phối trong SDK trình điều khiển, hãy nhớ khởi chạy SDK điều hướng. Sau đó, khởi chạy API trình điều khiển phân phối như trong ví dụ sau:

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));
     }
   });

Trường hợp sử dụng

Phần này mô tả cách sử dụng API Deliveryies để lập mô hình các trường hợp sử dụng phổ biến.

Giá trị nhận dạng thực thể duy nhất

Định dạng và giá trị của giá trị nhận dạng thực thể duy nhất dùng trong các lệnh gọi REST không rõ ràng đối với Fleet Engine. Tránh sử dụng mã tự động tăng và đảm bảo rằng giá trị nhận dạng không chứa bất kỳ thông tin nhận dạng cá nhân (PII) nào, chẳng hạn như số điện thoại của người lái xe.

Tạo xe

Bạn có thể tạo một phương tiện từ SDK Drive hoặc từ môi trường máy chủ.

gRPC

Để tạo một phương tiện mới, bạn thực hiện lệnh gọi CreateDeliveryVehicle đến Fleet Engine. Sử dụng đối tượng CreateDeliveryVehicleRequest để xác định các thuộc tính của phương tiện giao hàng mới. Lưu ý rằng mọi giá trị được chỉ định cho trường Name sẽ bị bỏ qua theo hướng dẫn API đối với mã nhận dạng do người dùng chỉ định. Bạn nên sử dụng trường DeliveryVehicleId để đặt mã nhận dạng của xe.

Khi tạo DeliveryVehicle, bạn có thể tuỳ ý chỉ định hai trường:

  • Thuộc tính
  • Vị trí cuối cùng

Bạn không được đặt tất cả các trường khác. Nếu không, Fleet Engine sẽ trả về lỗi vì các trường đó ở chế độ chỉ đọc hoặc chỉ có thể cập nhật thông qua lệnh gọi UpdateDeliveryVehicle.

Để tạo xe mà không thiết lập bất kỳ trường không bắt buộc nào, bạn có thể không đặt trường DeliveryVehicle trong CreateDeliveryVehicleRequest.

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để tạo phương tiện:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tạo một phương tiện từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới CreateDeliveryVehicle:

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

<id>giá trị nhận dạng duy nhất của phương tiện giao hàng trong đội ngũ của bạn.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Phần nội dung POST thể hiện thực thể DeliveryVehicle sẽ được tạo. Bạn có thể chỉ định các trường không bắt buộc sau:

  • thuộc tính
  • vị trí cuối cùng

Ví dụ về lệnh 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 bỏ qua trường name của thực thể DeliveryVehicle theo hướng dẫn về API đối với mã nhận dạng do người dùng chỉ định. Bạn không được đặt tất cả các trường khác; nếu không, Fleet Engine sẽ trả về lỗi vì các trường đó ở chế độ chỉ đọc hoặc chỉ có thể cập nhật thông qua các lệnh gọi UpdateDeliveryVehicle.

Để tạo xe mà không đặt bất kỳ trường nào, bạn có thể để trống phần nội dung của yêu cầu POST. Chiếc xe mới tạo này sẽ có một mã xe được trích xuất từ thông số deliveryVehicleId trong URL POST.

Ví dụ về lệnh 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}"

Tạo nhiệm vụ đến lấy hàng

Bạn có thể tạo nhiệm vụ đến lấy hàng trong lô hàng từ Driver SDK hoặc từ môi trường máy chủ.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để tạo tác vụ lấy hàng theo lô hàng:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tạo một nhiệm vụ đến lấy hàng trong lô hàng từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `CreateTask':

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

<id>giá trị nhận dạng duy nhất cho tác vụ. Giá trị này không được là số theo dõi cho lô hàng. Nếu không có mã tác vụ trong hệ thống, bạn có thể tạo một giá trị nhận dạng duy nhất trên toàn cầu (UUID).

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    loại Loại
    tiểu bang Trạng thái.OPEN
    Mã theo dõi Số hoặc giá trị nhận dạng mà bạn đang dùng để theo dõi quá trình vận chuyển.
    vị trí được lập kế hoạch Địa điểm cần hoàn thành việc cần làm, trong trường hợp này là địa điểm nhận hàng.
    tác vụ Thời gian dự kiến, tính bằng giây, để nhận hàng tại vị trí nhận hàng.

  • Các trường tuỳ chọn:

    TrườngGiá trị
    Cửa sổ mục tiêu Khoảng thời gian hoàn thành việc cần làm. Việc này hiện không ảnh hưởng đến hành vi định tuyến.
    thuộc tính Danh sách các thuộc tính Tác vụ tùy chỉnh. Mỗi thuộc tính phải có một khóa duy nhất.

Tất cả các trường khác trong thực thể sẽ bị bỏ qua khi tạo. Fleet Engine gửi một trường hợp ngoại lệ nếu yêu cầu có một ID xe giao hàng được chỉ định. Bạn giao nhiệm vụ bằng cách sử dụng UpdateDeliveryVehicleRequest. Để biết thêm thông tin, hãy xem phần Giao nhiệm vụ cho một xe.

Ví dụ về lệnh 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

Tạo nhiệm vụ vận chuyển hàng

Bạn có thể tạo nhiệm vụ phân phối lô hàng từ Driver SDK hoặc từ môi trường máy chủ.

gRPC

Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để tạo một tác vụ phân phối gửi hàng:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tạo một nhiệm vụ phân phối lô hàng từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `CreateTask':

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

<id>giá trị nhận dạng duy nhất cho tác vụ. Giá trị này không được là số theo dõi cho lô hàng. Nếu không có mã tác vụ trong hệ thống, bạn có thể tạo một giá trị nhận dạng duy nhất trên toàn cầu (UUID).

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    loại Loại.GIAO HÀNG
    tiểu bang Trạng thái.OPEN
    Mã theo dõi Số hoặc giá trị nhận dạng mà bạn đang dùng để theo dõi quá trình vận chuyển.
    vị trí được lập kế hoạch Địa điểm cần hoàn thành việc cần làm, trong trường hợp này là địa điểm giao hàng cho lô hàng này.
    tác vụ Thời gian dự kiến, tính bằng giây, để giao hàng tại vị trí giao hàng.

  • Các trường tuỳ chọn:

    TrườngGiá trị
    Cửa sổ mục tiêu Khoảng thời gian hoàn thành việc cần làm. Việc này hiện không ảnh hưởng đến hành vi định tuyến.
    thuộc tính Danh sách các thuộc tính Tác vụ tùy chỉnh. Mỗi thuộc tính phải có một khóa duy nhất.

Tất cả các trường khác trong thực thể sẽ bị bỏ qua khi tạo. Fleet Engine gửi một trường hợp ngoại lệ nếu yêu cầu có một ID xe giao hàng được chỉ định. Bạn giao việc cần làm bằng UpdateDeliveryVehicleRequest. Để biết thêm thông tin, hãy xem phần Giao nhiệm vụ cho một xe.

Ví dụ về lệnh 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

Tạo hàng loạt tác vụ

Bạn có thể tạo một loạt tác vụ từ môi trường máy chủ.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để tạo hai tác vụ, một cho phân phối và một cho nhận tại cùng một vị trí:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tạo một quy trình phân phối và một nhiệm vụ đến lấy hàng từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới BatchCreateTasks:

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

Tiêu đề yêu cầu phải có một trường Authorization với giá trị Bearer <token>, trong đó <token> là một mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể BatchCreateTasksRequest:

  • Các trường bắt buộc:

    TrườngGiá trị
    yêu cầu Mảng<CreateTasksRequest>

  • Các trường tuỳ chọn:

    TrườngGiá trị
    tiêu đề `DeliveryRequestHeader`

Mỗi phần tử CreateTasksRequest trong requests phải truyền cùng một quy tắc xác thực như yêu cầu CreateTask, ngoại trừ các trường parentheader là không bắt buộc. Nếu được đặt, các trường này phải giống với trường tương ứng ở cấp cao nhất BatchCreateTasksRequest. Xem bài viết Tạo nhiệm vụ đến lấy hàng trong lô hàngtạo nhiệm vụ phân phối cho lô hàng để biết các quy tắc xác thực cụ thể cho mỗi nhiệm vụ.

Để biết thêm thông tin, hãy xem tài liệu Tham khảo API cho BatchCreateTasks (gRPC, REST).

Ví dụ về lệnh 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

Không có sẵn theo lịch

Bạn có thể tạo một nhiệm vụ cho biết không có sẵn (ví dụ: để ngắt xe hoặc tiếp nhiên liệu xe) từ SDK trình điều khiển hoặc từ môi trường máy chủ. Một tác vụ không có sẵn theo lịch biểu không được bao gồm mã theo dõi. Bạn có thể cung cấp vị trí nếu muốn.

gRPC

Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để tạo một tác vụ không có sẵn:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tạo một tác vụ không có sẵn từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới CreateTask:

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

<id>giá trị nhận dạng duy nhất cho tác vụ. Nếu không có mã tác vụ trong hệ thống, bạn có thể tạo một giá trị nhận dạng duy nhất trên toàn cầu (UUID).

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    loại Loại.UNAVAILABLE
    tiểu bang Trạng thái.OPEN
    tác vụ Thời lượng ngắt tính bằng giây.

  • Các trường tuỳ chọn:

    TrườngGiá trị
    vị trí được lập kế hoạch Vị trí của điểm chèn quảng cáo nếu phải chụp ở một vị trí cụ thể.

Tất cả các trường khác trong thực thể sẽ bị bỏ qua khi tạo. Fleet Engine gửi một trường hợp ngoại lệ nếu yêu cầu có một ID xe giao hàng được chỉ định. Bạn giao nhiệm vụ bằng cách sử dụng UpdateDeliveryVehicleRequest. Để biết thêm thông tin, hãy xem phần Giao nhiệm vụ cho một xe.

Ví dụ về lệnh 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

Các điểm dừng đã lên lịch

Bạn có thể tạo một nhiệm vụ dừng đã lên lịch từ SDK Drive hoặc từ môi trường máy chủ. Một tác vụ dừng đã lên lịch có thể không bao gồm mã theo dõi.

gRPC

Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để tạo một tác vụ dừng theo lịch biểu:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tạo một tác vụ dừng đã lên lịch từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `CreateTask':

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

<id>giá trị nhận dạng duy nhất cho tác vụ. Nếu không có mã tác vụ trong hệ thống, bạn có thể tạo một giá trị nhận dạng duy nhất trên toàn cầu (UUID).

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    loại Loại.SCHEDULED_STOP
    tiểu bang Trạng thái.OPEN
    vị trí được lập kế hoạch Vị trí của điểm dừng.
    tác vụ Thời lượng của điểm dừng dự kiến tính bằng giây.

  • Các trường tuỳ chọn:

    • Không có

Tất cả các trường khác trong thực thể sẽ bị bỏ qua khi tạo. Fleet Engine gửi một trường hợp ngoại lệ nếu yêu cầu có một ID xe giao hàng được chỉ định. Bạn giao nhiệm vụ bằng cách sử dụng UpdateDeliveryVehicleRequest. Để biết thêm thông tin, hãy xem phần Giao nhiệm vụ cho một xe.

Ví dụ về lệnh 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

Đặt khoảng thời gian mục tiêu

Cửa sổ thời gian mục tiêu là TimeWindow, trong đó nhiệm vụ sẽ được hoàn thành. Ví dụ: nếu truyền đạt một khoảng thời gian gửi cho người nhận, thì bạn có thể sử dụng khung thời gian mục tiêu của nhiệm vụ để ghi lại khoảng thời gian này và tạo thông báo hoặc phân tích hiệu suất của chuyến đi sau khi sử dụng trường này.

Cửa sổ thời gian mục tiêu bao gồm thời gian bắt đầu và thời gian kết thúc, đồng thời có thể được đặt trong bất kỳ loại tác vụ nào. Khoảng thời gian mục tiêu hiện không ảnh hưởng đến hành vi định tuyến.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để đặt thời lượng tác vụ:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để đặt thời lượng tác vụ bằng HTTP, hãy gọi UpdateTask:

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

<id>giá trị nhận dạng duy nhất cho tác vụ.

Tiêu đề yêu cầu phải có một trường Authorization với giá trị Bearer <token>, trong đó <token> là một mã thông báo do một nhà máy mã thông báo Fleet Engine khai thác.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    Cửa sổ mục tiêu Khoảng thời gian hoàn thành việc cần làm. Việc này hiện không ảnh hưởng đến hành vi định tuyến

  • Các trường tuỳ chọn:

    • Không có

Mọi trường khác trong thực thể đều bị bỏ qua trong bản cập nhật.

Ví dụ về lệnh 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

Đặt cấu hình hiển thị theo dõi tác vụ

Bạn có thể kiểm soát chế độ hiển thị của dữ liệu trong thư viện Theo dõi lô hàng và dữ liệu đó được trả về từ lệnh gọi đến GetTaskTrackingInfo trên cơ sở từng tác vụ bằng cách đặt TaskTrackingViewConfig cho tác vụ đó. Hãy xem bài viết Các công việc của xe đang hoạt động để biết thêm thông tin. Bạn có thể thực hiện việc này khi tạo hoặc cập nhật tác vụ. Sau đây là ví dụ về cách cập nhật nhiệm vụ với cấu hình này:

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để đặt cấu hình thành phần hiển thị theo dõi tác vụ:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để đặt cửa sổ cấu hình chế độ xem theo dõi tác vụ bằng HTTP, hãy gọi UpdateTask:

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

<id>giá trị nhận dạng duy nhất cho tác vụ.

Tiêu đề yêu cầu phải có một trường Authorization với giá trị Bearer <token>, trong đó <token> là một mã thông báo do một nhà máy mã thông báo Fleet Engine khai thác.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    TaskTrackingViewConfig Cấu hình theo dõi tác vụ chỉ định phần tử dữ liệu nào hiển thị cho người dùng cuối trong những trường hợp nào.

  • Các trường tuỳ chọn:

    • Không có

Mọi trường khác trong thực thể đều bị bỏ qua trong bản cập nhật.

Ví dụ về lệnh 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

Giao việc cần làm cho một phương tiện

Nhiệm vụ được giao cho một xe phân phối bằng cách cập nhật thứ tự nhiệm vụ cho xe. Thứ tự nhiệm vụ của xe sẽ được xác định theo danh sách trạm dừng của xe. Mỗi trạm dừng của xe có thể được giao một hoặc nhiều nhiệm vụ.

Việc cập nhật thứ tự nhiệm vụ cho một nhiệm vụ trước đó được giao cho một phương tiện khác sẽ gây ra lỗi.

Để thay đổi lô hàng từ một phương tiện sang một phương tiện khác, hãy đóng nhiệm vụ ban đầu rồi tạo lại trước khi giao cho phương tiện mới.

Cập nhật thứ tự tác vụ

Bạn có thể cập nhật thứ tự thực thi của các nhiệm vụ được chỉ định cho phương tiện từ SDK Drive (SDK trình điều khiển) hoặc từ môi trường máy chủ. Không nên kết hợp 2 phương thức này để tránh điều kiện tranh đấu.

Việc cập nhật thứ tự nhiệm vụ cũng sẽ gán các nhiệm vụ cho một xe nếu trước đó chưa được giao cho một xe và đóng các tác vụ trước đó đã được chỉ định cho một phương tiện và không có trong thứ tự cập nhật. Việc phân công nhiệm vụ cho một phương tiện khác nếu trước đó đã được giao cho một phương tiện khác sẽ gây ra lỗi. Trước tiên, hãy đóng nhiệm vụ hiện có rồi tạo một nhiệm vụ mới trước khi giao nhiệm vụ đó cho phương tiện mới.

Bạn có thể cập nhật thứ tự việc cần làm bất cứ lúc nào.

gRPC

Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để cập nhật thứ tự thao tác cho xe:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để cập nhật thứ tự thao tác cho một xe trong môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `UpdateDeliveryVehicle':

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

<id> là một giá trị nhận dạng duy nhất của phương tiện giao hàng trong nhóm thiết bị của bạn mà bạn dự định cập nhật thứ tự tác vụ. Đây là giá trị nhận dạng mà bạn đã chỉ định khi tạo phương tiện.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể DeliveryVehicle:

  • Các trường bắt buộc:

    TrườngGiá trị
    Còn lạiphân đoạn đường xe Danh sách các phân đoạn hành trình cho các nhiệm vụ theo thứ tự thực thi. Tác vụ đầu tiên trong danh sách được thực thi trước tiên.
    cònVehicleJourneySegment[i].stop Điểm dừng cho việc cần làm i trong danh sách.
    còn lạiVehicleJourneySegment[i].stop.planningLocation Vị trí đã lên kế hoạch cho điểm dừng.
    còn lạiVehicleJourneySegment[i].stop.tasks Danh sách các nhiệm vụ cần thực hiện tại trạm dừng xe này.
    còn lạiVehicleJourneySegment[i].stop.state Trạng thái.NEW

  • Các trường tuỳ chọn:

    • Không có

Mọi trường khác trong thực thể đều bị bỏ qua trong bản cập nhật.

Ví dụ về lệnh 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

Xe đang trên đường đến trạm dừng tiếp theo

Bạn phải thông báo cho Fleet Engine khi một phương tiện khởi hành từ điểm dừng hoặc bắt đầu điều hướng. Bạn có thể thông báo cho Fleet Engine từ SDK trình điều khiển hoặc từ môi trường máy chủ. Không nên kết hợp 2 phương thức này để tránh điều kiện tranh đấu và để duy trì một nguồn đáng tin cậy.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để thông báo cho Fleet Engine rằng một phương tiện sẽ chuyển tới điểm dừng tiếp theo.

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để thông báo cho Fleet Engine rằng một xe đang chuyển hướng tới điểm dừng tiếp theo trong môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `UpdateDeliveryVehicle':

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

<id>giá trị nhận dạng duy nhất của phương tiện giao hàng trong nhóm thiết bị của bạn mà bạn dự định cập nhật thứ tự tác vụ. Đây là giá trị nhận dạng mà bạn đã chỉ định khi tạo phương tiện.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể DeliveryVehicle:

  • Trường bắt buộc:

    TrườngGiá trị
    Còn lạiphân đoạn đường xe Danh sách trạm dừng xe còn lại, trong đó các tiểu bang được đánh dấu là Tiểu bang.NEW. Điểm dừng đầu tiên trong danh sách phải có trạng thái được đánh dấu là State.ENROUTE.

  • Các trường tuỳ chọn:

    • Không có

Tất cả các trường khác trong thực thể đều bị bỏ qua đối với thông báo này.

Ví dụ về lệnh 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

Xe dừng tại một điểm dừng

Bạn sẽ phải thông báo cho Fleet Engine khi có xe đến. Bạn có thể thông báo cho Fleet Engine từ SDK trình điều khiển hoặc từ môi trường máy chủ. Không nên kết hợp 2 phương thức này để tránh điều kiện tranh đấu và để duy trì một nguồn đáng tin cậy.

gRPC

Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để thông báo cho Fleet Engine rằng một phương tiện đã dừng lại:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để thông báo cho Fleet Engine về việc có phương tiện dừng tại môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `UpdateDeliveryVehicle':

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

<id>giá trị nhận dạng duy nhất của phương tiện giao hàng trong nhóm thiết bị của bạn mà bạn dự định cập nhật thứ tự tác vụ. Đây là giá trị nhận dạng mà bạn đã chỉ định khi tạo phương tiện.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể DeliveryVehicle:

  • Các trường bắt buộc:

    TrườngGiá trị
    Còn lạiphân đoạn đường xe Điểm dừng bạn đã đến với trạng thái được đặt là Tiểu bang.sau đó là danh sách các điểm dừng xe còn lại với trạng thái được đánh dấu là Tiểu bang.NEW.

  • Các trường tuỳ chọn:

    • Không có

Mọi trường khác trong thực thể đều bị bỏ qua trong bản cập nhật.

Ví dụ về lệnh 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

Xe hoàn thành bước dừng

Bạn sẽ phải thông báo cho Fleet Engine khi một phương tiện dừng xong. Điều này khiến tất cả các thao tác liên kết với điểm dừng đều được đặt thành trạng thái ĐÓNG. Bạn có thể thông báo cho Fleet Engine từ SDK trình điều khiển hoặc từ môi trường máy chủ. Không nên kết hợp hai phương pháp này để tránh các điều kiện tương tranh và duy trì một nguồn đáng tin cậy.

gRPC

Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để thông báo cho Fleet Engine rằng một phương tiện đã hoàn tất quá trình dừng.

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để thông báo cho Fleet Engine về việc hoàn tất quá trình dừng từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `UpdateDeliveryVehicle':

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

<id>giá trị nhận dạng duy nhất của phương tiện giao hàng trong nhóm thiết bị của bạn mà bạn dự định cập nhật thứ tự tác vụ. Đây là giá trị nhận dạng mà bạn đã chỉ định khi tạo phương tiện.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể DeliveryVehicle:

  • Các trường bắt buộc:

    TrườngGiá trị
    còn lại_vehicle_journey_segments Điểm dừng bạn đã hoàn tất không còn nằm trong danh sách điểm dừng xe còn lại.

  • Các trường tuỳ chọn:

    • Không có

Mọi trường khác trong thực thể đều bị bỏ qua trong bản cập nhật.

Ví dụ về lệnh 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

Cập nhật việc cần làm

Hầu hết các trường tác vụ đều không thể thay đổi. Tuy nhiên, bạn có thể sửa đổi trạng thái, kết quả nhiệm vụ, thời gian kết quả nhiệm vụ, vị trí kết quả nhiệm vụ và các thuộc tính bằng cách cập nhật trực tiếp thực thể nhiệm vụ. Ví dụ: trong trường hợp một nhiệm vụ chưa được giao cho xe, bạn có thể đóng nhiệm vụ đó bằng cách cập nhật trạng thái trực tiếp.

gRPC

Đây là ví dụ về cách cập nhật một nhiệm vụ thông qua gRPC.

Kiến trúc chuyển trạng thái đại diện (REST)

Đây là ví dụ về cách cập nhật một nhiệm vụ thông qua REST.

Đóng một việc cần làm

Để đóng một nhiệm vụ đã được giao cho một phương tiện, hãy thông báo cho Fleet Engine rằng phương tiện đó đã hoàn thành điểm dừng khi nhiệm vụ diễn ra hoặc xóa nó khỏi danh sách các điểm dừng của phương tiện. Để làm vậy, bạn có thể đặt danh sách các phương tiện còn lại chỉ giống như khi cập nhật thứ tự trong nhiệm vụ của một phương tiện.

Nếu một nhiệm vụ chưa được chỉ định cho xe và cần phải đóng, hãy cập nhật nhiệm vụ đó sang trạng thái ĐÓNG. Tuy nhiên, bạn không thể mở lại công việc ĐÃ ĐÓNG CỬA ĐÓNG.

Kết thúc một tác vụ không cho biết thành công hay không thành công. Trạng thái này cho biết tác vụ không còn được xem xét nữa. Để theo dõi quá trình vận chuyển, bạn cần cho biết kết quả thực tế của một nhiệm vụ để kết quả phân phối có thể xuất hiện.

gRPC

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

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

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

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để đánh dấu một tác vụ là đã đóng từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới UpdateTask:

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

<id>giá trị nhận dạng duy nhất cho tác vụ.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    tiểu bang Tiểu bang.CLOSED

  • Các trường tuỳ chọn:

    TrườngGiá trị
    Kết quả tác vụ Kết quả.SUCCEEDED hoặc Results.FAILED
    nhiệm vụ Thời gian khi việc cần làm được hoàn thành.
    nhiệm vụVị trí kết quả Vị trí đã hoàn thành việc cần làm. Fleet Engine sẽ mặc định đặt giá trị này thành vị trí xe cuối cùng trừ khi nhà cung cấp dịch vụ tự ghi đè.

Mọi trường khác trong thực thể đều bị bỏ qua trong bản cập nhật.

Ví dụ về lệnh 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

Đặt kết quả việc cần làm và vị trí kết quả

Việc đóng một tác vụ không cho biết là thành công hay thất bại, mà cho biết rằng tác vụ đó không còn được xem xét nữa. Để theo dõi quá trình vận chuyển, bạn cần cho biết kết quả thực tế của một nhiệm vụ để kết quả phân phối có thể hiển thị và có thông tin thanh toán phù hợp cho các dịch vụ. Sau khi đặt, bạn không thể thay đổi kết quả tác vụ. Bạn có thể sửa đổi thời gian và kết quả của nhiệm vụ sau khi đã đặt.

Kết quả của nhiệm vụ ở trạng thái ĐÓNG có thể là SUCCEEDED hoặc FAILED. Fleet Engine chỉ tính phí các thao tác phân phối có trạng thái SUCCEEDED.

Khi đánh dấu kết quả của một việc cần làm, Fleet Engine sẽ tự động điền thông tin vị trí đã xác định gần đây nhất của phương tiện vào vị trí kết quả của việc cần làm. Bạn có thể ghi đè hành vi này.

gRPC

Bạn có thể đặt vị trí kết quả của việc cần làm khi đặt kết quả. Thao tác này sẽ ngăn Fleet Engine đặt chế độ mặc định về vị trí của xe gần đây nhất. Bạn cũng có thể ghi đè vị trí kết quả của nhiệm vụ Fleet Engine sau này. Fleet Engine sẽ không bao giờ ghi đè vị trí kết quả tác vụ mà bạn cung cấp. Bạn không thể đặt vị trí kết quả cho nhiệm vụ chưa đặt kết quả cho nhiệm vụ. Bạn có thể đặt cả kết quả nhiệm vụ và vị trí kết quả nhiệm vụ trong cùng một yêu cầu.

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để đặt kết quả tác vụ thành SUCCEEDED và đặt vị trí hoàn thành nhiệm vụ:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để đánh dấu một tác vụ là đã hoàn thành từ môi trường máy chủ, hãy gọi HTTP REST đến UpdateTask:

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

<id>giá trị nhận dạng duy nhất cho tác vụ.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải chứa một thực thể Task:

  • Các trường bắt buộc:

    TrườngGiá trị
    Kết quả tác vụ Kết quả.SUCCEEDED hoặc Results.FAILED
    nhiệm vụ Dấu thời gian về thời điểm đặt kết quả của việc cần làm (từ nhà cung cấp). Đây là khoảng thời gian khi việc cần làm đã hoàn thành.

  • Các trường tuỳ chọn:

    TrườngGiá trị
    nhiệm vụVị trí kết quả Vị trí đã hoàn thành việc cần làm. Fleet Engine sẽ mặc định đặt giá trị này thành vị trí xe cuối cùng trừ khi nhà cung cấp dịch vụ tự ghi đè.

Mọi trường khác trong thực thể đều bị bỏ qua trong bản cập nhật.

Ví dụ về lệnh 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

Định tuyến lại lô hàng

Sau khi tạo một nhiệm vụ vận chuyển, bạn không thể thay đổi vị trí theo kế hoạch của nhiệm vụ đó. Để định tuyến lại lô hàng, hãy đóng nhiệm vụ vận chuyển mà không đặt kết quả, sau đó tạo một nhiệm vụ mới với vị trí đã lên kế hoạch cập nhật. Sau khi tạo nhiệm vụ mới, hãy giao nhiệm vụ đó cho cùng một xe. Để biết thêm thông tin, hãy xem nội dung đóng nhiệm vụ vận chuyểngiao nhiệm vụ.

Sử dụng xe cấp liệu và xe giao hàng

Nếu bạn sử dụng xe trung chuyển để vận chuyển lô hàng đến xe vận chuyển trong suốt cả ngày, hãy lập mô hình chuyển lô hàng dưới dạng một nhiệm vụ dừng theo lịch trình cho xe giao hàng. Để đảm bảo theo dõi vị trí chính xác, bạn chỉ nên chỉ định một nhiệm vụ vận chuyển lô hàng sau khi lô hàng được chuyển lên xe giao hàng. Để biết thêm thông tin, hãy xem điểm dừng theo lịch.

Lưu trữ trạng thái vận chuyển và các thông tin meta khác

Khi một nhiệm vụ vận chuyển hoàn thành, trạng thái và kết quả của nhiệm vụ đó sẽ được ghi lại trong nhiệm vụ đó. Tuy nhiên, bạn nên cập nhật thông tin meta khác dành riêng cho lô hàng. Để lưu trữ thông tin meta khác mà bạn có thể tham chiếu bên ngoài dịch vụ Fleet Engine, hãy sử dụng mã theo dõi liên kết với tác vụ dưới dạng khoá trong bảng bên ngoài.

Để biết thêm thông tin, hãy xem phần Vòng đời của một việc cần làm.

Tra cứu phương tiện

Bạn có thể tra cứu xe từ Driver SDK hoặc từ môi trường máy chủ.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để tìm xe:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tra cứu một phương tiện từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `GetVehicle':

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

<id>giá trị nhận dạng duy nhất cho tác vụ.

<vehicleId> là mã nhận dạng của xe để tra cứu.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải trống.

Nếu tra cứu thành công, nội dung phản hồi sẽ chứa thực thể xe.

Ví dụ về lệnh 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}"

Tra cứu việc cần làm

Bạn có thể tra cứu một tác vụ từ môi trường máy chủ. SDK Driver không hỗ trợ tìm kiếm một tác vụ.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để tra cứu một tác vụ:

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để tìm một tác vụ từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST tới `GetTask':

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

<id>giá trị nhận dạng duy nhất cho tác vụ.

<taskId> là ID của việc cần làm cần tra cứu.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nội dung yêu cầu phải trống.

Nếu tra cứu thành công, nội dung phản hồi sẽ chứa thực thể tác vụ.

Ví dụ về lệnh 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}"

Tra cứu thông tin về nhiệm vụ vận chuyển theo mã theo dõi

Bạn có thể tra cứu thông tin của nhiệm vụ vận chuyển theo các cách sau, mỗi cách có một mục đích riêng:

  • bởi một mã tác vụ: được sử dụng bởi những người dùng như người vận hành nhóm có quyền truy cập vào chế độ xem toàn bộ dữ liệu tác vụ.
  • bằng mã theo dõi: được phần mềm ứng dụng của bạn sử dụng để cung cấp thông tin hạn chế cho người dùng cuối, chẳng hạn như khi nhà cung cấp chuyển gói hàng đến nhà của họ.

Phần này thảo luận về cách tìm thông tin về tác vụ theo ID theo dõi. Nếu bạn muốn tra cứu một việc cần làm theo mã việc cần làm, hãy chuyển đến phần tìm một việc cần làm.

Để tìm kiếm thông tin theo ID theo dõi, bạn có thể sử dụng một trong hai cách sau:

Yêu cầu đối với tra cứu

  • Thông tin vận chuyển do mã theo dõi cung cấp tuân thủ các quy tắc hiển thị nêu trong phần Kiểm soát chế độ hiển thị của các vị trí được theo dõi.

  • Sử dụng Fleet Engine để tra cứu thông tin lô hàng bằng mã theo dõi. SDK Trình điều khiển không hỗ trợ tra cứu thông tin bằng mã theo dõi. Để thực hiện việc này với Fleet Engine, bạn sẽ sử dụng môi trường máy chủ hoặc trình duyệt.

  • Sử dụng mã thông báo hẹp nhất có thể để hạn chế rủi ro bảo mật. Ví dụ: nếu bạn sử dụng Mã thông báo giao hàng dành cho người tiêu dùng, thì mọi lệnh gọi API Fleet Engine Deliveryies đều chỉ trả về thông tin liên quan đến người dùng cuối đó, chẳng hạn như người gửi hàng hoặc người nhận lô hàng. Tất cả các thông tin khác trong các câu trả lời sẽ được loại bỏ. Để biết thêm thông tin về mã thông báo, hãy xem phần Tạo mã thông báo web JSON (JWT) để ủy quyền.

Tra cứu với Java bằng gRPC

Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để tra cứu thông tin về một nhiệm vụ vận chuyển theo mã theo dõi.

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

Tra cứu bằng HTTP

Để tìm một tác vụ vận chuyển từ trình duyệt, hãy thực hiện lệnh gọi HTTP REST tới GetTaskTrackingInfo:

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

<tracking_id> là ID theo dõi được liên kết với tác vụ.

Tiêu đề yêu cầu phải có một trường Authorization với giá trị Bearer <token>, trong đó <token> là một mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nếu quá trình tra cứu thành công, nội dung phản hồi sẽ chứa thực thể taskTrackingInfo.

Ví dụ về lệnh 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}"

Liệt kê công việc

Bạn có thể liệt kê các tác vụ từ môi trường máy chủ hoặc trình duyệt. SDK của trình điều khiển không hỗ trợ việc liệt kê.

Việc cần làm trong danh sách yêu cầu quyền truy cập rộng vào các việc cần làm. Tác vụ liệt kê chỉ dành cho những người dùng đáng tin cậy. Sử dụng Trình đọc nhóm phân phối hoặc Mã thông báo xác thực siêu người dùng khi gửi yêu cầu tác vụ danh sách.

Các thao tác được liệt kê có các trường sau được biên tập lại:

  • Vị trí xe.Điểm dừng xe đã lên kế hoạch
  • Trạng thái xe dừng
  • Xe dừng.TaskInfo.taskId

Bạn có thể lọc hầu hết các việc cần làm được liệt kê theo thuộc tính việc cần làm. Đối với cú pháp truy vấn bộ lọc, hãy xem AIP-160. Danh sách sau đây cho thấy các thuộc tính tác vụ hợp lệ mà bạn có thể sử dụng để lọc:

  • thuộc tính
  • mã_số_giao_hàng
  • tiểu bang
  • vị trí_kế hoạch
  • task_duration
  • việc cần làm_đến
  • sắp_xếp_tác_dụng_đến
  • task_outcome_location_source
  • task_outcome_time
  • mã_theo dõi
  • loại

Sử dụng các định dạng trường sau đây dựa trên Đề xuất Cải thiện API của Google:

Loại trường Định dạng Ví dụ:
Dấu thời gian RFC-3339 task_outcome_time = 2022-03-01T11:30:00-08:00
Thời lượng Số giây theo sau là 's' task_duration = 120s
Liệt kê Chuỗi state = CLOSED AND type = PICKUP
Vị trí point.latitudepoint.longitude planned_location.point.latitude > 36.1 AND planned_location.point.longitude < -122.0

Xem AIP-160 để biết danh sách đầy đủ các toán tử truy vấn bộ lọc.

Nếu không có truy vấn bộ lọc nào được chỉ định, tất cả tác vụ sẽ được liệt kê.

Danh sách việc cần làm được phân trang. Bạn có thể chỉ định kích thước trang trong yêu cầu tác vụ danh sách. Nếu kích thước trang được chỉ định, số lượng tác vụ được trả về không lớn hơn kích thước trang đã chỉ định. Nếu không có kích thước trang, thì hệ thống sẽ sử dụng kích thước mặc định hợp lý. Nếu kích thước trang được yêu cầu vượt quá giá trị tối đa nội bộ, thì mức tối đa nội bộ sẽ được sử dụng.

Danh sách công việc có thể bao gồm mã thông báo để đọc trang kết quả tiếp theo. Sử dụng mã thông báo trang với một yêu cầu giống hệt với yêu cầu trước đó để truy xuất trang tác vụ tiếp theo. Khi mã thông báo trang được trả về trống, không có tác vụ nào khác để truy xuất.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để liệt kê các tác vụ cho một ID phân phối xe và thuộc tính tác vụ. Một phản hồi thành công vẫn có thể trống. Một phản hồi trống cho biết rằng không có Tasks nào được liên kết với DeliveryVehicleId đã cung cấp.

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để liệt kê những việc cần làm qua một trình duyệt, hãy gọi HTTP REST tới ListTasks:

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

Để áp dụng bộ lọc cho các tác vụ được liệt kê, hãy bao gồm tham số URL "bộ lọc" với truy vấn bộ lọc thoát URL làm giá trị.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nếu quá trình tra cứu thành công, nội dung phản hồi sẽ chứa dữ liệu có cấu trúc như sau:

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

Một phản hồi thành công vẫn có thể trống. Phản hồi trống cho biết không tìm thấy tác vụ nào đáp ứng tiêu chí lọc đã chỉ định.

Ví dụ về lệnh 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}"

Liệt kê xe giao hàng

Bạn có thể liệt kê các xe giao hàng từ môi trường máy chủ hoặc trình duyệt. SDK Driver không hỗ trợ các xe phân phối trang thông tin.

Danh sách xe giao hàng yêu cầu quyền truy cập rộng rãi vào các xe giao hàng và chỉ dành cho những người dùng đáng tin cậy. Sử dụng trình đọc Hạm đội phân phối hoặc Mã thông báo xác thực của người dùng cấp cao khi gửi yêu cầu về xe phân phối danh sách.

Các phương tiện giao hàng được liệt kê có các trường sau được biên tập do ảnh hưởng của chúng đối với kích thước phản hồi:

  • Phân đoạn hiện tại
  • Phân đoạn hành trình còn lại của xe

Bạn có thể lọc các xe giao hàng theo danh sách theo tài sản attributes của họ. Ví dụ: để truy vấn một thuộc tính có khoá my_key và giá trị my_value, hãy sử dụng attributes.my_key = my_value. Để truy vấn nhiều thuộc tính, hãy kết hợp các truy vấn bằng toán tử ANDOR logic như trong attributes.key1 = value1 AND attributes.key2 = value2. Hãy xem AIP-160 để biết nội dung mô tả đầy đủ về cú pháp truy vấn bộ lọc.

Bạn có thể lọc các xe giao hàng trong danh sách theo vị trí bằng cách sử dụng tham số yêu cầu viewport. Tham số yêu cầu viewport xác định khung nhìn bằng cách sử dụng hai tọa độ giới hạn: vĩ độ/kinh độ high (phía đông bắc) và low (phía tây nam). Các yêu cầu sẽ bị từ chối nếu có vĩ độ cao dưới vĩ độ thấp.

Theo mặc định, danh sách xe giao hàng được phân trang theo kích thước trang hợp lý. Nếu bạn chỉ định kích thước trang, yêu cầu chỉ trả về số lượng xe được chỉ định theo giới hạn hoặc ít hơn. Nếu kích thước trang được yêu cầu vượt quá giá trị tối đa nội bộ, thì mức tối đa nội bộ sẽ được sử dụng. Kích thước trang mặc định và tối đa là 100 xe.

Danh sách xe phân phối có thể bao gồm mã thông báo để đọc trang kết quả tiếp theo. Mã thông báo trang chỉ hiển thị trong phản hồi khi có nhiều trang phân phối hơn để truy xuất. Để truy xuất trang tác vụ tiếp theo, hãy sử dụng mã thông báo trang với yêu cầu giống hệt với yêu cầu trước đó.

gRPC

Ví dụ sau đây cho biết cách sử dụng thư viện Java gRPC để liệt kê các xe phân phối ở một khu vực cụ thể có một thuộc tính nhất định. Một phản hồi thành công vẫn có thể trống. Khi điều đó xảy ra, có nghĩa là hiện không có xe nào có thuộc tính được chỉ định nằm trong khung nhìn được chỉ định.

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

Kiến trúc chuyển trạng thái đại diện (REST)

Để liệt kê những việc cần làm qua một trình duyệt, hãy gọi HTTP REST tới ListDeliveryVehicles:

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

Để áp dụng bộ lọc cho các nhiệm vụ được liệt kê, hãy thêm tham số URL "bộ lọc" với truy vấn bộ lọc thoát URL làm giá trị.

Tiêu đề yêu cầu phải có trường Authorization với giá trị Bearer <token>, trong đó <token>mã thông báo do một nhà máy mã thông báo Fleet Engine phát hành.

Nếu quá trình tra cứu thành công, nội dung phản hồi sẽ chứa dữ liệu có cấu trúc như sau:

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

Một phản hồi thành công vẫn có thể trống. Khi điều đó xảy ra, có nghĩa là không tìm thấy phương tiện giao hàng nào đáp ứng truy vấn bộ lọc và khung nhìn đã chỉ định.

Ví dụ về lệnh 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"

Theo dõi lô hàng

Bạn có hai tùy chọn để sử dụng API Fleet Engine Deliveryies để theo dõi quá trình vận chuyển:

  • Ưu tiên: Sử dụng Thư viện theo dõi quá trình vận chuyển JavaScript. Thư viện cho phép bạn hình dung vị trí của các phương tiện và các địa điểm yêu thích được theo dõi trong Fleet Engine. API này chứa một thành phần bản đồ JavaScript thay thế cho một đối tượng google.maps.Map tiêu chuẩn và dữ liệu để kết nối với Fleet Engine. Điều này cho phép bạn cung cấp trải nghiệm theo dõi lô hàng động, có thể tùy chỉnh từ ứng dụng web hoặc ứng dụng dành cho thiết bị di động.

  • Triển khai tính năng theo dõi lô hàng của riêng bạn trên API Fleet Engine Deliveryies. Để bắt đầu, hãy tra cứu các công việc vận chuyển bằng mã theo dõi.

Nếu bạn sử dụng Vai trò người tiêu dùng phân phối, thì mọi lệnh gọi Fleet Engine Deliveryies sẽ chỉ trả về thông tin liên quan đến người gửi hàng hoặc người nhận. Tất cả các thông tin khác trong phản hồi sẽ bị loại bỏ. Bạn chịu trách nhiệm xác thực người dùng cuối. Hơn nữa, thông tin vị trí sẽ được lọc dựa trên nhiệm vụ hiện đang được thực thi. Trong nhiệm vụ không có sẵn, thông tin vị trí sẽ không được chia sẻ với người dùng cuối.

Logging

Bạn có thể bật tuỳ chọn cho phép Fleet Engine gửi nhật ký RPC đến tính năng ghi nhật ký trên đám mây. Để biết thêm thông tin, hãy xem phần Ghi nhật ký.

Vai trò và mã thông báo

Như đã mô tả trong phần Quản lý vòng đời của xe và nhiệm vụ, cũng như các ghi chú uỷ quyền cho từng trường hợp sử dụng riêng lẻ, việc thực hiện lệnh gọi đến Fleet Engine yêu cầu xác thực bằng Mã thông báo web JSON đã được ký bằng thông tin đăng nhập của tài khoản dịch vụ. Các tài khoản dịch vụ dùng để đúc những mã thông báo đó có thể có một hoặc nhiều vai trò, trong đó mỗi vai trò cấp một nhóm quyền khác nhau.

Để biết thêm thông tin, hãy xem phần Xác thực và uỷ quyền.

Khắc phục sự cố

Khả năng phục hồi

Fleet Engine không được coi là một nguồn đáng tin cậy. Bạn có trách nhiệm khôi phục trạng thái của hệ thống (nếu cần) mà không cần dựa vào Fleet Engine.

Trạng thái bị mất trong Fleet Engine

Khi làm việc với Fleet Engine, hãy triển khai ứng dụng để hệ thống tự khắc phục nếu xảy ra lỗi. Ví dụ: khi Fleet Engine cố gắng cập nhật một chiếc xe, công cụ này có thể phản hồi với một lỗi cho biết xe không tồn tại. Sau đó, khách hàng nên tạo lại xe ở trạng thái mới. Điều này hiếm khi xảy ra, hệ thống phải có khả năng phục hồi trong trường hợp cần thiết.

Trong trường hợp cực kỳ không chắc chắn về sự cố thảm khốc của Fleet Engine, bạn có thể cần phải tạo lại hầu hết hoặc tất cả các phương tiện và nhiệm vụ. Nếu tốc độ tạo quá cao, một số yêu cầu có thể không thực hiện được do vấn đề về hạn mức vì hệ thống đang áp dụng kiểm tra định mức để tránh các cuộc tấn công từ chối dịch vụ (DOS). Trong trường hợp này, hãy giảm tốc độ giải trí bằng chiến lược thời gian đợi để thử lại.

Trạng thái bị mất trong ứng dụng trình điều khiển

Nếu ứng dụng trình điều khiển gặp sự cố, ứng dụng phải tạo lại trạng thái hiện tại trong SDK trình điều khiển. Ứng dụng nên cố gắng tạo lại các tác vụ để đảm bảo chúng tồn tại và khôi phục trạng thái hiện tại. Ứng dụng cũng sẽ tạo lại và thiết lập rõ ràng danh sách điểm dừng cho SDK trình điều khiển.

Xin lưu ý rằng việc khôi phục này phải được thực hiện một cách độc lập mà không cần dựa vào thông tin từ Fleet Engine, ngoại trừ các lỗi cho biết liệu và khi có một thực thể trong cơ sở dữ liệu. Nếu một thực thể đã tồn tại, thì lỗi đó có thể được tiếp nhận và thực thể có thể được cập nhật bằng mã nhận dạng của thực thể đó.

Câu hỏi thường gặp

Nếu người lái xe dừng việc cần làm không đúng thứ tự thì sao?

Trong trường hợp này, trước tiên bạn nên cập nhật thứ tự của các nhiệm vụ, sau đó tiếp tục như bình thường, đánh dấu điểm đến tại điểm dừng, hoàn thành nhiệm vụ, v.v. Nếu không, hệ thống có thể trở nên không nhất quán. ETA có thể không chính xác và báo cáo lỗi không mong muốn.