W tym dokumencie zakładamy, że znasz te zagadnienia:
- Tworzenie zadań dostawy
- Wprowadzenie do zadań zaplanowanych, które szczegółowo opisuje relacje między zadaniami, przystankami i pojazdami.
Jak wspomnieliśmy w sekcji Zadania zaplanowane w artykule Podstawy Fleet Engine, tworzysz zadania i przypisujesz je do przystanku 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 zarządzasz postępem zadań w całym ich cyklu życia, wysyłając aktualizacje do Fleet Engine, aby usługa mogła jak najlepiej wykonywać obliczenia trasy i aktualizacje stanu w trakcie realizacji zadania. Jednym z kluczowych sposobów na to jest aktualizowanie przystanku pojazdu, gdy pojazd zbliża się do przystanku, dociera do niego i go opuszcza. Umożliwia to raportowanie i analizowanie postępów zadań zarówno operatorom floty, jak i użytkownikom. Te aktualizacje stanu są następujące:
- W drodze: wyliczenie
STATEdlaVehicleStopużywa wartościENROUTE, aby wskazać, że przystanek jest następny na liście w planie podróży pojazdu. Z perspektywy zadania oznacza to, że każde zadanie powiązane z przystankiem jest następne na liście do wykonania. - Przybył: wyliczenie
STATEdlaVehicleStopużywa wartościARRIVED, aby wskazać że pojazd dotarł do przystanku. Z perspektywy zadania oznacza to, że każde zadanie powiązane z przystankiem jest aktywnie wykonywane. - Ukończono: aby oznaczyć przystanek jako ukończony, usuń 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 Kończenie zadań.
W tym dokumencie opisujemy, jak aktualizować stan przystanku za pomocą metod po stronie serwera. Możesz to też zrobić w aplikacji dla kierowców, jeśli umożliwisz kierowcy zarządzanie zadaniami za pomocą zaufanego urządzenia. Używaj tylko jednej metody, aby uniknąć wyścigów i zachować jedno źródło informacji.
Pojazd jest w drodze do przystanku
Gdy pojazd zacznie nawigować do następnego przystanku, Twój system powinien powiadomić o tym Fleet Engine. Poprawia to obliczenia szacowanego czasu dotarcia na miejsce i trasy.
Pola wymagane do aktualizacji przystanku
Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.
| Pole | Wartość |
|---|---|
remainingVehicleJourneySegments
|
Lista pozostałych przystanków pojazdu z ich stanami oznaczonymi jako State.NEW. |
Przykład powiadomienia o tym, że pojazd jest w drodze do przystanku
Poniższe przykłady pokazują, jak powiadomić Fleet Engine, że pojazd jest
w drodze do następnego przystanku, za pomocą biblioteki Java gRPC lub wywołania HTTP
REST do UpdateDeliveryVehicle.Wszystkie inne 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 sekcji Role kont usługi i tokeny JSON Web.
- Treść żądania musi zawierać encję
DeliveryVehicle:
Przykład polecenia 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
Pojazd dociera do przystanku
Gdy pojazd dotrze do przystanku, Fleet Engine musi zostać o tym powiadomiony.
Pola wymagane do aktualizacji przystanku
Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.
| Pole | Wartość |
|---|---|
remainingVehicleJourneySegments
|
Lista pozostałych przystanków pojazdu z ich stanami oznaczonymi jako State.NEW. |
Przykład powiadomienia o tym, że pojazd dotarł do przystanku
Poniższe przykłady pokazują, jak powiadomić Fleet Engine, że pojazd dotarł
do przystanku, za pomocą biblioteki Java gRPC lub wywołania HTTP REST do
UpdateDeliveryVehicle. Wszystkie inne 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 sekcji Role kont usługi i tokeny JSON Web.
- Treść żądania musi zawierać encję
DeliveryVehicle:
Przykład polecenia 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 kończy przystanek
Gdy pojazd zakończy przystanek, Fleet Engine musi zostać o tym powiadomiony. Spowoduje to ustawienie wszystkich zadań powiązanych z przystankiem w stanie ZAMKNIĘTY.
Pola wymagane do aktualizacji przystanku
Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.
| Pole | Wartość |
|---|---|
remainingVehicleJourneySegments |
Lista pozostałych przystanków pojazdu z ich stanami oznaczonymi jako State.NEW. Pierwszy przystanek na liście musi mieć stan oznaczony jako State.ENROUTE. |
Przykład powiadomienia o tym, że pojazd zakończył przystanek
Poniższe przykłady pokazują, jak powiadomić Fleet Engine, że pojazd dotarł
do przystanku, za pomocą biblioteki Java gRPC lub wywołania HTTP REST do
UpdateDeliveryVehicle. Wszystkie inne 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 sekcji Role kont usługi i tokeny JSON Web.
- Treść żądania musi zawierać encję
DeliveryVehicle:
Przykład polecenia 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