Files
leaudit-platform-backend/scripts/precheck_rule_group_migration.sql
T

271 lines
8.0 KiB
SQL

-- 评查点分组正式迁移前巡检脚本
-- 用途:
-- 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;