TÀI LIỆU ĐẶC TẢ YÊU CẦU PHẦN MỀM (SRS)
HỆ THỐNG: NỀN TẢNG TRUY XUẤT NGUỒN GỐC GOTRACE
TXNG-F30 -- Dashboard Tổng hợp Truy xuất Nguồn gốc
Thông tin
Chi tiết
Phiên bản
1.3
Ngày tạo
11/04/2026
Ngày cập nhật
20/05/2026
Tác giả
GoTrace Team
Người review
Người phê duyệt
Lịch sử thay đổi
Ngày
Người cập nhật
Mô tả thay đổi
20/05/2026
GoTrace Team
v1.3 — Đồng bộ với implementation trên branch feat/dashboard-txng. (1) §5.0.1: ghi rõ product_type derive qua chain Batch → ProductionPlan → PlanProduct.product_type, không cần cột batches.batch_type. (2) §5.5: thêm spec txng-sc-07 (Map mạng lưới phân phối, Leaflet) + txng-sc-08 (Widget Điều Chuyển Nội Bộ F33). (3) §5.8: thêm spec txng-gm-07 (Map phủ sóng DN qua centroid Tỉnh) + txng-gm-08 (Bar DN theo quận/huyện); ghi chú PROVINCE_LEGACY_MAP cho 27 tỉnh đã sáp nhập 2025. (4) §9.1: cập nhật bảng endpoint thực tế (/inventory thay /batches, /module/{slug} cho 5 dashboard, bookmark endpoints, audit interceptor). 7 section "bỏ trống" do batch_type đã được populate qua JOIN; KHÔNG còn cần lùi v1.5.
05/05/2026
GoTrace Team
v1.2 — Đồng bộ chuẩn UI/UX dashboard với gold-standard QLNN-F38 (Quản lý Chuyên ngành). Bổ sung §1.4 tham chiếu kiến trúc 8 lớp UX (L1 SubHeader → L8 PersonalizationPanel). Bổ sung §4.1 Layout chuẩn (FilterBar primary+secondary, BreadcrumbContextBar, KPI Strip 8 cards, AnalyticalSection wrapper, NestedDrillDownModal). Bổ sung §5 mô tả type-signature IFilterState / IKPICard / ISectionMeta chuẩn QLNN-F38. Bổ sung SCR-F30-09 (NestedDrillDownModal) và SCR-F30-10 (PersonalizationPanel drawer). Cắt phạm vi backend (DB schema/API) khỏi v1.2 — sẽ bổ sung khi triển khai.
21/04/2026
GoTrace Team
v1.1 — Bổ sung 2 widget F33 vào SCR-F30-05: "Điều Chuyển Nội Bộ" (số lệnh chờ duyệt/đang VC, top 5 SP) + "Cân Bằng Tồn Kho Chuỗi" (heatmap tồn kho per điểm bán, cảnh báo lệch ngưỡng); thêm liên thông ← TXNG-F33; thêm BR-F30-14, BR-F30-15; thêm CHAIN_MANAGER vào bảng Actors
11/04/2026
GoTrace Team
Khởi tạo tài liệu v1.0 — 8 dashboard tổng hợp TXNG
1. Tổng quan tài liệu
1.1. Mục đích tài liệu
Tài liệu mô tả chi tiết chức năng Dashboard Tổng hợp Truy xuất Nguồn gốc (TXNG-F30) trong Module Truy xuất Nguồn gốc (TXNG) của hệ thống GoTrace. Chức năng cung cấp 8 dashboard chuyên biệt , tổng hợp dữ liệu từ tất cả 29 module TXNG (F01–F29), trình bày dưới dạng biểu đồ, bảng dữ liệu và stat cards, phục vụ quản lý doanh nghiệp và cán bộ QLNN theo dõi toàn diện tình hình truy xuất nguồn gốc trên địa bàn.
Tài liệu tham chiếu kiến trúc từ ATTP-F24 (Dashboard Tổng hợp ATTP) — cùng mô hình 8 dashboard aggregate, đã triển khai thành công cho module An toàn Thực phẩm.
Tài liệu là cơ sở cho đội ngũ phát triển (Developer), kiểm thử (QA), và các bên liên quan trong việc hiểu rõ yêu cầu kỹ thuật – nghiệp vụ.
1.2. Thông tin chức năng
Thuộc tính
Giá trị
Mã chức năng
TXNG-F30
Tên chức năng
Dashboard Tổng hợp Truy xuất Nguồn gốc
Menu
TXNG > Dashboard & Báo cáo > [8 sub-menus]
Ưu tiên
Bắt buộc
Giai đoạn
v1.0
Pháp lý
TCVN 12850:2019 (Truy xuất chuỗi cung ứng), TT 02/2024/TT-BKHCN, GS1 General Specifications
Liên thông
<- TXNG-F01 (Doanh nghiệp — tổng số DN, phân bố, GLN)
<- TXNG-F02 (Vùng SX — diện tích, polygon GIS)
<- TXNG-F03 (Sản phẩm — danh mục SP, GTIN)
<- TXNG-F04 (Vật tư — danh mục vật tư đầu vào)
<- TXNG-F05 (Nhật ký Trồng trọt — hoạt động canh tác, mùa vụ)
<- TXNG-F06 (Nhật ký Chăn nuôi — lứa nuôi, vaccine, thức ăn)
<- TXNG-F07 (Nhật ký Chế biến — transformation events, SSCC)
<- TXNG-F08 (Nhật ký Phân phối — sự kiện vận chuyển)
<- TXNG-F09 (Lô mã — batch lifecycle, trạng thái, hạn SD)
<- TXNG-F10 (Chứng chỉ — VietGAP, HACCP, ISO, hạn HLực)
<- TXNG-F11 (Đồng bộ QG — sync records, lỗi, phiên đồng bộ)
<- TXNG-F12 (Truy ngược — traceback queries, kết quả)
<- TXNG-F13 (Thu hồi SP — recall campaigns, tiến độ)
<- TXNG-F14 (Thống kê SL — KPI sản lượng, biểu đồ)
<- TXNG-F15 (Giám sát Realtime — cảnh báo, Kanban)
<- TXNG-F16 (QR Code — mã QR, lượt quét, thiết bị)
<- TXNG-F17 (CTE — sự kiện CTE/KDE)
<- TXNG-F18A (Phương tiện — xe, trạng thái)
<- TXNG-F18B (Tài xế — GPLX, đánh giá)
<- TXNG-F19 (Kho bãi — tồn kho, vị trí)
<- TXNG-F20 (Điểm bán — retail points, GLN)
<- TXNG-F21 (Tem — tem truy xuất, lifecycle)
<- TXNG-F22 (Vận chuyển — shipment orders, handover)
<- TXNG-F23 (Kế hoạch SX — mục tiêu, tiến độ)
<- TXNG-F25 (Kiểm định CL — kết quả lab, pass/fail)
<- TXNG-F26 (Đóng gói XK — hierarchical packaging)
<- TXNG-F27 (Onboarding — đăng ký DN mới)
<- TXNG-F28 (Lựa chọn nền tảng — GoTrace/NDATrace)
<- TXNG-F37 (Mạng lưới PP — liên kết nhà CC, điểm bán)
<- TXNG-F33 (Điều Chuyển Nội Bộ — widget điều chuyển + cân bằng tồn kho chuỗi)
1.3. Tác nhân tham gia (Actors)
Actor
Vai trò
Quyền hạn
ENTERPRISE_ADMIN
Quản trị viên Doanh nghiệp
Xem tất cả dashboard thuộc DN mình, export PDF/Excel
CHAIN_MANAGER
Quản lý vùng/chuỗi
Xem widget Điều Chuyển Nội Bộ + Cân Bằng Tồn Kho Chuỗi trong SCR-F30-05 (v1.1)
ENTERPRISE_USER
Nhân viên Doanh nghiệp
Xem dashboard (giới hạn theo phân quyền nội bộ)
SO_ADMIN
Quản trị viên Sở
Xem dashboard toàn bộ DN trên địa bàn (read-only), export PDF/Excel. Chỉ truy cập DB-08
TINH_TP_ADMIN
Quản trị viên Tỉnh/TP
Xem tất cả dashboard, tất cả DN, tất cả địa bàn. Export PDF/Excel
SYSTEM
Hệ thống tự động
Auto-aggregate dữ liệu, auto-refresh, cache invalidation
1.4. Tham chiếu UI/UX
1.4.1. Bảng tham chiếu
Tham chiếu
Nội dung
Áp dụng trong TXNG-F30
QLNN-F38 (gold standard)
Dashboard Quản lý Chuyên ngành — 21 analytical sections, pattern Sector Supply Chain Intelligence
Bắt buộc nhân bản 8 lớp UX (L1–L8) cho mọi sub-dashboard SCR-F30-01..08
ATTP-F24
Dashboard Tổng hợp ATTP — 8 dashboard pattern
Tái sử dụng kiến trúc, stat-card, chart components, filter pattern
TCVN 12850:2019
Truy xuất chuỗi cung ứng thực phẩm — CTE/KDE
Radar chart tuân thủ 8 tiêu chí trong Dashboard QLNN
GS1 General Specifications
Định danh GLN/GTIN/SSCC
KPI coverage mã hóa, tỷ lệ DN có GLN/GTIN
TT 02/2024/TT-BKHCN
Truy xuất nguồn gốc sản phẩm hàng hóa
Yêu cầu báo cáo định kỳ, giám sát đồng bộ Cổng QG
1.4.2. Kiến trúc 8 lớp UX (chuẩn QLNN-F38)
Mọi sub-dashboard SCR-F30-01..08 PHẢI tuân thủ kiến trúc 8 lớp sau:
Lớp
Tên thành phần
Mô tả áp dụng cho TXNG-F30
L1
SubHeader (HeroUI)
Title "Dashboard {tên dashboard}" + subtitle role context + 3 action buttons (⚙️ Tùy chỉnh / 🔗 Chia sẻ URL / 📥 Xuất báo cáo)
L2
FilterBar + SearchWrapper
Primary 4-col grid (Doanh nghiệp / Vùng SX / Sản phẩm / Kỳ phân tích) + checkbox "So sánh kỳ liền kề"; Secondary collapsible 4-col grid (Loại lô, Trạng thái, GTIN, Vùng GIS) + Reset
L3
BreadcrumbContextBar
Hiển thị filter active dạng chip có nút × — đồng bộ với URL query string để share được
L4
KPIStrip + KPICardItem
Grid responsive auto-fit minmax(180px, 1fr); 8 stat-cards (icon emoji, value 24px weight 800, sublabel, trend % vs prior period, color blue/green/orange/red/teal/purple); clickable drill-down
L5
AnalyticalSection + SectionContainer
Card wrapper: header (icon, title, subtitle, trend badge) + data tabs (multi-tab) + body chart + footer (Pin/Export); lazy-load IntersectionObserver
L6
Recharts primitives
HorizontalBarChart, DonutChart, StackedBarChart, Heatmap, LineChart, RadarChart — chuẩn props data, height, unit, colors
L7
NestedDrillDownModal
Breadcrumb navigation + chart type toggle + data tab switcher + ranking table + record limit (20/50/100)
L8
PersonalizationPanel
Side drawer: visibility toggle, pin, drag reorder, save/load/delete preset (per role)
1.4.3. Custom hooks tái sử dụng (đặt tại apps/frontend/components/admin/txng/dashboard/hooks/)
Hook
Trả về
Mô tả
useTxngDashboardFilters()
{ filters, updateFilter, resetFilters, smartFilters, showSecondary, setShowSecondary }
Quản lý state filter primary + secondary, build chip list
useNestedModal()
{ modalState, openModal, drillDown, goBack, jumpToLevel, close, setChartType, setDataTab, setLimit }
Quản lý drill-down stack, breadcrumb, chart type
useUserPreferences(role)
{ preferences, visibleSections, toggleVisibility, togglePin, reorderSections, savePreset, applyPreset, deletePreset }
Quản lý preset cá nhân hoá
Tham chiếu code chuẩn: apps/frontend/components/admin/qlnn/chuyen-nganh/index.tsx
2. Luồng nghiệp vụ (Business Flow)
2.1. Luồng nghiệp vụ tổng quan (ASCII diagram)
┌──────────────────────────────────────────────────────────────────────────────┐
│ LUỒNG TRUY CẬP DASHBOARD TỔNG HỢP TXNG │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ [ENTERPRISE_ADMIN / SO_ADMIN / TINH_TP_ADMIN] │
│ | │
│ v │
│ +---------------------+ │
│ | 1. Truy cập menu | │
│ | TXNG > Dashboard | │
│ +---------------------+ │
│ | │
│ v │
│ +---------------------+ +---------------------+ │
│ | 2. Chọn dashboard | --> | 3. Hệ thống kiểm tra| │
│ | chuyên biệt (1/8) | | quyền truy cập | │
│ +---------------------+ +---------------------+ │
│ | │
│ +------------+-------------+ │
│ | | │
│ [Có quyền] [Không có quyền] │
│ | | │
│ v v │
│ +---------------------+ +---------------------+ │
│ | 4. Load dữ liệu | | Hiển thị E-F30-003 | │
│ | aggregate từ F01-F29 | | "Không có quyền" | │
│ +---------------------+ +---------------------+ │
│ | │
│ v │
│ +---------------------+ │
│ | 5. Hiển thị | │
│ | Stat Cards + | │
│ | Biểu đồ + Bảng | │
│ +---------------------+ │
│ | │
│ +----+----+----+ │
│ | | | │
│ v v v │
│ [Filter] [Drill] [Export] │
│ | down | │
│ v | v │
│ +-------+ | +---------+ │
│ |Reload | | |PDF/Excel| │
│ |data | | |download | │
│ +-------+ | +---------+ │
│ v │
│ +---------------------+ │
│ | Navigate đến module | │
│ | nguồn (F01-F29) | │
│ +---------------------+ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
2.2. Diễn giải luồng (bảng bước)
Bước
Tác nhân
Hành động / Mô tả
Phản hồi / Xử lý hệ thống
Ghi chú
1
User
Truy cập menu TXNG > Dashboard & Báo cáo
Hiển thị 8 sub-menu dashboard
Menu group mới
2
User
Chọn 1 trong 8 dashboard chuyên biệt
Hệ thống load trang dashboard tương ứng
Mặc định vào Tổng quan
3
SYSTEM
Kiểm tra quyền truy cập theo role và phạm vi
1. Validate Bearer Token 2. Kiểm tra role (ENTERPRISE_ADMIN/SO_ADMIN/TINH_TP) 3. Xác định phạm vi dữ liệu (DN mình / toàn tỉnh)
Lỗi 403 nếu không có quyền
4
SYSTEM
Aggregate dữ liệu từ các module F01-F29
1. Thực hiện aggregate queries 2. Apply filter mặc định (năm hiện tại) 3. Cache kết quả (TTL 5 phút)
API response <= 1 giây
5
SYSTEM
Render dashboard
1. Hiển thị stat cards với giá trị 2. Render biểu đồ (Recharts) 3. Hiển thị bảng dữ liệu 4. Hiển thị bộ lọc
Page load <= 2 giây
6
User
Thay đổi bộ lọc (Năm, Quý, Loại SP, ...)
1. Re-fetch dữ liệu với filter mới 2. Re-render biểu đồ và bảng
Debounce 300ms
7
User
Click vào phần tử biểu đồ/bảng (drill-down)
Navigate đến danh sách chi tiết trong module nguồn với filter tương ứng
VD: Click bar "Vinamilk" -> Mở F09 list lọc theo DN
8
User
Click "Export PDF" hoặc "Export Excel"
1. SYSTEM tạo file 2. Download file với tên: Dashboard_{TenDB}_{YYYYMMDD}.pdf/xlsx 3. Ghi audit log
File > 10.000 bản ghi -> toast W-F30-002
3. Phân loại Dashboard
3.1. Phân loại 8 dashboard theo mục đích
#
Mã màn hình
Tên dashboard
Mục đích chính
Đối tượng
Tần suất xem
Độ phức tạp
1
SCR-F30-01
Tổng quan TXNG
Executive summary toàn hệ thống truy xuất
Lãnh đạo DN, Cán bộ QLNN
Hàng ngày
Trung bình
2
SCR-F30-02
Sản xuất & Kế hoạch
Hiệu suất SX, tiến độ KH, năng suất
Quản lý SX, Trưởng phòng
Hàng tuần
Trung bình
3
SCR-F30-03
Lô mã & Tồn kho
Vòng đời lô, tồn kho, rủi ro hết hạn
Quản lý kho, QC Manager
Hàng ngày
Trung bình
4
SCR-F30-04
Mã hóa & Tem điện tử
QR code, tem, lượt quét, CTE events
Digital Ops, Marketing
Hàng tuần
Trung bình
5
SCR-F30-05
Chuỗi cung ứng & Phân phối
Vận chuyển, kho bãi, điểm bán, fleet
Logistics Manager
Hàng ngày
Cao (Map)
6
SCR-F30-06
Truy vết & Thu hồi
Traceback, recall campaigns, tác động
QA Manager, Pháp chế
Theo sự kiện
Trung bình
7
SCR-F30-07
Tích hợp & Đồng bộ
Sync Cổng QG, chứng chỉ, CTE/KDE
IT Admin, Compliance
Hàng tuần
Trung bình
8
SCR-F30-08
Quản lý Nhà nước TXNG
Giám sát tuân thủ, phủ sóng DN, KPI pháp lý
SO_ADMIN, TINH_TP_ADMIN
Hàng tháng
Cao (Radar)
3.2. Phân loại biểu đồ sử dụng
Loại biểu đồ
Recharts Component
Dashboard sử dụng
Mô tả
Line Chart
LineChart
SCR-01, 02, 03, 04, 06, 07, 08
Xu hướng theo thời gian
Bar Chart
BarChart
SCR-01, 02, 03, 04, 05, 06, 07, 08
So sánh theo danh mục
Grouped Bar
BarChart (multi-series)
SCR-02, 05
Kế hoạch vs Thực tế
Stacked Bar
BarChart (stacked)
SCR-01, 02, 03, 07
Phân bố thành phần
Donut Chart
PieChart (innerRadius)
SCR-01, 03, 04, 05, 06, 07, 08
Phân bố tỷ lệ
Pie Chart
PieChart
SCR-04
Phân bố thiết bị quét
Radar Chart
RadarChart
SCR-08
Điểm tuân thủ đa chiều
Bản đồ GIS
Leaflet + PostGIS
SCR-05, 08
Vị trí kho, điểm bán, DN
Progress Bar
CSS custom
SCR-02, 06
Tiến độ hoàn thành
4. Danh sách màn hình
4.1. Bảng tổng hợp màn hình
Mã màn hình
Tên màn hình
Route
Mô tả
SCR-F30-00
Trang điều hướng Dashboard
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh (rewrite về /admin/txng/dashboard)
Redirect đến SCR-F30-01 (Tổng quan)
SCR-F30-01
Dashboard Tổng quan TXNG
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/tong-quan
8 KPI cards (L4), 18–22 AnalyticalSection (L5), filter primary+secondary (L2), drill-down (L7)
SCR-F30-02
Dashboard Sản xuất & Kế hoạch
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/san-xuat-ke-hoach
8 KPI cards, 6–8 biểu đồ (Grouped Bar KH vs TT, Line trend, Donut by category, Bar top 10, Stacked by type), 1 table KH sắp đến hạn
SCR-F30-03
Dashboard Lô mã & Tồn kho
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/lo-ma-ton-kho
8 KPI cards, 6 biểu đồ (Donut status, Stacked Bar by month, Heatmap tồn kho per kho, Line quality trend), 1 table lô sắp hết hạn
SCR-F30-04
Dashboard Mã hóa & Tem
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/ma-hoa-tem
8 KPI cards, 6 biểu đồ (Line scan trend 30d, Donut tem status, Bar QR theo tháng, Pie thiết bị quét), 1 table QR quét nhiều nhất
SCR-F30-05
Dashboard Chuỗi cung ứng
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/chuoi-cung-ung
8 KPI cards, Map GIS (Leaflet) + 5 biểu đồ + 2 widget F33 (Điều Chuyển Nội Bộ, Cân Bằng Tồn Kho Chuỗi), 1 table vận chuyển
SCR-F30-06
Dashboard Truy vết & Thu hồi
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/truy-vet-thu-hoi
8 KPI cards, 6 biểu đồ (Donut nguyên nhân, Line trend, Bar tác động, Progress recall), 1 table thu hồi
SCR-F30-07
Dashboard Tích hợp & Đồng bộ
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/tich-hop-dong-bo
8 KPI cards, 6 biểu đồ sync NDATrace, chứng chỉ, CTE/KDE, 1 table phiên sync
SCR-F30-08
Dashboard Quản lý Nhà nước
/quan-ly/truy-xuat-nguon-goc/bang-dieu-hanh/quan-ly-nha-nuoc
8 KPI cards, Radar chart 8 tiêu chí TCVN 12850, 4 biểu đồ + Map GIS, 1 table DN chưa tuân thủ
SCR-F30-09
Modal Drill-down lồng (NestedDrillDownModal)
(overlay trên mọi sub-dashboard)
[v1.2] Breadcrumb stack drill-down + chart type toggle (donut/bar/line/heatmap) + data tab switcher + ranking table + record limit (20/50/100). Reuse component NestedDrillDownModal từ QLNN-F38
SCR-F30-10
Drawer Cá nhân hoá (PersonalizationPanel)
(drawer phải, overlay)
[v1.2] Quản lý preset hiển thị: visibility checklist, pin section, drag reorder, save/load/delete preset (per-role). Reuse component PersonalizationPanel từ QLNN-F38
4.2. Layout chuẩn 8 lớp UX (áp dụng SCR-F30-01 đến SCR-F30-08)
Mỗi sub-dashboard PHẢI có cấu trúc giao diện theo thứ tự sau từ trên xuống:
┌─ L1. SubHeader (sticky, height ~64px) ──────────────────────────────────────┐
│ ◀ TXNG / Dashboard {tên} · Subtitle: "DN: {tên DN} · {N} bộ lọc" │
│ [⚙️ Tùy chỉnh] [🔗 Chia sẻ URL] [📥 Xuất báo cáo] │
├─ L2. FilterBar (SearchWrapper, primary 4-col grid) ────────────────────────┤
│ [Doanh nghiệp ▾] [Vùng SX ▾] [Sản phẩm ▾] [Kỳ phân tích ▾] │
│ ☐ So sánh kỳ liền kề (▲/▼ % trend) │
│ ▸ Hiện bộ lọc nâng cao (toggle secondary 4-col grid: Loại lô, Trạng thái, GTIN, Vùng GIS) │
│ [Reset] │
├─ L3. BreadcrumbContextBar (chip row, hidden khi không có filter) ──────────┤
│ [DN: Vinamilk ×] [Vùng: Tây Nguyên ×] [SP: Sữa tươi ×] [Reset all] │
├─ L4. KPIStrip (grid auto-fit minmax(180px, 1fr), 8 cards) ─────────────────┤
│ [🏢 8.547 Tổng DN ▲+12.4%] [📦 52k Tổng SP ▲+18.7%] [🏷️ 284k Tổng lô ▲+24.3%] │
│ [✅ 87.3% Tuân thủ ▲+2.4%] [🔗 3.4k Chuỗi HĐ ▲+15.6%] [🚫 1.5k Vi phạm ▼-8.2%] │
│ [⚠️ 237 Gián đoạn ▼-12.5%] [⭐ 82.4% Tín nhiệm ▲+3.1đ] │
├─ L5. SectionContainer (vertical stack, mỗi card class .mg margin-bottom 16) ┤
│ ╔═ AnalyticalSection 1 — "Phân bố DN theo Ngành hàng" ═════════════════╗ │
│ ║ Header: [icon][title][subtitle][trend badge ▲+5.2%] [⋮ menu pin/export]║ │
│ ║ Tabs: [Số DN] [Số cơ sở] [Số chuỗi] [Tổng SP] ║ │
│ ║ Body: HorizontalBarChart {data, height: 320, unit: 'DN'} ║ │
│ ║ Footer: "Top 10 ngành" [Pin 📌] [Export 📥] ║ │
│ ╚═══════════════════════════════════════════════════════════════════════╝ │
│ ... (lazy load IntersectionObserver — render khi scroll vào viewport) │
├─ L7. NestedDrillDownModal (overlay, fixed top-level, hidden by default) ───┤
│ ◀ Tổng DN › Theo tỉnh › Theo ngành [Donut|Bar|Line|Heatmap] │
│ Tabs: [Số DN] [Số chuỗi] Limit: [20|50|100] │
│ Body: chart + ranking table │
└─ L8. PersonalizationPanel (right drawer 360px, hidden by default) ─────────┘
☑ Phân bố DN theo Ngành hàng 📌 Pin
☑ Top 10 chuỗi cung ứng 📌 Pin
☐ Heatmap tỉnh theo nguy cơ
[Lưu preset "Theo dõi hàng ngày"] [Áp dụng] [Xoá]
Tham chiếu component code: components/admin/qlnn/chuyen-nganh/sections/analytical-section.tsx , components/admin/qlnn/chuyen-nganh/sections/kpi-strip.tsx , components/admin/qlnn/chuyen-nganh/filter/filter-bar.tsx .
4.3. Trạng thái UI (loading/empty/error) — chuẩn QLNN-F38
Trạng thái
KPI Card
AnalyticalSection
Filter
Ghi chú
Loading
Skeleton shimmer 24px height
Skeleton bars 320px height
Disabled, spinner trong dropdown
TTL cache 5 phút
Empty
"—" + sublabel "Chưa có dữ liệu"
Illustration + "Chưa có dữ liệu cho bộ lọc hiện tại" + button "Reset bộ lọc"
—
Khi user filter quá hẹp
Error
Icon ⚠️ + "N/A" + tooltip lỗi
Banner đỏ + "Lỗi tải dữ liệu — Thử lại" + button retry
—
Log Sentry + retry x3
Stale
Badge "🕒 cũ 6 phút" (sau TTL)
Badge tương tự + auto-refresh background
—
Auto-refresh nếu user idle ≥ 30s
5. Mô tả chi tiết trường dữ liệu (per dashboard)
5.0. Type signatures chuẩn (chia sẻ giữa 8 sub-dashboard)
5.0.1. IFilterState — state bộ lọc (chuẩn QLNN-F38)
typescript export interface IFilterState {
// Primary filters (luôn hiển thị)
enterprise_id ?: string | null ; // FK → enterprises (TXNG-F01). BE DTO dùng tên `company_id` (alias).
region_id ?: string | null ; // FK → production_zones (TXNG-F02). v1.0: chưa wire BE — lùi v1.5.
product_type ?: 'TRONG_TROT' | 'CHAN_NUOI' | 'THUY_SAN' | 'CHE_BIEN' | null ;
period_type : 'YEAR' | 'QUARTER' | 'MONTH' | 'WEEK' | 'DAY' | 'CUSTOM' ;
period_value : string ; // "2026" | "2026-Q2" | "2026-05" | "2026-W18" | "2026-05-05" | "2026-04-01..2026-05-05"
compare_prev : boolean ; // checkbox "So sánh kỳ liền kề"
// Secondary filters (collapsible)
batch_status ?: TBatchStatus | null ; // v1.0: định nghĩa nhưng chưa wire BE — lùi v1.5.
gtin ?: string | null ; // v1.0: chưa wire BE — lùi v1.5.
province_id ?: string | null ; // ✅ wire BE — match qua Facility.province.name.
certificate_type ?: 'VIETGAP' | 'GLOBAL_GAP' | 'HACCP' | 'ISO22000' | null ; // v1.0: chưa wire — lùi v1.5.
// ... mở rộng theo từng sub-dashboard
}
Nguồn product_type của Batch — schema KHÔNG có cột batches.batch_type.
Loại lô được derive qua chain Batch.production_plan_id → ProductionPlan.products → PlanProduct.product_type.
FE form Batch (apps/frontend/validators/txng/batch/form.schema.ts) collect batch_type khi tạo Production Plan, KHÔNG lưu trực tiếp lên batches. Dashboard service JOIN qua relation để hiển thị phân loại (xem helper batchProductTypeInclude() + resolveProductType() ở apps/backend/src/modules/txng-dashboard/txng-dashboard.service.ts).
Filter product_type hiện đang dùng keyword inference trên gtin_name (PRODUCT_TYPE_KEYWORDS) thay vì JOIN relation — sẽ refactor về JOIN exact ở v1.5 sau khi thêm index plan_products(product_type).
5.0.2. IKPICard — đặc tả 1 stat-card
typescript export interface IKPICard {
key : string ; // unique trong KPI strip, ví dụ 'total_enterprises'
label : string ; // "Tổng doanh nghiệp"
icon : string ; // emoji 🏢 hoặc icon name HeroUI
formatted_value : string ; // "8.547" (đã format theo locale vi-VN)
raw_value : number ; // 8547 (dùng cho aggregate)
prev_value ?: number | string ; // dùng khi compare_prev=true
change_percent ?: number ; // +12.4 → hiển thị "▲+12.4%"
change_points ?: number ; // dùng cho KPI dạng score (vd điểm tín nhiệm)
trend_direction ?: 'up' | 'down' | 'neutral' ;
color : 'blue' | 'green' | 'orange' | 'red' | 'teal' | 'purple' ;
drill_target ?: string ; // ví dụ '/admin/txng/enterprises?status=ACTIVE' — click → navigate hoặc openModal
tooltip ?: string ; // hover info, công thức tính
}
typescript export interface ISectionMeta {
section_id : string ; // 'F30-01-section-01' (theo SCR-NN-section-NN)
group : 'A' | 'B' | 'C' | 'D' | 'E' | 'F' ; // Group trong personalization panel
icon : string ;
title : string ;
subtitle : string ;
default_chart : 'horizontal_bar' | 'donut' | 'stacked_bar' | 'line' | 'heatmap' | 'radar' | 'progress' ;
data_tabs : IDataTab []; // ví dụ [{key:'count', label:'Số lô'}, {key:'volume', label:'Sản lượng'}]
can_drill_down : boolean ;
default_visibility : { [ role : string ] : boolean }; // BO_TU: true, ENTERPRISE_USER: false, ...
pinned_default ?: boolean ;
}
export interface IDataTab {
key : string ;
label : string ;
}
5.0.4. Bộ lọc chung 4 trường primary (áp dụng SCR-F30-01..08)
Tên trường
Field name
Kiểu
Bắt buộc
Validation
Default
Doanh nghiệp
enterprise_id
Autocomplete
Không (Admin) / Có (Enterprise)
FK → enterprises
DN của user (ENTERPRISE_*) hoặc rỗng (Admin)
Vùng sản xuất
region_id
Dropdown
Không
FK → production_zones
"Tất cả"
Sản phẩm
product_id
Autocomplete
Không
FK → products
"Tất cả"
Kỳ phân tích
period_type + period_value
Composite
Có
period_type ∈ enum
YEAR / năm hiện tại
So sánh kỳ liền kề
compare_prev
Checkbox
Không
bool
false
Khi compare_prev=true: KPI card hiển thị thêm trend % so kỳ trước; AnalyticalSection có thêm overlay "kỳ trước" trên line/bar chart.
5.1. SCR-F30-01 — Dashboard Tổng quan TXNG
5.1.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Tổng doanh nghiệp tham gia
total_enterprises
Number
Có
COUNT(enterprises WHERE status=ACTIVE AND deleted_at IS NULL)
Số DN đang hoạt động
Tỷ lệ truy xuất đạt chuẩn
traceability_rate
Decimal(5,2)
Có
(batches_with_full_CTE / total_batches) * 100
% lô có đầy đủ CTE/KDE
Lô sản xuất đang hoạt động
active_batches
Number
Có
COUNT(batches WHERE status IN ('DANG_SX','DA_XUAT_KHO'))
Số lô đang hoạt động
Tổng lượt quét QR
total_qr_scans
Number
Có
SUM(qr_scans) in period
Tổng lượt quét
Thu hồi đang xử lý
active_recalls
Number
Có
COUNT(recalls WHERE status='IN_PROGRESS')
Số đợt thu hồi
Cảnh báo chưa giải quyết
unresolved_alerts
Number
Có
COUNT(alerts WHERE status='ACTIVE')
Số cảnh báo chưa xử lý
5.1.2. Bộ lọc (Filters)
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Validation
Mô tả
Năm
year
Number
Có
2020-2030
Mặc định: năm hiện tại
Quý
quarter
Dropdown
Không
Q1/Q2/Q3/Q4/Tất cả
Mặc định: Tất cả
Loại sản phẩm
product_type
Dropdown
Không
TRONG_TROT/CHAN_NUOI/THUY_SAN/CHE_BIEN/Tất cả
Mặc định: Tất cả
Tỉnh/Thành
province_id
Dropdown
Không
FK -> provinces
Mặc định: Tất cả
5.1.3. Biểu đồ
Tên biểu đồ
Chart type
Trục X
Trục Y
Dữ liệu
Ghi chú
Xu hướng tỷ lệ truy xuất 12 tháng
Line Chart
Tháng (T1-T12)
% đạt chuẩn
2 đường: năm nay vs năm trước
So sánh cùng kỳ
Phân bố lô theo loại hình SX
Donut Chart
—
—
4 loại: Trồng trọt/Chăn nuôi/Thủy sản/Chế biến
Màu: xanh lá/xanh dương/cyan/cam
Lô SX theo trạng thái & tháng
Stacked Bar
Tháng
Số lượng
5 trạng thái batch
5 màu theo trạng thái
Top 10 DN theo số lô truy xuất
Bar Chart ngang
Tên DN
Số lô
Sorted desc by count
Top 10 doanh nghiệp
5.1.4. Bảng dữ liệu
Tên bảng
Cột
Nguồn
Ghi chú
Cảnh báo gần nhất
Mã CB, Nội dung, Lô SX, Mức độ (Chip), Thời gian
F15 alerts
5 bản ghi gần nhất. Chip màu theo alert_level
5.2. SCR-F30-02 — Dashboard Sản xuất & Kế hoạch
5.2.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Tổng sản lượng (tấn)
total_production
Decimal(15,2)
Có
SUM(production_quantity) in period
Tấn
Số lô sản xuất
total_lots
Number
Có
COUNT(batches) in period
Số lô
Năng suất TB (tấn/ha)
avg_yield
Decimal(10,2)
Có
SUM(production) / SUM(area)
Tấn/ha
Kế hoạch hoàn thành
completed_plans
Number
Có
COUNT(plans WHERE status='COMPLETED')
Số KH hoàn thành
Kế hoạch quá hạn
overdue_plans
Number
Có
COUNT(plans WHERE end_date < NOW AND status != 'COMPLETED')
Số KH quá hạn
Tăng trưởng so kỳ trước
growth_rate
Decimal(5,2)
Có
(current - prev) / prev * 100
% tăng trưởng
5.2.2. Bộ lọc (Filters)
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Validation
Mô tả
Kỳ báo cáo
period_preset
Dropdown
Có
this_month/last_month/this_quarter/this_year
Mặc định: Năm nay
Khoảng thời gian
date_range
DateRange
Không
from_date <= to_date
Khi chọn "Tùy chỉnh"
Đơn vị thời gian
period_type
Dropdown
Không
DAILY/WEEKLY/MONTHLY/YEARLY
Mặc định: MONTHLY
Loại sản phẩm
product_type
Dropdown
Không
TRONG_TROT/CHAN_NUOI/THUY_SAN/CHE_BIEN
Mặc định: Tất cả
Doanh nghiệp
enterprise_id
Autocomplete
Không
FK -> enterprises
Admin only
5.2.3. Biểu đồ
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Kế hoạch vs Thực tế theo tháng
Grouped Bar
2 series: KH và TT theo tháng (tấn)
F23 target vs F09 actual
Xu hướng sản lượng 12 tháng
Line Chart
2 đường: năm nay vs năm trước
F14 production trend
Tỷ trọng sản lượng theo danh mục
Donut Chart
% theo loại SP
F09 by batch_type
Top 10 sản phẩm sản lượng cao nhất
Bar Chart ngang
Sorted desc by production
F03 + F09 join
Nhật ký SX theo loại hình
Stacked Bar
Trồng trọt + Chăn nuôi + Chế biến theo tháng
F05, F06, F07
5.3. SCR-F30-03 — Dashboard Lô mã & Tồn kho
5.3.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Tổng lô mã
total_batches
Number
Có
COUNT(all batches)
Tổng số lô
Lô đang hoạt động
active_batches
Number
Có
COUNT(batches WHERE status IN active states)
Lô đang HĐ
Tổng tồn kho (tấn)
total_stock
Decimal(15,2)
Có
SUM(stock_quantity) across warehouses
Tấn
Lô sắp hết hạn (30 ngày)
expiring_batches
Number
Có
COUNT(WHERE expiry_date < NOW+30d)
Badge cam
Lô bị thu hồi
recalled_batches
Number
Có
COUNT(WHERE status='RECALLED')
Badge đỏ
Tỷ lệ chất lượng đạt
quality_pass_rate
Decimal(5,2)
Có
(passed / total_tests) * 100
% đạt F25
5.3.2. Biểu đồ
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Phân bố lô theo trạng thái
Donut Chart
6 trạng thái batch
F09 status distribution
Lô mã tạo mới theo tháng & loại
Stacked Bar
4 loại: TT/CN/TS/CB theo tháng
F09 by type by month
Tồn kho theo kho hàng
Bar Chart ngang
Sorted desc by quantity
F19 stock by warehouse
Xu hướng tỷ lệ chất lượng đạt
Line Chart
% pass rate theo tháng
F25 quality tests over time
5.4. SCR-F30-04 — Dashboard Mã hóa & Tem điện tử
5.4.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Tổng mã QR đã tạo
total_qr_codes
Number
Có
COUNT(qr_codes)
Số QR
Tổng lượt quét
total_scans
Number
Có
SUM(total_scans)
Lượt quét
Lượt quét hôm nay
scans_today
Number
Có
SUM(scans WHERE date=today)
Lượt quét hôm nay
Tổng tem đã cấp
total_stamps
Number
Có
COUNT(stamps)
Số tem
Tem đã kích hoạt
activated_stamps
Number
Có
COUNT(stamps WHERE status='ACTIVATED')
Tem active
Sự kiện CTE ghi nhận
cte_events_count
Number
Có
COUNT(cte_events) in period
Số CTE
5.4.2. Biểu đồ
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Lượt quét QR theo ngày (30 ngày)
Line Chart
Số quét mỗi ngày, 30 ngày gần nhất
F16 scan logs by day
Phân bố trạng thái tem
Donut Chart
Đã KH / Chưa KH / Hết hạn / Tạm ngừng
F21 stamps by status
Mã QR tạo mới theo tháng
Bar Chart
Cột đứng 12 tháng
F16 qr_codes by create month
Phân bố thiết bị quét
Pie Chart
Mobile / Máy quét / Tablet / PC
F16 scan device_type
5.5. SCR-F30-05 — Dashboard Chuỗi cung ứng & Phân phối
5.5.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Tổng đơn vận chuyển
total_shipments
Number
Có
COUNT(shipments) in period
Số đơn
Đơn đang vận chuyển
in_transit
Number
Có
COUNT(WHERE status='IN_TRANSIT')
Đơn đang VC
Tổng điểm bán hàng
total_sale_points
Number
Có
COUNT(sale_points WHERE status=ACTIVE)
Điểm bán
Tổng kho bãi
total_warehouses
Number
Có
COUNT(warehouses)
Số kho
Phương tiện hoạt động
active_vehicles
Number
Có
COUNT(vehicles WHERE status=ACTIVE)
Số xe
Đối tác phân phối
distribution_partners
Number
Có
COUNT(partners)
Đối tác
5.5.2. Biểu đồ
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Section ID impl
Đơn VC theo tháng: Đã giao vs Đang VC
Grouped Bar
3 series theo trạng thái
F22 by status by month
txng-sc-01 (Line theo tháng năm nay vs năm trước)
Phân bố vận chuyển theo loại xe
Donut Chart
% theo loại phương tiện
F22 join F18A
txng-sc-02
Tồn kho theo Kho × Loại SP
Heatmap
row=kho, col=loại SP, value=SUM(quantity)
F19 + Batch + PlanProduct.product_type (JOIN)
txng-sc-03
Top 10 điểm bán theo tồn kho hiện tại
Bar Chart ngang
Sorted desc by current_stock
F20 by current_stock
txng-sc-04
Chuyến đạt / có sự cố theo tháng
Stacked Bar
OK vs Breach per month
F22 + ShipmentIncident
txng-sc-05
Cân bằng tồn kho chuỗi (F33)
Donut
Dư / Đủ / Thiếu theo Warehouse.current_usage / max_capacity
F19 + ngưỡng usage_ratio
txng-sc-06
Bản đồ mạng lưới phân phối
Leaflet Map
Markers kho + điểm bán (gps_latitude/longitude)
F19 + F20 geo data
txng-sc-07 (mới thêm)
Điều Chuyển Nội Bộ (F33)
Internal Transfer Widget
KPI pending/in_transit + top 5 SP + recent transfers
F33 StockTransfer + StockTransferItem
txng-sc-08 (mới thêm)
Data shape txng-sc-07 (Map):
typescript Array <{
id : string ; // 'wh-{id}' | 'pos-{id}'
type : 'warehouse' | 'sale_point' ;
name : string ;
lat : number ;
lng : number ;
sublabel ?: string ; // address
}>
Data shape txng-sc-08 (Widget F33):
typescript {
kpi : { pending : number; in_transit : number };
top_products : Array <{
batch_id : string ;
name : string ; // resolve qua Batch.gtin_name
code : string ; // resolve qua Batch.code
total_quantity : number ; // SUM(StockTransferItem.quantity) 7 ngày
}>;
recent_transfers : Array <{
id : string ;
code : string ; // StockTransfer.transfer_code
status : string ; // PENDING_APPROVAL | IN_TRANSIT
source_type : string ;
destination_type : string ;
created_at : string ;
}>;
} | null // null nếu DN không có lệnh F33 nào trong 30 ngày (BR_RULE-F30-09)
Stat Cards bổ sung:
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Lệnh chờ duyệt
pending_transfers
Number
Có
COUNT(WHERE status='PENDING_APPROVAL')
Lệnh F33 chờ CHAIN_MANAGER duyệt
Lệnh đang vận chuyển
in_transit_transfers
Number
Có
COUNT(WHERE status='IN_TRANSIT')
Lệnh F33 đang trên đường
Biểu đồ:
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Top 5 SP điều chuyển nhiều nhất (7 ngày)
Bar Chart ngang
Sorted desc by total dispatched_qty
F33 internal_transfer_items by product, last 7 days
Lệnh điều chuyển theo trạng thái (30 ngày)
Stacked Bar
Theo ngày, phân tầng trạng thái
F33 internal_transfers by status by day
Drill-down: Click bất kỳ → điều hướng đến SCR-F33-01 với filter tương ứng.
Mô tả: So sánh tồn kho giữa các điểm bán trong cùng enterprise. Màu sắc heatmap: xanh = tồn dư (≥ ngưỡng cấu hình), đỏ = tồn thiếu (< ngưỡng tối thiểu), vàng = trung bình.
Bảng tồn kho per điểm bán:
Cột
Kiểu
Mô tả
Điểm bán
Text
Tên + mã điểm bán
Tổng SKU
Number
COUNT(DISTINCT product_id) from store_inventory
Tổng số lượng
Decimal(15,2)
SUM(quantity) from store_inventory
Đang Reserve
Decimal(15,2)
SUM(reserved_qty)
Khả dụng
Decimal(15,2)
SUM(quantity - reserved_qty)
Trạng thái
Badge
SURPLUS / NORMAL / LOW / CRITICAL theo ngưỡng
Cảnh báo tự động:
Sản phẩm có available_qty < min_threshold (cấu hình per enterprise) → badge đỏ CRITICAL
Sản phẩm có available_qty > max_threshold tại điểm bán nguồn + available_qty < min_threshold tại điểm bán khác → gợi ý tạo lệnh F33
Drill-down: Click điểm bán → SCR-F33-07 (tồn kho điểm bán chi tiết).
5.6. SCR-F30-06 — Dashboard Truy vết & Thu hồi
5.6.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Tổng truy vết thực hiện
total_tracebacks
Number
Có
COUNT(traceback_queries) in period
Số truy vết
Truy vết thành công
successful_tracebacks
Number
Có
COUNT(WHERE result='COMPLETE')
Truy vết OK
Đợt thu hồi đang xử lý
active_recalls
Number
Có
COUNT(recalls WHERE status='IN_PROGRESS')
Thu hồi đang XL
Sản phẩm bị ảnh hưởng
affected_quantity
Decimal(15,2)
Có
SUM(recall.affected_quantity)
Kg/tấn
Thời gian truy vết TB
avg_traceback_time
Decimal(5,1)
Có
AVG(traceback_duration_minutes)
Phút
Tỷ lệ thu hồi hoàn thành
recall_completion_rate
Decimal(5,2)
Có
(completed / total) * 100
% hoàn thành
5.6.2. Biểu đồ
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Truy vết & Thu hồi theo tháng
Line Chart (dual axis)
Truy vết (trái) + Thu hồi (phải)
F12 + F13 by month
Phân bố thu hồi theo mức độ
Donut Chart
Class I/II/III
F13 recall_level
Nguyên nhân thu hồi phổ biến
Bar Chart
Top nguyên nhân sorted desc
F13 recall_type distribution
Thời gian xử lý thu hồi TB theo loại
Bar Chart ngang
Giờ per recall type
F13 avg duration by type
5.7. SCR-F30-07 — Dashboard Tích hợp & Đồng bộ
5.7.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Bản ghi đã đồng bộ QG
total_synced_records
Number
Có
SUM(sync_records_sent) in period
Số bản ghi
Tỷ lệ đồng bộ thành công
sync_success_rate
Decimal(5,2)
Có
(success / total) * 100
% thành công
Lỗi đồng bộ chưa xử lý
pending_sync_errors
Number
Có
COUNT(sync_errors WHERE status='PENDING')
Số lỗi
Chứng chỉ còn hiệu lực
valid_certificates
Number
Có
COUNT(certificates WHERE expiry > NOW)
Số CC
Chứng chỉ sắp hết hạn
expiring_certificates
Number
Có
COUNT(WHERE expiry BETWEEN NOW AND NOW+60d)
Badge cam
Sự kiện CTE/KDE tuần
weekly_cte_events
Number
Có
COUNT(cte_events) in last 7 days
Số CTE tuần
5.7.2. Biểu đồ
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Khối lượng đồng bộ theo ngày (30 ngày)
Line Chart
Số bản ghi mỗi ngày
F11 sync jobs by day
Kết quả đồng bộ theo loại dữ liệu
Stacked Bar
Success/Fail per data type
F11 sync by data_type
Phân bố chứng chỉ theo tiêu chuẩn
Donut Chart
VietGAP/GlobalGAP/HACCP/ISO/Organic
F10 certificates by type
Tỷ lệ lỗi đồng bộ theo tuần (8 tuần)
Bar Chart
Error rate % per week
F11 weekly error rate
5.8. SCR-F30-08 — Dashboard Quản lý Nhà nước TXNG
5.8.1. Stat Cards
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Công thức
Mô tả
Doanh nghiệp trên địa bàn
total_enterprises
Number
Có
COUNT(enterprises) in jurisdiction
Số DN
Tỷ lệ DN có chứng chỉ hợp lệ
valid_cert_rate
Decimal(5,2)
Có
(DN_with_valid_cert / total) * 100
% có CC
Tỷ lệ đồng bộ QG
sync_coverage
Decimal(5,2)
Có
(DN_synced / total) * 100
% đồng bộ
Lô SX có truy xuất đầy đủ
full_trace_rate
Decimal(5,2)
Có
(full_trace / total_batches) * 100
% truy xuất đầy đủ
Sự cố thu hồi trong kỳ
recall_incidents
Number
Có
COUNT(recalls) in period
Số đợt thu hồi
DN mới đăng ký (tháng)
new_onboarding
Number
Có
COUNT(new_enterprises) in current month
DN mới
5.8.2. Bộ lọc (Filters)
Tên trường
Field name
Kiểu dữ liệu
Bắt buộc
Validation
Mô tả
Năm
year
Number
Có
2020-2030
Mặc định: năm hiện tại
Quý
quarter
Dropdown
Không
Q1/Q2/Q3/Q4/Tất cả
Mặc định: Tất cả
Tỉnh/Thành
province_id
Dropdown
Không
FK -> provinces
Mặc định: Tất cả
Quận/Huyện
district_id
Dropdown
Không
FK -> districts, cascade từ province
Mặc định: Tất cả
Tiêu chuẩn
standard
Dropdown
Không
VietGAP/GlobalGAP/HACCP/ISO/Organic
Mặc định: Tất cả
Trạng thái tuân thủ
compliance_status
Dropdown
Không
DAT/CHUA_DAT/Tất cả
Mặc định: Tất cả
5.8.3. Biểu đồ
Tên biểu đồ
Chart type
Mô tả
Dữ liệu
Section ID impl
Radar TCVN 12850
Radar
8 trục tuân thủ TCVN 12850:2019
(Chưa có nguồn chấm điểm — F11/F12/F24 chưa hoàn thiện. v1.0 hiển thị "Chưa có dữ liệu")
txng-gm-01 (placeholder v1.5)
Xu hướng tuân thủ 12 tháng
Line
% lô có CTE theo tháng
F09 + F17 CTE
txng-gm-02
Vi phạm theo mức độ × tháng
Stacked Bar
Recall severity per month
F09 recall_severity
txng-gm-03
Top 10 DN chưa tuân thủ
Bar Chart ngang
Số lô bị thu hồi nhiều nhất
F09 recalled_at + F01
txng-gm-04
Heatmap phủ sóng DN theo Tỉnh × Tháng
Heatmap
Số DN có hoạt động trong tỉnh × tháng
F09 + Facility.province
txng-gm-05
Trạng thái đồng bộ hồ sơ NDATrace
Donut
Tỷ lệ DN theo trạng thái sync (Chưa/Đang/Đã/Lỗi)
CompanyGcp.nda_status
txng-gm-06
Bản đồ phủ sóng DN
Leaflet Map (cluster)
Cluster marker đặt tại centroid Tỉnh; sublabel = số DN
F01 Company + parseAddressPart → province_centroids.json (34 tỉnh sau NQ sáp nhập 2025)
txng-gm-07 (mới thêm)
DN theo quận/huyện
Bar Chart ngang
Top 15 quận/huyện
parseAddressPart(Company.address)
txng-gm-08 (mới thêm)
Data shape txng-gm-07 (Map DN):
typescript Array <{
id : string ; // 'prov-{name}'
type : 'province_cluster' ;
name : string ;
lat : number ;
lng : number ;
sublabel : string ; // '{count} doanh nghiệp'
meta : { count : number };
}>
Province legacy mapping (sáp nhập 2025) : dữ liệu DN có address chứa tên tỉnh cũ (vd "Bình Dương", "Hậu Giang") được map sang tỉnh mới qua PROVINCE_LEGACY_MAP trước khi lookup centroid. Xem helper normalizeProvinceName() tại apps/backend/src/modules/txng-dashboard/txng-dashboard-modules.service.ts.
6. Danh sách Use Case
Mã UC
Tên Use Case
Actor chính
Màn hình
Mô tả ngắn
UC-F30-01
Xem Dashboard Tổng quan TXNG
ENTERPRISE_ADMIN, SO_ADMIN
SCR-F30-01
Xem tổng hợp 6 KPI chính và 4 biểu đồ tổng quan
UC-F30-02
Xem Dashboard Sản xuất & Kế hoạch
ENTERPRISE_ADMIN
SCR-F30-02
Theo dõi hiệu suất SX, tiến độ KH, năng suất
UC-F30-03
Xem Dashboard Lô mã & Tồn kho
ENTERPRISE_ADMIN
SCR-F30-03
Theo dõi vòng đời lô, tồn kho, rủi ro hết hạn
UC-F30-04
Xem Dashboard Mã hóa & Tem
ENTERPRISE_ADMIN
SCR-F30-04
Thống kê QR code, tem, lượt quét, CTE
UC-F30-05
Xem Dashboard Chuỗi cung ứng
ENTERPRISE_ADMIN
SCR-F30-05
Giám sát vận chuyển, kho bãi, điểm bán
UC-F30-06
Xem Dashboard Truy vết & Thu hồi
ENTERPRISE_ADMIN
SCR-F30-06
Theo dõi truy vết, thu hồi, phân tích tác động
UC-F30-07
Xem Dashboard Tích hợp & Đồng bộ
ENTERPRISE_ADMIN
SCR-F30-07
Giám sát đồng bộ Cổng QG, chứng chỉ
UC-F30-08
Xem Dashboard Quản lý Nhà nước
SO_ADMIN, TINH_TP_ADMIN
SCR-F30-08
Giám sát tuân thủ, phủ sóng DN, KPI pháp lý
UC-F30-09
Lọc dữ liệu Dashboard
All roles
SCR-F30-01~08
Thay đổi bộ lọc (năm, quý, loại SP, DN, ...)
UC-F30-10
Export Dashboard PDF/Excel
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
SCR-F30-01~08
Xuất file báo cáo từ dashboard
UC-F30-11
Drill-down từ Dashboard
All roles
SCR-F30-01~08
Click biểu đồ/bảng để navigate đến module nguồn
7. Mô tả chi tiết Use Case
UC-F30-01: Xem Dashboard Tổng quan TXNG
Bước
Tác nhân
Hành động / Mô tả
Phản hồi / Xử lý hệ thống
Ghi chú
1
User
Truy cập menu TXNG > Dashboard & Báo cáo > Tổng quan TXNG
Hiển thị trang SCR-F30-01
Mặc định redirect từ /dashboard
2
SYSTEM
Load dữ liệu aggregate
1. Query tổng DN từ F01 (COUNT WHERE status=ACTIVE) 2. Query tỷ lệ truy xuất đạt chuẩn từ F09+F17 3. Query lô đang HĐ từ F09 4. Query lượt quét QR từ F16 5. Query thu hồi từ F13 6. Query cảnh báo từ F15
Cache TTL 5 phút
3
SYSTEM
Render dashboard
1. Hiển thị 6 stat cards (grid 3x2 desktop, 2x3 tablet, 1x6 mobile) 2. Render Line Chart xu hướng truy xuất 3. Render Donut Chart phân bố lô 4. Render Stacked Bar lô theo trạng thái 5. Render Bar Chart Top 10 DN 6. Render Table 5 cảnh báo gần nhất
Page load <= 2s
4
User
(Tùy chọn) Thay đổi bộ lọc
Xem UC-F30-09
Pre-conditions: User đã đăng nhập, có role ENTERPRISE_ADMIN hoặc SO_ADMIN hoặc TINH_TP_ADMIN
Post-conditions: Dashboard hiển thị dữ liệu aggregate từ các module nguồn
Alternative Flow:
AF-01: User không có quyền -> Hiển thị E-F30-003 "Không có quyền xem dashboard này"
AF-02: Không có dữ liệu cho kỳ đã chọn -> Hiển thị E-F30-001 "Không có dữ liệu"
AF-03: API timeout -> Hiển thị E-F30-002 "Lỗi khi tải dữ liệu", nút "Thử lại"
UC-F30-02: Xem Dashboard Sản xuất & Kế hoạch
Bước
Tác nhân
Hành động / Mô tả
Phản hồi / Xử lý hệ thống
Ghi chú
1
User
Truy cập menu Dashboard > Sản xuất & Kế hoạch
Hiển thị trang SCR-F30-02
2
SYSTEM
Load dữ liệu aggregate
1. Query tổng sản lượng từ F09+F14 2. Query số lô từ F09 3. Query năng suất từ F09+F02 4. Query KH hoàn thành từ F23 5. Query KH quá hạn từ F23 6. Query tăng trưởng so kỳ trước
3
SYSTEM
Render dashboard
1. Hiển thị 6 stat cards 2. Render 5 biểu đồ 3. Render Table KH sắp đến hạn
4
User
Click vào tên KH trong bảng
Navigate đến F23 detail page: /admin/txng/production-plans/{id}
Drill-down
Alternative Flow:
AF-01: Không có KH trong 7 ngày tới -> Table hiển thị "Không có kế hoạch sắp đến hạn"
UC-F30-08: Xem Dashboard Quản lý Nhà nước
Bước
Tác nhân
Hành động / Mô tả
Phản hồi / Xử lý hệ thống
Ghi chú
1
User
Truy cập menu Dashboard > Quản lý Nhà nước
Hiển thị trang SCR-F30-08
Chỉ SO_ADMIN/TINH_TP_ADMIN
2
SYSTEM
Load dữ liệu aggregate xuyên DN
1. Query tổng DN từ F01 (toàn địa bàn) 2. Query tỷ lệ CC hợp lệ từ F10 3. Query đồng bộ QG từ F11 4. Query truy xuất đầy đủ từ F09+F17 5. Query thu hồi từ F13 6. Query onboarding từ F27
Phạm vi theo role
3
SYSTEM
Render dashboard
1. Hiển thị 6 stat cards 2. Render Bar DN theo Q/H 3. Render Line + Bar onboarding 4. Render RadarChart 8 tiêu chí tuân thủ 5. Render Donut CC theo tiêu chuẩn 6. Render Table DN chưa tuân thủ
Radar chart: TCVN 12850
4
User
Click tên DN trong bảng
Navigate đến trang chi tiết DN
Drill-down
5
User
Click bar quận/huyện
Navigate đến danh sách DN lọc theo quận
Drill-down
Pre-conditions: User có role SO_ADMIN hoặc TINH_TP_ADMIN
Alternative Flow:
AF-01: ENTERPRISE_ADMIN truy cập -> Hiển thị E-F30-003 "Chỉ cán bộ QLNN mới có quyền xem"
UC-F30-09: Lọc dữ liệu Dashboard
Bước
Tác nhân
Hành động / Mô tả
Phản hồi / Xử lý hệ thống
Ghi chú
1
User
Thay đổi giá trị 1 hoặc nhiều bộ lọc
Hệ thống nhận thấy thay đổi
2
SYSTEM
Debounce 300ms
Chờ 300ms từ lần thay đổi cuối cùng
Tránh gọi API liên tục
3
SYSTEM
Re-fetch dữ liệu với filter mới
1. Gửi API request với query params mới 2. Hiển thị loading state trên biểu đồ
4
SYSTEM
Re-render dashboard
1. Cập nhật stat cards 2. Re-render biểu đồ với dữ liệu mới 3. Cập nhật bảng dữ liệu
Animate transition
Business Rules:
ENTERPRISE_ADMIN/USER: dữ liệu tự động lọc theo enterprise_id của DN mình
SO_ADMIN: xem dữ liệu toàn bộ DN thuộc phạm vi quản lý
TINH_TP_ADMIN: xem dữ liệu tất cả DN, tất cả bộ lọc đều có thể thay đổi
UC-F30-10: Export Dashboard PDF/Excel
Bước
Tác nhân
Hành động / Mô tả
Phản hồi / Xử lý hệ thống
Ghi chú
1
User
Click nút "Export PDF" hoặc "Export Excel"
Hệ thống bắt đầu xuất file
2
SYSTEM
Tạo file
1. Thu thập dữ liệu hiện tại (bao gồm filter đang áp dụng) 2. Render file PDF (biểu đồ + bảng) hoặc Excel (dữ liệu thô) 3. Tên file: `Dashboard_{TenDB}_{YYYYMMDD}.{pdf
xlsx}`
3
SYSTEM
Download file
1. Trả file cho user download 2. Ghi audit log:
Pre-conditions: User có role ENTERPRISE_ADMIN hoặc SO_ADMIN hoặc TINH_TP_ADMIN
Alternative Flow:
AF-01: File > 10.000 bản ghi -> Hiển thị W-F30-002 "Export file lớn, vui lòng chờ xử lý"
AF-02: ENTERPRISE_USER nhấn export -> Hiển thị E-F30-003 "Không có quyền"
AF-03: Export thất bại -> Toast error "Lỗi khi xuất file. Vui lòng thử lại."
UC-F30-11: Drill-down từ Dashboard
Bước
Tác nhân
Hành động / Mô tả
Phản hồi / Xử lý hệ thống
Ghi chú
1
User
Click vào phần tử biểu đồ (bar, segment, table row)
Hệ thống xác định context drill-down
2
SYSTEM
Map context sang URL module nguồn
1. Xác định module đích 2. Build URL với filter params
3
SYSTEM
Navigate đến module nguồn
Mở trang danh sách module nguồn với filter đã áp dụng
router.push()
Ví dụ drill-down:
Dashboard
Phần tử click
Module đích
URL
SCR-F30-01
Bar "Vinamilk"
F09 Danh sách lô
/admin/txng/batches/list?enterprise=vinamilk
SCR-F30-01
Table row cảnh báo
F15 Chi tiết batch
/admin/txng/monitoring/{batchId}/timeline
SCR-F30-02
Table row KH
F23 Chi tiết KH
/admin/txng/production-plans/{id}
SCR-F30-03
Stat "Lô sắp hết hạn"
F09 Danh sách lô
/admin/txng/batches/list?filter=expiring
SCR-F30-04
Table row QR
F16 Chi tiết QR
/admin/txng/qr-codes/{id}
SCR-F30-05
Table row đơn VC
F22 Chi tiết đơn
/admin/txng/shipment-orders/{id}
SCR-F30-06
Table row thu hồi
F13 Chi tiết thu hồi
/admin/txng/recall/{id}
SCR-F30-07
Table row phiên sync
F11 Lịch sử sync
/admin/txng/sync/national/history/{id}
SCR-F30-08
Table row DN
F01 Chi tiết DN
/admin/txng/enterprises/{id}
8. Thiết kế Database Schema
8.1. Ghi chú quan trọng
Dashboard F30 là chức năng aggregate read-only , KHÔNG tạo bảng dữ liệu mới cho nghiệp vụ. Tất cả dữ liệu được query trực tiếp từ các bảng của module F01-F29.
Tuy nhiên, cần 1 bảng phụ trợ cho tính năng bookmark filter của người dùng (phase 2), và 1 bảng audit log cho truy vết hành vi:
8.2. Mô tả bảng
8.2.1. txng_dashboard_bookmarks
Cột
Kiểu dữ liệu
Nullable
Default
Mô tả
Constraint
id
UUID
NOT NULL
gen_random_uuid()
PK
PRIMARY KEY
enterprise_id
UUID
NOT NULL
—
FK -> enterprises.id
FK, INDEX
user_id
UUID
NOT NULL
—
FK -> users.id
FK
dashboard_slug
VARCHAR(50)
NOT NULL
—
Mã dashboard
CHECK IN ('tong-quan','san-xuat-ke-hoach','lo-ma-ton-kho','ma-hoa-tem','chuoi-cung-ung','truy-vet-thu-hoi','tich-hop-dong-bo','quan-ly-nha-nuoc')
bookmark_name
VARCHAR(200)
NOT NULL
—
Tên bookmark do user đặt
filter_config
JSONB
NOT NULL
'{}'
Lưu trữ cấu hình bộ lọc
is_default
BOOLEAN
NOT NULL
false
Bookmark mặc định khi mở dashboard
created_at
TIMESTAMPTZ
NOT NULL
NOW()
Ngày tạo
updated_at
TIMESTAMPTZ
NOT NULL
NOW()
Ngày cập nhật
deleted_at
TIMESTAMPTZ
NULL
—
Soft delete
8.2.2. txng_dashboard_audit_logs
Cột
Kiểu dữ liệu
Nullable
Default
Mô tả
Constraint
id
UUID
NOT NULL
gen_random_uuid()
PK
PRIMARY KEY
enterprise_id
UUID
NOT NULL
—
FK -> enterprises.id
FK, INDEX
user_id
UUID
NOT NULL
—
FK -> users.id
FK
action
VARCHAR(20)
NOT NULL
—
Hành động
CHECK IN ('VIEW','EXPORT_PDF','EXPORT_EXCEL','FILTER','DRILL_DOWN')
dashboard_slug
VARCHAR(50)
NOT NULL
—
Dashboard nào
filter_params
JSONB
NULL
—
Bộ lọc đã áp dụng
export_filename
VARCHAR(255)
NULL
—
Tên file export (nếu action=EXPORT)
ip_address
INET
NULL
—
IP người dùng
created_at
TIMESTAMPTZ
NOT NULL
NOW()
Thời điểm
8.3. Indexes
sql -- txng_dashboard_bookmarks
CREATE INDEX idx_txng_bookmarks_user_dashboard ON txng_dashboard_bookmarks(user_id, dashboard_slug) WHERE deleted_at IS NULL ;
CREATE UNIQUE INDEX idx_txng_bookmarks_default ON txng_dashboard_bookmarks(user_id, dashboard_slug) WHERE is_default = true AND deleted_at IS NULL ;
-- txng_dashboard_audit_logs
CREATE INDEX idx_txng_audit_user ON txng_dashboard_audit_logs(enterprise_id, user_id, created_at DESC );
CREATE INDEX idx_txng_audit_action ON txng_dashboard_audit_logs(dashboard_slug, action , created_at DESC );
-- Indexes trên bảng nguồn (để tăng tốc aggregate queries) — chỉ tạo nếu chưa có
-- F09: batches
CREATE INDEX IF NOT EXISTS idx_batches_status ON batches (enterprise_id, status ) WHERE deleted_at IS NULL ;
CREATE INDEX IF NOT EXISTS idx_batches_type_month ON batches (enterprise_id, batch_type, EXTRACT( YEAR FROM created_at), EXTRACT( MONTH FROM created_at)) WHERE deleted_at IS NULL ;
CREATE INDEX IF NOT EXISTS idx_batches_expiry ON batches (enterprise_id, expiry_date ) WHERE deleted_at IS NULL AND status NOT IN ( 'RECALLED' , 'CANCELLED' );
-- F16: qr_codes
CREATE INDEX IF NOT EXISTS idx_qr_scans_date ON qr_code_scans(scanned_at:: date );
-- F13: recalls
CREATE INDEX IF NOT EXISTS idx_recalls_status ON recalls(enterprise_id, status ) WHERE deleted_at IS NULL ;
-- F22: shipment_orders
CREATE INDEX IF NOT EXISTS idx_shipments_status ON shipment_orders(enterprise_id, status ) WHERE deleted_at IS NULL ;
-- F10: certifications
CREATE INDEX IF NOT EXISTS idx_certs_expiry ON company_certifications(enterprise_id, expiry_date ) WHERE deleted_at IS NULL ;
8.4. Migration SQL
sql -- Migration: 2026_04_11_create_txng_dashboard_tables.sql
-- 1. txng_dashboard_bookmarks
CREATE TABLE IF NOT EXISTS txng_dashboard_bookmarks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
enterprise_id UUID NOT NULL REFERENCES enterprises(id),
user_id UUID NOT NULL REFERENCES users(id),
dashboard_slug VARCHAR ( 50 ) NOT NULL CHECK (dashboard_slug IN (
'tong-quan' , 'san-xuat-ke-hoach' , 'lo-ma-ton-kho' ,
'ma-hoa-tem' , 'chuoi-cung-ung' , 'truy-vet-thu-hoi' ,
'tich-hop-dong-bo' , 'quan-ly-nha-nuoc'
)),
bookmark_name VARCHAR ( 200 ) NOT NULL ,
filter_config JSONB NOT NULL DEFAULT '{}' ,
is_default BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW (),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW (),
deleted_at TIMESTAMPTZ NULL
);
CREATE INDEX idx_txng_bookmarks_user_dashboard ON txng_dashboard_bookmarks(user_id, dashboard_slug) WHERE deleted_at IS NULL ;
CREATE UNIQUE INDEX idx_txng_bookmarks_default ON txng_dashboard_bookmarks(user_id, dashboard_slug) WHERE is_default = true AND deleted_at IS NULL ;
-- 2. txng_dashboard_audit_logs
CREATE TABLE IF NOT EXISTS txng_dashboard_audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
enterprise_id UUID NOT NULL REFERENCES enterprises(id),
user_id UUID NOT NULL REFERENCES users(id),
action VARCHAR ( 20 ) NOT NULL CHECK ( action IN ( 'VIEW' , 'EXPORT_PDF' , 'EXPORT_EXCEL' , 'FILTER' , 'DRILL_DOWN' )),
dashboard_slug VARCHAR ( 50 ) NOT NULL ,
filter_params JSONB,
export_filename VARCHAR ( 255 ),
ip_address INET ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW ()
);
CREATE INDEX idx_txng_audit_user ON txng_dashboard_audit_logs(enterprise_id, user_id, created_at DESC );
CREATE INDEX idx_txng_audit_action ON txng_dashboard_audit_logs(dashboard_slug, action , created_at DESC );
9. Thiết kế API
9.1. Danh sách endpoint
Lưu ý : BE prefix thực tế là /api/v1/txng-dashboard/ (không có /dashboard/ segment). 3 endpoint module (4, 5, 8) gộp qua dispatcher /module/:slug để tái sử dụng code; path thiết kế ban đầu lệch nhưng giữ nguyên (cập nhật bảng dưới phản ánh thực tế impl).
#
Method
Endpoint
Mô tả
Auth
Roles
1
GET
/api/v1/txng-dashboard/overview
Dữ liệu Dashboard Tổng quan
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
2
GET
/api/v1/txng-dashboard/production
Dữ liệu Sản xuất & Kế hoạch
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
3
GET
/api/v1/txng-dashboard/inventory
Dữ liệu Lô mã & Tồn kho (SRS gốc gọi /batches)
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
4
GET
/api/v1/txng-dashboard/module/codes-stamps
Dữ liệu Mã hóa & Tem (SRS gốc gọi /encoding)
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
5
GET
/api/v1/txng-dashboard/module/supply-chain
Dữ liệu Chuỗi cung ứng (gồm sc-07 Map + sc-08 Widget F33)
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
6
GET
/api/v1/txng-dashboard/module/recall-trace
Dữ liệu Truy vết & Thu hồi (SRS gốc gọi /traceback)
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
7
GET
/api/v1/txng-dashboard/module/integration
Dữ liệu Tích hợp & Đồng bộ
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
8
GET
/api/v1/txng-dashboard/module/gov-monitor
Dữ liệu Quản lý Nhà nước (gồm gm-07 Map DN + gm-08 Bar district) — SRS gốc gọi /gov-oversight
Bearer Token
SO_ADMIN, TINH_TP_ADMIN
9a
GET
/api/v1/txng-dashboard/{overview|production|inventory}/export
Export Excel cho 3 dashboard custom
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
9b
GET
/api/v1/txng-dashboard/module/{slug}/export
Export Excel cho 5 module dashboard
Bearer Token
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
9c
(FE)
(jsPDF + html2canvas)
Export PDF render client-side
—
ENTERPRISE_ADMIN, SO_ADMIN, TINH_TP_ADMIN
10
GET
/api/v1/txng-dashboard/bookmarks?dashboard_slug={slug}
Danh sách bookmark của user (filter theo slug optional)
Bearer Token
All roles
11
POST
/api/v1/txng-dashboard/bookmarks
Tạo bookmark; nếu is_default=true → clear default cũ trên cùng slug
Bearer Token
All roles
12
DELETE
/api/v1/txng-dashboard/bookmarks/{id}
Soft-delete bookmark; check user_id owner
Bearer Token
All roles (owner)
13
(auto)
/api/v1/txng-dashboard/{...}/drill/:sectionId
Drill-down ranking cho 1 section
Bearer Token
(auth-as endpoint chính)
Audit logging (BR-F30-12) : mọi call view/drill/export tự động ghi txng_dashboard_audit_logs qua DashboardAuditInterceptor (async, không chặn response). Endpoint bookmark (10-12) KHÔNG ghi audit log.
Multi-tenant : filter param company_id optional — admin có thể xem toàn hệ thống; truyền company_id để drill-down 1 DN. SRS dùng tên field enterprise_id, BE DTO dùng company_id (alias đồng nghĩa).
9.2. Chi tiết API
API 1: GET /api/v1/txng/dashboard/overview
Query Parameters:
Param
Type
Required
Default
Mô tả
year
number
Có
current_year
Năm lọc
quarter
string
Không
null
Quý (Q1/Q2/Q3/Q4)
product_type
string
Không
null
Loại SP (TRONG_TROT/CHAN_NUOI/THUY_SAN/CHE_BIEN)
province_id
uuid
Không
null
Tỉnh/Thành
Response 200:
json {
"success" : true ,
"data" : {
"stat_cards" : {
"total_enterprises" : 2845 ,
"traceability_rate" : 89.5 ,
"active_batches" : 11250 ,
"total_qr_scans" : 458320 ,
"active_recalls" : 3 ,
"unresolved_alerts" : 28
},
"traceability_trend" : [
{ "month" : "T1" , "current_year" : 72.5 , "prev_year" : 65.3 },
{ "month" : "T2" , "current_year" : 74.8 , "prev_year" : 67.1 }
],
"batch_distribution" : [
{ "type" : "TRONG_TROT" , "count" : 4520 , "color" : "#2e7d32" },
{ "type" : "CHAN_NUOI" , "count" : 2180 , "color" : "#0b3d91" },
{ "type" : "THUY_SAN" , "count" : 1350 , "color" : "#0277bd" },
{ "type" : "CHE_BIEN" , "count" : 3200 , "color" : "#fb8c00" }
],
"batch_by_status_month" : [
{ "month" : "T1" , "KHOI_TAO" : 120 , "DANG_SX" : 280 , "HOAN_THANH" : 350 , "DA_XUAT_KHO" : 180 , "DA_PHAN_PHOI" : 150 }
],
"top_enterprises" : [
{ "enterprise_id" : "uuid" , "name" : "Vinamilk" , "batch_count" : 1250 }
],
"recent_alerts" : [
{
"id" : "uuid" ,
"code" : "CB-TXNG-00245" ,
"content" : "Lô rau VietGAP vượt thời gian cách ly thuốc BVTV" ,
"batch_code" : "LOT-TT-20260401-0412" ,
"alert_level" : "CAN_XU_LY" ,
"created_at" : "2026-04-10T09:15:00Z"
}
]
}
}
API 8: GET /api/v1/txng/dashboard/gov-oversight
Query Parameters:
Param
Type
Required
Default
Mô tả
year
number
Có
current_year
Năm
quarter
string
Không
null
Quý
province_id
uuid
Không
null
Tỉnh/Thành
district_id
uuid
Không
null
Quận/Huyện (cascade từ province)
standard
string
Không
null
Tiêu chuẩn (VietGAP/GlobalGAP/HACCP/ISO/Organic)
compliance_status
string
Không
null
Trạng thái tuân thủ (DAT/CHUA_DAT)
Response 200:
json {
"success" : true ,
"data" : {
"stat_cards" : {
"total_enterprises" : 2845 ,
"valid_cert_rate" : 78.5 ,
"sync_coverage" : 92.3 ,
"full_trace_rate" : 85.2 ,
"recall_incidents" : 3 ,
"new_onboarding" : 125
},
"enterprise_by_district" : [
{ "district" : "Đông Anh" , "count" : 285 }
],
"onboarding_trend" : [
{ "month" : "T1" , "cumulative" : 2100 , "new_joined" : 85 }
],
"compliance_radar" : [
{ "subject" : "Định danh GLN/GTIN" , "score" : 92 },
{ "subject" : "Ghi nhận CTE" , "score" : 85 },
{ "subject" : "KDE đầy đủ" , "score" : 78 },
{ "subject" : "Đồng bộ QG" , "score" : 88 },
{ "subject" : "Chứng nhận hợp lệ" , "score" : 72 },
{ "subject" : "Nhật ký SX" , "score" : 90 },
{ "subject" : "Truy vết < 4h" , "score" : 95 },
{ "subject" : "Mã QR/Tem" , "score" : 82 }
],
"cert_by_standard" : [
{ "standard" : "VietGAP" , "percentage" : 45 , "count" : 1250 }
],
"non_compliant_enterprises" : [
{
"id" : "uuid" ,
"name" : "Công ty TNHH Thực phẩm XYZ" ,
"tax_code" : "0102345678" ,
"district" : "Đông Anh" ,
"cert_status" : "EXPIRED" ,
"sync_status" : "ERROR" ,
"batch_count" : 45 ,
"note" : "VietGAP hết hạn 15/03/2026"
}
]
}
}
API 9: GET /api/v1/txng/dashboard/export/
Path Parameters:
Param
Type
Required
Mô tả
slug
string
Có
Dashboard slug (tong-quan, san-xuat-ke-hoach, ...)
Query Parameters:
Param
Type
Required
Default
Mô tả
format
string
Có
pdf
pdf hoặc xlsx
year
number
Có
current_year
Các filter giống API dashboard tương ứng
quarter
string
Không
null
product_type
string
Không
null
Response 200: Binary file download
Content-Type: application/pdf (hoặc application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
Content-Disposition: attachment; filename="Dashboard_Tong_Quan_TXNG_20260411.pdf"
Error Responses (chung cho tất cả API):
json // 401 Unauthorized
{
"success" : false ,
"error" : { "code" : "AUTH_REQUIRED" , "message" : "Vui lòng đăng nhập" }
}
// 403 Forbidden
{
"success" : false ,
"error" : { "code" : "FORBIDDEN" , "message" : "Không có quyền xem dashboard này" }
}
// 500 Internal Server Error
{
"success" : false ,
"error" : { "code" : "INTERNAL_ERROR" , "message" : "Lỗi khi tải dữ liệu dashboard" }
}
10. Test Cases cho QA
10.1. Dashboard Tổng quan TXNG (SCR-F30-01)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-01-01
Hiển thị Dashboard Tổng quan thành công
1. Đăng nhập với role ENTERPRISE_ADMIN 2. Truy cập TXNG > Dashboard > Tổng quan
6 stat cards hiển thị đúng, 4 biểu đồ render, table cảnh báo có dữ liệu
Cao
TC-01-02
Lọc theo năm
1. Chọn Năm = 2025 2. Xem kết quả
Tất cả dữ liệu cập nhật theo năm 2025, stat cards thay đổi
Cao
TC-01-03
Lọc theo loại sản phẩm
1. Chọn Loại SP = Trồng trọt
Dữ liệu chỉ hiển thị cho lô Trồng trọt
Cao
TC-01-04
Không có dữ liệu
1. Chọn Năm = 2020 (không có dữ liệu)
Hiển thị E-F30-001 "Không có dữ liệu cho khoảng thời gian đã chọn"
Trung bình
TC-01-05
Page load performance
1. Mở Dashboard Tổng quan
Page load hoàn thành trong <= 2 giây
Cao
TC-01-06
Responsive mobile
1. Mở Dashboard trên viewport 375px
Stat cards hiển thị 1 cột, biểu đồ có thể scroll ngang
Trung bình
TC-01-07
Drill-down từ biểu đồ
1. Click bar "Vinamilk" trên chart Top 10 DN
Navigate đến F09 list với filter enterprise=vinamilk
Cao
10.2. Dashboard Sản xuất & Kế hoạch (SCR-F30-02)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-02-01
Hiển thị Dashboard SX thành công
1. Mở Dashboard SX & KH
6 stat cards, 5 biểu đồ, table KH sắp đến hạn render đúng
Cao
TC-02-02
KH vs Thực tế chart
1. Xem Grouped Bar chart
2 series (KH/TT) hiển thị đúng theo tháng
Cao
TC-02-03
Drill-down từ table KH
1. Click tên KH trong bảng
Navigate đến F23 detail page
Trung bình
TC-02-04
Lọc theo doanh nghiệp
1. Chọn DN = "Vinamilk"
Dữ liệu chỉ hiển thị cho Vinamilk
Cao
TC-02-05
Progress bar trong table
1. Xem table KH sắp đến hạn
Progress bar hiển thị đúng %, màu theo ngưỡng (xanh>=80, vàng>=50, đỏ<50)
Trung bình
10.3. Dashboard Lô mã & Tồn kho (SCR-F30-03)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-03-01
Hiển thị Dashboard Lô mã thành công
1. Mở Dashboard Lô mã
6 stat cards, 4 biểu đồ, table lô sắp hết hạn render đúng
Cao
TC-03-02
Lô sắp hết hạn highlight
1. Xem table
Ngày hết hạn hiển thị màu đỏ, font-weight 600
Trung bình
TC-03-03
Lọc theo kho
1. Chọn Kho = "Kho Sài Đồng"
Dữ liệu tồn kho lọc theo kho đã chọn
Cao
10.4. Dashboard Mã hóa & Tem (SCR-F30-04)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-04-01
Hiển thị Dashboard Mã hóa thành công
1. Mở Dashboard Mã hóa & Tem
6 stat cards, 4 biểu đồ, table QR render đúng
Cao
TC-04-02
Line chart lượt quét 30 ngày
1. Xem Line chart
30 điểm dữ liệu, axis X là ngày, không bị trùng label
Trung bình
TC-04-03
Table QR sorted đúng
1. Xem table Top QR
Sắp xếp giảm dần theo tổng lượt quét
Cao
10.5. Dashboard Chuỗi cung ứng (SCR-F30-05)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-05-01
Hiển thị Dashboard Chuỗi cung ứng thành công
1. Mở Dashboard Chuỗi cung ứng
6 stat cards, 3 biểu đồ, 1 bảng vận chuyển render đúng
Cao
TC-05-02
Table đơn VC có đúng cột
1. Xem table
Hiển thị: Mã đơn, Lô, Nơi gửi, Nơi nhận, Tài xế, Phương tiện, TT, Thời gian
Cao
TC-05-03
Chip trạng thái đơn VC
1. Xem cột Trạng thái
Chip đúng màu: Đang VC (primary), Đã giao (success), Đã hủy (warning)
Trung bình
10.6. Dashboard Truy vết & Thu hồi (SCR-F30-06)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-06-01
Hiển thị Dashboard Truy vết thành công
1. Mở Dashboard Truy vết
6 stat cards, 4 biểu đồ, table thu hồi render đúng
Cao
TC-06-02
Dual axis Line chart
1. Xem chart Truy vết & Thu hồi
2 trục Y: Truy vết (trái), Thu hồi (phải) hiển thị đúng tỷ lệ
Cao
TC-06-03
Progress bar thu hồi
1. Xem table
Progress bar hiển thị đúng % tiến độ thu hồi
Trung bình
10.7. Dashboard Tích hợp & Đồng bộ (SCR-F30-07)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-07-01
Hiển thị Dashboard Tích hợp thành công
1. Mở Dashboard Tích hợp
6 stat cards, 4 biểu đồ, table phiên sync render đúng
Cao
TC-07-02
Error rate highlighting
1. Xem cột Tỷ lệ lỗi trong table
0% hiển thị xanh, >0% hiển thị đỏ
Trung bình
TC-07-03
Direction chip
1. Xem cột Hướng
"↑ Upload" (primary), "↓ Download" (secondary)
Trung bình
10.8. Dashboard Quản lý Nhà nước (SCR-F30-08)
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-08-01
Hiển thị Dashboard QLNN thành công
1. Đăng nhập SO_ADMIN 2. Mở Dashboard QLNN
6 stat cards, RadarChart, 4 biểu đồ, table DN render đúng
Cao
TC-08-02
Radar Chart 8 tiêu chí
1. Xem RadarChart
8 trục hiển thị đúng tên tiêu chí, giá trị 0-100
Cao
TC-08-03
ENTERPRISE_ADMIN không truy cập được
1. Đăng nhập ENTERPRISE_ADMIN 2. Truy cập Dashboard QLNN
Hiển thị E-F30-003 hoặc không hiện menu
Cao
TC-08-04
Lọc theo quận/huyện
1. Chọn Q/H = "Đông Anh"
Dữ liệu lọc chỉ DN thuộc Đông Anh
Cao
10.9. Export và Phân quyền
Mã TC
Mô tả
Bước kiểm tra
Kết quả mong đợi
Ưu tiên
TC-09-01
Export PDF thành công
1. Mở Dashboard Tổng quan 2. Click "Export PDF"
Download file PDF, tên: Dashboard_Tong_Quan_TXNG_YYYYMMDD.pdf
Cao
TC-09-02
Export Excel thành công
1. Mở Dashboard SX 2. Click "Export Excel"
Download file XLSX với dữ liệu tương ứng
Cao
TC-09-03
ENTERPRISE_USER không export
1. Đăng nhập ENTERPRISE_USER 2. Click Export
Hiển thị E-F30-003 "Không có quyền"
Cao
TC-09-04
Multi-tenant isolation
1. User DN A xem Dashboard
Chỉ thấy dữ liệu của DN A, không thấy DN B
Cao
11. Acceptance Criteria
Mã AC
Tiêu chí
Điều kiện chấp nhận
Liên kết UC
AC-F30-01
8 dashboard page load thành công
Tất cả 8 dashboard hiển thị stat cards + biểu đồ + bảng dữ liệu đúng
UC-F30-01~08
AC-F30-02
Bộ lọc hoạt động chính xác
Thay đổi bộ lọc -> dữ liệu cập nhật tương ứng, debounce 300ms
UC-F30-09
AC-F30-03
Export PDF/Excel
File download đúng format, chứa dữ liệu với filter hiện tại
UC-F30-10
AC-F30-04
Drill-down navigate
Click phần tử -> navigate đến module nguồn với filter đúng
UC-F30-11
AC-F30-05
Performance SLA
Page load <= 2s, API response <= 1s
BR-F30-10
AC-F30-06
Phân quyền đúng
ENTERPRISE chỉ xem DN mình, SO_ADMIN xem toàn bộ, DB-08 chỉ QLNN
BR-F30-03, BR-F30-04
AC-F30-07
Multi-tenant isolation
Mỗi enterprise chỉ thấy dữ liệu của mình
BR-F30-02
AC-F30-08
Responsive 3 breakpoints
Desktop (3-col stat), Tablet (2 col), Mobile (1 col) — biểu đồ có thể scroll ngang
BR-F30-07
AC-F30-09
Radar Chart tuân thủ TCVN
8 trục radar hiển thị đúng tiêu chí TCVN 12850:2019, score 0-100
UC-F30-08
AC-F30-10
Dữ liệu nhất quán
Số liệu trên dashboard = số liệu trong module nguồn tại cùng thời điểm
BR-F30-05
12. Chuyển đổi trạng thái (State Transitions)
Dashboard F30 là chức năng read-only , không có state machine riêng cho dữ liệu. Tuy nhiên, có state management cho:
12.1. Trạng thái Loading của Dashboard
[IDLE] ---> (User truy cập) ---> [LOADING] ---> (API success) ---> [LOADED]
|
+--- (API error) ---> [ERROR] ---> (User click "Thử lại") ---> [LOADING]
|
+--- (API timeout) ---> [ERROR]
[LOADED] ---> (User thay đổi filter) ---> [REFRESHING] ---> (API success) ---> [LOADED]
|
+--- (API error) ---> [LOADED] + toast warning
12.2. Trạng thái Export
[IDLE] ---> (User click Export) ---> [EXPORTING] ---> (Success) ---> [IDLE] + download file
|
+--- (Error) ---> [IDLE] + toast error
13. Notification List
Mã
Sự kiện
Kênh
Người nhận
Template
N-F30-01
Export hoàn thành (file lớn > 10.000 bản ghi)
In-app
Người thực hiện export
"Báo cáo [tên dashboard] đã sẵn sàng tải về."
N-F30-02
Dữ liệu dashboard không cập nhật > 1 giờ
In-app, Email
ENTERPRISE_ADMIN
"Cảnh báo: Dữ liệu Dashboard TXNG chưa được cập nhật từ [timestamp]. Vui lòng liên hệ admin."
N-F30-03
Chứng chỉ sắp hết hạn (hiển thị trên DB-07)
In-app
ENTERPRISE_ADMIN
"[count] chứng chỉ sắp hết hạn trong 60 ngày tới. Xem chi tiết tại Dashboard Tích hợp."
N-F30-04
Lô hàng sắp hết hạn SD (hiển thị trên DB-03)
In-app
ENTERPRISE_ADMIN
"[count] lô hàng sắp hết hạn sử dụng trong 30 ngày tới. Xem chi tiết tại Dashboard Lô mã."
14. Error / Warning Message Handling
Mã
Loại
Mô tả
Điều kiện kích hoạt
Xử lý hệ thống
E-F30-001
Error
"Không có dữ liệu cho khoảng thời gian đã chọn."
Aggregate query trả về 0 records
Hiển thị empty state với icon + text
E-F30-002
Error
"Lỗi khi tải dữ liệu dashboard. Vui lòng thử lại."
API timeout (>5s) hoặc server error 500
Hiển thị error state + nút "Thử lại"
E-F30-003
Error
"Không có quyền xem dashboard này."
User không có role phù hợp
Redirect về trang chính hoặc hiển thị 403 page
E-F30-004
Error
"Lỗi khi xuất file. Vui lòng thử lại."
Export thất bại (server error, timeout)
Toast error
W-F30-001
Warning
"Dữ liệu có thể chưa cập nhật. Lần cập nhật cuối: [timestamp]."
Auto-refresh thất bại hoặc cache quá cũ (>30 phút)
Toast warning + hiển thị timestamp cập nhật cuối
W-F30-002
Warning
"Export file lớn, vui lòng chờ xử lý."
Số bản ghi export > 10.000
Toast warning + hiển thị progress
15. Ma trận truy xuất (Traceability Matrix)
Use Case
Màn hình
Acceptance Criteria
Test Case
Error/Warning
Notification
UC-F30-01
SCR-F30-01
AC-F30-01, AC-F30-05
TC-01-01~07
E-F30-001, E-F30-002
—
UC-F30-02
SCR-F30-02
AC-F30-01, AC-F30-05
TC-02-01~05
E-F30-001, E-F30-002
—
UC-F30-03
SCR-F30-03
AC-F30-01
TC-03-01~03
E-F30-001, E-F30-002
N-F30-04
UC-F30-04
SCR-F30-04
AC-F30-01
TC-04-01~03
E-F30-001, E-F30-002
—
UC-F30-05
SCR-F30-05
AC-F30-01
TC-05-01~03
E-F30-001, E-F30-002
—
UC-F30-06
SCR-F30-06
AC-F30-01
TC-06-01~03
E-F30-001, E-F30-002
—
UC-F30-07
SCR-F30-07
AC-F30-01
TC-07-01~03
E-F30-001, E-F30-002
N-F30-03
UC-F30-08
SCR-F30-08
AC-F30-01, AC-F30-09
TC-08-01~04
E-F30-001, E-F30-002, E-F30-003
—
UC-F30-09
SCR-F30-01~08
AC-F30-02
TC-01-02~03
—
—
UC-F30-10
SCR-F30-01~08
AC-F30-03
TC-09-01~02
E-F30-004, W-F30-002
N-F30-01
UC-F30-11
SCR-F30-01~08
AC-F30-04
TC-01-07, TC-02-03
—
—
16. Quy tắc nghiệp vụ (Business Rules)
Mã
Quy tắc
Giải thích
BR-F30-01
Dashboard chỉ hiển thị dữ liệu read-only, KHÔNG cho phép sửa/xóa dữ liệu nguồn
An toàn dữ liệu — dashboard là lớp trình bày, không phải lớp thao tác
BR-F30-02
Multi-tenant isolation: mỗi aggregate query phải lọc theo enterprise_id
Bảo mật dữ liệu đa tổ chức
BR-F30-03
ENTERPRISE_ADMIN/USER chỉ xem dữ liệu thuộc DN mình
Phân quyền theo doanh nghiệp
BR-F30-04
SO_ADMIN/TINH_TP_ADMIN xem dữ liệu toàn bộ DN trên địa bàn (chỉ DB-08)
Phân quyền cấp quản lý nhà nước
BR-F30-05
Dữ liệu Dashboard phải khớp 100% với dữ liệu chi tiết trong module nguồn tại cùng thời điểm
Tính nhất quán — không được có sai lệch
BR-F30-06
Export PDF/Excel phải bao gồm: thời điểm export, bộ lọc đã áp dụng, người thực hiện
Truy vết báo cáo — audit trail
BR-F30-07
Tất cả biểu đồ phải hiển thị tooltip khi hover với giá trị chính xác
UX — người dùng cần đọc số liệu cụ thể
BR-F30-08
Dashboard DB-05 và DB-08 sử dụng Leaflet Map với markers kho/điểm bán/DN. Fallback về tọa độ trung tâm quận/huyện nếu không có GPS
Đảm bảo bản đồ luôn hiển thị dữ liệu
BR-F30-09
Click phần tử biểu đồ/bảng -> navigate đến danh sách chi tiết trong module nguồn với filter tương ứng
Drill-down — từ tổng quan đến chi tiết
BR-F30-10
Page load cho mỗi dashboard <= 2 giây, API response cho aggregate query <= 1 giây
Performance SLA
BR-F30-11
Cache TTL mặc định 5 phút cho aggregate queries. Invalidate khi dữ liệu nguồn thay đổi
Cân bằng giữa hiệu năng và độ tươi mới của dữ liệu
BR-F30-12
Radar Chart (DB-08) phải có 8 trục tương ứng 8 tiêu chí TCVN 12850:2019: Định danh GLN/GTIN, Ghi nhận CTE, KDE đầy đủ, Đồng bộ QG, Chứng nhận hợp lệ, Nhật ký SX, Truy vết < 4h, Mã QR/Tem
Tuân thủ tiêu chuẩn quốc gia
BR-F30-13
Dashboard F14 (Thống kê) và F15 (Giám sát Realtime) hiện có được GIỮ NGUYÊN — F30 là lớp tổng hợp quản lý bổ sung, không thay thế
Tương thích ngược — các dashboard tác nghiệp vẫn hoạt động
BR-F30-14
[v1.1] Widget "Điều Chuyển Nội Bộ" (SCR-F30-05 § 5.5.3) chỉ hiển thị khi enterprise có ít nhất 1 lệnh F33 (bất kỳ trạng thái) trong 30 ngày. Dữ liệu aggregate từ internal_transfers + internal_transfer_items với WHERE enterprise_id = :current_enterprise_id
Bảo mật multi-tenant + tránh widget rỗng gây nhầm lẫn
BR-F30-15
[v1.1] Widget "Cân Bằng Tồn Kho Chuỗi" (SCR-F30-05 § 5.5.4) aggregate từ store_inventory với WHERE enterprise_id = :current_enterprise_id. Ngưỡng CRITICAL/LOW/NORMAL/SURPLUS do ENTERPRISE_ADMIN cấu hình; mặc định = NULL (không tô màu). CHAIN_MANAGER có quyền xem widget này
Multi-tenant isolation + cấu hình linh hoạt theo ngành hàng
17. Ràng buộc & Giả định (Constraints / Assumptions)
17.1. Ràng buộc
#
Ràng buộc
Mô tả
1
Read-only
Dashboard KHÔNG ghi dữ liệu vào bảng nguồn (F01-F29), chỉ đọc
2
Multi-tenant
Mỗi query PHẢI có WHERE enterprise_id = :current (trừ QLNN xem toàn bộ)
3
Performance
Aggregate queries trên bảng lớn (>100K records) cần có index tối ưu
4
Browser support
Chrome 90+, Firefox 90+, Safari 14+, Edge 90+
5
Map provider
Sử dụng Leaflet + OpenStreetMap tiles (miễn phí), PostGIS cho spatial queries
6
Chart library
Sử dụng Recharts (đã có trong project)
7
Export size
PDF export giới hạn 50 trang, Excel giới hạn 100.000 bản ghi
8
Cache strategy
In-memory cache (Redis nếu có) với TTL 5 phút cho aggregate data
9
Tương thích
Giữ nguyên F14 (Thống kê) và F15 (Giám sát) — F30 không gây xung đột
17.2. Giả định
#
Giả định
Mô tả
1
Dữ liệu F01-F29 đã sẵn sàng
Các module nguồn đã có dữ liệu (ít nhất mock data) để Dashboard có thể aggregate
2
GPS có sẵn
>= 60% kho/điểm bán/DN có tọa độ GPS để bản đồ có ý nghĩa
3
User role đã cấu hình
Hệ thống phân quyền đã hoạt động, user có role và phạm vi (DN/địa bàn)
4
Internet connection
Dashboard yêu cầu kết nối internet (bản đồ tiles, API calls)
5
Screen resolution
Tối thiểu 375px width (mobile) đến 1920px (desktop)
6
Recharts đã cài đặt
Package recharts đã có trong dependencies (đã xác nhận trong project)
18. Phụ lục (Appendix)
18.1. Mapping Dashboard -> Module nguồn
Dashboard
Module nguồn
Dữ liệu aggregate
SCR-F30-01 Tổng quan
F01, F09, F12, F13, F15, F16, F17, F21
COUNT, %, SUM
SCR-F30-02 Sản xuất
F02, F05, F06, F07, F09, F14, F23
SUM, COUNT, AVG, %, GROUP BY
SCR-F30-03 Lô mã
F04, F09, F19, F25, F26
COUNT, SUM, %, status
SCR-F30-04 Mã hóa
F16, F17, F21, F25, F26
COUNT, SUM, GROUP BY
SCR-F30-05 Chuỗi cung ứng
F08, F18A, F18B, F19, F20, F22, F29
COUNT, SUM, GPS
SCR-F30-06 Truy vết
F09, F12, F13, F17
COUNT, AVG, %, progress
SCR-F30-07 Tích hợp
F10, F11, F17, F24
COUNT, %, status, error_rate
SCR-F30-08 QLNN
F01, F02, F09, F10, F11, F12, F13, F27, F28
COUNT, %, radar, cumulative
18.2. Mẫu file export PDF
┌─────────────────────────────────────────┐
│ GOTRACE — BÁO CÁO DASHBOARD TXNG │
│ Tên: [Tên Dashboard] │
│ Ngày xuất: [dd/MM/yyyy HH:mm] │
│ Người xuất: [Họ tên] ([Role]) │
│ Bộ lọc: [Năm, Quý, Loại SP, ...] │
├─────────────────────────────────────────┤
│ │
│ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │
│ │KPI1│ │KPI2│ │KPI3│ │KPI4│ │
│ └────┘ └────┘ └────┘ └────┘ │
│ │
│ ┌───────────────────────────────┐ │
│ │ Biểu đồ 1 (screenshot) │ │
│ └───────────────────────────────┘ │
│ │
│ ┌───────────────────────────────┐ │
│ │ Biểu đồ 2 (screenshot) │ │
│ └───────────────────────────────┘ │
│ │
│ ┌───────────────────────────────┐ │
│ │ Bảng dữ liệu chi tiết │ │
│ └───────────────────────────────┘ │
│ │
│ Trang [x/n] │
└─────────────────────────────────────────┘
18.3. Mã màu stat cards
Loại KPI
CSS class
Background
Text color
Icon
Tổng số (neutral)
stat-card blue
#e3f0ff
var(--c-primary)
📊
Đạt/Thành công
stat-card green
#e8f5e9
var(--c-success)
✅
Cảnh báo/Đang xử lý
stat-card orange
#fff8e1
var(--c-warning)
⚠️
Nguy hiểm/Lỗi
stat-card red
#feecec
var(--c-danger)
🚨
Thông tin bổ sung
stat-card teal
#e0f7fa
#00897b
ℹ️
18.4. Quan hệ với Dashboard hiện có
Dashboard hiện có
Mục đích
Quan hệ với F30
F14 Thống kê Sản lượng
Enterprise-level production stats
F30 DB-02 aggregate xuyên DN, drill-down đến F14
F15 Giám sát Realtime
Real-time batch kanban, alerts
F30 DB-01 tổng hợp cảnh báo, drill-down đến F15
Batches Dashboard
Batch-specific ops view
F30 DB-03 aggregate, drill-down đến batch dashboard
QR Codes Dashboard
QR-specific ops view
F30 DB-04 aggregate, drill-down đến QR dashboard
Stamps Dashboard
Stamp-specific ops view
F30 DB-04 aggregate, drill-down đến stamp dashboard
Production Plans Dashboard
Plan-specific ops view
F30 DB-02 aggregate, drill-down đến plan dashboard
18.5. 8 tiêu chí Radar Chart tuân thủ TCVN 12850:2019 (DB-08)
#
Tiêu chí
Mô tả
Công thức score (0-100)
1
Định danh GLN/GTIN
DN có mã GLN + sản phẩm có GTIN
(DN_co_GLN + SP_co_GTIN) / (total_DN + total_SP) * 100
2
Ghi nhận CTE
Sự kiện CTE được ghi nhận đầy đủ
(batches_with_CTE / total_batches) * 100
3
KDE đầy đủ
Key Data Elements đầy đủ cho mỗi CTE
(CTE_with_full_KDE / total_CTE) * 100
4
Đồng bộ QG
Dữ liệu đồng bộ thành công lên Cổng TXNG QG
sync_success_rate
5
Chứng nhận hợp lệ
DN có chứng nhận còn hiệu lực
(DN_valid_cert / total_DN) * 100
6
Nhật ký SX
DN ghi nhật ký SX đầy đủ
(batches_with_diary / total_batches) * 100
7
Truy vết < 4h
Thời gian truy vết trung bình < 4 giờ (TCVN 12850 yêu cầu)
MIN(100, (460 - avg_trace_minutes) / (4 60) * 100)
8
Mã QR/Tem
Lô hàng có mã QR hoặc tem truy xuất
(batches_with_QR_or_stamp / total_batches) * 100
Hết tài liệu SRS TXNG-F30 v1.0