feat: add tenant-scoped rule and permission management
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
BEGIN;
|
||||
|
||||
-- ============================================================================
|
||||
-- Evaluation Points Tenant Cleanup
|
||||
-- 目标:
|
||||
-- 1. 为旧表 evaluation_points 补 tenant_code / tenant_name
|
||||
-- 2. 建立基础索引,支持评查点模块彻底切到 tenant_code 主链
|
||||
-- 3. 基于 sys_tenant_aliases / sys_tenants 做首轮历史回填
|
||||
-- 说明:
|
||||
-- - 当前真实运行链路仍使用旧表 evaluation_points
|
||||
-- - 本脚本只做“补列 + 建索引 + 回填”
|
||||
-- - 不在本阶段删除旧 area 字段
|
||||
-- - 不在本阶段强制 NOT NULL
|
||||
-- ============================================================================
|
||||
|
||||
-- --------------------------------------------------------------------------
|
||||
-- 1. 补字段
|
||||
-- --------------------------------------------------------------------------
|
||||
ALTER TABLE public.evaluation_points
|
||||
ADD COLUMN IF NOT EXISTS tenant_code VARCHAR(64),
|
||||
ADD COLUMN IF NOT EXISTS tenant_name VARCHAR(128);
|
||||
|
||||
COMMENT ON COLUMN public.evaluation_points.tenant_code IS '所属租户编码:评查点历史收尾阶段新增,后续替代 area 作为真实归属主字段';
|
||||
COMMENT ON COLUMN public.evaluation_points.tenant_name IS '所属租户名称:展示字段,和 tenant_code 配套回填';
|
||||
|
||||
-- --------------------------------------------------------------------------
|
||||
-- 2. 基础索引
|
||||
-- --------------------------------------------------------------------------
|
||||
CREATE INDEX IF NOT EXISTS idx_evaluation_points_tenant_code
|
||||
ON public.evaluation_points(tenant_code);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_evaluation_points_group_tenant_code
|
||||
ON public.evaluation_points(evaluation_point_groups_id, tenant_code);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_evaluation_points_group_pid_tenant_code
|
||||
ON public.evaluation_points(evaluation_point_groups_pid, tenant_code);
|
||||
|
||||
-- --------------------------------------------------------------------------
|
||||
-- 3. 公共 / 省级规范租户兜底
|
||||
-- --------------------------------------------------------------------------
|
||||
INSERT INTO public.sys_tenants (
|
||||
tenant_code, tenant_name, tenant_short_name, tenant_type,
|
||||
parent_tenant_code, is_enabled, is_public, display_order, ext,
|
||||
created_at, updated_at, deleted_at
|
||||
)
|
||||
SELECT
|
||||
'PUBLIC', '公共资源域', '公共', 'PUBLIC',
|
||||
NULL, TRUE, TRUE, 0, '{}'::jsonb,
|
||||
NOW(), NOW(), NULL
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM public.sys_tenants WHERE tenant_code = 'PUBLIC'
|
||||
);
|
||||
|
||||
INSERT INTO public.sys_tenants (
|
||||
tenant_code, tenant_name, tenant_short_name, tenant_type,
|
||||
parent_tenant_code, is_enabled, is_public, display_order, ext,
|
||||
created_at, updated_at, deleted_at
|
||||
)
|
||||
SELECT
|
||||
'PROVINCIAL', '省级统管域', '省级', 'GOV',
|
||||
NULL, TRUE, FALSE, 1, '{}'::jsonb,
|
||||
NOW(), NOW(), NULL
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM public.sys_tenants WHERE tenant_code = 'PROVINCIAL'
|
||||
);
|
||||
|
||||
INSERT INTO public.sys_tenant_aliases (
|
||||
tenant_code, alias_type, alias_value, is_enabled, created_at, updated_at, deleted_at
|
||||
)
|
||||
SELECT 'PUBLIC', 'DISPLAY', '公共', TRUE, NOW(), NOW(), NULL
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM public.sys_tenant_aliases
|
||||
WHERE tenant_code = 'PUBLIC'
|
||||
AND alias_value = '公共'
|
||||
AND deleted_at IS NULL
|
||||
);
|
||||
|
||||
INSERT INTO public.sys_tenant_aliases (
|
||||
tenant_code, alias_type, alias_value, is_enabled, created_at, updated_at, deleted_at
|
||||
)
|
||||
SELECT 'PUBLIC', 'LEGACY_REGION', 'default', TRUE, NOW(), NOW(), NULL
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM public.sys_tenant_aliases
|
||||
WHERE tenant_code = 'PUBLIC'
|
||||
AND alias_value = 'default'
|
||||
AND deleted_at IS NULL
|
||||
);
|
||||
|
||||
INSERT INTO public.sys_tenant_aliases (
|
||||
tenant_code, alias_type, alias_value, is_enabled, created_at, updated_at, deleted_at
|
||||
)
|
||||
SELECT 'PROVINCIAL', 'DISPLAY', '省级', TRUE, NOW(), NOW(), NULL
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM public.sys_tenant_aliases
|
||||
WHERE tenant_code = 'PROVINCIAL'
|
||||
AND alias_value = '省级'
|
||||
AND deleted_at IS NULL
|
||||
);
|
||||
|
||||
INSERT INTO public.sys_tenant_aliases (
|
||||
tenant_code, alias_type, alias_value, is_enabled, created_at, updated_at, deleted_at
|
||||
)
|
||||
SELECT 'PROVINCIAL', 'LEGACY_REGION', '省局', TRUE, NOW(), NOW(), NULL
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM public.sys_tenant_aliases
|
||||
WHERE tenant_code = 'PROVINCIAL'
|
||||
AND alias_value = '省局'
|
||||
AND deleted_at IS NULL
|
||||
);
|
||||
|
||||
-- --------------------------------------------------------------------------
|
||||
-- 4. 历史回填:优先按别名表映射
|
||||
-- --------------------------------------------------------------------------
|
||||
WITH alias_map AS (
|
||||
SELECT DISTINCT ON (LOWER(BTRIM(alias_value)))
|
||||
LOWER(BTRIM(alias_value)) AS normalized_alias_value,
|
||||
tenant_code
|
||||
FROM public.sys_tenant_aliases
|
||||
WHERE deleted_at IS NULL
|
||||
AND is_enabled = TRUE
|
||||
ORDER BY LOWER(BTRIM(alias_value)), id ASC
|
||||
),
|
||||
tenant_name_map AS (
|
||||
SELECT
|
||||
LOWER(BTRIM(tenant_name)) AS normalized_tenant_name,
|
||||
tenant_code
|
||||
FROM public.sys_tenants
|
||||
WHERE deleted_at IS NULL
|
||||
AND is_enabled = TRUE
|
||||
),
|
||||
resolved_points AS (
|
||||
SELECT
|
||||
ep.id,
|
||||
COALESCE(
|
||||
NULLIF(BTRIM(ep.tenant_code), ''),
|
||||
am.tenant_code,
|
||||
tn.tenant_code,
|
||||
CASE
|
||||
WHEN ep.area IS NULL OR BTRIM(ep.area) = '' THEN 'PUBLIC'
|
||||
WHEN LOWER(BTRIM(ep.area)) = 'default' THEN 'PUBLIC'
|
||||
WHEN BTRIM(ep.area) = '公共' THEN 'PUBLIC'
|
||||
WHEN BTRIM(ep.area) IN ('省级', '省局') THEN 'PROVINCIAL'
|
||||
ELSE NULL
|
||||
END
|
||||
) AS resolved_tenant_code,
|
||||
COALESCE(
|
||||
NULLIF(BTRIM(ep.tenant_name), ''),
|
||||
st.tenant_name,
|
||||
NULLIF(BTRIM(ep.area), ''),
|
||||
CASE
|
||||
WHEN ep.area IS NULL OR BTRIM(ep.area) = '' THEN '公共资源域'
|
||||
WHEN LOWER(BTRIM(ep.area)) = 'default' THEN '公共资源域'
|
||||
WHEN BTRIM(ep.area) = '公共' THEN '公共资源域'
|
||||
WHEN BTRIM(ep.area) IN ('省级', '省局') THEN '省级统管域'
|
||||
ELSE NULL
|
||||
END
|
||||
) AS resolved_tenant_name
|
||||
FROM public.evaluation_points ep
|
||||
LEFT JOIN alias_map am
|
||||
ON LOWER(BTRIM(COALESCE(ep.area, ''))) = am.normalized_alias_value
|
||||
LEFT JOIN tenant_name_map tn
|
||||
ON LOWER(BTRIM(COALESCE(ep.area, ''))) = tn.normalized_tenant_name
|
||||
LEFT JOIN public.sys_tenants st
|
||||
ON st.tenant_code = COALESCE(
|
||||
NULLIF(BTRIM(ep.tenant_code), ''),
|
||||
am.tenant_code,
|
||||
tn.tenant_code,
|
||||
CASE
|
||||
WHEN ep.area IS NULL OR BTRIM(ep.area) = '' THEN 'PUBLIC'
|
||||
WHEN LOWER(BTRIM(ep.area)) = 'default' THEN 'PUBLIC'
|
||||
WHEN BTRIM(ep.area) = '公共' THEN 'PUBLIC'
|
||||
WHEN BTRIM(ep.area) IN ('省级', '省局') THEN 'PROVINCIAL'
|
||||
ELSE NULL
|
||||
END
|
||||
)
|
||||
AND st.deleted_at IS NULL
|
||||
AND st.is_enabled = TRUE
|
||||
WHERE
|
||||
ep.tenant_code IS NULL
|
||||
OR BTRIM(ep.tenant_code) = ''
|
||||
OR ep.tenant_name IS NULL
|
||||
OR BTRIM(ep.tenant_name) = ''
|
||||
)
|
||||
UPDATE public.evaluation_points ep
|
||||
SET tenant_code = COALESCE(NULLIF(BTRIM(ep.tenant_code), ''), rp.resolved_tenant_code),
|
||||
tenant_name = COALESCE(NULLIF(BTRIM(ep.tenant_name), ''), rp.resolved_tenant_name)
|
||||
FROM resolved_points rp
|
||||
WHERE ep.id = rp.id
|
||||
AND (
|
||||
rp.resolved_tenant_code IS NOT NULL
|
||||
OR rp.resolved_tenant_name IS NOT NULL
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user