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

В этом документе описывается, как обновить поездку и управлять ее состоянием, что предполагает использование маски поля для установки соответствующих полей для поездки. Предполагается, что вы настроили 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 .

Что дальше