Aktualizowanie podróży i zarządzanie ich stanem

W tym dokumencie opisujemy, jak aktualizować przejazd i zarządzać jego stanem. Wymaga to użycia maski pola do ustawienia odpowiednich pól przejazdu. Zakłada się w nim, że usługa Fleet Engine została skonfigurowana zgodnie z opisem na tej stronie i że pracujesz z pojazdem przypisanym do przejazdu.

Podstawowe informacje o aktualizacjach podróży

System korzysta z Fleet Engine, aby aktualizować przejazd w tych sytuacjach:

  • Podczas przypisywania pojazdu do utworzonej już podróży.
  • Gdy zmieni się stan przejazdu, np. gdy pojazd przejedzie przez punkty pośrednie.
  • Gdy aktualizujesz pola podróży, takie jak liczba pasażerów i miejsce docelowe.

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

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

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 przejazdu często najpierw wyszukuje się pojazd, a potem aktualizuje pole vehicle_id przejazdu, aby powiązać go z pojazdem, który będzie realizować przejazd.

przypisać inny pojazd.

Używanie masek pól

Maski pól umożliwiają wywołującym interfejs API wyświetlanie listy pól, które żądanie powinno zwracać lub aktualizować. 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 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 podróży

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

Przykładowa aktualizacja podróży

Poniżej przedstawiamy, jak zaktualizować stan przejazdu w przypadku przejazdu bezpośrednio po poprzednim 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;
}

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

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

Podczas aktualizowania lub wyszukiwania istniejących przejazdów może wystąpić błąd DEADLINE_EXCEEDED, w którym stan Fleet Engine jest nieznany. Aby to sprawdzić, ponownie zadzwoń pod numer CreateTrip, używając tego samego identyfikatora przejazdu, który próbujesz zaktualizować lub monitorować. Powinien zostać zwrócony kod stanu 201 (CREATED) lub 409 (CONFLICT). W tym drugim przypadku poprzednia prośba została zrealizowana przed DEADLINE_EXCEEDED.

Zapoznaj się z listą błędów sieciowych w pakiecie Consumer SDK na Android lub iOS.

Co dalej?