במסמך הזה מוסבר איך לעדכן נסיעה ולנהל את הסטטוס שלה. הפעולה הזו כוללת שימוש במסכת שדות כדי להגדיר שדות רלוונטיים לנסיעה. המדריך מבוסס על ההנחה שהגדרתם את Fleet Engine כמו שמתואר באתר הזה, ושאתם עובדים עם רכב שהוקצה לנסיעה.
מידע בסיסי על עדכוני נסיעות
המערכת שלכם משתמשת ב-Fleet Engine כדי לעדכן נסיעה במצבים הבאים:
- כשמקצים רכב לנסיעה אחרי שהיא נוצרה.
- כשהסטטוס של הנסיעה משתנה, למשל כשהרכב עובר דרך נקודות ציון.
- כשמעדכנים שדות של נסיעה, כמו מספר הנוסעים ונקודת ההורדה.
כדי לעדכן נסיעה, שולחים בקשה באמצעות gRPC או REST.
משתמשים בפרטי הכניסה המתאימים לחשבון השירות של הפרויקט, כמו שמתואר במאמר Fleet Engine: תפקידים בחשבון השירות.
עדכון שדות של נסיעה
אפשר לעדכן את כל השדות של הנסיעה שמתוארים במאמר שדות של נסיעה בקטע יצירת נסיעה ליעד יחיד. לדוגמה, אחרי שיוצרים נסיעה, נהוג קודם למצוא רכב ואז לעדכן את השדה vehicle_id של הנסיעה כדי לשייך אותה לרכב שיבצע את הנסיעה.
שימוש במסכות שדות
מסכות שדות מאפשרות למתקשרים עם ה-API לפרט את השדות שצריך לבקש או לעדכן. השימוש ב-FieldMask מונע פעולות מיותרות ומשפר את הביצועים. Fleet Engine משתמש במסכות שדות כדי לעדכן שדות בכל המשאבים.
עדכון הנסיעה עם מזהה הרכב
צריך להגדיר נסיעה עם מזהה כלי רכב כדי שמערכת Fleet Engine תוכל לעקוב אחרי כלי הרכב לאורך המסלול. בדוגמת הקוד הבאה אפשר לראות איך מעדכנים את הנסיעה עם מזהה כלי רכב.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to update.
Trip trip = Trip.newBuilder()
.setVehicleId("8241890")
.build();
// The trip update request.
UpdateTripRequest updateTripRequest =
UpdateTripRequest.newBuilder() // No need for the header.
.setName(tripName)
.setTrip(trip)
.setUpdateMask(FieldMask.newBuilder().addPaths("vehicle_id"))
.build();
// Error handling.
// If the Fleet Engine has both a trip and vehicle with IDs, and if the
// credentials validate, then the service updates the trip.
try {
Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND: // Neither the trip nor vehicle exist.
break;
case PERMISSION_DENIED:
break;
}
return;
}
ניהול מצב הנסיעה
מציינים את מצב הנסיעה באמצעות אחד מהערכים של ספירת TripStatus. כשמצב הנסיעה משתנה, למשל מ-ENROUTE_TO_PICKUP ל-ARRIVED_AT_PICKUP, צריך לעדכן את מצב הנסיעה ב-Fleet Engine. מחזור החיים של הנסיעה תמיד מתחיל בערך מצב של NEW, ומסתיים בערך של COMPLETE או CANCELED.
דוגמה לעדכון נסיעה
בדוגמה הבאה מוצג איך לעדכן את סטטוס הנסיעה לנסיעה רצופה ב-Fleet Engine.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// Trip settings to be updated.
Trip trip = Trip.newBuilder()
.setTripStatus(TripStatus.ARRIVED_AT_PICKUP)
.build();
// Trip update request
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(FieldMask.newBuilder().addPaths("trip_status"))
.build();
// Error handling.
try {
Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND: // The trip doesn't exist.
break;
case FAILED_PRECONDITION: // The given trip status is invalid.
break;
case PERMISSION_DENIED:
break;
}
return;
}
דוגמאות נוספות לעדכון נסיעות מופיעות בקטע סוגי נסיעות אחרים.
טיפול בשגיאות בנסיעה
כשמעדכנים או מחפשים נסיעות קיימות, יכול להיות שתיתקלו בשגיאה DEADLINE_EXCEEDED, ובמקרה כזה המצב של Fleet Engine לא ידוע.
כדי לבדוק את זה, קודם צריך להתקשר שוב אל CreateTrip באמצעות אותו מזהה נסיעה שאתם מנסים לעדכן או לעקוב אחריו. התגובה צריכה להיות 201 (CREATED) או 409 (CONFLICT). במקרה השני, הבקשה הקודמת הסתיימה בהצלחה לפני DEADLINE_EXCEEDED.
אפשר לעיין ברשימת שגיאות הרשת ב-Consumer SDK ל-Android או ל-iOS.