Files
hzdyjs/docs/设计文档/database/学生学籍异动同步教务系统改造方案.md
T
2026-05-07 13:44:48 +08:00

131 lines
12 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.
# 学生学籍异动同步教务系统 — 改造方案
## 1. 背景与目标
学生信息模块支持学籍异动(退学、休学、复学、毕业)与换班级等操作,数据已落在本库多张表中。教务系统要求按固定字段接收异动数据。本方案通过**数据库视图(可再叠加物化/同步任务)**汇聚数据,供教务拉数或中间 ETL 使用。
**目标**:在不大改现有业务表的前提下,输出字段稳定、语义清晰、可逐步补全的对外视图。
---
## 2. 教务字段与本地映射总表
| 序号 | 教务字段 | 本方案取值策略 | 主要数据来源 |
| ----- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
| 1 | 提交时间 | 有则格式化为日期 `YYYY-MM-DD`(与教务示例一致);口径建议统一为「登记/创建侧」:`学籍异动` 用 `apply_date` 或 `create_time`;`换班级` 用 `change_time` 或 `create_time`(实施时二选一写死) | `xg_student_status_change` / `xg_student_class_change` |
| 2 | 异动生效学期 | **保留列,值为空**(`NULL` 或 `''`,与对方接口约定一致即可) | 常量列,不推算 |
| 3 | 异动生效时间 | **必填语义由本库生效字段承担**:学籍异动用 `effective_date`;换班级用 `effective_time`(类型统一为 `DATETIME` 便于对接) | 同上两表 |
| 4 | 异动类型 | 代码值需与教务「附件1」枚举对齐;本库:`TUI_XUE`/`XIU_XUE`/`FU_XUE`/`BI_YE`;换班级单独一类(见 §4) | `change_type` + 来源标识 |
| 5 | 申请人学号 | 直接输出 | `student_no` |
| 6 | 姓名 | 输出异动当时姓名:换班级表有 `student_name`;学籍异动可 `JOIN xg_student_msg` 取当前 `name`(若需「当时」姓名需后续增强,见 §6) | 业务表 + `xg_student_msg` |
| 7 | 异动前所在年级 | 有则输出 | 换班级:`original_`* 无年级时 JOIN 原班级 `xg_class_msg.grade`;学籍异动:见 §6 |
| 8 | 异动前所在校区 | **暂不填写,恒为空** | `NULL` |
| 9 | 异动前所在院系 | 有则输出 | 换班级 `original_college_name`;学籍异动见 §6 |
| 10 | 异动前所在专业 | 有则输出 | 换班级 `original_major_name`;学籍异动见 §6 |
| 11 | 异动前所在班级 | 有则输出 | 换班级 `original_class_name`;学籍异动见 §6 |
| 12 | 异动前学制 | 有则输出 | JOIN `xg_class_msg`(原 `class_id`)取 `school_system` |
| 13~18 | 异动后所在校区 / 年级 / 班级 / 院系 / 专业 / 学制 | 校区:**空**;其余:换班级用 `new_`* + 新班 `xg_class_msg`;纯学籍异动时教务若仍要求「后」与「前」一致,可用 **COALESCE(后, 前)** 或统一填「前」快照(需与教务确认) | `xg_student_class_change` + `xg_class_msg` / 约定 |
| 19 | 异动后班主任工号 | 有则输出 | `class_teacher_id` → `sys_user.user_no`(需业务确认教师工号存于 `user_no`) |
| 20 | 异动后班主任姓名 | 有则输出 | `xg_class_msg.class_teacher_name` 或 `xg_student_msg.class_teacher_name` |
| 21 | 新名字 | 选填;无独立「改名流水」时建议 **NULL**;若仅用 `former_name`/`name` 推断改名,易产生误判,不推荐作为正式口径 | 暂空或后续扩展表 |
| 22 | 审核状态 | 默认「已通过」或空 | 常量或扩展字段 |
---
## 3. 数据源与表关系(现状)
| 表名 | 用途 |
| -------------------------- | ---------------------------------------------------------------------------- |
| `xg_student_status_change` | 退学、休学、复学、毕业;含 `effective_date`、`apply_date`、`change_type`、`process_status` 等 |
| `xg_student_class_change` | 换班级前后学院/专业/班级;含 `effective_time`、`status`、`student_name` 等 |
| `xg_student_msg` | 学生当前快照(学号、姓名、班级冗余字段等) |
| `xg_class_msg` | 班级学制、年级、班主任等 |
| `sys_user` | 班主任用户编号 `user_no`(作工号来源,需确认) |
说明:批量处理脚本会向 `xg_student_msg_his` 备份快照;**仅学籍异动**的「异动前」若依赖历史表,需严格定义「取哪一条 his」的规则(见 §6),否则易产生歧义。
---
## 4. 异动类型(与教务对齐)
- **学籍四类**:将 `TUI_XUE`、`XIU_XUE`、`FU_XUE`、`BI_YE` 映射为教务附件中的编码(映射表建议单独维护:字典表或视图内 `CASE`,以教务最终码表为准)。
- **换班级**:单独一种教务类型码;来源为 `xg_student_class_change`(勿与表中 `change_type` 1–4「申请类型」混淆,视图层用常量或别名列区分「业务异动类型」)。
「复学并换班级」会同时存在学籍记录与换班级记录:导出时需约定 **两条都出** 或 **合并为一条**(建议与教务约定后,在视图或同步 SQL 中写死规则)。
---
## 5. 视图设计方案
### 5.1 原则
- 对外**一张宽表视图**(或一张视图 `UNION ALL` 两段子查询),列名与教务一致或建中间映射层。
- **校区列保留**,值为 `NULL`。
- **异动生效学期列保留**,值为 `NULL`。
- **异动生效时间**为真实业务时间,来自库表(见 §2)。
### 5.2 建议结构
1. **子视图 A**:`xg_student_status_change`
- 关联 `xg_student_msg`(学号、姓名、当前组织维度作「前/后」占位时的来源,按 §6)。
- `异动生效学期` → `NULL`;`异动前/后校区` → `NULL`;`异动生效时间` → `CAST(effective_date AS DATETIME)`(若原列为 `DATE`,统一 cast)。
2. **子视图 B**:`xg_student_class_change`
- `LEFT JOIN xg_class_msg` 原班 `oc`:`oc.id = original_class_id`
- `LEFT JOIN xg_class_msg` 新班 `nc`:`nc.id = new_class_id`
- 前/后年级、学制、班主任工号(经 `sys_user`)等从 `oc`/`nc` 补全。
- `异动生效学期` → `NULL`;校区 → `NULL`;`异动生效时间` → `effective_time`。
3. **总视图**:`UNION ALL` A、B,列顺序与类型完全一致。
### 5.3 过滤条件(建议)
- 仅同步已办结数据:学籍 `process_status = 1`;换班级 `status = '1'`。
- 排除逻辑删除:`deleted = 0`(各表按项目规范)。
### 5.4 交付物
- **视图 DDL 脚本**:[`vw_jw_student_change_export.sql`](./vw_jw_student_change_export.sql)(视图名 `vw_jw_student_change_export`,含验证用 `数据来源` / `来源记录id` 两列,对接教务时可删列重建视图)。
- 可选:`COMMENT ON` 或建表注释说明每列口径。
---
## 6. 风险与后续增强(摘要)
| 项 | 说明 |
| ------------- | ----------------------------------------------------------------------------- |
| 纯学籍异动的「异动前」组织 | 若业务未保证每次写 `xg_student_msg_his`,视图可能缺「前」;建议长期在异动落表时**冗余写入前后快照**或依赖可靠 his 关联规则。 |
| 校区 | 当前方案恒空;将来可在 `xg_class_msg` 或学院维度补 `campus_id/name` 后改视图即可。 |
| 异动生效学期 | 当前恒空;将来有校历维表后,可只改视图计算逻辑,不必改业务表。 |
| 改名 | 无流水则「新名字」保持空;需要时增加改名记录表或审计。 |
| 班主任工号 | 确认 `sys_user.user_no` 与教务工号一致;否则增加教师工号字段或映射表。 |
---
## 7. 实施步骤建议
1. 与教务确认:**空学期、空校区**是否接口可接受;**异动后**字段在退学等场景下是否允许与「异动前」相同或填空。
2. 定稿 **教务异动类型码** 与本地 `change_type`/换班级 的映射。
3. 编写并评审 **视图 DDL**(含 `UNION ALL`、JOIN、`NULL` 列、时间统一、已处理过滤)。
4. 在测试库用真实数据抽样校验:换班级、仅休学、复学并换班级、毕业等各一条。
5. 对接方式落地:教务定时拉视图 / 中间库同步 / 应用定时任务读视图写入对方库。
---
## 8. 文档维护
- API 行为未变时,**可不修改** `docs/开发文档/API/学生学籍异动与换班级API.md`。
- 视图 DDL 落地后,在本文件「修订记录」中追加日期与变更说明。
| 日期 | 修订内容 |
| ---------- | ------------------------------------------------------------ |
| 2026-05-07 | 初稿:汇聚视图方案;校区、生效学期为空;生效时间取自 `effective_date`/`effective_time` |
| 2026-05-07 | 补充:`vw_jw_student_change_export.sql` 可执行 DDL |