本文档假定您熟悉以下内容:
在实际配送场景中,企业会将配送运输任务分配给司机,然后司机会使用车辆将其配送到预定的地点(例如住宅或大型建筑群中的送货室)的收货人手中。您可以在 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