Finalizowanie zadań

Z dokumentu wynika, że wiesz, jak tworzyć zadania i z nich korzystać. Zawiera ona konkretne przykłady, jak dokończyć zadania związane z dostawą:

  • Zamykanie zadania: zamknięcie zadania dotyczącego dostawy powoduje zmianę jego stanu na CLOSED i wskazuje, że zadanie nie jest już aktywne.

  • Ustaw wynik zadania: po zamknięciu zadania możesz je ukoń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

Zadania możesz zamykać na te sposoby:

  • Zaktualizuj stan zatrzymania pojazdu. usuwasz przystanek z pojazdu, co z kolei powoduje zamknięcie wszystkich zadań powiązanych z tym przystankiem; Więcej informacji znajdziesz w artykule o zmianie stanu.
  • Usuń zadanie z listy przystanków pojazdu. 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żesz to zrobić tylko w przypadku zadań nieprzypisanych do pojazdów. Ta sekcja pokazuje to podejście.

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

Zamknięcie zadania nie oznacza jego powodzenia lub niepowodzenia. Oznacza to, że zadanie nie jest już w toku. Aby wskazać rzeczywisty wynik zadania i wyświetlić go na potrzeby śledzenia floty i udostępniania przejazdów, musisz wskazać rzeczywisty wynik zadania. Poniżej znajdziesz informacje o ustawianiu wyniku zadania.

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

Zamknij zadanie bezpośrednio

Poniższe przykłady pokazują, jak ustawić nieprzypisane zadanie jako zamknięte, w gRPC lub za pomocą wywołania żądania HTTP REST do 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

  • <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.
  • W treści żądania musisz podać element Task.

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

Ustaw 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. Możesz je ustawić bezpośrednio, a silnik floty będzie ich przestrzegać:

  • Lokalizacja zakończenia zadania: Fleet Engine automatycznie wypełnia lokalizację zakończenia zadania ostatnią znaną lokalizacją pojazdu. Jeśli wolisz, możesz podać je w innej formie.
  • Czas zakończenia zadania: Fleet Engine nie wypełnia tego pola, ale możesz go ustawić.

Aby ustawić wartości task_outcome_location i task_outcome_time, możesz użyć dowolnej z tych metod:

  • 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.

Silnik floty 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 znajdziesz opis pól wymaganych i opcjonalnych, które należy skonfigurować podczas ustawiania wyniku zadania. Podczas aktualizacji Fleet Engine ignoruje inne pola w danym elemencie.

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

Pole opcjonalneWartość
taskOutcomeLocation Miejsce, w którym zostało ukończone zadanie. 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?