W tym dokumencie zakładamy, że znasz te zagadnienia:
- [Tworzenie zadań związanych z przesyłką][1]
- Wprowadzenie do [zaplanowanych zadań][3], które szczegółowo opisuje relacje między zadaniami, przystankami i pojazdami.
Jak opisano w sekcji [Zaplanowane zadania][3] w Podstawach Fleet Engine, tworzysz zadania i powiązujesz je z przystankiem pojazdu, aby modelować rzeczywiste powiązanie między zadaniem a lokalizacją, w której pojazd ma się zatrzymać, aby kierowca mógł wykonać zadanie.
Następnie możesz zarządzać postępem zadań przez cały ich cykl życia, wysyłając aktualizacje do Fleet Engine, aby usługa mogła jak najlepiej wyznaczać trasy i aktualizować stan podczas realizacji zadania. Jednym z głównych sposobów jest aktualizowanie przystanku, gdy pojazd się do niego zbliża, przyjeżdża na niego i odjeżdża. Umożliwia to raportowanie i analizowanie postępów zadania zarówno dla operatorów floty, jak i użytkowników. Aktualizacje stanu:
- W drodze: typ wyliczeniowy
STATEdlaVehicleStopużywaENROUTE, aby wskazać, że przystanek jest następny na liście planu podróży pojazdu. Z perspektywy zadania oznacza to, że każde zadanie powiązane z przystankiem jest następne na liście do wykonania. - Arrived: typ wyliczeniowy
STATEdlaVehicleStopużywaARRIVED, aby wskazać, że pojazd dotarł na przystanek. Z perspektywy zadania oznacza to, że wszystkie zadania powiązane z zatrzymaniem przestają być aktywnie wykonywane. - Ukończony: przystanek można oznaczyć jako ukończony, usuwając go z listy przystanków pojazdu. Gdy to zrobisz, Fleet Engine automatycznie oznaczy wszystkie powiązane zadania jako ZAMKNIĘTE. Więcej informacji o zamykaniu zadań znajdziesz w artykule [Finalizowanie zadań][4].
W tym dokumencie opisano, jak aktualizować stan przystanku za pomocą metod po stronie serwera. Możesz to też zrobić w aplikacji kierowcy, jeśli umożliwisz kierowcy zarządzanie zadaniami za pomocą zaufanego urządzenia. Używaj tylko jednej metody, aby uniknąć sytuacji wyścigu i zachować jedno źródło wiarygodnych danych.
Pojazd jest w drodze do przystanku
System powinien powiadomić Fleet Engine, gdy pojazd rozpocznie nawigację do następnego przystanku. Poprawi to obliczenia szacowanego czasu dotarcia na miejsce i trasy.
Pola wymagane w przypadku aktualizacji przystanków
Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.
| Pole | Wartość |
|---|---|
remainingVehicleJourneySegments
|
Lista pozostałych przystanków pojazdu ze stanami oznaczonymi jako State.NEW. |
Przykład trasy do przystanku
Poniższe przykłady pokazują, jak powiadomić Fleet Engine, że pojazd jest w drodze do następnego przystanku, za pomocą [biblioteki gRPC w języku Java][5] lub wywołania HTTP REST do UpdateDeliveryVehicle.Wszystkie pozostałe przystanki są oznaczone jako nowe.
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> to unikalny identyfikator zadania.
- Nagłówek żądania musi zawierać pole Authorization z wartością Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w sekcjach [Role konta usługi][6] i [Tokeny internetowe JSON][6].
- Treść żądania musi zawierać encję
DeliveryVehicle:
Przykładowe polecenie 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
placeidtrips1: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#locationinfo placeidtrips2: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html placeidtrips3: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#maps.fleetengine.delivery.v1.LocationInfo.FIELDS.string.maps.fleetengine.delivery.v1.LocationInfo.place placeidtrips4: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html#FIELDS.place
Pojazd przyjeżdża na przystanek
Fleet Engine musi otrzymać powiadomienie, gdy pojazd dotrze do przystanku.
Pola wymagane w przypadku aktualizacji przystanków
Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.
| Pole | Wartość |
|---|---|
remainingVehicleJourneySegments
|
Lista pozostałych przystanków pojazdu ze stanami oznaczonymi jako State.NEW. |
Przykład przyjazdu na przystanek
Poniższe przykłady pokazują, jak powiadomić Fleet Engine o przybyciu pojazdu na przystanek za pomocą [biblioteki gRPC w języku Java][5] lub wywołania HTTP REST do UpdateDeliveryVehicle. Wszystkie pozostałe przystanki są oznaczone jako nowe.
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> to unikalny identyfikator zadania.
- Nagłówek żądania musi zawierać pole Authorization z wartością Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w sekcjach [Role konta usługi][6] i [Tokeny internetowe JSON][6].
- Treść żądania musi zawierać encję
DeliveryVehicle:
Przykładowe polecenie 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
Pojazd zatrzymuje się.
Gdy pojazd zakończy postój, należy powiadomić o tym Fleet Engine. Spowoduje to ustawienie wszystkich zadań powiązanych z przystankiem na stan ZAMKNIĘTE.
Pola wymagane w przypadku aktualizacji przystanków
Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.
| Pole | Wartość |
|---|---|
remainingVehicleJourneySegments |
Lista pozostałych przystanków pojazdu ze stanami oznaczonymi jako State.NEW. Pierwszy przystanek na liście musi mieć stan oznaczony jako State.ENROUTE. |
Przykład zatrzymania
Poniższe przykłady pokazują, jak powiadomić Fleet Engine o przybyciu pojazdu na przystanek za pomocą [biblioteki gRPC w języku Java][5] lub wywołania HTTP REST do UpdateDeliveryVehicle. Wszystkie pozostałe przystanki są oznaczone jako nowe.
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> to unikalny identyfikator zadania.
- Nagłówek żądania musi zawierać pole Authorization z wartością Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w sekcjach [Role konta usługi][6] i [Tokeny internetowe JSON][6].
- Treść żądania musi zawierać encję
DeliveryVehicle:
Przykładowe polecenie 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
placeidtrips1: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#locationinfo placeidtrips2: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html placeidtrips3: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#maps.fleetengine.delivery.v1.LocationInfo.FIELDS.string.maps.fleetengine.delivery.v1.LocationInfo.place placeidtrips4: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html#FIELDS.place
Co dalej?
- [Finalize tasks][4]
[1]: /maps/documentation/mobility/fleet-engine/journeys/tasks/create-shipment-tasks [3]: /maps/documentation/mobility/fleet-engine/essentials/tasks-intro [4]: /maps/documentation/mobility/fleet-engine/journeys/tasks/finalize-tasks [5]: /maps/documentation/mobility/fleet-engine/essentials/client-libraries-tasks [6]: /maps/documentation/mobility/fleet-engine/essentials/set-up-fleet/service-accounts