INTERNAL DEV ONLY SRS TXNG-F30: Dashboard Tổng hợp TXNG (WBS 2.13.2)

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
}

5.0.3. ISectionMeta — đặc tả 1 AnalyticalSection ​

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)

5.5.3. Widget "Điều Chuyển Nội Bộ" — v1.1 (F33) ​

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.

5.5.4. Widget "Cân Bằng Tồn Kho Chuỗi" — v1.1 (F33) ​

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:

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:


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:


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:


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:


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:


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) / (460) * 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