Finalizowanie zadań

Zakładamy w nim, że wiesz, jak tworzyć zadania i ich używać. Znajdziesz tutaj konkretne przykłady realizowania zadań dostawy:

  • Zamknięcie zadania: zamknięcie zadania dostawy zmienia jego stan na CLOSED i wskazuje, że nie jest już aktywne.

  • Określ wynik zadania: gdy zadanie zostanie zamknięte, możesz je zakończyć, ustawiając jego wynik na SUCCEEDED lub FAILED. Jest to ważny element procesu finalizowania zadania, który umożliwia wyświetlanie wyniku dostawy w ramach udostępniania trasy i prawidłowe rozliczenie usługi Fleet Engine.

Zamykanie zadania

Możesz zamknąć zadanie na te sposoby:

  • Zaktualizuj stan zatrzymania pojazdu. Usuwasz z pojazdu przystanek, co z kolei zamyka wszystkie powiązane z nim zadania. Więcej informacji znajdziesz w sekcji Aktualizacja stanu przystanku.
  • Usuń zadanie z listy postojów dla pojazdów. Obejmuje to zaktualizowanie listy zadań dla przystanku, ale zamknięte zadanie nie będzie już na tej liście. Aby dowiedzieć się, jak zaktualizować kolejność zadań, zapoznaj się z artykułem Aktualizowanie zadań.
  • Ustaw stan zadania na CLOSED. Można to robić tylko w przypadku zadań, które nie są przypisane do pojazdów. Informacje o tym podejściu znajdziesz w tej sekcji.

Po zamknięciu zadania nie można go ponownie otworzyć.

Zamknięcie zadania nie oznacza jego powodzenia ani niepowodzenia. Oznacza ono, że zadanie nie jest już uważane za trwające. Aby wskazać rzeczywisty wynik zadania i wyświetlało się to na potrzeby śledzenia floty i udostępniania trasy, musisz wskazać rzeczywisty wynik zadania. Zapoznaj się z sekcją Określanie wyniku zadania poniżej.

Pola zadania dotyczące zamykania zadań

W tej sekcji znajdziesz informacje o wymaganych polach, które należy ustawić podczas zamykania zadania. Silnik floty ignoruje wszystkie inne pola w danym elemencie.

Pole wymagane Wartość
state State.CLOSED

Bezpośrednie zamykanie zadania

W poniższych przykładach pokazujemy, jak umieścić nieprzypisane zadanie w stan zamknięty, w gRPC albo za pomocą wywołania żądania HTTP REST UpdateTask.

gRPC

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

 DeliveryServiceBlockingStub deliveryService =
   DeliveryServiceGrpc.newBlockingStub(channel);

 // Task settings
 String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
 Task task = Task.newBuilder()
   .setName(taskName)
   .setState(Task.State.CLOSED) // You can only directly CLOSE a
   .build();                    // task that is NOT assigned to a vehicle.

 // Task request
 UpdateTaskRequest updateTaskRequest =
   UpdateTaskRequest.newBuilder()  // No need for the header
       .setTask(task)
       .setUpdateMask(FieldMask.newBuilder().addPaths("state"))
       .build();

 try {
   Task updatedTask = deliveryService.updateTask(updateTaskRequest);
 } catch (StatusRuntimeException e) {
   Status s = e.getStatus();
   switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
   }
   return;
 }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=state

  • &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 artykule Role na kontach usługitokeny sieciowe JSON.
  • W treści żądania musisz podać element Task

Przykładowe polecenie curl:

 # Set JWT, PROJECT_ID, and TASK_ID in the local environment
 curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=state,taskOutcome,taskOutcomeTime" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "state": "CLOSED",
   "taskOutcome": "SUCCEEDED",
   "taskOutcomeTime": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
 }
 EOM

Wyznacz wynik zadania

Aby wskazać rzeczywisty wynik zadania, dla zamkniętych zadań ustawiasz wynik na SUCCEEDED lub FAILED. Zanim określisz wynik zadania, musi ono zostać zamknięte. Fleet Engine pobiera opłaty tylko za zadania dostawy o stanie SUCCEEDED.

Szczegóły wyniku zadania

Zadania zawierają też dodatkowe informacje o wyniku działania. Możesz je ustawić bezpośrednio, a silnik floty będzie ich przestrzegać:

  • Lokalizacja wyniku zadania: Fleet Engine automatycznie wypełnia lokalizację wyniku zadania ostatnią znaną lokalizacją pojazdu. Możesz go jednak podać.
  • Czas wyniku zadania: Fleet Engine nie wypełnia tego pola, ale możesz to zmienić.

Aby ustawić task_outcome_location i task_outcome_time, możesz użyć tych rozwiązań:

  • Zaktualizuj je w tym samym żądaniu, które określa wynik zadania.
  • Zaktualizuj je później, gdy określisz wynik zadania.
  • Zmodyfikuj je ponownie po ich ustawieniu.

Fleet Engine uniemożliwia wprowadzanie tych zmian dotyczących wyników zadań:

  • Nie możesz zmienić wyniku zadania po ustawieniu wartości SUCCEEDED lub FAILED.
  • W przypadku zadań bez określonego wyniku nie możesz ustawić lokalizacji ani czasu wyniku.

Pola zadania do ustawiania wyniku

W tej sekcji opisujemy pola wymagane i opcjonalne, które należy ustawić podczas ustawiania wyniku zadania. Podczas aktualizacji Fleet Engine ignoruje inne pola w jednostce.

Pole wymagane Wartość
taskOutcome Outcome.SUCCEEDED lub Outcome.FAILED

Pole opcjonalneWartość
taskOutcomeLocation Lokalizacja, w której zadanie zostało ukończone. Jeśli nie jest ustawiona, Fleet Engine przyjmuje domyślnie ostatnią lokalizację pojazdu.
taskOutcomeTime Sygnatura czasowa określająca, kiedy zadanie zostało ukończone.

Przykłady wyników zadań

Ten przykład pokazuje, jak za pomocą biblioteki Java gRPC i wywołania HTTP REST do usługi UpdateTask ustawić wynik zadania na SUCCEEDED oraz ustawić lokalizację, w której zostało ono ukończone.

gRPC

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

 DeliveryServiceBlockingStub deliveryService =
   DeliveryServiceGrpc.newBlockingStub(channel);

 // Task settings
 String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
 Task task = Task.newBuilder()
   .setName(taskName)
   .setTaskOutcome(TaskOutcome.SUCCEEDED)
   .setTaskOutcomeTime(now())
   .setTaskOutcomeLocation(               // Grand Indonesia East Mall
     LocationInfo.newBuilder().setPoint(
       LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
   .build();

 // Task request
 UpdateTaskRequest updateTaskRequest =
   UpdateTaskRequest.newBuilder()  // No need for the header
       .setTask(task)
       .setUpdateMask(FieldMask.newBuilder().addPaths("task_outcome", "task_outcome_time", "task_outcome_location"))
       .build();

 try {
   Task updatedTask = deliveryService.updateTask(updateTaskRequest);
 } catch (StatusRuntimeException e) {
   Status s = e.getStatus();
   switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
   }
   return;
 }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation

  • <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 artykule Role na kontach usługitokeny sieciowe JSON.
  • Treść żądania musi zawierać element Task.
 # Set JWT, PROJECT_ID, and TASK_ID in the local environment
 curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "taskOutcome": "SUCCEEDED",
   "taskOutcomeTime": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
   "taskOutcomeLocation": {
     "point": {
       "latitude": -6.195139,
       "longitude": 106.820826
     }
   }
 }
 EOM

Co dalej?