En este documento, se describe cómo crear un viaje compartido, configurar los campos correctos y asignarlo a un vehículo para que se lleve a cabo. Se supone 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 diferentes situaciones de viaje disponibles para los viajes a pedido. Consulta las siguientes guías relacionadas para lo siguiente:
- Configura Fleet Engine
- Crea un vehículo
- Situaciones de viaje en la descripción general de Viajes on demand
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 Flet Engine. Emites una solicitud de creación con gRPC o REST.
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.
Nombre | ¿Obligatorio? | Descripción |
---|---|---|
elemento superior | Sí | 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 | Sí | 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 | Sí | Establece TripType en los siguientes valores para el tipo de viaje que estás creando:
|
pickup_point | Sí | El punto de origen del viaje. |
Destinos intermedios | Sí | Solo para viajes con varios destinos: Es la lista de destinos intermedios que visita el conductor entre el punto de partida y el de destino. Al igual que con |
vehicle_waypoints | Sí | 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, así como los puntos de partida y llegada para este viaje. Puedes establecer este campo llamando a |
number_of_passengers | No | Es la cantidad de pasajeros del 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 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 se debe asignar a un vehículo para que Fleet Engine calcule la hora de llegada estimada del viaje y realice un seguimiento de ella. Puedes hacerlo durante la creación del viaje o más adelante cuando lo actualices.
Para los viajes de reducción compartida, debes especificar un orden para los puntos de referencia no visitados en la colección de puntos de referencia del viaje (Trip.vehicle_waypoints
). Fleet Engine usa esta lista para actualizar automáticamente los puntos de referencia de todos los viajes en el grupo compartido.
Por ejemplo, considera dos viajes en piscina compartida, el Viaje A y el Viaje B:
- El viaje A está en camino a su destino.
- Luego, se agrega Viaje B al mismo vehículo.
En un UpdateTripRequest
para el viaje B, configuras vehicleId
y también Trip.vehicle_waypoints
en el orden óptimo de puntos de referencia: B Recogida → A Destino → B Destino.
- Llamar a
getVehicle()
muestraremainingWaypoints
que contienen lo siguiente:
B Retiro → A Destino → B Destino. getTrip()
o la devolución de llamadaonTripRemainingWaypointsUpdated
para el Viaje A muestraremainingWaypoints
que contienen lo siguiente:
B Retiro → A Destino.getTrip()
o la devolución de llamadaonTripRemainingWaypointsUpdated
para el Viaje B muestraremainingWaypoints
que contienen lo siguiente:
B Partida → A Destino → B Destino.
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 referencia para dos viajes en una 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;
}