Aktualizowanie podróży i zarządzanie ich stanem

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

Podstawowe informacje o aktualizacjach przejazdu

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

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

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

  • Metoda UpdateTrip(): gRPC lub REST
  • UpdateTripRequest message: gRPC only

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

Aktualizowanie pól przejazdu

Możesz zaktualizować dowolne pole przejazdu opisane w sekcji Pola przejazdu w artykule Tworzenie przejazdu 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 wykona przejazd.

.

Używanie masek pól

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

Zaktualizuj przejazd, podając identyfikator 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 przejazdu

Stan przejazdu określa się za pomocą jednej z wartości wyliczenia TripStatus. Gdy stan przejazdu się zmieni, np. z ENROUTE_TO_PICKUP na ARRIVED_AT_PICKUP, zaktualizuj stan przejazdu 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 znajdziesz przykład aktualizowania stanu przejazdu w przypadku przejazdu bezpośredniego 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 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ć, zadzwoń ponownie pod numer CreateTrip, używając tego samego identyfikatora przejazdu, który próbujesz zaktualizować lub monitorować. Powinna zwrócić kod 201 (CREATED) lub 409 (CONFLICT). W tym drugim przypadku poprzednia prośba została zrealizowana przed DEADLINE_EXCEEDED.

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

Co dalej?