Gemeinsame Ausflüge erstellen

In diesem Dokument wird beschrieben, wie Sie eine Fahrt mit mehreren Fahrgästen erstellen, die richtigen Felder festlegen und sie einem Fahrzeug zuweisen. Es wird davon ausgegangen, dass Sie die Fleet Engine eingerichtet, Fahrzeuge erstellt, eine funktionierende Fahrer-App und optional eine Verbraucher-App haben. Außerdem sollten Sie mit den verschiedenen Fahrtenszenarien für On-Demand-Fahrten vertraut sein. Weitere Informationen finden Sie in den folgenden Leitfäden:

Grundlagen der Erstellung von Reisen

In diesem Abschnitt werden die Anfragedetails beschrieben, die zum Erstellen einer Fahrt in Fleet Engine erforderlich sind. Sie stellen eine Erstellungsanfrage entweder über gRPC oder REST.

  • CreateTrip()-Methode: gRPC oder REST
  • CreateTripRequest-Nachricht: nur gRPC

Fahrtfelder

Verwenden Sie die folgenden Felder, um eine Fahrt in Fleet Engine zu erstellen. Sie können verschiedene Felder für die verschiedenen Arten von Fahrten verwenden: Fahrten mit einem oder mehreren Zielen, aufeinanderfolgende Fahrten oder Fahrten mit mehreren Fahrgästen. Sie können die optionalen Felder beim Erstellen der Fahrt angeben oder später beim Aktualisieren der Fahrt festlegen.

Felder für Fahrten
Name Erforderlich? Beschreibung
parent Ja Ein String, der die Projekt-ID enthält. Diese ID muss mit der ID übereinstimmen, die in Ihrer gesamten Fleet Engine-Integration verwendet wird, und dieselben Dienstkontorollen haben.
trip_id Ja Ein von Ihnen erstellter String, der diese Fahrt eindeutig identifiziert. Für Fahrt-IDs gelten bestimmte Einschränkungen, die in der Referenz angegeben sind.
trip_type Ja Legen Sie für TripType die folgenden Werte für den von Ihnen erstellten Reisetyp fest:
  • Einzelnes Ziel: Legen Sie dafür SHARED oder EXCLUSIVE fest.
  • Mehrere Ziele: Legen Sie EXCLUSIVE fest.
  • Back-to-back: Legen Sie EXCLUSIVE fest.
  • Gemeinsames Pooling: Auf SHARED festgelegt.
pickup_point Ja Der Startpunkt der Fahrt.
Zwischenziele Ja

Nur Fahrten mit mehreren Zielen: Die Liste der Zwischenziele, die der Fahrer zwischen Abholung und Absetzen anfährt. Wie dropoff_point kann auch dieses Feld später durch Aufrufen von UpdateTrip festgelegt werden. Eine Fahrt mit mehreren Zielen enthält jedoch per Definition Zwischenziele.

vehicle_waypoints Ja

Nur Fahrten mit mehreren Fahrgästen: In diesem Feld können die Wegpunkte mehrerer Fahrten verschachtelt werden. Sie enthält alle verbleibenden Wegpunkte für das zugewiesene Fahrzeug sowie die Wegpunkte für die Abholung und den Zielort für diese Fahrt. Sie können dieses Feld festlegen, indem Sie CreateTrip oder UpdateTrip aufrufen. Sie können Fahrzeugwegpunkte auch über das Feld waypoints mit einem Aufruf von UpdateVehicle aktualisieren. Der Dienst gibt diese Informationen bei GetTrip-Aufrufen aus Datenschutzgründen nicht zurück.

number_of_passengers Nein Die Anzahl der Fahrgäste auf der Fahrt.
dropoff_point Nein Das Ziel der Fahrt.
vehicle_id Nein Die ID des Fahrzeugs, das der Fahrt zugewiesen ist.

Beispiel: Fahrt mit mehreren Fahrgästen erstellen

Im folgenden Beispiel für die Backend-Integration wird gezeigt, wie Sie eine Fahrt erstellen und einem Fahrzeug als Fahrt mit mehreren Fahrgästen zuweisen.

