264 lines
8.9 KiB
PL/PgSQL
264 lines
8.9 KiB
PL/PgSQL
-- 文件职责:补齐 Tenant 端秒杀活动权限与菜单权限绑定(可重复执行)。
|
||
-- 执行范围:takeout_identity 数据库(Portal=1,Tenant 端)。
|
||
|
||
BEGIN;
|
||
|
||
-- 1) 新增/修正营销中心秒杀权限码
|
||
WITH seckill_permissions(code, name, sort_order) AS (
|
||
VALUES
|
||
('tenant:marketing:seckill:view', '查看秒杀活动', 29),
|
||
('tenant:marketing:seckill:create', '创建秒杀活动', 30),
|
||
('tenant:marketing:seckill:update', '编辑秒杀活动', 31),
|
||
('tenant:marketing:seckill:delete', '删除秒杀活动', 32),
|
||
('tenant:marketing:seckill:status', '切换秒杀状态', 33)
|
||
),
|
||
missing AS (
|
||
SELECT
|
||
s.code,
|
||
s.name,
|
||
s.sort_order,
|
||
ROW_NUMBER() OVER (ORDER BY s.sort_order, s.code) AS rn
|
||
FROM seckill_permissions s
|
||
LEFT JOIN public.permissions p
|
||
ON p."Code" = s.code
|
||
WHERE p."Id" IS NULL
|
||
),
|
||
base AS (
|
||
SELECT COALESCE(MAX("Id"), 820000000000000000) AS max_id
|
||
FROM public.permissions
|
||
)
|
||
INSERT INTO public.permissions
|
||
(
|
||
"Id", "Name", "Code", "Description", "CreatedAt", "UpdatedAt", "DeletedAt",
|
||
"CreatedBy", "UpdatedBy", "DeletedBy", "ParentId", "SortOrder", "Type", "Portal"
|
||
)
|
||
SELECT
|
||
base.max_id + missing.rn,
|
||
missing.name,
|
||
missing.code,
|
||
NULL,
|
||
NOW(),
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
820000000000000005,
|
||
missing.sort_order,
|
||
'leaf',
|
||
1
|
||
FROM missing
|
||
CROSS JOIN base;
|
||
|
||
WITH seckill_permissions(code, name, sort_order) AS (
|
||
VALUES
|
||
('tenant:marketing:seckill:view', '查看秒杀活动', 29),
|
||
('tenant:marketing:seckill:create', '创建秒杀活动', 30),
|
||
('tenant:marketing:seckill:update', '编辑秒杀活动', 31),
|
||
('tenant:marketing:seckill:delete', '删除秒杀活动', 32),
|
||
('tenant:marketing:seckill:status', '切换秒杀状态', 33)
|
||
)
|
||
UPDATE public.permissions p
|
||
SET
|
||
"Name" = s.name,
|
||
"ParentId" = 820000000000000005,
|
||
"SortOrder" = s.sort_order,
|
||
"Type" = 'leaf',
|
||
"Portal" = 1,
|
||
"DeletedAt" = NULL,
|
||
"DeletedBy" = NULL,
|
||
"UpdatedAt" = NOW()
|
||
FROM seckill_permissions s
|
||
WHERE p."Code" = s.code;
|
||
|
||
-- 2) 绑定秒杀菜单的访问权限与按钮权限
|
||
UPDATE public.menu_definitions
|
||
SET
|
||
"RequiredPermissions" = 'tenant:marketing:seckill:view',
|
||
"MetaPermissions" = 'tenant:marketing:seckill:view,tenant:marketing:seckill:create,tenant:marketing:seckill:update,tenant:marketing:seckill:delete,tenant:marketing:seckill:status',
|
||
"AuthListJson" = '[{"title":"创建","authMark":"tenant:marketing:seckill:create"},{"title":"编辑","authMark":"tenant:marketing:seckill:update"},{"title":"删除","authMark":"tenant:marketing:seckill:delete"},{"title":"停启用","authMark":"tenant:marketing:seckill:status"}]',
|
||
"UpdatedAt" = NOW()
|
||
WHERE
|
||
"Portal" = 1
|
||
AND ("Path" = 'seckill' OR "Component" = '/marketing/seckill/index');
|
||
|
||
-- 3) 给角色模板补齐秒杀权限(按满减权限映射)
|
||
WITH code_mapping(source_code, target_code) AS (
|
||
VALUES
|
||
('tenant:marketing:full-reduction:view', 'tenant:marketing:seckill:view'),
|
||
('tenant:marketing:full-reduction:create', 'tenant:marketing:seckill:create'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:update'),
|
||
('tenant:marketing:full-reduction:delete', 'tenant:marketing:seckill:delete'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:status')
|
||
),
|
||
candidates AS (
|
||
SELECT DISTINCT
|
||
rtp."RoleTemplateId",
|
||
mapping.target_code
|
||
FROM public.role_template_permissions rtp
|
||
INNER JOIN code_mapping mapping
|
||
ON mapping.source_code = rtp."PermissionCode"
|
||
WHERE rtp."DeletedAt" IS NULL
|
||
),
|
||
missing AS (
|
||
SELECT
|
||
c."RoleTemplateId",
|
||
c.target_code,
|
||
ROW_NUMBER() OVER (ORDER BY c."RoleTemplateId", c.target_code) AS rn
|
||
FROM candidates c
|
||
LEFT JOIN public.role_template_permissions existing
|
||
ON existing."RoleTemplateId" = c."RoleTemplateId"
|
||
AND existing."PermissionCode" = c.target_code
|
||
WHERE existing."Id" IS NULL
|
||
),
|
||
base AS (
|
||
SELECT COALESCE(MAX("Id"), 820000000000000000) AS max_id
|
||
FROM public.role_template_permissions
|
||
)
|
||
INSERT INTO public.role_template_permissions
|
||
(
|
||
"Id", "RoleTemplateId", "PermissionCode", "CreatedAt", "UpdatedAt", "DeletedAt",
|
||
"CreatedBy", "UpdatedBy", "DeletedBy"
|
||
)
|
||
SELECT
|
||
base.max_id + missing.rn,
|
||
missing."RoleTemplateId",
|
||
missing.target_code,
|
||
NOW(),
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL
|
||
FROM missing
|
||
CROSS JOIN base;
|
||
|
||
WITH code_mapping(source_code, target_code) AS (
|
||
VALUES
|
||
('tenant:marketing:full-reduction:view', 'tenant:marketing:seckill:view'),
|
||
('tenant:marketing:full-reduction:create', 'tenant:marketing:seckill:create'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:update'),
|
||
('tenant:marketing:full-reduction:delete', 'tenant:marketing:seckill:delete'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:status')
|
||
)
|
||
UPDATE public.role_template_permissions target
|
||
SET
|
||
"DeletedAt" = NULL,
|
||
"DeletedBy" = NULL,
|
||
"UpdatedAt" = NOW()
|
||
FROM public.role_template_permissions source
|
||
INNER JOIN code_mapping mapping
|
||
ON mapping.source_code = source."PermissionCode"
|
||
WHERE
|
||
source."RoleTemplateId" = target."RoleTemplateId"
|
||
AND target."PermissionCode" = mapping.target_code;
|
||
|
||
-- 4) 给租户角色补齐秒杀权限(按满减权限映射)
|
||
WITH code_mapping(source_code, target_code) AS (
|
||
VALUES
|
||
('tenant:marketing:full-reduction:view', 'tenant:marketing:seckill:view'),
|
||
('tenant:marketing:full-reduction:create', 'tenant:marketing:seckill:create'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:update'),
|
||
('tenant:marketing:full-reduction:delete', 'tenant:marketing:seckill:delete'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:status')
|
||
),
|
||
source_rows AS (
|
||
SELECT DISTINCT
|
||
rp."RoleId",
|
||
rp."TenantId",
|
||
rp."Portal",
|
||
mapping.target_code
|
||
FROM public.role_permissions rp
|
||
INNER JOIN public.permissions source_permission
|
||
ON source_permission."Id" = rp."PermissionId"
|
||
INNER JOIN code_mapping mapping
|
||
ON mapping.source_code = source_permission."Code"
|
||
WHERE rp."DeletedAt" IS NULL
|
||
AND rp."Portal" = 1
|
||
),
|
||
candidates AS (
|
||
SELECT DISTINCT
|
||
s."RoleId",
|
||
s."TenantId",
|
||
s."Portal",
|
||
target_permission."Id" AS target_permission_id
|
||
FROM source_rows s
|
||
INNER JOIN public.permissions target_permission
|
||
ON target_permission."Code" = s.target_code
|
||
),
|
||
missing AS (
|
||
SELECT
|
||
c."RoleId",
|
||
c."TenantId",
|
||
c."Portal",
|
||
c.target_permission_id,
|
||
ROW_NUMBER() OVER (
|
||
ORDER BY c."TenantId", c."RoleId", c.target_permission_id
|
||
) AS rn
|
||
FROM candidates c
|
||
LEFT JOIN public.role_permissions existing
|
||
ON existing."RoleId" = c."RoleId"
|
||
AND existing."PermissionId" = c.target_permission_id
|
||
AND existing."Portal" = c."Portal"
|
||
AND (
|
||
(existing."TenantId" IS NULL AND c."TenantId" IS NULL)
|
||
OR existing."TenantId" = c."TenantId"
|
||
)
|
||
WHERE existing."Id" IS NULL
|
||
),
|
||
base AS (
|
||
SELECT COALESCE(MAX("Id"), 830000000000000000) AS max_id
|
||
FROM public.role_permissions
|
||
)
|
||
INSERT INTO public.role_permissions
|
||
(
|
||
"Id", "RoleId", "PermissionId", "CreatedAt", "UpdatedAt", "DeletedAt",
|
||
"CreatedBy", "UpdatedBy", "DeletedBy", "TenantId", "Portal"
|
||
)
|
||
SELECT
|
||
base.max_id + missing.rn,
|
||
missing."RoleId",
|
||
missing.target_permission_id,
|
||
NOW(),
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
NULL,
|
||
missing."TenantId",
|
||
missing."Portal"
|
||
FROM missing
|
||
CROSS JOIN base;
|
||
|
||
WITH code_mapping(source_code, target_code) AS (
|
||
VALUES
|
||
('tenant:marketing:full-reduction:view', 'tenant:marketing:seckill:view'),
|
||
('tenant:marketing:full-reduction:create', 'tenant:marketing:seckill:create'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:update'),
|
||
('tenant:marketing:full-reduction:delete', 'tenant:marketing:seckill:delete'),
|
||
('tenant:marketing:full-reduction:update', 'tenant:marketing:seckill:status')
|
||
)
|
||
UPDATE public.role_permissions target
|
||
SET
|
||
"DeletedAt" = NULL,
|
||
"DeletedBy" = NULL,
|
||
"UpdatedAt" = NOW()
|
||
FROM public.role_permissions source
|
||
INNER JOIN public.permissions source_permission
|
||
ON source_permission."Id" = source."PermissionId"
|
||
INNER JOIN code_mapping mapping
|
||
ON mapping.source_code = source_permission."Code"
|
||
INNER JOIN public.permissions target_permission
|
||
ON target_permission."Code" = mapping.target_code
|
||
WHERE
|
||
source."Portal" = 1
|
||
AND target."Portal" = source."Portal"
|
||
AND target."RoleId" = source."RoleId"
|
||
AND target."PermissionId" = target_permission."Id"
|
||
AND (
|
||
(target."TenantId" IS NULL AND source."TenantId" IS NULL)
|
||
OR target."TenantId" = source."TenantId"
|
||
);
|
||
|
||
COMMIT;
|