refactor(gxmu): 审批链层级校验下沉到 Service,删除路径也校验剩余链

- ReviewFlowController 里约 115 行的 validateLevels / validateUpdate /
  validateBatchUpdate / validateRemaining / merge 下沉为
  ReviewFlowService.validateLevelsOnSave / OnUpdate / OnBatchUpdate / OnRemove,
  controller 只在写操作前调用一次
- remove / removeBatch 新增删除后剩余链连续性校验;删除前就已不连续的链跳过校验,
  避免存量脏数据变成「永远删不掉」
- 顺手修掉一个真缺陷:merge 会就地改 existing,导致「改名后原链剩余校验」永远不触发
  (批量路径同样先取旧标题再合并)
- 模块标题回退三份收敛成 ModuleRegistryService.titleOf(Map, module) 一处,
  ReviewFlowConfigServiceImpl / ReviewListServiceImpl 直接调用
- ReviewFlowLevelValidator 的手写 join 换成 Collectors.joining(", ")
- 回填脚本头部补「表名 → 学院文本列」对照表,注明新增表按此表同步 4 处

refs #58
This commit is contained in:
2026-11-03 23:14:24 +08:00
parent 6bfdae5787
commit 70213ab783
9 changed files with 440 additions and 193 deletions
+20
View File
@@ -14,6 +14,26 @@
-- 3) 校验与清单(只读) —— 回填率、空值清单、未匹配文本一览,抄进上线记录
-- 3) ⚠ 只执行一次,不接定时任务。
--
-- ============================================================================
-- 表名 → 学院文本列 对照表(本脚本唯一的一处机械清单,B 段兜底按它逐段复制)
--
-- ┌──────────────────────┬──────────────────────────────────┬──────────┐
-- │ 表名 │ 学院文本列(B 段兜底用) │ 列注释 │
-- ├──────────────────────┼──────────────────────────────────┼──────────┤
-- │ gxmu_sjqn │ unit_name │ 所在单位 │
-- │ gxmu_tzbcy_form │ school_name │ 学校名称 │
-- │ gxmu_qmgc_form │ school_info │ 学校、院系、年级、专业 │
-- │ gxmu_wxxzx_project │ college_grade_class │ 学院、年级、班别 │
-- └──────────────────────┴──────────────────────────────────┴──────────┘
--
-- 新增第 5 张带 college_id 的表时,按上表同步 4 处:
-- ① sql/20261110_spec58_approval_chain.sql 的加列段 + 注册表种子(has_college = 1)
-- ② 本脚本 A 段(学生档案主路径:user_id → gxmu_student.college_id)
-- ③ 本脚本 B 段(表单文本兜底:按上表的文本列 LIKE 组织名)
-- ④ 本脚本 3a / 3b / 3c / 3d(回填率、空值清单、未匹配文本、逐表计数)
-- 漏改的后果不是报错,而是新表回填率恒为 0、审批人按学院解析静默失败。
-- ============================================================================
--
-- 可重复执行:所有 UPDATE 都带「只填空、不覆盖」条件(college_id IS NULL),且不带会话状态
-- (不用临时表、不用视图),任何一句都可以单独重跑。重跑不会改掉人工修对的值。
--