Hoàn tất việc cần làm

Tài liệu này giả định rằng bạn hiểu cách tạo và sử dụng các tác vụ. Chiến dịch này cung cấp ví dụ cụ thể về cách hoàn tất nhiệm vụ vận chuyển như sau:

  • Đóng nhiệm vụ: Việc đóng nhiệm vụ vận chuyển sẽ thay đổi trạng thái của nhiệm vụ thành CLOSED và cho biết rằng tác vụ đó không còn hoạt động.

  • Đặt kết quả của tác vụ: Sau khi đóng một tác vụ, bạn sẽ hoàn tất tác vụ đó bằng cách đặt kết quả của tác vụ thành SUCCEEDED hoặc FAILED. Đây là một thông tin quan trọng một phần của việc hoàn tất tác vụ để cho thấy kết quả phân phối trong hành trình chia sẻ dữ liệu và đảm bảo thanh toán chính xác cho dịch vụ Fleet Engine.

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

Bạn có thể đóng tác vụ theo các cách sau:

  • Cập nhật trạng thái dừng của xe. Bạn xóa điểm dừng khỏi xe sẽ đóng tất cả các nhiệm vụ liên quan đến điểm dừng. Xem Cập nhật trạng thái dừng để biết thông tin chi tiết.
  • Xoá nhiệm vụ khỏi danh sách điểm dừng xe. Việc này bao gồm việc cập nhật danh sách tác vụ cho điểm dừng, nhưng với tác vụ đã đóng thì không khỏi danh sách. Hãy xem mục Cập nhật thứ tự công việc trong phần Cập nhật việc cần làm.
  • Đặt trạng thái của tác vụ thành CLOSED. Bạn chỉ có thể thực hiện thao tác này đối với những việc cần làm được gán cho xe. Phần này trình bày phương pháp này.

Sau khi đóng một việc cần làm, bạn không thể mở lại nó.

Việc đóng một tác vụ không cho biết tác vụ đó có thành công hay không. Điều đó cho biết rằng tác vụ không còn được coi là đang diễn ra. Để cho biết kết quả thực tế của một nhiệm vụ và để hiển thị kết quả đó cho mục đích Theo dõi đội xe và chia sẻ hành trình, bạn phải cho biết kết quả thực tế của một nhiệm vụ. Xem Đặt kết quả tác vụ ở bên dưới.

Các trường tác vụ để đóng tác vụ

Phần này ghi lại các trường bắt buộc cần đặt khi đóng công việc. Công cụ Fleet sẽ bỏ qua mọi trường khác trong thực thể để cập nhật.

Trường bắt buộc Giá trị
state State.CLOSED

Đóng việc cần làm ngay

Các ví dụ sau đây minh hoạ cách đặt một tác vụ chưa được giao thành trạng thái đóng, trong gRPC hoặc sử dụng lệnh gọi yêu cầu HTTP REST đến UpdateTask

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)

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 tác vụ.
  • Tiêu đề yêu cầu phải chứa một trường Uỷ quyền có giá trị Mã <token>, trong đó <token> do máy chủ của bạn cấp theo nguyên tắc nêu trong phần Vai trò trong tài khoản dịch vụMã thông báo web JSON.
  • Bạn phải thêm thực thể Task vào nội dung yêu cầu

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 +"%Y-%m-%dT%H:%M:%SZ")"
 }
 EOM

Đặt kết quả tác vụ

Để cho biết kết quả thực tế của một nhiệm vụ, bạn cần đặt kết quả cho các nhiệm vụ đã đóng đến SUCCEEDED hoặc FAILED. Bạn phải đóng một công việc trước khi đặt kết quả. Công cụ của đội xe chỉ tính phí cho các nhiệm vụ phân phối có trạng thái là SUCCEEDED.

Thông tin chi tiết về kết quả của việc cần làm

Nhiệm vụ cũng cung cấp thêm thông tin chi tiết về kết quả của nhiệm vụ. Bạn có thể đặt và Fleet Engine sẽ tôn trọng các chế độ cài đặt của bạn:

  • Vị trí kết quả nhiệm vụ: Fleet Engine tự động điền vào nhiệm vụ vị trí của kết quả cùng với vị trí chiếc xe đã biết gần đây nhất. Bạn có thể cung cấp địa chỉ này nếu muốn.
  • Thời gian kết quả tác vụ: Công cụ của Fleet không điền trường này nhưng bạn có thể đặt trường này.

Bạn có thể dùng một trong những phương pháp sau để thiết lập task_outcome_locationtask_outcome_time:

  • Cập nhật các biến trong cùng một yêu cầu để đặt kết quả cho tác vụ.
  • Cập nhật sau, sau khi bạn đặt kết quả của nhiệm vụ.
  • Hãy sửa đổi lại sau khi đặt các giá trị này.

Fleet Engine ngăn chặn những nội dung cập nhật sau đây liên quan đến kết quả của nhiệm vụ:

  • Bạn không thể sửa đổi kết quả của một nhiệm vụ sau khi đặt thành SUCCEEDED hoặc FAILED.
  • Bạn không thể đặt vị trí kết quả nhiệm vụ hoặc thời gian kết quả cho các nhiệm vụ không có một kết quả đặt ra.

Trường tác vụ để đặt kết quả

Phần này ghi lại các trường bắt buộc và không bắt buộc cần đặt khi thiết lập kết quả tác vụ. Công cụ của Fleet sẽ bỏ qua các trường khác trong thực thể để cập nhật.

Trường bắt buộc Giá trị
taskOutcome Outcome.SUCCEEDED hoặc Outcome.FAILED

Trường không bắt buộcGiá 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, thì Fleet Engine đặt mặc định vị trí của chiếc xe gần đây nhất.
taskOutcomeTime Dấu thời gian khi công việc hoàn tất.

Ví dụ về kết quả nhiệm vụ

Ví dụ sau đây cho biết cách sử dụng thư viện gRPC Java và lệnh gọi HTTP REST đến UpdateTask để đặt kết quả của tác vụ thành SUCCEEDED và đặt vị trí hoàn thành tác vụ.

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)
   .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)

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

  • &lt;id&gt; là giá trị nhận dạng duy nhất của tác vụ.
  • Tiêu đề yêu cầu phải chứa một trường Uỷ quyền có giá trị Mã <token>, trong đó <token> do máy chủ của bạn cấp theo nguyên tắc nêu trong phần Vai trò trong tài khoản dịch vụMã thông báo web JSON.
  • Nội dung yêu cầu phải chứa một thực thể Task.
 # 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 +"%Y-%m-%dT%H:%M:%SZ")",
   "taskOutcomeLocation": {
     "point": {
       "latitude": -6.195139,
       "longitude": 106.820826
     }
   }
 }
 EOM

Các bước tiếp theo