이 문서에서는 다음에 익숙하다고 가정합니다.
Fleet Engine Essentials의 예약된 작업에 설명된 대로, 운전자가 작업을 완료할 수 있도록 작업과 차량이 정차할 것으로 예상되는 위치 간의 실제 연결을 모델링하는 방법으로 작업을 만들고 차량 정류장과 연결합니다.
그런 다음 Fleet Engine이 작업 여정 중에 최적의 경로 설정 및 상태 업데이트를 실행할 수 있도록 Fleet Engine에 업데이트를 전송하여 수명 주기 전반에 걸쳐 작업 진행 상황을 관리합니다. 이를 수행하는 한 가지 주요 방법은 차량이 정류장에 접근하고, 정류장에 도착하고, 정류장을 떠날 때 차량 정류장을 업데이트하는 것입니다. 이를 통해 차량 운영자와 최종 사용자 모두 태스크 진행 상황을 보고하고 분석할 수 있습니다. 이러한 상태 업데이트는 다음과 같습니다.
- En route:
VehicleStop
의STATE
enum은ENROUTE
를 사용하여 정류장이 차량 경로 목록의 다음 정류장임을 나타냅니다. 태스크의 관점에서 보면 정지와 연결된 모든 태스크가 완료할 다음 작업 목록에 포함됩니다. - Arrived:
VehicleStop
의STATE
열거형은ARRIVED
를 사용하여 차량이 정류장에 도착했음을 나타냅니다. 태스크의 관점에서는 정류장과 연결된 모든 태스크가 활발하게 처리되고 있음을 의미합니다. - 완료됨: 차량의 정류장 목록에서 정류장을 삭제하여 정류장을 완료로 표시합니다. 이렇게 하면 Fleet Engine에서 자동으로 모든 관련 작업을 CLOSED(종료됨)로 표시합니다. 작업 종료에 관한 자세한 내용은 작업 완료를 참고하세요.
이 문서에서는 서버 측 접근 방식을 사용하여 중지 상태를 업데이트하는 방법을 설명합니다. 운전자에게 신뢰할 수 있는 기기를 사용하여 작업을 관리할 수 있는 기능을 제공하는 경우 운전자 앱에서도 이 작업을 할 수 있습니다. 경합 상태를 방지하고 단일 정보 소스를 유지할 수 있도록 하나의 메서드만 사용하세요.
차량이 정류장으로 이동 중
차량이 다음 정류장으로의 탐색을 시작하면 시스템에서 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
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>는 태스크의 고유 식별자입니다.
- 요청 헤더에는 값이 Bearer <token>인 Authorization 필드가 포함되어야 합니다. 여기서 <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>는 태스크의 고유 식별자입니다.
- 요청 헤더에는 값이 Bearer <token>인 Authorization 필드가 포함되어야 합니다. 여기서 <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에 알림을 전송해야 합니다. 이렇게 하면 정류장과 연결된 모든 작업이 '종료됨' 상태로 설정됩니다.
업데이트 중지 시 필수 입력란
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>는 태스크의 고유 식별자입니다.
- 요청 헤더에는 값이 Bearer <token>인 Authorization 필드가 포함되어야 합니다. 여기서 <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