本文档假定您熟悉以下内容:
在实际配送场景中,企业会将配送任务分配给驾驶员,驾驶员然后使用车辆在计划的地点将送货任务交付给收件人,例如建筑群中的住宅或送货室。您可以在 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 库和对 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