Aktualizowanie podróży i zarządzanie ich stanem

Z tego dokumentu dowiesz się, jak zaktualizować podróż i zarządzać jej stanem. Obejmuje to użycie maski pola do ustawienia 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 przypisujesz do niej pojazd.
  • Gdy zmienia się stan podróży, np. gdy pojazd przejeżdża przez punkty na trasie.
  • Gdy aktualizujesz pola podróży, np. liczbę pasażerów i miejsce docelowe.

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świetlenie listy pól, które powinny zostać uwzględnione w żądaniu lub zaktualizowane. Użycie 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, używając tego samego identyfikatora 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?