Ce document suppose que vous êtes familiarisé avec les éléments suivants :
- Créer des tâches d'expédition
- Introduction aux tâches planifiées, qui couvre en détail la relation entre les tâches, les arrêts et les véhicules.
Comme indiqué dans Tâches planifiées de Fleet Engine Essentials, vous créez des tâches et les associez à un arrêt de véhicule pour modéliser l'association réelle entre la tâche et le lieu où le véhicule doit s'arrêter afin que le conducteur puisse effectuer la tâche.
À partir de là, vous gérez la progression des tâches tout au long de leur cycle de vie en envoyant des mises à jour à Fleet Engine afin qu'il puisse effectuer au mieux le routage et les mises à jour d'état tout au long du trajet de la tâche. Pour ce faire, vous mettez à jour l'arrêt du véhicule lorsque celui-ci s'approche, arrive et quitte l'arrêt. Cela permet de générer des rapports et des analyses sur la progression des tâches pour les opérateurs de flotte et les utilisateurs finaux. Ces mises à jour d'état sont les suivantes :
- En route : l'enum
STATEpourVehicleStoputiliseENROUTEpour indiquer que l'arrêt est le prochain sur la liste de 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 la prochaine sur la liste à effectuer. - Arrivé : l'enum
STATEpourVehicleStoputiliseARRIVEDpour 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 est en cours de traitement. - Terminé : vous marquez un arrêt comme terminé en le supprimant de la liste des arrêts du véhicule. Lorsque vous effectuez cette opération, Fleet Engine marque automatiquement toutes les tâches associées comme FERMÉES. Pour en savoir plus sur la fermeture des tâches, consultez Finaliser les tâches.
Ce document explique comment mettre à jour l'état des arrêts à l'aide d'approches côté serveur. Vous pouvez également le faire depuis votre application conducteur si vous lui donnez la possibilité de gérer les tâches à l'aide d'un appareil de confiance. N'utilisez qu'une seule méthode pour éviter les conditions de concurrence et maintenir une source unique de vérité.
Le véhicule est en route vers l'arrêt
Votre système doit avertir Fleet Engine lorsque le véhicule commence la navigation vers l'arrêt suivant. Cela améliore les calculs de l'heure d'arrivée prévue et de l'itinéraire.
Champs obligatoires pour les mises à jour des arrêts
Fleet Engine ignore tous les autres champs de l'entité pour la notification.
| Champ | Valeur |
|---|---|
remainingVehicleJourneySegments
|
Liste des arrêts de véhicule restants avec leur état marqué comme State.NEW. |
Exemple d'arrêt en route
Les exemples suivants montrent comment informer Fleet Engine qu'un véhicule est
en route vers son prochain arrêt, à l'aide de la bibliothèque Java gRPC ou d'un appel HTTP
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`
- <id> est un identifiant unique pour la tâche.
- L'en-tête de la 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 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 être averti 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.
| Champ | Valeur |
|---|---|
remainingVehicleJourneySegments
|
Liste des arrêts de véhicule restants avec leur état marqué comme State.NEW. |
Exemple d'arrivée à l'arrêt
Les exemples suivants montrent comment informer Fleet Engine qu'un véhicule est arrivé
à l'arrêt, à l'aide de la bibliothèque Java gRPC ou d'un appel HTTP 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
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> est un identifiant unique pour la tâche.
- L'en-tête de la 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 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 termine un arrêt. Toutes les tâches associées à l'arrêt sont alors définies sur l'état FERMÉ.
Champs obligatoires pour les mises à jour des arrêts
Fleet Engine ignore tous les autres champs de l'entité pour la notification.
| Champ | Valeur |
|---|---|
remainingVehicleJourneySegments |
Liste des arrêts de véhicule restants avec leur état marqué comme State.NEW. Le premier arrêt de la liste doit avoir son état marqué comme State.ENROUTE. |
Exemple d'arrêt terminé
Les exemples suivants montrent comment informer Fleet Engine qu'un véhicule est arrivé
à l'arrêt, à l'aide de la bibliothèque Java gRPC ou d'un appel HTTP 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
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> est un identifiant unique pour la tâche.
- L'en-tête de la 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 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