Finalizowanie zadań

W tym dokumencie zakładamy, że wiesz, jak tworzyć zadania i jak z nich korzystać. Znajdziesz tu konkretne przykłady, jak zakończyć zadania związane z dostawą:

  • Zamknij zadanie: zamknięcie zadania związanego z dostawą zmienia jego stan na CLOSED i oznacza, że zadanie nie jest już aktywne.

  • Ustaw wynik zadania: po zamknięciu zadania możesz je zakończyć, ustawiając jego wynik na SUCCEEDED lub FAILED. Jest to ważna część procesu zamykania zadania, ponieważ pozwala wyświetlać wynik dostawy w udostępnianiu podróży i zapewnia prawidłowe rozliczenie usługi Fleet Engine.

Zamykanie zadania

Zadanie możesz zamknąć na te sposoby:

  • Zaktualizuj stan przystanku pojazdu. Usuwasz przystanek z pojazdu, co z kolei powoduje zamknięcie wszystkich zadań powiązanych z tym przystankiem. Więcej informacji znajdziesz w artykule Aktualizowanie stanu przystanku.
  • Usuń zadanie z listy przystanków pojazdu. Wymaga to zaktualizowania listy zadań dla przystanku, ale zamknięte zadanie nie jest już częścią listy. Więcej informacji znajdziesz w artykule Aktualizowanie zadań w sekcji Aktualizowanie kolejności zadań.
  • Ustaw stan zadania na CLOSED. Możesz to zrobić tylko w przypadku zadań nieprzypisanych do pojazdów. W tej sekcji pokazujemy, jak to zrobić.

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

Zamknięcie zadania nie oznacza, że zostało ono wykonane pomyślnie lub nie. Oznacza to, że zadanie nie jest już w trakcie realizacji. Aby wskazać rzeczywisty wynik zadania i wyświetlić go na potrzeby śledzenia floty i udostępniania podróży, musisz wskazać rzeczywisty wynik zadania. Więcej informacji znajdziesz w sekcji Ustawianie wyniku zadania poniżej.

Pola zadania do zamykania zadań

W tej sekcji opisujemy pola, które należy ustawić podczas zamykania zadania. Fleet Engine ignoruje wszystkie inne pola w encji na potrzeby aktualizacji.

Pole wymagane Wartość
state State.CLOSED

Bezpośrednie zamykanie zadania

Poniższe przykłady pokazują, jak ustawić stan zamknięty dla nieprzypisanego zadania 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 z wartością Bearer <token>, gdzie <token> jest wydawany przez Twój serwer zgodnie z wytycznymi opisanymi w sekcji Role kont usługi i tokeny JSON Web.
  • W treści żądania musisz umieścić encję 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

Ustawianie wyniku zadania

Aby wskazać rzeczywisty wynik zadania, ustaw wynik zamkniętych zadań na SUCCEEDED lub FAILED. Zanim ustawisz wynik zadania, musisz je zamknąć. Fleet Engine nalicza opłaty tylko za zadania dostawy w stanie SUCCEEDED.

Szczegóły wyniku zadania

Zadania zawierają też dodatkowe informacje o wyniku zadania. Możesz je ustawić bezpośrednio, a Fleet Engine będzie respektować Twoje ustawienia:

  • Lokalizacja wyniku zadania: Fleet Engine automatycznie wypełnia lokalizację wyniku zadania ostatnią znaną lokalizacją pojazdu. Jeśli wolisz, możesz podać tę lokalizację.
  • Czas wyniku zadania: Fleet Engine nie wypełnia tego pola, ale jest dostępne do ustawienia.

Do ustawiania task_outcome_location i task_outcome_time możesz użyć dowolnej z tych metod:

  • Zaktualizuj je w tym samym żądaniu , które ustawia wynik zadania.
  • Zaktualizuj je później, po ustawieniu wyniku zadania.
  • Ponownie je zmodyfikuj po ich ustawieniu.

Fleet Engine uniemożliwia wprowadzanie tych aktualizacji związanych z wynikami zadań:

  • Nie możesz modyfikować wyniku zadania po jego ustawieniu na SUCCEEDED lub FAILED.
  • Nie możesz ustawić lokalizacji wyniku zadania ani czasu wyniku w przypadku zadań bez ustawionego wyniku.

Pola zadania do ustawiania wyniku

W tej sekcji opisujemy pola, które należy ustawić podczas ustawiania wyniku zadania. Fleet Engine ignoruje inne pola w encji na potrzeby aktualizacji.

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

Pole opcjonalneWartość
taskOutcomeLocation Lokalizacja, w której zadanie zostało wykonane. Jeśli nie jest ustawiona, Fleet Engine domyślnie ustawia ostatnią lokalizację pojazdu.
taskOutcomeTime Sygnatura czasowa momentu, w którym zadanie zostało wykonane.

Przykłady wyników zadań

Poniższy przykład pokazuje, jak za pomocą biblioteki Java gRPC i wywołania HTTP REST do UpdateTask ustawić wynik zadania na SUCCEEDED i ustawić lokalizację, w której zadanie zostało wykonane.

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 z wartością Bearer <token>, gdzie <token> jest wydawany przez Twój serwer zgodnie z wytycznymi opisanymi w sekcji Role kont usługi i tokeny JSON Web.
  • Treść żądania musi zawierać encję 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?