SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; -- 使用 utf8mb4 连接字符集,保证中文注释、中文名称和 emoji 在导入时不被降级。 CREATE DATABASE IF NOT EXISTS hyapp_notice DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; USE hyapp_notice; CREATE TABLE IF NOT EXISTS notice_delivery_events ( source_name VARCHAR(64) NOT NULL COMMENT '事件源服务或表名,例如钱包 outbox', app_code VARCHAR(32) NOT NULL COMMENT '租户编码,必须和源 outbox 保持一致', source_event_id VARCHAR(128) NOT NULL COMMENT '源事件幂等键', channel VARCHAR(64) NOT NULL COMMENT '投递通道,例如腾讯云 IM 单聊', notice_type VARCHAR(64) NOT NULL COMMENT '业务通知类型,例如钱包余额变更', target_user_id BIGINT NOT NULL COMMENT '私有通知目标用户', status VARCHAR(32) NOT NULL COMMENT '投递状态:投递中、已投递、可重试、失败', retry_count INT NOT NULL DEFAULT 0 COMMENT '已尝试次数,达到上限后进入失败', locked_by VARCHAR(128) NOT NULL DEFAULT '' COMMENT '当前抢占工作节点', lock_until_ms BIGINT NOT NULL DEFAULT 0 COMMENT '抢占锁过期时间,UTC epoch ms', next_retry_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '下一次允许重试时间,UTC epoch ms', payload_json JSON NOT NULL COMMENT '发送给客户端的最终负载快照', last_error TEXT NULL COMMENT '最后一次投递失败原因,限制在应用层截断', delivered_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '成功投递时间,UTC epoch ms', created_at_ms BIGINT NOT NULL COMMENT '通知位点创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '通知位点更新时间,UTC epoch ms', PRIMARY KEY (source_name, app_code, source_event_id, channel), KEY idx_notice_delivery_retry (source_name, app_code, channel, status, next_retry_at_ms, updated_at_ms), KEY idx_notice_delivery_lock (source_name, app_code, channel, status, lock_until_ms, updated_at_ms), KEY idx_notice_delivery_retention (app_code, status, updated_at_ms, source_name, source_event_id, channel), KEY idx_notice_delivery_target (app_code, target_user_id, updated_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知服务外部通知投递位点和死信表';