Crear viajes de reducción compartidos

En este documento, se describe cómo crear un viaje de reducción compartido, establecer la campos y asignarlos a un vehículo para completar. Se supone que configuraste la flota Engine, creaste vehículos, tienes una app para conductores que funciona y opcionalmente, una aplicación para consumidores. También debes estar familiarizado con los diversos de viajes disponibles para los viajes a pedido. Consulta las siguientes guías relacionadas para que:

Conceptos básicos sobre la creación de viajes

En esta sección, se describen los detalles de la solicitud necesarios para crear un viaje en Fleet Engine. Se emite una solicitud de creación con gRPC y 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: uno o varios destinos, consecutivos o de reducción compartida. Tú puedes proporcionar los campos opcionales cuando crees el viaje o puedes configurarlos más adelante cuando actualices el viaje.

Campos del viaje
Nombre ¿Obligatorio? Descripción
elemento superior 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 la misma cuenta de servicio roles de seguridad.
trip_id Es una cadena que creas para identificar este viaje de forma exclusiva. Los IDs de viaje tienen ciertas restricciones, como se indica en la referencia.
trip_type Establece los siguientes valores de TripType para el tipo de viaje que crearás:
  • Destino único: Se establece en SHARED o EXCLUSIVE.
  • Varios destinos: Configúralo en EXCLUSIVE.
  • Back-to-back-to-back: Se establece en EXCLUSIVE.
  • Agrupación compartida: Se establece en SHARED.
pickup_point El punto de origen del viaje.
Destinos intermedios

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

vehicle_waypoints

Solo viajes de reducción compartida: Este campo admite la intercalación de los puntos de referencia desde varios viajes. Contiene todos los puntos de referencia restantes para el vehículo asignado, además de como puntos de referencia de partida y llegada para este viaje. Puedes configurar 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 un llamada a UpdateVehicle. El servicio no devuelve esta información en las llamadas a 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 de reducción compartida

El siguiente ejemplo de integración de backend demuestra cómo crear un viaje y y asignarlo a un vehículo como viaje de reducción compartida.

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

Actualizar los viajes de reducción compartidos

Cualquier viaje creado en Fleet Engine se debe asignar a un vehículo para que Fleet Engine para calcular las horas de llegada estimadas de los viajes y hacer un seguimiento de ella. Puedes hacer esto durante la creación del viaje o más adelante cuando actualices el viaje.

Para los viajes de agrupación compartidos, debes especificar un orden para los puntos de referencia no visitados en la colección de puntos de referencia de vehículos (Trip.vehicle_waypoints). Flota El motor de búsqueda usa esta lista para actualizar automáticamente los puntos de referencia de todos los viajes en el grupo compartido.

Por ejemplo, piensa en dos viajes en piscina compartida, el Viaje A y Viaje B:

  • El viaje A está en camino a su destino.
  • Luego, se agrega el viaje B al mismo vehículo.

En un UpdateTripRequest para el viaje B, establece el vehicleId y, también, el Trip.vehicle_waypoints en el valor óptimo pedido de puntos de referencia: B RetiroUn abandonoB Abandono.

  • Si llamas a getVehicle(), se muestra remainingWaypoints que contengan:
    B RetiroUn abandonoB Abandono.
  • Ya sea getTrip() o Devolución de llamada de onTripRemainingWaypointsUpdated para El viaje A devuelve remainingWaypoints que contengan lo siguiente:
    B RetiroUn Destino.
  • Ya sea getTrip() o Devolución de llamada de onTripRemainingWaypointsUpdated para El viaje B devuelve remainingWaypoints que contengan lo siguiente:
    B RetiroUn destinoB Abandono.

Ejemplo

El siguiente ejemplo de integración de backend demuestra cómo actualizar un viaje con el ID del vehículo y los puntos de referencia para dos viajes con piscina compartida.

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?