Nhận dữ liệu phiên học từ vendor DAT, đối soát km/giờ theo hạng, cảnh báo thiếu chỉ tiêu trước sát hạch và phát hiện lệch GV/xe so với đăng ký Sở. Dữ liệu DAT là căn cứ xét hoàn thành khóa học (NĐ 94/2026).
| Feature | BO chính | Action |
|---|---|---|
| device | Thiết bị DAT (seri, sim, hạn) | viewcreateeditdelete |
| component TỪ BACKEND | Linh kiện thiết bị (thẻ nhớ… — seri riêng, tháo rời được) | viewcreateeditassign |
| binding CHUYỂN TỪ vehicle | Gắn/tháo thiết bị vào xe (lịch sử theo thời điểm) | viewassignexport |
| session | Phiên học DAT (km/giờ) | viewimportexcludeexport |
| reconcile | Kết quả đối soát theo học viên/hạng | viewreconcilereport |
| alert | Cảnh báo thiếu km/giờ, lệch GV/xe | viewconfiguresend |
| log | Nhật ký truyền/kết nối | view |
| Trường | Kiểu | Ghi chú |
|---|---|---|
| Nguồn + ID phiên gốc | text | UNIQUE — import idempotent, chạy lại không nhân đôi |
| Học viên / khóa / GV / xe | khóa NV | ma_dk · ma_kh · ma_gv · ma_xe |
| Bắt đầu / kết thúc | datetime | — |
| Quãng đường (km) / thời lượng (phút) | number | — |
| Trạng thái phiên + lý do | enum·text | VALID · WARNING (vùng xám, cần người xem lại) · INVALID — theo backend đang chạy (mục 4.4), không phải bool. Lệch GV/xe, trùng giờ, tỷ lệ nhận diện thấp → hạ trạng thái, ghi rõ lý do |
| Nhận diện khuôn mặt | int·int | Số lần / số lần thành công — tỷ lệ thấp là căn cứ đánh WARNING |
| Điểm GPS chi tiết | BO phụ | history_data — nguồn thật để tính km/giờ (mục 4.5); phiên chỉ giữ số cộng dồn |
device (đã có): seri · số SIM · loại thiết bị · ngày bàn giao · ngày hết hạn (hợp quy/dịch vụ) · trạng thái.
binding — dat_gan_xe (mới, chuyển từ vehicle): seri thiết bị · ma_xe · từ ngày → đến ngày · người thao tác. Append-only — căn cứ quy phiên học về đúng xe theo đúng thời điểm. Thiết bị chưa gắn xe nào (dự phòng/bảo hành) = không có dòng mở.
Nguồn: repo backend (branch develop) — Sequelize models + mapping cột thật. Đây là hệ DAT đang vận hành, dùng làm chuẩn để thiết kế module dat trên OpenGate.
| Model | Bảng thật | Vai trò | Trong thiết kế |
|---|---|---|---|
| DatDevice | dat_device | Thiết bị DAT | ✅ feature device |
| DatDeviceComponent | dat_device_component | Linh kiện rời của thiết bị | ❌ thiếu → thêm feature component |
| RollCallStudent | diem_danh_nguoi_lx | Phiên học DAT (login→logout) | ✅ feature session — nhưng mô tả quá sơ sài |
| HistoryData | history_data | Điểm GPS trong phiên — nguồn tính km/giờ | ❌ thiếu → BO phụ của session |
| DatAppConnectionLog | dat_app_connection_logs | Nhật ký kết nối thiết bị ↔ app | ✅ feature log |
| TrainingVehicle | xe_tap_lai | Xe tập lái — giữ khóa gắn thiết bị | → vehicle + dat.binding |
| VehicleInfoHistory | xe_tap_lai_history | Audit đổi thông tin xe (changes JSONB) | → vehicle |
| Student (một phần) | nguoi_lx | Tiến độ km/giờ tích lũy | → nguồn feature reconcile |
| Cột | Kiểu | Ghi chú |
|---|---|---|
| id | int PK | Cấp qua bảng đếm DataIndex (bắt đầu 100) — không dùng sequence |
| so_seri | varchar(100) | Tự sinh tiền tố DAT- + chuỗi từ generate-serial-key nếu bỏ trống — khớp đề xuất "seri do nhà cung cấp cấp phát" |
| so_sim | varchar(100) | SIM dữ liệu |
| loai_thiet_bi | varchar(50) | mặc định 'DAT' — đã chừa chỗ cho họ thiết bị khác (chip, sân bãi) |
| ngay_ban_giao · ngay_het_han | date | Bàn giao / hết hạn hợp quy–dịch vụ |
| status | bool | ⚠️ Chỉ bật/tắt — không đủ cho các trạng thái thật: kho, đang gắn, bảo hành, hỏng |
Quan hệ: hasOne TrainingVehicle (gắn xe, SET NULL khi xóa) · hasMany DatDeviceComponent. API: /dat-device/:id/assign-vehicle · /update-dat-assignment · /device/get-not-assigned · /available-components.
| Cột | Kiểu | Ghi chú |
|---|---|---|
| so_seri | varchar(100) NOT NULL | Linh kiện có seri riêng, truy vết độc lập với thiết bị mẹ |
| loai_thiet_bi | enum | Hiện chỉ storage (thẻ nhớ) — enum để mở rộng |
| dat_device_id | int NULL | NULL = linh kiện rời trong kho, chưa lắp vào thiết bị nào |
| Nhóm | Cột |
|---|---|
| Định danh | diem_danh_nguoi_lx_id (UUID PK) · diem_danh_giao_vien_id (UUID — phiên của GV, 1 phiên GV có nhiều phiên HV) · phien_dao_tao · thu_tu_phien · active_phien |
| Chủ thể | ma_dk · nguoi_lx_id · ma_gv · giao_vien_id · bien_so · vehicle_id · ma_csdt — vừa khóa nghiệp vụ vừa id, khớp pattern P2 (chụp tại thời điểm) |
| Mở phiên | thoi_diem · lat · lng · path_image_login |
| Đóng phiên | logout (bool) · thoi_diem_logout · lat_logout · lng_logout · path_image · thoi_diem_last_data |
| Nhận diện | so_lan_nhan_dien · so_lan_nhan_dien_thanh_cong — tỷ lệ nhận diện là chỉ số chất lượng phiên, căn cứ đánh WARNING |
| Số liệu km/giờ | Tổng: tong_quang_duong · tong_thoi_gian Trong phiên: tong_quang_duong_ld_phien · tong_thoi_gian_ld_phien Ban đêm: tong_quang_duong_ld_ban_dem · tong_thoi_gian_ld_ban_dem Hạng B11: quang_duong_b_11 · thoi_gian_b_11 |
| Hợp lệ | session_status enum VALID · WARNING · INVALID — API PUT /roll-call-student/:uuid/status cho phép sửa tay |
BO phụ của session (RollCallStudent hasMany HistoryData) — đây mới là nguồn tính km/giờ, phiên chỉ giữ số cộng dồn. Khối lượng lớn nhất hệ.
| Nhóm | Cột |
|---|---|
| Định danh | history_id (UUID, cấp qua DataIndex) · diem_danh_nguoi_lx_id (FK phiên) · imei |
| Điểm đo | thoi_diem · lat · lng · van_toc · quang_duong · path_image (ảnh nhận diện tại điểm) |
| Cộng dồn | tong_quang_duong_ld_phien · tong_thoi_gian_ld_phien · tong_quang_duong_ld |
| Phân loại | is_night (tính giờ ban đêm) · is_manual (nhập tay — cờ quan trọng cho đối soát/thanh tra) · hang_dao_tao · phien_dao_tao |
| Chụp tại thời điểm | bien_so · ma_dk · nguoi_lx_id · giao_vien_id · ma_csdt · vehicle_id |
tong_quang_duong_ld · tong_thoi_gian_ld · quang_duong_ban_dem · thoi_gian_ban_dem · quang_duong_b_11 · thoi_gian_b_11 · thoi_diem_bat_dau_ld · thoi_diem_tap_cuoi_ld · thoi_diem_chay_dat · thoi_diem_ket_thuc_dat · count_send_data · send_tong_cuc · is_dao_tao. Định danh sinh trắc: is_face_id · is_finger · is_rfid · rfid · so_the_rfid · add_date_rfid. Xe: ma_xe_tap · ma_xe_tap_phu · xe_b_11.
Cột: payload · server_message · log_type · status · sub_status + timestamps. Trạng thái đã có: SUCCESS · NOT_FOUND_DEVICE (sub: NOT_REGISTERED, COLLISION) · INVALID_DEVICE · DEVICE_REGISTERED. Giữ nguyên bộ mã này khi làm module — đây là ngôn ngữ kỹ thuật viên đã quen.
Khối permissions[] dán vào manifest.json; bảng dưới là gán quyền theo vai trò (seed rt_role). Permission key đầy đủ: dat.main.<feature>.<action>.
⚠️ Action đặc thù (exclude, reconcile, send) cần bổ sung vào validator manifest — xem plan data-scope P1.
| Feature | QTHT | GIAM_DOC | KY_THUAT | QL_DAO_TAO | GIAO_VU | GIAO_VIEN | HOC_VIEN |
|---|---|---|---|---|---|---|---|
| device | R | R | W | — | — | — | — |
| component | R | R | W | — | — | — | — |
| binding | R | R | W | R | R | — | — |
| session | R | R | — | R | W | R¹ | — |
| reconcile | R | R | — | W | W | R¹ | R² |
| alert | R | R | — | W | R | — | — |
| log | R | R | R | — | — | — | — |
R xem · W tạo/sửa · A duyệt · — không có quyền · ¹ dữ liệu phân công · ² của chính mình · ³ theo trạng thái hồ sơ. Vai trò không liệt kê = không có quyền.
Đặc thù: component +assign (KY_THUAT) — lắp/tháo linh kiện vào thiết bị · binding +assign (KY_THUAT) — port từ vehicle.device-bind cũ · session +import,exclude (GIAO_VU) · reconcile +reconcile (QL_DAO_TAO, GIAO_VU) · alert +send,configure (QL_DAO_TAO)
(a) Manifest bổ sung fields + scopeVars cho feature bị scope (mở rộng schema — plan data-scope P1; manifest chỉ khai "cái gì scope được", không chứa rule):
(b) Điều kiện record theo vai trò:
| Vai trò | Feature (action) | Điều kiện record |
|---|---|---|
| GIAO_VIEN | session, reconcile (view) | ma_gv = ctx.current_ma_gv |
| HOC_VIEN | reconcile (view) | ma_dk ∈ ctx.current_ma_dk_list (các lượt đăng ký của mình) |
(c) Seed rt_role.grants (kind rule — nhiều rule cùng resource+action = OR):
Biến ngữ cảnh: current_user_id — engine có sẵn · current_giao_vien_id/current_ma_gv — module teacher tra từ user đăng nhập (ctxVars, plan P3) · current_nguoi_lxid/current_ma_dk_list — module student tra (1 người nhiều lượt đăng ký) · current_assigned_* — danh sách phụ trách/được phân công.