כדי להבין את המסמך הזה, צריך להכיר את הנושאים הבאים:
- [יצירת משימות משלוח][1]
- במבוא ל[משימות מתוזמנות][3] מוסבר בפירוט הקשר בין משימות, עצירות וכלי רכב.
כמו שמוסבר בקטע [משימות מתוזמנות][3] במאמר היסודות של Fleet Engine, אתם יוצרים משימות ומשייכים אותן לעצירה של הרכב כדי ליצור מודל של השיוך בעולם האמיתי בין המשימה לבין המיקום שבו הרכב צפוי לעצור, כדי שהנהג יוכל להשלים את המשימה.
משם, אתם מנהלים את התקדמות המשימות לאורך מחזור החיים שלהן על ידי שליחת עדכונים ל-Fleet Engine, כדי שהמערכת תוכל לבצע בצורה הטובה ביותר את עדכוני הניתוב והסטטוס לאורך מסלול המשימה. אחת הדרכים העיקריות לעשות את זה היא לעדכן את תחנת הרכב כשהרכב מתקרב לתחנה, מגיע אליה ועוזב אותה. כך אפשר לדווח על התקדמות המשימה ולנתח אותה, גם למפעילי הצי וגם למשתמשי הקצה. אלה עדכוני הסטטוס:
- בדרך: הערך של
STATEenum ב-VehicleStopמשתמש ב-ENROUTEכדי לציין שהתחנה היא הבאה ברשימה של מסלול הנסיעה של הרכב. מבחינת המשימה, המשמעות היא שכל משימה שמשויכת לתחנה היא הבאה בתור ברשימה לביצוע. - Arrived: הערך
STATEשלVehicleStopמשתמש ב-ARRIVEDכדי לציין שהרכב הגיע לתחנה. מבחינת המשימה, זה אומר שכל משימה שמשויכת לתחנה מפסיקה להיות פעילה. - הושלמה: כדי לסמן תחנה כ"הושלמה", מסירים אותה מרשימת התחנות של הרכב. כשעושים את זה, Fleet Engine מסמן באופן אוטומטי את כל המשימות המשויכות כ-CLOSED. לפרטים נוספים על סגירת משימות, ראו [סיום משימות][4].
במסמך הזה מוסבר איך לעדכן את סטטוס התחנה באמצעות גישות בצד השרת. אתם יכולים גם לעשות את זה מאפליקציית הנהג, אם אתם נותנים לנהג את היכולת לנהל משימות באמצעות מכשיר מהימן. כדי למנוע מרוץ תהליכים ולשמור על מקור אמת יחיד, צריך להשתמש רק בשיטה אחת.
הרכב בדרך לתחנה
המערכת שלכם צריכה להודיע ל-Fleet Engine כשהרכב מתחיל לנווט לתחנה הבאה. כך אפשר לשפר את החישובים של זמן ההגעה המשוער והמסלול.
שדות חובה לעדכוני תחנות
מנוע Fleet Engine מתעלם מכל שאר השדות בישות לצורך ההתראה.
| שדה | ערך |
|---|---|
remainingVehicleJourneySegments
|
רשימה של עצירות הרכב שנותרו, כשהמצבים שלהן מסומנים כ-State.NEW. |
דוגמה ל"בדרך לתחנה"
בדוגמאות הבאות מוסבר איך להודיע ל-Fleet Engine שהרכב בדרך לתחנה הבאה, באמצעות [ספריית Java gRPC][5] או קריאת HTTP REST אל UpdateDeliveryVehicle.כל שאר התחנות מסומנות כחדשות.
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> הוא מזהה ייחודי של המשימה.
- ה-request header חייב להכיל את השדה Authorization עם הערך Bearer <token>, כאשר <token> מונפק על ידי השרת שלכם בהתאם להנחיות שמתוארות במאמרים [תפקידים של חשבונות שירות][6] ו[אסימוני אינטרנט מסוג JSON][6].
- גוף הבקשה חייב להכיל ישות
DeliveryVehicle:
פקודת 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": "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
placeidtrips1: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#locationinfo placeidtrips2: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html placeidtrips3: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#maps.fleetengine.delivery.v1.LocationInfo.FIELDS.string.maps.fleetengine.delivery.v1.LocationInfo.place placeidtrips4: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html#FIELDS.place
הרכב מגיע לתחנה
צריך להודיע ל-Fleet Engine כשרכב מגיע לתחנה.
שדות חובה לעדכוני תחנות
מנוע Fleet Engine מתעלם מכל שאר השדות בישות לצורך ההתראה.
| שדה | ערך |
|---|---|
remainingVehicleJourneySegments
|
רשימה של עצירות הרכב שנותרו, כשהמצבים שלהן מסומנים כ-State.NEW. |
דוגמה להגעה לתחנה
בדוגמאות הבאות מוסבר איך להודיע ל-Fleet Engine שהרכב הגיע לתחנה, באמצעות [ספריית Java gRPC][5] או קריאת HTTP REST אל UpdateDeliveryVehicle. כל שאר התחנות מסומנות כתחנות חדשות.
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> הוא מזהה ייחודי של המשימה.
- ה-request header חייב להכיל את השדה Authorization עם הערך Bearer <token>, כאשר <token> מונפק על ידי השרת שלכם בהתאם להנחיות שמתוארות במאמרים [תפקידים של חשבונות שירות][6] ו[אסימוני אינטרנט מסוג JSON][6].
- גוף הבקשה חייב להכיל ישות
DeliveryVehicle:
פקודת 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": "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
הרכב עוצר עצירה מלאה
צריך להודיע ל-Fleet Engine כשרכב משלים עצירה. כתוצאה מכך, כל המשימות שמשויכות לתחנה מוגדרות למצב CLOSED.
שדות חובה לעדכוני תחנות
מנוע Fleet Engine מתעלם מכל שאר השדות בישות לצורך ההתראה.
| שדה | ערך |
|---|---|
remainingVehicleJourneySegments |
רשימה של עצירות הרכב שנותרו, כשהמצבים שלהן מסומנים כ-State.NEW. התחנה הראשונה ברשימה חייבת להיות מסומנת בסטטוס State.ENROUTE. |
דוגמה להשלמת עצירה
בדוגמאות הבאות מוסבר איך להודיע ל-Fleet Engine שהרכב הגיע לתחנה, באמצעות [ספריית Java gRPC][5] או קריאת HTTP REST אל UpdateDeliveryVehicle. כל שאר התחנות מסומנות כתחנות חדשות.
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> הוא מזהה ייחודי של המשימה.
- ה-request header חייב להכיל את השדה Authorization עם הערך Bearer <token>, כאשר <token> מונפק על ידי השרת שלכם בהתאם להנחיות שמתוארות במאמרים [תפקידים של חשבונות שירות][6] ו[אסימוני אינטרנט מסוג JSON][6].
- גוף הבקשה חייב להכיל ישות
DeliveryVehicle:
פקודת 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.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM
placeidtrips1: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#locationinfo placeidtrips2: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html placeidtrips3: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#maps.fleetengine.delivery.v1.LocationInfo.FIELDS.string.maps.fleetengine.delivery.v1.LocationInfo.place placeidtrips4: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html#FIELDS.place
המאמרים הבאים
- [סיום המשימות][4]
[1]: /maps/documentation/mobility/fleet-engine/journeys/tasks/create-shipment-tasks [3]: /maps/documentation/mobility/fleet-engine/essentials/tasks-intro [4]: /maps/documentation/mobility/fleet-engine/journeys/tasks/finalize-tasks [5]: /maps/documentation/mobility/fleet-engine/essentials/client-libraries-tasks [6]: /maps/documentation/mobility/fleet-engine/essentials/set-up-fleet/service-accounts