本文档假定您熟悉以下内容:
在实际配送场景中,企业会将配送运输任务分配给司机,然后司机会使用车辆将其配送到预定的地点(例如住宅或大型建筑群中的送货室)的收货人手中。您可以在 Fleet Engine 中对此进行建模,方法是创建任务并发出送货车辆更新请求,然后使用要经过的停靠点列表更新车辆实体。您可以为每个经停点分配要在该经停点完成的任务列表。
您可以随时更新车辆任务,但通常出于以下目的进行更新:
- 安排任务让车辆完成。为此,您可以使用向车辆添加新经停点的更新请求,或向现有经停点添加新任务的更新请求。
- 更新与指定车辆停靠站相关联的现有任务的顺序。
- 更改任务完成位置。默认情况下,Fleet Engine 会将任务完成位置标记为与任务关联的车辆停靠站所在的位置。如果您愿意,可以为各项任务指定特定位置。例如,您可能在一个大型综合体需要一个车辆经停,以便递送大量包裹,并为每个包裹分配一个特定的邮件递送室。
- 关闭之前分配的所有任务,使其不按更新顺序排列。如需了解详情,请参阅最终处理任务。
安排或更改递送任务
您可以从服务器环境安排或更改分配给车辆的任务,也可以使用 Driver SDK(前提是您为驾驶员提供了使用受信任设备管理任务的功能)。请只使用一种方法,以便避免出现竞态条件并保持单一可信来源。
如需将运单从一种车辆更改为另一种车辆,请关闭原始任务并重新创建该任务,然后再分配给其他车辆。如果您更新交付车辆以包含已分配给其他车辆的任务,则会收到错误消息。
更新任务的必填字段
本部分介绍了更新车辆任务时需要设置的必需字段。未提供任何选填字段。Fleet 引擎会忽略实体中的所有其他字段进行更新。
必需字段 | 值 |
---|---|
remainingVehicleJourneySegments |
按执行顺序排列任务的过程细分列表。列表中的第一个任务最先执行。 |
remainingVehicleJourneySegments[i].stop |
列表中任务 i 的停止时间。 |
remainingVehicleJourneySegments[i].stop.plannedLocation |
相应经停点的预计位置。 |
remainingVehicleJourneySegments[i].stop.tasks |
要在此车辆停靠站执行的任务列表。 |
remainingVehicleJourneySegments[i].stop.state |
State.NEW |
分配任务示例
以下示例展示了如何使用 Java gRPC 库和对 UpdateDeliveryVehicle
的 HTTP REST 调用来为车辆添加两项新任务。
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> 是您要为其更新任务排序的车队中交付车辆的唯一标识符。它是您在创建车辆时指定的标识符。
请求标头必须包含值为 Bearer <token> 的 Authorization 字段,其中 <token> 由您的服务器根据服务账号角色和 JSON Web 令牌中所述的准则发出。
请求正文必须包含
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