Для работы с этим документом необходимо знать следующее:
- Как создавать задачи по доставке
- Введение в запланированные задачи, в котором подробно рассказывается о взаимосвязи между задачами, остановками и транспортными средствами.
В реальном сценарии доставки компании назначают задачи по доставке грузов водителям, которые затем используют транспортное средство для доставки их получателю в запланированное место, например в жилое помещение или в комнату доставки в комплексе зданий. В Fleet Engine это можно сделать, создав задачу и отправив запрос на обновление транспортного средства, который обновит объект транспортного средства, добавив в него список остановок. Вы назначаете каждой остановке список задач, которые необходимо выполнить на этой остановке.
Обновлять задачи транспортного средства можно в любое время, но обычно это делается в следующих целях:
- Планировать задачи для транспортного средства. Это можно сделать с помощью запроса на обновление, который добавляет новую остановку в маршрут транспортного средства, или запроса на обновление, который добавляет новую задачу в существующую остановку.
- Изменить порядок существующих задач, связанных с определенной остановкой транспортного средства.
- Изменить место выполнения задачи. По умолчанию Fleet Engine отмечает место завершения задачи как то же место, что и остановка транспортного средства, связанная с задачей. При желании вы можете указать местоположение для каждой задачи. Например, транспортное средство может остановиться у большого комплекса, чтобы доставить несколько посылок, каждая из которых предназначена для определенной комнаты доставки почты.
- Закройте все ранее назначенные задачи, чтобы они не попали в обновленный порядок. Подробнее о том, как завершать задачи…
Как запланировать или изменить задачи доставки
Вы можете запланировать или изменить задачи, назначенные транспортному средству, в серверной среде или с помощью Driver SDK, если вы предоставили водителю возможность управлять задачами с помощью надежного устройства. Используйте только один метод, чтобы избежать конфликтов и поддерживать единый источник достоверных данных.
Чтобы перенести доставку из одного автомобиля в другой, закройте исходную задачу и создайте ее заново, а затем назначьте другому автомобилю. Если вы добавите в транспортное средство задачу, которая уже назначена другому транспортному средству, появится сообщение об ошибке.
Обязательные поля для обновления задач
В этом разделе описаны обязательные поля, которые необходимо задать при обновлении задачи для транспортного средства. Необязательные поля не указаны. Fleet Engine игнорирует все остальные поля объекта при обновлении.
| Обязательное поле | Значение |
|---|---|
remainingVehicleJourneySegments |
Список сегментов маршрута для задач в порядке их выполнения. Первая задача в списке выполняется первой. |
remainingVehicleJourneySegments[i].stop |
Остановка для задачи i в списке. |
remainingVehicleJourneySegments[i].stop.plannedLocation |
Планируемое место остановки. |
remainingVehicleJourneySegments[i].stop.tasks |
Список задач, которые необходимо выполнить на этой остановке. |
remainingVehicleJourneySegments[i].stop.state |
State.NEW |
Пример назначения задач
В приведенных ниже примерах показано, как использовать библиотеку gRPC для Java и вызов HTTP REST для UpdateDeliveryVehicle, чтобы добавить две новые задачи для автомобиля.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 1st stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.NEW)))
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 2nd stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW)))
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} 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>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id> – уникальный идентификатор транспортного средства в вашем автопарке, для которого вы хотите изменить порядок выполнения задач. Это идентификатор, который вы указали при создании транспортного средства.
Заголовок запроса должен содержать поле Authorization со значением Bearer <token>, где <token> – токен, выданный вашим сервером в соответствии с инструкциями, приведенными в разделах Роли сервисных аккаунтов и Веб-токены JSON.
Тело запроса должно содержать объект
DeliveryVehicle.
Пример команды curl:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM