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

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

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

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

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

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

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

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

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

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

Обязательное полеЗначение
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

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