Обновляйте поездки и управляйте их состоянием

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

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

Ваша система использует Fleet Engine для обновления поездки в следующих ситуациях:

  • При назначении транспортного средства для поездки после ее создания.
  • При изменении статуса поездки, например, когда транспортное средство проезжает через промежуточные точки.
  • При обновлении полей поездки, таких как количество пассажиров и место высадки.

Чтобы обновить поездку, отправьте запрос, используя gRPC и REST.

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

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

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

Вы можете обновить любое из полей поездки, описанных в разделе Поля поездки в разделе Создание поездки с одним пунктом назначения . Например, после создания поездки обычно сначала находят транспортное средство, а затем обновляют поле vehicle_id поездки, чтобы связать его с транспортным средством, которое будет выполнять поездку.

Используйте полевые маски

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

Обновите поездку, указав идентификатор транспортного средства.

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

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

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

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId("8241890")
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest =
    UpdateTripRequest.newBuilder()      // No need for the header.
        .setName(tripName)
        .setTrip(trip)
        .setUpdateMask(FieldMask.newBuilder().addPaths("vehicle_id"))
        .build();

// Error handling.
// If the Fleet Engine has both a trip and vehicle with IDs, and if the
// credentials validate, 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:                    // Neither the trip nor vehicle exist.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Управление состоянием поездки

Состояние поездки указывается с помощью одного из значений перечисления TripStatus . При изменении состояния поездки, например, с ENROUTE_TO_PICKUP на ARRIVED_AT_PICKUP , состояние поездки обновляется в Fleet Engine. Жизненный цикл поездки всегда начинается со значения NEW и заканчивается значением COMPLETE или CANCELED .

Пример обновления поездки

Ниже показано, как обновить состояние поездки для двусторонней поездки в Fleet Engine.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

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

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip settings to be updated.
Trip trip = Trip.newBuilder()
    .setTripStatus(TripStatus.ARRIVED_AT_PICKUP)
    .build();

// Trip update request
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder().addPaths("trip_status"))
    .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:  // The given trip status is invalid.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Другие примеры обновления поездок вы можете увидеть в разделе Другие типы поездок .

Обработка ошибок поездки

При обновлении или поиске существующих рейсов вы можете столкнуться с ошибкой DEADLINE_EXCEEDED , в этом случае состояние Fleet Engine неизвестно. Чтобы выяснить это, сначала вызовите CreateTrip ещё раз, используя тот же идентификатор рейса, который вы пытаетесь обновить или отследить. В результате должен быть возвращен код 201 (CREATED) или 409 (CONFLICT). В последнем случае предыдущий запрос был выполнен успешно до DEADLINE_EXCEEDED .

Список сетевых ошибок см. в Consumer SDK для Android или iOS .

Что дальше?