Создавайте общие групповые поездки

В этом документе описывается, как создать общую групповую поездку, задать правильные поля и назначить ее транспортному средству для выполнения. Предполагается, что вы настроили Fleet Engine, создали транспортные средства, имеете работающее приложение для водителей и, при необходимости, потребительское приложение. Вы также должны быть знакомы с различными сценариями поездок, доступными для поездок по запросу. Для этого обратитесь к следующим соответствующим руководствам:

Основы создания поездок

В этом разделе описаны детали запроса, необходимые для создания поездки в Fleet Engine. Вы отправляете запрос на создание, используя gRPC и REST.

  • Метод CreateTrip() : gRPC или REST
  • Сообщение CreateTripRequest : только gRPC

Поля поездки

Используйте следующие поля, чтобы создать поездку в Fleet Engine. Вы можете использовать разные поля для разных типов поездок: поездки с одним или несколькими пунктами назначения, попутные поездки или групповые поездки. Вы можете указать необязательные поля при создании поездки или установить их позже, при обновлении поездки.

Поля поездки
Имя Необходимый? Описание
родитель Да Строка, включающая идентификатор проекта. Этот идентификатор должен совпадать с тем же идентификатором, который используется во всей вашей интеграции Fleet Engine, с теми же ролями учетной записи службы.
trip_id Да Созданная вами строка, которая однозначно идентифицирует эту поездку. Идентификаторы поездок имеют определенные ограничения, как указано в справке.
тип_путешествия Да Установите для TripType следующие значения для создаваемого типа поездки:
  • Один пункт назначения : установите значение SHARED или EXCLUSIVE .
  • Несколько пунктов назначения : установите значение EXCLUSIVE .
  • Взаимно : установите значение EXCLUSIVE .
  • Общий пул : установите значение SHARED .
точка_подачи Да Начальная точка поездки.
Промежуточные направления Да

Только поездки с несколькими пунктами назначения : список промежуточных пунктов назначения, которые водитель посещает между посадкой и высадкой. Как и в случае с dropoff_point , это поле также можно установить позже, вызвав UpdateTrip , но поездка с несколькими пунктами назначения по определению содержит промежуточные пункты назначения.

Vehicle_waypoints Да

Только для поездок с общим пулом : это поле поддерживает чередование путевых точек из нескольких поездок. Он содержит все оставшиеся путевые точки для назначенного транспортного средства, а также путевые точки посадки и высадки для этой поездки. Вы можете установить это поле, вызвав CreateTrip или UpdateTrip . Вы также можете обновить путевые точки транспортного средства через поле waypoints с помощью вызова UpdateVehicle . Служба не возвращает эту информацию при звонках GetTrip по соображениям конфиденциальности.

количество_пассажиров Нет Количество пассажиров в поездке.
dropoff_point Нет Пункт назначения поездки.
идентификатор транспортного средства Нет Идентификатор транспортного средства, назначенного для поездки.

Пример: создать совместную поездку

В следующем примере серверной интеграции показано, как создать поездку и назначить ее транспортному средству в качестве поездки с общим пулом.

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

Обновить общие поездки в пуле

Любая поездка, созданная в Fleet Engine, должна быть назначена транспортному средству, чтобы Fleet Engine мог рассчитывать расчетное время поездки и отслеживать ее. Это можно сделать либо во время создания поездки, либо позже, при обновлении поездки.

Для поездок с общим пулом вы должны указать порядок непосещенных путевых точек в коллекции путевых точек транспортных средств поездки ( Trip.vehicle_waypoints ). Fleet Engine использует этот список для автоматического обновления путевых точек для всех поездок в общем пуле.

Например, рассмотрим две поездки с общим пулом: Trip A и Trip B :

  • Рейс А находится в пути к месту высадки.
  • Затем поездка B добавляется к тому же транспортному средству.

В одном UpdateTripRequest для Trip B вы устанавливаете vehicleId , а также устанавливаете Trip.vehicle_waypoints в оптимальный порядок точек маршрута: B PickupA Drop-offB Drop-off .

  • Вызов getVehicle() возвращает remainingWaypoints , которые содержат:
    B ПикапA ВозвратB Возврат .
  • Либо getTrip() либо обратный вызов onTripRemainingWaypointsUpdated для поездки A возвращает remainingWaypoints которые содержат:
    B ПикапA Выезд .
  • Либо getTrip() либо обратный вызов onTripRemainingWaypointsUpdated для поездки B возвращает remainingWaypoints которые содержат:
    B ПикапA ВозвратB Возврат .

Пример

В следующем примере серверной интеграции показано, как обновить поездку с помощью идентификатора транспортного средства и путевых точек для двух поездок с общим пулом.

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

Что дальше