Birden çok varış noktası içeren geziler oluşturun

Bu belgede, birden fazla varış noktası olan bir gezinin nasıl oluşturulacağı, doğru alanların nasıl ayarlanacağı ve bu gezinin bir araca nasıl atanacağı açıklanmaktadır. Fleet Engine'i ayarladığınız, araçlar oluşturduğunuz, çalışan bir sürücü uygulamanız ve isteğe bağlı olarak bir tüketici uygulamanız olduğu varsayılır. Ayrıca, isteğe bağlı geziler için kullanılabilen çeşitli gezi senaryolarını da bilmeniz gerekir. Bunun için aşağıdaki ilgili kılavuzlara bakın:

Gezi oluşturmayla ilgili temel bilgiler

Bu bölümde, Fleet Engine'da gezi oluşturmak için gereken istek ayrıntıları açıklanmaktadır. gRPC veya REST kullanarak oluşturma isteği gönderirsiniz.

  • CreateTrip() yöntemi: gRPC veya REST
  • CreateTripRequest mesajı: Yalnızca gRPC

Gezi Alanları

Fleet Engine'da gezi oluşturmak için aşağıdaki alanları kullanın. Farklı gezi türleri için farklı alanlar kullanabilirsiniz: tek veya çok hedefli, arka arkaya veya paylaşımlı havuz gezileri. İsteğe bağlı alanları, geziyi oluştururken doldurabilir veya daha sonra geziyi güncellerken ayarlayabilirsiniz.

Gezi alanları
Ad Zorunlu mu? Açıklama
parent Evet Proje kimliğini içeren bir dize. Bu kimlik, aynı hizmet hesabı rolleriyle tüm Fleet Engine entegrasyonunuzda kullanılan kimlikle aynı olmalıdır.
trip_id Evet Bu geziyi benzersiz şekilde tanımlamak için oluşturduğunuz dize. Gezi kimlikleri, referansta belirtildiği gibi belirli kısıtlamalara tabidir.
trip_type Evet Oluşturduğunuz gezi türü için TripType'ı aşağıdaki değerlere ayarlayın:
  • Tek hedef: SHARED veya EXCLUSIVE olarak ayarlayın.
  • Çoklu hedef: EXCLUSIVE olarak ayarlayın.
  • Arka arkaya: EXCLUSIVE olarak ayarlayın.
  • Paylaşılan havuz: SHARED olarak ayarlanır.
pickup_point Evet Gezinin başlangıç noktası.
Ara hedefler Evet

Yalnızca birden fazla varış noktası olan geziler: Sürücünün teslim alma ve bırakma arasında ziyaret ettiği ara varış noktalarının listesi. dropoff_point gibi bu alan da daha sonra UpdateTrip çağrılarak ayarlanabilir ancak birden fazla varış noktası olan bir gezi, tanım gereği ara varış noktaları içerir.

vehicle_waypoints Evet

Yalnızca paylaşımlı yolculuklar: Bu alan, birden fazla yolculuktaki yol noktalarının birleştirilmesini destekler. Atanan araç için kalan tüm ara noktaların yanı sıra bu seyahatin teslim alma ve bırakma ara noktalarını içerir. Bu alanı CreateTrip veya UpdateTrip yöntemini çağırarak ayarlayabilirsiniz. Ayrıca, UpdateVehicle çağrısı yaparak waypoints alanı üzerinden araç yol noktalarını güncelleyebilirsiniz. Hizmet, gizlilik nedeniyle GetTrip çağrılarında bu bilgileri döndürmez.

number_of_passengers Hayır Gezideki yolcu sayısı.
dropoff_point Hayır Gezinin varış noktası.
vehicle_id Hayır Geziye atanan aracın kimliği.

Örnek: Çok varış noktalı bir gezi oluşturma

Aşağıda, teslim alma noktası, bırakma noktası ve bir ara varış noktası olan özel bir çok varış noktalı seyahatin nasıl oluşturulacağı gösterilmektedir.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip initial settings.
String parent = "providers/" + PROJECT_ID;

