Обновление задач по доставке

Этот документ предполагает знакомство со следующим:

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

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

В следующих примерах показано, как использовать библиотеку Java gRPC и вызов 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;
 }

ОТДЫХ

 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

Что дальше