Files
prop-ai-hr/backend/script/sql/update/aihr_20260723_broadcast_targeting_mysql8.sql
T

97 lines
5.1 KiB
SQL

-- 银城大喇叭 M1:定向提醒与必读阅读闭环。
-- 保留 M0 的全租户公开消息语义;定向规则只决定优先提醒/必读对象,不隐藏公开频道内容。
-- 可重复执行,需在 aihr_20260722_broadcast_mysql8.sql 之后执行。
SET @has_broadcast_required_read := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE table_schema = DATABASE() AND table_name = 'aihr_broadcast_message'
AND column_name = 'required_read'
);
SET @broadcast_m1_ddl := IF(
@has_broadcast_required_read = 0,
'ALTER TABLE aihr_broadcast_message ADD COLUMN required_read tinyint(1) NOT NULL DEFAULT 0 COMMENT ''是否必读'' AFTER content',
'SELECT 1'
);
PREPARE aihr_broadcast_m1_stmt FROM @broadcast_m1_ddl; EXECUTE aihr_broadcast_m1_stmt; DEALLOCATE PREPARE aihr_broadcast_m1_stmt;
-- 用于发布幂等重试时校验必读/定向载荷。历史 M0 消息保留 NULL,等价于非必读且未定向。
SET @has_broadcast_target_payload_hash := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE table_schema = DATABASE() AND table_name = 'aihr_broadcast_message'
AND column_name = 'target_payload_hash'
);
SET @broadcast_m1_ddl := IF(
@has_broadcast_target_payload_hash = 0,
'ALTER TABLE aihr_broadcast_message ADD COLUMN target_payload_hash char(64) DEFAULT NULL COMMENT ''必读及定向载荷SHA-256'' AFTER publish_request_hash',
'SELECT 1'
);
PREPARE aihr_broadcast_m1_stmt FROM @broadcast_m1_ddl; EXECUTE aihr_broadcast_m1_stmt; DEALLOCATE PREPARE aihr_broadcast_m1_stmt;
CREATE TABLE IF NOT EXISTS `aihr_broadcast_target_rule` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '定向规则ID',
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
`message_id` bigint NOT NULL COMMENT '消息ID',
`target_type` varchar(20) NOT NULL COMMENT 'PROJECT/POSITION/LEVEL',
`target_value` varchar(100) NOT NULL COMMENT '目标值',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_aihr_broadcast_target_rule` (`tenant_id`, `message_id`, `target_type`, `target_value`),
KEY `idx_aihr_broadcast_target_rule_message` (`tenant_id`, `message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='银城大喇叭定向规则快照';
CREATE TABLE IF NOT EXISTS `aihr_broadcast_target_recipient` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '定向对象快照ID',
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
`message_id` bigint NOT NULL COMMENT '消息ID',
`recipient_key` varchar(180) NOT NULL COMMENT '外部主体及映射账号唯一键',
`subject_ref` varchar(100) NOT NULL COMMENT '组织快照外部主体ID',
`user_id` bigint DEFAULT NULL COMMENT '匹配到的员工账号ID',
`target_status` varchar(20) NOT NULL COMMENT 'MATCHED/UNMATCHED',
`target_reason` varchar(100) NOT NULL COMMENT '项目/岗位/职级定向原因',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_aihr_broadcast_target_recipient` (`tenant_id`, `message_id`, `recipient_key`),
KEY `idx_aihr_broadcast_target_recipient_user` (`tenant_id`, `user_id`, `message_id`, `target_status`),
KEY `idx_aihr_broadcast_target_recipient_message` (`tenant_id`, `message_id`, `target_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='银城大喇叭定向对象快照';
-- 与 M0 消息表保持同一租户事实排序规则,避免历史库的 utf8mb4_general_ci 与 MySQL 8 0900_ai_ci 混用。
SET @broadcast_m1_target_collation := (
SELECT collation_name FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'aihr_knowledge_info' AND column_name = 'tenant_id'
LIMIT 1
);
SET @broadcast_m1_target_collation := COALESCE(@broadcast_m1_target_collation, @@collation_database);
SET @broadcast_target_rule_collation := (
SELECT table_collation FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name = 'aihr_broadcast_target_rule'
LIMIT 1
);
SET @broadcast_m1_ddl := IF(
@broadcast_target_rule_collation = @broadcast_m1_target_collation,
'SELECT 1',
CONCAT('ALTER TABLE aihr_broadcast_target_rule CONVERT TO CHARACTER SET utf8mb4 COLLATE ', @broadcast_m1_target_collation)
);
PREPARE aihr_broadcast_m1_stmt FROM @broadcast_m1_ddl; EXECUTE aihr_broadcast_m1_stmt; DEALLOCATE PREPARE aihr_broadcast_m1_stmt;
SET @broadcast_target_recipient_collation := (
SELECT table_collation FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name = 'aihr_broadcast_target_recipient'
LIMIT 1
);
SET @broadcast_m1_ddl := IF(
@broadcast_target_recipient_collation = @broadcast_m1_target_collation,
'SELECT 1',
CONCAT('ALTER TABLE aihr_broadcast_target_recipient CONVERT TO CHARACTER SET utf8mb4 COLLATE ', @broadcast_m1_target_collation)
);
PREPARE aihr_broadcast_m1_stmt FROM @broadcast_m1_ddl; EXECUTE aihr_broadcast_m1_stmt; DEALLOCATE PREPARE aihr_broadcast_m1_stmt;
SET @has_broadcast_required_read := NULL;
SET @has_broadcast_target_payload_hash := NULL;
SET @broadcast_m1_target_collation := NULL;
SET @broadcast_target_rule_collation := NULL;
SET @broadcast_target_recipient_collation := NULL;
SET @broadcast_m1_ddl := NULL;