vw_jw_student_change_export.sql 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. -- =============================================================================
  2. -- 学生学籍异动 + 换班级 → 教务对接宽表视图
  3. -- 说明见:学生学籍异动同步教务系统改造方案.md
  4. --
  5. -- 约定:
  6. -- * 异动前/后「校区」列为 NULL(本系统无校区字段)
  7. -- * 「异动生效学期」列保留,值为 NULL(教务可接受空值)
  8. -- * 「异动生效时间」:学籍异动 = effective_date;换班级 = effective_time(API 按年筛选)
  9. -- * 「异动类型」:输出教务系统中文名称(见 §异动类型映射)
  10. -- * 仅导出已处理:学籍 process_status = 1;换班级 status = '1'
  11. -- * 去重:同一展示学号 + 登记日 + 异动类型 仅保留 id 最小的一条(学号取 COALESCE(sc,m))
  12. -- * 学籍异动「异动前」:优先 xg_student_msg_his(处理脚本落库快照),否则回退 xg_student_msg
  13. -- * 学籍异动「异动后」:取自当前 xg_student_msg(纯学籍异动组织维度通常不变)
  14. -- * 末尾「数据来源」「来源记录id」供联调,API 层不对外返回
  15. --
  16. -- 异动类型映射(本库 → 教务附件1):
  17. -- TUI_XUE → 退学
  18. -- XIU_XUE → 休学
  19. -- FU_XUE → 复学
  20. -- BI_YE → 不同步(本库「毕业」记录不传给教务)
  21. -- 换班级记录 → 转班级
  22. --
  23. -- 执行前请确认:本库 sys_user 是否含 user_no;若无则把 COALESCE 改为仅用 user_name。
  24. -- =============================================================================
  25. DROP VIEW IF EXISTS `vw_jw_student_change_export`;
  26. CREATE VIEW `vw_jw_student_change_export` AS
  27. SELECT
  28. ANY_VALUE(`提交时间`) AS `提交时间`,
  29. ANY_VALUE(`异动生效学期`) AS `异动生效学期`,
  30. ANY_VALUE(`异动生效时间`) AS `异动生效时间`,
  31. ANY_VALUE(`异动类型`) AS `异动类型`,
  32. ANY_VALUE(`申请人学号`) AS `申请人学号`,
  33. ANY_VALUE(`姓名`) AS `姓名`,
  34. ANY_VALUE(`异动前所在年级`) AS `异动前所在年级`,
  35. ANY_VALUE(`异动前所在校区`) AS `异动前所在校区`,
  36. ANY_VALUE(`异动前所在院系`) AS `异动前所在院系`,
  37. ANY_VALUE(`异动前所在专业`) AS `异动前所在专业`,
  38. ANY_VALUE(`异动前所在班级`) AS `异动前所在班级`,
  39. ANY_VALUE(`异动前学制`) AS `异动前学制`,
  40. ANY_VALUE(`异动后所在校区`) AS `异动后所在校区`,
  41. ANY_VALUE(`异动后所在年级`) AS `异动后所在年级`,
  42. ANY_VALUE(`异动后所在班级`) AS `异动后所在班级`,
  43. ANY_VALUE(`异动后所在院系`) AS `异动后所在院系`,
  44. ANY_VALUE(`异动后所在专业`) AS `异动后所在专业`,
  45. ANY_VALUE(`异动后学制`) AS `异动后学制`,
  46. ANY_VALUE(`异动后班主任工号`) AS `异动后班主任工号`,
  47. ANY_VALUE(`异动后班主任姓名`) AS `异动后班主任姓名`,
  48. ANY_VALUE(`新名字`) AS `新名字`,
  49. ANY_VALUE(`审核状态`) AS `审核状态`,
  50. ANY_VALUE(`数据来源`) AS `数据来源`,
  51. `来源记录id`
  52. FROM (
  53. SELECT
  54. DATE(COALESCE(sc.apply_date, sc.create_time)) AS `提交时间`,
  55. (CAST(NULL AS CHAR(32) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动生效学期`,
  56. CAST(sc.effective_date AS DATETIME) AS `异动生效时间`,
  57. (CASE sc.change_type
  58. WHEN 'TUI_XUE' THEN '退学'
  59. WHEN 'XIU_XUE' THEN '休学'
  60. WHEN 'FU_XUE' THEN '复学'
  61. ELSE COALESCE(sc.change_type COLLATE utf8mb4_unicode_ci, '' COLLATE utf8mb4_unicode_ci)
  62. END COLLATE utf8mb4_unicode_ci) AS `异动类型`,
  63. (COALESCE(sc.student_no COLLATE utf8mb4_unicode_ci, m.student_no COLLATE utf8mb4_unicode_ci) COLLATE utf8mb4_unicode_ci) AS `申请人学号`,
  64. (COALESCE(mh.`name`, m.`name`) COLLATE utf8mb4_unicode_ci) AS `姓名`,
  65. (COALESCE(mh.grade, m.grade, cm_before.grade) COLLATE utf8mb4_unicode_ci) AS `异动前所在年级`,
  66. (CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动前所在校区`,
  67. (COALESCE(mh.college_name, m.college_name, cm_before.college_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在院系`,
  68. (COALESCE(mh.major_name, m.major_name, cm_before.major_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在专业`,
  69. (COALESCE(mh.class_name, m.class_name, cm_before.class_name) COLLATE utf8mb4_unicode_ci) AS `异动前所在班级`,
  70. COALESCE(cm_before.school_system, mh.school_system, m.school_system) AS `异动前学制`,
  71. (CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动后所在校区`,
  72. (COALESCE(m.grade, cm_after.grade, mh.grade) COLLATE utf8mb4_unicode_ci) AS `异动后所在年级`,
  73. (COALESCE(m.class_name, cm_after.class_name, mh.class_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在班级`,
  74. (COALESCE(m.college_name, cm_after.college_name, mh.college_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在院系`,
  75. (COALESCE(m.major_name, cm_after.major_name, mh.major_name) COLLATE utf8mb4_unicode_ci) AS `异动后所在专业`,
  76. COALESCE(cm_after.school_system, m.school_system, cm_before.school_system, mh.school_system) AS `异动后学制`,
  77. (COALESCE(
  78. NULLIF(TRIM(su.user_no COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci),
  79. su.user_name COLLATE utf8mb4_unicode_ci
  80. ) COLLATE utf8mb4_unicode_ci) AS `异动后班主任工号`,
  81. (COALESCE(m.class_teacher_name, cm_after.class_teacher_name, mh.class_teacher_name) COLLATE utf8mb4_unicode_ci) AS `异动后班主任姓名`,
  82. (CAST(NULL AS CHAR(50) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `新名字`,
  83. ('已通过' COLLATE utf8mb4_unicode_ci) AS `审核状态`,
  84. ('学籍异动' COLLATE utf8mb4_unicode_ci) AS `数据来源`,
  85. sc.id AS `来源记录id`
  86. FROM xg_student_status_change sc
  87. INNER JOIN (
  88. SELECT MIN(sc2.id) AS id
  89. FROM xg_student_status_change sc2
  90. LEFT JOIN xg_student_msg m2
  91. ON m2.id = sc2.student_id
  92. AND m2.deleted = 0
  93. AND (m2.tenant_id COLLATE utf8mb4_unicode_ci) = (sc2.tenant_id COLLATE utf8mb4_unicode_ci)
  94. WHERE sc2.deleted = 0
  95. AND sc2.process_status = 1
  96. AND sc2.effective_date IS NOT NULL
  97. AND (sc2.change_type COLLATE utf8mb4_unicode_ci) <> ('BI_YE' COLLATE utf8mb4_unicode_ci)
  98. GROUP BY
  99. COALESCE(
  100. NULLIF(
  101. TRIM(COALESCE(sc2.student_no COLLATE utf8mb4_unicode_ci, m2.student_no COLLATE utf8mb4_unicode_ci)),
  102. '' COLLATE utf8mb4_unicode_ci
  103. ),
  104. (CONCAT('__sid__', sc2.student_id) COLLATE utf8mb4_unicode_ci)
  105. ),
  106. (sc2.change_type COLLATE utf8mb4_unicode_ci),
  107. DATE(COALESCE(sc2.apply_date, sc2.create_time))
  108. ) sc_dedup ON sc.id = sc_dedup.id
  109. LEFT JOIN xg_student_msg m
  110. ON m.id = sc.student_id
  111. AND m.deleted = 0
  112. AND (m.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
  113. LEFT JOIN xg_student_msg_his mh
  114. ON mh.id = sc.student_id
  115. AND mh.deleted = 0
  116. AND (mh.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
  117. LEFT JOIN xg_class_msg cm_before
  118. ON cm_before.deleted = 0
  119. AND (cm_before.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
  120. AND cm_before.id = CAST(NULLIF(TRIM(COALESCE(mh.class_id, m.class_id) COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci) AS UNSIGNED)
  121. LEFT JOIN xg_class_msg cm_after
  122. ON cm_after.deleted = 0
  123. AND (cm_after.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
  124. AND cm_after.id = CAST(NULLIF(TRIM(m.class_id COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci) AS UNSIGNED)
  125. LEFT JOIN sys_user su
  126. ON su.user_id = COALESCE(m.class_teacher_id, cm_after.class_teacher_id)
  127. AND (su.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
  128. AND (su.tenant_id COLLATE utf8mb4_unicode_ci) = (sc.tenant_id COLLATE utf8mb4_unicode_ci)
  129. WHERE sc.deleted = 0
  130. AND sc.process_status = 1
  131. AND (sc.change_type COLLATE utf8mb4_unicode_ci) <> ('BI_YE' COLLATE utf8mb4_unicode_ci)
  132. ) sc_export
  133. GROUP BY `来源记录id`
  134. UNION ALL
  135. SELECT
  136. ANY_VALUE(`提交时间`) AS `提交时间`,
  137. ANY_VALUE(`异动生效学期`) AS `异动生效学期`,
  138. ANY_VALUE(`异动生效时间`) AS `异动生效时间`,
  139. ANY_VALUE(`异动类型`) AS `异动类型`,
  140. ANY_VALUE(`申请人学号`) AS `申请人学号`,
  141. ANY_VALUE(`姓名`) AS `姓名`,
  142. ANY_VALUE(`异动前所在年级`) AS `异动前所在年级`,
  143. ANY_VALUE(`异动前所在校区`) AS `异动前所在校区`,
  144. ANY_VALUE(`异动前所在院系`) AS `异动前所在院系`,
  145. ANY_VALUE(`异动前所在专业`) AS `异动前所在专业`,
  146. ANY_VALUE(`异动前所在班级`) AS `异动前所在班级`,
  147. ANY_VALUE(`异动前学制`) AS `异动前学制`,
  148. ANY_VALUE(`异动后所在校区`) AS `异动后所在校区`,
  149. ANY_VALUE(`异动后所在年级`) AS `异动后所在年级`,
  150. ANY_VALUE(`异动后所在班级`) AS `异动后所在班级`,
  151. ANY_VALUE(`异动后所在院系`) AS `异动后所在院系`,
  152. ANY_VALUE(`异动后所在专业`) AS `异动后所在专业`,
  153. ANY_VALUE(`异动后学制`) AS `异动后学制`,
  154. ANY_VALUE(`异动后班主任工号`) AS `异动后班主任工号`,
  155. ANY_VALUE(`异动后班主任姓名`) AS `异动后班主任姓名`,
  156. ANY_VALUE(`新名字`) AS `新名字`,
  157. ANY_VALUE(`审核状态`) AS `审核状态`,
  158. ANY_VALUE(`数据来源`) AS `数据来源`,
  159. `来源记录id`
  160. FROM (
  161. SELECT
  162. DATE(COALESCE(c.change_time, c.create_time)) AS `提交时间`,
  163. (CAST(NULL AS CHAR(32) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动生效学期`,
  164. CAST(c.effective_time AS DATETIME) AS `异动生效时间`,
  165. ('转班级' COLLATE utf8mb4_unicode_ci) AS `异动类型`,
  166. (c.student_no COLLATE utf8mb4_unicode_ci) AS `申请人学号`,
  167. (c.student_name COLLATE utf8mb4_unicode_ci) AS `姓名`,
  168. (oc.grade COLLATE utf8mb4_unicode_ci) AS `异动前所在年级`,
  169. (CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动前所在校区`,
  170. (c.original_college_name COLLATE utf8mb4_unicode_ci) AS `异动前所在院系`,
  171. (c.original_major_name COLLATE utf8mb4_unicode_ci) AS `异动前所在专业`,
  172. (c.original_class_name COLLATE utf8mb4_unicode_ci) AS `异动前所在班级`,
  173. oc.school_system AS `异动前学制`,
  174. (CAST(NULL AS CHAR(64) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `异动后所在校区`,
  175. (nc.grade COLLATE utf8mb4_unicode_ci) AS `异动后所在年级`,
  176. (c.new_class_name COLLATE utf8mb4_unicode_ci) AS `异动后所在班级`,
  177. (c.new_college_name COLLATE utf8mb4_unicode_ci) AS `异动后所在院系`,
  178. (c.new_major_name COLLATE utf8mb4_unicode_ci) AS `异动后所在专业`,
  179. nc.school_system AS `异动后学制`,
  180. (COALESCE(
  181. NULLIF(TRIM(su2.user_no COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci),
  182. su2.user_name COLLATE utf8mb4_unicode_ci
  183. ) COLLATE utf8mb4_unicode_ci) AS `异动后班主任工号`,
  184. (nc.class_teacher_name COLLATE utf8mb4_unicode_ci) AS `异动后班主任姓名`,
  185. (CAST(NULL AS CHAR(50) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci) AS `新名字`,
  186. ('已通过' COLLATE utf8mb4_unicode_ci) AS `审核状态`,
  187. ('换班级' COLLATE utf8mb4_unicode_ci) AS `数据来源`,
  188. c.id AS `来源记录id`
  189. FROM xg_student_class_change c
  190. INNER JOIN (
  191. SELECT MIN(id) AS id
  192. FROM xg_student_class_change
  193. WHERE deleted = 0
  194. AND effective_time IS NOT NULL
  195. AND (`status` COLLATE utf8mb4_unicode_ci) = ('1' COLLATE utf8mb4_unicode_ci)
  196. GROUP BY
  197. COALESCE(
  198. NULLIF(TRIM(student_no COLLATE utf8mb4_unicode_ci), '' COLLATE utf8mb4_unicode_ci),
  199. (CONCAT('__sid__', student_id) COLLATE utf8mb4_unicode_ci)
  200. ),
  201. DATE(COALESCE(change_time, create_time))
  202. ) c_dedup ON c.id = c_dedup.id
  203. LEFT JOIN xg_class_msg oc
  204. ON oc.id = c.original_class_id
  205. AND oc.deleted = 0
  206. AND (oc.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
  207. LEFT JOIN xg_class_msg nc
  208. ON nc.id = c.new_class_id
  209. AND nc.deleted = 0
  210. AND (nc.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
  211. LEFT JOIN sys_user su2
  212. ON su2.user_id = nc.class_teacher_id
  213. AND (su2.del_flag COLLATE utf8mb4_unicode_ci) = ('0' COLLATE utf8mb4_unicode_ci)
  214. AND (su2.tenant_id COLLATE utf8mb4_unicode_ci) = (c.tenant_id COLLATE utf8mb4_unicode_ci)
  215. WHERE c.deleted = 0
  216. AND (c.`status` COLLATE utf8mb4_unicode_ci) = ('1' COLLATE utf8mb4_unicode_ci)
  217. ) c_export
  218. GROUP BY `来源记录id`;
  219. -- -----------------------------------------------------------------------------
  220. -- 授权:用户 jw_cx 仅查询本视图(需使用具备 GRANT 权限的账号执行,如 root)
  221. -- -----------------------------------------------------------------------------
  222. GRANT SELECT ON `hzdyjs_xg`.`vw_jw_student_change_export` TO 'jw_cx'@'%';
  223. FLUSH PRIVILEGES;