Cómo crear viajes con varios destinos

En este documento, se describe cómo crear un viaje de varios destinos, configurar los campos correctos y asignarlo a un vehículo para que lo lleve a cabo. Se da por sentado que configuraste Fleet Engine, creaste vehículos, tienes una app para conductores que funciona y, de manera opcional, una app para consumidores. También debes estar familiarizado con las diversas situaciones de viaje disponibles para los viajes a pedido. Consulta las siguientes guías relacionadas para lo siguiente:

Conceptos básicos para crear viajes

En esta sección, se describen los detalles de la solicitud necesarios para crear un viaje en Fleet Engine. Emites una solicitud de creación con gRPC o REST.

  • Método CreateTrip(): gRPC o REST
  • Mensaje CreateTripRequest: Solo gRPC

Campos de viaje

Usa los siguientes campos para crear un viaje en Fleet Engine. Puedes usar diferentes campos para los diferentes tipos de viajes: con un destino o varios, consecutivos o compartidos. Puedes proporcionar los campos opcionales cuando creas el viaje o puedes configurarlos más adelante cuando lo actualices.

Campos de viaje
Nombre ¿Obligatorio? Descripción
parent Es una cadena que incluye el ID del proyecto. Este ID debe ser el mismo que se usa en toda la integración de Fleet Engine, con los mismos roles de cuenta de servicio.
trip_id Es una cadena que creas y que identifica de forma exclusiva este viaje. Los IDs de viaje tienen ciertas restricciones, como se indica en la referencia.
trip_type Establece TripType en los siguientes valores para el tipo de viaje que estás creando:
  • Destino único: Establece SHARED o EXCLUSIVE.
  • Multidestino: Se establece como EXCLUSIVE.
  • Back-to-back: Configurado como EXCLUSIVE.
  • Agrupación compartida: Se establece en SHARED.
pickup_point Es el punto de origen del viaje.
Destinos intermedios

Solo para viajes con varios destinos: Es la lista de destinos intermedios que visita el conductor entre la partida y la llegada. Al igual que con dropoff_point, este campo también se puede configurar más adelante llamando a UpdateTrip, pero un viaje con varios destinos, por definición, contiene destinos intermedios.

vehicle_waypoints

Solo viajes compartidos: Este campo admite la intercalación de los puntos de referencia de varios viajes. Contiene todos los puntos de referencia restantes del vehículo asignado, así como los puntos de partida y destino de este viaje. Puedes establecer este campo llamando a CreateTrip o UpdateTrip. También puedes actualizar los puntos de referencia del vehículo a través del campo waypoints con una llamada a UpdateVehicle. El servicio no muestra esta información en las llamadas a GetTrip por motivos de privacidad.

number_of_passengers No Es la cantidad de pasajeros del viaje.
dropoff_point No El destino del viaje.
vehicle_id No Es el ID del vehículo asignado al viaje.

Ejemplo: Crea un viaje con varios destinos

A continuación, se muestra cómo crear un viaje exclusivo de varios destinos que tiene un punto de partida, un punto de destino y un destino intermedio.

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

Cómo actualizar un viaje de varios destinos

Debes configurar el viaje con un ID de vehículo para que el motor de flota pueda hacer un seguimiento del vehículo a lo largo de su ruta. Para obtener más información sobre cómo actualizar un viaje, consulta Cómo actualizar viajes y administrar su estado.

Si no especificas un destino de destino o intermedio cuando creas el viaje, puedes hacerlo en este momento.

Ejemplo de actualización de viaje

A continuación, se muestra cómo actualizar un viaje para agregar una lista de destinos intermedios y establecer un ID de vehículo.

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

Administra el estado de los viajes con varios destinos

Especifica el estado de un viaje con 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 actualizarlo en Fleet Engine. El estado del viaje siempre comienza con un valor de NEW y termina con un valor de COMPLETE o CANCELED.

En el caso de un viaje con varios destinos, además de actualizar el estado del viaje como lo harías para un viaje con un solo destino, también debes actualizar lo siguiente cada vez que el vehículo llega a un destino intermedio:

  • intermediateDestinationIndex
  • intermediateDestinationsVersion

Para ello, usa los siguientes valores de la enumeración TripStatus.

  • ENROUTE_TO_PICKUP
  • ARRIVED_AT_PICKUP
  • ENROUTE_TO_INTERMEDIATE_DESTINATION
  • ARRIVED_AT_INTERMEDIATE_DESTINATION
  • ENROUTE_TO_DROPOFF
  • COMPLETE

Ejemplo de viaje con destinos intermedios

A continuación, se muestra cómo crear un viaje de varios destinos que pasó por su punto de partida y ahora está en camino a su primer destino intermedio.

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

¿Qué sigue?