Данный документ предполагает ознакомление со следующими материалами:
- Создание задач по доставке
- Введение в раздел «Планируемые задачи» , в котором подробно рассматривается взаимосвязь между задачами, остановками и транспортными средствами.
В реальных условиях доставки компании назначают водителям задачи по доставке, которые затем с помощью транспортного средства доставляют груз получателю в запланированное место, например, в жилой дом или комнату для доставки в многоквартирном комплексе. В Fleet Engine это моделируется путем создания задачи и отправки запроса на обновление транспортного средства, который затем обновляет объект транспортного средства списком остановок. Каждой остановке назначается список задач, которые необходимо выполнить на этой остановке.
Вы можете обновлять задачи, связанные с транспортным средством, в любое время, но обычно это делается для следующих целей:
- Запланируйте выполнение задач транспортным средством. Это можно сделать либо с помощью запроса на обновление, добавляющего новую остановку к транспортному средству, либо с помощью запроса на обновление, добавляющего новую задачу к существующей остановке.
- Обновить порядок выполнения существующих задач, связанных с конкретной остановкой транспортного средства.
- Измените место завершения задачи. По умолчанию Fleet Engine отмечает место завершения задачи как то же самое место, что и остановка транспортного средства, связанная с задачей. При желании вы можете указать конкретные места для отдельных задач. Например, у вас может быть остановка транспортного средства у большого комплекса для доставки нескольких посылок, каждой из которых назначено определенное помещение для доставки почты.
- Закройте все ранее назначенные задачи , чтобы исключить их из обновленного порядка. Подробности см. в разделе «Завершение задач» .
Запланировать или изменить задачи по доставке
Вы можете планировать или изменять задачи, назначенные транспортному средству, либо из серверной среды, либо с помощью Driver SDK, если предоставите водителю возможность управлять задачами с помощью доверенного устройства. Используйте только один метод, чтобы избежать состояний гонки и поддерживать единый источник достоверной информации.
Чтобы перенаправить отгрузку с одного транспортного средства на другое, закройте исходное задание и создайте его заново, прежде чем назначать его другому транспортному средству. Если вы обновите транспортное средство доставки, добавив задание, которое уже назначено другому транспортному средству, вы получите ошибку.
Обязательные поля для обновления задач
В этом разделе описаны обязательные поля, которые необходимо задать при обновлении задачи для транспортного средства. Необязательные поля отсутствуют. Система управления автопарком игнорирует все остальные поля сущности при обновлении.
| Обязательное поле | Ценить |
|---|---|
remainingVehicleJourneySegments | Список этапов выполнения задач в порядке их необходимости. Первая задача в списке выполняется первой. |
remainingVehicleJourneySegments[i].stop | Остановка для задачи i в списке. |
remainingVehicleJourneySegments[i].stop.plannedLocation | Планируемое место остановки. |
remainingVehicleJourneySegments[i].stop.tasks | Список задач, которые необходимо выполнить на этой остановке для транспортных средств. |
remainingVehicleJourneySegments[i].stop.state | State.NEW |
Пример назначения задач
В следующих примерах показано, как использовать библиотеку Java gRPC и 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;
}
ОТДЫХ
PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id> — это уникальный идентификатор транспортного средства доставки в вашем автопарке, для которого вы планируете обновить данные о заказе. Это идентификатор, который вы указали при создании транспортного средства.
В заголовке запроса должно содержаться поле Authorization со значением Bearer <token> , где <token> выдается вашим сервером в соответствии с рекомендациями, описанными в разделах «Роли учетных записей служб» и «JSON Web tokens» .
В теле запроса должен содержаться объект
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