W tym dokumencie zakładamy, że znasz te zagadnienia:
- Tworzenie zadań dostawy
- Wprowadzenie do zaplanowanych zadań, które szczegółowo opisuje relacje między zadaniami, przystankami i pojazdami.
W rzeczywistym scenariuszu dostawy firmy przypisują kierowcom zadania dostawy, a kierowcy używają pojazdu, aby dostarczyć je do odbiorcy w zaplanowanej lokalizacji, np. w domu lub w pomieszczeniu dostaw w budynku. Modelujesz to w usłudze Fleet Engine, 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:
- Zaplanuj zadania 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.
- Zaktualizuj kolejność istniejących zadań powiązanych z danym przystankiem pojazdu.
- Zmień lokalizację 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ń. Na przykład pojazd może zatrzymać się w dużym kompleksie, aby dostarczyć kilka paczek, z których każda jest przypisana do konkretnego pomieszczenia dostawy poczty.
- Zamknij wszystkie wcześniej przypisane zadania , 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 zaplanować lub zmienić 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 1 metody, aby uniknąć sytuacji wyścigu i zachować jedno źródło wiarygodnych danych.
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 podajemy żadnych pól opcjonalnych. Usługa Fleet Engine ignoruje wszystkie inne pola w encji na potrzeby aktualizacji.
| Pole wymagane | Wartość |
|---|---|
remainingVehicleJourneySegments |
Lista segmentów podróży dla zadań w kolejności, w jakiej powinny 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, który został 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 kont 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