W tym dokumencie zakładamy, że znasz te zagadnienia:
- Tworzenie zadań dotyczących dostawy
- Wprowadzenie do zaplanowanych zadań, które szczegółowo omawia relacje między zadaniami, przystankami i pojazdami.
W rzeczywistym scenariuszu dostawy firmy przypisują zadania związane z dostawą do kierowców, którzy następnie dostarczają przesyłki do odbiorcy w zaplanowanym miejscu, takim jak mieszkanie lub pokój dostaw w kompleksie budynków. W Fleet Engine możesz to zamodelować, tworząc zadanie i wysyłając prośbę o zaktualizowanie pojazdu dostawczego, która następnie aktualizuje element pojazdu o listę przystanków do przejazdu. Przypisz do każdego przystanku listę zadań do wykonania na przystanku.
Zadania związane z pojazdem możesz aktualizować w dowolnym momencie, ale zwykle robisz to w jednym z tych przypadków:
- Zaplanuj zadania do wykonania przez pojazd. Możesz to zrobić za pomocą prośby o aktualizację, która dodaje nowy przystanek do pojazdu, lub za pomocą prośby o aktualizację, która dodaje nowe zadanie do istniejącego przystanku.
- Zmieniać kolejność istniejących zadań powiązanych z danym przystankiem pojazdu.
- Zmienianie lokalizacji zakończenia zadania. Domyślnie silnik floty oznacza lokalizację zakończenia zadania jako tę samą lokalizację co miejsce zatrzymania pojazdu powiązane z tym zadaniem. Jeśli wolisz, możesz określić konkretne lokalizacje dla poszczególnych zadań. Możesz na przykład zatrzymać pojazd w dużym kompleksie, aby dostarczyć kilka paczek, z których każda ma przypisany konkretny pokój pocztowy.
- Zamknij wszystkie przypisane wcześniej zadania, aby nie uwzględniać ich w nowej kolejności. Więcej informacji znajdziesz w sekcji Kończenie zadań.
Planowanie i zmienianie zadań związanych z dostawą
Zadania przypisane pojazdowi możesz planować lub zmieniać w środowisku serwera albo za pomocą pakietu Driver SDK, jeśli udostępnisz kierowcy możliwość zarządzania zadaniami za pomocą zaufanego urządzenia. Używaj tylko jednej metody, aby uniknąć warunków wyścigu i utrzymać jedno źródło danych.
Aby zmienić przesyłkę z jednego pojazdu na inny, 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 znajdziesz informacje o polach, które należy ustawić podczas aktualizowania zadania dotyczącego pojazdu. Nie podano żadnych pól opcjonalnych. Silnik floty ignoruje wszystkie inne pola w podmiocie podczas aktualizacji.
Pole wymagane | Wartość |
---|---|
remainingVehicleJourneySegments |
Lista segmentów ścieżki dla zadań w kolejności, w jakiej powinny być wykonywane. Najpierw wykonywane jest pierwsze zadanie na liście. |
remainingVehicleJourneySegments[i].stop |
Zatrzymanie zadania i na liście. |
remainingVehicleJourneySegments[i].stop.plannedLocation |
Planowana 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 za pomocą biblioteki Java gRPC i wywołania HTTP REST UpdateDeliveryVehicle
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, którego dotyczy aktualizacja kolejności zadań. Jest to identyfikator podany podczas tworzenia pojazdu.
Nagłówek żądania musi zawierać pole Authorization o wartości Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykule Role na kontach usługi i tokeny sieciowe JSON.
Treść żądania musi zawierać element
DeliveryVehicle
Przykładowe polecenie 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