// Vehicle with VEHICLE_ID ID is already created and it is assigned Trip A.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "shared-trip-A";
static final String VEHICLE_ID = "your-vehicle-id";
static final String TRIP_A_ID = "trip-a-id";
static final String TRIP_B_ID = "trip-b-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;

LatLng tripBPickup =
    LatLng.newBuilder().setLatitude(-12.12314).setLongitude(88.142123).build();
LatLng tripBDropoff =
    LatLng.newBuilder().setLatitude(-14.12314).setLongitude(90.142123).build();

TerminalLocation tripBPickupTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBPickup).build();
TerminalLocation tripBDropoffTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBDropoff).build();

// TripA already exists and it's assigned to a vehicle with VEHICLE_ID ID.
Trip tripB = Trip.newBuilder()
    .setTripType(TripType.SHARED)
    .setVehicleId(VEHICLE_ID)
    .setPickupPoint(tripBPickupTerminalLocation)
    .setDropoffPoint(tripBDropoffTerminalLocation)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripBPickupTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripBDropoffTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// Create Trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId(TRIP_B_ID)
    .setTrip(tripB)
    .build();

try {
  // createdTrip.remainingWaypoints will contain shared-pool waypoints.
  // [tripB.pickup, tripA.dropoff, tripB.dropoff]
  Trip createdTrip = tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Fahrten mit geteiltem Pooling aktualisieren

Jede in der Fleet Engine erstellte Fahrt muss einem Fahrzeug zugewiesen werden, damit die Fleet Engine die voraussichtliche Ankunftszeit berechnen und die Fahrt verfolgen kann. Dies ist entweder beim Erstellen der Fahrt oder später beim Aktualisieren der Fahrt möglich.

Bei Fahrten mit geteiltem Pool müssen Sie eine Reihenfolge für die nicht besuchten Wegpunkte in der Sammlung der Fahrzeugwegpunkte der Fahrt (Trip.vehicle_waypoints) angeben. Die Fleet Engine verwendet diese Liste, um die Wegpunkte für alle Fahrten im geteilten Pool automatisch zu aktualisieren.

Beispiel: Fahrt A und Fahrt B sind zwei Fahrten mit einem gemeinsam genutzten Pool:

  • Fahrt A ist auf dem Weg zum Ausstiegsort.
  • Fahrt B wird dann demselben Fahrzeug hinzugefügt.

In einer UpdateTripRequest für Fahrt B legen Sie die vehicleId fest und setzen Trip.vehicle_waypoints auf die optimale Wegpunktreihenfolge: B Abholung → A Absetzen → B Absetzen.

  • Der Aufruf von getVehicle() gibt remainingWaypoints zurück, die Folgendes enthalten:
    B Abholung → A Abgabe → B Abgabe.
  • Entweder getTrip() oder der Callback onTripRemainingWaypointsUpdated für Fahrt A gibt remainingWaypoints zurück, die Folgendes enthalten:
    B Abholung → A Absetzen.
  • Entweder getTrip() oder der Callback onTripRemainingWaypointsUpdated für Fahrt B gibt remainingWaypoints zurück, die Folgendes enthalten:
    B Abholung → A Ziel → B Ziel.

Beispiel

Im folgenden Beispiel für die Backend-Integration wird gezeigt, wie eine Fahrt mit der Fahrzeug-ID und den Wegpunkten für zwei Fahrten mit mehreren Fahrgästen aktualisiert wird.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_A_ID = "share-trip-A";
static final String TRIP_B_ID = "share-trip-B";
static final String VEHICLE_ID = "Vehicle";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_B_ID;

// Get Trip A and Trip B objects from either the Fleet Engine or storage.
Trip tripA = …;
Trip tripB = …;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId(VEHICLE_ID)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getPickupPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getDropoffPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("vehicle_id")
        .addPaths("vehicle_waypoints"))
    .build();

// Error handling. If Fleet Engine has both a trip and vehicle with the IDs,
// and if the credentials validate, and if the given vehicle_waypoints list
// is valid, 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:          // Either the trip or vehicle does not exist.
      break;
    case PERMISSION_DENIED:
      break;
    case INVALID_REQUEST:    // vehicle_waypoints is invalid.
      break;
  }
  return;
}

Nächste Schritte