SchoolData System
Data Warehouse & BI Dashboard
Bảng Danh mục Chỉ tiêu
180
Tên bảng MySQL:
9bit_sdw_dm_chitieu
Bảng Kế hoạch Năm
656
Tên bảng MySQL:
9bit_sdw_kh_nam
Bảng Thực hiện Tháng
7.004
Tên bảng MySQL:
9bit_sdw_thang
Database Schema (SQL Server Reference)
Kiến trúc dữ liệu điều hành tập trung
-- ==========================================================
-- KHO DỮ LIỆU ĐIỀU HÀNH TẬP TRUNG - DATABASE SCHEMA (SQL Server)
-- ==========================================================
-- 1. BẢNG DANH MỤC CHỈ TIÊU (DM_CHITIEU)
CREATE TABLE DM_CHITIEU (
Code VARCHAR(50) PRIMARY KEY,
TenChiTieu NVARCHAR(255) NOT NULL,
DonViTinh NVARCHAR(50),
LoaiNhom NVARCHAR(100), -- VD: Tuyển sinh, Tài chính, Lao động
PhongBanNhapLieu NVARCHAR(100), -- VD: P.NVTS, P.KTTC
ParentCode VARCHAR(50) NULL,
CONSTRAINT FK_DM_CHITIEU_Parent FOREIGN KEY (ParentCode) REFERENCES DM_CHITIEU(Code)
);
GO
-- 2. BẢNG KẾ HOẠCH NĂM (KH_NAM)
CREATE TABLE KH_NAM (
Nam INT NOT NULL,
Code VARCHAR(50) NOT NULL,
GiaTriKeHoach DECIMAL(18, 4) DEFAULT 0,
PRIMARY KEY (Nam, Code),
CONSTRAINT FK_KH_NAM_Code FOREIGN KEY (Code) REFERENCES DM_CHITIEU(Code)
);
GO
-- 3. BẢNG THỰC HIỆN THÁNG (THANG)
CREATE TABLE THANG (
Nam INT NOT NULL,
Thang INT NOT NULL CHECK (Thang >= 1 AND Thang <= 12),
Code VARCHAR(50) NOT NULL,
GiaTriPhatSinh DECIMAL(18, 4) DEFAULT 0,
TrangThai NVARCHAR(50) DEFAULT 'NhapLieu', -- NhapLieu, DaXacNhan, KhoaSo
NguoiNhap NVARCHAR(100),
NgayNhap DATETIME DEFAULT GETDATE(),
PRIMARY KEY (Nam, Thang, Code),
CONSTRAINT FK_THANG_Code FOREIGN KEY (Code) REFERENCES DM_CHITIEU(Code)
);
GO
-- VIEW 1: Lấy cấu trúc Cây Chỉ Tiêu (Đệ quy CTE)
CREATE VIEW vw_CayChiTieu AS
WITH CTE_ChiTieu AS (
SELECT Code, TenChiTieu, ParentCode, 0 AS Level, CAST(Code AS VARCHAR(MAX)) AS Path
FROM DM_CHITIEU
WHERE ParentCode IS NULL
UNION ALL
SELECT c.Code, c.TenChiTieu, c.ParentCode, p.Level + 1, p.Path + '->' + c.Code
FROM DM_CHITIEU c
INNER JOIN CTE_ChiTieu p ON c.ParentCode = p.Code
)
SELECT * FROM CTE_ChiTieu;
GO
Original System Codes
Translated to PHP and JS inside WordPress
namespace SchoolDataWarehouse.API
{
// ==========================================
// C# REPORT SERVICE CORE ROLLUP ALGORITHM
// ==========================================
public class ReportService : IReportService
{
private readonly ApplicationDbContext _context;
public ReportService(ApplicationDbContext context)
{
_context = context;
}
public async Task<List<ChiTieuReportDto>> GetDashboardReportAsync(int nam, int thang)
{
// 1. Fetch all metrics taxonomy
var allChiTieus = await _context.DmChiTieus.AsNoTracking().ToListAsync();
// 2. Fetch plans and actual data for target year
var plans = await _context.KeHoachNams.Where(x => x.Nam == nam).AsNoTracking().ToListAsync();
var actuals = await _context.Thangs.Where(x => x.Nam == nam).AsNoTracking().ToListAsync();
// 3. Build tree and evaluate leaf nodes (bottom level)
var rootNodes = BuildTreeAndCalculateLeaves(allChiTieus, plans, actuals, nam, thang, null);
// 4. Recursive post-order rollup from leaves to root
foreach (var root in rootNodes)
{
CalculateRollupBottomUp(root);
}
return rootNodes;
}
private List<ChiTieuReportDto> BuildTreeAndCalculateLeaves(...)
{
// Leaf calculation assigns plan, actual and sets YTD, QTD, 6-Month, 9-Month sums
}
private void CalculateRollupBottomUp(ChiTieuReportDto node)
{
if (node.Children == null || !node.Children.Any()) return;
foreach (var child in node.Children)
{
CalculateRollupBottomUp(child);
}
node.KeHoachNam = node.Children.Sum(c => c.KeHoachNam);
node.PhatSinhThang = node.Children.Sum(c => c.PhatSinhThang);
node.LuyKeThang = node.Children.Sum(c => c.LuyKeThang);
node.LuyKeQuy = node.Children.Sum(c => c.LuyKeQuy);
node.LuyKe6Thang = node.Children.Sum(c => c.LuyKe6Thang);
node.LuyKe9Thang = node.Children.Sum(c => c.LuyKe9Thang);
node.LuyKeNam = node.Children.Sum(c => c.LuyKeNam);
}
}
}
namespace SchoolDataWarehouse.API
{
[ApiController]
[Route("api/[controller]")]
public class ReportsController : ControllerBase
{
private readonly IReportService _reportService;
public ReportsController(IReportService reportService)
{
_reportService = reportService;
}
/// <summary>
/// GET: api/reports/dashboard?nam=2026&thang=6
/// </summary>
[HttpGet("dashboard")]
public async Task<IActionResult> GetDashboardData([FromQuery] int nam, [FromQuery] int thang)
{
try
{
if (thang < 1 || thang > 12) return BadRequest("Tháng không hợp lệ.");
if (nam < 2000 || nam > 2100) return BadRequest("Năm không hợp lệ.");
var reportData = await _reportService.GetDashboardReportAsync(nam, thang);
return Ok(new {
Success = true,
Data = reportData,
Meta = new { Nam = nam, Thang = thang, Timestamp = DateTime.UtcNow }
});
}
catch (Exception ex)
{
return StatusCode(500, new { Success = false, Error = ex.Message });
}
}
}
}
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
# ---------------------------------------------------------
# Streamlit Dashboard (BI Executive Overview)
# ---------------------------------------------------------
st.set_page_config(page_title="Executive Dashboard", layout="wide")
st.title("📊 Dashboard Quản trị Doanh nghiệp (BI)")
df = generate_mock_data()
tab1, tab2, tab3, tab4 = st.tabs(["BOD Overview", "Vận hành", "Tài chính", "Nhân sự"])
with tab1:
st.header("Tổng quan Hoạt động Kinh doanh")
col1, col2, col3, col4 = st.columns(4)
col1.metric("Tổng Doanh thu", f"{df['Tổng Doanh thu'].sum():,.2f} Trđ")
col2.metric("Tổng Chi phí", f"{df['Tổng Chi phí'].sum():,.2f} Trđ")
col3.metric("Lợi nhuận trước thuế", f"{(df['Tổng Doanh thu'].sum() - df['Tổng Chi phí'].sum()):,.2f} Trđ")
col4.metric("Tổng Tuyển sinh", f"{df['Tổng Tuyển sinh'].sum():,.0f} HV")
fig_trend = px.line(df, x='Tháng', y=['Tổng Doanh thu', 'LN01'], markers=True)
st.plotly_chart(fig_trend, use_container_width=True)
Nhập liệu & Duyệt số liệu
Hệ thống cây chỉ tiêu và kiểm soát quy trình nghiệp vụ báo cáo
| Mã CT | Tên Chỉ Tiêu | Đơn Vị Tính | Phòng Ban Nhập Liệu | Kế hoạch Năm | Phát sinh Kỳ | Trạng Thái |
|---|
Tổng Doanh Thu YTD
0 Trđ
▲ 0.0% YoY
Tổng Chi Phí YTD
0 Trđ
▼ 0.0% YoY
Lợi Nhuận trước thuế (LN01)
0 Trđ
▲ 0.0% YoY
Tổng Tuyển Sinh YTD
0 HV
▲ 0.0% YoY
Xu hướng Doanh thu (Năm nay vs Năm trước)
Theo dõi dòng tiền và mức độ tăng trưởng qua các kỳ báo cáo tháng
Biểu đồ thác nước: Phân tích chênh lệch Lợi Nhuận trước thuế
Tìm nguyên nhân biến động từ tác động doanh thu (+) và tác động chi phí (-)
Cơ cấu Doanh Thu
Tỷ trọng doanh thu đóng góp theo từng nhóm dịch vụ giáo dục
Cơ cấu Chi Phí
Tỷ trọng phân tách các đầu mục chi phí vận hành doanh nghiệp
Phễu Vận Hành Giáo Dục (Conversion Funnel)
Hiệu quả chuyển đổi học viên từ tuyển sinh, mở lớp học đến tốt nghiệp
Kết Quả Sát Hạch Cấp Bằng (Exam Results)
Tỷ lệ Đạt và Trượt sát học của hạng Ô tô (SH01) và Mô tô (SH02)
Bảng Tổng Hợp Lũy Kế Tuyển Sinh
So sánh số lượng học viên tích lũy giữa năm hiện tại và cùng kỳ năm trước
| Nhóm Tuyển Sinh | Lũy Kế Thực Tế YTD | Lũy Kế Cùng Kỳ Năm Trước | Tỷ Lệ Tăng Trưởng YoY |
|---|
Tương quan Quỹ Lương & Số lượng Lao Động
Theo dõi sự biến động của Tổng Quỹ Lương (QL - cột Bar) và Lao Động Bình Quân (LĐ02 - đường Line)
Thông báo hệ thống

