XIN CHÀO TÀI XẾ XANH SM
Vui lòng quét hoặc nhập mã CCCD để nhận số thứ tự bàn giao xe
* Có thể tải ảnh chụp màn hình mã QR VNeID, ảnh thẻ CCCD hoặc bật camera quét trực tiếp ()
Bước 2: Kiểm tra & Bổ sung thông tin
* Bắt buộc nhập tiếng Việt có dấu
Vui lòng chọn Nhóm Dịch Vụ ở trên trước khi chọn Hình thức xử lý
* Chọn đúng hình thức xử lý để nhân viên điều phối dễ dàng phân luồng và gọi số nhanh hơn.
CCCD:
CCCD:
Dịch vụ:
Kho xử lý:
Hồ sơ của bạn đã hoàn tất trong ngày hôm nay tại kho này.
CCCD:
Lý do bị hủy
Hồ sơ này đã bị quản trị viên hủy. Vui lòng kiểm tra lại thông tin và bấm Lấy Số Mới.
Đã Hết Giờ Nhận Số
Kho chỉ tiếp nhận cấp số thứ tự trong
khung giờ từ
đến trước
Đã đến giờ đóng cửa (). Hệ thống ngừng phát số thứ tự. Vui lòng quay lại vào ngày làm việc tiếp theo!
Từ Chối Cấp Số Thứ Tự
Không tìm thấy thông tin trong danh sách nhận xe
Quý tài xế không có trong danh sách nhận xe của ngày , vui lòng liên hệ nhân viên Sale (người nhận cọc) hoặc Hotline: 1900.2293 thêm vào danh sách nhận xe để được bàn giao xe.
Vị Trí Quá Xa
Bạn đang cách kho khoảng
Hệ thống chỉ cho phép lấy số khi bạn đứng cách kho tối đa . Vui lòng di chuyển lại gần kho hơn!
Xác Nhận & Cam Đoan Thông Tin
Tôi xin cam đoan toàn bộ thông tin cá nhân đã khai báo gồm: Họ và tên, Số điện thoại và Số CCCD hoàn toàn chính xác, trùng khớp tuyệt đối với dữ liệu trên thẻ CCCD/VNeID. Tôi hiểu rõ đây là các thông tin bắt buộc phải chính xác để phục vụ trực tiếp cho việc xác lập và ký kết hợp đồng.
Nếu phát hiện bất kỳ thông tin nào sai lệch, tôi xin chịu hoàn toàn trách nhiệm, chấp nhận bị hủy lượt phục vụ và tự giác lấy lại số thứ tự mới để thực hiện việc khai báo lại từ đầu theo đúng quy định.
Hệ Thống Nội Bộ
Yêu cầu tài khoản vận hành
Quầy Xử Lý Của Tôi
Trạng Thái Quầy
Sẵn sàng gọi số
Đã có nhân viên
Trống
Chưa có quầy hoạt động
Vui lòng báo Quản trị viên vào Cài Đặt Hệ Thống để thiết lập quầy.
Tổng Lấy
Đã Xong
Đợi Lại
Chờ Mới
Đã Hủy
| STT | Họ và Tên | Số ĐT | CCCD | Nhu Cầu Xử Lý | Lịch nhận | Giờ ĐK | Người xử lý | Trạng thái | Hành động |
|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
Lần
|
|
||||
| Tuyệt vời! Hiện tại không có hồ sơ nào đang chờ. | |||||||||
|
|
|
|
|
- |
|
|
|||
| Chưa có dữ liệu lịch sử nào trong hôm nay. | |||||||||
Tổng Đơn Nhận
0
Đủ điều kiện nhận xe
Đã Lấy Số Thứ Tự
0
Đang xếp hàng / phục vụ
Chưa Lấy Số Thứ Tự
0
Chờ tài xế đến kho
Danh Sách Tài Xế Nhận Xe
Chỉ tài xế có tên trong danh sách ngày hôm nay mới được phép bốc số tại kho bàn giao xe
| STT | Mã Đơn Hàng | Họ và Tên | CCCD | SĐT | Dòng Xe & Màu | Khu Vực Nhận | Ngày Nhận Xe | Nguồn Cập Nhật | Trạng Thái Bốc Số | Thao Tác |
|---|---|---|---|---|---|---|---|---|---|---|
| • |
|
ĐÃ LẤY SỐ # Chưa bốc số |
|
|||||||
|
Không tìm thấy tài xế nào trong danh sách nhận xe theo bộ lọc hiện tại.
|
||||||||||
Dữ Liệu Danh Sách Đăng Ký Tổng Hợp
Tra cứu và nhập liệu hàng loạt từ file Excel
| STT | Mã Đơn Hàng | Họ và Tên | CCCD | SĐT | Dòng Xe & Màu | Khu Vực Nhận | Ngày Nhận Xe | Nguồn Cập Nhật | Trạng Thái Bốc Số | Đã Phát Xe | FB Noti | TLS L.Hệ | Ngày Import | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| • |
|
ĐÃ LẤY SỐ # Chưa bốc số | ||||||||||||
| Không tìm thấy dữ liệu đăng ký nào. | ||||||||||||||
Thêm Tài Xế Nhận Xe Khẩn Cấp
Bổ sung vào danh sách nhận xe để tài xế được phép bốc số
Chỉnh Sửa Thông Tin Đơn Nhận Xe
Kịp thời điều chỉnh dữ liệu để tài xế bốc số và bàn giao xe chính xác
Chi Tiết Truy Vết Đơn Hàng
Lịch sử cập nhật, người thực hiện và nguồn dữ liệu
Cấu hình Tự Động Đồng Bộ Google Sheet
Bổ sung liên tục đơn nhận xe từ Google Sheet lên hệ thống
1. Endpoint Cloud Function Webhook:
2. Cơ chế Delta Sync tự động (Chỉ gửi dòng mới):
- Tự động nhận diện dòng mới: Script tự động thêm cột "Trạng thái đồng bộ" ở cuối bảng. Dòng nào mới thêm hoặc chưa đồng bộ sẽ được lọc ra để gửi riêng sang hệ thống.
- Tiết kiệm 99.9% chi phí Firestore: Thay vì gửi toàn bộ 1.600 dòng mỗi lần, script chỉ gửi 1-2 dòng vừa gõ, Firestore chỉ tốn 1-2 lượt đọc/ghi.
- Tự động đóng dấu & tô xanh: Khi đồng bộ thành công, ô trạng thái sẽ tự động điền
Đã đồng bộ (HH:mm dd/MM)kèm nền xanh lá cây. - Sửa đổi đơn cũ cực dễ: Nếu muốn cập nhật lại thông tin một tài xế cũ, chỉ cần xóa chữ "Đã đồng bộ" ở dòng đó, hệ thống sẽ tự động cập nhật lại thông tin mới sang bốc số.
3. Mã Google Apps Script Delta Sync (Tiện ích mở rộng > Apps Script):
/**
* =========================================================================
* GOOGLE APPS SCRIPT: DELTA SYNC THÔNG MINH SANG HỆ THỐNG XANH SM
* Cơ chế: Chỉ gửi đúng các dòng mới / chỉnh sửa chưa đồng bộ
* =========================================================================
*/
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('🚗 XANH SM')
.addItem('⚡ Quét & Đồng bộ các dòng mới (Delta Sync)', 'autoSyncNewRows')
.addSeparator()
.addItem('🔄 Đồng bộ toàn bộ bảng (Dự phòng)', 'syncAllRowsBackup')
.addToUi();
}
/**
* 1. TỰ ĐỘNG ĐỒNG BỘ CÁC DÒNG MỚI (DELTA SYNC)
* Có thể cài Trigger theo thời gian (Time-driven: mỗi 1 - 5 phút/lần)
*/
function autoSyncNewRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = getDeliverySheet(ss);
if (!sheet) return;
var data = sheet.getDataRange().getValues();
if (data.length <= 1) return;
var headerRowIdx = findHeaderRowIdx(data);
var headers = data[headerRowIdx].map(function(h) { return String(h || '').trim().toLowerCase(); });
var cols = mapColumns(headers);
// Tìm hoặc khởi tạo cột 'Trạng thái đồng bộ'
var colSyncStatus = -1;
for (var c = 0; c < headers.length; c++) {
if (headers[c].indexOf('trạng thái sync') !== -1 || headers[c].indexOf('trạng thái đồng bộ') !== -1 || headers[c].indexOf('đồng bộ bốc số') !== -1) {
colSyncStatus = c;
break;
}
}
// Nếu chưa có cột trạng thái, tự tạo tiêu đề ở cột kế tiếp
if (colSyncStatus === -1) {
colSyncStatus = headers.length;
sheet.getRange(headerRowIdx + 1, colSyncStatus + 1).setValue("Trạng thái đồng bộ").setFontWeight("bold").setBackground("#e8eaed");
}
var deltaOrders = [];
var targetRowIndices = []; // Lưu số dòng thực tế trên Sheet (1-indexed)
for (var i = headerRowIdx + 1; i < data.length; i++) {
var row = data[i];
var currentStatus = String(row[colSyncStatus] || '').trim();
// Nếu đã đồng bộ rồi thì BỎ QUA NGAY (không gửi lại)
if (currentStatus.indexOf('Đã đồng bộ') === 0 || currentStatus.indexOf('Thành công') === 0) {
continue;
}
var parsed = parseOrderRow(row, cols);
// Chỉ gửi khi dòng có tối thiểu Tên VÀ (CCCD hoặc SĐT)
if (parsed && parsed.name && (parsed.cccd || parsed.phone)) {
deltaOrders.push(parsed);
targetRowIndices.push(i + 1);
}
}
// Nếu không có dòng mới nào cần đồng bộ, KẾT THÚC NGAY (0 HTTP request, 0 lượt đọc Firestore)
if (deltaOrders.length === 0) {
return;
}
Logger.log("Phát hiện " + deltaOrders.length + " dòng mới cần đồng bộ...");
var res = sendOrdersToFirebase(deltaOrders);
if (res && res.success) {
var nowStr = Utilities.formatDate(new Date(), "GMT+7", "HH:mm dd/MM");
// Đánh dấu xanh vào các dòng đã đồng bộ thành công
for (var k = 0; k < targetRowIndices.length; k++) {
var rIdx = targetRowIndices[k];
sheet.getRange(rIdx, colSyncStatus + 1)
.setValue("Đã đồng bộ (" + nowStr + ")")
.setBackground("#e6f4ea")
.setFontColor("#137333");
}
ss.toast("Đã tự động nạp " + deltaOrders.length + " đơn mới sang hệ thống bốc số!", "🚗 XANH SM", 6);
}
}
/**
* 2. TỰ ĐỘNG RESET TRẠNG THÁI KHI SỬA THÔNG TIN CỦA DÒNG ĐÃ SYNC
*/
function onEdit(e) {
if (!e || !e.range) return;
var sheet = e.range.getSheet();
var row = e.range.getRow();
var col = e.range.getColumn();
if (row <= 1) return;
var lastCol = sheet.getLastColumn();
// Nếu sửa đổi ở các cột thông tin (từ cột 1 đến cột trước trạng thái sync)
if (col < lastCol) {
var statusCell = sheet.getRange(row, lastCol);
var statusVal = String(statusCell.getValue() || '');
if (statusVal.indexOf('Đã đồng bộ') === 0) {
// Tự động xóa trạng thái để kích hoạt sync lại thông tin mới
statusCell.setValue('').setBackground(null).setFontColor(null);
}
}
}
/**
* 3. ĐỒNG BỘ TOÀN BỘ BẢNG (DỰ PHÒNG KHI CẦN RESET)
*/
function syncAllRowsBackup() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = getDeliverySheet(ss);
if (!sheet) return;
var data = sheet.getDataRange().getValues();
var headerRowIdx = findHeaderRowIdx(data);
var cols = mapColumns(data[headerRowIdx].map(function(h) { return String(h || '').trim().toLowerCase(); }));
var allOrders = [];
for (var i = headerRowIdx + 1; i < data.length; i++) {
var parsed = parseOrderRow(data[i], cols);
if (parsed && parsed.name && (parsed.cccd || parsed.phone)) {
allOrders.push(parsed);
}
}
if (allOrders.length === 0) return;
ss.toast("Đang đồng bộ toàn bộ " + allOrders.length + " đơn...", "Đang xử lý", 10);
var res = sendOrdersToFirebase(allOrders);
if (res) ss.toast(res.message || "Đồng bộ hoàn tất!", "🚗 XANH SM", 8);
}
// =================== CÁC HÀM HỖ TRỢ CHUẨN HÓA ===================
function getDeliverySheet(ss) {
var sheets = ss.getSheets();
for (var s = 0; s < sheets.length; s++) {
var sName = sheets[s].getName().toLowerCase();
if (sName.indexOf('nhận xe') !== -1 || sName.indexOf('bàn giao') !== -1 || sName.indexOf('rto') !== -1) {
return sheets[s];
}
}
return ss.getActiveSheet();
}
function findHeaderRowIdx(data) {
for (var r = 0; r < Math.min(5, data.length); r++) {
var rowStr = data[r].map(function(c) { return String(c || '').trim().toLowerCase(); });
if (rowStr.some(function(h) { return h.indexOf('mã') !== -1 || h.indexOf('cccd') !== -1 || h.indexOf('họ') !== -1 || h.indexOf('sđt') !== -1; })) {
return r;
}
}
return 0;
}
function mapColumns(headers) {
function findCol(keywords, fallback) {
for (var i = 0; i < headers.length; i++) {
for (var k = 0; k < keywords.length; k++) {
if (headers[i].indexOf(keywords[k]) !== -1) return i;
}
}
return fallback;
}
return {
orderCode: findCol(['mã đơn hàng', 'mã đơn', 'order_code', 'order', 'mã hợp đồng', 'mã'], 0),
name: findCol(['họ và tên', 'họ tên', 'tên lái xe', 'tên tài xế', 'tên', 'full_name', 'name'], 1),
cccd: findCol(['cccd', 'số cccd', 'căn cước', 'cmnd'], 2),
phone: findCol(['sđt', 'sdt', 'số điện thoại', 'điện thoại', 'phone', 'tel', 'mobile'], 3),
email: findCol(['email', 'mail'], 4),
vehicle: findCol(['dòng xe', 'loại xe', 'vehicle'], 5),
color: findCol(['màu ngoại thất', 'màu xe', 'màu', 'color'], 6),
region: findCol(['khu vực nhận xe', 'khu vực', 'kho', 'region'], 7),
date: findCol(['ngày nhận xe', 'ngày nhận', 'ngày bàn giao', 'lịch nhận', 'ngày hẹn', 'ngày thanh toán', 'ngày tt', 'date'], 8)
};
}
function parseOrderRow(row, cols) {
var orderCode = String(row[cols.orderCode] || '').trim();
var name = String(row[cols.name] || '').trim();
var cccd = String(row[cols.cccd] || '').replace(/'/g, '').replace(/\D/g, '').trim();
var phone = String(row[cols.phone] || '').replace(/'/g, '').replace(/\D/g, '').trim();
if (!name && !cccd && !phone) return null;
if (orderCode.indexOf('#') === 0) orderCode = '';
if (cccd.length === 10 && cccd.indexOf('0') === 0 && phone.length === 12) {
var tmp = cccd; cccd = phone; phone = tmp;
}
var rawDateVal = row[cols.date];
var formattedDate = '';
if (rawDateVal instanceof Date) {
formattedDate = Utilities.formatDate(rawDateVal, "GMT+7", "dd/MM/yyyy");
} else if (rawDateVal) {
formattedDate = String(rawDateVal).trim();
}
var region = String(row[cols.region] || '').trim();
if (region.indexOf('GMT') !== -1 || region.indexOf('Indochina') !== -1) region = '';
return {
orderCode: orderCode,
name: name,
cccd: cccd,
phone: phone,
email: String(row[cols.email] || '').trim(),
vehicleType: String(row[cols.vehicle] || '').trim(),
color: String(row[cols.color] || '').trim(),
region: region,
paymentDate: formattedDate
};
}
function sendOrdersToFirebase(orders) {
var url = 'https://asia-southeast1-greensm-8d69b.cloudfunctions.net/syncDeliveryOrders';
var options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({ orders: orders }),
muteHttpExceptions: true
};
try {
var response = UrlFetchApp.fetch(url, options);
return JSON.parse(response.getContentText());
} catch(e) {
Logger.log("Lỗi gửi dữ liệu: " + e.message);
return null;
}
}
Tổng Tài Xế Định Danh
Tài khoản theo CCCD 12 số
Đang Hoạt Động
Tài khoản bình thường
Đang Tạm Khóa
Cần hỗ trợ xử lý tại quầy
Đã Bàn Giao Xe
Đã mở khóa video nhận xe
Danh Sách Tài Khoản Tài Xế (Định Danh CCCD)
Tra cứu danh tính, lịch sử lấy số, mở khóa/reset mật khẩu tài khoản CCCD tài xế và kiểm tra đối soát bàn giao xe
| STT | Số CCCD | Họ và Tên | Số Điện Thoại | Trạng Thái | Bàn Giao & Video | Kho Gần Nhất | Lần Cuối | Hành Động Nghiệp Vụ |
|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
|||||
|
Không tìm thấy tài khoản tài xế nào phù hợp. Hãy thử tìm số CCCD 12 số, SĐT 10 số hoặc nhấn "Làm mới" để tải lại dữ liệu. |
||||||||
Tổng Quan Chỉ Số Vận Hành
Tổng lấy số
Xu Hướng Vận Hành 7 Ngày
Tổng Lấy
Đã Xong
Đang Chờ
Đã Hủy
Tra cứu vòng đời Số Thứ Tự
Xuất Dữ Liệu Báo Cáo (Excel)
Tối đa 1 thángBảng Phân Tích Chuyên Sâu Theo Nhóm Dịch Vụ
| Nhóm Dịch Vụ | Nhân Viên Xử Lý | Tổng Gọi | Avg Lần gọi | Hiệu Quả Xử Lý (Thành Công) |
Hủy Số |
Tốc Độ TB |
|
|---|---|---|---|---|---|---|---|
| Không có dữ liệu trong khoảng thời gian này. | |||||||
|
hồ sơ
|
-
|
||||||
Quản lý Nhân viên
Quản lý Vị trí Kho
| Tên Kho | Chức Năng Kho | Tọa độ (Lat, Long) | Hành động |
|---|---|---|---|
| 3D |
,
-
|
||
| Chưa có dữ liệu Kho | |||
Bảo mật: Việc thêm, sửa, xóa tọa độ Kho liên quan trực tiếp đến định vị lấy số của Tài xế. Chỉ tài khoản Super Admin mới có quyền thao tác tính năng này.
Bảo trì & Đồng bộ dữ liệu
Chức năng quét toàn bộ lịch sử vé cũ để tính toán và khôi phục lại dữ liệu cho Dashboard.
Danh Sách Blacklist
| Device ID | Xóa |
|---|---|
|
|
|
| Chưa có thiết bị nào bị khóa | |
Báo Cáo Gian Lận (Hôm nay)
Tự động phát hiện thiết bị lấy từ 2 số thứ tự trở lên trong ngày
| Thiết bị (Device ID) | Số vé | Vé đã lấy hôm nay | Thao tác |
|---|---|---|---|
|
Stable:
|
#
•
•
|
|
|
|
Không tìm thấy trong danh sách hôm nay với từ khóa ""
Hôm nay chưa phát hiện gian lận (1 máy lấy >= 2 vé)
|
|||
| Đang tải dữ liệu báo cáo gian lận... | |||
Chi tiết các số đã lấy của Thiết bị
| STT / Số vé | Trạng thái | Tài xế (CCCD & Họ tên) | Số điện thoại | Dịch vụ & Kho | Thời gian lấy | Quầy / Nhân viên |
|---|---|---|---|---|---|---|
| Chưa phục vụ |
Thông Tin Định Danh & Tài Khoản Auth
Hồ Sơ Nhận Xe Đối Soát (Từ File Excel) Khớp dữ liệu
Lịch Sử Lấy Số Thứ Tự
| Số Vé | Kho | Dịch Vụ | Quầy | Người Xử Lý | Thời Gian | Trạng Thái |
|---|---|---|---|---|---|---|
| Chưa có lịch sử bốc số nào được ghi nhận. | ||||||
Chỉnh Sửa Thông Tin Tài Xế
Thêm Mới Tài Khoản Tài Xế (Định Danh CCCD)
Hệ thống đang kiểm tra...
Đang quét định vị GPS và đồng bộ dữ liệu để cấp số. Vui lòng không đóng cửa sổ này!
Số thứ tự của bạn là
Cập Nhật Thông Tin Tài Xế (Admin)
Xác Nhận Hủy Số
Bạn có chắc chắn muốn hủy số thứ tự này? Hệ thống sẽ bỏ qua số này khi gọi.
Xác Nhận Bỏ Qua Số
Tài xế vắng mặt? Hệ thống sẽ đẩy số này xuống cuối hàng đợi.
Lịch Sử Bỏ Qua Số - STT
Vòng Đời Số Thứ Tự
Từ khóa:
Ghi Chú Nội Bộ - STT
Ghi chú sẽ hiển thị trên bảng hàng đợi để toàn bộ điều phối viên cùng theo dõi.
Lịch sử cập nhật ghi chú
Sơ Đồ Chọn Vị Trí Quầy
Chỉ định Quầy Xử Lý
Chỉ định số thứ tự cho nhân viên:
Thiết Lập Luồng Gọi Số
Thông Tin Vị Trí
Bật nút xem sơ đồ quầy 3D trực quan cho điều phối viên tại kho này
Cấu Hình Quầy Xử Lý
Đổi Mật Khẩu
CHUẨN BỊ ẢNH QR VNeID
Chụp lưu sẵn mã QR trên VNeID để tải ảnh lên lấy số
Tự động đóng sau s Bạn đã có thể bắt đầu lấy số!
MÃ QR KHÔNG PHÙ HỢP!
Bạn đang dùng Mã QR Định danh mức 2 trên app VNeID (mã Token đổi theo giây), không phải mã QR thẻ CCCD.
Hệ thống không thể trích xuất thông tin cá nhân từ mã QR định danh mức 2 để bàn giao xe.
• Cách 2: Chụp trực tiếp mã QR in ở góc trên bên phải thẻ CCCD cứng.
Tạm Khóa Nhận Số
Dịch vụ:
Khi tạm khóa, tài xế tại kho sẽ không thể lấy thêm số cho dịch vụ . Các số thứ tự đã phát trước đó vẫn được gọi phục vụ bình thường.
Mở Khóa Nhận Số
Dịch vụ:
Bạn có chắc chắn muốn mở nhận số lại cho dịch vụ tại kho ?
Tài xế sẽ có thể tiếp tục lấy số thứ tự bình thường trên màn hình điện thoại ngay sau khi mở.
PHÁT LOA GỌI TÀI XẾ
Hệ thống phát thanh hội trường & TV sảnh tiếp nhận
SƠ ĐỒ 3D TOÀN CẢNH QUẦY TIẾP NHẬN
Hiện không có vé nào đang được gọi vào quầy này.