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