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

/
Tác vụ Biểu mẫu
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êm chỉ tiêu mới

Thông báo hệ thống