Aggiorna lo stato della fermata

In questo documento si presuppone una conoscenza di quanto segue:

Come indicato in Attività pianificate nella Fleet Engine Essentials: devi creare attività e associarle a un veicolo. come un modo per modellare l'associazione nel mondo reale tra l'attività e posizione in cui è previsto che il veicolo si fermi affinché il conducente possa completare l'attività.

Da qui, puoi gestire l'avanzamento delle attività durante il loro ciclo di vita inviando aggiornamenti a Fleet Engine affinché possa eseguire al meglio il routing e lo stato e gli aggiornamenti lungo il percorso dell'attività. Un modo fondamentale è aggiornare il veicolo si ferma quando si avvicina, arriva e abbandona la fermata. In questo modo è possibile generare report e analizzare l'avanzamento delle attività Operatori del parco risorse e utenti finali. Questi aggiornamenti di stato sono i seguenti:

  • In percorso: l'enum STATE per VehicleStop utilizza ENROUTE per indicare che la fermata è la successiva nell'elenco dell'itinerario del veicolo. Dal punto di vista dell'attività, indica tutte le attività associate alla fermata. è il prossimo da completare nell'elenco.
  • Arrivato: l'enum STATE per VehicleStop utilizza ARRIVED per indicare che il veicolo è arrivato alla fermata. Dal punto di vista dell'attività, significa che qualsiasi attività associata a questa attività smette di lavorare attivamente.
  • Completata: contrassegna una fermata come completata rimuovendola dall'elenco di si ferma per il veicolo. Quando esegui questa operazione, Fleet Engine contrassegna automaticamente tutte le attività associate come CLOSED. Per maggiori dettagli sulla chiusura delle attività, vedi Finalizza le attività.

Questo documento descrive come l'aggiornamento dello stato di interruzione utilizzando gli approcci lato server. Tu Puoi eseguire questa operazione anche dall'app del conducente, se gli concedi la possibilità di gestire le attività utilizzando un dispositivo attendibile. Utilizza un solo metodo per evitare gare le condizioni ambientali e mantenere un'unica fonte attendibile.

Il veicolo è in procinto di fermarsi

Il tuo sistema deve informare Fleet Engine quando il veicolo inizia la navigazione verso alla prossima fermata. In questo modo migliori il calcolo dell'orario di arrivo stimato e dei percorsi.

Campi obbligatori per gli aggiornamenti delle fermate

Fleet Engine ignora tutti gli altri campi dell'entità per la notifica.

CampoValore
remainingVehicleJourneySegments Elenco delle fermate del veicolo rimanenti con i relativi stati contrassegnati come Stato.NEW.

Esempio di percorso verso la fermata

Gli esempi seguenti mostrano come notificare a Fleet Engine che un veicolo è verso la fermata successiva, utilizzando la libreria Java gRPC o una Chiamata REST a UpdateDeliveryVehicle.Tutte le altre fermate sono contrassegnate come nuove.

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`
  • &lt;id&gt; è un identificatore univoco dell'attività.
  • L'intestazione della richiesta deve contenere un campo Authorization con il valore Bearer <token>, dove <token> viene emesso dal tuo server in base alle linee guida descritte in Ruoli dell'account di servizio e Token web JSON.
  • Il corpo della richiesta deve contenere un'entità DeliveryVehicle:

Esempio di comando 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

Il veicolo arriva alla fermata

Fleet Engine deve essere avvisata quando un veicolo arriva a una fermata.

Campi obbligatori per gli aggiornamenti delle fermate

Fleet Engine ignora tutti gli altri campi dell'entità per la notifica.

CampoValore
remainingVehicleJourneySegments Elenco delle fermate del veicolo rimanenti con i relativi stati contrassegnati come Stato.NEW.

Esempio di arrivo alla fermata

Gli esempi seguenti mostrano come notificare a Fleet Engine che un veicolo è arrivato alla fermata, utilizzando la libreria Java gRPC o una chiamata REST HTTP UpdateDeliveryVehicle. Tutte le altre fermate sono contrassegnate come nuove.

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`
  • &lt;id&gt; è un identificatore univoco dell'attività.
  • L'intestazione della richiesta deve contenere un campo Authorization con il valore Bearer <token>, dove <token> viene emesso dal tuo server in base alle linee guida descritte in Ruoli dell'account di servizio e Token web JSON.
  • Il corpo della richiesta deve contenere un'entità DeliveryVehicle:

Esempio di comando 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

Il veicolo completa una fermata

Fleet Engine deve essere avvisata quando un veicolo completa un arresto. Questo causa tutte le attività associate alla fermata vengano impostate sullo stato CHIUSA.

Campi obbligatori per gli aggiornamenti delle fermate

Fleet Engine ignora tutti gli altri campi dell'entità per la notifica.

CampoValore
remainingVehicleJourneySegments Elenco delle fermate del veicolo rimanenti con i relativi stati contrassegnati come Stato.NEW. Lo stato della prima fermata nell'elenco deve essere State.ENROUTE.

Completa un esempio di interruzione

Gli esempi seguenti mostrano come notificare a Fleet Engine che un veicolo è arrivato alla fermata, utilizzando la libreria Java gRPC o una chiamata REST HTTP UpdateDeliveryVehicle. Tutte le altre fermate sono contrassegnate come nuove.

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`
  • &lt;id&gt; è un identificatore univoco dell'attività.
  • L'intestazione della richiesta deve contenere un campo Authorization con il valore Bearer <token>, dove <token> viene emesso dal tuo server in base alle linee guida descritte in Ruoli dell'account di servizio e Token web JSON.
  • Il corpo della richiesta deve contenere un'entità DeliveryVehicle:

Esempio di comando 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

Passaggi successivi