| Mức độ | Mã | Việc | Trạng thái nguồn | Thời điểm | Nguồn |
|---|
| Mức độ | Mã | Việc | Mô tả | Trạng thái | Thời điểm | Thao tác |
|---|
Đã tải 20 đoàn thật từ file Hậu cần công tác (09/11/2026): mặc định hiển thị đủ 20 đoàn, xếp theo ngày bắt đầu (mới nhất trước), đoàn mới nhất 20261110-01 mở sẵn. Các bộ lọc trên kết hợp với nhau: trạng thái + tháng/ngày bắt đầu + phòng + tên người trong đoàn. Lọc theo phòng: phòng của đoàn lấy theo phòng của thành viên trong tab NhanVien (Sheet Hậu cần công tác, tra ngày 09/11/2026) — một đoàn có thể thuộc nhiều phòng nếu thành viên khác phòng nhau, lọc 1 phòng thì hiện các đoàn có ít nhất 1 thành viên thuộc phòng đó. Cả 27 thành viên của 20 đoàn đã tải đều tra được phòng (7 phòng), nên hiện không còn đoàn nào “Chưa rõ phòng”; nhóm “Chưa rõ phòng” chỉ còn dùng cho đoàn nào có thành viên không tra được trong NhanVien. Phòng của từng đoàn hiện ngay trên mỗi dòng trong danh sách. Ô chọn số dòng vẫn cho chọn 20 / 30 / 40 / 50 dòng (khi nhập thêm tờ trình thủ công danh sách sẽ dài hơn 20). Đoàn đang chọn nằm ngoài số dòng hiển thị sẽ được ghim lên đầu danh sách. Ô tick bên trái mỗi dòng là tick in tờ trình đó — tick dịch vụ thì tick ở Phần 3.
Dữ liệu thật từ file Hậu cần công tác: danh sách dưới đây là 20 đoàn thật lấy từ file Hậu cần công tác (sheet Data + DichVu), đã tải vào trang ngày 09/11/2026 — không phải dữ liệu mẫu, nhưng cũng chưa phải live tự động (muốn số mới phải tải lại hoặc bấm Làm mới để tính lại trạng thái trong trang). Gồm 13 đoàn chưa kết thúc (xếp theo ngày bắt đầu mới nhất trước) và 7 đoàn đã kết thúc gần nhất. Trạng thái hiển thị theo quy tắc ngày đã chốt — ngày kết thúc < hôm nay → Đã kết thúc; đoàn đang trong thời gian công tác → Đang diễn ra; chưa tới ngày bắt đầu → Mới — không dùng cột B của Sheet (cột đó đang đóng băng ở “Mới tạo”). Cột thanh toán (sau VAT) của cả 20 đoàn đang trống trong Sheet nên hiện “—”, không tự tính trước VAT × 1,08. Màn hình chia 3 phần: Phần 1 — danh sách tờ trình; Phần 2 — thông tin đoàn ở giữa; Phần 3 — dịch vụ đi kèm bên phải (loại chi tiết, nhà cung cấp, PNR, tiền trước VAT). Chọn một tờ trình ở Phần 1 thì Phần 2 và Phần 3 đổi theo ngay. Mỗi tờ trình và mỗi dịch vụ đều có ô tick chọn in riêng — tick xong bấm nút In ở thanh chọn in phía dưới; hiện mới làm giao diện chọn in, chức năng in thật làm sau.
In | Dịch vụ (ID / Trip_ID) | Nhà cung cấp & Nội dung | Ngày sử dụng & Hành khách | Tiền | Trạng thái | Mail NCC / Hành khách | Kênh & Đặt lúc | Hóa đơn / Order | Thao tác |
|---|
- Phần NHẬP (riêng, ở trên): có 2 thư mục nguồn và chỉ cần ghi rõ thư mục 1 có mấy file, thư mục 2 có mấy file — không liệt kê từng file đang chờ, vì có file là nhập luôn. Nút “Quét folder & nhập tất cả” chạy tác vụ phụ quét cả 2 thư mục và nhập hết vào hệ thống. Ngoài ra có nhập tờ trình thủ công: nhập thẳng một tờ trình vào hệ thống (không phải tạo draft để ghép đoàn) với đầy đủ các trường theo sheet Data — TripID, Tình trạng, Yêu cầu, Ngày nhập liệu, Nội dung, Thời gian bắt đầu / kết thúc, Địa điểm, Phương tiện, Thành phần, Đầu mối liên hệ, Ghi chú, Link File — và có nút đính kèm file tờ trình: sau khi lưu, file đã đính rơi vào thư mục Đã xử lý, trong thư mục con theo tháng bắt đầu của đoàn (vd “Đã xử lý / 11-2026”); chưa đính file thì vẫn lưu nhưng ghi rõ là chưa đính file.
- Phần GHÉP (riêng, ở dưới): luôn có một dòng tổng cho biết có bao nhiêu lệnh ghép tự động được — các lệnh có ★ sao vàng; những lệnh này hệ thống tự ghép nên không liệt kê chi tiết. Danh sách bên dưới đổi tên thành “Lệnh ghép thủ công” — chỉ hiện những lệnh không ghép tự động được. Bấm vào một lệnh sẽ hiện danh sách các tờ trình ứng viên — quy tắc ghép chỉ đơn giản là ngày và thành phần đoàn nên mỗi tờ trình chỉ hiện đúng 2 thứ đó: thời gian theo tờ trình và thành phần đoàn (một người một lúc chỉ có tên trong 1–2 tờ trình); dưới cùng có 2 nút “Để sau” và “Ghép tay vào đoàn”.
Nhập — quét folder tờ trình vào hệ thống
Dành cho những tờ trình thỉnh thoảng cần nhập tay, không qua folder quét. Các trường dưới đây bám đúng các đề mục của sheet Data: TripID, Tình trạng, Yêu cầu, Ngày nhập liệu, Nội dung, Thời gian bắt đầu / kết thúc, Địa điểm, Phương tiện, Thành phần, Đầu mối liên hệ, Ghi chú, Link File. Tờ trình nhập xong nằm ngay trong danh sách Đoàn công tác.
Ghép — ghép lệnh / draft vào tờ trình (đoàn)
| Mã | Tác vụ | Nguồn | Lịch chạy ghi nhận | Lần chạy gần nhất | Trạng thái & lưu ý |
|---|
Đây là các hành vi tự động gắn với luồng vé/xe (điều xe, gửi email, đồng bộ, cảnh báo), không phải tác vụ chạy theo giờ. Trạng thái BẬT/TẮT và số delay time (cột C của tab CauHinh_HeThong) dưới đây là dữ liệu thật đọc từ Sheet ngày 09/11/2026; dashboard chỉ hiển thị để xem, không đổi công tắc thật tại đây.
Delay time: số trong cột C “delay time” của tab CauHinh_HeThong, đọc lúc 19:50 ngày 09/11/2026. Đơn vị chưa ghi trong Sheet — Sheet chỉ ghi số, không ghi đơn vị, nên dashboard hiện đúng số gốc, không tự quy ra giây hay phút.
Đây là kiểm tra theo dữ liệu đã tải ngày 09/11/2026, chưa phải test live thật — test live thật cần Cloudflare Worker, hiện chưa có. Nút test không gửi bất kỳ lệnh thật nào tới các hệ thống: nó chỉ đọc và hiển thị trạng thái đã biết từ dữ liệu đã tải (Central_Queue_Health, JobLog, CauHinh_HeThong…), kèm thời gian kiểm tra ngay trong trang.
Central_Job_Queue có 11 dòng (xử lý vé về, chờ xác nhận đầu mối — leader_update / pending_leader): 1 FAILED FFZAG2 (lỗi service_not_found) · 1 HOLD AGBU42 · còn lại DONE.
Mỗi lần chạy, hệ thống tính lại trạng thái của từng đoàn trong sheet Data theo ngày bắt đầu (cột F) và ngày kết thúc (cột G), ghi ngược về cột B, rồi chạy luôn refresh TongHop. Không có đoàn nháp trong quy tắc này.
< hôm nay → Đã kết thúc>= hôm nay → Đang diễn rahôm nay < ngày bắt đầubizDailyUpdateTripStatus() và không tự ghi gì vào Google Sheet. Đừng hiểu thẻ này là tác vụ đang chạy thật.bizDailyUpdateTripStatus(): đọc Data cột B/F/G, tính trạng thái theo đúng quy tắc trên, ghi ngược về Data cột B, rồi gọi bizRefreshTongHop(). Sau khi dán code, tạo trigger thời gian chạy hàm này hàng ngày theo giờ đã chọn ở trên.Trích từ JobLog / AutoMappingLog trong Sheet, đọc ngày 09/11/2026 — mã job ghi đúng mã trong log khi có; các dòng chạy tay qua Slack / Apps Script ghi theo thời điểm chạy.
| Mã job | Loại job | Bắt đầu | Thời lượng | Kết quả | Chi tiết | Thao tác |
|---|
- Dòng 10 — Đưa SB NB · Đức Anh · 26/06/2026 → 30/06/2026, nhưng cột phụ ghi 31/06/2026 (ngày 31/06 không tồn tại).
- Dòng 14 — Xe di chuyển - Tỉnh · Đức Anh · 06/07/2026 → 30/06/2026 (Từ ngày sau Đến ngày).
- Dòng 21 — Đưa SB Tỉnh · Đức Anh · 06/07/2026 → 30/06/2026 (Từ ngày sau Đến ngày).
- Dòng 22 — Đón SB Tỉnh · Đức Anh · 16/07/2026 → 30/06/2026 (Từ ngày sau Đến ngày).
Xuất file HTML tự chứa của phiên bản mới
Bấm nút Xuất index.html bên cạnh để tải về đúng trạng thái trang hiện tại thành một file index.html duy nhất. Mọi thay đổi dữ liệu sau này đều đi qua bước xuất file này trước.
Nạp API token từ kho bảo mật — không hard-code
Token Cloudflare đã kết nối được cấp qua biến môi trường khi chạy script: export CLOUDFLARE_API_TOKEN="…" và export CLOUDFLARE_ACCOUNT_ID="…". Token chỉ cần quyền Cloudflare Pages: Edit. Tuyệt đối không dán token vào file HTML, vào script hay vào kho code — token nào đã từng lộ qua chat phải được xoay (tạo mới, xóa cũ) trước khi dùng.
Chạy script triển khai
Tải script bên cạnh (deploy-cloudflare-pages.sh) rồi chạy: ./deploy-cloudflare-pages.sh index.html. Script tự kiểm tra token qua api.cloudflare.com/client/v4/user/tokens/verify, tạo project Pages nếu chưa có, rồi đẩy thư mục chứa index.html lên bằng Wrangler (công cụ chính thức của Cloudflare, tự đọc token từ biến môi trường).
Xác nhận đã đẩy thành công
Script không dừng ở lệnh đẩy: nó gọi tiếp API GET /accounts/{account}/pages/projects/{project}/deployments, chờ deployment mới nhất đạt trạng thái success rồi in ra URL bản live (*.pages.dev) và mã deployment. Mở URL đó, kiểm tra banner mốc dữ liệu và một KPI bất kỳ khớp với bản vừa xuất là xác nhận xong. Nếu trạng thái là failure, script thoát với mã lỗi và in stage bị lỗi để xử lý.
Khi cần quay lui (rollback)
Cloudflare Pages giữ lại mọi deployment trước. Vào trang quản trị Pages → project → Deployments → chọn bản cũ → Rollback to this deployment; hoặc gọi API tương ứng bằng cùng token. Bản HTML tự chứa của từng lần xuất nên được lưu kèm ngày xuất để đối chiếu.
Script dưới đây đọc token và account ID từ biến môi trường, gọi api.cloudflare.com để kiểm tra token và xác nhận deployment. Trong script không có bất kỳ token hay khóa bí mật nào.