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='通知服务外部通知投递位点和死信表';
