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

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

Что дальше