Utwórz zadania związane z dostawą

W tym dokumencie zakładamy, że przeczytałeś/przeczytałaś przewodnik wprowadzający Zaplanowane zadania w sekcji Wprowadzenie do Fleet Engine oraz Co to jest zaplanowane zadanie? w tej sekcji.

Silnik floty do zadań zaplanowanych obejmuje różne ogólne kategorie zadań:

  • Zadania związane z dostawami: służą do wykonywania zadań związanych z prowadzeniem pojazdu, w tym odbierania i dostarczania przesyłek.
  • Zadania dotyczące niedostępności: używaj ich, gdy kierowcy są niedostępni, na przykład podczas przerw.
  • Zadania związane z planowanymi postojami: używaj ich do wykonywania zadań niezwiązanych z prowadzeniem pojazdu w miejscach odbioru przesyłek lub w miejscach docelowych klientów, takich jak czas na wejście do budynku lub znalezienie punktu dostawy.

Z tego dokumentu dowiesz się, jak tworzyć na serwerze zadania dostawy. Inne typy zadań znajdziesz w sekcji Tworzenie innych typów zadań.

Pola zadania dotyczącego dostawy

W tej sekcji znajdziesz opis pól zadań, które są potrzebne do wykonania zarówno zadań odbioru, jak i doręczenia.

Wymagane pola zadania

W przypadku każdego zadania utworzonego w Fleet Engine musisz podać wymagane pola, a także możesz podać dowolne pola opcjonalne. Fleet Engine ignoruje wszystkie inne pola i zgłasza wyjątek, jeśli żądanie utworzenia zadania zawiera przypisane deliveryVehicleId. Aby przypisać zadania do pojazdu, użyj elementu UpdateDeliveryVehicleRequest. Więcej informacji znajdziesz w artykule Aktualizowanie zadań.

PoleWartość
type

Ustaw typ zgodny z typem zadania, który może być jeden z tych:

  • PICKUP
  • DELIVERY
  • SCHEDULED_STOP
  • UNAVAILABLE
state State.OPEN
task_id Unikalny identyfikator zadania. Nie może to być numer śledzenia przesyłki. Jeśli w Twoim systemie nie ma identyfikatorów zadań, możesz wygenerować unikalny identyfikator uniwersalny (UUID). Szczegółowe informacje znajdziesz w sekcji Identyfikatory zadań.
tracking_id PICKUP lub DELIVERY tylko zadania: Numer lub identyfikator używany do śledzenia przesyłki. Nie podawaj tego pola w przypadku zadań, które nie dotyczą wysyłki.
plannedLocation PICKUP, DELIVERY lub SCHEDULED_STOP tylko zadania: lokalizacja, w której ma zostać wykonane zadanie. Nie jest wymagane w przypadku zadań UNAVAILABLE.
taskDuration Przewidywany czas potrzebny na wykonanie zadania. Na przykład, aby znaleźć miejsce parkingowe lub dotrzeć do miejsca przekazania.

Opcjonalne pola zadania związanego z wysyłką

PoleWartość
targetTimeWindow Okno czasowe, w którym należy wykonać zadanie. To pole nie ma wpływu na sposób kierowania.
task_tracking_view_config PICKUP lub DELIVERY tylko zadania: konfiguracja śledzenia zadań, która określa, które elementy danych są widoczne dla użytkowników i w jakich okolicznościach.
attributes Lista atrybutów niestandardowych zadań. Każdy atrybut musi mieć unikalny klucz.

Tworzenie zadania odbioru przesyłki

Aby używać Fleet Engine do śledzenia aktywności kierowcy podczas odbioru przesyłki, utwórz zadanie odbioru przesyłki. Oznacza to ustawienie atrybutu typu zadania na PICKUP. Poniższy przykład pokazuje odbiór przesyłki z Grand Indonesia East Mall.

Poniższe przykłady pokazują, jak utworzyć zadanie odbioru przesyłki za pomocą biblioteki Java gRPC lub jak wysłać żądanie HTTP REST do 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;
  }

REST

Aby utworzyć zadanie odbioru przesyłki z poziomu środowiska serwera, wykonaj wywołanie HTTP REST do CreateTask:

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

<id> to unikalny identyfikator zadania.

Nagłówek żądania musi zawierać pole Authorization o wartości Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykułach Role kont usługiKody dostępu JSON.

Treść żądania musi zawierać element Task z odpowiednimi polami opisanymi w sekcji Pola zadania dotyczącego dostawy.

Przykład polecenia 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

Tworzenie zadania dostawy przesyłki

Aby używać Fleet Engine do śledzenia aktywności kierowcy dostarczającego przesyłkę, utwórz zadanie dostawy przesyłki. Polega to na ustawieniu atrybutu typu zadania na DELIVERY. Ten przykład pokazuje dostawę do Grand Indonesia East Mall.

Poniższe przykłady pokazują, jak utworzyć zadanie odbioru przesyłki za pomocą biblioteki Java gRPC lub jak wysłać żądanie HTTP REST do 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;
  }

REST

Aby utworzyć zadanie odbioru przesyłki z poziomu środowiska serwera, wykonaj wywołanie HTTP REST do CreateTask:

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

<id> to unikalny identyfikator zadania.

Nagłówek żądania musi zawierać pole Authorization o wartości Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykułach Role kont usługiKody dostępu JSON.

Treść żądania musi zawierać element Task:

Przykład polecenia 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
 ```

Co dalej?