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 przejazdu.

Podstawowe informacje o aktualizacji podróży

Twój system używa usługi Fleet Engine do aktualizowania przejazdu w tych sytuacjach:

  • Przypisując pojazd do podróży po jej utworzeniu.
  • Gdy zmienia się stan podróży, na przykład gdy pojazd przejeżdża przez punkty kontrolne.
  • Gdy aktualizujesz pola dotyczące przejazdu, takie jak liczba pasażerów i punkt wysadzania.

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

  • UpdateTrip() metoda: gRPC lub REST
  • UpdateTripRequest komunikat: dotyczy tylko gRPC

Użyj odpowiednich danych logowania do konta usługi projektu 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 sekcji Tworzenie podróży do jednego miejsca docelowego. Na przykład po utworzeniu podróży należy najpierw znaleźć pojazd, a następnie zaktualizować pole podróży vehicle_id, aby powiązać je z pojazdem, który będzie wykonywać podróż.

Używanie 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. Korzystanie z FieldMask pozwala uniknąć niepotrzebnej pracy i zwiększa 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ć przejazd, podając identyfikator 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, a kończy się wartością COMPLETE lub CANCELED.

Przykładowa aktualizacja podróży

Z tego filmu dowiesz się, jak zaktualizować stan przejazdu w Fleet Engine w przypadku przejazdów z kolei.

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 przejazdów może wystąpić błąd DEADLINE_EXCEEDED, co oznacza, że stan silnika floty jest nieznany. Aby to sprawdzić, najpierw ponownie zadzwoń do CreateTrip, używając tego samego identyfikatora podróży, który próbujesz zaktualizować lub monitorować. Powinien on zwrócić kod 201 (CREATED) lub 409 (CONFLICT). W tym drugim przypadku poprzednie żądanie zostało wykonane przed DEADLINE_EXCEEDED.

Zobacz listę błędów sieci w pakiecie Consumer SDK na Android lub iOS.

Co dalej?