Actualiza los viajes y administra su estado

En este documento, se describe cómo actualizar un viaje y administrar su estado, lo que implica usar una máscara de campo para establecer los campos pertinentes de un viaje. Se supone que configuraste Fleet Engine como se describe en este sitio y que trabajas con un vehículo asignado a un viaje.

Conceptos básicos de las actualizaciones de viaje

Tu sistema usa Fleet Engine para actualizar un viaje en las siguientes situaciones:

  • Cuando se asigna un vehículo a un viaje después de que se crea.
  • Cuando cambia el estado del viaje, por ejemplo, cuando el vehículo pasa por puntos de referencia
  • Cuando actualizas los campos del viaje, como la cantidad de pasajeros y el punto de descenso

Para actualizar un viaje, envía una solicitud con gRPC o REST.

  • Método UpdateTrip(): gRPC o REST
  • Mensaje UpdateTripRequest: Solo gRPC

Usa las credenciales adecuadas para la cuenta de servicio de tu proyecto, como se describe en Fleet Engine: Roles de la cuenta de servicio.

Actualiza los campos del viaje

Puedes actualizar cualquiera de los campos de viaje que se describen en Campos de viaje en Crea un viaje de un solo destino. Por ejemplo, después de crear un viaje, es una práctica común primero encontrar un vehículo y, luego, actualizar el campo vehicle_id del viaje para asociarlo con el vehículo que realizará el viaje.

Usa máscaras de campo

Las máscaras de campo son una forma en que los llamadores de la API pueden enumerar los campos que una solicitud debe devolver o actualizar. Usar un FieldMask evita trabajos innecesarios y mejora el rendimiento. Fleet Engine usa máscaras de campo para actualizar campos en todos los recursos.

Actualiza el viaje con el ID del vehículo

Debes configurar un viaje con un ID de vehículo para que Fleet Engine pueda hacer un seguimiento del vehículo a lo largo de su ruta. En el siguiente ejemplo de código, se muestra cómo actualizar el viaje con un ID de vehículo.

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;
}

Administra el estado de los viajes

Para especificar el estado de un viaje, usa uno de los valores de enumeración TripStatus. Cuando cambia el estado de un viaje, por ejemplo, de ENROUTE_TO_PICKUP a ARRIVED_AT_PICKUP, debes actualizar el estado del viaje en Fleet Engine. El ciclo de vida del viaje siempre comienza con un valor de estado de NEW y termina con un valor de COMPLETE o CANCELED.

Ejemplo de actualización de viaje

En el siguiente ejemplo, se muestra cómo actualizar el estado de un viaje consecutivo en 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;
}

Puedes ver otros ejemplos de cómo actualizar viajes en la sección Otros tipos de viajes.

Cómo controlar los errores de viaje

Cuando actualices o busques viajes existentes, es posible que encuentres un caso de error DEADLINE_EXCEEDED, en cuyo caso se desconoce el estado de Fleet Engine. Para investigar este problema, primero vuelve a llamar a CreateTrip con el mismo ID de viaje que intentas actualizar o supervisar. Esto debería devolver un código 201 (CREATED) o 409 (CONFLICT). En el último caso, la solicitud anterior se realizó correctamente antes de DEADLINE_EXCEEDED.

Consulta la lista de errores de red en el SDK para el consumidor, ya sea para Android o iOS.

¿Qué sigue?