Files
railwaysystem/docs/codebase-audit/02_training_modules_inventory.md
T

511 lines
18 KiB
Markdown
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.
# 培训业务模块与 14 组 CRUD 盘点
## 1. 审计口径
本文件来自对以下实际目录的逐项比对:
- Controller:`RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/`
- Domain:`RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/`
- Mapper:`RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/`
- Service:`RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/`
- XML:`RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/`
- 前端:`build_ui/src/views/train/`、`build_ui/src/api/train/`
- 表设计:`doc/学员管理系统数据表设计_20260907_1_.docx`
14 组后端均为同一生成式结构:分页列表、Excel 导出、详情、新增、修改、物理批量删除。未发现培训专用 DTO/VO;Controller 直接接收并返回 Domain。ServiceImpl 基本为 Mapper 委托,没有领域校验、跨表编排、事务流程或外部系统调用。
## 2. 模块逐项盘点
### 2.1 教师信息
**模块名称:** 教师信息(`train_teacher`)
**后端:**
- Controller:`TrainTeacherController`
- Service:`ITrainTeacherService`
- ServiceImpl:`TrainTeacherServiceImpl`
- Mapper:`TrainTeacherMapper`
- XML:`TrainTeacherMapper.xml`
- Domain / Entity:`TrainTeacher`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/teacher/index.vue`
- api:`build_ui/src/api/train/teacher.js`
**数据库:** 涉及表 `train_teacher`
**当前已有功能:**
1. 教师条件列表、详情、新增、修改、批量删除。
2. 基于 `@Excel` 字段注解的导出。
3. 字段覆盖工号、姓名、性别、出生日期、院系、职称、电话、邮箱及公共审计字段。
**明显缺失:**
1. 没有教师与 `sys_user` 的账号关联。
2. 没有资质/证书、状态、可授课程、授课范围及教师数据权限。
3. 删除为物理删除;无导入接口、查重与跨表引用校验。
### 2.2 学员信息
**模块名称:** 学员信息(`train_student`)
**后端:**
- Controller:`TrainStudentController`
- Service:`ITrainStudentService`
- ServiceImpl:`TrainStudentServiceImpl`
- Mapper:`TrainStudentMapper`
- XML:`TrainStudentMapper.xml`
- Domain / Entity:`TrainStudent`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/student/index.vue`
- api:`build_ui/src/api/train/student.js`
**数据库:** 涉及表 `train_student`
**当前已有功能:**
1. 学员条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存学号、姓名、性别、出生日期、院系、专业、班级、电话。
**明显缺失:**
1. 没有学员与 `sys_user` 的账号关联,也没有身份证/人脸等报到和门禁所需身份数据。
2. 没有参训/报名关系、学员在某期培训中的状态。
3. 删除为物理删除;无培训学员导入接口和重复校验。
### 2.3 课程信息
**模块名称:** 课程信息(`train_course`)
**后端:**
- Controller:`TrainCourseController`
- Service:`ITrainCourseService`
- ServiceImpl:`TrainCourseServiceImpl`
- Mapper:`TrainCourseMapper`
- XML:`TrainCourseMapper.xml`
- Domain / Entity:`TrainCourse`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/course/index.vue`
- api:`build_ui/src/api/train/course.js`
**数据库:** 涉及表 `train_course`
**当前已有功能:**
1. 课程条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 文档、视频、模型链接和模型资源 ID 以文本字段保存。
**明显缺失:**
1. 没有课程版本、章节、课次、课表、资源实体及资源关系。
2. 附件和多资源使用逗号分隔/文本 URL,没有与已有上传能力形成业务关系。
3. 无课程发布、审核、上下架等动作。
### 2.4 开班计划
**模块名称:** 开班计划(`train_class_plan`)
**后端:**
- Controller:`TrainClassPlanController`
- Service:`ITrainClassPlanService`
- ServiceImpl:`TrainClassPlanServiceImpl`
- Mapper:`TrainClassPlanMapper`
- XML:`TrainClassPlanMapper.xml`
- Domain / Entity:`TrainClassPlan`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/plan/index.vue`
- api:`build_ui/src/api/train/plan.js`
**数据库:** 涉及表 `train_class_plan`
**当前已有功能:**
1. 计划条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存单个 `c_id`、单个 `t_id`、起止时间、地点、招生人数、报名条件、状态。
**明显缺失:**
1. 一个计划只有一个课程与一个教师,不能表达一班多课、多教师、逐课次安排。
2. 没有参训名单、报名审核、开班/结班等状态动作。
3. 没有教室、实训场地、课程时间冲突校验。
### 2.5 宿舍信息
**模块名称:** 宿舍信息(`train_dormitory_info`)
**后端:**
- Controller:`TrainDormitoryInfoController`
- Service:`ITrainDormitoryInfoService`
- ServiceImpl:`TrainDormitoryInfoServiceImpl`
- Mapper:`TrainDormitoryInfoMapper`
- XML:`TrainDormitoryInfoMapper.xml`
- Domain / Entity:`TrainDormitoryInfo`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/dormitory/index.vue`(有未提交修改)
- api:`build_ui/src/api/train/dormitory.js`(未跟踪)
**数据库:** 涉及表 `train_dormitory_info`
**当前已有功能:**
1. 当前工作树页面与 API 支持宿舍列表、详情、新增、修改、删除。
2. 保存楼栋、房间号、床位总数/已用数、门锁序列号、状态。
3. Controller 同时接受 `/train/dorminfo` 与 `/train/dormitory`,该别名改动尚未提交。
**明显缺失:**
1. 当前页面没有导出按钮和 `v-hasPermi` 按钮权限控制;后端仍有导出接口。
2. 没有独立床位实体、床位占用唯一性或容量一致性校验。
3. 无楼栋/楼层层级和住宿状态流转。
### 2.6 宿舍权限分配
**模块名称:** 宿舍权限分配(`train_dorm_auth`)
**后端:**
- Controller:`TrainDormAuthController`
- Service:`ITrainDormAuthService`
- ServiceImpl:`TrainDormAuthServiceImpl`
- Mapper:`TrainDormAuthMapper`
- XML:`TrainDormAuthMapper.xml`
- Domain / Entity:`TrainDormAuth`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/auth/index.vue`
- api:`build_ui/src/api/train/auth.js`
**数据库:** 涉及表 `train_dorm_auth`
**当前已有功能:**
1. 权限记录条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存学员、计划、宿舍、床号、授权起止时间和人脸下发状态。
**明显缺失:**
1. 没有实际门锁下发接口、回调、重试、错误详情或操作流水。
2. 住宿分配与设备授权耦合在一张表,没有独立住宿分配状态。
3. 没有床位冲突、时段重叠、人员/计划/房间存在性校验。
### 2.7 教室信息
**模块名称:** 教室信息(`train_classroom_info`)
**后端:**
- Controller:`TrainClassroomInfoController`
- Service:`ITrainClassroomInfoService`
- ServiceImpl:`TrainClassroomInfoServiceImpl`
- Mapper:`TrainClassroomInfoMapper`
- XML:`TrainClassroomInfoMapper.xml`
- Domain / Entity:`TrainClassroomInfo`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/classroom/index.vue`
- api:页面实际导入 `build_ui/src/api/train/info.js`;另有未跟踪的 `classroom.js`
**数据库:** 涉及表 `train_classroom_info`
**当前已有功能:**
1. 教室列表、详情、新增、修改、删除与导出。
2. 保存名称、位置、容量、状态。
3. 当前 Controller 接受 `/train/classroominfo`、`/train/classroom`、`/train/info` 三个前缀,属于未提交兼容改动。
**明显缺失:**
1. 前后端权限分别为 `train:info:*` 和 `system:info:*`,不一致。
2. 多个 API 文件/别名并存,规范入口尚未收敛。
3. 无排课占用、时间冲突与容量校验。
### 2.8 实训场地
**模块名称:** 实训场地(`train_training_site`)
**后端:**
- Controller:`TrainTrainingSiteController`
- Service:`ITrainTrainingSiteService`
- ServiceImpl:`TrainTrainingSiteServiceImpl`
- Mapper:`TrainTrainingSiteMapper`
- XML:`TrainTrainingSiteMapper.xml`
- Domain / Entity:`TrainTrainingSite`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/site/index.vue`
- api:`build_ui/src/api/train/site.js`
**数据库:** 涉及表 `train_training_site`
**当前已有功能:**
1. 场地条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存名称、位置、容量、配套设备文本、状态。
**明显缺失:**
1. 配套设备仅为文本字段,没有设备资产关系。
2. 无场地排期、占用、冲突和容量校验。
3. 无场地类型、设备可用状态的独立管理。
### 2.9 开班报到
**模块名称:** 开班报到(`train_class_report`)
**后端:**
- Controller:`TrainClassReportController`
- Service:`ITrainClassReportService`
- ServiceImpl:`TrainClassReportServiceImpl`
- Mapper:`TrainClassReportMapper`
- XML:`TrainClassReportMapper.xml`
- Domain / Entity:`TrainClassReport`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/report/index.vue`
- api:`build_ui/src/api/train/report.js`
**数据库:** 涉及表 `train_class_report`
**当前已有功能:**
1. 报到记录条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存报到方式、设备号、时间、状态,以及宿舍/教室/场地分配 ID。
**明显缺失:**
1. 页面是人工维护 CRUD,没有身份证/人脸设备接入或回调接口。
2. 没有参训名单作为报到资格来源,也没有防重复报到与状态流转。
3. 报到事件与三类资源分配耦合,未见原子事务和容量/冲突校验。
### 2.10 电子班牌
**模块名称:** 电子班牌设备(`train_electronic_board`)
**后端:**
- Controller:`TrainElectronicBoardController`
- Service:`ITrainElectronicBoardService`
- ServiceImpl:`TrainElectronicBoardServiceImpl`
- Mapper:`TrainElectronicBoardMapper`
- XML:`TrainElectronicBoardMapper.xml`
- Domain / Entity:`TrainElectronicBoard`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/board/index.vue`
- api:`build_ui/src/api/train/board.js`
**数据库:** 涉及表 `train_electronic_board`
**当前已有功能:**
1. 班牌设备条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存序列号、绑定教室/计划、IP、显示内容、播放模式、签到类型、在线状态、最后心跳。
**明显缺失:**
1. 没有心跳上报、内容发布、设备命令、签到回调等外部接入接口。
2. 没有设备认证、签名、幂等和离线判定任务。
3. `board_playmode` 的设计注释与 `board_status` 都使用“离线/在线”语义,字段边界不清。
### 2.11 学员签到
**模块名称:** 学员签到(`train_student_checkin`)
**后端:**
- Controller:`TrainStudentCheckinController`
- Service:`ITrainStudentCheckinService`
- ServiceImpl:`TrainStudentCheckinServiceImpl`
- Mapper:`TrainStudentCheckinMapper`
- XML:`TrainStudentCheckinMapper.xml`
- Domain / Entity:`TrainStudentCheckin`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/checkin/index.vue`
- api:`build_ui/src/api/train/checkin.js`
**数据库:** 涉及表 `train_student_checkin`
**当前已有功能:**
1. 签到记录条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存计划、课程、学员、班牌、签到方式/状态,以及课次起止时间。
**明显缺失:**
1. 没有 `lesson_id`/课次实体;每条签到重复保存课程起止时间。
2. 没有设备签到接入、二维码生成/核验、迟到早退计算或补签审批。
3. 没有同一学员同一课次的唯一约束/幂等证据。
### 2.12 多类型成绩
**模块名称:** 多类型成绩(`train_score_info`)
**后端:**
- Controller:`TrainScoreInfoController`
- Service:`ITrainScoreInfoService`
- ServiceImpl:`TrainScoreInfoServiceImpl`
- Mapper:`TrainScoreInfoMapper`
- XML:`TrainScoreInfoMapper.xml`
- Domain / Entity:`TrainScoreInfo`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/score/index.vue`(未跟踪)
- api:`build_ui/src/api/train/score.js`(未跟踪)
- 只读衍生视图:`student-score/index.vue`、`course-score/index.vue`(均未跟踪)
**数据库:** 涉及表 `train_score_info`
**当前已有功能:**
1. 当前工作树有成绩列表、详情、新增、修改、删除页面/API;后端有导出接口。
2. 保存课程成绩、实训成绩、考核成绩、来源类型/系统、导入时间。
3. 学员成绩和课程成绩页面只是调用同一列表接口做筛选;课程成绩页以 `examScore` 在前端计算显示评级。
**明显缺失:**
1. 成绩页面没有按钮权限指令和导出入口,文件仍未纳入 Git。
2. 没有 Excel 导入接口、外部采集接口、错误反馈、审核/发布/锁定。
3. 没有权重、综合分公式及版本;代码未计算真正综合成绩。
### 2.13 学习时长
**模块名称:** 学习时长统计(`train_study_duration`)
**后端:**
- Controller:`TrainStudyDurationController`
- Service:`ITrainStudyDurationService`
- ServiceImpl:`TrainStudyDurationServiceImpl`
- Mapper:`TrainStudyDurationMapper`
- XML:`TrainStudyDurationMapper.xml`
- Domain / Entity:`TrainStudyDuration`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/duration/index.vue`
- api:`build_ui/src/api/train/duration.js`
**数据库:** 涉及表 `train_study_duration`
**当前已有功能:**
1. 时长记录条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存设备类型、起止时间、时长秒数和同步时间。
**明显缺失:**
1. 没有设备/外部系统上报接口、外部事件 ID、幂等与异常记录。
2. 没有由起止时间校验或计算 `study_seconds` 的业务逻辑。
3. 无汇总统计接口;所谓“统计”当前仍是明细 CRUD。
### 2.14 学员画像
**模块名称:** 学员画像(`train_student_portrait`)
**后端:**
- Controller:`TrainStudentPortraitController`
- Service:`ITrainStudentPortraitService`
- ServiceImpl:`TrainStudentPortraitServiceImpl`
- Mapper:`TrainStudentPortraitMapper`
- XML:`TrainStudentPortraitMapper.xml`
- Domain / Entity:`TrainStudentPortrait`
- DTO / VO:无
**前端:**
- views:`build_ui/src/views/train/portrait/index.vue`
- api:`build_ui/src/api/train/portrait.js`
**数据库:** 涉及表 `train_student_portrait`
**当前已有功能:**
1. 画像记录条件列表、详情、新增、修改、批量删除。
2. Excel 导出。
3. 保存总学习时长、平均成绩、签到率、标签和综合描述。
**明显缺失:**
1. 没有从签到、成绩、学习时长聚合生成画像的服务。
2. 没有指标/标签规则、版本、快照历史或生成时间。
3. 前端只是表格 CRUD,没有雷达图、趋势或画像工作台。
## 3. 14 组 CRUD 完整度
| 模块 | 数据表 | Entity | Mapper | Service | Controller | 前端 API | 前端页面 | CRUD 完整度 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 教师 | `train_teacher` | `TrainTeacher` | 接口+XML | 接口+Impl | `TrainTeacherController` | `teacher.js` | `teacher/index.vue` | 疑似生成但未接通 |
| 学员 | `train_student` | `TrainStudent` | 接口+XML | 接口+Impl | `TrainStudentController` | `student.js` | `student/index.vue` | 疑似生成但未接通 |
| 课程 | `train_course` | `TrainCourse` | 接口+XML | 接口+Impl | `TrainCourseController` | `course.js` | `course/index.vue` | 疑似生成但未接通 |
| 开班计划 | `train_class_plan` | `TrainClassPlan` | 接口+XML | 接口+Impl | `TrainClassPlanController` | `plan.js` | `plan/index.vue` | 疑似生成但未接通 |
| 宿舍 | `train_dormitory_info` | `TrainDormitoryInfo` | 接口+XML | 接口+Impl | `TrainDormitoryInfoController` | `dormitory.js`(未跟踪) | `dormitory/index.vue`(已修改) | 疑似生成但未接通 |
| 宿舍权限 | `train_dorm_auth` | `TrainDormAuth` | 接口+XML | 接口+Impl | `TrainDormAuthController` | `auth.js` | `auth/index.vue` | 疑似生成但未接通 |
| 教室 | `train_classroom_info` | `TrainClassroomInfo` | 接口+XML | 接口+Impl | `TrainClassroomInfoController`(已修改) | `info.js`(已修改) | `classroom/index.vue` | 疑似生成但未接通 |
| 实训场地 | `train_training_site` | `TrainTrainingSite` | 接口+XML | 接口+Impl | `TrainTrainingSiteController` | `site.js` | `site/index.vue` | 疑似生成但未接通 |
| 开班报到 | `train_class_report` | `TrainClassReport` | 接口+XML | 接口+Impl | `TrainClassReportController` | `report.js` | `report/index.vue` | 疑似生成但未接通 |
| 电子班牌 | `train_electronic_board` | `TrainElectronicBoard` | 接口+XML | 接口+Impl | `TrainElectronicBoardController` | `board.js` | `board/index.vue` | 疑似生成但未接通 |
| 学员签到 | `train_student_checkin` | `TrainStudentCheckin` | 接口+XML | 接口+Impl | `TrainStudentCheckinController` | `checkin.js` | `checkin/index.vue` | 疑似生成但未接通 |
| 多类型成绩 | `train_score_info` | `TrainScoreInfo` | 接口+XML | 接口+Impl | `TrainScoreInfoController`(已修改) | `score.js`(未跟踪) | `score/index.vue`(未跟踪) | 疑似生成但未接通 |
| 学习时长 | `train_study_duration` | `TrainStudyDuration` | 接口+XML | 接口+Impl | `TrainStudyDurationController` | `duration.js` | `duration/index.vue` | 疑似生成但未接通 |
| 学员画像 | `train_student_portrait` | `TrainStudentPortrait` | 接口+XML | 接口+Impl | `TrainStudentPortraitController` | `portrait.js` | `portrait/index.vue` | 疑似生成但未接通 |
### 判断说明
这里的“疑似生成但未接通”不是说缺少 CRUD 文件。相反,14 组的六类后端构件和对应前端页面/API在当前工作树都存在。采用该结论是因为:
1. 仓库没有培训表 DDL或迁移,无法证明运行数据库有表。
2. 仓库没有培训 `sys_menu`/权限初始化 SQL,前后端权限字符串还普遍不一致。
3. 成绩、宿舍 API及部分页面/Controller适配尚未提交。
4. 没有端到端测试、接口测试或当前启动验证证据。
若只按“是否具有生成器产出的 CRUD 文件”衡量,14 组均为代码层齐全;若按“用户可从菜单登录并完成 CRUD”衡量,目前没有一组可以由仓库证据确认“完整”。