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