Завершение задач

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

  • Закрыть задачу. Закрытие задачи по доставке меняет ее статус на 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;
 }

REST

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 Временная метка, указывающая, когда задача была выполнена.

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

В примере ниже показано, как использовать библиотеку gRPC для Java и 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;
 }

REST

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

Дальнейшие действия