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