Создание задач по отправке

В этом документе предполагается, что вы прочитали вводное руководство по запланированным задачам в разделе «Введение в Fleet Engine», а также «Что такое запланированное задание?» в этой секции.

Fleet Engine для запланированных задач предоставляет различные широкие категории задач:

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

В этом документе описывается, как создавать задачи по доставке на вашем сервере. Информацию о других типах задач см. в разделе Создание других типов задач .

Поля задач по отгрузке

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

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

Для каждой задачи, которую вы создаете в Fleet Engine, вы должны предоставить ей обязательные поля, а также можете указать любые дополнительные поля. Fleet Engine игнорирует все остальные поля и выдает исключение, если запрос на создание задачи предоставляет назначенный deliveryVehicleId . Чтобы назначить задачи транспортному средству, используйте UpdateDeliveryVehicleRequest . Дополнительные сведения см. в разделе Задачи обновления .

Поле Ценить
type

Установите тип, соответствующий типу задачи, который является одним из:

  • PICKUP
  • DELIVERY
  • SCHEDULED_STOP
  • UNAVAILABLE
state State.OPEN
task_id Уникальный идентификатор задачи. Это не должен быть номер отслеживания посылки. Если в вашей системе нет идентификаторов задач, вы можете создать универсальный уникальный идентификатор (UUID). Подробности см. в разделе «Идентификаторы задач» .
tracking_id Только задачи PICKUP или DELIVERY : номер или идентификатор, который вы используете для отслеживания отправления. Не указывайте это поле для задач, не связанных с отгрузкой.
plannedLocation Только задачи PICKUP , DELIVERY или SCHEDULED_STOP : место, где задача должна быть завершена. Не требуется для UNAVAILABLE задач.
taskDuration Ожидаемое время добавления для завершения задачи. Например, чтобы найти парковку или дойти до места передачи.

Дополнительные поля задачи по доставке

Поле Ценить
targetTimeWindow Временной интервал, в течение которого задача должна быть выполнена. Это поле не влияет на поведение маршрутизации.
task_tracking_view_config Только задачи PICKUP или DELIVERY : конфигурация для отслеживания задач, которая определяет, какие элементы данных видны конечным пользователям и при каких обстоятельствах.
attributes Список пользовательских атрибутов задачи. Каждый атрибут должен иметь уникальный ключ.

Создайте задачу получения груза

Чтобы использовать Fleet Engine для отслеживания действий водителя, забирающего груз, создайте задачу получения груза. Это предполагает установку атрибута типа задачи PICKUP . Следующий пример иллюстрирует получение груза из торгового центра Grand Indonesia East.

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

gRPC

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

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Task settings
  String parent = "providers/" + PROJECT_ID;
  Task task = Task.newBuilder()
    .setType(Task.Type.PICKUP)
    .setState(Task.State.OPEN)
    .setTrackingId("my-tracking-id")
    .setPlannedLocation(               // Grand Indonesia East Mall
      LocationInfo.newBuilder().setPoint(
        LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
    .setTaskDuration(
      Duration.newBuilder().setSeconds(2 * 60))
    .setTargetTimeWindow(
      TimeWindow.newBuilder()
        .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
        .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
    .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
    .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
    .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
    .build();

  // Task request
  CreateTaskRequest createTaskRequest =
    CreateTaskRequest.newBuilder()  // No need for the header
        .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
        .setTaskId("task-8241890")  // Task ID assigned by the Provider
        .setTask(task)              // Initial state
        .build();

  // Error handling
  // If Fleet Engine does not have a task with that ID and the credentials of the
  // requestor pass, the service creates the task successfully.

  try {
    Task createdTask = deliveryService.createTask(createTaskRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
       case ALREADY_EXISTS:
         break;
       case PERMISSION_DENIED:
         break;
    }
    return;
  }

ОТДЫХ

Чтобы создать задачу получения груза из серверной среды, выполните HTTP REST-вызов CreateTask :

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>

<id> — уникальный идентификатор задачи.

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

Тело запроса должно содержать сущность Task с соответствующими полями, описанными в разделе Поля задачи отгрузки .

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

 # Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
 # environment
 curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "type": "PICKUP",
   "state": "OPEN",
   "trackingId": "${TRACKING_ID}",
   "plannedLocation": {
      "point": {
         "latitude": -6.195139,
         "longitude": 106.820826
      }
   },
   "taskDuration": "90s",
   "targetTimeWindow": {
     "startTime": "2023-03-29T21:00:00Z",
     "endTime": "2023-03-29T23:00:00Z"
   }
 }
 EOM

Создайте задачу доставки отправления

Чтобы использовать Fleet Engine для отслеживания действий водителя, доставляющего груз, создайте задачу доставки груза. Это включает установку атрибута типа задачи на DELIVERY . Следующий пример иллюстрирует доставку груза в торговый центр Grand Indonesia East.

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

gRPC

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

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Task settings
  String parent = "providers/" + PROJECT_ID;
  Task task = Task.newBuilder()
    .setType(Task.Type.DELIVERY)
    .setState(Task.State.OPEN)
    .setTrackingId("my-tracking-id")
    .setPlannedLocation(               // Grand Indonesia East Mall
      LocationInfo.newBuilder().setPoint(
        LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
    .setTaskDuration(
      Duration.newBuilder().setSeconds(2 * 60))
    .setTargetTimeWindow(
      TimeWindow.newBuilder()
        .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
        .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
    .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
    .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
    .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
    .build();

  // Task request
  CreateTaskRequest createTaskRequest =
    CreateTaskRequest.newBuilder()  // No need for the header
        .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
        .setTaskId("task-8241890")  // Task ID assigned by the Provider
        .setTask(task)              // Initial state
        .build();

  // Error handling
  // If Fleet Engine does not have task with that ID and the credentials of the
  // requestor pass, the service creates the task successfully.

  try {
    Task createdTask = deliveryService.createTask(createTaskRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
       case ALREADY_EXISTS:
         break;
       case PERMISSION_DENIED:
         break;
    }
    return;
  }

ОТДЫХ

Чтобы создать задачу получения груза из серверной среды, выполните HTTP REST-вызов CreateTask :

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>

<id> — уникальный идентификатор задачи.

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

Тело запроса должно содержать сущность Task :

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

 # Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
 # environment
 curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "type": "DELIVERY",
   "state": "OPEN",
   "trackingId": "${TRACKING_ID}",
   "plannedLocation": {
      "point": {
         "latitude": -6.195139,
         "longitude": 106.820826
      }
   },
   "taskDuration": "90s",
   "targetTimeWindow": {
     "startTime": "2023-03-29T21:00:00Z",
     "endTime": "2023-03-29T23:00:00Z"
   }
 }
 EOM
 ```

Что дальше