W tym dokumencie zakładamy, że znasz te zagadnienia:
- Tworzenie zadań dotyczących dostawy
- Wprowadzenie do Zaplanowanych zadań, które szczegółowo omawia relacje między zadaniami, przystankami i pojazdami.
Jak opisano w sekcji Zaplanowane zadania w podstawie korzystania z Fleet Engine, tworzysz zadania i kojarzysz je z przystankiem pojazdu, aby odwzorować rzeczywiste powiązanie między zadaniem a miejscem, w którym pojazd ma się zatrzymać, aby kierowca mógł je wykonać.
Możesz tam zarządzać postępami wykonywania zadań na każdym etapie ich cyklu życia, wysyłając aktualizacje do silnika floty, aby mógł on optymalnie realizować przekierowania i aktualizacje stanu w trakcie wykonywania zadania. Jednym z kluczowych sposobów jest aktualizowanie przystanku pojazdu, gdy pojazd zbliża się do przystanku, do niego dojeżdża i z niego wyjeżdża. Umożliwia to raportowanie i analizowanie postępów w wykonaniu zadania zarówno operatorom floty, jak i użytkownikom. Aktualizacje stanu:
- W drodze: enumeracja
STATE
dlaVehicleStop
używa wartościENROUTE
, aby wskazać, że następny przystanek na liście planu podróży pojazdu. Z perspektywy zadania oznacza to, że następne zadanie na liście, które ma zostać wykonane, jest powiązane z tym przystankiem. - Arrived (Przybył): enumeracja
STATE
dlaVehicleStop
używa wartościARRIVED
, aby wskazać, że pojazd dotarł na przystanek. Z perspektywy zadania oznacza to, że wszystkie zadania powiązane z zatrzymaniem są aktywnie wykonywane. - Ukończone: oznacza, że zatrzymanie zostało zakończone. Aby to zrobić, usuń je 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ń.
Z tego dokumentu dowiesz się, jak zaktualizować stan zatrzymania za pomocą metod po stronie serwera. Możesz też zrobić to w aplikacji kierowcy, jeśli dasz mu możliwość zarządzania zadaniami za pomocą zaufanego urządzenia. Używaj tylko jednej metody, aby uniknąć warunków wyścigu i utrzymać jedno źródło danych.
Pojazd jest w drodze do przystanku
Twój system powinien powiadomić Fleet Engine, gdy pojazd rozpocznie nawigację do następnego przystanku. Dzięki temu poprawi się obliczanie przewidywanego czasu dojazdu i trasy.
Pola wymagane do zatrzymania aktualizacji
Silnik floty ignoruje wszystkie inne pola w obiekcie powiadomienia.
Pole | Wartość |
---|---|
remainingVehicleJourneySegments
|
Lista pozostałych przystanków pojazdu z ich stanami oznaczonymi jako State.NEW. |
Przykład: przejazd 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ą oznaczane 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 o wartości Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykule Role na kontach usługi i tokeny sieciowe JSON.
- Treść żądania musi zawierać element
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 dojeżdża na przystanek
Gdy pojazd dotrze do przystanku, Fleet Engine musi o tym zostać powiadomiony.
Pola wymagane do zatrzymania aktualizacji
Silnik floty ignoruje wszystkie inne pola w obiekcie powiadomienia.
Pole | Wartość |
---|---|
remainingVehicleJourneySegments
|
Lista pozostałych przystanków pojazdu z ich stanami oznaczonymi jako State.NEW. |
Przykład: przybycie na przystanek
Poniższe przykłady pokazują, jak powiadomić Fleet Engine o przybyciu pojazdu na przystanek 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 o wartości Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykule Role na kontach usługi i tokeny sieciowe JSON.
- Treść żądania musi zawierać element
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 zakończył przystanek,
Fleet Engine musi zostać powiadomiony, gdy pojazd zakończy postój. W efekcie wszystkie zadania powiązane z tym przystankiem zostaną zamknięte.
Pola wymagane do zatrzymania aktualizacji
Silnik floty ignoruje wszystkie inne pola w obiekcie 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 zatrzymania
Poniższe przykłady pokazują, jak powiadomić Fleet Engine o przybyciu pojazdu na przystanek 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 o wartości Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykule Role na kontach usługi i tokeny sieciowe JSON.
- Treść żądania musi zawierać element
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