Aktualizuj stan zatrzymania

W tym dokumencie przyjęto założenie, że znasz te pojęcia:

Jak wspomnieliśmy w sekcji Zaplanowane zadaniaFleet Engine Essentials, tworzysz zadania i przypisujesz je do przystanku pojazdu, aby modelować rzeczywiste powiązanie między zadaniem a miejscem, w którym pojazd ma się zatrzymać, aby kierowca mógł wykonać zadanie.

Następnie możesz zarządzać postępem zadań w całym cyklu życia, wysyłając aktualizacje do Fleet Engine, aby usługa mogła jak najlepiej wykonywać wyznaczanie tras i aktualizowanie stanu na całej ścieżce zadania. Jednym z kluczowych sposobów na to jest aktualizowanie przystanku, gdy pojazd zbliża się do niego, przyjeżdża na niego i go opuszcza. Umożliwia to generowanie raportów i analiz dotyczących postępów w realizacji zadań zarówno dla operatorów flot, jak i użytkowników. Te aktualizacje stanu są następujące:

  • W drodze: wyliczenie STATE dla VehicleStop używa ENROUTE, aby wskazać, że przystanek jest następny na liście trasy pojazdu. Z perspektywy zadania oznacza to, że każde zadanie powiązane z przystankiem jest następne na liście do wykonania.
  • Arrived: wyliczenie STATE dla VehicleStop używa ARRIVED, aby wskazać, że pojazd dotarł na przystanek. Z perspektywy zadania oznacza to, że wszystkie zadania powiązane z przystankiem są aktywnie wykonywane.
  • Ukończony: przystanek oznaczysz jako ukończony, usuwając go z listy przystanków dla 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 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 na zaufanym urządzeniu. Używaj tylko jednej metody, aby uniknąć warunków wyścigu i utrzymać jedno źródło danych.

Pojazd jest w drodze na przystanek

System powinien powiadamiać Fleet Engine, gdy pojazd rozpoczyna nawigację do następnego przystanku. Poprawia to obliczenia szacowanego czasu przybycia i trasy.

Pola wymagane do zatrzymania aktualizacji

Fleet Engine ignoruje wszystkie inne pola w obiekcie powiadomienia.

PoleWartość
remainingVehicleJourneySegments Lista pozostałych przystanków pojazdu ze stanami oznaczonymi jako State.NEW.

Przykład: w drodze do przystanku

Poniższe przykłady pokazują, jak powiadomić Fleet Engine, że pojazd jest w drodze do następnego przystanku, używając 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 o wartości Bearer <token>, gdzie <token> jest tokenem wydanym przez Twój serwer zgodnie z wytycznymi opisanymi w sekcjach Role kont 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": "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 na przystanek

Gdy pojazd dotrze na przystanek, Fleet Engine musi otrzymać powiadomienie.

Pola wymagane do zatrzymania aktualizacji

Fleet Engine ignoruje wszystkie inne pola w obiekcie powiadomienia.

PoleWartość
remainingVehicleJourneySegments Lista pozostałych przystanków pojazdu ze stanami oznaczonymi jako State.NEW.

Przybywa na przystanek – przykład

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 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 o wartości Bearer <token>, gdzie <token> jest tokenem wydanym przez Twój serwer zgodnie z wytycznymi opisanymi w sekcjach Role kont 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 kończy przystanek

Gdy pojazd zakończy postój, należy powiadomić o tym Fleet Engine. Spowoduje to ustawienie wszystkich zadań powiązanych z przystankiem w stanie ZAMKNIĘTE.

Pola wymagane do zatrzymania aktualizacji

Fleet Engine ignoruje wszystkie inne pola w obiekcie powiadomienia.

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

Kończy 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 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 o wartości Bearer <token>, gdzie <token> jest tokenem wydanym przez Twój serwer zgodnie z wytycznymi opisanymi w sekcjach Role kont 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": "NEW",
         "plannedLocation": {
           "point": {
             "latitude": 37.3382,
             "longitude": 121.8863
           }
         },
         "tasks": [
           {
             "taskId": "${TASK2_ID}"
           }
         ]
       }
     }
   ]
 }
 EOM

Co dalej?