Завершить задачи

В этом документе предполагается, что вы знаете, как создавать и использовать задачи. В нём приведены конкретные примеры завершения задач по отгрузке, как показано ниже:

  • Закрытие задачи : Закрытие задачи по отгрузке изменяет ее состояние на CLOSED и указывает на то, что эта задача больше не активна.

  • Задайте результат задачи : после закрытия задачи вы завершаете её, устанавливая значение результата SUCCEEDED или FAILED . Это важный этап завершения задачи, позволяющий отобразить результат доставки в системе совместного использования поездок и обеспечить корректный счёт за услугу Fleet Engine.

Закрыть задачу

Закрыть задачу можно следующими способами:

  • Обновите статус остановки для транспортного средства . Вы удаляете остановку из транспортного средства, что, в свою очередь, закрывает все задачи, связанные с ней. Подробнее см. в разделе «Обновление статуса остановки» .
  • Удалить задачу из списка остановок транспортного средства . Это включает обновление списка задач для остановки, но закрытая задача больше не будет в нём. См. раздел «Обновление порядка задач» в разделе «Обновление задач» .
  • Установите состояние задачи на CLOSED . Это можно сделать только для задач, не назначенных на транспортные средства. В этом разделе показан такой подход.

Закрыв задачу, вы не сможете открыть ее повторно.

Закрытие задачи не означает её успешное или неудачное выполнение . Это означает, что задача больше не считается выполняемой. Чтобы указать фактический результат задачи и отобразить его для отслеживания автопарка и совместного использования поездок, необходимо указать фактический результат задачи. См. раздел «Установка результата задачи» ниже.

Поля задач для закрытия задач

В этом разделе описаны обязательные поля, которые необходимо заполнить при закрытии задачи. Система Fleet Engine игнорирует все остальные поля сущности при обновлении.

Обязательное поле Ценить
state State.CLOSED

Закрыть задачу напрямую

В следующих примерах показано, как перевести неназначенную задачу в закрытое состояние либо в gRPC, либо с помощью HTTP-запроса REST к 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;
 }

ОТДЫХ

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

  • <id> — уникальный идентификатор задачи.
  • Заголовок запроса должен содержать поле Authorization со значением Bearer <token> , где <token> выдается вашим сервером в соответствии с рекомендациями, описанными в разделе Роли учетных записей служб и веб-токены JSON .
  • Необходимо включить объект Task в тело запроса.

Пример команды 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

Установите результат задачи

Чтобы указать фактический результат задачи, задайте для закрытых задач значение SUCCEEDED или FAILED . Задача должна быть закрыта, прежде чем вы укажете её результат. Fleet Engine взимает плату только за задачи доставки со статусом SUCCEEDED .

Подробности результата задачи

Задачи также предоставляют дополнительную информацию о результатах выполнения. Вы можете задать эти данные напрямую, и Fleet Engine учтёт ваши настройки:

  • Место выполнения задачи : Fleet Engine автоматически заполняет место выполнения задачи последним известным местоположением транспортного средства. Вы можете указать его, если хотите.
  • Время выполнения задачи : Fleet Engine не заполняет это поле, но вы можете его задать.

Для настройки task_outcome_location и task_outcome_time можно использовать любой из следующих подходов:

  • Обновите их в том же запросе , который устанавливает результат задачи.
  • Обновите их позже , после того как определите результат задачи.
  • Измените их снова после того, как они были установлены.

Fleet Engine предотвращает следующие обновления, связанные с результатами задач:

  • Вы не сможете изменить результат задачи, если ему присвоено значение SUCCEEDED или FAILED .
  • Для задач без установленного результата невозможно установить место или время выполнения задачи .

Поля задач для установки результата

В этом разделе описаны обязательные и необязательные поля, которые необходимо заполнить при настройке результата задачи. Fleet Engine игнорирует другие поля сущности при обновлении.

Обязательное поле Ценить
taskOutcome Outcome.SUCCEEDED или Outcome.FAILED

Необязательное поле Ценить
taskOutcomeLocation Место выполнения задачи. Если не указано, Fleet Engine по умолчанию использует местоположение последнего транспортного средства.
taskOutcomeTime Временная метка завершения задачи.

Примеры результатов задач

В следующем примере показано, как использовать библиотеку Java gRPC и вызов HTTP REST для UpdateTask , чтобы задать результат задачи как SUCCEEDED и указать место, где задача была завершена.

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

ОТДЫХ

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

  • <id> — уникальный идентификатор задачи.
  • Заголовок запроса должен содержать поле Authorization со значением Bearer <token> , где <token> выдается вашим сервером в соответствии с рекомендациями, описанными в разделе Роли учетных записей служб и веб-токены JSON .
  • Тело запроса должно содержать сущность 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

Что дальше?