Skip to main content

Chuyến hẹn giờ — hệ thống tự đặt và tổng đài sắp xếp

Trang này dành cho tổng đài viên (CS), FE CS Portal và người làm sản phẩm điều xe. Nó trả lời hai câu hỏi:

  • Khách hẹn giờ mà chọn "Tổng đài sắp xếp" thay vì chọn một xe để hệ thống tự đặt thì CS biết bằng cách nào?
  • Trước giờ đặt, hai loại chuyến này khác nhau ở đâu?
Trang này mô tả cái đang có

Mọi hành vi đọc thẳng từ code card-core và CS Portal (2026-10-30). Chỗ nào chưa có được gom ở §6. Spec đầy đủ của portal: CS Portal "Yêu cầu đặt xe" (§4.13, §4.14).


1. Hai cách một chuyến hẹn giờ đi vào hệ thống​

Khách báo giá một chuyến có pickup_at (giờ đón sau này). Báo giá trả về xe của các hãng có API (hiện là Xanh SM), và luôn có thêm một lựa chọn cuối: "Tổng đài sắp xếp" (kind: "hotline").

Khách chọnChuyện gì xảy ra
Một xe của hãng có APITạo ride pending và giữ xe đó trên ride: scheduled_option_id + dispatch_at (= giờ đón − 2 phút). Ghi event scheduled. Chưa gửi gì cho hãng.
"Tổng đài sắp xếp"Tạo ride pending với pickup_at, không giữ xe nào. Chỉ có event created. CS lo như mọi yêu cầu khác.

Hai trường hợp sau cũng ra kết quả giống "Tổng đài sắp xếp":

  • Khách gửi yêu cầu không qua báo giá (POST /my/rides không có option_id).
  • Khách gọi hotline và CS tạo ticket hẹn giờ.

Ngược lại, CS có thể biến một chuyến tổng đài thành chuyến tự đặt: bấm Báo giá trên ticket rồi chọn một xe. Ticket có giờ hẹn thì việc chọn xe chỉ giữ xe lại và đặt lúc book_at, đúng như khi khách tự chọn.


2. Trước giờ đặt: hai loại khác nhau ở đâu​

Hệ thống tự đặtTổng đài sắp xếp
Trạng thái ticketpending ("Chờ đặt xe")pending ("Chờ đặt xe")
Gắn trên ridescheduled_option_id, dispatch_atchỉ pickup_at
API trả schedule{ book_at, option_id, provider, label, seats, price, cost_price, max_cost_price }null
Trên hàng đợi CSChip Tự đặt {xe} lúc {book_at}Chỉ có đón {giờ} {ngày} ở dòng phụ của tuyến
Lịch sử ticketcreated, rồi Hẹn tự đặt {hãng} {xe} lúc {book_at} · {giá}created
Tới giờHệ thống tự đặt xe (§3)Không có gì chạy — CS phải tự nhớ
Khi hỏngTelegram + banner đỏ trên ticket (§3)Không có cảnh báo
CS có phải làm gì khôngKhông, trừ khi tự đặt thất bạiCó — đặt xe trước giờ đón (§4)
Giờ trong chip là giờ đặt, không phải giờ đón

"Tự đặt … lúc 11:28" nghĩa là hệ thống đặt xe lúc 11:28 cho giờ đón 11:30.

Cả hai loại vào tab "Cần xử lý" qua SSE như mọi ticket mới. Không có thông báo riêng khi có chuyến mới, dù là loại nào.


3. Chuyến tự đặt: từ lúc hẹn tới lúc có xe​

  • Giá lúc đặt. Lúc book_at hãng báo giá lại.
    • Giá hãng cao hơn giá lúc báo tối đa 20% thì hệ thống vẫn đặt. Giá bán tính lại bằng giá hãng mới cộng markup.
    • Cao hơn 20% thì không đặt, chuyến quay về CS.
    • Vì vậy giá khách thấy lúc báo là price.kind = "estimate", kèm max_amount. CS đọc cho khách: "khoảng X, tối đa Y, chưa gồm phụ phí trong chuyến".
  • Trễ quá 10 phút so với giờ đón (ví dụ server dừng lâu): hệ thống không tự đặt nữa, ghi schedule_failed và báo CS.
  • Khi hỏng, hệ thống bỏ lịch tự đặt, ghi schedule_failed kèm lý do, và gửi Telegram "Chuyến hẹn giờ chưa đặt được xe" (mã chuyến, giờ đón, lý do). Ticket hiện banner đỏ Tới giờ nhưng không đặt được xe đã hẹn: {lý do}. Đặt tay ngay.
  • Lỗi tạm thời khi gửi cho hãng (mạng, DB): lịch tự đặt được giữ, hệ thống thử lại mỗi 10 giây. Telegram chỉ báo một lần.

