במאמר הזה מוסבר איך ליצור נסיעה עם כמה יעדים, להגדיר את השדות הנכונים ולהקצות אותה לרכב לביצוע. אנחנו מניחים שהגדרתם את Fleet Engine, יצרתם כלי רכב, יש לכם אפליקציית נהג פעילה ואופציונלית, אפליקציית צרכן. בנוסף, אתם צריכים להכיר את תרחישי הנסיעה השונים שזמינים לנסיעות על פי דרישה. במדריכים הבאים אפשר למצוא מידע נוסף בנושאים:
- הגדרת Fleet Engine
- יצירת רכב
- תרחישי נסיעה בסקירה הכללית של נסיעות על פי דרישה
מידע בסיסי על יצירת נסיעות
בקטע הזה מתוארים פרטי הבקשה שנדרשים ליצירת נסיעה ב-Fleet Engine. שולחים בקשת יצירה באמצעות gRPC או REST.
שדות של נסיעות
כדי ליצור נסיעה ב-Fleet Engine, משתמשים בשדות הבאים. אפשר להשתמש בשדות שונים לסוגים שונים של נסיעות: נסיעה ליעד אחד או לכמה יעדים, נסיעה הלוך ושוב או נסיעה משותפת. אפשר לספק את השדות האופציונליים כשיוצרים את הנסיעה, או להגדיר אותם מאוחר יותר כשמעדכנים את הנסיעה.
שם | נדרש? | תיאור |
---|---|---|
parent | כן | מחרוזת שכוללת את מזהה הפרויקט. המזהה הזה צריך להיות זהה למזהה שבו השתמשתם בכל השילוב שלכם עם Fleet Engine, עם אותן הרשאות של חשבון השירות. |
trip_id | כן | מחרוזת שאתם יוצרים ומזהה באופן ייחודי את הנסיעה הזו. יש הגבלות מסוימות על מזהי נסיעות, כפי שמצוין בהפניה. |
trip_type | כן | מגדירים את הערכים הבאים של TripType לסוג הנסיעה שאתם יוצרים:
|
pickup_point | כן | נקודת המוצא של הנסיעה. |
יעדים ביניים | כן | לנסיעות עם כמה יעדים בלבד: רשימת יעדי הביניים שהנהג מבקר בהם בין נקודת האיסוף לנקודת ההורדה. כמו במקרה של |
vehicle_waypoints | כן | נסיעות בשירות הסעות שיתופי בלבד: השדה הזה תומך בשילוב של נקודות ציון מכמה נסיעות.
הוא מכיל את כל נקודות העצירה שנותרו לרכב שהוקצה, וגם את נקודות העצירה של האיסוף וההורדה בנסיעה הזו. אפשר להגדיר את השדה הזה באמצעות קריאה ל- |
number_of_passengers | לא | מספר הנוסעים בנסיעה. |
dropoff_point | לא | היעד של הנסיעה. |
vehicle_id | לא | המזהה של הרכב שהוקצה לנסיעה. |
דוגמה: יצירת נסיעה לכמה יעדים
בדוגמה הבאה אפשר לראות איך יוצרים נסיעה בלעדית עם כמה יעדים, שכוללת נקודת איסוף, נקודת הורדה ויעד ביניים אחד.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// Trip initial settings.
String parent = "providers/" + PROJECT_ID;
Trip trip = Trip.newBuilder()
.setTripType(TripType.EXCLUSIVE)
.setPickupPoint(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)))
.setNumberOfPassengers(1)
.setDropoffPoint(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.1275).setLongitude(106.6537)))
// Add the list of intermediate destinations.
.addAllIntermediateDestinations(
ImmutableList.of(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)).build()))
.build();
// Create the Trip request.
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
.setParent(parent)
.setTripId(TRIP_ID) // Trip ID assigned by the Provider server.
.setTrip(trip) // Initial state is NEW.
.build();
// Error handling.
try {
Trip createdTrip =
tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS: // Trip already exists.
break;
case PERMISSION_DENIED:
break;
}
return;
}
עדכון נסיעה עם כמה יעדים
צריך להגדיר את הנסיעה עם מזהה כלי רכב כדי שמערכת Fleet Engine תוכל לעקוב אחרי כלי הרכב לאורך המסלול. פרטים על עדכון נסיעה מופיעים במאמר בנושא עדכון נסיעות וניהול הסטטוס שלהן.
אם לא ציינתם נקודת הורדה או יעדים ביניים כשאתם יוצרים את הנסיעה, תמיד תוכלו לעשות זאת בשלב הזה.
דוגמה לעדכון נסיעה
בדוגמה הבאה מוסבר איך לעדכן נסיעה כדי להוסיף רשימה של יעדי ביניים ולהגדיר מזהה רכב.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to be updated.
Trip trip = Trip.newBuilder()
// Add the list of intermediate destinations.
.addAllIntermediateDestinations(
ImmutableList.of(
TerminalLocation.newBuilder().setPoint(
LatLng.newBuilder()
.setLatitude(-6.195139).setLongitude(106.820826)).build()))
.setVehicleId("8241890")
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(
FieldMask.newBuilder()
.addPaths("intermediate_destinations")
.addPaths("vehicle_id")
.build())
.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 PERMISSION_DENIED:
break;
}
return;
}
ניהול סטטוס הנסיעה בנסיעות עם כמה יעדים
מציינים את מצב הנסיעה באמצעות אחד מהערכים של TripStatus
enumeration. כשסטטוס הנסיעה משתנה, למשל מ-ENROUTE_TO_PICKUP
ל-ARRIVED_AT_PICKUP
, צריך לעדכן את סטטוס הנסיעה ב-Fleet Engine. הערך של מאפיין Trip state (סטטוס הנסיעה) תמיד מתחיל ב-NEW
ומסתיים ב-COMPLETE
או ב-CANCELED
.
בנסיעה עם כמה יעדים, בנוסף לעדכון מצב הנסיעה כמו בנסיעה עם יעד אחד, צריך גם לעדכן את הפרטים הבאים בכל פעם שהרכב מגיע ליעד ביניים:
intermediateDestinationIndex
intermediateDestinationsVersion
כדי לעשות זאת, משתמשים בערכים הבאים מהספירה TripStatus
.
ENROUTE_TO_PICKUP
ARRIVED_AT_PICKUP
ENROUTE_TO_INTERMEDIATE_DESTINATION
ARRIVED_AT_INTERMEDIATE_DESTINATION
ENROUTE_TO_DROPOFF
COMPLETE
דוגמה לטיול עם יעדי ביניים
בדוגמה הבאה מוצג מסלול עם כמה יעדים שנקודת האיסוף שלו כבר מאחוריו, והוא נמצא כרגע בדרך ליעד הביניים הראשון.
static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";
String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
// Get the trip object from either the Fleet Engine or storage.
Trip trip = …;
TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);
// The trip settings to be updated.
Trip trip = Trip.newBuilder()
// Trip status cannot return to a previous state once it has passed.
.setTripStatus(TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION)
// Enroute to the first intermediate destination.
.setIntermediateDestinationIndex(0)
// You must provide an intermediate_destinations_version to ensure that you
// have the same intermediate destinations list as the Fleet Engine.
.setIntermediateDestinationsVersion(
trip.getIntermediateDestinationsVersion())
.build();
// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
.setName(tripName)
.setTrip(trip)
.setUpdateMask(
FieldMask.newBuilder()
.addPaths("trip_status")
.addPaths("intermediate_destination_index")
// intermediate_destinations_version must not be in the update mask.
.build())
.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: // Either the trip status is invalid, or the
// intermediate_destinations_version doesn't
// match Fleet Engine's.
break;
case PERMISSION_DENIED:
break;
}
return;
}