Finalizowanie zadań

W tym dokumencie zakładamy, że wiesz, jak tworzyć zadania i z nich korzystać. Zawiera ona konkretne przykłady finalizowania zadań związanych z przesyłką:

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

  • Ustaw wynik zadania: po zamknięciu zadania możesz je sfinalizować, ustawiając jego wynik jako SUCCEEDED lub FAILED. Jest to ważny etap finalizowania zadania, który umożliwia wyświetlanie wyniku dostawy w udostępnianiu trasy i zapewnia prawidłowe rozliczenia za usługę Fleet Engine.

Zamykanie zadania

Zadanie możesz zamknąć na te sposoby:

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

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

Zamknięcie zadania nie oznacza jego powodzenia ani niepowodzenia. Oznacza to, że zadanie nie jest już uznawane za realizowane. Aby wskazać rzeczywisty wynik zadania i wyświetlić go na potrzeby śledzenia floty i udostępniania podróży, musisz podać rzeczywisty wynik zadania. Zobacz Ustawianie wyniku zadania poniżej.

Pola zadań do zamykania zadań

W tej sekcji znajdziesz informacje o polach, które musisz ustawić podczas zamykania zadania. Fleet Engine ignoruje wszystkie inne pola w obiekcie na potrzeby aktualizacji.

Pole wymagane Wartość
state State.CLOSED

Bezpośrednie zamykanie zadania

Poniższe przykłady pokazują, jak ustawić stan nieprzypisanego zadania na „zamknięty” 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 tokenem wydanym przez Twój serwer zgodnie z wytycznymi opisanymi w sekcjach Role kont usługiTokeny sieciowe JSON.
  • W treści żądania musisz umieścić 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

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

Szczegóły wyniku zadania

Zadania zawierają też dodatkowe informacje o wyniku zadania. Możesz ustawić te wartości bezpośrednio, a Fleet Engine będzie je uwzględniać:

  • Lokalizacja wyniku zadania: Fleet Engine automatycznie wypełnia lokalizację wyniku zadania ostatnią znaną lokalizacją pojazdu. Jeśli wolisz, możesz podać ten adres.
  • Czas wyniku zadania: Fleet Engine nie wypełnia tego pola, ale możesz je ustawić.

Aby ustawić wartości task_outcome_locationtask_outcome_time, możesz zastosować dowolne z tych podejść:

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

Fleet Engine zapobiega tym aktualizacjom związanym z wynikami zadań:

  • Po ustawieniu wyniku zadania na SUCCEEDED lub FAILED nie możesz go zmienić.
  • Nie możesz ustawić lokalizacji ani czasu wyniku zadania w przypadku zadań bez ustawionego wyniku.

Pola zadania do ustawiania wyniku

W tej sekcji znajdziesz dokumentację dotyczącą wymaganych i opcjonalnych pól, które należy ustawić podczas określania wyniku zadania. Fleet Engine ignoruje inne pola w obiekcie podczas aktualizacji.

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

Pole opcjonalneWartość
taskOutcomeLocation Lokalizacja, w której wykonano zadanie. Jeśli nie jest ustawiona, Fleet Engine domyślnie używa ostatniej lokalizacji pojazdu.
taskOutcomeTime Sygnatura czasowa określająca, kiedy zadanie zostało wykonane.

Przykłady wyników zadań

Poniższy przykład pokazuje, jak za pomocą biblioteki gRPC w Javie i wywołania HTTP REST do UpdateTask ustawić wynik zadania na SUCCEEDED i określić lokalizację, w której zostało ono 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 o wartości Bearer <token>, gdzie <token> jest tokenem wydanym przez Twój serwer zgodnie z wytycznymi opisanymi w sekcjach Role kont 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?