Aktualizuj stan zatrzymania

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

  • [Tworzenie zadań dostawy][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 pojazdu, gdy pojazd zbliża się do przystanku, dociera do niego i go opuszcza. Umożliwia to raportowanie i analizowanie postępów zadania zarówno operatorom floty, jak i użytkownikom. Oto aktualizacje stanu:

  • W drodze: typ wyliczeniowy STATE dla VehicleStop używa ENROUTE, 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 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 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 jedzie do przystanku

Twój system powinien powiadomić Fleet Engine, gdy pojazd rozpocznie nawigację do następnego przystanku. Poprawi to obliczenia szacowanego czasu dotarcia na miejsce i trasy.

Wymagane pola dotyczące aktualizacji przystanków

Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.

PoleWartość
remainingVehicleJourneySegments Lista pozostałych przystanków pojazdu ze stanem oznaczonym 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 wystawiany przez Twój serwer zgodnie ze wskazówkami opisanymi w sekcjach [Role kont 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

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

Wymagane pola dotyczące aktualizacji przystanków

Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.

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

Przykład powiadomienia o przybyciu 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 wystawiany przez Twój serwer zgodnie ze wskazówkami opisanymi w sekcjach [Role kont 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ę na przystanku.

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

Wymagane pola dotyczące aktualizacji przystanków

Fleet Engine ignoruje wszystkie inne pola w encji powiadomienia.

PoleWartość
remainingVehicleJourneySegments Lista pozostałych przystanków pojazdu ze stanem oznaczonym jako State.NEW. Pierwszy przystanek na liście musi mieć stan State.ENROUTE.

Przykładowe zatrzymanie

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 wystawiany przez Twój serwer zgodnie ze wskazówkami opisanymi w sekcjach [Role kont 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