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?
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ọn | Chuyện gì xảy ra |
|---|---|
| Một xe của hãng có API | Tạ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/rideskhô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ự đặt | Tổng đài sắp xếp | |
|---|---|---|
| Trạng thái ticket | pending ("Chờ đặt xe") | pending ("Chờ đặt xe") |
| Gắn trên ride | scheduled_option_id, dispatch_at | chỉ pickup_at |
API trả schedule | { book_at, option_id, provider, label, seats, price, cost_price, max_cost_price } | null |
| Trên hàng đợi CS | Chip Tự đặt {xe} lúc {book_at} | Chỉ có đón {giờ} {ngày} ở dòng phụ của tuyến |
| Lịch sử ticket | created, 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ỏng | Telegram + banner đỏ trên ticket (§3) | Không có cảnh báo |
| CS có phải làm gì không | Không, trừ khi tự đặt thất bại | Có — đặt xe trước giờ đón (§4) |
"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_athã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èmmax_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_failedvà báo CS. - Khi hỏng, hệ thống bỏ lịch tự đặt, ghi
schedule_failedkè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àm | Lịch tự đặt |
|---|---|
| Claim (nhận xử lý) ticket | Vẫ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ách | Bỏ |
| Huỷ chuyến | Bỏ |
| Báo giá lại trên ticket và chọn xe khác | Xe mới thay xe cũ |
| Đặt trên app Xanh SM mà không nhập vào hệ thống | Vẫ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:
- 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ờ.
- 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 ticketpending.- 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ục | Tì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ến | Chưa có |
| Chặn đặt trùng khi CS đặt trên app Xanh SM ngoài hệ thống | Chưa có |