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 związane z brakiem dostępności: używaj go, gdy kierowcy nie są dostępni, np. w sytuacjach, gdy wymagane są przerwy.
  • Zadania zaplanowanych zatrzymania: używaj w przypadku zadań niezwiązanych z prowadzeniem samochodu w skrzynkach referencyjnych lub lokalizacjach klientów, np. dotyczących czasu wejścia do budynku lub zlokalizowania punktu dostawy.

Z tego dokumentu dowiesz się, jak tworzyć na serwerze zadania dostawy. Informacje o innych typach zadań znajdziesz w artykule Tworzenie innych typów zadań.

Pola zadania dostawy

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

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 wyrzuca wyjątek, jeśli żądanie utworzenia zadania zawiera przypisane deliveryVehicleId. Aby przypisać zadania do pojazdu, użyj funkcji 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 artykule o identyfikatorach zadań.
tracking_id Tylko zadania PICKUP lub DELIVERY: numer lub identyfikator, którego używasz do śledzenia przesyłki. Nie podawaj tego pola w przypadku zadań niezwiązanych z wysyłką.
plannedLocation PICKUP, DELIVERY lub SCHEDULED_STOP tylko zadania: lokalizacja, w której ma zostać wykonane zadanie. Nie jest wymagane w przypadku UNAVAILABLE zadań.
taskDuration Szacowany czas potrzebny na ukończenie zadania. Możesz na przykład poszukać parkingu lub przejść do miejsca, w którym zawrzesz zamówienie.

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 Tylko zadania PICKUP lub DELIVERY: konfiguracja śledzenia zadań określająca, które elementy danych są widoczne dla użytkowników w konkretnych 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. Wymaga to ustawienia atrybutu typu zadania na PICKUP. Poniższy przykład ilustruje 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 w środowisku serwera, wyślij wywołanie HTTP REST do CreateTask:

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

&lt;id&gt; 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 wykorzystać Fleet Engine do śledzenia aktywności kierowcy dostarczającego przesyłkę, utwórz zadanie dostarczenia przesyłki. Polega to na ustawieniu atrybutu typu zadania na DELIVERY. Poniższy przykład przedstawia dostawę do centrum handlowego GrandIndonesia 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 w środowisku serwera, wyślij 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 z wartością Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykule Role konta usługi i tokeny sieciowe JSON.

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

Przykładowe polecenie 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?