-- 评查点分组正式迁移前巡检脚本 -- 用途: -- 1. 在测试库 / 正式库执行前,先盘点当前分组树、规则集绑定和入口映射风险 -- 2. 本脚本只做查询,不修改任何数据 -- -- 推荐执行方式: -- psql "$DATABASE_URL" -f scripts/precheck_rule_group_migration.sql -- ========================================================= -- 0. 文档类型与入口模块映射总览 -- ========================================================= SELECT dt.id, dt.code, dt.name, dt.entry_module_id, em.name AS entry_module_name, dt.sort_order, dt.is_enabled FROM leaudit_document_types dt LEFT JOIN leaudit_entry_modules em ON em.id = dt.entry_module_id WHERE dt.deleted_at IS NULL ORDER BY dt.sort_order, dt.id; -- ========================================================= -- 1. 旧一级根检查:一级直接挂具体文档类型 -- ========================================================= SELECT id, code, name, document_type_id, entry_module_id, sort_order, is_enabled FROM leaudit_evaluation_point_groups WHERE deleted_at IS NULL AND COALESCE(pid, 0) = 0 AND document_type_id IS NOT NULL ORDER BY id; -- ========================================================= -- 2. 新一级业务大类根检查:一级不直接挂文档类型 -- ========================================================= SELECT id, code, name, entry_module_id, sort_order, is_enabled FROM leaudit_evaluation_point_groups WHERE deleted_at IS NULL AND COALESCE(pid, 0) = 0 AND document_type_id IS NULL ORDER BY sort_order, id; -- ========================================================= -- 3. 二级分组全量清单 -- ========================================================= SELECT child.id, child.pid, parent.name AS parent_name, child.code, child.name, child.document_type_id, dt.name AS document_type_name, COALESCE(child.entry_module_id, parent.entry_module_id, dt.entry_module_id) AS resolved_entry_module_id, em.name AS resolved_entry_module_name, child.sort_order, child.is_enabled FROM leaudit_evaluation_point_groups child LEFT JOIN leaudit_evaluation_point_groups parent ON parent.id = child.pid AND parent.deleted_at IS NULL LEFT JOIN leaudit_document_types dt ON dt.id = child.document_type_id LEFT JOIN leaudit_entry_modules em ON em.id = COALESCE(child.entry_module_id, parent.entry_module_id, dt.entry_module_id) WHERE child.deleted_at IS NULL AND COALESCE(child.pid, 0) <> 0 ORDER BY child.pid, child.sort_order, child.id; -- ========================================================= -- 4. 二级分组唯一性检查:同一文档类型是否被多个二级分组承接 -- ========================================================= SELECT document_type_id, COUNT(*) AS child_count, STRING_AGG(name, ' / ' ORDER BY id) AS child_names FROM leaudit_evaluation_point_groups WHERE deleted_at IS NULL AND COALESCE(pid, 0) <> 0 AND document_type_id IS NOT NULL GROUP BY document_type_id HAVING COUNT(*) > 1 ORDER BY document_type_id; -- ========================================================= -- 5. 旧默认子级检查:通用 / *.default -- ========================================================= SELECT child.id, child.pid, parent.name AS parent_name, child.name, child.code, child.document_type_id FROM leaudit_evaluation_point_groups child JOIN leaudit_evaluation_point_groups parent ON parent.id = child.pid AND parent.deleted_at IS NULL WHERE child.deleted_at IS NULL AND COALESCE(child.pid, 0) <> 0 AND ( child.name = '通用' OR child.code LIKE '%.default' ) ORDER BY child.id; -- ========================================================= -- 6. 规则集绑定全量清单:按分组树展开 -- ========================================================= SELECT rgb.id AS binding_id, rgb.group_id, root.id AS root_id, root.name AS root_name, child.id AS child_id, child.name AS child_name, child.document_type_id, dt.name AS document_type_name, rgb.rule_set_id, rs.rule_name, rs.rule_type, rgb.priority, rgb.is_active, rgb.note FROM leaudit_rule_group_bindings rgb JOIN leaudit_evaluation_point_groups child ON child.id = rgb.group_id AND child.deleted_at IS NULL LEFT JOIN leaudit_evaluation_point_groups root ON root.id = child.pid AND root.deleted_at IS NULL LEFT JOIN leaudit_document_types dt ON dt.id = child.document_type_id LEFT JOIN leaudit_rule_sets rs ON rs.id = rgb.rule_set_id WHERE rgb.deleted_at IS NULL ORDER BY root.id, child.id, rgb.priority DESC, rgb.id; -- ========================================================= -- 7. 规则集重复挂载检查:旧一级根与默认子级是否同时挂了同一规则集 -- ========================================================= WITH target_groups AS ( SELECT g.id, g.document_type_id, g.name, g.code, CASE WHEN COALESCE(g.pid, 0) = 0 THEN 'old_root' WHEN g.name = '通用' OR g.code LIKE '%.default' THEN 'default_child' ELSE 'other_child' END AS group_kind FROM leaudit_evaluation_point_groups g WHERE g.deleted_at IS NULL AND g.document_type_id IS NOT NULL ) SELECT tg.document_type_id, rgb.rule_set_id, COUNT(*) AS binding_count, STRING_AGG(tg.group_kind || ':' || tg.name, ' / ' ORDER BY tg.id) AS group_sources FROM leaudit_rule_group_bindings rgb JOIN target_groups tg ON tg.id = rgb.group_id WHERE rgb.deleted_at IS NULL GROUP BY tg.document_type_id, rgb.rule_set_id HAVING COUNT(*) > 1 ORDER BY tg.document_type_id, rgb.rule_set_id; -- ========================================================= -- 8. 文档类型汇总绑定表现状:leaudit_rule_type_bindings -- ========================================================= SELECT rtb.id, rtb.doc_type_id, dt.name AS document_type_name, rtb.doc_type_code, rtb.rule_set_id, rs.rule_name, rs.rule_type, rtb.binding_mode, rtb.priority, rtb.is_active, rtb.note FROM leaudit_rule_type_bindings rtb LEFT JOIN leaudit_document_types dt ON dt.id = rtb.doc_type_id LEFT JOIN leaudit_rule_sets rs ON rs.id = rtb.rule_set_id WHERE rtb.deleted_at IS NULL ORDER BY rtb.doc_type_id, rtb.priority DESC, rtb.id; -- ========================================================= -- 9. 规则集可运行性检查:版本占位 -- ========================================================= SELECT rs.id, rs.rule_name, rs.rule_type, rs.current_version_id, NULL::bigint AS fallback_version_id, rs.status FROM leaudit_rule_sets rs WHERE rs.deleted_at IS NULL ORDER BY rs.id; -- ========================================================= -- 10. 文档类型缺失入口模块检查 -- ========================================================= SELECT dt.id, dt.code, dt.name FROM leaudit_document_types dt WHERE dt.deleted_at IS NULL AND dt.entry_module_id IS NULL ORDER BY dt.id; -- ========================================================= -- 11. 一级根缺失入口模块检查 -- ========================================================= SELECT id, code, name FROM leaudit_evaluation_point_groups WHERE deleted_at IS NULL AND COALESCE(pid, 0) = 0 AND document_type_id IS NULL AND entry_module_id IS NULL ORDER BY id; -- ========================================================= -- 12. 新链路下无法命中规则集的二级分组检查 -- ========================================================= SELECT child.id, child.name, child.code, child.document_type_id, dt.name AS document_type_name, COUNT(rgb.id) AS binding_count FROM leaudit_evaluation_point_groups child LEFT JOIN leaudit_rule_group_bindings rgb ON rgb.group_id = child.id AND rgb.deleted_at IS NULL AND rgb.is_active = TRUE LEFT JOIN leaudit_document_types dt ON dt.id = child.document_type_id WHERE child.deleted_at IS NULL AND COALESCE(child.pid, 0) <> 0 GROUP BY child.id, child.name, child.code, child.document_type_id, dt.name HAVING COUNT(rgb.id) = 0 ORDER BY child.id;