W tym dokumencie zakłada się, że znasz te zagadnienia:
- Tworzenie zadań dostawy
- Wprowadzenie do zadań zaplanowanych, które szczegółowo opisuje relacje między zadaniami, przystankami i pojazdami.
W rzeczywistym scenariuszu dostawy firmy przypisują kierowcom zadania dostawy, którzy następnie używają pojazdu, aby dostarczyć je do odbiorcy w zaplanowanej lokalizacji, np. w domu lub w pomieszczeniu dostaw w kompleksie budynków. W usłudze Fleet Engine modelujesz to, tworząc zadanie i wysyłając żądanie aktualizacji pojazdu dostawczego, które następnie aktualizuje encję pojazdu o listę przystanków do pokonania. Do każdego przystanku przypisujesz listę zadań do wykonania.
Zadania pojazdu możesz aktualizować w dowolnym momencie, ale zwykle robisz to w tych celach:
- Planowanie zadań do wykonania przez pojazd. Możesz to zrobić za pomocą żądania aktualizacji, które dodaje nowy przystanek do pojazdu, lub żądania aktualizacji, które dodaje nowe zadanie do istniejącego przystanku.
- Aktualizowanie kolejności istniejących zadań powiązanych z danym przystankiem pojazdu.
- Zmienianie lokalizacji wykonania zadania. Domyślnie usługa Fleet Engine oznacza lokalizację wykonania zadania jako tę samą lokalizację co przystanek pojazdu powiązany z zadaniem. Jeśli wolisz, możesz określić konkretne lokalizacje dla poszczególnych zadań. Możesz na przykład mieć przystanek pojazdu w dużym kompleksie, aby dostarczyć kilka paczek, z których każda jest przypisana do konkretnego pomieszczenia dostarczania poczty.
- Zamykanie wcześniej przypisanych zadań , aby wykluczyć je z zaktualizowanej kolejności. Więcej informacji znajdziesz w artykule Finalizowanie zadań.
Planowanie lub zmienianie zadań dostawy
Zadania przypisane do pojazdu możesz planować lub zmieniać w środowisku serwera albo za pomocą pakietu Driver SDK, jeśli umożliwisz kierowcy zarządzanie zadaniami za pomocą zaufanego urządzenia. Używaj tylko jednej metody, aby uniknąć wyścigów i zachować jedno źródło informacji.
Aby przenieść przesyłkę z jednego pojazdu do drugiego, zamknij pierwotne zadanie i utwórz je ponownie, zanim przypiszesz je do innego pojazdu. Jeśli zaktualizujesz pojazd dostawczy, aby uwzględnić zadanie, które jest już przypisane do innego pojazdu, pojawi się błąd.
Pola wymagane do aktualizowania zadań
W tej sekcji opisujemy pola wymagane do ustawienia podczas aktualizowania zadania dla pojazdu. Nie podano żadnych pól opcjonalnych. Usługa Fleet Engine ignoruje wszystkie inne pola w encji aktualizacji.
| Pole wymagane | Wartość |
|---|---|
remainingVehicleJourneySegments |
Lista segmentów podróży dla zadań w kolejności, w jakiej mają być wykonywane. Pierwsze zadanie na liście jest wykonywane jako pierwsze. |
remainingVehicleJourneySegments[i].stop |
Przystanek dla zadania i na liście. |
remainingVehicleJourneySegments[i].stop.plannedLocation |
Zaplanowana lokalizacja przystanku. |
remainingVehicleJourneySegments[i].stop.tasks |
Lista zadań do wykonania na tym przystanku pojazdu. |
remainingVehicleJourneySegments[i].stop.state |
State.NEW |
Przykład przypisywania zadań
Poniższe przykłady pokazują, jak używać biblioteki Java gRPC i wywołania HTTP
REST UpdateDeliveryVehicle, aby dodać 2 nowe zadania dla pojazdu.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 1st stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.NEW)))
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 2nd stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW)))
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} 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>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id> to unikalny identyfikator pojazdu dostawczego w Twojej flocie dla którego chcesz zaktualizować kolejność zadań. Jest to identyfikator określony podczas tworzenia pojazdu.
Nagłówek żądania musi zawierać pole Authorization z wartością Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w sekcji Role konta usługi i tokeny JSON Web.
Treść żądania musi zawierać encję
DeliveryVehicle.
Przykład polecenia curl:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM