feat: 将安全策略模板化,新建商户时自动复制初始策略
This commit is contained in:
@@ -35,18 +35,37 @@ FROM (
|
||||
) p WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=p.name);
|
||||
|
||||
INSERT INTO `hg_admin_menu` (`id`,`pid`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`level`,`tree`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
|
||||
SELECT NULL,@imRootId,'安全策略','imSecurityPolicyIndex','security-policy/index','','2','','/imSecurityPolicy/list','','/imSecurityPolicy/index','1','imManager','0','0','','0','0','0','2',CONCAT('tr_',@imRootId,' '),'95','','1',@now,@now
|
||||
SELECT NULL,@imRootId,'IP黑白名单','imSecurityPolicyIndex','security-policy/index','','2','','/imSecurityPolicy/list','','/imSecurityPolicy/index','1','imManager','0','0','','0','0','0','2',CONCAT('tr_',@imRootId,' '),'95','','1',@now,@now
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='imSecurityPolicyIndex');
|
||||
SET @securityPolicyId := (SELECT `id` FROM `hg_admin_menu` WHERE `name`='imSecurityPolicyIndex' LIMIT 1);
|
||||
UPDATE `hg_admin_menu` SET `title`='IP黑白名单', `updated_at`=@now WHERE `name`='imSecurityPolicyIndex' AND `title`<>'IP黑白名单';
|
||||
|
||||
-- Policy version page (flattened strategy form) split out of the security policy page.
|
||||
INSERT INTO `hg_admin_menu` (`id`,`pid`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`level`,`tree`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
|
||||
SELECT NULL,@imRootId,'安全策略','imPolicyVersionIndex','policy-version/index','','2','','/imSecurityPolicy/list','','/imPolicyVersion/index','1','imManager','0','0','','0','0','0','2',CONCAT('tr_',@imRootId,' '),'96','','1',@now,@now
|
||||
WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name`='imPolicyVersionIndex');
|
||||
SET @policyVersionId := (SELECT `id` FROM `hg_admin_menu` WHERE `name`='imPolicyVersionIndex' LIMIT 1);
|
||||
UPDATE `hg_admin_menu` SET `title`='安全策略', `updated_at`=@now WHERE `name`='imPolicyVersionIndex' AND `title`<>'安全策略';
|
||||
|
||||
INSERT INTO `hg_admin_menu` (`id`,`pid`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`level`,`tree`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
|
||||
SELECT NULL,@securityPolicyId,p.title,p.name,'','','3','',p.permissions,'','','1','','0','0','','0','0','0','3',CONCAT('tr_',@imRootId,' tr_',@securityPolicyId,' '),p.sort,'','1',@now,@now
|
||||
SELECT NULL,@policyVersionId,p.title,p.name,'','','3','',p.permissions,'','','1','','0','0','','0','0','0','3',CONCAT('tr_',@imRootId,' tr_',@policyVersionId,' '),p.sort,'','1',@now,@now
|
||||
FROM (
|
||||
SELECT '策略详情' title,'imSecurityPolicyView' name,'/imSecurityPolicy/view' permissions,10 sort UNION ALL
|
||||
SELECT '保存草稿','imSecurityPolicySave','/imSecurityPolicy/save',20 UNION ALL
|
||||
SELECT '发布策略','imSecurityPolicyPublish','/imSecurityPolicy/publish',30 UNION ALL
|
||||
SELECT '恢复默认','imSecurityPolicyRestoreDefault','/imSecurityPolicy/restoreDefault',40 UNION ALL
|
||||
SELECT '登录锁定配置','imSecurityPolicyLoginLockoutConfig','/imSecurityPolicy/loginLockoutConfig',45 UNION ALL
|
||||
SELECT 'IP规则列表','imSecurityPolicyIpRuleList','/imSecurityPolicy/ipRuleList',50 UNION ALL
|
||||
SELECT 'IP规则编辑','imSecurityPolicyIpRuleEdit','/imSecurityPolicy/ipRuleEdit',60 UNION ALL
|
||||
SELECT 'IP规则删除','imSecurityPolicyIpRuleDelete','/imSecurityPolicy/ipRuleDelete',70
|
||||
) p WHERE NOT EXISTS (SELECT 1 FROM `hg_admin_menu` m WHERE m.`name`=p.name);
|
||||
|
||||
-- Existing installs: policy buttons move to the policy version page, IP rule buttons stay put.
|
||||
UPDATE `hg_admin_menu` SET `pid`=@policyVersionId, `updated_at`=@now
|
||||
WHERE `name` IN ('imSecurityPolicyView','imSecurityPolicySave','imSecurityPolicyPublish','imSecurityPolicyRestoreDefault','imSecurityPolicyLoginLockoutConfig');
|
||||
INSERT IGNORE INTO `hg_admin_role_menu` (`role_id`,`menu_id`)
|
||||
SELECT `role_id`, @policyVersionId FROM `hg_admin_role_menu`
|
||||
WHERE `menu_id` IN (SELECT `id` FROM `hg_admin_menu` WHERE `name` IN ('imSecurityPolicyView','imSecurityPolicySave','imSecurityPolicyPublish','imSecurityPolicyRestoreDefault','imSecurityPolicyLoginLockoutConfig'));
|
||||
|
||||
-- Deprecate the publish button: policy save takes effect immediately (single-record model).
|
||||
UPDATE `hg_admin_menu` SET `status`=2, `hidden`=1, `updated_at`=@now WHERE `name`='imSecurityPolicyPublish';
|
||||
DELETE FROM `hg_admin_role_menu` WHERE `menu_id` IN (SELECT `id` FROM `hg_admin_menu` WHERE `name`='imSecurityPolicyPublish');
|
||||
|
||||
@@ -60,12 +60,36 @@ UPDATE `hg_admin_menu` SET `pid`=@auditId, `path`='task-dashboard/index', `level
|
||||
|
||||
-- System and tenant settings.
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `title`='商户管理', `path`='tenant/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=10, `updated_at`=@now WHERE `name`='imTenantIndex';
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='security-policy/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=20, `updated_at`=@now WHERE `name`='imSecurityPolicyIndex';
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `title`='IP黑白名单', `path`='security-policy/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=20, `updated_at`=@now WHERE `name`='imSecurityPolicyIndex';
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='file-policy/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=30, `updated_at`=@now WHERE `name`='imFilePolicyIndex';
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='external-config/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=50, `updated_at`=@now WHERE `name`='imExternalConfigIndex';
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='notification/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=60, `updated_at`=@now WHERE `name`='imNotificationIndex';
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `path`='app-release/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=70, `updated_at`=@now WHERE `name`='imAppReleaseIndex';
|
||||
|
||||
-- Policy version page: flattened strategy form moved out of the (now IP-focused) security policy page.
|
||||
INSERT INTO `hg_admin_menu` (`pid`,`title`,`name`,`path`,`icon`,`type`,`redirect`,`permissions`,`permission_name`,`component`,`always_show`,`active_menu`,`is_root`,`is_frame`,`frame_src`,`keep_alive`,`hidden`,`affix`,`level`,`tree`,`sort`,`remark`,`status`,`created_at`,`updated_at`)
|
||||
SELECT @settingsId,'安全策略','imPolicyVersionIndex','policy-version/index','','2','','/imSecurityPolicy/list','','/imPolicyVersion/index','1','imManager','0','0','','0','0','0','3',CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '),'25','','1',@now,@now
|
||||
WHERE @settingsId IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `hg_admin_menu` WHERE `name` = 'imPolicyVersionIndex');
|
||||
SET @policyVersionId := (SELECT `id` FROM `hg_admin_menu` WHERE `name` = 'imPolicyVersionIndex' LIMIT 1);
|
||||
UPDATE `hg_admin_menu` SET `pid`=@settingsId, `title`='安全策略', `path`='policy-version/index', `level`=3, `tree`=CONCAT('tr_', @imRootId, ' tr_', @settingsId, ' '), `sort`=25, `updated_at`=@now WHERE `id`=@policyVersionId;
|
||||
|
||||
-- Move policy buttons from the security policy page to the policy version page.
|
||||
UPDATE `hg_admin_menu` SET `pid`=@policyVersionId, `updated_at`=@now
|
||||
WHERE `name` IN ('imSecurityPolicyView','imSecurityPolicySave','imSecurityPolicyPublish','imSecurityPolicyRestoreDefault','imSecurityPolicyLoginLockoutConfig');
|
||||
|
||||
-- Deprecate the publish button: policy save takes effect immediately (single-record model).
|
||||
UPDATE `hg_admin_menu` SET `status`=2, `hidden`=1, `updated_at`=@now WHERE `name`='imSecurityPolicyPublish';
|
||||
DELETE FROM `hg_admin_role_menu` WHERE `menu_id` IN (SELECT `id` FROM `hg_admin_menu` WHERE `name`='imSecurityPolicyPublish');
|
||||
|
||||
-- Grant the policy version page to roles that already own any migrated policy button.
|
||||
INSERT INTO `hg_admin_role_menu` (`role_id`, `menu_id`)
|
||||
SELECT DISTINCT rm.`role_id`, @policyVersionId
|
||||
FROM `hg_admin_role_menu` rm
|
||||
JOIN `hg_admin_menu` btn ON btn.`id` = rm.`menu_id`
|
||||
LEFT JOIN `hg_admin_role_menu` existing ON existing.`role_id` = rm.`role_id` AND existing.`menu_id` = @policyVersionId
|
||||
WHERE btn.`name` IN ('imSecurityPolicyView','imSecurityPolicySave','imSecurityPolicyPublish','imSecurityPolicyRestoreDefault','imSecurityPolicyLoginLockoutConfig')
|
||||
AND existing.`menu_id` IS NULL;
|
||||
|
||||
-- Remove one-page wrapper directories after their page has been moved.
|
||||
UPDATE `hg_admin_menu` SET `status`=2, `hidden`=1, `updated_at`=@now
|
||||
WHERE `name` IN ('imUser', 'imGroup', 'imTenant', 'imRealname', 'imWorkOrder', 'imAuditLog', 'imOutbox');
|
||||
@@ -76,7 +100,7 @@ JOIN `hg_admin_menu` page ON page.`id` = child.`pid`
|
||||
SET child.`level` = page.`level` + 1,
|
||||
child.`tree` = CONCAT(page.`tree`, 'tr_', page.`id`, ' '),
|
||||
child.`updated_at` = @now
|
||||
WHERE page.`pid` IN (@peopleId, @contentId, @auditId, @settingsId)
|
||||
WHERE (page.`pid` IN (@peopleId, @contentId, @auditId, @settingsId) OR page.`id` = @policyVersionId)
|
||||
AND child.`type` = 3;
|
||||
|
||||
-- Give roles that already own pages in a section access to the new directory.
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
-- 安全策略"去版本化"数据迁移:每租户收敛为一条 published 记录(幂等可重跑)
|
||||
-- 执行前已备份 im_security_policy / im_message_curfew_rules 全量至 /tmp/policy-backup-20260922.txt
|
||||
|
||||
-- 1. 全局默认(tenant_id=0)不存在则插入 published 模板
|
||||
INSERT INTO `im_security_policy` (`tenant_id`,`policy_version`,`policy_name`,`publish_status`,`password_policy`,`login_rate_limit`,`sensitive_word_policy`,`file_review_policy`,`realname_policy`,`risk_challenge_policy`,`global_friend_enabled`,`friend_disabled_policy`,`message_curfew_enabled`,`remark`,`published_at`,`published_by`,`created_by`,`updated_by`)
|
||||
SELECT 0,1,'全局默认安全策略','published','{}','{"enabled":false}','{"scenes":{"user_nickname":true,"user_signature":true,"group_name":true,"group_nickname":true,"private_message":true,"group_message":true,"group_announcement":true},"risk_actions":{"high":"block","medium":"block","low":"audit_only","none":"allow"},"failure_mode":"allow","block_message":"内容不符合平台规范,请修改后重试"}','{}','{}','{}',1,'{"hide_profile":true,"block_qrcode":true,"block_group_member_entry":true,"blocked_entries":["search","profile_card","group_member","qrcode","invite_auto_add","recommendation"],"message":"当前时段暂不允许添加好友"}',0,'全局默认模板',NOW(3),1,1,1
|
||||
WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM `im_security_policy` WHERE `tenant_id`=0 AND `publish_status`='published' AND `deleted_at` IS NULL) x);
|
||||
|
||||
-- 2. 全局默认无宵禁规则则补一条默认规则模板
|
||||
INSERT INTO `im_message_curfew_rules` (`tenant_id`,`policy_id`,`rule_code`,`rule_name`,`date_type`,`custom_dates`,`weekdays`,`timezone`,`start_time`,`end_time`,`scope`,`whitelist_user_ids`,`whitelist_group_ids`,`message`,`status`,`sort`,`created_by`,`updated_by`)
|
||||
SELECT 0, p.`id`,'work_off_1','下班时段','weekday','[]','[1,2,3,4,5]','Asia/Shanghai','18:00','09:00','private_message','[]','[]','当前时段暂不能发送消息',1,10,1,1
|
||||
FROM `im_security_policy` p
|
||||
WHERE p.`tenant_id`=0 AND p.`publish_status`='published' AND p.`deleted_at` IS NULL
|
||||
AND NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM `im_message_curfew_rules` WHERE `policy_id`=p.`id` AND `deleted_at` IS NULL) y);
|
||||
|
||||
-- 3. 无 published 的租户:将其最大版本 draft 提升为 published
|
||||
UPDATE `im_security_policy` sp
|
||||
JOIN (
|
||||
SELECT `tenant_id`, MAX(`policy_version`) AS mv
|
||||
FROM `im_security_policy`
|
||||
WHERE `deleted_at` IS NULL AND `publish_status`='draft'
|
||||
GROUP BY `tenant_id`
|
||||
) t ON sp.`tenant_id`=t.`tenant_id` AND sp.`policy_version`=t.`mv` AND sp.`publish_status`='draft'
|
||||
SET sp.`publish_status`='published', sp.`published_at`=NOW(3), sp.`published_by`=1, sp.`updated_at`=NOW(3)
|
||||
WHERE sp.`deleted_at` IS NULL
|
||||
AND NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM `im_security_policy` x WHERE x.`tenant_id`=sp.`tenant_id` AND x.`publish_status`='published' AND x.`deleted_at` IS NULL) z);
|
||||
|
||||
-- 4. 每租户仅保留版本最大的 published 记录,其余行软删
|
||||
UPDATE `im_security_policy` sp
|
||||
LEFT JOIN (
|
||||
SELECT `tenant_id`, MAX(`policy_version`) AS mv
|
||||
FROM `im_security_policy`
|
||||
WHERE `deleted_at` IS NULL AND `publish_status`='published'
|
||||
GROUP BY `tenant_id`
|
||||
) keep ON sp.`tenant_id`=keep.`tenant_id` AND sp.`policy_version`=keep.`mv` AND sp.`publish_status`='published'
|
||||
SET sp.`deleted_at`=NOW(3), sp.`deleted_by`=1
|
||||
WHERE sp.`deleted_at` IS NULL AND keep.`mv` IS NULL;
|
||||
|
||||
-- 5. 宵禁规则孤儿软删(挂在不保留/已删策略下的规则)
|
||||
UPDATE `im_message_curfew_rules` r
|
||||
LEFT JOIN `im_security_policy` sp ON r.`policy_id`=sp.`id` AND sp.`deleted_at` IS NULL
|
||||
SET r.`deleted_at`=NOW(3), r.`deleted_by`=1
|
||||
WHERE r.`deleted_at` IS NULL AND sp.`id` IS NULL;
|
||||
|
||||
-- 6. im_tenant_config 与保留记录对齐(版本 + 全局好友开关 + 宵禁开关)
|
||||
UPDATE `im_tenant_config` tc
|
||||
JOIN `im_security_policy` sp ON tc.`tenant_id`=sp.`tenant_id` AND sp.`publish_status`='published' AND sp.`deleted_at` IS NULL
|
||||
SET tc.`security_policy_version`=sp.`policy_version`,
|
||||
tc.`global_friend_enabled`=sp.`global_friend_enabled`,
|
||||
tc.`message_curfew_enabled`=sp.`message_curfew_enabled`
|
||||
WHERE tc.`security_policy_version`<>sp.`policy_version`
|
||||
OR tc.`global_friend_enabled`<>sp.`global_friend_enabled`
|
||||
OR tc.`message_curfew_enabled`<>sp.`message_curfew_enabled`;
|
||||
|
||||
-- 7. 有策略但缺 im_tenant_config 行的租户补建配置行
|
||||
INSERT INTO `im_tenant_config` (`tenant_id`,`security_policy_version`,`global_friend_enabled`,`message_curfew_enabled`,`created_by`,`updated_by`)
|
||||
SELECT sp.`tenant_id`, sp.`policy_version`, sp.`global_friend_enabled`, sp.`message_curfew_enabled`, 1, 1
|
||||
FROM `im_security_policy` sp
|
||||
WHERE sp.`publish_status`='published' AND sp.`deleted_at` IS NULL AND sp.`tenant_id`>0
|
||||
AND NOT EXISTS (SELECT 1 FROM (SELECT 1 FROM `im_tenant_config` tc WHERE tc.`tenant_id`=sp.`tenant_id`) w);
|
||||
@@ -0,0 +1,115 @@
|
||||
-- IM 安全策略模板表迁移(幂等,可重复执行)
|
||||
-- 背景:全局默认策略从 im_security_policy.tenant_id=0 记录改为独立模板表 im_security_policy_template(单行)。
|
||||
-- 每次新增商户时从模板复制一份为商户初始策略,商户后续修改只改副本。
|
||||
|
||||
-- 1. 建模板表(永远单行 id=1,平台级,宵禁规则以 JSON 数组存储)
|
||||
CREATE TABLE IF NOT EXISTS `im_security_policy_template` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`policy_name` varchar(100) NOT NULL DEFAULT '默认安全策略模板',
|
||||
`password_policy` text,
|
||||
`login_rate_limit` text,
|
||||
`sensitive_word_policy` text,
|
||||
`file_review_policy` text,
|
||||
`realname_policy` text,
|
||||
`risk_challenge_policy` text,
|
||||
`global_friend_enabled` tinyint NOT NULL DEFAULT 1,
|
||||
`friend_disabled_policy` text,
|
||||
`message_curfew_enabled` tinyint NOT NULL DEFAULT 0,
|
||||
`curfew_rules` text COMMENT '宵禁规则JSON数组',
|
||||
`remark` varchar(255) DEFAULT '',
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` bigint DEFAULT 0,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` bigint DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='IM安全策略模板(新建商户初始策略来源)';
|
||||
|
||||
-- 2. 从 tenant_id=0 published 记录迁入模板字段(仅当模板表为空)
|
||||
INSERT INTO `im_security_policy_template`
|
||||
(`policy_name`, `password_policy`, `login_rate_limit`, `sensitive_word_policy`, `file_review_policy`, `realname_policy`, `risk_challenge_policy`, `global_friend_enabled`, `friend_disabled_policy`, `message_curfew_enabled`, `curfew_rules`, `remark`, `created_at`, `created_by`)
|
||||
SELECT
|
||||
IFNULL(sp.policy_name, '默认安全策略模板'),
|
||||
IFNULL(CAST(sp.password_policy AS CHAR), '{}'),
|
||||
IFNULL(CAST(sp.login_rate_limit AS CHAR), '{"enabled":false}'),
|
||||
IFNULL(CAST(sp.sensitive_word_policy AS CHAR), '{}'),
|
||||
IFNULL(CAST(sp.file_review_policy AS CHAR), '{}'),
|
||||
IFNULL(CAST(sp.realname_policy AS CHAR), '{}'),
|
||||
IFNULL(CAST(sp.risk_challenge_policy AS CHAR), '{}'),
|
||||
IFNULL(sp.global_friend_enabled, 1),
|
||||
IFNULL(CAST(sp.friend_disabled_policy AS CHAR), '{}'),
|
||||
IFNULL(sp.message_curfew_enabled, 0),
|
||||
'[]',
|
||||
'由全局默认策略迁移',
|
||||
NOW(), 0
|
||||
FROM (SELECT 1) dummy
|
||||
LEFT JOIN `im_security_policy` sp ON sp.tenant_id = 0 AND sp.publish_status = 'published' AND sp.deleted_at IS NULL
|
||||
WHERE (SELECT COUNT(*) FROM `im_security_policy_template`) = 0
|
||||
ORDER BY sp.policy_version DESC
|
||||
LIMIT 1;
|
||||
|
||||
-- 3. 模板宵禁规则:从 tenant_id=0 记录的宵禁规则聚合为 JSON(仅当模板 curfew_rules 为空数组)
|
||||
UPDATE `im_security_policy_template` t
|
||||
SET t.curfew_rules = (
|
||||
SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(
|
||||
'ruleCode', r.rule_code, 'ruleName', r.rule_name, 'dateType', r.date_type,
|
||||
'customDates', CAST(r.custom_dates AS JSON), 'weekdays', CAST(r.weekdays AS JSON),
|
||||
'timezone', r.timezone,
|
||||
'startTime', TIME_FORMAT(r.start_time, '%H:%i'), 'endTime', TIME_FORMAT(r.end_time, '%H:%i'),
|
||||
'scope', r.scope,
|
||||
'whitelistUserIds', CAST(r.whitelist_user_ids AS JSON), 'whitelistGroupIds', CAST(r.whitelist_group_ids AS JSON),
|
||||
'message', r.message, 'status', r.status, 'sort', r.sort
|
||||
)), JSON_ARRAY())
|
||||
FROM `im_message_curfew_rules` r
|
||||
WHERE r.tenant_id = 0 AND r.deleted_at IS NULL
|
||||
AND r.policy_id = (SELECT sp.id FROM `im_security_policy` sp WHERE sp.tenant_id = 0 AND sp.publish_status = 'published' AND sp.deleted_at IS NULL ORDER BY sp.policy_version DESC LIMIT 1)
|
||||
)
|
||||
WHERE (t.curfew_rules IS NULL OR JSON_LENGTH(t.curfew_rules) = 0);
|
||||
|
||||
-- 4. 存量商户补齐:tenant_id>0 且无 published 记录的商户,从模板复制策略行(version=1, published)
|
||||
INSERT INTO `im_security_policy`
|
||||
(`tenant_id`, `policy_version`, `policy_name`, `publish_status`, `password_policy`, `login_rate_limit`, `sensitive_word_policy`, `file_review_policy`, `realname_policy`, `risk_challenge_policy`, `global_friend_enabled`, `friend_disabled_policy`, `message_curfew_enabled`, `remark`, `published_at`, `published_by`, `created_at`, `created_by`, `updated_at`, `updated_by`)
|
||||
SELECT
|
||||
tt.id, 1, t.policy_name, 'published',
|
||||
t.password_policy, t.login_rate_limit, t.sensitive_word_policy, t.file_review_policy, t.realname_policy, t.risk_challenge_policy,
|
||||
t.global_friend_enabled, t.friend_disabled_policy, t.message_curfew_enabled,
|
||||
'由默认模板补齐', NOW(), 0, NOW(), 0, NOW(), 0
|
||||
FROM `im_tenant` tt
|
||||
JOIN `im_security_policy_template` t ON t.id = (SELECT MIN(x.id) FROM `im_security_policy_template` x)
|
||||
WHERE tt.id > 0 AND tt.state = 1
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM `im_security_policy` sp
|
||||
WHERE sp.tenant_id = tt.id AND sp.publish_status = 'published' AND sp.deleted_at IS NULL
|
||||
);
|
||||
|
||||
-- 5. 存量商户补齐宵禁规则:从模板 JSON 展开(仅对当前无任何宵禁规则的商户策略,已有配置的商户不覆盖)
|
||||
INSERT INTO `im_message_curfew_rules`
|
||||
(`tenant_id`, `policy_id`, `rule_code`, `rule_name`, `date_type`, `custom_dates`, `weekdays`, `timezone`, `start_time`, `end_time`, `scope`, `whitelist_user_ids`, `whitelist_group_ids`, `message`, `status`, `sort`, `created_at`, `created_by`, `updated_at`, `updated_by`)
|
||||
SELECT
|
||||
sp.tenant_id, sp.id,
|
||||
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.ruleCode')),
|
||||
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.ruleName')),
|
||||
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.dateType')),
|
||||
JSON_EXTRACT(jt.r, '$.customDates'),
|
||||
JSON_EXTRACT(jt.r, '$.weekdays'),
|
||||
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.timezone')),
|
||||
STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.startTime')), '%H:%i'),
|
||||
STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.endTime')), '%H:%i'),
|
||||
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.scope')),
|
||||
JSON_EXTRACT(jt.r, '$.whitelistUserIds'),
|
||||
JSON_EXTRACT(jt.r, '$.whitelistGroupIds'),
|
||||
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.message')),
|
||||
CAST(JSON_EXTRACT(jt.r, '$.status') AS SIGNED),
|
||||
CAST(JSON_EXTRACT(jt.r, '$.sort') AS SIGNED),
|
||||
NOW(), 0, NOW(), 0
|
||||
FROM `im_security_policy` sp
|
||||
JOIN `im_security_policy_template` tpl
|
||||
JOIN JSON_TABLE(tpl.curfew_rules, '$[*]' COLUMNS (r JSON PATH '$')) jt
|
||||
WHERE tpl.id = (SELECT MIN(x.id) FROM `im_security_policy_template` x)
|
||||
AND sp.tenant_id > 0 AND sp.publish_status = 'published' AND sp.deleted_at IS NULL
|
||||
AND NOT EXISTS (SELECT 1 FROM `im_message_curfew_rules` r WHERE r.policy_id = sp.id AND r.deleted_at IS NULL);
|
||||
|
||||
-- 6. 软删 tenant_id=0 的策略记录与其宵禁规则(模板化后不再使用,保留软删可回溯)
|
||||
UPDATE `im_security_policy` SET deleted_at = NOW(), deleted_by = 0
|
||||
WHERE tenant_id = 0 AND deleted_at IS NULL;
|
||||
UPDATE `im_message_curfew_rules` SET deleted_at = NOW(), deleted_by = 0
|
||||
WHERE tenant_id = 0 AND deleted_at IS NULL;
|
||||
Reference in New Issue
Block a user