Crear viajes de reducción compartidos

En este documento, se describe cómo crear un viaje de viaje compartido, establecer los campos correctos y asignarlo a un vehículo para que se complete. Se supone que ya configuraste Fleet Engine, creaste vehículos, tienes una app para conductores en funcionamiento y, de manera opcional, una aplicación para consumidores. También debes estar familiarizado con los distintos casos de uso de viajes disponibles para viajes a pedido. Consulta las siguientes guías relacionadas para obtener más información:

Conceptos básicos de la creación de viajes

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

  • CreateTrip() método: gRPC o REST
  • Mensaje CreateTripRequest: gRPC solamente

Campos de viaje

Usa los siguientes campos para crear un viaje en Fleet Engine. Puedes usar diferentes campos para los distintos tipos de viajes: de uno o varios destinos, consecutivos o de viaje compartido. Puedes proporcionar los campos opcionales cuando creas el viaje o establecerlos más adelante cuando lo actualices.

Campos de viaje
Nombre ¿Obligatorio? Descripción
parent 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 Una cadena que creas y que identifica de forma única este viaje. Los IDs de viaje tienen ciertas restricciones, como se indica en la referencia.
trip_type Establece el TripType en los siguientes valores para el tipo de viaje que estás creando:
  • Un solo destino: Establece en SHARED o EXCLUSIVE.
  • Varios destinos: Establece en EXCLUSIVE.
  • Consecutivo: Establece en EXCLUSIVE.
  • Agrupación compartida: Establece en SHARED.
pickup_point El punto de origen del viaje.
Destinos intermedios

Solo viajes con varios destinos: La lista de destinos intermedios que visita el conductor entre la recogida y el descenso. Al igual que con dropoff_point, este campo también se puede establecer 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 ruta de varios viajes. Contiene todos los puntos de ruta restantes del vehículo asignado, así como los puntos de ruta de recogida y descenso de este viaje. Puedes establecer este campo llamando a CreateTrip o UpdateTrip. También puedes actualizar los puntos de ruta del vehículo a través del campo waypoints con una llamada a UpdateVehicle. El servicio no muestra esta información en las llamadas GetTrip por motivos de privacidad.

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

Ejemplo: Crea un viaje compartido

En el siguiente ejemplo de integración de backend, se muestra cómo crear un viaje y asignarlo a un vehículo como un viaje compartido.

// Vehicle with VEHICLE_ID ID is already created and it is assigned Trip A.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "shared-trip-A";
static final String VEHICLE_ID = "your-vehicle-id";
static final String TRIP_A_ID = "trip-a-id";
static final String TRIP_B_ID = "trip-b-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;

LatLng tripBPickup =
    LatLng.newBuilder().setLatitude(-12.12314).setLongitude(88.142123).build();
LatLng tripBDropoff =
    LatLng.newBuilder().setLatitude(-14.12314).setLongitude(90.142123).build();

TerminalLocation tripBPickupTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBPickup).build();
TerminalLocation tripBDropoffTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBDropoff).build();

// TripA already exists and it's assigned to a vehicle with VEHICLE_ID ID.
Trip tripB = Trip.newBuilder()
    .setTripType(TripType.SHARED)
    .setVehicleId(VEHICLE_ID)
    .setPickupPoint(tripBPickupTerminalLocation)
    .setDropoffPoint(tripBDropoffTerminalLocation)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripBPickupTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripBDropoffTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// Create Trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId(TRIP_B_ID)
    .setTrip(tripB)
    .build();

try {
  // createdTrip.remainingWaypoints will contain shared-pool waypoints.
  // [tripB.pickup, tripA.dropoff, tripB.dropoff]
  Trip createdTrip = tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Actualiza los viajes compartidos

Cualquier viaje creado en Fleet Engine debe asignarse a un vehículo para que Fleet Engine pueda calcular las ETA del viaje y hacer un seguimiento de él. Puedes hacerlo durante la creación del viaje o más adelante cuando lo actualices.

Para los viajes compartidos, debes especificar un orden para los puntos de ruta no visitados en la colección de puntos de ruta del vehículo del viaje (Trip.vehicle_waypoints). Fleet Engine usa esta lista para actualizar automáticamente los puntos de ruta del viaje para todos los viajes en el viaje compartido.

Por ejemplo, considera dos viajes compartidos, el viaje A y el viaje B:

  • El viaje A está en camino a su ubicación de descenso.
  • Luego, se agrega el viaje B al mismo vehículo.

En una UpdateTripRequest para el viaje B, estableces el vehicleId y también estableces Trip.vehicle_waypoints en el orden óptimo de los puntos de ruta: Recogida BDescenso ADescenso B.

  • Si llamas a getVehicle(), se muestra remainingWaypoints que contiene:
    B RecogidaA DescensoB Descenso.
  • Ya sea getTrip() o la onTripRemainingWaypointsUpdated devolución de llamada para el viaje A, se muestra remainingWaypoints que contiene:
    Recogida BDescenso A.
  • Ya sea getTrip() o la onTripRemainingWaypointsUpdated devolución de llamada para el viaje B, se muestra remainingWaypoints que contiene:
    Recogida BDescenso ADescenso B.

Ejemplo

En el siguiente ejemplo de integración de backend, se muestra cómo actualizar un viaje con el ID del vehículo y los puntos de ruta para dos viajes compartidos.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_A_ID = "share-trip-A";
static final String TRIP_B_ID = "share-trip-B";
static final String VEHICLE_ID = "Vehicle";

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

// Get Trip A and Trip B objects from either the Fleet Engine or storage.
Trip tripA = ;
Trip tripB = ;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId(VEHICLE_ID)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getPickupPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getDropoffPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("vehicle_id")
        .addPaths("vehicle_waypoints"))
    .build();

// Error handling. If Fleet Engine has both a trip and vehicle with the IDs,
// and if the credentials validate, and if the given vehicle_waypoints list
// is valid, 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:          // Either the trip or vehicle does not exist.
      break;
    case PERMISSION_DENIED:
      break;
    case INVALID_REQUEST:    // vehicle_waypoints is invalid.
      break;
  }
  return;
}

¿Qué sigue?