Обновление полей транспортного средства доставки

В этом документе описаны важные поля, которые можно обновлять при создании транспортных средств и управлении ими.

  • type: тип транспортного средства доставки. Это влияет на маршруты, созданные для этого транспортного средства.
  • attributes[] – необязательный массив типа DeliveryVehicleAttribute. С их помощью можно задавать собственные критерии для транспортных средств в сервисе, чтобы улучшить фильтрацию при поиске или составлении списка транспортных средств.
 

Полный список полей транспортных средств приведен в следующих статьях:

Поле атрибутов транспортного средства

Используйте поле attributes, чтобы создать собственные критерии поиска, которые помогут клиентам или операторам автопарка находить транспортные средства. Это расширяет возможности ваших приложений по подбору автомобилей по сравнению с использованием критериев поиска, основанных исключительно на других полях. У каждого транспортного средства может быть не более 100 атрибутов, и у каждого из них должен быть уникальный ключ. Значения могут быть строками, логическими значениями или числами.

Например, вы можете объявить настраиваемый атрибут zone, чтобы различать, в какой зоне города работают ваши транспортные средства доставки. Для обозначения разных зон можно использовать такие строковые значения, как 1B, 2C и 3A. Затем вы можете использовать фильтр в Fleet Tracking, чтобы показывать оператору, ответственному за определенную зону, только транспортные средства, работающие в этой зоне.

Однако значения настраиваемых атрибутов не обязательно должны быть взаимоисключающими. Например, можно использовать такие критерии, как доступно-ночью и есть-холодильник. Каждый из них может быть отдельным настраиваемым атрибутом, использующим логические значения. Для одного транспортного средства можно задать все три настраиваемых атрибута, а также настраиваемый атрибут zone с подходящим строковым значением.

Обновление атрибутов транспортного средства

Каждый ключ attributes может иметь только одно значение для каждого автомобиля. Вы объявляете настраиваемые атрибуты автомобиля, используя attributes в маске поля, а затем указываете значения на основе метода ниже.

Этот API UpdateDeliveryVehicle не позволяет обновлять только один атрибут. При использовании этого метода любое использование поля attributes в маске поля приводит к повторному объявлению всего набора атрибутов автомобиля. Это приведет к перезаписи всех ранее существовавших атрибутов, которые не были явно включены в маску поля. Если вы используете этот метод для объявления нового настраиваемого атрибута, вам также необходимо повторно объявить каждый настраиваемый атрибут, который вы хотите сохранить для транспортного средства. Если вы не укажете attributes в маске поля, то этот метод оставит существующие настраиваемые атрибуты в том виде, в котором они были определены ранее для автомобиля. Если вы используете attributes в маске поля, но не задаете значения, это эквивалентно удалению всех настраиваемых атрибутов из транспортного средства.

Пример обновления полей транспортного средства

В этом разделе показано, как обновить поля транспортного средства с помощью UpdateDeliveryVehicleRequest, который включает update_mask, чтобы указать, какие поля нужно обновить. Подробную информацию вы найдете в документации по буферам протокола в разделе Маски полей.

Для обновления других полей, кроме last_location, требуются права администратора Fleet Engine Delivery.

Пример: настройка настраиваемого атрибута

В этом примере указан новый атрибут: zone. Как отмечалось в разделе Обновление атрибутов транспортного средства, при обновлении поля attributes с помощью этого подхода необходимо указать все настраиваемые атрибуты, которые вы хотите сохранить. Поэтому в примере показано значение available-at-night, записанное для того, чтобы оно не было перезаписано во время операции обновления, в которой указано поле attributes.

См. справочную информацию о методе providers.deliveryVehicles.patch.

gRPC

  static final String PROJECT_ID = "my-delivery-co-gcp-project";
  static final String VEHICLE_ID = "vehicle-8241890";

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Vehicle settings
  String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
  DeliveryVehicle myDeliveryVehicle = DeliveryVehicle.newBuilder()
      .addAllAttributes(ImmutableList.of(
          DeliveryVehicleAttribute.newBuilder().setKey("zone").setValue("1B").build(),
          DeliveryVehicleAttribute.newBuilder().setKey("available-at-night").setValue("true").build()))
      .build();

  // DeliveryVehicle request
  UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
    UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
        .setName(vehicleName)
        .setDeliveryVehicle(myDeliveryVehicle)
        .setUpdateMask(FieldMask.newBuilder()
            .addPaths("attributes"))
        .build();

  try {
    DeliveryVehicle updatedDeliveryVehicle =
        deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
       case NOT_FOUND:
         break;
       case PERMISSION_DENIED:
         break;
    }
    return;
  }

REST

  # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
  # environment
  curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=attributes" \
    -H "Content-type: application/json" \
    -H "Authorization: Bearer ${JWT}" \
    --data-binary @- << EOM
  {
      "attributes": [
        {"key": "zone", "value": "1B"},
        {"key": "available-at-night", "value": "true"}
      ]
  }
  EOM

Дальнейшие действия