本文档假定您熟悉以下内容:
在现实世界的配送场景中,企业会将配送任务分配给司机,然后司机使用车辆将任务配送到计划地点(例如住宅或建筑群中的配送室)的收件人手中。您可以在 Fleet Engine 中对此进行建模,方法是创建任务并发出配送车辆更新请求,然后使用要行驶的停靠点列表更新车辆实体。您为每个停靠点分配一个要在该停靠点完成的任务列表。
您可以随时更新车辆任务,但通常出于以下目的执行此操作:
- 安排任务 以供车辆完成。您可以通过向车辆添加新停靠点的更新请求,或通过向现有停靠点添加新任务的更新请求来执行此操作。
- 更新 与给定车辆停靠点关联的**现有任务的顺序** 。
- 更改任务完成地点。默认情况下,Fleet Engine 会将任务完成地点标记为与任务关联的车辆停靠点相同的地点。如果您愿意,可以为各个任务指定特定地点。例如,您可能有一个车辆停靠点位于大型建筑群,用于配送多个包裹,每个包裹都分配有一个特定的邮件配送室。
- 关闭任何先前分配的任务 ,以便将其排除在更新后的排序之外。如需了解详情,请参阅最终确定任务。
安排或更改配送任务
您可以从服务器环境安排或更改分配给车辆的任务,也可以使用 Driver SDK(如果您允许司机使用受信任的设备管理任务)。请仅使用一种方法,以避免出现竞态条件并维护单一的事实来源。
如需将配送任务从一辆车辆更改为另一辆车辆,请关闭原始任务 并重新创建该任务,然后再将其分配给其他车辆。如果您更新配送车辆以包含已分配给其他车辆的任务,则会收到错误。
更新任务的必填字段
本部分介绍了为车辆更新任务时需要设置的必填字段。未提供可选字段。Fleet Engine 会忽略实体中用于更新的所有其他字段。
| 必填字段 | 值 |
|---|---|
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;
}
REST
PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id> 是您车队中配送车辆的唯一标识符,您打算更新该车辆的任务排序。它是您在创建车辆时指定的标识符。
请求标头必须包含一个字段 Authorization,其值为 Bearer <token>,其中 <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