W tym dokumencie zakładamy, że wiesz, jak tworzyć i używać zadań. Zawiera on konkretne przykłady finalizowania zadań związanych z przesyłką:
Zamykanie zadania: zamknięcie zadania związanego z przesyłką zmienia jego stan na
CLOSEDi wskazuje, że nie jest ono już aktywne.Ustawianie wyniku zadania: po zamknięciu zadania możesz je sfinalizować, ustawiając jego wynik na
SUCCEEDEDlubFAILED. Jest to ważny element finalizowania zadania, który pozwala wyświetlić wynik dostawy w udostępnianiu przejazdu i zapewnić prawidłowe rozliczenia za usługę Fleet Engine.
Zamykanie zadania
Zadanie możesz zamknąć na te sposoby:
- Zaktualizuj stan przystanku pojazdu. Usuwasz przystanek z pojazdu, co powoduje zamknięcie wszystkich powiązanych z nim zadań. Szczegółowe informacje znajdziesz w sekcji Aktualizowanie stanu przystanku.
- Usuń zadanie z listy przystanków pojazdu. Obejmuje to aktualizowanie listy zadań dla przystanku, ale bez zamkniętego zadania. Zobacz sekcję Aktualizowanie kolejności zadań w artykule Aktualizowanie zadań.
- Ustaw stan zadania na
CLOSED. Można to zrobić tylko w przypadku zadań, które nie są przypisane do pojazdów. W tej sekcji opisano to podejście.
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ż uważane za będące w toku. Aby wskazać rzeczywisty wynik zadania i wyświetlić go na potrzeby śledzenia floty i udostępniania przejazdu, musisz wskazać rzeczywisty wynik zadania. Zobacz Ustawianie wyniku zadania poniżej.
Pola zadań do zamykania zadań
W tej sekcji opisano pola, które należy wypełnić 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ć nieprzypisane zadanie na stan zamknięty za pomocą gRPC lub 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 wystawiany przez serwer zgodnie z wytycznymi opisanymi w sekcjach Role konta usługi i Tokeny 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")"
}
EOMUstawianie 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 o stanie SUCCEEDED.
Szczegóły wyniku zadania
Zadania zawierają też dodatkowe informacje o wyniku. Możesz je ustawić bezpośrednio, a Fleet Engine będzie przestrzegać Twoich ustawień:
- Lokalizacja wyniku zadania: Fleet Engine automatycznie wypełnia lokalizację wyniku zadania ostatnią znaną lokalizacją pojazdu. Jeśli wolisz, możesz podać te informacje.
- Czas wyniku zadania: Fleet Engine nie wypełnia tego pola, ale możesz je ustawić.
Aby ustawić 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, po ustawieniu wyniku zadania.
- zmieniać je po ich ustawieniu,
Fleet Engine uniemożliwia te aktualizacje związane z wynikami zadań:
- Po ustawieniu wyniku zadania na
SUCCEEDEDlubFAILEDnie można go zmienić. - Nie możesz ustawić lokalizacji ani godziny wyniku zadania w przypadku zadań bez ustawionego wyniku.
Pola zadania do ustawiania wyniku
W tej sekcji opisano wymagane i opcjonalne pola, które należy ustawić podczas określania wyniku zadania. Fleet Engine ignoruje inne pola w encji podczas aktualizacji.
| Pole wymagane | Wartość |
|---|---|
taskOutcome |
Outcome.SUCCEEDED lub Outcome.FAILED |
| Pole opcjonalne | Wartość |
|---|---|
taskOutcomeLocation |
Lokalizacja, w której zadanie zostało wykonane. Jeśli nie jest ustawiona, Fleet Engine domyślnie używa ostatniej lokalizacji pojazdu. |
taskOutcomeTime |
Sygnatura czasowa określająca, kiedy zadanie zostało ukończone. |
Przykłady wyników działania
Poniższy przykład pokazuje, jak użyć biblioteki gRPC w języku Java i wywołania HTTP REST do UpdateTask, aby ustawić wynik zadania na SUCCEEDED i określić lokalizację, w której zadanie zostało 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 z wartością Bearer <token>, gdzie <token> jest wystawiany przez serwer zgodnie z wytycznymi opisanymi w sekcjach Role konta usługi i Tokeny sieciowe JSON.
- 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