В этом документе описывается, как обновить поездку и управлять ее статусом. Для этого нужно использовать маску поля, чтобы задать нужные поля для поездки. Предполагается, что вы настроили Fleet Engine, как описано на этом сайте, и работаете с транспортным средством, назначенным для поездки.
Основные сведения об обновлениях поездок
Ваша система использует Fleet Engine для обновления поездки в следующих ситуациях:
- При назначении транспортного средства для поездки после ее создания.
- Когда статус поездки меняется, например когда транспортное средство проходит через путевые точки.
- При обновлении полей поездки, например количества пассажиров и пункта назначения.
Чтобы обновить поездку, отправьте запрос с помощью gRPC или REST.
Используйте подходящие учетные данные для сервисного аккаунта проекта, как описано в статье 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.