In diesem Dokument wird davon ausgegangen, dass Sie mit Folgendem vertraut sind:
- Versandaufgaben erstellen
- Die Einführung in geplante Aufgaben, in der die Beziehung zwischen Aufgaben, Haltestellen und Fahrzeugen ausführlich erläutert wird.
Wie unter Geplante Aufgaben in den Grundlagen der Fleet Engine beschrieben, erstellen Sie Aufgaben und ordnen sie einer Fahrzeughaltestelle zu, um die reale Verknüpfung zwischen der Aufgabe und dem Ort zu modellieren, an dem das Fahrzeug voraussichtlich anhalten wird, damit der Fahrer die Aufgabe erledigen kann.
Von dort aus verwalten Sie den Fortschritt der Aufgaben während ihres gesamten Lebenszyklus, Senden von Aktualisierungen an Fleet Engine, damit diese das Routing und den Status optimal ausführen kann auf dem Weg zur Aufgabe. Eine wichtige Möglichkeit dazu ist, die Haltestelle zu aktualisieren, wenn sich das Fahrzeug nähert, ankommt und die Haltestelle verlässt. Dies ermöglicht Berichte und Analysen über den Aufgabenfortschritt sowohl für Flottenbetreiber und Endnutzer. Diese Statusaktualisierungen sind:
- Route unterwegs: Die
STATE
-Enum fürVehicleStop
verwendetENROUTE
, um angeben, dass die Haltestelle als nächstes in der Liste für den Fahrzeugreiseplan steht. Aus Sicht der Aufgabe sind alle Aufgaben gemeint, die mit der Haltestelle verknüpft sind. steht als Nächstes auf der Liste. - Angekommen: Die Aufzählung
STATE
fürVehicleStop
verwendetARRIVED
, um anzugeben, ob das Fahrzeug an der Haltestelle angekommen ist. Aus Sicht der Aufgabe bedeutet das, dass jede Aufgabe im Zusammenhang mit der Haltestelle aktiv bearbeitet wird. - Abgeschlossen: Sie markieren einen Zwischenstopp als abgeschlossen, indem Sie ihn aus der Liste der Haltestellen für das Fahrzeug. In diesem Fall markiert Fleet Engine automatisch alle zugehörigen Aufgaben als GESCHLOSSEN. Weitere Informationen zum Schließen von Aufgaben finden Sie unter Aufgaben abschließen
In diesem Dokument wird beschrieben, wie Sie den Status einer Haltestelle mithilfe serverseitiger Methoden aktualisieren. Sie können dies auch über Ihre Fahrer-App tun, wenn Sie dem Fahrer die Möglichkeit geben, Aufgaben mit einem vertrauenswürdigen Gerät zu verwalten. Nur eine Methode verwenden, um ethnische Herkunft zu vermeiden und eine Single Source of Truth aufrechtzuerhalten.
Fahrzeug ist auf dem Weg zur Haltestelle
Ihr System sollte Fleet Engine benachrichtigen, wenn das Fahrzeug mit der Navigation zur nächsten Halt. Dadurch werden die Berechnungen der voraussichtlichen Ankunftszeit und der Route verbessert.
Pflichtfelder für das Beenden von Updates
Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.
Feld | Wert |
---|---|
remainingVehicleJourneySegments
|
Liste der verbleibenden Haltestellen mit dem Status „State.NEW“. |
Beispiel für eine Route zur Haltestelle
Die folgenden Beispiele zeigen, wie Fleet Engine benachrichtigt wird, dass ein Fahrzeug
auf dem Weg zur nächsten Haltestelle sein, entweder mithilfe der Java gRPC-Bibliothek oder einer HTTP-
REST-Aufruf an UpdateDeliveryVehicle
.Alle anderen Haltestellen sind als neu markiert.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Next stop marked as ENROUTE
.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.ENROUTE)))
// All other stops marked as 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 updateDeliveryVehicleRequest =
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> ist eine eindeutige Kennung für die Aufgabe.
- Der Anfrageheader muss das Feld Authorization mit dem Wert Bearer <token> enthalten. Dabei wird <token> von deinem Server gemäß den in den Abschnitten Dienstkontorollen und JSON Web Tokens beschriebenen Richtlinien ausgestellt.
- Der Anfragetext muss eine
DeliveryVehicle
-Entität enthalten:
Beispiel eines curl
-Befehls:
# 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": "ENROUTE",
"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
Fahrzeug kommt an der Haltestelle an
Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug an einer Haltestelle ankommt.
Pflichtfelder für das Stoppen von Updates
Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.
Feld | Wert |
---|---|
remainingVehicleJourneySegments
|
Liste der verbleibenden Haltestellen mit dem Status „State.NEW“. |
Beispiel für Ankunft an Haltestelle
In den folgenden Beispielen wird gezeigt, wie Sie Fleet Engine darüber informieren, dass ein Fahrzeug an der Haltestelle angekommen ist. Dazu wird entweder die Java gRPC-Bibliothek oder ein HTTP-REST-Aufruf an UpdateDeliveryVehicle
verwendet. Alle anderen Haltestellen werden als neu markiert.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Marking the arrival at stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as 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))) // Remaining stops must be NEW.
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
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> ist eine eindeutige Kennung für die Aufgabe.
- Der Anfrageheader muss das Feld Authorization mit dem Wert Bearer <token> enthalten. Dabei wird <token> von deinem Server gemäß den in den Abschnitten Dienstkontorollen und JSON Web Tokens beschriebenen Richtlinien ausgestellt.
- Der Anfragetext muss eine
DeliveryVehicle
-Entität enthalten:
Beispiel eines curl
-Befehls:
# 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": "ARRIVED",
"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
Fahrzeug hält an
Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug eine Haltestelle erreicht. Dadurch wird der Status aller mit der Haltestelle verknüpften Aufgaben auf „GESCHLOSSEN“ gesetzt.
Pflichtfelder für Aktualisierungen von Haltestellen
Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.
Feld | Wert |
---|---|
remainingVehicleJourneySegments |
Liste der verbleibenden Fahrzeughalte, wobei deren Status als State.NEW gekennzeichnet ist. Für die erste Haltestelle auf der Liste muss der Status State.ENROUTE angegeben sein. |
Beispiel für eine Haltestelle fertigstellen
Die folgenden Beispiele zeigen, wie Fleet Engine benachrichtigt wird, wenn ein Fahrzeug angekommen ist
an der Haltestelle an und verwenden Sie entweder die Java gRPC-Bibliothek oder einen HTTP REST-Aufruf für
UpdateDeliveryVehicle
Alle anderen Haltestellen sind als neu markiert.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// This stop has been completed and is commented out to indicate it
// should be removed from the list of vehicle journey segments.
// .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
// .setStop(VehicleStop.newBuilder()
// .setPlannedLocation(LocationInfo.newBuilder()
// .setPoint(LatLng.newBuilder()
// .setLatitude(37.7749)
// .setLongitude(122.4194)))
// .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
// .setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as NEW.
// The next stop could be marked as ENROUTE if the vehicle has begun
// its journey to the next stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // Next 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 updateDeliveryVehicleRequest =
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=remaining_vehicle_journey_segments`
- <id> ist eine eindeutige Kennung für die Aufgabe.
- Der Anfrageheader muss das Feld Authorization mit dem Wert Bearer <token> enthalten. Dabei wird <token> von deinem Server gemäß den in den Abschnitten Dienstkontorollen und JSON Web Tokens beschriebenen Richtlinien ausgestellt.
- Der Anfragetext muss eine
DeliveryVehicle
-Entität enthalten:
Beispiel eines curl
-Befehls:
# 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.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM