Aktualizowanie podróży i zarządzanie ich stanem

Z tego dokumentu dowiesz się, jak aktualizować podróż i zarządzać jej stanem. Obejmuje to używanie maski pola do ustawiania odpowiednich pól podróży. Zakładamy, że masz skonfigurowany Fleet Engine zgodnie z opisem w tej witrynie i pracujesz z pojazdem przypisanym do podróży.

Podstawowe informacje o aktualizowaniu podróży

Twój system używa Fleet Engine do aktualizowania podróży w tych sytuacjach:

  • Gdy po utworzeniu podróży przypiszesz do niej pojazd.
  • Gdy zmieni się stan podróży, np. gdy pojazd przejedzie przez punkty na trasie.
  • Gdy zaktualizujesz pola podróży, np. liczbę pasażerów i punkt wysadzenia.

Aby zaktualizować podróż, wyślij prośbę za pomocą gRPC lub REST.

  • Metoda UpdateTrip(): gRPC lub REST
  • UpdateTripRequest wiadomość: gRPC tylko

Użyj odpowiednich danych logowania konta usługi w projekcie zgodnie z opisem w artykule Fleet Engine: role konta usługi.

Aktualizowanie pól podróży

Możesz zaktualizować dowolne pole podróży opisane w sekcji Pola podróży w artykule Tworzenie podróży do jednego miejsca docelowego. Na przykład po utworzeniu podróży często najpierw wyszukujesz pojazd, a potem aktualizujesz pole vehicle_id podróży, aby powiązać ją z pojazdem, który będzie realizował podróż.

Używanie masek pól

Maski pól umożliwiają osobom wywołującym interfejs API wyświetlanie pól, które powinny być uwzględnione w żądaniu lub aktualizacji. Używanie FieldMask pozwala uniknąć niepotrzebnych działań i zwiększa wydajność. Fleet Engine używa masek pól do aktualizowania pól we wszystkich zasobach.

Aktualizowanie podróży za pomocą identyfikatora pojazdu

Musisz skonfigurować podróż z identyfikatorem pojazdu, aby Fleet Engine mógł śledzić pojazd na trasie. Poniższy przykład kodu pokazuje, jak zaktualizować podróż za pomocą identyfikatora pojazdu.

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

Zarządzanie stanem podróży

Stan podróży określasz za pomocą jednej z TripStatus wartości wyliczenia. Gdy stan podróży się zmieni, np. z ENROUTE_TO_PICKUP na ARRIVED_AT_PICKUP, zaktualizuj stan podróży w Fleet Engine. Cykl życia podróży zawsze zaczyna się od stanu NEW i kończy się stanem COMPLETE lub CANCELED.

Przykład aktualizacji podróży

Poniżej pokazujemy, jak zaktualizować stan podróży w Fleet Engine w przypadku podróży z przesiadką.

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

Więcej przykładów aktualizowania podróży znajdziesz w sekcji Inne typy podróży.

Obsługa błędów podróży

Podczas aktualizowania lub wyszukiwania istniejących podróży może wystąpić błąd DEADLINE_EXCEEDED. W takim przypadku stan Fleet Engine jest nieznany. Aby to sprawdzić, ponownie wywołaj CreateTrip z tym samym identyfikatorem podróży, który próbujesz zaktualizować lub monitorować. Powinno to zwrócić kod stanu 201 (UTWORZONO) lub 409 (KONFLIKT). W tym drugim przypadku poprzednie żądanie zostało zrealizowane przed upływem terminu DEADLINE_EXCEEDED.

Listę błędów sieciowych znajdziesz w pakiecie SDK dla konsumentów na Android lub iOS.

Co dalej?