Modifier des trajets et gérer leur état

Ce document explique comment mettre à jour un trajet et gérer son état, ce qui implique d'utiliser un masque de champ pour définir les champs pertinents pour un trajet. Nous partons du principe que vous avez configuré Fleet Engine comme décrit sur ce site et que vous travaillez avec un véhicule attribué à un trajet.

Principes de base des informations sur les trajets

Votre système utilise Fleet Engine pour mettre à jour un trajet dans les situations suivantes :

  • Lorsque vous attribuez un véhicule à un trajet après sa création.
  • Lorsque l'état du trajet change, par exemple lorsque le véhicule passe par des points de repère.
  • Lorsque vous mettez à jour des champs de trajet, tels que le nombre de passagers et le point de dépôt.

Pour mettre à jour un trajet, envoyez une requête à l'aide de gRPC ou de REST.

  • Méthode UpdateTrip(): gRPC ou REST
  • Message UpdateTripRequest: gRPC uniquement

Utilisez les identifiants appropriés pour le compte de service de votre projet, comme décrit dans Fleet Engine: rôles de compte de service.

Mettre à jour les champs de trajet

Vous pouvez mettre à jour tous les champs de trajet décrits dans la section Champs de trajet de l'article Créer un trajet à destination unique. Par exemple, après avoir créé un trajet, il est courant de rechercher un véhicule, puis de mettre à jour le champ vehicle_id du trajet pour l'associer au véhicule qui effectuera le trajet.

Utiliser des masques de champ

Les masques de champ permettent aux appelants de l'API de répertorier les champs qu'une requête doit ou mettre à jour. L'utilisation d'un FieldMask permet d'éviter des tâches inutiles et d'améliorer les performances. Fleet Engine utilise des masques de champ pour mettre à jour les champs de toutes les ressources.

Mettez à jour le trajet avec l'ID du véhicule

Vous devez configurer un trajet avec un ID de véhicule afin que Fleet Engine puisse suivre le véhicule tout au long de son trajet. L'exemple de code suivant montre comment mettre à jour le trajet avec un ID de véhicule.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId("8241890")
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest =
    UpdateTripRequest.newBuilder()      // No need for the header.
        .setName(tripName)
        .setTrip(trip)
        .setUpdateMask(FieldMask.newBuilder().addPaths("vehicle_id"))
        .build();

// Error handling.
// If the Fleet Engine has both a trip and vehicle with IDs, and if the
// credentials validate, then the service updates the trip.
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:                    // Neither the trip nor vehicle exist.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Gérer l'état des trajets

Vous spécifiez l'état d'un trajet à l'aide de l'une des valeurs d'énumération TripStatus. Lorsque l'état d'un trajet change, par exemple de ENROUTE_TO_PICKUP à ARRIVED_AT_PICKUP, vous mettez à jour l'état du trajet dans Fleet Engine. Le cycle de vie du trajet commence toujours par la valeur d'état NEW et se termine par la valeur COMPLETE ou CANCELED.

Exemple de mise à jour de trajet

L'exemple suivant montre comment mettre à jour l'état d'un trajet en série dans Fleet Engine.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip settings to be updated.
Trip trip = Trip.newBuilder()
    .setTripStatus(TripStatus.ARRIVED_AT_PICKUP)
    .build();

// Trip update request
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder().addPaths("trip_status"))
    .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:  // The given trip status is invalid.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Vous trouverez d'autres exemples de mise à jour de trajets dans la section Autres types de trajets.

Gérer les erreurs de trajet

Lorsque vous mettez à jour ou recherchez des trajets existants, une erreur DEADLINE_EXCEEDED peut se produire, auquel cas l'état du moteur de parc est inconnu. Pour examiner ce problème, commencez par appeler de nouveau CreateTrip en utilisant le même ID de trajet que vous essayez de mettre à jour ou de surveiller. Une erreur 201 (CREATED) ou 409 (CONFLICT) doit s'afficher. Dans ce dernier cas, la requête précédente a abouti avant DEADLINE_EXCEEDED.

Consultez la liste des erreurs réseau dans le SDK grand public, pour Android ou iOS.

Étape suivante