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.
Dans un scénario de livraison réel, les entreprises attribuent des tâches d'expédition aux chauffeurs, qui utilisent ensuite un véhicule pour les livrer au destinataire à un emplacement prévu, tel qu'une résidence ou une salle de livraison dans un complexe immobilier. Vous modélisez cela dans Fleet Engine en créant une tâche et en envoyant une requête de mise à jour du véhicule de livraison, qui met ensuite à jour l'entité du véhicule avec une liste d'arrêts à effectuer. Vous attribuez à chaque arrêt une liste de tâches à effectuer.
Vous pouvez modifier les tâches du véhicule à tout moment, mais vous le faites généralement pour les raisons suivantes :
- Planifier des tâches à effectuer par un véhicule. Vous pouvez le faire soit avec une requête de mise à jour qui ajoute un nouvel arrêt au véhicule, soit avec une requête de mise à jour qui ajoute une nouvelle tâche à un arrêt existant.
- Modifier l'ordre des tâches existantes associées à un arrêt de véhicule donné.
- Modifier l'emplacement d'exécution de la tâche. Par défaut, Fleet Engine marque l'emplacement d'exécution de la tâche comme étant le même que celui de l'arrêt de véhicule associé à la tâche. Si vous le préférez, vous pouvez spécifier des emplacements spécifiques pour des tâches individuelles. Par exemple, un véhicule peut s'arrêter dans un grand complexe pour livrer plusieurs colis, chacun étant attribué à une salle de livraison spécifique.
- Fermer toutes les tâches précédemment attribuées pour les exclure de l'ordre mis à jour. Pour en savoir plus, consultez Finaliser les tâches.
Planifier ou modifier des tâches de livraison
Vous pouvez planifier ou modifier les tâches attribuées à un véhicule à partir d'un environnement serveur ou à l'aide du Driver SDK si vous autorisez le chauffeur à 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é.
Pour transférer une expédition d'un véhicule à un autre, fermez la tâche d'origine et recréez-la avant de l'attribuer à un autre véhicule. Si vous mettez à jour un véhicule de livraison pour inclure une tâche déjà attribuée à un autre véhicule, vous recevez une erreur.
Champs obligatoires pour la modification des tâches
Cette section décrit les champs obligatoires à définir lors de la modification d'une tâche pour un véhicule. Aucun champ facultatif n'est fourni. Fleet Engine ignore tous les autres champs de l'entité pour la mise à jour.
| Champ obligatoire | Valeur |
|---|---|
remainingVehicleJourneySegments |
Liste des segments de trajet pour les tâches dans l'ordre dans lequel elles doivent être exécutées. La première tâche de la liste est exécutée en premier. |
remainingVehicleJourneySegments[i].stop |
Arrêt pour la tâche i dans la liste. |
remainingVehicleJourneySegments[i].stop.plannedLocation |
Emplacement prévu pour l'arrêt. |
remainingVehicleJourneySegments[i].stop.tasks |
Liste des tâches à effectuer à cet arrêt de véhicule. |
remainingVehicleJourneySegments[i].stop.state |
State.NEW |
Exemple d'attribution de tâches
Les exemples suivants montrent comment utiliser la bibliothèque Java gRPC et un appel HTTP
REST à UpdateDeliveryVehicle pour ajouter deux nouvelles tâches au véhicule.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
.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.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 updateDeliveryRequest =
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 un véhicule de livraison de votre flotte pour lequel vous souhaitez modifier l'ordre des tâches. Il s'agit de l'identifiant que vous avez spécifié lors de la création du véhicule.
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.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM