במסמך הזה מוסבר איך לעדכן נסיעה ולנהל את המצב שלה, כולל שימוש במסכת שדות כדי להגדיר שדות רלוונטיים לנסיעה. ההנחה היא שהגדרתם את 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.