Finalizowanie zadań
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
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ługi i Tokeny 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_location
i task_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 opcjonalne | Wartość |
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ługi i Tokeny 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?
O ile nie stwierdzono inaczej, treść tej strony jest objęta licencją Creative Commons – uznanie autorstwa 4.0, a fragmenty kodu są dostępne na licencji Apache 2.0. Szczegółowe informacje na ten temat zawierają zasady dotyczące witryny Google Developers. Java jest zastrzeżonym znakiem towarowym firmy Oracle i jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-08-31 UTC.
[null,null,["Ostatnia aktualizacja: 2025-08-31 UTC."],[[["\u003cp\u003eThis document explains how to finalize shipment tasks in Fleet Engine by closing them and setting their outcome to \u003ccode\u003eSUCCEEDED\u003c/code\u003e or \u003ccode\u003eFAILED\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eClosing a task indicates it is no longer in progress, while setting the outcome reflects the delivery result for billing and journey sharing.\u003c/p\u003e\n"],["\u003cp\u003eTasks can be closed by updating the vehicle's stop status, removing them from the vehicle's stop list, or setting their state to \u003ccode\u003eCLOSED\u003c/code\u003e if unassigned.\u003c/p\u003e\n"],["\u003cp\u003eThe task outcome, location, and time can be set using the \u003ccode\u003eUpdateTask\u003c/code\u003e method with appropriate fields and values, but the outcome cannot be changed once set.\u003c/p\u003e\n"]]],["To finalize shipment tasks, you must first close them, setting the `state` to `CLOSED`, which indicates the task is no longer active. Closing can be done by updating the vehicle's stop status, removing the task from the vehicle's stop list, or directly setting the task state. Once closed, set the `taskOutcome` to `SUCCEEDED` or `FAILED`, with optional details like `taskOutcomeLocation` and `taskOutcomeTime`. The task outcome is essential for journey sharing and billing. You can use gRPC or HTTP REST calls to accomplish both.\n"],null,["This document assumes you understand how to create and use tasks. It provides\nspecific examples for how to finalize shipment tasks as follows:\n\n- **Close a task** : Closing a shipment task changes its state to `CLOSED` and\n indicates that that task is no longer active.\n\n- **Set the task outcome** : Once a task is closed, you then finalize it by\n setting its outcome to either `SUCCEEDED` or `FAILED`. This is an important\n part of finalizing a task in order to show the delivery outcome in journey\n sharing and to ensure correct billing for the Fleet Engine service.\n\nClose a task\n\nYou can close a task in the following ways:\n\n- **Update the stop status for the vehicle** . You remove the stop from the vehicle, which in turn closes all tasks associated with the stop. See [Update stop status for details](/maps/documentation/mobility/fleet-engine/journeys/tasks/update-stops).\n- **Remove the task from the list of vehicle stops** . This involves updating the list of tasks for the stop, but with the closed task no longer part of the list. See Update task order in [Update tasks](/maps/documentation/mobility/fleet-engine/journeys/tasks/update-tasks).\n- **Set the task state to `CLOSED`**. This can only be done on tasks not assigned to vehicles. This section shows this approach.\n\nOnce you close a task, you may not reopen it.\n\u003e \u003e **Closing of a task does not indicate its success or failure** . It indicates\n\u003e \u003e that the task is no longer considered in progress. In order to indicate the\n\u003e \u003e actual outcome of a task and to have that displayed for Fleet Tracking and\n\u003e \u003e journey sharing purposes, you must indicate the actual outcome of a task. See\n\u003e \u003e [Set the task outcome](#set-task-outcome) below.\n\nTask fields for closing tasks\n\nThis section documents the required fields to set when closing a\ntask. Fleet engine ignores all other fields in the entity for the update.\n\n\u003cbr /\u003e\n\n| Required field | Value |\n|----------------|----------------|\n| `state` | `State.CLOSED` |\n\n\u003cbr /\u003e\n\nClose a task directly\n\nThe following examples show how to set an unassigned task to a closed state,\neither in gRPC or using an HTTP REST request call to `UpdateTask` \n\ngRPC \n\n static final String PROJECT_ID = \"my-delivery-co-gcp-project\";\n static final String TASK_ID = \"task-8241890\";\n\n DeliveryServiceBlockingStub deliveryService =\n DeliveryServiceGrpc.newBlockingStub(channel);\n\n // Task settings\n String taskName = \"providers/\" + PROJECT_ID + \"/tasks/\" + TASK_ID;\n Task task = Task.newBuilder()\n .setName(taskName)\n .setState(Task.State.CLOSED) // You can only directly CLOSE a\n .build(); // task that is NOT assigned to a vehicle.\n\n // Task request\n UpdateTaskRequest updateTaskRequest =\n UpdateTaskRequest.newBuilder() // No need for the header\n .setTask(task)\n .setUpdateMask(FieldMask.newBuilder().addPaths(\"state\"))\n .build();\n\n try {\n Task updatedTask = deliveryService.updateTask(updateTaskRequest);\n } catch (StatusRuntimeException e) {\n Status s = e.getStatus();\n switch (s.getCode()) {\n case NOT_FOUND:\n break;\n case PERMISSION_DENIED:\n break;\n }\n return;\n }\n\nREST\n\n`PATCH https://fleetengine.googleapis.com/v1/providers/\u003cproject_id\u003e/tasks/\u003cid\u003e?updateMask=state`\n\n- *\\\u003cid\\\u003e* is a unique identifier for the task.\n- The request header must contain a field *Authorization* with the value *Bearer \\\u003ctoken\\\u003e* , where *\\\u003ctoken\\\u003e* is issued by your server according to the guidelines described in [Service account roles](/maps/documentation/mobility/fleet-engine/essentials/set-up-fleet/service-accounts) and [JSON Web tokens](/maps/documentation/mobility/fleet-engine/essentials/set-up-fleet/jwt).\n- You must include a `Task` entity in the request body\n\nExample `curl` command: \n\n # Set JWT, PROJECT_ID, and TASK_ID in the local environment\n curl -X PATCH \"https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=state,taskOutcome,taskOutcomeTime\" \\\n -H \"Content-type: application/json\" \\\n -H \"Authorization: Bearer ${JWT}\" \\\n --data-binary @- \u003c\u003c EOM\n {\n \"state\": \"CLOSED\",\n \"taskOutcome\": \"SUCCEEDED\",\n \"taskOutcomeTime\": \"$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\"\n }\n EOM\n\nSet the task outcome\n\nTo indicate the actual outcome of a task, you set the outcome for closed tasks\nto either `SUCCEEDED` or `FAILED`. A task must be closed before you set its\noutcome. Fleet Engine only charges for delivery tasks with a state of\n`SUCCEEDED`.\n\nTask outcome details\n\nTasks also provide additional details about the task outcome. You can set these\ndirectly and Fleet Engine respects your settings:\n\n- **Task outcome location**: Fleet Engine automatically fills in the task outcome location with the last known vehicle location. You can provide this instead if you prefer.\n- **Task outcome time**: Fleet Engine does not fill this field in, but is available for you to set.\n\nYou can use any of the following approaches to setting `task_outcome_location`\nand `task_outcome_time`:\n\n- **Update them in the same request** that sets the task outcome.\n- **Update them later**, after you have set task outcome.\n- **Modify them again** after they have been set.\n\nFleet Engine prevents the following updates related to task outcomes:\n\n- **You can't modify a task outcome once it is set** to either `SUCCEEDED` or `FAILED`.\n- **You can't set a task outcome location or outcome time** for tasks without a set outcome.\n\nTask fields for setting outcome\n\nThis section documents the required and optional fields to set when setting a\ntask outcome. Fleet Engine ignores other fields in the entity for the update.\n\n\u003cbr /\u003e\n\n| Required field | Value |\n|----------------|-----------------------------------------|\n| `taskOutcome` | `Outcome.SUCCEEDED` or `Outcome.FAILED` |\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Optional field | Value |\n|-----------------------|-----------------------------------------------------------------------------------------------------------------|\n| `taskOutcomeLocation` | The location where the task was completed. If not set, Fleet Engine defaults this to the last vehicle location. |\n| `taskOutcomeTime` | The timestamp when the task was completed. |\n\n\u003cbr /\u003e\n\nTask outcome examples\n\nThe following example shows how to use the [Java gRPC library](/maps/documentation/mobility/fleet-engine/essentials/client-libraries-tasks) and an HTTP\nREST call to `UpdateTask` to set a task outcome to `SUCCEEDED` and set the\nlocation where the task was completed. \n\ngRPC \n\n static final String PROJECT_ID = \"my-delivery-co-gcp-project\";\n static final String TASK_ID = \"task-8241890\";\n\n DeliveryServiceBlockingStub deliveryService =\n DeliveryServiceGrpc.newBlockingStub(channel);\n\n // Task settings\n String taskName = \"providers/\" + PROJECT_ID + \"/tasks/\" + TASK_ID;\n Task task = Task.newBuilder()\n .setName(taskName)\n .setTaskOutcome(TaskOutcome.SUCCEEDED)\n .setTaskOutcomeTime(now())\n .setTaskOutcomeLocation( // Grand Indonesia East Mall\n LocationInfo.newBuilder().setPoint(\n LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))\n .build();\n\n // Task request\n UpdateTaskRequest updateTaskRequest =\n UpdateTaskRequest.newBuilder() // No need for the header\n .setTask(task)\n .setUpdateMask(FieldMask.newBuilder().addPaths(\"task_outcome\", \"task_outcome_time\", \"task_outcome_location\"))\n .build();\n\n try {\n Task updatedTask = deliveryService.updateTask(updateTaskRequest);\n } catch (StatusRuntimeException e) {\n Status s = e.getStatus();\n switch (s.getCode()) {\n case NOT_FOUND:\n break;\n case PERMISSION_DENIED:\n break;\n }\n return;\n }\n\nREST\n\n`PATCH https://fleetengine.googleapis.com/v1/providers/\u003cproject_id\u003e/tasks/\u003cid\u003e?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation`\n\n- *\\\u003cid\\\u003e* is a unique identifier for the task.\n- The request header must contain a field *Authorization* with the value *Bearer \\\u003ctoken\\\u003e* , where *\\\u003ctoken\\\u003e* is issued by your server according to the guidelines described in [Service account roles](/maps/documentation/mobility/fleet-engine/essentials/set-up-fleet/service-accounts) and [JSON Web tokens](/maps/documentation/mobility/fleet-engine/essentials/set-up-fleet/jwt).\n- The request body must contain a `Task` entity.\n\n # Set JWT, PROJECT_ID, and TASK_ID in the local environment\n curl -X PATCH \"https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation\" \\\n -H \"Content-type: application/json\" \\\n -H \"Authorization: Bearer ${JWT}\" \\\n --data-binary @- \u003c\u003c EOM\n {\n \"taskOutcome\": \"SUCCEEDED\",\n \"taskOutcomeTime\": \"$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\",\n \"taskOutcomeLocation\": {\n \"point\": {\n \"latitude\": -6.195139,\n \"longitude\": 106.820826\n }\n }\n }\n EOM\n\nWhat's next\n\n- [Find tasks](/maps/documentation/mobility/fleet-engine/journeys/tasks/find-tasks)"]]