עדכון הנסיעות וניהול המצב שלהן

במסמך הזה מוסבר איך לעדכן נסיעה ולנהל את הסטטוס שלה. כדי לעשות את זה, צריך להשתמש במסכת שדות כדי להגדיר את השדות הרלוונטיים של הנסיעה. המדריך מבוסס על ההנחה שהגדרתם את Fleet Engine כמו שמתואר באתר הזה, ושאתם עובדים עם רכב שהוקצה לנסיעה.

עדכונים לגבי הנסיעה – מידע בסיסי

המערכת שלכם משתמשת ב-Fleet Engine כדי לעדכן נסיעה במצבים הבאים:

  • כשמקצים רכב לנסיעה אחרי שהיא נוצרה.
  • כשהסטטוס של הנסיעה משתנה, למשל כשהרכב עובר דרך נקודות ציון.
  • כשמעדכנים שדות של נסיעה, כמו מספר הנוסעים ונקודת ההורדה.

כדי לעדכן נסיעה, שולחים בקשה באמצעות gRPC או REST.

  • שיטה: UpdateTrip() gRPC או REST
  • הודעה UpdateTripRequest: gRPC בלבד

משתמשים בפרטי הכניסה המתאימים לחשבון השירות של הפרויקט, כפי שמתואר במאמר 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 enumeration. כשמצב הנסיעה משתנה, למשל מ-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 (נוצר) או 409 (קונפליקט). במקרה השני, הבקשה הקודמת הסתיימה בהצלחה לפני DEADLINE_EXCEEDED.

אפשר לעיין ברשימת שגיאות הרשת ב-Consumer SDK ל-Android או ל-iOS.

המאמרים הבאים