В этом документе предполагается, что вы знаете, как создавать и использовать задачи. В нем приводятся конкретные примеры того, как завершить задачи по отгрузке, следующим образом:
Закрыть задачу. Статус задачи по доставке изменится на
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 |
Временная метка, указывающая, когда задача была выполнена. |
Примеры результатов выполнения задач
В примере ниже показано, как использовать библиотеку 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;
}
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