Tạo chuyến đi gộp được chia sẻ

Tài liệu này mô tả cách tạo chuyến đi đi chung, thiết lập các trường chính xác và chỉ định chuyến đi đó cho một xe để thực hiện. Phần này giả định bạn đã thiết lập Fleet Engine, bạn đã tạo phương tiện, có một ứng dụng lái xe hoạt động và không bắt buộc là một ứng dụng dành cho người dùng. Bạn cũng nên nắm rõ các tình huống chuyến đi có sẵn cho những chuyến đi theo yêu cầu. Hãy xem các hướng dẫn liên quan sau đây để biết thêm thông tin:

Thông tin cơ bản về cách tạo chuyến đi

Phần này mô tả thông tin chi tiết về yêu cầu cần thiết để tạo một chuyến đi trong Fleet Engine. Bạn đưa ra yêu cầu tạo bằng gRPC và REST.

  • Phương thức CreateTrip(): gRPC hoặc REST
  • Thông báo CreateTripRequest: chỉ gRPC

Trường chuyến đi

Sử dụng các trường sau để tạo một chuyến đi trong Fleet Engine. Bạn có thể sử dụng các trường khác nhau cho các loại chuyến đi khác nhau: chuyến đi một hoặc nhiều điểm đến, chuyến đi quay lại hoặc chuyến đi gộp chung. Bạn có thể cung cấp các trường không bắt buộc khi tạo chuyến đi hoặc bạn có thể đặt các trường này sau khi cập nhật chuyến đi.

Trường chuyến đi
Tên Bắt buộc? Mô tả
parent Một chuỗi ký tự chứa mã dự án. Mã này phải giống với mã được sử dụng trong toàn bộ quá trình tích hợp với Công cụ quản lý đội xe, với cùng vai trò tài khoản dịch vụ.
trip_id Một chuỗi mà bạn tạo để xác định riêng chuyến đi này. Mã chuyến đi có một số hạn chế nhất định, như được chỉ định trong tài liệu tham khảo.
trip_type Đặt TripType thành các giá trị sau cho loại chuyến đi mà bạn đang tạo:
  • Đích đến đơn: Đặt thành SHARED hoặc EXCLUSIVE.
  • Nhiều điểm đến: Đặt thành EXCLUSIVE.
  • Lượt quay liên tiếp: Đặt thành EXCLUSIVE.
  • Gộp chung: Đặt thành SHARED.
pickup_point Điểm xuất phát của chuyến đi.
Đích đến trung gian

Chỉ dành cho các chuyến đi nhiều điểm đến: Danh sách các điểm đến trung gian mà người lái xe ghé thăm giữa các điểm đến lấy hàng và trả xe. Giống như dropoff_point, bạn cũng có thể thiết lập trường này sau bằng cách gọi UpdateTrip. Tuy nhiên, theo định nghĩa, mỗi chuyến đi nhiều điểm đến sẽ chứa các điểm đến trung gian.

vehicle_waypoints

Chỉ dành cho các chuyến đi chung: Trường này hỗ trợ xen kẽ các điểm trung gian của nhiều chuyến đi. Tệp này chứa tất cả các điểm tham chiếu còn lại của xe được chỉ định, cũng như điểm đón và trả khách cho chuyến đi này. Bạn có thể đặt trường này bằng cách gọi CreateTrip hoặc UpdateTrip. Bạn cũng có thể cập nhật các điểm tham chiếu xe thông qua trường waypoints bằng lệnh gọi đến UpdateVehicle. Vì lý do liên quan đến quyền riêng tư, dịch vụ không trả về thông tin này trong các lệnh gọi GetTrip.

số_người_cùng_đi Không Số lượng hành khách trong chuyến đi.
điểm_đưa_rơi Không Điểm đến của chuyến đi.
vehicle_id Không Mã của xe được chỉ định cho chuyến đi.

Ví dụ: tạo chuyến đi chung

Mẫu tích hợp phụ trợ sau đây minh hoạ cách tạo một chuyến đi và chỉ định chuyến đi đó cho một chiếc xe dưới dạng chuyến đi chung.

