Lập mô hình các hoạt động của nhóm thiết bị cho chặng giao hàng đầu tiên và dặm cuối cùng bằng Fleet Engine Deliveries API. Bạn có thể sử dụng API này bằng cách dùng SDK trình điều khiển cho Android và iOS, hoặc trực tiếp bằng cách dùng các lệnh gọi HTTP REST hoặc gRPC.
Thiết lập ban đầu
Bạn định cấu hình Fleet Engine Deliveries API trong 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 này, vui lòng 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ụ, hãy xác minh rằng quá trình thiết lập đã hoàn tất và bạn có thể tạo xe giao hàng. Việc xác minh chế độ thiết lập của bạn ngay lập tức đảm bảo rằng bạn đã giải quyết 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. Có hai cách để xác minh chế độ thiết lập của bạn:
Kiểm thử hai phần chính trong quá trình thiết lập: ký mã thông báo uỷ quyền và tạo xe phân phối dùng thử bằng tiện ích dòng lệnh
gcloud
. Để biết thông tin chi tiết, hãy xem hướng dẫn Xác minh chế độ thiết lập của bạn.Kiểm tra chế độ thiết lập của bạn bằng Tập lệnh mẫu xác thực Fleet Engine.
Thư viện ứng dụng
Để có trải nghiệm tốt hơn cho nhà phát triển so với gRPC hoặc REST thô, hãy sử dụng các thư viện ứng dụng bằng một số ngôn ngữ lập trình phổ biến. Để biết hướng dẫn về cách lấy thư viện ứng dụng cho ứng dụng máy chủ của bạn, hãy xem phần 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
Fleet Engine Deliveries API sử dụng hai cấu trúc dữ liệu để lập mô hình cho quá trình đến lấy hàng và giao hàng:
- Xe giao hàng dùng để vận chuyển kiện hàng.
- Các nhiệm vụ lấy hàng và giao hàng.
Bạn cũng sử dụng các nhiệm vụ để lập mô hình thời gian nghỉ của người lái xe và điểm dừng theo lịch trong suốt cả ngày.
Xe giao hàng
Xe giao hàng vận chuyển các kiện hàng từ một kho hàng đến một địa điểm giao hàng và từ một địa điểm nhận hàng đến kho chứa. Trong một số trường hợp nhất định, họ cũng có thể vận chuyển lô hàng trực tiếp từ vị trí nhận hàng đến vị trí giao hàng.
Sử dụng SDK trình điều khiển để tạo một đố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 thiết bị.
Tasks
Đối với các hành động mà một chiếc xe thực hiện trong ngày, bạn giao nhiệm vụ theo loại hành động:
- Đối với tính năng đến lấy hàng và giao hàng, hãy giao Nhiệm vụ vận chuyển.
- Đối với những thời điểm người lái xe không rảnh (chẳng hạn như nghỉ giải lao), hãy chỉ định Nhiệm vụ khi người lái xe không rảnh.
- Đối với các tác vụ không phải lái xe tại hộp thả xuống hoặc địa điểm của khách hàng, hãy chỉ định Các tác vụ dừng theo lịch.
Mỗi việc cần làm được chỉ định phải có một mã công việc duy nhất, nhưng các công việc có thể có cùng một mã theo dõi. Khi tính toán thời gian đến dự kiến cho từng nhiệm vụ, Fleet Engine sẽ sử dụng mọi công việc và thứ tự lên lịch để ước tính. Để biết thêm thông tin về mã việc cần làm, hãy xem Nguyên tắc về mã việc cần làm.
Để tạo nhiệm vụ trong Fleet Engine, hãy dùng Trình quản lý tác vụ SDK trình điều khiển.
Nhiệm vụ vận chuyển
Tạo nhiệm vụ vận chuyển cho cả tính năng lấy hàng và giao hàng, đồng thời cung cấp những thông tin sau:
- Địa điểm đến lấy hàng hoặc giao hàng.
- Số theo dõi hoặc mã theo dõi.
- Thời gian dừng để tính đến thời gian bổ sung nhằm hoàn thành tác vụ, tìm chỗ đỗ xe hoặc đi bộ đến vị trí chuyển giao.
- Mã công việc duy nhất. Xem Nguyên tắc về mã việc cần làm.
Để biết thêm thông tin, hãy xem các chủ đề sau:
Android
iOS
Tác vụ không có sẵn
Nhiệm vụ không có sẵn sử dụng bao gồm các khoảng thời gian khi không có xe để đến lấy hàng hoặc giao hàng, chẳng hạn như giờ nghỉ tiếp nhiên liệu xe hoặc nghỉ ngơi cho người lái xe.
Tạo một tác vụ không có trạng thái thực hiện bằng những thông tin sau:
- Thời lượng của điểm chèn quảng cáo.
- Vị trí chèn quảng cáo (không bắt buộc). Bạn không cần phải cung cấp một vị trí cụ thể, nhưng làm như vậy sẽ giúp cửa sổ ETA chính xác hơn trong suốt cả ngày.
Để biết thêm thông tin, hãy xem các chủ đề sau:
Android
iOS
Các tác vụ cần dừng theo lịch
Tạo các nhiệm vụ dừng theo lịch để lập mô hình các điểm dừng mà xe giao hàng cần thực hiện. Ví dụ: tạo một tác vụ dừng theo lịch cho điểm dừng thu thập được lên lịch hằng ngày tại một vị trí cụ thể, không phụ thuộc vào các đợt giao hàng hoặc đến lấy hàng khác ở cùng vị trí đó. Bạn cũng có thể tạo các nhiệm vụ dừng theo lịch cho các bộ sưu tập từ hộp thả xuống hoặc đến hoạt động chuyển xe trung chuyển mô hình hoặc dừng tại các trung tâm dịch vụ và điểm dịch vụ.
Để biết thêm thông tin, hãy xem các chủ đề sau:
Android
iOS
Nguyên tắc về mã việc cần làm
Khi bạn tạo mã công việc, hãy làm theo các nguyên tắc sau về nội dung và định dạng:
- Tạo mã công việc duy nhất
- Đừng cung cấp 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.
- Sử dụng chuỗi Unicode hợp lệ.
- Hãy sử dụng từ 64 ký tự trở xuống.
- Đừng dùng bất cứ ký tự ASCII nào sau đây: "/", ":", "\", "?" hoặc "#".
- Chuẩn hoá theo Biểu mẫu chuẩn hoá Unicode C.
Sau đây là một số ví dụ về Mã công việc phù hợp:
- 566c33d9-2a31-4b6a-9cd4-80ba1a0c643b
- e4708eabcfa39bf2767c9546c9273f747b4626e8cc44e9630d50f6d129013d38
- NTA1YTliYWNkYmViMTI0ZmMzMWFmOWY2NzNkM2Jk
Bảng sau đây trình bày ví dụ về những Mã việc cần làm không được hỗ trợ:
Mã việc cần làm không được hỗ trợ | Lý do |
---|---|
8/31/2019-20:48-46.70746,-130.10807,-85.17909,61.33680 | Vi phạm các yêu cầu về thông tin nhận dạng cá nhân và ký tự: dấu phẩy, dấu chấm, 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 về thông tin nhận dạng cá nhân. |
4R0oXLToF"112 Mùa hè Tiến sĩ East Arthurford, CT06118"577b484da26f8a | Vi phạm các yêu cầu về ký tự và thông tin nhận dạng cá nhân (PII): khoảng trắng, dấu phẩy và dấu ngoặc kép. Dài hơn 64 ký tự. |
Tài nguyên khác
Để xem các trường cụ thể có trong từng cấu trúc dữ liệu, hãy xem tài liệu tham khảo API cho DeliveryVehicle
(gRPC, REST) và Task
(gRPC, REST).
Vòng đời của xe
Đối tượng DeliveryVehicle
đại diện cho xe giao hàng dặm đầu tiên hoặc dặm cuối cùng.
Bạn tạo một đối tượng DeliveryVehicle
bằng:
- Mã dự án của dự án trên Google Cloud chứa tài khoản dịch vụ dùng để gọi các API Fleet Engine.
- Mã xe của khách hàng.
Sử dụng mã xe riêng biệt cho từng chiếc xe. Đừng sử dụng lại mã xe trừ phi không có nhiệm vụ nào đang hoạt động cho xe gốc.
Fleet Engine sẽ tự động xoá các đối tượng DeliveryVehicle
chưa được cập nhật bằng UpdateDeliveryVehicle
sau 7 ngày. Cách xem xe có tồn tại hay không:
- Gọi điện đến số
UpdateDeliveryVehicle
. - Nếu bạn gặp lỗi NOT_FOUND, hãy gọi
CreateDeliveryVehicle
để tạo lại xe. Nếu cuộc gọi trả lại một chiếc xe, thì chiếc xe đó vẫn có sẵn để cập nhật.
Loại phương tiện
Thực thể VehicleType
chứa trường VehicleType
không bắt buộc, chứa enum Category
mà bạn có thể chỉ định là AUTO
, TWO_WHEELER
, BICYCLE
hoặc PEDESTRIAN
. Nếu bạn không thiết lập trường này, thì trường này sẽ mặc định là AUTO
.
Tất cả hoạt động định tuyến cho xe đều sử dụng RouteTravelMode
tương ứng cho loại xe.
Thuộc tính xe
Thực thể DeliveryVehicle
chứa 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ề ở những thực thể có thuộc tính đã chỉ định. DeliveryVehicleAttribute
không ảnh hưởng đến hành vi định tuyến của Fleet Engine.
Đừng đưa thông tin nhận dạng cá nhân (PII) hoặc thông tin nhạy cảm vào các thuộc tính vì người dùng có thể nhìn thấy trường này.
Vòng đời của một tác vụ
Bạn có thể tạo, cập nhật và truy vấn các nhiệm vụ trong Fleet Engine bằng giao diện Deliveries API gRPC hoặc REST.
Đối tượng Task
có trường trạng thái để theo dõi tiến trình của đối tượng trong suốt vòng đời của đối tượng đó. Giá trị di chuyển từ MỞ sang ĐÃ ĐÓNG. Các tác vụ mới được tạo ở trạng thái MỞ cho biết rằng:
- Nhiệm vụ chưa được giao cho xe giao hàng.
- Xe giao hàng chưa vượt qua điểm dừng xe được chỉ định của nhiệm vụ.
Nguyên tắc về việc cần làm
Bạn chỉ có thể giao nhiệm vụ cho một chiếc xe khi nó ở trạng thái MỞ.
Bạn huỷ một nhiệm vụ bằng cách xoá nhiệm vụ đó khỏi danh sách điểm dừng xe. Thao tác này sẽ tự động đặt trạng thái tác vụ thành ĐÃ ĐÓNG.
Khi xe của nhiệm vụ hoàn thành điểm dừng xe của nhiệm vụ đó:
Cập nhật trường kết quả của nhiệm vụ thành SUCCEEDED hoặc FAILED.
Chỉ định dấu thời gian của sự kiện.
Khi đó, thư viện Theo dõi vận chuyển JavaScript cho biết kết quả của tác vụ và trạng thái tác vụ được tự động đặt thành ĐÃ ĐÓNG. Để biết thêm thông tin, hãy xem bài viết Theo dõi quá trình vận chuyển bằng thư viện Theo dõi quá trình vận chuyển JavaScript.
Tương tự như xe, Fleet Engine sẽ xoá các nhiệm vụ chưa được cập nhật sau 7 ngày. Nếu bạn cố gắng tạo một nhiệm vụ bằng mã đã tồn tại, thì hệ thống sẽ trả về lỗi.
Lưu ý: Fleet Engine không hỗ trợ việc xoá một nhiệm vụ một cách rõ ràng. Dịch vụ này tự động xoá các công việc sau 7 ngày mà không cần cập nhật. Nếu muốn lưu giữ dữ liệu công việc lâu hơn 7 ngày, bạn phải tự triển khai tính năng đó.
Thuộc tính việc cần làm
Thực thể Task
chứa trường lặp lại TaskAttribute
. Trường này có thể có giá trị từ một trong 3 loại: chuỗi, số 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ề ở những thực thể có thuộc tính đã chỉ định. Thuộc tính tác vụ không ảnh hưởng đến hành vi định tuyến của Fleet Engine.
Đừng thêm thông tin nhận dạng cá nhân (PII) hoặc thông tin nhạy cảm khác vào các thuộc tính vì người dùng có thể nhìn thấy những thuộc tính này.
Quản lý vòng đời của xe và nhiệm vụ
Lưu ý: Hệ thống nội bộ của bạn đóng vai trò là nguồn dữ liệu đáng tin cậy mà Fleet Engine Deliveries API thay mặt bạn sẽ tăng cường.
Để quản lý vòng đời của xe và nhiệm vụ trong hệ thống, hãy sử dụng Fleet Engine Deliveries API để tạo, cập nhật và theo dõi xe của bạn cũng như các nhiệm vụ liên quan.
Đồng thời, ứng dụng dành cho người lái xe sẽ giao tiếp trực tiếp với Fleet Engine để cập nhật thông tin về vị trí của thiết bị và tuyến đường. Mô hình này cho phép Fleet Engine quản lý hiệu quả thông tin vị trí theo thời gian thực. Đối tượng này trực tiếp gửi vị trí đến thư viện theo dõi. Sau đó, bạn có thể sử dụng thư viện này để cập nhật trạng thái đơn đặt hàng của người tiêu dùng.
Ví dụ: giả sử bạn gặp phải trường hợp sau:
- Một người lái xe đến gần một trạm giao hàng. Ứng dụng trình điều khiển sẽ gửi thông tin vị trí đến Fleet Engine.
- Fleet Engine gửi thông tin vị trí thiết bị đến thư viện theo dõi. Ứng dụng của bạn sẽ sử dụng thư viện này để thông báo cho người dùng về độ gần của gói hàng.
- Sau khi người lái xe hoàn tất quá trình vận chuyển, họ sẽ nhấp vào nút "Đã giao hàng" trên ứng dụng của trình điều khiển.
- Thao tác "Đã giao hàng" sẽ gửi thông tin đến hệ thống phụ trợ của bạn. Hệ thống này sẽ thực hiện các bước xác thực và xác minh hoạt động kinh doanh cần thiết.
- Hệ thống xác nhận nhiệm vụ là SUCCEEDED và cập nhật Fleet Engine bằng cách sử dụng API giao hàng.
Sơ đồ dưới đây minh hoạ các quy trình này ở mức độ chung. Tệp này cũng cho thấy mối quan hệ tiêu chuẩn giữa hệ thống, ứng dụng khách và Fleet Engine.
Quản lý mã thông báo ứng dụng
Thông tin cập nhật vị trí bắt nguồn từ ứng dụng của người lái xe và được gửi trực tiếp đến Fleet Engine cần có mã thông báo uỷ quyền. Dưới đây là phương pháp đề xuất để xử lý các bản cập nhật từ ứng dụng cho Fleet Engine:
Tạo mã thông báo bằng vai trò trong tài khoản dịch vụ Người dùng trình điều khiển không tin cậy của Fleet Engine Delivery.
Cung cấp cho ứng dụng trình điều khiển một mã thông báo có phạm vi giới hạn. Phạm vi này chỉ cho phép cập nhật thông tin vị trí thiết bị trong Fleet Engine.
Phương pháp 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 ít tin cậy) tuân thủ nguyên tắc về đặc quyền tối thiểu.
Các vai trò khác đối với tài khoản dịch vụ
Thay vào đó, nếu muốn cho phép các ứng dụng của người lái xe cập nhật trực tiếp Fleet Engine ngoài những cập nhật chỉ dành cho vai trò Người lái xe không tin cậy, chẳng hạn như để cập nhật một số tác vụ, 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ô 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 các vai trò của người lái xe không đáng tin cậy và đáng tin cậy, hãy xem nội dung Thiết lập dự án trên Google Cloud.
Lập mô hình một ngày làm việc
Bảng sau đây mô tả hoạt động của một ngày làm việc đối với những người lái xe đi đầu hoặc cuối cùng tại một công ty giao hàng và hậu cần. Công ty của bạn có thể có thông tin chi tiết khác nhau, nhưng bạn có thể xem cách mình có thể lập mô hình một ngày làm việc.
Thời gian | Hoạt động | Lập mô hình |
---|---|---|
Trong vòng 24 giờ kể từ đầu ngày | Điều phối viên chỉ định việc giao hàng cho xe hoặc tuyến đường giao hàng. | Bạn có thể tạo trước các nhiệm vụ giao hàng, đến lấy hàng, nghỉ giải lao và
các nhiệm vụ khác trong Fleet Engine. Ví dụ: Bạn có thể tạo các
nhiệm vụ lấy hàng,
nhiệm vụ giao hàng,
không có hàng theo lịch hoặc
điểm dừng theo lịch.
Phân công nhiệm vụ cho xe sau khi hoàn tất các gói hàng giao và thứ tự giao các gói hàng. |
Đầu ngày | Tài xế bắt đầu ngày mới tại kho chứa bằng cách đăng nhập vào ứng dụng Driver. | 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 các lô hàng lên xe giao hàng, quét tìm các lô hàng. | Nếu bạn không tạo trước nhiệm vụ giao hàng, hãy tạo nhiệm vụ giao hàng tại thời điểm quét. | |
Người lái xe xác nhận thứ tự các việc cần làm. | Nếu các yêu cầu này không được tạo trước, hãy tạo nhiệm vụ lấy hàng, tình trạng không có hàng theo lịch và điểm dừng theo lịch. | |
Người lái xe rời khỏi kho và cam kết cần hoàn thành một số nhiệm vụ tiếp theo. | Giao tất cả nhiệm vụ hoặc một nhóm nhỏ nhiệm vụ cho xe bằng cách cam kết yêu cầu hoàn thành. | |
Tài xế giao hàng. | Sau khi đến điểm dừng giao hàng, hãy thực hiện các hành động liên quan đến xe đang đến điểm dừng. Sau khi giao hàng, hãy đóng tác vụ giao hàng và chọn trạng thái vận chuyển tại cửa hàng và các 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 đến điểm dừng tiếp theo, hãy thực hiện các hành động liên quan đến việc xe hoàn thành điểm dừng và xe đang lên đường đến điểm dừng tiếp theo. | |
Người lái xe gặp một xe trung chuyển để chuyển các lô hàng bổ sung lên xe giao hàng. | Điểm gặp gỡ giữa phương tiện giao hàng và xe giao hàng phải được mô hình hoá dưới dạng đ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ụ giao hàng nếu bạn chưa tạo. Sau đó, hãy cập nhật thứ tự hoàn thành công việc bằng cách giao nhiệm vụ cho một xe và cập nhật thứ tự nhiệm vụ. |
|
Người lái xe 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 nhiệm vụ đến lấy hàng. Sau đó, hãy cập nhật thứ tự thực hiện tác vụ bằng cách chỉ định nhiệm vụ cho một xe và cập nhật thứ tự tác vụ. | |
Trưa | Tài xế nghỉ ăn trưa. | Nếu một vị trí được liên kết với nhiệm vụ không có sẵn, hãy xem vị trí đó giống như bất kỳ nhiệm vụ nào khác. Thực hiện các hành động liên quan đến việc xe
đang đến tại điểm dừng,
xe hoàn tất một điểm dừng
và xe đang 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 phiên chèn quảng cáo. Xoá tác vụ bằng cách xác nhận các tác vụ tiếp theo và các tác vụ còn lại, đồng thời cập nhật thứ tự tác vụ. |
Tài xế đến lấy kiện hàng. | Địa điểm này được mô hình hoá giống như một điểm dừng giao hàng. Thực hiện các thao tác liên quan đến xe đang đến điểm dừng và đóng một nhiệm vụ cũng như lưu trữ trạng thái vận chuyển cũng như các 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 đến điểm dừng tiếp theo, hãy thực hiện các hành động liên quan đến việc xe hoàn tất một điểm dừng và xe đang lên đường đến điểm dừng tiếp theo. Lưu ý: Để đảm bảo việc 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ụ giao hàng tương ứng. Nếu tính năng đến lấy hàng được giao đến một vị trí khác trên cùng tuyến đường của tài xế vào ngày hôm đó, bạn nên lập mô hình tác vụ giao hàng đó như mọi tác vụ giao hàng khác trên tuyến đường. Nếu người lái xe đang đưa đơn hàng đến lấy hàng trở lại kho, bạn nên tạo tác vụ giao hàng tại điểm đến của kho. | |
Người lái xe dừng lại theo lịch để lấy kiện hàng từ thùng chứa hàng. | Điểm này được mô hình hoá giống như mọi điểm đến lấy hàng khác. Thực hiện các hành động liên quan đến xe đang đến điểm dừng và đó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 đến điểm dừng tiếp theo, hãy thực hiện các hành động liên quan đến việc xe hoàn tất một điểm dừng và xe đang lên đường đến điểm dừng tiếp theo. | |
Người lái xe sẽ nhận được thông báo về việc một lô hàng đang được chuyển đến một địa điểm khác. | Đặt trạng thái của nhiệm vụ giao hàng ban đầu thành COMPLETED (ĐÃ HOÀN TẤT) rồi tạo một nhiệm vụ giao hàng mới cho vị trí giao hàng mới. Để biết thêm thông tin, hãy xem phần Định tuyến lại quá trình vận chuyển. | |
Tài xế đã cố gắng giao kiện hàng nhưng không thành công. | Giá trị 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 tác vụ phân phối là đã hoàn thành. Thực hiện các hành động liên quan đến xe đang đến trạm dừng. Nếu không giao được lô hàng, hãy đóng tác vụ và chọn trạng thái vận chuyển tại cửa hàng cũng như các 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 đến điểm dừng tiếp theo, hãy thực hiện các hành động liên quan đến việc xe hoàn tất một điểm dừng và xe đang lên đường đến điểm dừng tiếp theo. | |
Người lái xe được thông báo đang chờ (không giao) một kiện hàng. | Sau khi nhận và xác nhận thông báo, hãy đặt trạng thái của tác vụ thành COMPLETED (ĐÃ HOÀN TẤT). | |
Tài xế nhận được thông báo giao một lô hàng cụ thể tiếp theo, điều này làm thay đổi đơn đặt hàng giao hàng đã cam kết. | Cập nhật thứ tự tác vụ. | |
Người lái xe chọn giao một lô hàng không đúng đơn đặt hàng. | 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 duy nhất. | Điểm này được mô hình hoá 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 một xe đang đến điểm dừng. Sau khi giao từng kiện hàng, hãy đóng từng nhiệm vụ và chọn trạng thái vận chuyển tại cửa hàng và các 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 đến điểm dừng tiếp theo, hãy thực hiện các hành động liên quan đến việc xe hoàn tất một điểm dừng và xe đang lên đường đến điểm dừng tiếp theo. | |
Cuối ngày | Tài xế quay trở lại kho chứa. | Nếu người lái xe quay trở lại kho hàng với các kiện hàng được lấy trong tuyến đường của họ, bạn cũng phải tạo và đóng từng gói hàng làm nhiệm vụ giao hàng để đảm bảo việc thanh toán chính xác. 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ư mọi điểm dừng giao hàng khác. Nếu kho hàng không được dùng làm điểm dừng giao hàng, bạn vẫn có thể tuỳ ý lập mô hình kho hàng thành điểm dừng theo lịch biểu. Việc lập mô hình điểm dừng cho phép tài xế xem tuyến đường trở lại kho và cung cấp thông tin về thời gian đến dự kiến. |
Cách hoạt động của thông tin cập nhật về vị trí
Để Fleet Engine đạt hiệu suất tốt nhất, hãy cung cấp cho dịch vụ một luồng thông tin cập nhật về vị trí của xe. Sử dụng một trong những cách sau để cung cấp các nội dung cập nhật này:
- Sử dụng SDK trình điều khiển – Android, iOS – lựa chọn đơn giản nhất.
- Sử dụng mã tuỳ chỉnh – hữu ích nếu vị trí được chuyển tiếp thông qua phần phụ trợ hoặc nếu bạn sử dụng các thiết bị không phải Android hoặc iOS.
Bất kể bạn cung cấp thông tin cập nhật về vị trí xe bằng cách nào, phần phụ trợ của bạn vẫn chịu trách nhiệm cập nhật Fleet Engine khi xe giao hàng đang đến điểm dừng (bao gồm cả kho chứa) và khi đến điểm dừng. Fleet Engine không tự động phát hiện những sự kiện này.
Trạ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 nhiệm vụ vận chuyển hoặc một nhiệm vụ khác. Đó là một điểm truy cập, chẳng hạn như đế tải hoặc vị trí gặp đường.
Vị trí giao hàng là nơi hàng được giao hoặc đến lấy hàng. Bạn có thể phải đi bộ một chút từ điểm dừng của xe để đến và đi từ địa điểm giao hàng.
Ví dụ: khi người lái xe đang giao hàng đến một cửa hàng trong trung tâm mua sắm, xe 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 cửa hàng nhất. Đây là điểm dừng xe. Sau đó, người lái xe đi từ điểm dừng của xe đến vị trí trong trung tâm mua sắm nơi có cửa hàng. Đây là vị trí giao hàng.
Để có trải nghiệm theo dõi quá trình vận chuyển tốt nhất cho người dùng, hãy cân nhắc cách chỉ định các nhiệm vụ vận chuyển cho các điểm dừng xe. Xin lưu ý rằng số lượng điểm dừng xe còn lại cho các nhiệm vụ vận chuyển sẽ được báo cáo cho người dùng để giúp họ xem tiến trình của quá trình vận chuyển.
Ví dụ: nếu một tài xế đang giao hàng nhiều lần đến một toà nhà văn phòng, hãy cân nhắc việc chỉ định tất 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 quá trình vận chuyển sẽ không giúp ích được cho người dùng vì tính năng theo dõi chỉ hoạt động khi xe đã dừng ở một số điểm dừng xe nhất định trước điểm đến. Việc hoàn thành nhiều điểm dừng xe trong một thời gian ngắn không mang lại cho người dùng nhiều thời gian để theo dõi tiến trình giao hàng.
Sử dụng SDK di động
Trước khi bạn thực hiện bất kỳ lệnh gọi nào đến SDK trình điều khiển, hãy nhớ khởi chạy SDK đó.
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 động SDK Điều hướng. Sau đó, hãy 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 Deliveries API để 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 các giá trị nhận dạng thực thể duy nhất dùng trong các lệnh gọi REST là không rõ ràng đối với Fleet Engine. Tránh sử dụng mã nhận dạng 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), 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 xe từ SDK Trình điều khiển hoặc từ môi trường máy chủ bằng cách sử dụng gRPC hoặc REST.
gRPC
Để tạo một chiếc xe mới, hãy 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 xe giao hàng mới. Lưu ý rằng mọi giá trị được chỉ định cho trường Name
đều bị bỏ qua theo hướng dẫn API cho 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 cho xe.
Khi tạo DeliveryVehicle
, bạn có thể tuỳ ý chỉ định các trường sau:
- Thuộc tính
- LastLocation
- Loại
Đừng đặt bất kỳ trường nào khác. Nếu bạn làm như vậy, Fleet Engine sẽ trả về một lỗi
vì các trường đó ở chế độ chỉ có thể đọc hoặc chỉ có thể được cập nhật bằng lệnh gọi đến
UpdateDeliveryVehicle
.
Để tạo xe mà không cần đặt 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 cho biết cách sử dụng thư viện Java gRPC để tạo một chiếc xe:
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 xe từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến CreateDeliveryVehicle
:
POST https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles?deliveryVehicleId=<id>
<id> là giá trị nhận dạng duy nhất của xe giao hàng trong nhóm thiết bị của bạn.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 POST đại diện cho 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:
- attributes
- lastLocation
- loại
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.
Đừng đặt bất kỳ trường nào khác. Nếu bạn làm như vậy, Fleet Engine sẽ trả về một lỗi
vì các trường đó ở chế độ chỉ có thể đọc hoặc chỉ có thể được cập nhật bằng cách sử dụng lệnh gọi đến
UpdateDeliveryVehicle
.
Để tạo một chiếc xe mà không cần cài đặt bất kỳ trường nào, hãy để trống phần nội dung của yêu cầu POST. Sau đó, xe mới tạo sẽ trích xuất mã xe từ tham 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 tác vụ nhận kiện hàng từ SDK trình điều khiển hoặc từ môi trường máy chủ bằng cách sử dụng gRPC hoặc REST.
gRPC
Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để tạo một nhiệm vụ nhận 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 tác vụ nhận hàng từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến CreateTask
:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id> là giá trị nhận dạng duy nhất của công việc. Đây không được là số theo dõi của lô hàng. Nếu không có mã công việc trong hệ thống, bạn có thể tạo một giá trị nhận dạng duy nhất (UUID).
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể Task
:
Các trường bắt buộc:
Trường Giá trị loại Type.PICKUP state State.OPEN trackingId Số hoặc mã nhận dạng mà bạn đang dùng để theo dõi quá trình vận chuyển. plannedLocation Vị trí mà công việc cần hoàn thành, trong trường hợp này là vị trí đến lấy hàng. taskDuration Thời gian dự kiến tính bằng giây để nhận kiện hàng tại địa điểm nhận hàng. Các trường không bắt buộc:
Trường Giá trị targetTimeWindow Khoảng thời gian hoàn thành việc cần làm. Điều này không ảnh hưởng đến hành vi định tuyến. attributes Danh sách các thuộc tính tuỳ chỉnh của Việc cần làm. Mỗi thuộc tính phải có một khoá duy nhất.
Tất cả các trường khác trong thực thể đều bị bỏ qua khi tạo. Fleet Engine sẽ gửi một trường hợp ngoại lệ nếu yêu cầu có deliveryVehicleId
đượ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 chiếc xe và UpdateDeliveryVehicleRequest.
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ụ giao hàng
Tạo tác vụ phân phối lô hàng từ SDK trình điều khiển hoặc từ môi trường máy chủ bằng cách sử dụng gRPC hoặc REST.
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 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.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 tác vụ phân phối lô hàng từ môi trường máy chủ bằng gRPC hoặc REST, hãy thực hiện lệnh gọi HTTP REST đến CreateTask
:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id> là giá trị nhận dạng duy nhất của công việc. Đây không được là số theo dõi của lô hàng. Nếu không có mã công việc trong hệ thống, bạn có thể tạo một giá trị nhận dạng duy nhất (UUID).
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể Task
:
Các trường bắt buộc:
Trường Giá trị loại Type.DELIVERY state State.OPEN trackingId Số hoặc mã nhận dạng mà bạn đang dùng để theo dõi quá trình vận chuyển. plannedLocation Vị trí mà công việc cần hoàn thành, trong trường hợp này là vị trí giao hàng của lô hàng này. taskDuration Thời gian dự kiến (tính bằng giây) để giao hàng tại địa điểm giao hàng. Các trường không bắt buộc:
Trường Giá trị targetTimeWindow Khoảng thời gian hoàn thành việc cần làm. Điều này không ảnh hưởng đến hành vi định tuyến. attributes Danh sách các thuộc tính tuỳ chỉnh của Việc cần làm. Mỗi thuộc tính phải có một khoá duy nhất.
Tất cả các trường khác trong thực thể đều bị bỏ qua khi tạo. Fleet Engine sẽ gửi ra một trường hợp ngoại lệ nếu yêu cầu bao gồm deliveryvehicleId đượ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 chiếc xe và UpdateDeliveryVehicleRequest.
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ác vụ tạo hàng loạt
Bạn có thể tạo một loạt tác vụ từ môi trường máy chủ bằng cách sử dụng gRPC hoặc REST.
gRPC
Ví dụ sau đây cho thấy cách sử dụng thư viện Java gRPC để tạo hai nhiệm vụ, trong đó có một nhiệm vụ là giao hàng và một nhiệm vụ là đến lấy hàng 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 tác vụ giao hàng 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 đến BatchCreateTasks
:
POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks:batchCreate
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có giá trị Bearer <token>, trong đó <token> là một mã thông báo do 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 thực thể BatchCreateTasksRequest
:
Các trường bắt buộc:
Trường Giá trị yêu cầu Mảng< CreateTasksRequest
>Các trường không bắt buộc:
Trường Giá trị tiêu đề " DeliveryRequestHeader"
Mỗi phần tử CreateTasksRequest
trong requests
phải chuyển cùng một quy tắc xác thực như một yêu cầu CreateTask
, ngoại trừ các trường parent
và header
là không bắt buộc. Nếu được đặt, thì các trường này phải giống với các trường tương ứng ở cấp cao nhất BatchCreateTasksRequest
. Xem tạo nhiệm vụ nhận hàng và tạo nhiệm vụ giao hàng để biết các quy tắc xác thực cụ thể cho từng nhiệm vụ.
Để biết thêm thông tin, hãy xem tài liệu 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 tác vụ cho biết không có sẵn (ví dụ: lỗi người lái xe hoặc nạp nhiên liệu cho xe) từ SDK trình điều khiển hoặc từ môi trường máy chủ sử dụng gRPC hoặc REST. Tác vụ không có sẵn theo lịch không được bao gồm mã theo dõi. Bạn có thể cung cấp vị trí (không bắt buộc).
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 thực hiện được từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến CreateTask
:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id> là giá trị nhận dạng duy nhất của công việc. Nếu không có mã công việc trong hệ thống, bạn có thể tạo một giá trị nhận dạng duy nhất (UUID) trên toàn cầu.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể Task
:
Các trường bắt buộc:
Trường Giá trị loại Type.UNAVAILABLE state State.OPEN taskDuration Thời lượng của điểm chèn tính bằng giây. Các trường không bắt buộc:
Trường Giá trị plannedLocation Vị trí điểm chèn nếu phải được chụp tại một vị trí cụ thể.
Tất cả các trường khác trong thực thể đều bị bỏ qua khi tạo. Fleet Engine sẽ gửi ra một trường hợp ngoại lệ nếu yêu cầu bao gồm deliveryvehicleId đượ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 chiếc xe và UpdateDeliveryVehicleRequest.
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
Trạm dừng theo lịch
Bạn có thể tạo tác vụ dừng theo lịch từ SDK Trình điều khiển hoặc từ môi trường máy chủ bằng cách sử dụng gRPC hoặc REST. Tác vụ dừng theo 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 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 tác vụ dừng theo lịch từ một môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến CreateTask
:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id> là giá trị nhận dạng duy nhất của công việc. Nếu không có mã công việc 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 chứa trường Uỷ quyền có 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 thực thể Task
:
Các trường bắt buộc:
Trường Giá trị loại Type.SCHEDULED_STOP state State.OPEN plannedLocation Vị trí của điểm dừng. taskDuration Thời lượng dự kiến của điểm dừng tính bằng giây. Các trường không bắt buộc:
- Không có
Tất cả các trường khác trong thực thể đều bị bỏ qua khi tạo. Fleet Engine sẽ gửi ra một trường hợp ngoại lệ nếu yêu cầu bao gồm deliveryvehicleId đượ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 chiếc xe và UpdateDeliveryVehicleRequest.
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
Khoảng thời gian mục tiêu là TimeWindow, trong thời gian đó tác vụ sẽ hoàn tất. Ví dụ: nếu thông báo về khoảng thời gian giao hàng cho người nhận giao hàng, bạn có thể sử dụng cửa sổ thời gian mục tiêu của tác vụ để chụp khoảng thời gian này và tạo cảnh báo hoặc phân tích hiệu suất sau chuyến đi bằng trường này.
Khoảng 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 trên bất kỳ loại tác vụ nào. Khoảng thời gian mục tiêu không ảnh hưởng đến hành vi định tuyến.
gRPC
Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để thiết lập khoảng thời gian 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 khoảng thời gian 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> là giá trị nhận dạng duy nhất của công việc.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể Task
:
Các trường bắt buộc:
Trường Giá trị targetTimeWindow Khoảng thời gian hoàn thành việc cần làm. Chế độ cài đặt này không ảnh hưởng đến hành vi định tuyến Các trường không bắt buộc:
- Không có
Tất cả các trường khác trong thực thể sẽ bị bỏ qua trong quá trình 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 chế độ hiển thị cho tính năng theo dõi tác vụ
Bạn có thể kiểm soát chế độ hiển thị dữ liệu trong thư viện Theo dõi việc vận chuyển và dữ liệu đó được trả về từ lệnh gọi đến GetTaskTrackingInfo
theo từng tác vụ bằng cách đặt TaskTrackingViewConfig
cho tác vụ đó. Xem phần Các nhiệm vụ 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 tác vụ bằng cấu hình này:
gRPC
Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để thiết lập cấu hình chế độ xem 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 công việc bằng HTTP, hãy gọi UpdateTask
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskTrackingViewConfig`
<id> là giá trị nhận dạng duy nhất của công việc.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể Task
:
Các trường bắt buộc:
Trường Giá trị taskTrackingViewConfig Cấu hình để theo dõi tác vụ chỉ định những phần tử dữ liệu mà người dùng cuối có thể nhìn thấy trong trường hợp nào. Các trường không bắt buộc:
- Không có
Tất cả các trường khác trong thực thể sẽ bị bỏ qua trong quá trình 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
Phân công việc cần làm cho xe
Bạn giao nhiệm vụ cho một xe giao hàng bằng cách cập nhật thứ tự nhiệm vụ cho xe đó. Thứ tự nhiệm vụ của xe được xác định theo danh sách điểm dừng xe của xe giao, và bạn có thể chỉ định một hoặc nhiều nhiệm vụ cho mỗi điểm dừng của xe. Để biết thông tin chi tiết, hãy xem phần Cập nhật thứ tự tác vụ.
Để thay đổi quá trình vận chuyển từ xe này sang xe khác, hãy đóng tác vụ ban đầu, sau đó tạo lại trước khi chỉ định phương tiện mới. Nếu cập nhật thứ tự tác vụ cho một tác vụ đã được giao cho một loại xe khác, bạn sẽ gặp lỗi.
Cập nhật thứ tự tác vụ
Bạn có thể cập nhật các nhiệm vụ theo đơn đặt hàng được chỉ định cho xe được thực hiện từ SDK trình điều khiển hoặc môi trường máy chủ. Không sử dụng cả hai phương thức để tránh điều kiện tranh đấu và duy trì một nguồn đáng tin cậy duy nhất.
Khi bạn cập nhật thứ tự nhiệm vụ cho một chiếc xe, thao tác này cũng sẽ thực hiện những việc sau:
- Giao những nhiệm vụ mới trên xe.
- Đóng mọi nhiệm vụ đã được chỉ định cho xe trước đó nhưng chưa có theo thứ tự mới cập nhật.
Để thay đổi quá trình vận chuyển từ xe này sang xe khác, hãy đóng tác vụ ban đầu, sau đó tạo lại nhiệm vụ đó trước khi chỉ định phương tiện mới. Nếu cập nhật thứ tự tác vụ cho một tác vụ đã được giao cho một loại xe khác, bạn sẽ gặp lỗi.
Bạn có thể cập nhật thứ tự công việc 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ự tác vụ 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ự tác vụ cho xe từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến UpdateDeliveryVehicle
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id> là giá trị nhận dạng duy nhất của xe giao hàng trong nhóm thiết bị mà bạn dự định cập nhật thứ tự nhiệm vụ. Đây là giá trị nhận dạng mà bạn chỉ định khi tạo xe.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể DeliveryVehicle
:
Các trường bắt buộc:
Trường Giá trị remainingVehicleJourneySegments Danh sách phân đoạn trong hành trình cho các nhiệm vụ theo thứ tự thực hiện. Tác vụ đầu tiên trong danh sách sẽ được thực thi trước. còn lạiXeHành trìnhPhân đoạn[i].stop Điểm dừng của tác vụ i trong danh sách. còn lạiXeJourney Phân đoạn[i].stop.khuyênLocation Địa điểm theo kế hoạch cho điểm dừng. còn lạiXeHành trìnhPhân đoạn[i].stop.tasks Danh sách những việc bạn cần làm tại trạm dừng xe này. remainingVehicleJourneySegments[i].stop.state State.NEW Các trường không bắt buộc:
- Không có
Tất cả các trường khác trong thực thể sẽ bị bỏ qua trong quá trình 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
Fleet Engine phải được thông báo khi xe khởi hành từ một điểm dừng hoặc bắt đầu dẫn đường. Bạn có thể thông báo cho Fleet Engine từ Driver SDK hoặc từ môi trường máy chủ bằng cách sử dụng gRPC hoặc REST. Đừng sử dụng cả hai phương thức để tránh các điều kiện tranh đấu và để duy trì một nguồn đáng tin cậy.
gRPC
Ví dụ sau cho thấy cách sử dụng thư viện Java gRPC để thông báo cho Fleet Engine rằng có một chiếc xe đang trên đường đến đ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 chiếc xe đang trên đường đến điểm dừng tiếp theo từ
môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến UpdateDeliveryVehicle
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id> là giá trị nhận dạng duy nhất cho xe giao hàng trong nhóm thiết bị mà bạn dự định cập nhật thứ tự nhiệm vụ. Đây là giá trị nhận dạng mà bạn chỉ định khi tạo xe.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể DeliveryVehicle
:
Trường bắt buộc:
Trường Giá trị remainingVehicleJourneySegments Danh sách các điểm dừng xe còn lại có trạng thái được đánh dấu là State.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 không bắt buộc:
- 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.
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
Cập nhật vị trí của xe
Nếu không sử dụng SDK Trình điều khiển để cập nhật vị trí của xe, bạn có thể thực hiện lệnh gọi trực tiếp đến Fleet Engine kèm theo thông tin vị trí của xe. Đối với mọi xe đang hoạt động, Fleet Engine dự kiến sẽ cập nhật vị trí ít nhất một lần mỗi phút và tối đa là 5 giây một lần.
gRPC
Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để cập nhật thông tin vị trí của xe trong Fleet Engine:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle myDeliveryVehicle = DeliveryVehicle.newBuilder()
.setLastLocation(DeliveryVehicleLocation.newBuilder()
.setSupplementalLocation(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863))
.setSupplementalLocationTime(now())
.setSupplementalLocationSensor(DeliveryVehicleLocationSensor.CUSTOMER_SUPPLIED_LOCATION)
.setSupplementalLocationAccuracy(DoubleValue.of(15.0))) // Optional
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(myDeliveryVehicle)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("last_location"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
Kiến trúc chuyển trạng thái đại diện (REST)
Để cập nhật vị trí của một chiếc xe trong Fleet Engine bằng HTTP REST, hãy gọi đến
UpdateDeliveryVehicle
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=last_location`
<id> là giá trị nhận dạng duy nhất của xe giao hàng trong tàu của bạn hoặc là giá trị mà bạn dự định cập nhật vị trí. Đây là giá trị nhận dạng mà bạn chỉ định khi tạo xe.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể DeliveryVehicle
:
Trường bắt buộc:
Trường Giá trị lastLocation.supplementalLocation Vị trí của xe. lastLocation.supplementalLocationTime Dấu thời gian xác định gần đây nhất mà xe ở vị trí này. lastLocation.supplementalLocationSensor Phải được điền sẵn CUSTOMER_supPLIED_LOCATION. Các trường không bắt buộc:
Trường Giá trị lastLocation.supplementalLocationAccuracy Độ chính xác của vị trí được cung cấp, tính bằng mé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
{
"lastLocation": {
"supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
"supplementalLocationTime": "$(date -u --iso-8601=seconds)",
"supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
"supplementalLocationAccuracy": 15
}
}
EOM
Xe đang đến trạm dừng
Fleet Engine phải được thông báo khi xe đến điểm dừ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ủ bằng cách sử dụng gRPC hoặc REST. Đừng sử dụng cả hai phương thức để tránh các điều kiện tranh đấu và để duy trì một nguồn đáng tin cậy.
gRPC
Ví dụ sau cho thấy cách sử dụng thư viện Java gRPC để thông báo cho Fleet Engine rằng có một xe đã 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 xe đến điểm dừng từ môi trường máy chủ,
hãy thực hiện lệnh gọi HTTP REST đến UpdateDeliveryVehicle
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id> là giá trị nhận dạng duy nhất cho xe giao hàng trong nhóm thiết bị mà bạn dự định cập nhật thứ tự nhiệm vụ. Đây là giá trị nhận dạng mà bạn chỉ định khi tạo xe.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể DeliveryVehicle
:
Các trường bắt buộc:
Trường Giá trị remainingVehicleJourneySegments Điểm dừng bạn đã đến với trạng thái được đặt là State.To, theo 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à State.NEW. Các trường không bắt buộc:
- Không có
Tất cả các trường khác trong thực thể sẽ bị bỏ qua trong quá trình 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 điểm dừng
Bạn phải thông báo cho Fleet Engine khi xe hoàn tất quá trình dừng. Điều này khiến tất cả các tác vụ liên quan đến đ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ủ bằng cách sử dụng gRPC hoặc REST. Không dùng cả hai phương thức để tránh điều kiện tranh đấu và duy trì một nguồn đáng tin cậy.
gRPC
Ví dụ sau cho thấy cách sử dụng thư viện Java gRPC để thông báo cho Fleet Engine rằng xe đã 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()
// 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 việc dừng từ một môi trường máy chủ,
hãy thực hiện lệnh gọi HTTP REST đến UpdateDeliveryVehicle
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
<id> là giá trị nhận dạng duy nhất cho xe giao hàng trong nhóm thiết bị mà bạn dự định cập nhật thứ tự nhiệm vụ. Đây là giá trị nhận dạng mà bạn chỉ định khi tạo xe.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể DeliveryVehicle
:
Các trường bắt buộc:
Trường Giá trị remaining_vehicle_journey_segments Trạm dừng bạn đã hoàn thành sẽ không còn nằm trong danh sách các điểm dừng xe còn lại. Các trường không bắt buộc:
- Không có
Tất cả các trường khác trong thực thể sẽ bị bỏ qua trong quá trình 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 việc cần làm đều không thể thay đổi. Tuy nhiên, bạn có thể sửa đổi trạng thái, kết quả của nhiệm vụ, thời gian kết quả của nhiệm vụ, vị trí kết quả của nhiệm vụ và thuộc tính bằng cách cập nhật trực tiếp thực thể của nhiệm vụ đó. Ví dụ: trong trường hợp một nhiệm vụ chưa được giao cho một chiếc xe, bạn có thể đóng nhiệm vụ đó bằng cách cập nhật trực tiếp trạng thái.
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 tác vụ thông qua REST.
Đóng việc cần làm
Để đóng một nhiệm vụ đã được giao cho một chiếc xe, hãy thông báo cho Fleet Engine rằng xe đã hoàn thành điểm dừng nơi nhiệm vụ đó diễn ra hoặc xoá nó khỏi danh sách điểm dừng xe. Để làm điều đó, bạn có thể đặt danh sách các điểm dừng của xe còn lại giống như khi cập nhật thứ tự tác vụ cho một chiếc xe.
Nếu một nhiệm vụ chưa được giao cho xe và cần đóng, hãy cập nhật nhiệm vụ thành trạng thái CLOSED (ĐÃ ĐÓNG). Tuy nhiên, bạn không thể mở lại tác vụ ĐÃ ĐÓNG.
Đóng một tác vụ không có nghĩa là thành công hay thất bại. Mã này cho biết tác vụ không còn được xem là đang thực hiện. Để theo dõi quá trình vận chuyển, điều quan trọng là phải cho biết kết quả thực tế của tác vụ để có thể hiển thị kết quả giao hàng.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
.setName(taskName)
.setState(Task.State.CLOSED) // You can only directly CLOSE a
.build(); // task that is NOT assigned to a vehicle.
// Task request
UpdateTaskRequest updateTaskRequest =
UpdateTaskRequest.newBuilder() // No need for the header
.setTask(task)
.setUpdateMask(FieldMask.newBuilder().addPaths("state"))
.build();
try {
Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
Kiến trúc chuyển trạng thái đại diện (REST)
Để đánh dấu một tác vụ là đã đóng trong môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến UpdateTask
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=state`
<id> là giá trị nhận dạng duy nhất của công việc.
Tiêu đề yêu cầu của bạn phải chứa trường Uỷ quyền có 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.
Bạn phải đưa một thực thể Task
vào nội dung yêu cầu:
Các trường bắt buộc:
Trường Giá trị state State.CLOSED Các trường không bắt buộc:
Trường Giá trị taskOutcome Kết quả.SUCCEEDED hoặc Outcome.FAILED taskOutcomeTime Thời gian hoàn thành việc cần làm. taskOutcomeLocation Vị trí đã hoàn thành việc cần làm. Fleet Engine mặc định đặt giá trị này là vị trí cuối cùng của xe, trừ phi nhà cung cấp ghi đè theo cách thủ công.
Tất cả các trường khác trong thực thể sẽ bị bỏ qua trong quá trình 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
Thiết lập kết quả nhiệm vụ và vị trí kết quả
Việc đóng một tác vụ không cho biết là có thành công hay không, mà cho biết tác vụ đó không còn được xem là đang diễn ra. Để theo dõi quá trình vận chuyển, điều quan trọng là phải cho biết kết quả thực tế của nhiệm vụ để có thể hiển thị kết quả giao hàng và có cách tính phí phù hợp cho các dịch vụ. Sau khi đặt, bạn không thể thay đổi kết quả của việc cần làm. Tuy nhiên, bạn có thể sửa đổi thời gian kết quả nhiệm vụ và vị trí kết quả nhiệm vụ sau khi chúng được đặt.
Kết quả của những tác vụ đang ở trạng thái ĐÃ ĐÓNG có thể được đặt thành SUCCEEDED (ĐÃ THÀNH CÔNG) hoặc FAILED (KHÔNG THÀNH CÔNG). Fleet Engine chỉ tính phí các tác vụ phân phối có trạng thái là SUCCEEDED.
Khi đánh dấu kết quả của một nhiệm vụ, Fleet Engine sẽ tự động điền vị trí kết quả của nhiệm vụ bằng thông tin vị trí của xe đã biết gần đây nhất. Bạn có thể ghi đè hành vi này.
gRPC
Bạn có thể đặt vị trí kết quả nhiệm vụ khi đặt kết quả. Việc đặt vị trí này sẽ không cho phép Fleet Engine đặt vị trí mặc định của vị trí xe gần đây nhất. Sau này, bạn cũng có thể ghi đè vị trí kết quả nhiệm vụ mà Fleet Engine đã đặt. Fleet Engine không bao giờ ghi đè vị trí kết quả nhiệm vụ mà bạn cung cấp. Bạn không thể đặt vị trí kết quả nhiệm vụ cho một nhiệm vụ chưa đặt kết quả 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 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 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)
.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 công việc là đã hoàn thành từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến UpdateTask
:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation`
<id> là giá trị nhận dạng duy nhất của công việc.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 thực thể Task
:
Các trường bắt buộc:
Trường Giá trị taskOutcome Kết quả.SUCCEEDED hoặc Outcome.FAILED Các trường không bắt buộc:
Trường Giá trị taskOutcomeLocation Vị trí đã hoàn thành việc cần làm. Nếu bạn không đặt chính sách này, Fleet Engine sẽ đặt mặc định vị trí này là vị trí gần đây nhất của xe. taskOutcomeTime Dấu thời gian khi tác vụ hoàn tất.
Tất cả các trường khác trong thực thể sẽ bị bỏ qua trong quá trình 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 nhiệm vụ vận chuyển, bạn không thể thay đổi vị trí dự kiến 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í dự kiến mới cập nhật. Sau khi tạo việc cần làm mới, hãy giao việc đó cho cùng xe. Để biết thêm thông tin, hãy xem phần đóng tác vụ vận chuyển và giao tác vụ.
Sử dụng xe chuyển dữ liệu và xe giao hàng
Nếu bạn sử dụng xe trung chuyển để vận chuyển các lô hàng đến xe giao hàng trong suốt cả ngày, hãy mô hình hoá việc chuyển lô hàng dưới dạng một nhiệm vụ dừng theo lịch cho xe giao hàng đó. Để đảm bảo theo dõi vị trí chính xác, bạn chỉ nên chỉ định nhiệm vụ giao hàng cho một lô hàng đã vận chuyển sau khi gói hàng đó được tải 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 tất, 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 các 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 track_id được liên kết với công việc làm 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 xe
Bạn có thể tra cứu xe qua SDK Trình điều khiển hoặc từ môi trường máy chủ bằng gRPC hoặc REST.
gRPC
Ví dụ sau đây cho thấy cách sử dụng thư viện Java gRPC để tra cứu một chiếc 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 xe qua môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến GetVehicle
:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<vehicleId>`
<id> là giá trị nhận dạng duy nhất của công việc.
<vehicleId> là mã của chiếc xe cần tra cứu.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 trống.
Nếu tra cứu thành công, nội dung phản hồi sẽ chứa một thực thể phương tiện.
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 công việc qua môi trường máy chủ bằng gRPC hoặc REST. SDK trình điều khiển không hỗ trợ tính năng tra cứu tác vụ.
gRPC
Ví dụ sau đây cho biết cách 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)
Để tra cứu một công việc từ môi trường máy chủ, hãy thực hiện lệnh gọi HTTP REST đến GetTask
:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<taskId>`
<id> là giá trị nhận dạng duy nhất của công việc.
<taskId> là mã của công việc cần tra cứu.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 trống.
Nếu tra cứu thành công, nội dung phản hồi sẽ chứa một 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 nhiệm vụ vận chuyển theo mã theo dõi
Bạn có thể tra cứu thông tin về 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:
- theo mã công việc: do những người dùng như nhân viên vận hành nhóm có quyền truy cập vào chế độ xem toàn bộ dữ liệu công việc sử dụng.
- theo mã theo dõi: mà phần mềm ứng dụng khách của bạn sử dụng để cung cấp thông tin có giới hạn cho người dùng cuối, chẳng hạn như thời điểm dự kiến gói hàng sẽ được giao tại nhà của họ.
Phần này thảo luận cách tra cứu thông tin công việc theo mã theo dõi. Nếu bạn muốn tra cứu một việc cần làm theo mã công việc, hãy chuyển đến phần Tra cứu việc cần làm.
Để tra cứu thông tin bằng mã theo dõi, bạn có thể sử dụng một trong những cách sau:
Yêu cầu về tra cứu
Thông tin vận chuyển do mã theo dõi cung cấp phải 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 vận chuyển bằng mã theo dõi. SDK trình điều khiển không hỗ trợ tra cứu thông tin theo mã theo dõi. Để thực hiện việc này bằng Fleet Engine, bạn cần 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 của người tiêu dùng giao hàng, thì mọi lệnh gọi Fleet Engine Deliveries API đều chỉ trả về thông tin liên quan đến người dùng cuối đó, chẳng hạn như người vận chuyển hoặc người nhận của một lô hàng. Mọi thông tin khác trong câu trả lời sẽ bị 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) để uỷ quyền.
Tra cứu bằng Java bằng gRPC
Ví dụ sau cho thấy cách sử dụng thư viện Java gRPC để tra cứu thông tin về một công việc vận chuyển theo mã theo dõi của công việc đó.
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
Để tra cứu một nhiệm vụ vận chuyển trên trình duyệt, hãy thực hiện lệnh gọi HTTP REST đến GetTaskTrackingInfo
:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/taskTrackingInfo/<tracking_id>`
<tracking_id> là mã theo dõi được liên kết với công việc.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có giá trị Barrower <token>, trong đó <token> là một mã thông báo do 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 một 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ê việc cần làm
Bạn có thể liệt kê các công việc từ môi trường máy chủ hoặc trình duyệt. SDK trình điều khiển không hỗ trợ liệt kê các tác vụ.
Việc cần làm trong danh sách yêu cầu quyền truy cập rộng rãi vào các công việc. Tác vụ liệt kê chỉ dành cho 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 người dùng cao cấp phân phối khi đưa ra yêu cầu tác vụ danh sách.
Những việc cần làm trong danh sách có các trường sau đã bị loại bỏ:
- VehicleStop.planned_location
- VehicleStop.state
- VehicleStop.TaskInfo.taskId
Có thể lọc các công việc trong danh sách theo hầu hết thuộc tính công việc. Để biết 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ể dùng để lọc:
- attributes
- delivery_vehicle_id
- state
- planned_location
- task_duration
- task_outcome
- task_outcome_location
- task_outcome_location_source
- task_outcome_time
- tracking_id
- 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.latitude và point.longitude |
planned_location.point.latitude > 36.1 AND planned_location.point.longitude < -122.0 |
Hãy 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, thì tất cả công việc 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ụ trong danh sách. Nếu bạn chỉ định kích thước trang, thì số lượng tác vụ được trả về sẽ 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 chế độ 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ì kích thước tối đa nội bộ sẽ được sử dụng.
Danh sách công việc có thể chứa 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 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, bạn sẽ không thể truy xuất thêm tác vụ nào nữa.
gRPC
Ví dụ sau cho thấy cách sử dụng thư viện Java gRPC để liệt kê các nhiệm vụ cho deliveryvehicleId và thuộc tính tác vụ. 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 có Tasks nào được liên kết với deliveryvehicleId mà bạn đã 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ê các tác vụ trên một trình duyệt, hãy thực hiện lệnh gọi HTTP REST đến ListTasks
:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks`
Để áp dụng bộ lọc cho các tác vụ trong danh sách, hãy thêm tham số URL "bộ lọc" với giá trị là truy vấn bộ lọc có ký tự thoát trong URL.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 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 sau:
// JSON representation
{
"tasks": [
{
object (Task)
}
],
"nextPageToken": string,
"totalSize": integer
}
Câu trả lời thành công vẫn có thể bị trống. Phản hồi trống cho biết không tìm thấy công việc nào đáp ứng tiêu chí bộ 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 trình điều khiển không hỗ trợ liệt kê xe giao hàng.
Xe giao hàng đăng thông tin yêu cầu quyền truy cập rộng rãi vào 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 nhóm phân phối hoặc Mã thông báo xác thực người dùng cao cấp phân phối khi yêu cầu xe phân phối danh sách.
Các xe giao hàng liệt kê có các trường sau đây bị loại bỏ do ảnh hưởng đến kích thước phản hồi:
- CurrentRouteSegment
- RemainingVehicleJourneySegments
Bạn có thể lọc danh sách các xe giao hàng theo tài sản attributes
của các xe đó. Ví dụ: để truy vấn một thuộc tính bằng 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 cách sử dụng các toán tử logic AND
và OR
như trong attributes.key1 = value1 AND
attributes.key2 = value2
. Hãy xem phần AIP-160 để biết nội dung mô tả đầy đủ về cú pháp truy vấn của 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 2 toạ độ giới hạn: cặp toạ độ vĩ độ và kinh độ high
(đông bắc) và low
(tây nam). Yêu cầu sẽ bị từ chối nếu chứa vĩ độ cao thấp hơn vĩ độ thấp.
Theo mặc định, danh sách xe giao hàng được phân trang bằng một kích thước trang hợp lý. Nếu bạn chỉ định kích thước trang, yêu cầu sẽ 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ì kích thước tối đa nội bộ sẽ được sử dụng. Kích thước trang mặc định và tối đa đều là 100 xe.
Danh sách phương tiện giao hàng có thể chứa mã thông báo để đọc trang tiếp theo của kết quả. Mã thông báo trang chỉ xuất hiện trong phản hồi khi có nhiều trang xe 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 có yêu cầu giống với yêu cầu trước đó.
gRPC
Ví dụ sau cho biết cách sử dụng thư viện Java gRPC để liệt kê các xe giao hàng ở một khu vực cụ thể có một thuộc tính nhất định. Phản hồi thành công vẫn có thể để trống. Khi điều đó xảy ra, điều đó có nghĩa là không có xe nào có thuộc tính được chỉ định xuất hiện 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ê các tác vụ trên một trình duyệt, hãy thực hiện lệnh gọi HTTP REST đến ListDeliveryVehicles
:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles`
Để áp dụng bộ lọc cho các tác vụ đã liệt kê, hãy thêm tham số URL "filter" với giá trị là truy vấn bộ lọc có ký tự thoát URL.
Tiêu đề yêu cầu phải chứa trường Uỷ quyền có 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 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 sau:
// JSON representation
{
"deliveryVehicles": [
{
object (DeliveryVehicle)
}
],
"nextPageToken": string,
"totalSize": integer
}
Câu trả lời thành công vẫn có thể bị trống. Khi điều đó xảy ra, điều đó 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 quá trình vận chuyển
Bạn có hai lựa chọn sử dụng Fleet Engine Deliveries API để bật tính năng theo dõi quá trình vận chuyển:
Ưu tiên: Sử dụng thư viện Theo dõi vận chuyển JavaScript. Thư viện này cho phép bạn trực quan hoá vị trí của xe và vị trí quan tâm được theo dõi trong Fleet Engine. Đối tượng này chứa một thành phần bản đồ JavaScript là tính năng thay thế cho đối tượng google.maps.Map tiêu chuẩn và các thành phần dữ liệu để kết nối với Fleet Engine. Thành phần này cho phép bạn cung cấp trải nghiệm theo dõi vận chuyển dạng ảnh động, có thể tuỳ chỉnh từ web hoặc ứng dụng dành cho thiết bị di động.
Triển khai tính năng theo dõi quá trình vận chuyển của riêng bạn ngoài Fleet Engine Deliveries API.
Điều quan trọng là 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 giao hàng, thì mọi lệnh gọi Fleet Engine Deliveries API đều chỉ trả về thông tin liên quan đến người vận chuyển hoặc người nhận. Mọi thông tin khác trong câu trả lời đều bị loại bỏ. Bạn chịu trách nhiệm xác thực người dùng cuối. Ngoài ra, thông tin vị trí sẽ được lọc dựa trên tác vụ đã được thực hiện. Trong tác vụ không hoạt động, thông tin vị trí sẽ không được chia sẻ với người dùng cuối.
Ghi nhật ký
Bạn có thể thiết lập Fleet Engine để gửi nhật ký RPC đến Cloud Logging. Để biết thêm thông tin, hãy xem phần Ghi nhật ký.
Vai trò và mã thông báo uỷ quyền
Như mô tả trong phần Quản lý vòng đời công việc và xe và ghi chú uỷ quyền cho từng trường hợp sử dụng, 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 xác thực tài khoản dịch vụ. Tài khoản dịch vụ được dùng để cấp các mã thông báo đó có thể có một hoặc nhiều vai trò, 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 các sự cố thường gặp
Hãy xem các phần sau đây để được trợ giúp nếu bạn gặp bất kỳ vấn đề nào.
Khả năng phục hồi
Fleet Engine không được coi là nguồn đáng tin cậy. Bạn chịu 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 các ứng dụng khách để hệ thống tự khắc phục nếu có lỗi. Ví dụ: Khi cố gắng cập nhật một chiếc xe, Fleet Engine có thể phản hồi kèm theo thông báo lỗi cho biết rằng xe không tồn tại. Sau đó, ứng dụng sẽ tạo lại xe ở trạng thái mới. Mặc dù vấn đề này hiếm khi xảy ra, nhưng hãy đảm bảo hệ thống của bạn có đủ khả năng xử lý.
Trong tình huống hiếm gặp xảy ra lỗi nghiêm trọng 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 xe và nhiệm vụ. Nếu tỷ lệ tạo quá cao, một số yêu cầu có thể lại không thực hiện được do vấn đề về hạn mức vì việc kiểm tra hạn mức được thực hiện để 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 làm chậm tỷ lệ tạo lại bằng cách sử dụng chiến lược thời gian đợi để thử lại.
Trạng thái bị mất trong ứng dụng dành cho người lái xe
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 rằng các tác vụ đó tồn tại và khôi phục trạng thái hiện tại. Ứng dụng cũng nên tạo lại và đặt rõ danh sách các điểm dừng cho SDK trình điều khiển.
Câu hỏi thường gặp
Điều gì sẽ xảy ra nếu người lái xe dừng lại vì đang thực hiện một nhiệm vụ không đúng thứ tự?
Trong trường hợp này, trước tiên, hãy cập nhật thứ tự của các tác vụ rồi tiếp tục như bình thường, đánh dấu việc đến điểm dừng, hoàn thành tác vụ và các thông tin chi tiết khác. Nếu bạn không làm như vậy, hệ thống có thể trở nên không nhất quán, ETA có thể không chính xác và các lỗi không mong muốn có thể được báo cáo.