Aktualizowanie podróży i zarządzanie ich stanem

Z tego dokumentu dowiesz się, jak aktualizować podróż i zarządzać jej stanem. Polega to na ustawianiu odpowiednich pól podróży za pomocą maski pól. Zakładamy, że masz skonfigurowany mechanizm floty zgodnie z opisem na tej stronie i pracujesz z pojazdem przypisanym do podróży.

Podstawowe informacje o aktualizacji podróży

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

  • podczas przypisywania pojazdu do podróży po jego utworzeniu.
  • gdy zmienia się stan podróży, np. gdy pojazd przejeżdża przez punkty kontrolne;
  • Gdy aktualizujesz pola podróży, takie jak liczba pasażerów i miejsce wylądowania.

Aby zaktualizować podróż, wyślij żądanie przy użyciu gRPC i REST.

  • Metoda UpdateTrip(): gRPC lub REST
  • Komunikat UpdateTripRequest: tylko gRPC

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

Zaktualizuj pola podróży

Możesz zaktualizować dowolne pole podróży opisane w sekcji Pola podróży w sekcji Tworzenie podróży do jednego miejsca docelowego. Na przykład często po utworzeniu podróży najpierw znajduje się pojazd, a następnie aktualizuje pole vehicle_id, aby powiązać go z pojazdem, po którym się odbywa.

Użyj masek pól

Pole maski to sposób na podanie przez wywołujących interfejs API listy pól, które mają być aktualizowane lub aktualizowane. Używanie FieldMask pozwala uniknąć zbędnych działań i zwiększyć wydajność. Fleet Engine używa masek pól do aktualizowania pól we wszystkich zasobach.

Zaktualizuj podróż, podając identyfikator pojazdu

Musisz skonfigurować przejazd z identyfikatorem pojazdu, aby silnik floty mógł śledzić pojazd na jego trasie. Poniższy przykładowy kod 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 wartości enumeracji TripStatus. Gdy stan podróży ulegnie zmianie, np. z ENROUTE_TO_PICKUP na ARRIVED_AT_PICKUP, aktualizujesz stan podróży w Fleet Engine. Cykl życia podróży zawsze zaczyna się od wartości stanu NEW i kończy wartością COMPLETE lub CANCELED.

Przykładowa aktualizacja podróży

Poniżej pokazujemy, jak zaktualizować stan podróży w przypadku kilkukrotnej podróży we 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;
}

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

Obsługa błędów dotyczących 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ć, najpierw ponownie wywołaj funkcję CreateTrip, używając tego samego identyfikatora podróży, który próbujesz zaktualizować lub monitorować. Powinien wyświetlić się błąd 201 (CREATED) albo 409 (CONFLICT). W tym drugim przypadku poprzednie żądanie zostało zrealizowane przed DEADLINE_EXCEEDED.

Wyświetl listę błędów sieci w pakiecie SDK dla konsumentów (Android lub iOS).

Co dalej?