Files
TakeoutSaaS.Docs/deploy/postgres/seed_tenant_seckill_permissions.sql

264 lines
8.9 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 文件职责:补齐 Tenant 端秒杀活动权限与菜单权限绑定(可重复执行)。
-- 执行范围takeout_identity 数据库Portal=1Tenant 端)。
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;