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