이 문서에서는 다음 사항에 대해 잘 알고 있다고 가정합니다.
Fleet Engine Essentials의 예약된 작업에 설명된 대로 작업을 만들고 이를 차량 정류장과 연결하여 운전자가 작업을 완료할 수 있도록 작업과 차량이 정차할 것으로 예상되는 위치 간의 실제 연결을 모델링합니다.
그런 다음 Fleet Engine에 업데이트를 전송하여 작업 여정 전반에서 최상의 경로 지정 및 상태 업데이트를 수행할 수 있도록 작업의 수명 주기 전반에서 작업 진행 상황을 관리합니다. 이렇게 하는 한 가지 주요 방법은 차량이 정류장에 접근하고, 도착하고, 정류장을 떠날 때 차량 정류장을 업데이트하는 것입니다. 이를 통해 Fleet 운영자와 최종 사용자 모두에게 작업 진행 상황에 관한 보고 및 분석을 제공할 수 있습니다. 이러한 상태 업데이트는 다음과 같습니다.
- 이동 중:
VehicleStop의STATEenum은ENROUTE를 사용하여 정류장이 차량 여정의 목록에서 다음 정류장임을 나타냅니다. 작업의 관점에서 이는 정류장과 연결된 모든 작업이 완료할 목록에서 다음 작업임을 의미합니다. - 도착함:
STATEenum은VehicleStop를 사용하여 차량이 정류장에 도착했음을 나타냅니다.ARRIVED작업의 관점에서 이는 정류장과 연결된 모든 작업이 활발히 진행 중임을 의미합니다. - 완료됨: 차량의 정류장 목록에서 정류장을 삭제하여 정류장을 완료로 표시합니다. 이렇게 하면 Fleet Engine에서 연결된 모든 작업을 자동으로 CLOSED로 표시합니다. 작업 종료에 관한 자세한 내용은 작업 종료를 참고하세요.
이 문서에서는 서버 측 접근 방식을 사용하여 정류장 상태를 업데이트하는 방법을 설명합니다. 신뢰할 수 있는 기기를 사용하여 운전자에게 작업을 관리할 수 있는 기능을 제공하는 경우 운전자 앱에서 이 작업을 실행할 수도 있습니다. 경합 상태를 방지하고 단일 소스의 진실을 유지하려면 한 가지 방법만 사용하세요.
차량이 정류장으로 이동 중
차량이 다음 정류장으로 이동을 시작하면 시스템에서 Fleet Engine에 알림을 보내야 합니다. 이렇게 하면 도착 예정 시간 및 경로 계산이 개선됩니다.
정류장 업데이트에 필요한 필드
Fleet Engine은 알림을 위해 항목의 다른 모든 필드를 무시합니다.
| 필드 | 값 |
|---|---|
remainingVehicleJourneySegments
|
상태가 State.NEW로 표시된 나머지 차량 정류장 목록입니다. |
정류장으로 이동 중 예시
다음 예시에서는 차량이
다음 정류장으로 이동 중임을 Fleet Engine에 알리는 방법을 Java gRPC 라이브러리 또는 HTTP
REST 호출을 사용하여 보여줍니다.다른 모든 정류장은 새로 표시됩니다.UpdateDeliveryVehicle
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Next stop marked as ENROUTE
.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.ENROUTE)))
// All other stops marked as 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 updateDeliveryVehicleRequest =
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 웹 토큰에 설명된 가이드라인에 따라 발급합니다.
- 요청 본문에는
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": "ENROUTE",
"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
차량이 정류장에 도착함
차량이 정류장에 도착하면 Fleet Engine에 알려야 합니다.
정류장 업데이트에 필요한 필드
Fleet Engine은 알림을 위해 항목의 다른 모든 필드를 무시합니다.
| 필드 | 값 |
|---|---|
remainingVehicleJourneySegments
|
상태가 State.NEW로 표시된 나머지 차량 정류장 목록입니다. |
정류장에 도착함 예시
다음 예시에서는 Java gRPC 라이브러리 또는 UpdateDeliveryVehicle에 대한 HTTP REST 호출을 사용하여 차량이 정류장에 도착했음을 Fleet Engine에 알리는 방법을 보여줍니다. 다른 모든 정류장은 새로 표시됩니다.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Marking the arrival at stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as 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))) // Remaining stops must be NEW.
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
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 웹 토큰에 설명된 가이드라인에 따라 발급합니다.
- 요청 본문에는
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": "ARRIVED",
"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
차량이 정류장을 완료함
차량이 정류장을 완료하면 Fleet Engine에 알려야 합니다. 이렇게 하면 정류장과 연결된 모든 작업이 CLOSED 상태로 설정됩니다.
정류장 업데이트에 필요한 필드
Fleet Engine은 알림을 위해 항목의 다른 모든 필드를 무시합니다.
| 필드 | 값 |
|---|---|
remainingVehicleJourneySegments |
상태가 State.NEW로 표시된 나머지 차량 정류장 목록입니다. 목록의 첫 번째 정류장은 상태가 State.ENROUTE로 표시되어야 합니다. |
정류장 완료 예시
다음 예시에서는 Java gRPC 라이브러리 또는 UpdateDeliveryVehicle에 대한 HTTP REST 호출을 사용하여 차량이 정류장에 도착했음을 Fleet Engine에 알리는 방법을 보여줍니다. 다른 모든 정류장은 새로 표시됩니다.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// This stop has been completed and is commented out to indicate it
// should be removed from the list of vehicle journey segments.
// .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
// .setStop(VehicleStop.newBuilder()
// .setPlannedLocation(LocationInfo.newBuilder()
// .setPoint(LatLng.newBuilder()
// .setLatitude(37.7749)
// .setLongitude(122.4194)))
// .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
// .setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as NEW.
// The next stop could be marked as ENROUTE if the vehicle has begun
// its journey to the next stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // Next 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 updateDeliveryVehicleRequest =
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=remaining_vehicle_journey_segments`
- <id> 는 작업의 고유 식별자입니다.
- 요청 헤더에는 Authorization 필드가 Bearer <token> 값과 함께 포함되어야 합니다. 여기서 <token> 은 서버에서 서비스 계정 역할 및 JSON 웹 토큰에 설명된 가이드라인에 따라 발급합니다.
- 요청 본문에는
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.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM