Aktualizuj stan zatrzymania

W tym dokumencie zakładamy, że znasz te zagadnienia:

Jak opisano w sekcji Zaplanowane zadaniapodstawie 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 dla VehicleStop używa wartości ENROUTE, 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 dla VehicleStop używa wartości ARRIVED, 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.

PoleWartość
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ługitokeny 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.

PoleWartość
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ługitokeny 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.

PoleWartość
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ługitokeny 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

Co dalej?