This commit is contained in:
zlwu committed 2026-09-02 09:58:57 +08:00
1 parent 8f99ac7482
commit f231386592
44 files changed
+800734 -2509

No files matched your search

@@ -3,7 +3,9 @@
-- 说明见:学生学籍异动同步教务系统改造方案.md
--
-- 约定:
-- * 异动前/后「校区」列为 NULL(本系统无校区字段)
-- * 异动前/后「校区」:班级 campus_id → xg_dorm_campus.campus_name,再回退班级 campus_name
-- * 异动前/后「院系/专业」:优先 college_id、major_id → sys_dept.dept_name,再回退冗余名称
-- * 异动前/后「班级」:优先 xg_class_msg.class_name,再回退冗余名称
-- * 「异动生效学期」列保留,值为 NULL(教务可接受空值)
-- * 「异动生效时间」:学籍异动 = effective_date;换班级 = effective_time(API 按年筛选)
-- * 「异动类型」:输出教务系统中文名称(见 §异动类型映射)
@@ -65,16 +67,16 @@ SELECT
(COALESCE(sc.student_no COLLATE utf8mb4_unicode_ci, m.student_no COLLATE utf8mb4_unicode_ci) COLLATE utf8mb4_unicode_ci) AS `申请人学号`,
(COALESCE(mh.`name`, m.`name`) COLLATE utf8mb4_unicode_ci) AS `姓名`,
(COALESCE(mh.grade, m.grade, cm_before.grade) COLLATE utf8mb4_unicode_ci) AS `异动前所在年级`,
(CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动前所在校区`,
(COALESCE(mh.college_name, m.college_name, cm_before.college_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在院系`,
(COALESCE(mh.major_name, m.major_name, cm_before.major_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在专业`,
(COALESCE(mh.class_name, m.class_name, cm_before.class_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在班级`,
(COALESCE(campus_before.campus_name, cm_before.campus_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在校区`,
(COALESCE(dc_mh.dept_name, dc_cm_before.dept_name, mh.college_name, cm_before.college_name, m.college_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在院系`,
(COALESCE(dm_mh.dept_name, dm_cm_before.dept_name, mh.major_name, cm_before.major_name, m.major_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在专业`,
(COALESCE(cm_before.class_name, mh.class_name, m.class_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在班级`,
COALESCE(cm_before.school_system, mh.school_system, m.school_system) AS `异动前学制`,
(CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动后所在校区`,
(COALESCE(campus_after.campus_name, cm_after.campus_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在校区`,
(COALESCE(m.grade, cm_after.grade, mh.grade) COLLATE utf8mb4_unicode_ci) AS `异动后所在年级`,
(COALESCE(m.class_name, cm_after.class_name, mh.class_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在班级`,
(COALESCE(m.college_name, cm_after.college_name, mh.college_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在院系`,
(COALESCE(m.major_name, cm_after.major_name, mh.major_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在专业`,
(COALESCE(cm_after.class_name, m.class_name, mh.class_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在班级`,
(COALESCE(dc_m.dept_name, dc_cm_after.dept_name, m.college_name, cm_after.college_name, mh.college_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在院系`,
(COALESCE(dm_m.dept_name, dm_cm_after.dept_name, m.major_name, cm_after.major_name, mh.major_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在专业`,
COALESCE(cm_after.school_system, m.school_system, cm_before.school_system, mh.school_system) AS `异动后学制`,
(COALESCE(
NULLIF(TRIM(su.user_no COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci),
@@ -124,6 +126,44 @@ LEFT JOIN xg_class_msg cm_after
ON cm_after.deleted = 0
AND (cm_after.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
AND cm_after.id = CAST(NULLIF(TRIM(m.class_id COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci) AS UNSIGNED)
LEFT JOIN sys_dept dc_mh
ON dc_mh.dept_id = CAST(NULLIF(TRIM(mh.college_id), '') AS UNSIGNED)
AND (dc_mh.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_mh.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_mh
ON dm_mh.dept_id = CAST(NULLIF(TRIM(mh.major_id), '') AS UNSIGNED)
AND (dm_mh.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_mh.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_m
ON dc_m.dept_id = CAST(NULLIF(TRIM(m.college_id), '') AS UNSIGNED)
AND (dc_m.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_m.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_m
ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
AND (dm_m.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_m.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_cm_before
ON dc_cm_before.dept_id = cm_before.college_id
AND (dc_cm_before.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_cm_before.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_cm_before
ON dm_cm_before.dept_id = cm_before.major_id
AND (dm_cm_before.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_cm_before.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_cm_after
ON dc_cm_after.dept_id = cm_after.college_id
AND (dc_cm_after.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_cm_after.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_cm_after
ON dm_cm_after.dept_id = cm_after.major_id
AND (dm_cm_after.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_cm_after.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN xg_dorm_campus campus_before
ON campus_before.id = cm_before.campus_id
AND (campus_before.deleted COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
LEFT JOIN xg_dorm_campus campus_after
ON campus_after.id = cm_after.campus_id
AND (campus_after.deleted COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_user su
ON su.user_id = COALESCE(m.class_teacher_id, cm_after.class_teacher_id)
AND (su.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
@@ -170,16 +210,16 @@ SELECT
(c.student_no COLLATE utf8mb4_unicode_ci) AS `申请人学号`,
(c.student_name COLLATE utf8mb4_unicode_ci) AS `姓名`,
(oc.grade COLLATE utf8mb4_unicode_ci) AS `异动前所在年级`,
(CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动前所在校区`,
(c.original_college_name COLLATE utf8mb4_unicode_ci) AS `异动前所在院系`,
(c.original_major_name COLLATE utf8mb4_unicode_ci) AS `异动前所在专业`,
(c.original_class_name COLLATE utf8mb4_unicode_ci) AS `异动前所在班级`,
(COALESCE(campus_oc.campus_name, oc.campus_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在校区`,
(COALESCE(dc_oc.dept_name, dc_c_orig.dept_name, oc.college_name, c.original_college_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在院系`,
(COALESCE(dm_oc.dept_name, dm_c_orig.dept_name, oc.major_name, c.original_major_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在专业`,
(COALESCE(oc.class_name, c.original_class_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在班级`,
oc.school_system AS `异动前学制`,
(CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动后所在校区`,
(COALESCE(campus_nc.campus_name, nc.campus_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在校区`,
(nc.grade COLLATE utf8mb4_unicode_ci) AS `异动后所在年级`,
(c.new_class_name COLLATE utf8mb4_unicode_ci) AS `异动后所在班级`,
(c.new_college_name COLLATE utf8mb4_unicode_ci) AS `异动后所在院系`,
(c.new_major_name COLLATE utf8mb4_unicode_ci) AS `异动后所在专业`,
(COALESCE(nc.class_name, c.new_class_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在班级`,
(COALESCE(dc_nc.dept_name, dc_c_new.dept_name, nc.college_name, c.new_college_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在院系`,
(COALESCE(dm_nc.dept_name, dm_c_new.dept_name, nc.major_name, c.new_major_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在专业`,
nc.school_system AS `异动后学制`,
(COALESCE(
NULLIF(TRIM(su2.user_no COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci),
@@ -212,6 +252,44 @@ LEFT JOIN xg_class_msg nc
ON nc.id = c.new_class_id
AND nc.deleted = 0
AND (nc.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_oc
ON dc_oc.dept_id = oc.college_id
AND (dc_oc.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_oc.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_oc
ON dm_oc.dept_id = oc.major_id
AND (dm_oc.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_oc.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_nc
ON dc_nc.dept_id = nc.college_id
AND (dc_nc.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_nc.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_nc
ON dm_nc.dept_id = nc.major_id
AND (dm_nc.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_nc.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_c_orig
ON dc_c_orig.dept_id = c.original_college_id
AND (dc_c_orig.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_c_orig.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_c_orig
ON dm_c_orig.dept_id = c.original_major_id
AND (dm_c_orig.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_c_orig.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_c_new
ON dc_c_new.dept_id = c.new_college_id
AND (dc_c_new.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_c_new.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_c_new
ON dm_c_new.dept_id = c.new_major_id
AND (dm_c_new.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_c_new.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN xg_dorm_campus campus_oc
ON campus_oc.id = oc.campus_id
AND (campus_oc.deleted COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
LEFT JOIN xg_dorm_campus campus_nc
ON campus_nc.id = nc.campus_id
AND (campus_nc.deleted COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_user su2
ON su2.user_id = nc.class_teacher_id
AND (su2.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
@@ -4,7 +4,7 @@
--
-- 口径摘要:
-- * 身份证件类型:有 id_card 则「居民身份证」,否则 NULL
-- * 所在校区:有有效宿舍分配则取 xg_dorm_campus.campus_name,否则 NULL
-- * 所在校区:学生 class_id → xg_class_msg.campus_id → xg_dorm_campus.campus_name,再回退班级冗余 campus_name
-- * 班主任工号:class_teacher_id → sys_user.user_no(空则 user_name)
-- * 学生是否在校:默认「在校」;退学(4)、毕业(5) 为「不在校」
-- * 异动类型:固定 NULL
@@ -13,6 +13,8 @@
-- * 性别:0→男,1→女
-- * 成员1/2:父亲/母亲及关系、电话
-- * 学生当前状态:输出教务中文名称(见对接说明 §状态映射)
-- * 培养层次:班级 class_type 字典值(zsjy_education_level),非中文名称
-- * 系部/专业:优先 college_id、major_id 关联 sys_dept.dept_name;班级名称取 xg_class_msg.class_name
-- =============================================================================
DROP VIEW IF EXISTS `vw_jw_student_export`;
@@ -28,12 +30,12 @@ SELECT
ELSE (CAST(NULL AS CHAR(32) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci)
END) AS `身份证件类型`,
(m.id_card COLLATE utf8mb4_unicode_ci) AS `身份证件号`,
(COALESCE(m.class_name, cm.class_name) COLLATE utf8mb4_unicode_ci) AS `班级信息`,
(dorm.campus_name COLLATE utf8mb4_unicode_ci) AS `所在校区`,
(COALESCE(cm.class_name, m.class_name) COLLATE utf8mb4_unicode_ci) AS `班级信息`,
(COALESCE(campus_cm.campus_name, cm.campus_name) COLLATE utf8mb4_unicode_ci) AS `所在校区`,
(COALESCE(m.grade, cm.grade) COLLATE utf8mb4_unicode_ci) AS `所在年级`,
m.enrollment_year AS `入学年份`,
(COALESCE(m.college_name, cm.college_name) COLLATE utf8mb4_unicode_ci) AS `系部信息`,
(COALESCE(m.major_name, cm.major_name) COLLATE utf8mb4_unicode_ci) AS `专业信息`,
(COALESCE(dc_m.dept_name, dc_cm.dept_name, m.college_name, cm.college_name) COLLATE utf8mb4_unicode_ci) AS `系部信息`,
(COALESCE(dm_m.dept_name, dm_cm.dept_name, m.major_name, cm.major_name) COLLATE utf8mb4_unicode_ci) AS `专业信息`,
(COALESCE(NULLIF(TRIM(su.user_no), ''), su.user_name) COLLATE utf8mb4_unicode_ci) AS `班主任工号`,
(COALESCE(m.class_teacher_name, cm.class_teacher_name) COLLATE utf8mb4_unicode_ci) AS `班主任姓名`,
(CASE m.student_status
@@ -56,15 +58,7 @@ SELECT
ELSE ('在校' COLLATE utf8mb4_unicode_ci)
END) AS `学生是否在校`,
(CAST(NULL AS CHAR(32) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动类型`,
(CASE cm.class_type
WHEN '0' THEN '三年制中级技工'
WHEN '1' THEN '三年制技师'
WHEN '2' THEN '四年制高级工'
WHEN '3' THEN '五年制高级技工'
WHEN '4' THEN '六年制技师'
WHEN '5' THEN '中高职一体'
ELSE cm.class_type
END COLLATE utf8mb4_unicode_ci) AS `培养层次`,
(cm.class_type COLLATE utf8mb4_unicode_ci) AS `培养层次`,
COALESCE(cm.school_system, m.school_system) AS `学制`,
(
CASE
@@ -159,31 +153,29 @@ LEFT JOIN xg_class_msg cm
ON cm.deleted = 0
AND (cm.tenant_id COLLATE utf8mb4_unicode_ci) = (m.tenant_id COLLATE utf8mb4_unicode_ci)
AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
LEFT JOIN sys_dept dc_m
ON dc_m.dept_id = CAST(NULLIF(TRIM(m.college_id), '') AS UNSIGNED)
AND (dc_m.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_m.tenant_id COLLATE utf8mb4_unicode_ci) = (m.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_m
ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
AND (dm_m.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_m.tenant_id COLLATE utf8mb4_unicode_ci) = (m.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dc_cm
ON dc_cm.dept_id = cm.college_id
AND (dc_cm.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dc_cm.tenant_id COLLATE utf8mb4_unicode_ci) = (m.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_dept dm_cm
ON dm_cm.dept_id = cm.major_id
AND (dm_cm.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (dm_cm.tenant_id COLLATE utf8mb4_unicode_ci) = (m.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN xg_dorm_campus campus_cm
ON campus_cm.id = cm.campus_id
AND (campus_cm.deleted COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
LEFT JOIN sys_user su
ON su.user_id = COALESCE(m.class_teacher_id, cm.class_teacher_id)
AND (su.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
AND (su.tenant_id COLLATE utf8mb4_unicode_ci) = (m.tenant_id COLLATE utf8mb4_unicode_ci)
LEFT JOIN (
SELECT
dbs.student_id,
MAX(dc.campus_name) AS campus_name
FROM xg_dorm_bed_student dbs
INNER JOIN (
SELECT student_id, MAX(assign_time) AS max_assign
FROM xg_dorm_bed_student
WHERE deleted = '0'
AND (status COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
GROUP BY student_id
) latest
ON latest.student_id = dbs.student_id
AND dbs.assign_time = latest.max_assign
INNER JOIN xg_dorm_campus dc
ON dc.id = dbs.campus_id
AND (dc.deleted COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
WHERE dbs.deleted = '0'
AND (dbs.status COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
GROUP BY dbs.student_id
) dorm ON dorm.student_id = m.id
LEFT JOIN (
SELECT
sc.student_id,
@@ -20,12 +20,12 @@
| 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 |
| 8 | 异动前所在校区 | 异动前班级 `campus_id` → `xg_dorm_campus.campus_name`,再回退 `xg_class_msg.campus_name` | `xg_class_msg` + `xg_dorm_campus` |
| 9 | 异动前所在院系 | 优先 `college_id` → `sys_dept.dept_name`,再回退冗余名称;换班级用 `original_college_id` / `original_college_name` | 换班级 `xg_student_class_change`;学籍异动见 §6 |
| 10 | 异动前所在专业 | 优先 `major_id` → `sys_dept.dept_name`,再回退冗余名称 | 同上 |
| 11 | 异动前所在班级 | 优先 `xg_class_msg.class_name`,再回退冗余名称 | 同上 |
| 12 | 异动前学制 | 有则输出 | JOIN `xg_class_msg`(原 `class_id`)取 `school_system` |
| 13~18 | 异动后所在校区 / 年级 / 班级 / 院系 / 专业 / 学制 | 校区:**空**;其余:换班级用 `new_`* + 新班 `xg_class_msg`;纯学籍异动时教务若仍要求「后」与「前」一致,可用 **COALESCE(后, 前)** 或统一填「前」快照(需与教务确认) | `xg_student_class_change` + `xg_class_msg` / 约定 |
| 13~18 | 异动后所在校区 / 年级 / 班级 / 院系 / 专业 / 学制 | 校区:异动后班级 `campus_id` → `xg_dorm_campus`;院系/专业:`sys_dept`;班级:`xg_class_msg`;换班级用 `new_*` + 新班;纯学籍异动「后」取当前学生/班级 | `xg_student_class_change` + `xg_class_msg` / `sys_dept` |
| 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` 推断改名,易产生误判,不推荐作为正式口径 | 暂空或后续扩展表 |