Tworzenie podróży obejmujących wiele miejsc docelowych

W tym dokumencie opisujemy, jak utworzyć podróż obejmującą wiele miejsc docelowych, ustawić poprawne i przypisać je do pojazdu, który ma je wypełnić. Zakładamy, że masz skonfigurowany Fleet Engine, utworzyłeś pojazdy, masz działającą aplikację dla kierowcy i opcjonalnie aplikację dla pasażerów. Powinieneś też znać różne scenariusze przejazdów dostępne w przypadku przejazdów na żądanie. Zapoznaj się z tymi przewodnikami:

Podstawowe informacje o tworzeniu podróży

W tej sekcji opisano szczegóły żądania, które są niezbędne do utworzenia przejazdu w Fleet Engine. Wysyłasz żądanie utworzenia za pomocą gRPC lub REST.

  • Metoda CreateTrip(): gRPC lub REST
  • Komunikat CreateTripRequest: tylko gRPC

Pola podróży

Użyj poniższych pól, aby utworzyć podróż we Fleet Engine. Możesz użyć różnych pola dla różnych rodzajów podróży: pojedynczej lub wielu miejsc docelowych, lub wspólne podróże. Pola opcjonalne możesz podać podczas tworzenia podróży lub ustawić je później podczas jej aktualizowania.

Pola podróży
Nazwa Wymagany? Opis
parent Tak Ciąg tekstowy zawierający identyfikator projektu. Ten identyfikator musi być taki sam, jak używany w całej integracji Fleet Engine z tym samym kontem usługi role.
trip_id Tak Utworzony przez Ciebie ciąg znaków jednoznacznie identyfikujący tę podróż. Identyfikatory podróży zawierają pewnych ograniczeń, które określono w pliku referencyjnym.
trip_type Tak W polu TripType ustaw następujące wartości dla tworzonego typu podróży:
  • Pojedyncze miejsce docelowe: ustaw SHARED lub EXCLUSIVE.
  • Wiele miejsc docelowych: ustaw wartość EXCLUSIVE.
  • Do tyłu: ustaw EXCLUSIVE.
  • Wspólne udostępnianie: ustaw SHARED.
pickup_point Tak Punkt początkowy podróży.
Średnie miejsca docelowe Tak

Tylko podróże do wielu miejsc docelowych: lista pośrednich miejsc docelowych, które kierowca odwiedza pomiędzy tymi miejscami. odbiór i zwrot. Tak jak dropoff_point, to pole Można również ustawić ją później, wywołując UpdateTrip, ale do wielu miejsc docelowych podróż z definicji zawiera miejsca docelowe pośrednie.

vehicle_waypoints Tak

Tylko podróże w ramach wspólnego puli: to pole obsługuje przeplatanie punktów pośrednich z wielu przejazdów. Zawiera wszystkie pozostałe punkty pośrednie dla przypisanego pojazdu, a także punkty odbioru i zwrotu w ramach tej podróży. To pole możesz ustawić, wywołując funkcję CreateTrip lub UpdateTrip. Możesz też zaktualizuj punkty pośrednie pojazdu w polu waypoints za pomocą połączenie z numerem UpdateVehicle. Usługa nie zwraca tych informacji w przypadku wywołań funkcji GetTrip ze względu na ochronę prywatności.

number_of_passengers Nie Liczba pasażerów w podróży.
dropoff_point Nie Cel podróży.
vehicle_id Nie Identyfikator pojazdu przypisanego do podróży.

Przykład: tworzenie podróży obejmującej wiele miejsc docelowych

Poniższy przykład pokazuje, jak utworzyć wyjątkową podróż obejmującą wiele miejsc docelowych z punktem odbioru, miejscem nadania i jednym pośrednim miejscem docelowym.

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;
}

Aktualizacja podróży obejmującej wiele miejsc docelowych

Musisz skonfigurować podróż za pomocą identyfikatora pojazdu, aby usługa Fleet Engine mogła śledzić pojazdem na trasie. Więcej informacji o aktualizowaniu podróży znajdziesz w aktualizować podróże i zarządzać ich stanem;

Jeśli nie podasz miejsca docelowego lub pośredniego miejsca docelowego podczas utwórz podróż, zawsze możesz to zrobić w tym momencie.

Przykładowa aktualizacja podróży

Poniżej pokazujemy, jak zaktualizować podróż, aby dodać listę średnio zaawansowanych miejsca docelowe i ustaw identyfikator pojazdu.

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;
}

Zarządzanie stanem podróży do wielu miejsc docelowych

Określasz stan podróży, używając jednego z wyliczeń TripStatus . Gdy stan wyjazdu ulegnie zmianie, np. z ENROUTE_TO_PICKUP na ARRIVED_AT_PICKUP, musisz zaktualizować stan wyjazdu w Fleet Engine. Podróż stan zawsze zaczyna się od wartości NEW i kończy wartością albo COMPLETE lub CANCELED.

W przypadku podróży do wielu miejsc, oprócz aktualizowania stanu podróży jak w przypadku podróży do jednego miejsca docelowego, musisz również zaktualizować następujące dane: za każdym razem, gdy pojazd dotrze do pośredniego miejsca docelowego:

  • intermediateDestinationIndex
  • intermediateDestinationsVersion

Aby to zrobić, użyj wartości z wyliczenia TripStatus.

  • ENROUTE_TO_PICKUP
  • ARRIVED_AT_PICKUP
  • ENROUTE_TO_INTERMEDIATE_DESTINATION
  • ARRIVED_AT_INTERMEDIATE_DESTINATION
  • ENROUTE_TO_DROPOFF
  • COMPLETE

Przykładowa podróż z miejscami docelowymi o średnim stopniu trudności

Z tego artykułu dowiesz się, jak utworzyć podróż obejmującą wiele miejsc docelowych, która zakończyła się i jest w drodze do pierwszego miejsca docelowego pośredniego.

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;
}

Co dalej?