Trip trip = Trip.newBuilder()
    .setTripType(TripType.EXCLUSIVE)
    .setPickupPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.195139).setLongitude(106.820826)))
    .setNumberOfPassengers(1)
    .setDropoffPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.1275).setLongitude(106.6537)))
    // Add the list of intermediate destinations.
    .addAllIntermediateDestinations(
        ImmutableList.of(
            TerminalLocation.newBuilder().setPoint(
                LatLng.newBuilder()
                    .setLatitude(-6.195139).setLongitude(106.820826)).build()))
    .build();

// Create the Trip request.
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId(TRIP_ID)  // Trip ID assigned by the Provider server.
    .setTrip(trip)       // Initial state is NEW.
    .build();

// Error handling.
try {
  Trip createdTrip =
      tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:  // Trip already exists.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Çok hedefli bir geziyi güncelleme

Fleet Engine'in aracı rotası boyunca takip edebilmesi için geziyi bir araç kimliğiyle yapılandırmanız gerekir. Gezi güncelleme hakkında ayrıntılı bilgi için Gezileri güncelleme ve durumlarını yönetme başlıklı makaleyi inceleyin.

Geziyi oluştururken bırakma noktası veya ara varış noktası belirtmediyseniz bu noktada belirtebilirsiniz.

Örnek gezi güncellemesi

Aşağıda, bir seyahatin ara varış noktaları listesi ekleyecek ve araç kimliği ayarlayacak şekilde nasıl güncelleneceği gösterilmektedir.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to be updated.
Trip trip = Trip.newBuilder()
    // Add the list of intermediate destinations.
    .addAllIntermediateDestinations(
        ImmutableList.of(
            TerminalLocation.newBuilder().setPoint(
                LatLng.newBuilder()
                    .setLatitude(-6.195139).setLongitude(106.820826)).build()))
    .setVehicleId("8241890")
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(
        FieldMask.newBuilder()
            .addPaths("intermediate_destinations")
            .addPaths("vehicle_id")
            .build())
    .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 PERMISSION_DENIED:
      break;
  }
  return;
}

Birden fazla varış noktası olan geziler için gezi durumunu yönetme

TripStatus numaralandırma değerlerinden birini kullanarak bir gezinin durumunu belirtirsiniz. Bir gezinin durumu değiştiğinde (ör. ENROUTE_TO_PICKUP durumundan ARRIVED_AT_PICKUP durumuna geçtiğinde) Fleet Engine'deki gezi durumunu güncellemeniz gerekir. Gezi durumu her zaman NEW değeriyle başlar ve COMPLETE veya CANCELED değeriyle biter.

Çok varış noktalı bir gezi için gezi durumunu tek varış noktalı bir gezi için yaptığınız gibi güncellemenin yanı sıra aracınız her ara varış noktasına ulaştığında aşağıdakileri de güncellemeniz gerekir:

  • intermediateDestinationIndex
  • intermediateDestinationsVersion

Bunu yapmak için TripStatus sıralamasındaki aşağıdaki değerleri kullanın.

  • ENROUTE_TO_PICKUP
  • ARRIVED_AT_PICKUP
  • ENROUTE_TO_INTERMEDIATE_DESTINATION
  • ARRIVED_AT_INTERMEDIATE_DESTINATION
  • ENROUTE_TO_DROPOFF
  • COMPLETE

Ara varış noktaları içeren örnek gezi

Aşağıda, teslim alma noktasını geçmiş ve ilk ara hedefine doğru ilerleyen çok hedefli bir gezinin nasıl oluşturulacağı gösterilmektedir.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

// Get the trip object from either the Fleet Engine or storage.
Trip trip = …;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to be updated.
Trip trip = Trip.newBuilder()
    // Trip status cannot return to a previous state once it has passed.
    .setTripStatus(TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION)

    // Enroute to the first intermediate destination.
    .setIntermediateDestinationIndex(0)

    // You must provide an intermediate_destinations_version to ensure that you
    // have the same intermediate destinations list as the Fleet Engine.
    .setIntermediateDestinationsVersion(
         trip.getIntermediateDestinationsVersion())
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(
        FieldMask.newBuilder()
            .addPaths("trip_status")
            .addPaths("intermediate_destination_index")
            // intermediate_destinations_version must not be in the update mask.
            .build())
    .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:  // Either the trip status is invalid, or the
                               // intermediate_destinations_version doesn't
                               // match Fleet Engine's.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Sırada ne var?