Aktualizowanie podróży i zarządzanie ich stanem

Ten dokument opisuje, jak zaktualizować przejazd i zarządzać jego stanem, co obejmuje użycie maski pola do ustawienia odpowiednich pól przejazdu. Zakładamy, że masz skonfigurowany Fleet Engine zgodnie z opisem na tej stronie i pracujesz z pojazdem przypisanym do przejazdu.

Podstawowe informacje o aktualizacjach przejazdów

System używa Fleet Engine do aktualizowania przejazdu w tych sytuacjach:

  • podczas przypisywania pojazdu do przejazdu po jego utworzeniu;
  • gdy zmieni się stan przejazdu, np. gdy pojazd przejedzie przez punkty orientacyjne;
  • gdy aktualizujesz pola przejazdu, takie jak liczba pasażerów i punkt wysiadania;

Aby zaktualizować przejazd, wyślij żądanie za pomocą gRPC lub REST.

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

Użyj odpowiednich danych logowania do konta usługi projektu, jak opisano w artykule Fleet Engine: role kont usługi.

Aktualizowanie pól przejazdu

Możesz zaktualizować dowolne pola przejazdu opisane w sekcji Pola przejazdu w artykule Tworzenie przejazdu z jednym miejscem docelowym. Na przykład po utworzeniu przejazdu często najpierw wyszukuje się pojazd, a następnie aktualizuje pole vehicle_id przejazdu, aby powiązać go z pojazdem, który będzie realizował przejazd.

Używanie masek pól

Maski pól to sposób, w jaki wywołujący interfejs API mogą wyświetlać listę pól, które żądanie powinno zwrócić lub zaktualizować. Użycie FieldMask pozwala uniknąć niepotrzebnych działań i poprawia wydajność. Fleet Engine używa masek pól do aktualizowania pól we wszystkich zasobach.

Aktualizowanie przejazdu za pomocą identyfikatora pojazdu

Musisz skonfigurować przejazd z identyfikatorem pojazdu, aby Fleet Engine mógł śledzić pojazd na trasie. Poniższy przykładowy kod pokazuje, jak zaktualizować przejazd 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 przejazdów

Stan przejazdu określasz za pomocą jednej z wartości typu wyliczeniowego TripStatus. Gdy stan przejazdu się zmieni, np. z ENROUTE_TO_PICKUP na ARRIVED_AT_PICKUP, zaktualizuj go w Fleet Engine. Cykl życia przejazdu zawsze zaczyna się od wartości stanu NEW, a kończy wartością COMPLETE lub CANCELED.

Przykładowa aktualizacja przejazdu

Poniżej pokazujemy, jak zaktualizować stan przejazdu łączonego w 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;
}

Inne przykłady aktualizowania przejazdów znajdziesz w sekcji Inne typy przejazdów.

Obsługa błędów dotyczących przejazdów

Podczas aktualizowania lub wyszukiwania istniejących przejazdów może wystąpić błąd DEADLINE_EXCEEDED. W takim przypadku stan Fleet Engine jest nieznany. Aby to sprawdzić, najpierw wywołaj ponownie CreateTrip, używając tego samego identyfikatora przejazdu, który próbujesz zaktualizować lub monitorować. Powinno to zwrócić kod 201 (CREATED) lub 409 (CONFLICT). W tym drugim przypadku poprzednie żądanie zostało zrealizowane przed DEADLINE_EXCEEDED.

Zobacz listę błędów sieciowych w pakiecie SDK dla klientów na Android lub iOS.

Co dalej?