166 lines
5.5 KiB
SQL
166 lines
5.5 KiB
SQL
-- 新租户初始化清单 SQL(按模板租户复制)
|
||
-- 用法:
|
||
-- 1) 先创建租户拿到 @target_tenant_id
|
||
-- 2) 以 tenant_id=1 作为模板租户执行
|
||
-- 3) 该脚本尽量幂等(重复执行不会重复插入)
|
||
|
||
SET @template_tenant_id := 1;
|
||
SET @target_tenant_id := 2; -- TODO: 改成目标租户ID
|
||
|
||
-- =====================================================
|
||
-- A. 必须初始化(权限与菜单链路)
|
||
-- 表:role/menu/role_permission/role_menu
|
||
-- =====================================================
|
||
|
||
-- A1) 复制模板租户角色(role_code 维度)
|
||
SET @next_role_id := (SELECT IFNULL(MAX(id), 0) FROM role);
|
||
|
||
INSERT INTO role (id, tenant_id, role_code, role_name, status, is_deleted, created_by, updated_by)
|
||
SELECT
|
||
(@next_role_id := @next_role_id + 1) AS id,
|
||
@target_tenant_id AS tenant_id,
|
||
tr.role_code,
|
||
tr.role_name,
|
||
tr.status,
|
||
0 AS is_deleted,
|
||
0 AS created_by,
|
||
0 AS updated_by
|
||
FROM role tr
|
||
LEFT JOIN role er
|
||
ON er.tenant_id=@target_tenant_id
|
||
AND er.role_code=tr.role_code
|
||
AND er.is_deleted=0
|
||
WHERE tr.tenant_id=@template_tenant_id
|
||
AND tr.is_deleted=0
|
||
AND er.id IS NULL;
|
||
|
||
-- A2) 复制模板租户菜单
|
||
INSERT INTO menu (tenant_id, menu_code, menu_name, route_path, permission_code, sort_no, status, is_deleted, created_by, updated_by)
|
||
SELECT
|
||
@target_tenant_id AS tenant_id,
|
||
tm.menu_code,
|
||
tm.menu_name,
|
||
tm.route_path,
|
||
tm.permission_code,
|
||
tm.sort_no,
|
||
tm.status,
|
||
0 AS is_deleted,
|
||
0 AS created_by,
|
||
0 AS updated_by
|
||
FROM menu tm
|
||
LEFT JOIN menu em
|
||
ON em.tenant_id=@target_tenant_id
|
||
AND em.menu_code=tm.menu_code
|
||
AND em.is_deleted=0
|
||
WHERE tm.tenant_id=@template_tenant_id
|
||
AND tm.is_deleted=0
|
||
AND em.id IS NULL;
|
||
|
||
-- A3) 复制 role_permission(按 role_code 映射)
|
||
SET @next_role_perm_id := (SELECT IFNULL(MAX(id), 0) FROM role_permission);
|
||
|
||
INSERT INTO role_permission (id, tenant_id, role_id, permission_id)
|
||
SELECT
|
||
(@next_role_perm_id := @next_role_perm_id + 1) AS id,
|
||
@target_tenant_id AS tenant_id,
|
||
target_role.id AS role_id,
|
||
rp.permission_id
|
||
FROM role_permission rp
|
||
JOIN role template_role
|
||
ON template_role.tenant_id=rp.tenant_id
|
||
AND template_role.id=rp.role_id
|
||
AND template_role.is_deleted=0
|
||
JOIN role target_role
|
||
ON target_role.tenant_id=@target_tenant_id
|
||
AND target_role.role_code=template_role.role_code
|
||
AND target_role.is_deleted=0
|
||
LEFT JOIN role_permission existing_rp
|
||
ON existing_rp.tenant_id=@target_tenant_id
|
||
AND existing_rp.role_id=target_role.id
|
||
AND existing_rp.permission_id=rp.permission_id
|
||
WHERE rp.tenant_id=@template_tenant_id
|
||
AND existing_rp.id IS NULL;
|
||
|
||
-- A4) 复制 role_menu(按 role_code + menu_code 映射)
|
||
SET @next_role_menu_id := (SELECT IFNULL(MAX(id), 0) FROM role_menu);
|
||
|
||
INSERT INTO role_menu (id, tenant_id, role_id, menu_id)
|
||
SELECT
|
||
(@next_role_menu_id := @next_role_menu_id + 1) AS id,
|
||
@target_tenant_id AS tenant_id,
|
||
target_role.id AS role_id,
|
||
target_menu.id AS menu_id
|
||
FROM role_menu rm
|
||
JOIN role template_role
|
||
ON template_role.tenant_id=rm.tenant_id
|
||
AND template_role.id=rm.role_id
|
||
AND template_role.is_deleted=0
|
||
JOIN menu template_menu
|
||
ON template_menu.tenant_id=rm.tenant_id
|
||
AND template_menu.id=rm.menu_id
|
||
AND template_menu.is_deleted=0
|
||
JOIN role target_role
|
||
ON target_role.tenant_id=@target_tenant_id
|
||
AND target_role.role_code=template_role.role_code
|
||
AND target_role.is_deleted=0
|
||
JOIN menu target_menu
|
||
ON target_menu.tenant_id=@target_tenant_id
|
||
AND target_menu.menu_code=template_menu.menu_code
|
||
AND target_menu.is_deleted=0
|
||
LEFT JOIN role_menu existing_rm
|
||
ON existing_rm.tenant_id=@target_tenant_id
|
||
AND existing_rm.role_id=target_role.id
|
||
AND existing_rm.menu_id=target_menu.id
|
||
WHERE rm.tenant_id=@template_tenant_id
|
||
AND existing_rm.id IS NULL;
|
||
|
||
-- =====================================================
|
||
-- B. 可选初始化(建议)
|
||
-- =====================================================
|
||
|
||
-- B1) 模板类型开关(template_type_option)
|
||
-- 注意:type_code 是主键。若库里是“全局唯一”,目标租户可能已存在同 code。
|
||
-- 这里按 (type_code, tenant_id) 语义做幂等,重复时仅更新展示字段。
|
||
INSERT INTO template_type_option (type_code, tenant_id, type_name, status, sort_no)
|
||
SELECT
|
||
tto.type_code,
|
||
@target_tenant_id AS tenant_id,
|
||
tto.type_name,
|
||
tto.status,
|
||
tto.sort_no
|
||
FROM template_type_option tto
|
||
WHERE tto.tenant_id=@template_tenant_id
|
||
ON DUPLICATE KEY UPDATE
|
||
type_name=VALUES(type_name),
|
||
status=VALUES(status),
|
||
sort_no=VALUES(sort_no),
|
||
updated_at=CURRENT_TIMESTAMP;
|
||
|
||
-- B2) 会议字段字典(meeting_field)
|
||
INSERT INTO meeting_field (tenant_id, field_code, field_name, field_values, scope_type, project_id, sort_no, status, is_deleted, created_by, updated_by)
|
||
SELECT
|
||
@target_tenant_id AS tenant_id,
|
||
mf.field_code,
|
||
mf.field_name,
|
||
mf.field_values,
|
||
mf.scope_type,
|
||
NULL AS project_id,
|
||
mf.sort_no,
|
||
mf.status,
|
||
0 AS is_deleted,
|
||
0 AS created_by,
|
||
0 AS updated_by
|
||
FROM meeting_field mf
|
||
LEFT JOIN meeting_field emf
|
||
ON emf.tenant_id=@target_tenant_id
|
||
AND emf.field_code=mf.field_code
|
||
AND emf.is_deleted=0
|
||
WHERE mf.tenant_id=@template_tenant_id
|
||
AND mf.is_deleted=0
|
||
AND emf.id IS NULL;
|
||
|
||
-- =====================================================
|
||
-- C. 不建议初始化(运行数据表,仅业务发生时产生)
|
||
-- project/meeting/audit*/finance*/notification_task/export_task/operation_audit_log 等
|
||
-- =====================================================
|