Files
railwaysystem/docs/visual/modules.html
T

564 lines
26 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>业务模块清单 (14大模块) - RailwaySystem 铁路智慧培训管理系统</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path fill='%231d4ed8' d='M12 2c-4 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h2.23l2-2H14l2 2h2v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4z'/></svg>">
<link rel="stylesheet" href="assets/docs.css">
<style>
/* 模块分类卡片样式 */
.module-group-section {
margin-bottom: 2.75rem;
}
.group-header-badge {
display: inline-flex;
align-items: center;
gap: 0.4rem;
font-size: 0.78rem;
font-weight: 700;
padding: 0.2rem 0.6rem;
border-radius: var(--radius-sm);
margin-bottom: 0.5rem;
}
.module-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
gap: 1.25rem;
margin-top: 1rem;
}
@media (max-width: 768px) {
.module-grid { grid-template-columns: 1fr; }
}
.module-card {
background: #ffffff;
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
padding: 1.25rem 1.35rem;
box-shadow: var(--shadow-card);
transition: border-color 0.15s ease, box-shadow 0.15s ease;
display: flex;
flex-direction: column;
}
.module-card:hover {
border-color: var(--border-medium);
box-shadow: var(--shadow-card-hover);
}
.module-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 0.65rem;
}
.module-title-box {
display: flex;
align-items: center;
gap: 0.65rem;
}
.module-icon {
width: 38px;
height: 38px;
border-radius: var(--radius-sm);
background: var(--rail-blue-subtle);
color: var(--rail-blue);
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1.1rem;
flex-shrink: 0;
}
.module-name-zh {
font-size: 1.05rem;
font-weight: 600;
color: var(--navy-900);
}
.module-name-en {
font-family: var(--font-mono);
font-size: 0.75rem;
color: var(--text-muted);
}
.module-summary {
font-size: 0.88rem;
color: var(--text-secondary);
line-height: 1.65;
margin-bottom: 0.85rem;
flex: 1;
}
/* 规则详情折叠器 (HTML5 details) */
details.rule-collapse {
border-top: 1px dashed var(--border-light);
padding-top: 0.65rem;
margin-top: auto;
}
details.rule-collapse summary {
cursor: pointer;
font-size: 0.8rem;
font-weight: 600;
color: var(--rail-blue);
user-select: none;
outline: none;
list-style: none;
display: flex;
align-items: center;
justify-content: space-between;
}
details.rule-collapse summary::-webkit-details-marker {
display: none;
}
details.rule-collapse summary::after {
content: '▾';
font-size: 0.9rem;
transition: transform 0.2s ease;
}
details.rule-collapse[open] summary::after {
transform: rotate(180deg);
}
.rule-content {
padding: 0.75rem 0 0.25rem;
font-size: 0.82rem;
line-height: 1.7;
color: var(--text-secondary);
}
.rule-item {
margin-bottom: 0.4rem;
}
.rule-item strong {
color: var(--navy-900);
}
</style>
</head>
<body>
<!-- 顶部主导航 -->
<nav class="navbar">
<div class="nav-brand-wrap">
<a href="index.html" class="nav-brand">
<svg viewBox="0 0 24 24"><path d="M12 2c-4 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h2.23l2-2H14l2 2h2v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4zM7.5 17c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm9 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6H6V6h12v5z"/></svg>
<div>
<div class="brand-title">RailwaySystem</div>
<div class="brand-sub">铁路智慧培训管理系统</div>
</div>
</a>
<span class="brand-pill">Final Candidate · 待正式部署</span>
</div>
<ul class="nav-menu">
<li><a href="index.html" class="nav-link">首页</a></li>
<li><a href="business-flow.html" class="nav-link">业务</a></li>
<li><a href="architecture.html" class="nav-link">系统</a></li>
<li><a href="testing.html" class="nav-link">质量</a></li>
<li><a href="release-status.html" class="nav-link">发布</a></li>
<li><a href="modules.html" class="nav-link active">14大业务模块清单</a></li>
<li><a href="data-model.html" class="nav-link">实体关系模型(ER)</a></li>
<li><a href="deployment.html" class="nav-link">部署拓扑与脚本Delta</a></li>
<li><a href="http://192.168.139.218:9980/sict/railwaysystem/-/blob/feat/cicd-pipeline/docs/handbook/08-deployment-and-release.md" target="_blank" rel="noopener noreferrer" class="nav-handbook-link">&gt; 查阅部署发布手册</a></li>
<li><a href="http://192.168.139.218:9980/sict/railwaysystem/-/blob/feat/cicd-pipeline/docs/README.md" target="_blank" rel="noopener noreferrer" class="nav-back-link">&larr; 文档中心</a></li>
</ul>
</nav>
<!-- 页面主体容器 -->
<main class="page-container">
<header class="page-hero">
<div class="hero-pretitle">Functional Domain Architecture</div>
<h1 class="hero-title-main">14 大核心业务模块清单</h1>
<p class="hero-lead-text">
按照能力域严格分为培训资源、教务编排、现场执行与数据分析 4 大分组。默认仅呈现模块标识与一句话作用,点击可展开详细业务规则与物理表。
</p>
</header>
<!-- 分组 1: 培训资源 (6个模块) -->
<section class="module-group-section" id="group-resource">
<div class="section-header">
<div>
<span class="group-header-badge" style="background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe;">Domain 1</span>
<h2 class="section-title">培训资源域 (Master Data)</h2>
<p class="section-subtitle">支撑智慧培训基地的基础人、货、场与生活主数据设施。</p>
</div>
<span class="badge badge-pass">6 模块全部实现</span>
</div>
<div class="module-grid">
<!-- 1. Teacher -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">师</div>
<div>
<div class="module-name-zh">教师管理</div>
<div class="module-name-en">Teacher</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">维护培训师资档案、所属专业领域、职称与联系方式,支撑课程主讲人指派。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>唯一性规则</strong>:教师手机号全局唯一,重复录入强行拦截 (40001)。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_teacher</code> (主键 <code>t_id</code>)</div>
<div class="rule-item"><strong>实测结论</strong>:页面访问、列表查询、手机号防重复验证通过。</div>
</div>
</details>
</div>
<!-- 2. Student -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">学</div>
<div>
<div class="module-name-zh">学员档案</div>
<div class="module-name-en">Student</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">统一管理铁路职工参训人员主档,维护所属铁路局、站段、工种及敏感身份证安全脱敏。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>脱敏与安全</strong>:身份证散列存盘,对外接口仅返回末4位脱敏掩码,杜绝明文暴露。</div>
<div class="rule-item"><strong>主档状态</strong>:维护 <code>status=1:正常</code> 与 <code>status=0:停用</code>,停用学员严禁报名。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_student</code> (主键 <code>s_id</code> 为 32 位 UUID)</div>
</div>
</details>
</div>
<!-- 3. Course -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">课</div>
<div>
<div class="module-name-zh">课程管理</div>
<div class="module-name-en">Course</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">标准化课程库管理,定义课程编码、理论与实操学时、课程类别及教材大纲。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>业务约束</strong>:课程编码全局唯一;学时 <code>c_duration</code> 必须大于 0。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_course</code> (主键 <code>c_id</code>)</div>
<div class="rule-item"><strong>实测结论</strong>:课程建档、课时汇总与状态维护通过。</div>
</div>
</details>
</div>
<!-- 4. Classroom -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">室</div>
<div>
<div class="module-name-zh">理论教室</div>
<div class="module-name-en">Classroom</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">管理基地理论教学教室,设定容纳人数、楼层门牌号并关联挂载电子班牌终端。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>容量约束</strong>:容量非空且大于 0,作为排课选址基础参考。</div>
<div class="rule-item"><strong>班牌绑定</strong>:支持绑定 0/1/N 块电子班牌,详情接口实时映射。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_classroom_info</code> (主键 <code>class_room_id</code>)</div>
</div>
</details>
</div>
<!-- 5. Site -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">场</div>
<div>
<div class="module-name-zh">实训场地</div>
<div class="module-name-en">Training Site</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">管理机务、电务、工务、供电等室外实训演练基地,支持大型特种设备实训排产。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>互斥规则</strong>:在排课中与理论教室满足严格 XOR 互斥逻辑。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_training_site</code> (主键 <code>site_id</code> 为 32 位 UUID)</div>
<div class="rule-item"><strong>实测结论</strong>:场地创建、容量校验与排课占用预警验证通过。</div>
</div>
</details>
</div>
<!-- 6. Dormitory -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">宿</div>
<div>
<div class="module-name-zh">后勤宿舍</div>
<div class="module-name-en">Dormitory</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">提供基地学员宿舍楼栋、房号与床位分配管理,联动学员报名中的住宿需求。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>业务联动</strong>:由报名表 <code>accommodation_required = 1</code> 驱动床位分配。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_dormitory_info</code> (主键 <code>dorm_id</code>), <code>train_accommodation</code></div>
<div class="rule-item"><strong>实测结论</strong>:宿舍主数据维护及入住状态管理正常。</div>
</div>
</details>
</div>
</div>
</section>
<!-- 分组 2: 教务编排 (4个模块) -->
<section class="module-group-section" id="group-scheduling">
<div class="section-header">
<div>
<span class="group-header-badge" style="background: #f0fdf4; color: #166534; border: 1px solid #bbf7d0;">Domain 2</span>
<h2 class="section-title">教务编排域 (Scheduling Core)</h2>
<p class="section-subtitle">负责计划拟定、课程师资绑定、参训名单导入及四维排课防重叠调度。</p>
</div>
<span class="badge badge-pass">4 模块全部实现</span>
</div>
<div class="module-grid">
<!-- 7. Plan -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">计</div>
<div>
<div class="module-name-zh">培训计划</div>
<div class="module-name-en">Training Plan</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">拟定培训班方案,维护班级周期、报到截止日、计划招生人数上限及全生命周期状态流转。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>状态流转</strong>:<code>0:草稿</code> &rarr; <code>1:进行中</code> &rarr; <code>2:已结束</code>。</div>
<div class="rule-item"><strong>结训保护</strong>:结训时 Plan 置为 2,锁定排课变更,批量完成活动学员。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_class_plan</code> (主键 <code>plan_id</code> 32 位 UUID)</div>
</div>
</details>
</div>
<!-- 8. PlanCourse -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">纲</div>
<div>
<div class="module-name-zh">计划课程</div>
<div class="module-name-en">Plan Course</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">构建培训计划与课程的关联映射,指派授课教师,自动汇总开班总学时。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>关联一致性</strong>:作为排课 Lesson 的外键依赖,禁止跨计划引用。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_plan_course</code> (主键 <code>plan_course_id</code>)</div>
<div class="rule-item"><strong>实测结论</strong>:课程批量绑定与学时自动联动通过。</div>
</div>
</details>
</div>
<!-- 9. Enrollment -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">名</div>
<div>
<div class="module-name-zh">参训管理</div>
<div class="module-name-en">Enrollment</div>
</div>
</div>
<span class="badge badge-pass">IMPLEMENTED</span>
</div>
<p class="module-summary">管理学员入班名单、招生容量防超额守卫,并维护学员在班级的参训状态流转。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>双重硬拦截</strong>:重复报名拦截 (40030);招生容量上限拦截 (40031)。</div>
<div class="rule-item"><strong>参训状态机</strong>:<code>0:待报到</code> &rarr; <code>1:已报到</code> &rarr; <code>2:请假</code> &rarr; <code>3:退训</code> &rarr; <code>4:已完成</code>。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_enrollment</code> (主键 <code>enrollment_id</code>)</div>
</div>
</details>
</div>
<!-- 10. Scheduling -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">排</div>
<div>
<div class="module-name-zh">排课调度</div>
<div class="module-name-en">Scheduling</div>
</div>
</div>
<span class="badge badge-pass">VERIFIED</span>
</div>
<p class="module-summary">编制每日具体课次,集成四维冲突预检机制,输出可视化聚合日课表视图。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>四维冲突预检</strong>:教师冲突硬检;教室/场地/班级重叠 Warning 提示并允许确认保存。</div>
<div class="rule-item"><strong>合规要求</strong>:严格禁止任何 force / override 违规旁路参数。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_lesson</code> (主键 <code>lesson_id</code>)</div>
</div>
</details>
</div>
</div>
</section>
<!-- 分组 3: 现场执行 (3个模块) -->
<section class="module-group-section" id="group-execution">
<div class="section-header">
<div>
<span class="group-header-badge" style="background: #fefce8; color: #854d0e; border: 1px solid #fef08a;">Domain 3</span>
<h2 class="section-title">现场执行域 (Execution & IoT)</h2>
<p class="section-subtitle">支撑学员现场核验报到、课堂考勤打卡留痕与电子班牌终端信息交互。</p>
</div>
<span class="badge badge-pass">3 模块全部通过验证</span>
</div>
<div class="module-grid">
<!-- 11. Report -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">到</div>
<div>
<div class="module-name-zh">开班报到</div>
<div class="module-name-en">Class Report</div>
</div>
</div>
<span class="badge badge-pass">VERIFIED</span>
</div>
<p class="module-summary">学员到校开班报到身份核验,强事务联动流转报名状态至已报到,防重复报到。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>强事务联动</strong>:报到写入 <code>train_class_report</code>,同时联动更新 <code>enrollment_status = 1</code> 且记录 <code>join_time</code>。</div>
<div class="rule-item"><strong>重复报到防范</strong>:已报到学员再次报到触发拦截 (40050)。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_class_report</code> (主键 <code>report_id</code>)</div>
</div>
</details>
</div>
<!-- 12. Attendance -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">勤</div>
<div>
<div class="module-name-zh">课次考勤</div>
<div class="module-name-en">Attendance</div>
</div>
</div>
<span class="badge badge-pass">VERIFIED</span>
</div>
<p class="module-summary">处理课次签到与签退打卡,保证首次打卡时间幂等性,支持人工代签审计留痕。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>打卡幂等性</strong>:重复调用签到或签退时,严格保持首次 <code>signInTime/signOutTime</code> 不变。</div>
<div class="rule-item"><strong>人工代签留痕</strong>:后台调整考勤自动置 <code>manual_flag = 1</code>,记录调整人与备注。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_student_checkin</code> (主键 <code>checkin_id</code>)</div>
</div>
</details>
</div>
<!-- 13. Board -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon">牌</div>
<div>
<div class="module-name-zh">电子班牌</div>
<div class="module-name-en">Electronic Board</div>
</div>
</div>
<span class="badge badge-pass">VERIFIED</span>
</div>
<p class="module-summary">管理挂载在教室的电子显示终端,在课表中提供智能降级映射与物联页面呈现。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>课表降级规则</strong>:0 块板为 null,恰好 1 块板为对应 SN,>1 块板降级为 null。</div>
<div class="rule-item"><strong>前端路由</strong>:前端正式路由为 <code>/equip/board</code>,对应后端接口 <code>/train/board</code>。</div>
<div class="rule-item"><strong>物理表名</strong>:<code>train_electronic_board</code> (主键 <code>board_id</code> 32 位 UUID)</div>
</div>
</details>
</div>
</div>
</section>
<!-- 分组 4: 统计分析 (1个模块/4个子视图) -->
<section class="module-group-section" id="group-analytics" style="margin-bottom: 0;">
<div class="section-header">
<div>
<span class="group-header-badge" style="background: #fdf4ff; color: #86198f; border: 1px solid #f5d0fe;">Domain 4</span>
<h2 class="section-title">数据分析域 (Analytics & Reports)</h2>
<p class="section-subtitle">聚合教务执行过程数据,提供只读统计报表与画像导出,保持架构隔离。</p>
</div>
<span class="badge badge-pass">V2 READ MODEL · PASS</span>
</div>
<div class="module-grid">
<!-- 14. Analytics -->
<div class="module-card">
<div class="module-header">
<div class="module-title-box">
<div class="module-icon" style="background: #fdf4ff; color: #86198f;">析</div>
<div>
<div class="module-name-zh">统计分析与报表</div>
<div class="module-name-en">Analytics</div>
</div>
</div>
<span class="badge badge-pass">V2 READ MODEL · PASS</span>
</div>
<p class="module-summary">涵盖报到率统计、考勤打卡统计、学员课时完成度及综合画像等只读报表展示与数据导出。</p>
<details class="rule-collapse">
<summary>查看详细规则与模型</summary>
<div class="rule-content">
<div class="rule-item"><strong>架构隔离</strong>:当前版本已完成 V2 Read Model 接入,提供稳定的只读查询与导出能力,保持数据库单向读取。</div>
<div class="rule-item"><strong>涵盖视图</strong>:Report 报到报表、Checkin 考勤报表、Duration 学时统计、Portrait 画像表 4 个视图均通过验收。</div>
<div class="rule-item"><strong>演进规划</strong>:高级画像算法模型与多维统计扩展标为 <code>RESERVED / FUTURE EXTENSION</code>。</div>
</div>
</details>
</div>
</div>
</section>
</main>
<!-- 页脚 -->
<footer class="site-footer">
<p>RailwaySystem 铁路智慧培训管理系统 · 交付候选版 (Final Candidate)</p>
<p style="margin-top: 0.35rem; color: var(--text-muted);">
模块架构指南 · <a href="http://192.168.139.218:9980/sict/railwaysystem/-/blob/feat/cicd-pipeline/docs/handbook/05-module-guide.md" target="_blank" rel="noopener noreferrer">查阅模块详细指南手册</a>
</p>
</footer>
<script src="assets/docs.js"></script>
</body>
</html>