本文档假定您熟悉以下内容:
在实际配送场景中,企业会将配送运输任务分配给司机,然后司机会使用车辆将其配送到预定的地点(例如住宅或大型建筑物的送货室)的收货人手中。您 通过创建任务并发出送货车辆,在 Fleet Engine 中对此进行建模 更新请求,后者随后使用停靠点列表更新车辆实体, 旅行。为每个停靠站分配一个在停靠站上完成的任务列表。
您可以随时更新车辆任务,不过,您通常需要在 以下用途:
- 安排任务让车辆完成。您可以执行以下任一操作 通过向车辆添加新经停点的更新请求,或通过更新 请求将新任务添加到现有停靠站。
- 更新与指定车辆停靠站相关联的现有任务的顺序。
- 更改任务完成位置。默认情况下,Fleet Engine 将任务完成位置标记为与车辆停靠站相同的位置 与任务相关联。如果您愿意,可以指定具体的地理位置 以执行单个任务例如,您可以让车辆在大型公寓停靠,以配送多个包裹,每个包裹都分配了特定的邮件递送室。
- 关闭之前分配的所有任务,让这些任务不再更新 排序。如需了解详情,请参阅完成任务。
安排或更改递送任务
您可以通过任一服务器安排或更改分配给车辆的任务 或者使用驱动程序 SDK(如果您为驱动程序提供 使用可信设备管理任务。请仅使用一种方法,以避免出现竞态条件并保持单一信息源。
如需将运输任务从一辆车改为另一辆车,请关闭原始任务并重新创建该任务,然后再将其分配给其他车辆。如果您更新 来包含已分配给其他任务的任务 您收到错误消息。
更新任务的必填字段
本部分介绍了在为管理员更新任务时 。未提供任何可选字段。Fleet 引擎会忽略实体中的所有其他字段进行更新。
必需字段 | 值 |
---|---|
remainingVehicleJourneySegments |
按执行顺序排列任务的过程细分列表。 列表中的第一个任务最先执行。 |
remainingVehicleJourneySegments[i].stop |
列表中任务 i 的停止点。 |
remainingVehicleJourneySegments[i].stop.plannedLocation |
计划的经停点位置。 |
remainingVehicleJourneySegments[i].stop.tasks |
要在此车辆停靠站执行的任务列表。 |
remainingVehicleJourneySegments[i].stop.state |
State.NEW |
分配任务示例
以下示例展示了如何使用 Java gRPC 库和 HTTP
对 UpdateDeliveryVehicle
进行 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> 是您的车队中送货车辆的唯一标识符 您打算更新其任务排序时。它是一个标识符 。
请求标头必须包含字段 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