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