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

В этом документе предполагается, что вы прочитали вводное руководство по запланированным задачам в разделе « Введение в 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 : номер или идентификатор, используемый для отслеживания отправления. Не заполняйте это поле для задач, не связанных с отправкой.
planned_location Только для задач типа PICKUP , DELIVERY или SCHEDULED_STOP : место, где должна быть выполнена задача. Не требуется для задач UNAVAILABLE .
task_duration Ожидаемое время, которое необходимо добавить для выполнения задачи. Например, на поиск парковки или на то, чтобы дойти до места передачи.

Необязательные поля задачи отгрузки

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

Создать задачу по забору груза

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

В следующих примерах показано, как создать задачу по забору груза с помощью библиотеки 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 Mall.

В следующих примерах показано, как создать задачу по забору груза с помощью библиотеки 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
 ```

Что дальше?