Files
tuanwei-java/sql/20261110_spec58_approval_chain.sql
T

200 lines
11 KiB
SQL
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.
-- spec #58 / T1:审批链就地收敛的 schema 变更(ADR 0006)
-- 内容:
-- 1) gxmu_review_flow 增加 reviewer_rule(审批人规则,为空时回退 review_user_id)
-- 2) 4 张在跑业务表增加 college_id(学院标识,指向 sys_organization.organization_id)
-- 3) 新建 gxmu_module_registry(模块注册表)并写入 12 个模块的初始数据
-- 4) 注册表增加 has_college(该模块的业务表是否有 college_id),4 张在跑表置 1
--
-- 重复执行:加列前用 information_schema 判存(MySQL 5.7 不支持 ADD COLUMN IF NOT EXISTS),
-- 建表用 IF NOT EXISTS,初始数据用 INSERT IGNORE;
-- 因此本脚本可重复执行,且不会覆盖后台已修改过的注册表行。
-- 依赖:MySQL 5.7+,执行时会话的 DATABASE() 必须指向业务库。
-- 校验:文件末尾「执行后校验」段落,逐条执行后应满足注释里的期望。
-- 注意:本脚本不含存量回填;college_id 由 #64 的一次性回填脚本按学生档案写入。
SET @db = DATABASE();
-- ------------------------------------------------------------------
-- 1) 审批链配置:审批人规则
-- 语法见 ADR 0006:';' 分隔可拼装多段,USER:<userId> 固定人,
-- COLLEGE_ROLE:<roleCode> 按申报人学院组织子树找持角色的人;为空回退 review_user_id。
-- ------------------------------------------------------------------
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'gxmu_review_flow' AND COLUMN_NAME = 'reviewer_rule'
),
'SELECT 1',
'ALTER TABLE gxmu_review_flow ADD COLUMN reviewer_rule VARCHAR(255) NULL COMMENT ''审批人规则,;分隔:USER:<userId> / COLLEGE_ROLE:<roleCode>;为空回退 review_user_id'''
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ------------------------------------------------------------------
-- 2) 4 张在跑业务表的学院标识
-- 允许为空:存量数据与无班级数据的研究生记录暂时匹配不到学院,
-- 由 #64 回填脚本按学生档案写入,匹配不到的留空并输出清单。
-- ------------------------------------------------------------------
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'gxmu_sjqn' AND COLUMN_NAME = 'college_id'
),
'SELECT 1',
'ALTER TABLE gxmu_sjqn ADD COLUMN college_id INT NULL COMMENT ''学院标识,指向 sys_organization.organization_id'''
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'gxmu_tzbcy_form' AND COLUMN_NAME = 'college_id'
),
'SELECT 1',
'ALTER TABLE gxmu_tzbcy_form ADD COLUMN college_id INT NULL COMMENT ''学院标识,指向 sys_organization.organization_id'''
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'gxmu_qmgc_form' AND COLUMN_NAME = 'college_id'
),
'SELECT 1',
'ALTER TABLE gxmu_qmgc_form ADD COLUMN college_id INT NULL COMMENT ''学院标识,指向 sys_organization.organization_id'''
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'gxmu_wxxzx_project' AND COLUMN_NAME = 'college_id'
),
'SELECT 1',
'ALTER TABLE gxmu_wxxzx_project ADD COLUMN college_id INT NULL COMMENT ''学院标识,指向 sys_organization.organization_id'''
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ------------------------------------------------------------------
-- 3) 模块注册表:模块元数据的唯一来源
-- module 同时是业务表名,table_name 与 module 不一致会在启动期直接失败(ADR 0006)。
-- detail_key 对应 moduleDetailConfig.ts 的配置键;export_template 留空表示走默认导出。
-- has_college=1 表示该模块的业务表有 college_id,审批人解析才去读学院上下文;
-- 后端不再维护「哪几张表有学院标识」的模块白名单,新增表只改注册表一行。
-- ------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS gxmu_module_registry (
id int NOT NULL AUTO_INCREMENT,
module varchar(64) NOT NULL COMMENT '模块标识,同时是业务表名',
table_name varchar(64) NOT NULL COMMENT '业务表名,必须与 module 一致',
title varchar(100) NOT NULL COMMENT '模块标题',
detail_key varchar(64) NOT NULL COMMENT '详情页配置键(moduleDetailConfig.ts)',
export_template varchar(100) DEFAULT NULL COMMENT '导出模板标识',
has_college tinyint NOT NULL DEFAULT '0' COMMENT '业务表是否有 college_id:0否 1是',
enabled tinyint NOT NULL DEFAULT '1' COMMENT '是否启用:0否 1是',
sort_number int NOT NULL DEFAULT '0' COMMENT '排序号,小的在前',
deleted tinyint NOT NULL DEFAULT '0' COMMENT '删除标记:0未删 1已删',
tenant_id int NOT NULL DEFAULT '1' COMMENT '租户id',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
user_id int DEFAULT NULL COMMENT '创建人',
PRIMARY KEY (id),
UNIQUE KEY uk_module (module)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='模块注册表';
-- 已有库补列:gxmu_module_registry 可能已由上一版脚本建好,CREATE TABLE IF NOT EXISTS 不会补列
SET @sql = IF(
EXISTS(
SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'gxmu_module_registry' AND COLUMN_NAME = 'has_college'
),
'SELECT 1',
'ALTER TABLE gxmu_module_registry ADD COLUMN has_college tinyint NOT NULL DEFAULT ''0'' COMMENT ''业务表是否有 college_id:0否 1是'''
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 初始数据:10 个 gxmu 模块 + cms_manuscript(共 11 行)。
-- 注意:gxmu_tygl 只是前端详情配置里的别名(= gxmu_tygl_form),没有独立业务表,不登记。
-- title 取自 ReviewFlowConfigServiceImpl.MODULE_NAME_MAP,detail_key 与 moduleDetailConfig.ts 的键一致。
-- enabled=1(5 行):4 条在跑的 gxmu 审批链 + 稿件(cms_manuscript 有 review_flow_config 配置、当前就在审核下拉里,
-- 停用会让「稿件」从审核筛选里静默消失)。
-- enabled=0(6 行):5 个「已接线未启用」的 gxmu 模块(定性见 issue #55)
-- + gxmu_tygl_form(团员管理,有存量数据,但不开新入口)。
-- has_college=1:只有 4 张在跑业务表加了 college_id(见本脚本第 2 段)。
-- tenant_id 取本环境 sys_user 的租户号(本项目单租户 10049);换环境时改成该环境的 tenant_id。
-- sort_number 按 reviewList/components/search.vue 当前下拉顺序,cms_manuscript 排在最后,团员管理排在其后。
INSERT IGNORE INTO gxmu_module_registry
(module, table_name, title, detail_key, export_template, has_college, enabled, sort_number, deleted, tenant_id, user_id)
VALUES
('gxmu_sjqn', 'gxmu_sjqn', '十佳青年岗位能手', 'gxmu_sjqn', NULL, 1, 1, 1, 0, 1, NULL),
('gxmu_sjtbzbsj', 'gxmu_sjtbzbsj', '十佳团支部书记', 'gxmu_sjtbzbsj', NULL, 0, 0, 2, 0, 1, NULL),
('gxmu_wshqtw', 'gxmu_wshqtw', '五四红旗团委', 'gxmu_wshqtw', NULL, 0, 0, 3, 0, 1, NULL),
('gxmu_wshqtzb', 'gxmu_wshqtzb', '五四红旗团支部', 'gxmu_wshqtzb', NULL, 0, 0, 4, 0, 1, NULL),
('gxmu_yxgqtdgb', 'gxmu_yxgqtdgb', '优秀共青团干部', 'gxmu_yxgqtdgb', NULL, 0, 0, 5, 0, 1, NULL),
('gxmu_yxgqty', 'gxmu_yxgqty', '优秀共青团员', 'gxmu_yxgqty', NULL, 0, 0, 6, 0, 1, NULL),
('gxmu_tzbcy_form', 'gxmu_tzbcy_form', '挑战杯', 'gxmu_tzbcy_form', NULL, 1, 1, 7, 0, 1, NULL),
('gxmu_qmgc_form', 'gxmu_qmgc_form', '青马工程', 'gxmu_qmgc_form', NULL, 1, 1, 8, 0, 1, NULL),
('gxmu_wxxzx_project', 'gxmu_wxxzx_project', '未来学术之星', 'gxmu_wxxzx_project', NULL, 1, 1, 9, 0, 1, NULL),
('cms_manuscript', 'cms_manuscript', '稿件', 'cms_manuscript', NULL, 0, 1, 10, 0, 10049, NULL),
('gxmu_tygl_form', 'gxmu_tygl_form', '团员管理', 'gxmu_tygl_form', NULL, 0, 0, 11, 0, 10049, NULL);
-- 已存在库的行补 has_college:INSERT IGNORE 不会改已存在的行,这里只把 4 张在跑表从 0 提到 1。
-- 只补 0 → 1,不覆盖后台已改过的值;重复执行是 no-op。
UPDATE gxmu_module_registry SET has_college = 1
WHERE deleted = 0 AND has_college = 0
AND module IN ('gxmu_sjqn', 'gxmu_tzbcy_form', 'gxmu_qmgc_form', 'gxmu_wxxzx_project');
-- ------------------------------------------------------------------
-- 执行后校验(手工执行;每一段注释里是期望结果)
-- ------------------------------------------------------------------
-- 1) 新列存在:reviewer_rule 期望 1 行,college_id 期望 4 行,且都允许 NULL
SELECT COUNT(*) AS reviewer_rule_columns
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gxmu_review_flow'
AND COLUMN_NAME = 'reviewer_rule' AND IS_NULLABLE = 'YES';
SELECT COUNT(*) AS college_id_columns
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('gxmu_sjqn', 'gxmu_tzbcy_form', 'gxmu_qmgc_form', 'gxmu_wxxzx_project')
AND COLUMN_NAME = 'college_id' AND IS_NULLABLE = 'YES';
-- 2) 注册表行数与启用数:期望 11 行未删除,其中 5 行启用
SELECT COUNT(*) AS registry_rows FROM gxmu_module_registry WHERE deleted = 0;
SELECT COUNT(*) AS enabled_rows FROM gxmu_module_registry WHERE deleted = 0 AND enabled = 1;
-- 2b) has_college:期望 4 行(4 张在跑业务表),且与下面的 college_id 列数一致
SELECT COUNT(*) AS has_college_rows FROM gxmu_module_registry WHERE deleted = 0 AND has_college = 1;
SELECT r.module
FROM gxmu_module_registry r
LEFT JOIN information_schema.COLUMNS c
ON c.TABLE_SCHEMA = DATABASE() AND c.TABLE_NAME = r.table_name AND c.COLUMN_NAME = 'college_id'
WHERE r.deleted = 0 AND r.has_college = 1 AND c.COLUMN_NAME IS NULL;
-- 3) 一致性检查:以下查询都应返回空集
SELECT module FROM gxmu_module_registry WHERE deleted = 0 AND table_name <> module;
SELECT module FROM gxmu_module_registry WHERE deleted = 0 AND (detail_key IS NULL OR detail_key = '');
SELECT module FROM gxmu_module_registry WHERE deleted = 0 AND (title IS NULL OR title = '');
SELECT sort_number, COUNT(*) AS cnt FROM gxmu_module_registry WHERE deleted = 0 GROUP BY sort_number HAVING cnt > 1;
SELECT r.module
FROM gxmu_module_registry r
LEFT JOIN information_schema.TABLES t
ON t.TABLE_SCHEMA = DATABASE() AND t.TABLE_NAME = r.table_name
WHERE r.deleted = 0 AND t.TABLE_NAME IS NULL;
-- 4) 启用名单与顺序:期望依次为 gxmu_sjqn / gxmu_tzbcy_form / gxmu_qmgc_form / gxmu_wxxzx_project / cms_manuscript(5 行)
SELECT module, title, sort_number
FROM gxmu_module_registry
WHERE deleted = 0 AND enabled = 1
ORDER BY sort_number;