Ce document explique comment créer un trajet à plusieurs destinations, définir les champs appropriés et l'attribuer à un véhicule pour l'effectuer. Il suppose que vous avez configuré Fleet Engine, créé des véhicules, que vous disposez d'une application chauffeur fonctionnelle et, éventuellement, d'une application consommateur. Vous devez également connaître les différents scénarios de trajet disponibles pour les trajets à la demande. Pour cela, consultez les guides associés suivants :
- Configurer Fleet Engine
- Créer un véhicule
- Scénarios de trajet dans la présentation des trajets à la demande
Principes de base de la création de trajets
Cette section décrit les détails de la requête nécessaires pour créer un trajet dans Fleet Engine. Vous envoyez une requête de création à l'aide de gRPC et de REST.
Champs de trajet
Utilisez les champs suivants pour créer un trajet dans Fleet Engine. Vous pouvez utiliser différents champs pour les différents types de trajets : à une ou plusieurs destinations, consécutifs ou partagés. Vous pouvez fournir les champs facultatifs lorsque vous créez le trajet ou les définir ultérieurement lorsque vous le mettez à jour.
| Nom | Obligatoire ? | Description |
|---|---|---|
| parent | Oui | Chaîne incluant l'ID du projet. Cet ID doit être le même que celui utilisé dans l'ensemble de votre intégration Fleet Engine, avec les mêmes rôles de compte de service. |
| trip_id | Oui | Chaîne que vous créez et qui identifie ce trajet de manière unique. Les ID de trajet sont soumis à certaines restrictions, comme indiqué dans la documentation de référence. |
| trip_type | Oui | Définissez TripType sur les valeurs suivantes pour le type de trajet que vous créez :
|
| pickup_point | Oui | Point de départ du trajet. |
| Destinations intermédiaires | Oui | Trajets à plusieurs destinations uniquement : liste des destinations intermédiaires que le chauffeur visite entre le point de départ et le point d'arrivée. Comme pour |
| vehicle_waypoints | Oui | Trajets partagés uniquement : ce champ permet d'entrelacer les points de cheminement de plusieurs trajets.
Il contient tous les points de cheminement restants pour le véhicule attribué, ainsi que les points de cheminement de départ et d'arrivée pour ce trajet. Vous pouvez définir ce champ
en appelant |
| number_of_passengers | Non | Nombre de passagers du trajet. |
| dropoff_point | Non | Destination du trajet. |
| vehicle_id | Non | ID du véhicule attribué au trajet. |
Exemple : créer un trajet à plusieurs destinations
L'exemple suivant montre comment créer un trajet exclusif à plusieurs destinations avec un point de départ, un point d'arrivée et une destination intermédiaire.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// Trip initial settings.
String parent = "providers/" + PROJECT_ID;
Trip trip = Trip.newBuilder()
.setTripType(TripType.EXCLUSIVE)
.setPickupPoint(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)))
.setNumberOfPassengers(1)
.setDropoffPoint(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.1275).setLongitude(106.6537)))
// Add the list of intermediate destinations.
.addAllIntermediateDestinations(
ImmutableList.of(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)).build()))
.build();
// Create the Trip request.
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
.setParent(parent)
.setTripId(TRIP_ID) // Trip ID assigned by the Provider server.
.setTrip(trip) // Initial state is NEW.
.build();
// Error handling.
try {
Trip createdTrip =
tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS: // Trip already exists.
break;
case PERMISSION_DENIED:
break;
}
return;
}
Mettre à jour un trajet à plusieurs destinations
Vous devez configurer le trajet avec un ID de véhicule afin que Fleet Engine puisse suivre le véhicule sur son itinéraire. Pour en savoir plus sur la mise à jour d'un trajet, consultez Mettre à jour des trajets et gérer leur état.
Si vous ne spécifiez pas de destination d'arrivée ni de destination intermédiaire lorsque vous créez le trajet, vous pouvez toujours le faire à ce stade.
Exemple de mise à jour de trajet
L'exemple suivant montre comment mettre à jour un trajet pour ajouter une liste de destinations intermédiaires et définir un ID de véhicule.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to be updated.
Trip trip = Trip.newBuilder()
// Add the list of intermediate destinations.
.addAllIntermediateDestinations(
ImmutableList.of(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)).build()))
.setVehicleId("8241890")
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(
FieldMask.newBuilder()
.addPaths("intermediate_destinations")
.addPaths("vehicle_id")
.build())
.build();
// Error handling.
try {
Trip updatedTrip =
tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND: // The trip doesn't exist.
break;
case PERMISSION_DENIED:
break;
}
return;
}
Gérer l'état des trajets à plusieurs destinations
Vous spécifiez l'état d'un trajet à l'aide de l'une des TripStatus valeurs d'énumération. Lorsque l'état d'un trajet change, par exemple de ENROUTE_TO_PICKUP à ARRIVED_AT_PICKUP, vous devez mettre à jour l'état du trajet dans Fleet Engine. L'état du trajet commence toujours par la valeur NEW et se termine par la valeur COMPLETE ou CANCELED.
Pour un trajet à plusieurs destinations, en plus de mettre à jour l'état du trajet comme vous le feriez pour un trajet à une seule destination, vous devez également mettre à jour les éléments suivants chaque fois que votre véhicule atteint une destination intermédiaire :
intermediateDestinationIndexintermediateDestinationsVersion
Pour ce faire, utilisez les valeurs suivantes de l'énumération TripStatus.
ENROUTE_TO_PICKUPARRIVED_AT_PICKUPENROUTE_TO_INTERMEDIATE_DESTINATIONARRIVED_AT_INTERMEDIATE_DESTINATIONENROUTE_TO_DROPOFFCOMPLETE
Exemple de trajet avec des destinations intermédiaires
L'exemple suivant montre comment créer un trajet à plusieurs destinations qui a dépassé son point de départ et qui est maintenant en route vers sa première destination intermédiaire.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
// Get the trip object from either the Fleet Engine or storage.
Trip trip = …;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to be updated.
Trip trip = Trip.newBuilder()
// Trip status cannot return to a previous state once it has passed.
.setTripStatus(TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION)
// Enroute to the first intermediate destination.
.setIntermediateDestinationIndex(0)
// You must provide an intermediate_destinations_version to ensure that you
// have the same intermediate destinations list as the Fleet Engine.
.setIntermediateDestinationsVersion(
trip.getIntermediateDestinationsVersion())
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(
FieldMask.newBuilder()
.addPaths("trip_status")
.addPaths("intermediate_destination_index")
// intermediate_destinations_version must not be in the update mask.
.build())
.build();
// Error handling.
try {
Trip updatedTrip =
tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND: // The trip doesn't exist.
break;
case FAILED_PRECONDITION: // Either the trip status is invalid, or the
// intermediate_destinations_version doesn't
// match Fleet Engine's.
break;
case PERMISSION_DENIED:
break;
}
return;
}