Как обновить задачи для транспортного средства

Для работы с этим документом необходимо знать следующее:

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

Обновлять задачи транспортного средства можно в любое время, но обычно это делается в следующих целях:

  • Планировать задачи для транспортного средства. Для этого можно отправить запрос на обновление, который добавит новую остановку для транспортного средства или новую задачу для существующей остановки.
  • Изменить порядок существующих задач, связанных с определенной остановкой.
  • Изменить место выполнения задачи. По умолчанию Fleet Engine отмечает место завершения задачи как то же место, что и остановка транспортного средства, связанная с задачей. При желании вы можете указать конкретные места для отдельных задач. Например, транспортное средство может остановиться у большого комплекса, чтобы доставить несколько посылок, каждая из которых предназначена для определенной почтовой комнаты.
  • Закройте все ранее назначенные задачи, чтобы они не попали в обновленный порядок. Подробнее о завершении задач…

Как запланировать или изменить задачи доставки

Вы можете планировать или изменять задачи, назначенные транспортному средству, в серверной среде или с помощью Driver SDK, если вы предоставляете водителю возможность управлять задачами с помощью надежного устройства. Используйте только один метод, чтобы избежать состояния гонки и сохранить единый источник достоверных данных.

Чтобы перенести груз из одного транспортного средства в другое, закройте исходную задачу и создайте ее заново, прежде чем назначать другому транспортному средству. Если вы обновите транспортное средство доставки, включив в него задачу, которая уже назначена другому транспортному средству, вы получите сообщение об ошибке.

Обязательные поля для обновления задач

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

Обязательное полеЗначение
remainingVehicleJourneySegments Список сегментов маршрута для задач в порядке их выполнения. Первая задача в списке выполняется первой.
remainingVehicleJourneySegments[i].stop Остановка для задачи i в списке.
remainingVehicleJourneySegments[i].stop.plannedLocation Запланированное место остановки.
remainingVehicleJourneySegments[i].stop.tasks Список задач, которые нужно выполнить на этой остановке.
remainingVehicleJourneySegments[i].stop.state State.NEW

Пример назначения задач

В примерах ниже показано, как использовать библиотеку gRPC для Java и HTTP-вызов REST к UpdateDeliveryVehicle, чтобы добавить две новые задачи для транспортного средства.

gRPC

 static final String PROJECT_ID = "my-delivery-co-gcp-project";
 static final String VEHICLE_ID = "vehicle-8241890";
 static final String TASK1_ID = "task-756390";
 static final String TASK2_ID = "task-849263";

 DeliveryServiceBlockingStub deliveryService =
   DeliveryServiceGrpc.newBlockingStub(channel);

 // Vehicle settings
 String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
 DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
     .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 1st stop
        .setStop(VehicleStop.newBuilder()
            .setPlannedLocation(LocationInfo.newBuilder()
                .setPoint(LatLng.newBuilder()
                    .setLatitude(37.7749)
                    .setLongitude(122.4194)))
            .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
            .setState(VehicleStop.State.NEW)))
     .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
        .setStop(VehicleStop.newBuilder()
            .setPlannedLocation(LocationInfo.newBuilder()
                .setPoint(LatLng.newBuilder()
                    .setLatitude(37.3382)
                    .setLongitude(121.8863)))
            .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
            .setState(VehicleStop.State.NEW)))
     .build();

 // DeliveryVehicle request
 UpdateDeliveryVehicleRequest updateDeliveryRequest =
   UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
       .setName(vehicleName)
       .setDeliveryVehicle(deliveryVehicle)
       .setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
       .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

 PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • <id> – уникальный идентификатор транспортного средства доставки в вашем автопарке, для которого вы хотите обновить порядок задач. Это идентификатор, который вы указали при создании транспортного средства.

  • Заголовок запроса должен содержать поле Authorization со значением Bearer <token>, где <token> – токен, выпущенный вашим сервером в соответствии с инструкциями, приведенными в разделах Роли сервисных аккаунтов и Веб-токены JSON.

  • Тело запроса должно содержать объект DeliveryVehicle.

Пример команды curl:

  # 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=remainingVehicleJourneySegments" \
    -H "Content-type: application/json" \
    -H "Authorization: Bearer ${JWT}" \
    --data-binary @- << EOM
  {
    "remainingVehicleJourneySegments": [
      {
        "stop": {
          "state": "NEW",
          "plannedLocation": {
            "point": {
              "latitude": 37.7749,
              "longitude": -122.084061
            }
          },
          "tasks": [
            {
              "taskId": "${TASK1_ID}"
            }
          ]
        }
      },
      {
        "stop": {
          "state": "NEW",
          "plannedLocation": {
            "point": {
              "latitude": 37.3382,
              "longitude": 121.8863
            }
          },
          "tasks": [
            {
              "taskId": "${TASK2_ID}"
            }
          ]
        }
      }
    ]
  }
  EOM

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