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

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

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

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

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

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

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

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

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

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

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

Обязательное поле Ценить
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

Что дальше