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