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