במסמך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים את הנושאים הבאים:
- יצירת משימות משלוח
- המבוא למשימות מתוזמנות, שבו מוסבר בפירוט על הקשר בין המשימות, העצירות והרכבים.
כמו שמצוין בקטע משימות מתוזמנות, Essentialt Engine Essentials, יוצרים משימות ומשייכים אותן לרכב משמשת לבניית מודלים של הקשר בעולם האמיתי בין המשימה המיקום שבו הרכב צפוי לעצור כדי שהנהג יוכל להשלים את התהליך את המשימה.
לאחר מכן, תוכלו לנהל את התקדמות המשימות במהלך מחזור החיים שלהן על ידי שליחת עדכונים ל-Fleet Engine, כדי שהוא יוכל לבצע את הניתוב ואת עדכוני הסטטוס בצורה הטובה ביותר לאורך כל תהליך הטיפול במשימה. אחת הדרכים העיקריות לעשות זאת היא לעדכן לעצור את הרכב כשהרכב מתקרב לעצירה, מגיע לתחנה ויוצא ממנה. כך ניתן לדווח ולנתח את התקדמות המשימה בשני החשבונות מפעילי כלל המכשירים ומשתמשי קצה. אלה עדכוני הסטטוס:
- בדרך: הערך
ENROUTE
ב-enumSTATE
שלVehicleStop
מציין שהעצירה הבאה ברשימה של מסלול הנסיעה של הרכב. מבחינת המשימה, המשמעות היא שכל משימה שמשויכת לתחנה היא הבאה ברשימה לביצוע. - Arrived: המאפיין
STATE
שלVehicleStop
משתמש ב-ARRIVED
כדי לציין שהרכב הגיע לתחנה. מבחינת המשימה, המשמעות היא שכל משימה שמשויכת להפסקה עובדת באופן פעיל. - הושלמה: כדי לסמן עצירה כ'הושלמה', מסירים אותה מרשימת העצירות ברכב. כשעושים זאת, מערכת Fleet Engine מסמנת אוטומטית את כל המשימות המשויכות כסגורות. למידע נוסף על סגירת משימות, ראו סגירת משימות.
במסמך הזה מתואר איך סטטוס הפסקת העדכון באמצעות גישות בצד השרת. אפשר לעשות זאת גם מאפליקציית הנהג, אם נותנים לנהג אפשרות לנהל משימות באמצעות מכשיר מהימן. משתמשים בשיטה אחת בלבד כדי להימנע ממרוץ תהליכים ולשמור על מקור מהימן אחד.
הרכב בדרך לעצירה
המערכת אמורה לשלוח הודעה ל-Fleet Engine כשהרכב מתחיל לנווט לתחנה הבאה. כך ניתן לשפר את זמן ההגעה המשוער ואת חישובי המסלולים.
שדות חובה להפסקת העדכונים
מערכת Fleet Engine מתעלמת מכל שאר השדות של הישות בהתראה.
שדה | ערך |
---|---|
remainingVehicleJourneySegments
|
רשימת העצירות הנותרות של כלי הרכב, כאשר המדינה (State) שלהן מסומנת כ-State.NEW. |
דוגמה לנסיעה בדרך לתחנה
בדוגמאות הבאות מוסבר איך להודיע ל-Fleet Engine שרכב מסוים
בדרך לתחנה הבאה, באמצעות ספריית Java gRPC או ב-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> הוא מזהה ייחודי של המשימה.
- כותרת הבקשה חייבת להכיל שדה Authorization עם הערך נושא <token>, שבו השרת <token> מונפק על ידי השרת בהתאם להנחיות שמפורטות בתפקידים של חשבון שירות אסימוני אינטרנט JSON.
- גוף הבקשה חייב להכיל ישות
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
רכב מגיע בעצירה
יש ליידע את ה-Fleet Engine כשרכב מגיע לעצירה.
שדות חובה להפסקת העדכונים
מערכת Fleet Engine מתעלמת מכל שאר השדות של הישות בהתראה.
שדה | ערך |
---|---|
remainingVehicleJourneySegments
|
רשימת העצירות הנותרות של כלי הרכב, כאשר המדינה (State) שלהן מסומנת כ-State.NEW. |
דוגמה לאירוע 'מגיע לתחנה'
בדוגמאות הבאות מוסבר איך להודיע ל-Fleet Engine שרכב הגיע
בעצירה, באמצעות ספריית Java gRPC או בקריאת 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> הוא מזהה ייחודי של המשימה.
- כותרת הבקשה חייבת לכלול את השדה Authorization עם הערך Bearer <token>, כאשר <token> הוא אסימון שהונפק על ידי השרת בהתאם להנחיות שמפורטות במאמרים תפקידים בחשבון שירות ואסימוני אינטרנט מסוג JSON.
- גוף הבקשה חייב להכיל ישות
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 כשהרכב מסיים עצירה. כתוצאה מכך, כל המשימות שמשויכות לתחנה יוגדרו למצב 'סגור'.
שדות חובה להפסקת העדכונים
מערכת Fleet Engine מתעלמת מכל שאר השדות של הישות בהתראה.
שדה | ערך |
---|---|
remainingVehicleJourneySegments |
רשימה של עצירות הרכב שנותרו, עם הסטטוסים שלהן שמסומנים כ-State.NEW. הסטטוס של התחנה הראשונה ברשימה חייב להיות מסומן כ-State.ENROUTE. |
השלמת דוגמה של עצירה
בדוגמאות הבאות מוסבר איך להודיע ל-Fleet Engine שכלי רכב הגיע לתחנה, באמצעות ספריית Java gRPC או קריאה ל-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> הוא מזהה ייחודי של המשימה.
- כותרת הבקשה חייבת לכלול את השדה Authorization עם הערך Bearer <token>, כאשר <token> הוא אסימון שהונפק על ידי השרת בהתאם להנחיות שמפורטות במאמרים תפקידים בחשבון שירות ואסימוני אינטרנט מסוג JSON.
- גוף הבקשה חייב לכלול ישות
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