Mettre à jour l'état des arrêts

Dans ce document, nous partons du principe que vous connaissez les éléments suivants:

Comme indiqué dans la section Tâches planifiées du Fleet Engine Essentials, vous créez des tâches et les associez à un véhicule s'arrêter pour modéliser l'association réelle entre la tâche et lieu où le véhicule doit s'arrêter pour que le conducteur puisse terminer la tâche.

À partir de là, vous gérez la progression des tâches tout au long de leur cycle de vie en en envoyant des mises à jour à Fleet Engine afin d'optimiser le routage et l'état des mises à jour tout au long du parcours de la tâche. L'un des principaux moyens de le faire est de mettre à jour le véhicule s'arrête lorsqu'il s'approche de l'arrêt, y arrive ou en sort. Cela permet de créer des rapports et d'analyser l'avancement de la tâche pour les deux Opérateurs de parc et utilisateurs finaux Ces mises à jour de l'état sont les suivantes:

  • En route: l'énumération STATE pour VehicleStop utilise ENROUTE pour indique que l'arrêt est le prochain arrêt sur la liste pour l'itinéraire du véhicule. Du point de vue de la tâche, cela signifie que toute tâche associée à l'arrêt est le prochain sur la liste à compléter.
  • Arrivée: l'énumération STATE pour VehicleStop utilise ARRIVED pour indiquer que le véhicule est arrivé à l'arrêt. Du point de vue de la tâche, cela signifie que toute tâche associée à l’arrêt d’une tâche active.
  • Terminée: pour marquer une étape comme étant terminée, vous devez la supprimer de la liste des des arrêts du véhicule. Dans ce cas, Fleet Engine marque automatiquement toutes les tâches associées comme FERMÉES. Pour plus de détails sur le bouclage des tâches, voir Finaliser des tâches.

Ce document explique comment mettre à jour l'état d'un arrêt à l'aide d'approches côté serveur. Toi vous pouvez également le faire depuis votre application de pilote si vous lui donnez la possibilité de gérer des tâches à l'aide d'un appareil vérifié. N'utilisez qu'une seule méthode afin d'éviter la course et maintenir une source unique de vérité.

Véhicule en route pour s'arrêter

Votre système doit avertir Fleet Engine lorsque le véhicule commence à se rendre au prochain arrêt. Cela améliore le calcul de l'heure d'arrivée prévue et des itinéraires.

Champs obligatoires pour les mises à jour des arrêts

Fleet Engine ignore tous les autres champs de l'entité pour la notification.

ChampValeur
remainingVehicleJourneySegments Liste des arrêts restants du véhicule avec leur état marqué "State.NEW".

Exemple de mise en route pour arrêter

Les exemples suivants montrent comment informer Fleet Engine qu'un véhicule est jusqu'au prochain arrêt, à l'aide de la bibliothèque gRPC Java Appel REST à UpdateDeliveryVehicle.Tous les autres arrêts sont marqués comme nouveaux.

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; est un identifiant unique pour la tâche.
  • L'en-tête de requête doit contenir un champ Authorization avec la valeur Bearer <token>, où <token> est émis par votre serveur conformément aux consignes décrites dans la section Rôles de compte de service et Jetons Web JSON :
  • Le corps de la requête doit contenir une entité DeliveryVehicle:

Exemple de commande 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

Le véhicule arrive à l'arrêt

Fleet Engine doit recevoir une notification lorsqu'un véhicule arrive à un arrêt.

Champs obligatoires pour les mises à jour des arrêts

Fleet Engine ignore tous les autres champs de l'entité pour la notification.

ChampValeur
remainingVehicleJourneySegments Liste des arrêts restants du véhicule avec leur état marqué "State.NEW".

Exemple d'arrivée à l'arrêt

Les exemples suivants montrent comment avertir Fleet Engine qu'un véhicule est arrivé à l'arrêt, à l'aide de la bibliothèque gRPC Java ou d'un appel HTTP REST pour UpdateDeliveryVehicle Tous les autres arrêts sont marqués comme nouveaux.

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; est un identifiant unique pour la tâche.
  • L'en-tête de requête doit contenir un champ Authorization avec la valeur Bearer <token>, où <token> est émis par votre serveur conformément aux consignes décrites dans la section Rôles de compte de service et Jetons Web JSON :
  • Le corps de la requête doit contenir une entité DeliveryVehicle:

Exemple de commande 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

Le véhicule termine un arrêt

Fleet Engine doit être averti lorsqu'un véhicule s'arrête. Cela provoque toutes les tâches associées à l'arrêt soient définies sur l'état CLOSED.

Champs obligatoires pour les mises à jour des arrêts

Fleet Engine ignore tous les autres champs de l'entité pour la notification.

ChampValeur
remainingVehicleJourneySegments Liste des arrêts de véhicule restants avec leur état marqué "State.NEW". L'état du premier arrêt de la liste doit être défini sur State.ENROUTE.

Complète un exemple d'arrêt

Les exemples suivants montrent comment avertir Fleet Engine qu'un véhicule est arrivé à l'arrêt, à l'aide de la bibliothèque gRPC Java ou d'un appel HTTP REST pour UpdateDeliveryVehicle Tous les autres arrêts sont marqués comme nouveaux.

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; est un identifiant unique pour la tâche.
  • L'en-tête de requête doit contenir un champ Authorization avec la valeur Bearer <token>, où <token> est émis par votre serveur conformément aux consignes décrites dans la section Rôles de compte de service et Jetons Web JSON :
  • Le corps de la requête doit contenir une entité DeliveryVehicle:

Exemple de commande 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

Étape suivante