Những gì làm mất lịch tự đặt​

Lịch tự đặt chỉ chờ khi ticket còn pending. Ticket rời pending vì bất kỳ lý do nào thì lịch bị bỏ, nên không bao giờ ra hai xe trong hệ thống:

CS làmLịch tự đặt
Claim (nhận xử lý) ticketVẫn giữ — tới giờ hệ thống vẫn đặt
Đặt tay trong hệ thống (gửi hãng, gửi tài xế XPay)Bỏ
Gửi phương án cho kháchBỏ
Huỷ chuyếnBỏ
Báo giá lại trên ticket và chọn xe khácXe mới thay xe cũ
Đặt trên app Xanh SM mà không nhập vào hệ thốngVẫn giữ — tới giờ ra xe thứ hai

4. Chuyến "Tổng đài sắp xếp": CS làm gì​

Không có gì nhắc CS khi sắp tới giờ đón, nên CS phải tự theo dõi giờ đón trên ticket.

  • Xanh SM: API chỉ nhận chuyến có giờ đón trong khoảng 5 phút tới. Còn sớm hơn thì nút đặt qua API báo: "Chuyến hẹn giờ còn hơn 5 phút tới giờ đón: … chỉ đặt đi ngay. Dùng Báo giá rồi chọn xe, hệ thống tự đặt trước giờ đón 2 phút." CS có hai cách:
    1. Bấm Báo giá → chọn xe ngay bây giờ. Chuyến thành chuyến tự đặt (§3), CS không phải canh giờ.
    2. Quay lại sát giờ đón để đặt.
  • Hãng không có API (Mai Linh…): đặt qua điện thoại như chuyến thường. Hệ thống không chặn đặt sớm.

Thanh toán của chuyến hẹn giờ giống chuyến thường — xem Thanh toán chuyến xe bằng thẻ.


5. Những gì trên hàng đợi dễ gây hiểu nhầm​

  • Đồng hồ "chờ" không theo giờ đón. Đồng hồ tính từ lần đổi trạng thái gần nhất (status_changed_at), chuyển cam sau 3 phút và đỏ sau 5 phút cho mọi ticket pending.
    • Một chuyến tổng đài hẹn ngày mai đỏ ngay hôm nay.
    • Một chuyến tự đặt cũng đỏ, dù CS không cần làm gì.
  • Hàng đợi sắp theo trạng thái rồi theo status_changed_at, không theo giờ đón. Chuyến hẹn giờ nằm lẫn với chuyến "đi ngay".
  • Không biết khách đã chủ động chọn "Tổng đài sắp xếp". DB có lưu lựa chọn này (dispatch_quote_options.kind = 'hotline', booking_id = ride) nhưng API không trả ra. Trên portal nó trông giống hệt một yêu cầu gửi thẳng không qua báo giá. Hai trường hợp xử lý như nhau.

6. Chưa có​

Hạng mụcTình trạng
Nhắc CS khi chuyến hẹn giờ không có lịch tự đặt sắp tới giờ đón (ví dụ còn 15 phút)Chưa có — không có Telegram lẫn tín hiệu trên portal
Đồng hồ "chờ" và thứ tự hàng đợi theo giờ đón cho chuyến hẹn giờChưa có — đang theo status_changed_at
Cho portal biết khách đã chọn "Tổng đài sắp xếp"Chưa có — chỉ lưu trong dispatch_quote_options
API bỏ lịch tự đặt mà không đặt xe hay huỷ chuyếnChưa có
Chặn đặt trùng khi CS đặt trên app Xanh SM ngoài hệ thốngChưa có