כדי להבין את המסמך הזה, צריך להכיר את הנושאים הבאים:
- יצירת משימות משלוח
- מבוא למשימות מתוזמנות, שבו מוסבר בפירוט הקשר בין משימות, עצירות וכלי רכב.
בתרחיש של משלוח בעולם האמיתי, עסקים מקצים משימות של משלוח לנהגים, שמשתמשים ברכב כדי להעביר את המשלוח לנמען במיקום מתוכנן, כמו בית מגורים או חדר משלוחים במתחם בניינים. כדי ליצור מודל כזה ב-Fleet Engine, יוצרים משימה ושולחים בקשה לעדכון של רכב המשלוחים. לאחר מכן, ישות הרכב מתעדכנת עם רשימה של עצירות במסלול. לכל עצירה מקצים רשימה של משימות שצריך לבצע בה.
אפשר לעדכן את המשימות של כלי הרכב בכל שלב, אבל בדרך כלל עושים את זה למטרות הבאות:
- לתזמן משימות שהרכב צריך לבצע. אפשר לעשות את זה באמצעות בקשת עדכון שמוסיפה עצירה חדשה לרכב, או באמצעות בקשת עדכון שמוסיפה משימה חדשה לעצירה קיימת.
- לעדכן את הסדר של המשימות הקיימות שמשויכות לעצירה נתונה של הרכב.
- לשנות את המיקום שבו המשימה תושלם. כברירת מחדל, Fleet Engine מסמן את מיקום השלמת המשימה כמיקום זהה למיקום העצירה של הרכב שמשויך למשימה. אם אתם מעדיפים, אתם יכולים לציין מיקומים ספציפיים למשימות מסוימות. לדוגמה, יכול להיות שהרכב יעצור במתחם גדול כדי למסור כמה חבילות, ולכל אחת מהן מוקצה חדר דואר ספציפי.
- סגרו את כל המשימות שהוקצו בעבר כדי להשאיר אותן מחוץ לסדר המעודכן. פרטים נוספים זמינים בקטע סיום משימות.
תזמון או שינוי של משימות מסירה
אתם יכולים לתזמן או לשנות משימות שהוקצו לרכב מסביבת שרת, או באמצעות Driver SDK אם אתם נותנים לנהג את היכולת לנהל משימות באמצעות מכשיר מהימן. כדי למנוע מרוץ תהליכים ולשמור על מקור אמת יחיד, צריך להשתמש רק בשיטה אחת.
כדי להעביר משלוח מרכב אחד לאחר, סוגרים את המשימה המקורית ויוצרים אותה מחדש לפני שמקצים אותה לרכב אחר. אם מעדכנים רכב למשלוחים כך שיכלול משימה שכבר הוקצתה לרכב אחר, תופיע הודעת שגיאה.
שדות חובה לעדכון משימות
בקטע הזה מפורטים שדות החובה שצריך להגדיר כשמעדכנים משימה של רכב. אין שדות אופציונליים. מנוע Fleet Engine מתעלם מכל שאר השדות בישות לצורך העדכון.
| שדה חובה | ערך |
|---|---|
remainingVehicleJourneySegments |
רשימה של מקטעי נסיעה למשימות, לפי הסדר שבו צריך לבצע אותן. המשימה הראשונה ברשימה מבוצעת ראשונה. |
remainingVehicleJourneySegments[i].stop |
התחנה של המשימה i ברשימה. |
remainingVehicleJourneySegments[i].stop.plannedLocation |
המיקום המתוכנן של התחנה. |
remainingVehicleJourneySegments[i].stop.tasks |
רשימת המשימות שצריך לבצע בעצירה הזו של הרכב. |
remainingVehicleJourneySegments[i].stop.state |
State.NEW |
דוגמה להקצאת משימות
בדוגמאות הבאות מוסבר איך להשתמש בספריית Java gRPC ובקריאת HTTP REST ל-UpdateDeliveryVehicle כדי להוסיף שתי משימות חדשות לרכב.
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> הוא מזהה ייחודי של רכב משלוחים בצי שלכם שאתם רוצים לעדכן את סדר המשימות שלו. זהו המזהה שציינתם כשיצרתם את הרכב.
ה-request header חייב להכיל את השדה 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.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM