feat: add backend rule group and permission support
This commit is contained in:
@@ -0,0 +1,270 @@
|
||||
-- 评查点分组正式迁移前巡检脚本
|
||||
-- 用途:
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user