// Vehicle with VEHICLE_ID ID is already created and it is assigned Trip A.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "shared-trip-A";
static final String VEHICLE_ID = "your-vehicle-id";
static final String TRIP_A_ID = "trip-a-id";
static final String TRIP_B_ID = "trip-b-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;

LatLng tripBPickup =
    LatLng.newBuilder().setLatitude(-12.12314).setLongitude(88.142123).build();
LatLng tripBDropoff =
    LatLng.newBuilder().setLatitude(-14.12314).setLongitude(90.142123).build();

TerminalLocation tripBPickupTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBPickup).build();
TerminalLocation tripBDropoffTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBDropoff).build();

// TripA already exists and it's assigned to a vehicle with VEHICLE_ID ID.
Trip tripB = Trip.newBuilder()
    .setTripType(TripType.SHARED)
    .setVehicleId(VEHICLE_ID)
    .setPickupPoint(tripBPickupTerminalLocation)
    .setDropoffPoint(tripBDropoffTerminalLocation)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripBPickupTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripBDropoffTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// Create Trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId(TRIP_B_ID)
    .setTrip(tripB)
    .build();

try {
  // createdTrip.remainingWaypoints will contain shared-pool waypoints.
  // [tripB.pickup, tripA.dropoff, tripB.dropoff]
  Trip createdTrip = tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Cập nhật các chuyến đi gộp nhóm dùng chung

Mọi chuyến đi được tạo trong Công cụ quản lý đội xe đều phải được chỉ định cho một xe để Công cụ quản lý đội xe có thể tính toán và theo dõi ETA của chuyến đi. Bạn có thể thực hiện việc này trong quá trình tạo chuyến đi hoặc sau đó khi cập nhật chuyến đi.

Đối với các chuyến đi gộp chung, bạn phải chỉ định thứ tự cho các điểm tham chiếu chưa ghé thăm trong tập hợp các điểm tham chiếu phương tiện của chuyến đi (Trip.vehicle_waypoints). Fleet Engine sử dụng danh sách này để tự động cập nhật điểm tham chiếu của chuyến đi cho tất cả những chuyến đi trong nhóm dùng chung.

Ví dụ: hãy xem xét hai chuyến đi chung, Chuyến đi AChuyến đi B:

  • Chuyến đi A đang trên đường đến địa điểm trả khách.
  • Sau đó, Chuyến đi B sẽ được thêm vào cùng một xe.

Trong một UpdateTripRequest cho Chuyến đi B, bạn đặt vehicleId và cũng đặt Trip.vehicle_waypoints thành thứ tự điểm tham chiếu tối ưu: B Đến lấy hàngA Trả kháchB Trả khách.

  • Việc gọi getVehicle() sẽ trả về remainingWaypoints chứa:
    B Đến lấy hàngTrả phòngB Đến lấy hàng.
  • getTrip() hoặc lệnh gọi lại onTripRemainingWaypointsUpdated cho Chuyến đi A sẽ trả về remainingWaypoints chứa:
    B Đến lấy hàngA Trả khách.
  • getTrip() hoặc lệnh gọi lại onTripRemainingWaypointsUpdated cho Chuyến đi B trả về remainingWaypoints chứa:
    B Đến lấy hàngTrả kháchB Trả khách.

Ví dụ:

Mẫu tích hợp phụ trợ sau đây minh hoạ cách cập nhật một chuyến đi bằng mã xe và điểm tham chiếu cho 2 chuyến đi chung.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_A_ID = "share-trip-A";
static final String TRIP_B_ID = "share-trip-B";
static final String VEHICLE_ID = "Vehicle";

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

// Get Trip A and Trip B objects from either the Fleet Engine or storage.
Trip tripA = ;
Trip tripB = ;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId(VEHICLE_ID)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getPickupPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getDropoffPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("vehicle_id")
        .addPaths("vehicle_waypoints"))
    .build();

// Error handling. If Fleet Engine has both a trip and vehicle with the IDs,
// and if the credentials validate, and if the given vehicle_waypoints list
// is valid, 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:          // Either the trip or vehicle does not exist.
      break;
    case PERMISSION_DENIED:
      break;
    case INVALID_REQUEST:    // vehicle_waypoints is invalid.
      break;
  }
  return;
}

Bước tiếp theo