SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; -- 使用 utf8mb4 连接字符集,保证中文注释、中文名称和 emoji 在导入时不被降级。 CREATE DATABASE IF NOT EXISTS hyapp_lucky_gift DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE hyapp_lucky_gift; CREATE TABLE IF NOT EXISTS activities ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', activity_id VARCHAR(96) NOT NULL COMMENT '活动 ID', status VARCHAR(32) NOT NULL COMMENT '业务状态', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, activity_id), KEY idx_activities_status (app_code, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物兼容活动实例表'; CREATE TABLE IF NOT EXISTS activity_event_consumption ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', event_id VARCHAR(96) NOT NULL COMMENT '事件幂等 ID', event_type VARCHAR(96) NOT NULL COMMENT '事件类型', source VARCHAR(64) NOT NULL COMMENT '来源', status VARCHAR(32) NOT NULL COMMENT '业务状态', failure_reason VARCHAR(255) NULL COMMENT '失败原因', consumed_at_ms BIGINT NULL 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 (app_code, event_id), KEY idx_activity_event_consumption_status (app_code, status), KEY idx_activity_event_consumption_updated_at (app_code, updated_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动事件消费位点表'; CREATE TABLE IF NOT EXISTS lucky_gift_outbox ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', outbox_id VARCHAR(96) NOT NULL COMMENT '发件箱 ID', event_type VARCHAR(96) NOT NULL COMMENT '事件类型', payload BLOB NOT NULL COMMENT '业务负载快照', status VARCHAR(32) NOT NULL COMMENT '业务状态', retry_count INT NOT NULL DEFAULT 0 COMMENT '重试次数', next_retry_at_ms BIGINT NOT NULL COMMENT '下一次重试时间,UTC epoch ms', locked_by VARCHAR(128) NOT NULL DEFAULT '' COMMENT '当前锁定 worker', lock_until_ms BIGINT NOT NULL DEFAULT 0 COMMENT '锁过期时间,UTC epoch ms', last_error VARCHAR(512) NOT NULL DEFAULT '' COMMENT '最后一次失败原因', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, outbox_id), KEY idx_lucky_gift_outbox_status_retry (app_code, status, next_retry_at_ms), KEY idx_lucky_gift_outbox_lucky_retry (app_code, event_type, status, next_retry_at_ms, created_at_ms, outbox_id), KEY idx_lucky_gift_outbox_lucky_lock (app_code, event_type, status, lock_until_ms, created_at_ms, outbox_id), KEY idx_lucky_gift_outbox_retention (app_code, status, updated_at_ms, outbox_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物 owner outbox 表'; CREATE TABLE IF NOT EXISTS lucky_gift_rule_versions ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', rule_version BIGINT NOT NULL COMMENT '不可变规则版本', enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用', target_rtp_ppm BIGINT NOT NULL COMMENT '基础返奖目标,ppm', pool_rate_ppm BIGINT NOT NULL COMMENT '每笔扣费进入基础奖池比例,ppm', settlement_window_wager BIGINT NOT NULL COMMENT 'RTP 结算窗口流水,单位金币', control_band_ppm BIGINT NOT NULL COMMENT '正常波动带,ppm', gift_price_reference BIGINT NOT NULL COMMENT '配置参考礼物价格', novice_max_equivalent_draws BIGINT NOT NULL DEFAULT 2000 COMMENT '新手阶段截止等价抽数,按累计金币/参考价格折算', normal_max_equivalent_draws BIGINT NOT NULL DEFAULT 20000 COMMENT '正常阶段截止等价抽数,超过后进入高阶阶段', effective_from_ms BIGINT NOT NULL COMMENT '生效时间,UTC epoch ms', created_by_admin_id BIGINT NOT NULL DEFAULT 0 COMMENT '发布人', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', PRIMARY KEY (app_code, pool_id, rule_version), KEY idx_lucky_gift_rule_versions_latest (app_code, pool_id, rule_version), KEY idx_lucky_gift_rule_versions_enabled (app_code, enabled, created_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物 v2 规则版本表'; CREATE TABLE IF NOT EXISTS lucky_gift_stage_tiers ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', rule_version BIGINT NOT NULL COMMENT '规则版本', stage VARCHAR(32) NOT NULL COMMENT 'novice/normal/advanced', tier_id VARCHAR(96) NOT NULL COMMENT '奖档 ID', multiplier_ppm BIGINT NOT NULL COMMENT '倍率,1x = 1000000', base_weight_ppm BIGINT NOT NULL COMMENT '正常模式基础概率,ppm', high_water_only TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否高水位才开放', enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用', PRIMARY KEY (app_code, pool_id, rule_version, stage, tier_id), KEY idx_lucky_gift_stage_tiers_stage (app_code, pool_id, rule_version, stage) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物 v2 阶段奖档表'; CREATE TABLE IF NOT EXISTS lucky_rtp_windows ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', scope_type VARCHAR(32) NOT NULL COMMENT 'global 或 gift', scope_id VARCHAR(96) NOT NULL COMMENT 'global 或规则作用域', window_index BIGINT NOT NULL COMMENT 'RTP 窗口序号', target_rtp_ppm INT NOT NULL COMMENT '窗口目标 RTP', control_window_draws BIGINT NOT NULL COMMENT '窗口抽数', paid_draws BIGINT NOT NULL DEFAULT 0 COMMENT '窗口已抽次数', wager_coins BIGINT NOT NULL DEFAULT 0 COMMENT '窗口消耗金币', target_payout_coins BIGINT NOT NULL COMMENT '窗口目标基础返奖', actual_base_payout_coins BIGINT NOT NULL DEFAULT 0 COMMENT '窗口实际基础返奖', carry_ppm BIGINT NOT NULL DEFAULT 0 COMMENT '整数除法余数', status VARCHAR(32) NOT NULL DEFAULT 'open' COMMENT 'open/closed/underpaid', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, scope_type, scope_id, window_index), KEY idx_lucky_rtp_windows_open (app_code, scope_type, scope_id, status, window_index) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物 RTP 控制窗口'; CREATE TABLE IF NOT EXISTS lucky_pools ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', scope_type VARCHAR(32) NOT NULL COMMENT 'pool', scope_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', balance BIGINT NOT NULL DEFAULT 0 COMMENT '当前可用水位', reserve_floor BIGINT NOT NULL DEFAULT 0 COMMENT '安全水位', total_in BIGINT NOT NULL DEFAULT 0 COMMENT '累计入池', total_out BIGINT NOT NULL DEFAULT 0 COMMENT '累计基础返奖支出', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, scope_type, scope_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物单一基础奖池'; CREATE TABLE IF NOT EXISTS lucky_user_states ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', user_id BIGINT NOT NULL COMMENT '用户 ID', gift_id VARCHAR(96) NOT NULL COMMENT '奖池 ID;当前列名沿用旧内部作用域名', paid_draws BIGINT NOT NULL DEFAULT 0 COMMENT '该用户幸运礼物累计付费抽数', cumulative_wager_coins BIGINT NOT NULL DEFAULT 0 COMMENT '该用户在当前奖池累计消耗金币', equivalent_draws BIGINT NOT NULL DEFAULT 0 COMMENT '累计金币按规则参考价格折算后的等价抽数', loss_streak BIGINT NOT NULL DEFAULT 0 COMMENT '连续未获得可见奖励次数,中奖后清零', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, user_id, gift_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物用户体验池状态'; CREATE TABLE IF NOT EXISTS lucky_draw_records ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', draw_id VARCHAR(128) NOT NULL COMMENT '抽奖 ID', command_id VARCHAR(128) NOT NULL COMMENT '幂等命令 ID', user_id BIGINT NOT NULL COMMENT '用户 ID', device_id VARCHAR(128) NOT NULL COMMENT '设备 ID', room_id VARCHAR(96) NOT NULL COMMENT '房间 ID', anchor_id VARCHAR(96) NOT NULL COMMENT '主播关联 ID', visible_region_id BIGINT NOT NULL DEFAULT 0 COMMENT '房间可见区域 ID', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', gift_id VARCHAR(96) NOT NULL COMMENT '礼物 ID', coin_spent BIGINT NOT NULL COMMENT '消耗金币', rule_version BIGINT NOT NULL COMMENT '规则版本', experience_pool VARCHAR(32) NOT NULL COMMENT '体验池', rtp_window_index BIGINT NOT NULL COMMENT '全站 RTP 窗口', gift_rtp_window_index BIGINT NOT NULL COMMENT '礼物 RTP 窗口', selected_tier_id VARCHAR(96) NOT NULL COMMENT '命中奖档', base_reward_coins BIGINT NOT NULL DEFAULT 0 COMMENT '基础 RTP 返奖', effective_reward_coins BIGINT NOT NULL DEFAULT 0 COMMENT '用户可见总奖励', stage_feedback TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否阶段反馈', high_multiplier TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否高倍命中', candidate_tiers_json JSON NOT NULL COMMENT '候选过滤快照', pool_snapshot_json JSON NOT NULL COMMENT '奖池快照', rtp_snapshot_json JSON NOT NULL COMMENT 'RTP 快照', reward_status VARCHAR(32) NOT NULL COMMENT 'pending/granted/failed', reward_transaction_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '返奖钱包交易 ID', reward_failure_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '返奖失败原因', paid_at_ms BIGINT NOT NULL 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 (app_code, draw_id), UNIQUE KEY uk_lucky_draw_command (app_code, command_id), KEY idx_lucky_draw_pool (app_code, pool_id, created_at_ms), KEY idx_lucky_draw_user (app_code, user_id, created_at_ms), KEY idx_lucky_draw_gift (app_code, gift_id, created_at_ms), KEY idx_lucky_draw_room (app_code, room_id, created_at_ms), KEY idx_lucky_draw_region_created (app_code, visible_region_id, created_at_ms, draw_id), KEY idx_lucky_draw_status (app_code, reward_status, updated_at_ms), KEY idx_lucky_draw_created (app_code, created_at_ms, draw_id), KEY idx_lucky_draw_pool_status_summary (app_code, pool_id, reward_status, created_at_ms, draw_id), KEY idx_lucky_draw_gift_status_summary (app_code, pool_id, gift_id, reward_status, created_at_ms, draw_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物抽奖事实'; CREATE TABLE IF NOT EXISTS lucky_draw_pool_stats ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', gift_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '礼物 ID,空值表示奖池汇总', total_draws BIGINT NOT NULL DEFAULT 0 COMMENT '抽奖次数', unique_users BIGINT NOT NULL DEFAULT 0 COMMENT '参与用户数', unique_rooms BIGINT NOT NULL DEFAULT 0 COMMENT '参与房间数', total_spent_coins BIGINT NOT NULL DEFAULT 0 COMMENT '消耗金币', total_reward_coins BIGINT NOT NULL DEFAULT 0 COMMENT '返还金币', base_reward_coins BIGINT NOT NULL DEFAULT 0 COMMENT '基础 RTP 返奖', pending_draws BIGINT NOT NULL DEFAULT 0 COMMENT '待发放数量', granted_draws BIGINT NOT NULL DEFAULT 0 COMMENT '已发放数量', failed_draws BIGINT NOT NULL DEFAULT 0 COMMENT '发放失败数量', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, pool_id, gift_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物池级汇总统计'; CREATE TABLE IF NOT EXISTS lucky_draw_pool_day_stats ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', stat_day DATE NOT NULL COMMENT 'UTC 统计日', visible_region_id BIGINT NOT NULL DEFAULT 0 COMMENT '房间可见区域 ID', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', gift_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '礼物 ID,空值表示奖池汇总', draw_count BIGINT NOT NULL DEFAULT 0 COMMENT '抽奖次数', turnover_coin BIGINT NOT NULL DEFAULT 0 COMMENT '消耗金币', payout_coin BIGINT NOT NULL DEFAULT 0 COMMENT '用户可见返奖金币', base_reward_coin BIGINT NOT NULL DEFAULT 0 COMMENT '基础 RTP 返奖', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, stat_day, visible_region_id, pool_id, gift_id), KEY idx_lucky_draw_pool_day_overview (app_code, stat_day, pool_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物 Databi 日维度汇总'; CREATE TABLE IF NOT EXISTS lucky_draw_pool_stat_users ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', gift_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '礼物 ID,空值表示奖池汇总', user_id BIGINT NOT NULL COMMENT '用户 ID', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', PRIMARY KEY (app_code, pool_id, gift_id, user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物汇总用户去重'; CREATE TABLE IF NOT EXISTS lucky_draw_pool_stat_rooms ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', gift_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '礼物 ID,空值表示奖池汇总', room_id VARCHAR(96) NOT NULL COMMENT '房间 ID', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', PRIMARY KEY (app_code, pool_id, gift_id, room_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物汇总房间去重'; CREATE TABLE IF NOT EXISTS lucky_draw_pool_stat_cursors ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', cursor_name VARCHAR(64) NOT NULL COMMENT '游标名称', last_draw_created_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '最后已聚合 draw 创建时间', last_draw_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '同一毫秒内最后已聚合 draw ID', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, cursor_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='幸运礼物后台统计快照游标'; CREATE TABLE IF NOT EXISTS external_lucky_gift_draws ( app_code VARCHAR(32) NOT NULL COMMENT '外部 App 应用编码', request_id VARCHAR(128) NOT NULL COMMENT '外部 App 业务幂等 ID', draw_id VARCHAR(128) NOT NULL COMMENT 'HyApp 抽奖 ID', external_user_id VARCHAR(128) NOT NULL COMMENT '外部 App 用户 ID', pool_id VARCHAR(96) NOT NULL COMMENT '幸运礼物奖池 ID', gift_count BIGINT NOT NULL COMMENT '礼物数量', unit_amount BIGINT NOT NULL COMMENT '单个礼物金额,当前按 COIN 等价单位', total_amount BIGINT NOT NULL COMMENT '总金额,必须等于 gift_count * unit_amount', currency VARCHAR(16) NOT NULL DEFAULT 'COIN' COMMENT '金额币种', metadata_json JSON NOT NULL COMMENT '外部 App 扩展元数据', rule_version BIGINT NOT NULL DEFAULT 0 COMMENT '命中规则版本;0 表示未启用规则', selected_tier_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '命中奖档', multiplier_ppm BIGINT NOT NULL DEFAULT 0 COMMENT '倍率,1x = 1000000', reward_amount BIGINT NOT NULL DEFAULT 0 COMMENT '返回给外部 App 处理的奖励金额', reward_status VARCHAR(32) NOT NULL DEFAULT 'granted' COMMENT 'granted/failed;不代表 HyApp wallet 入账', paid_at_ms BIGINT NOT NULL COMMENT '外部 App 扣费完成时间,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 (app_code, request_id), UNIQUE KEY uk_external_lucky_draw_id (app_code, draw_id), KEY idx_external_lucky_user (app_code, external_user_id, created_at_ms), KEY idx_external_lucky_pool (app_code, pool_id, created_at_ms), KEY idx_external_lucky_status (app_code, reward_status, created_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='外部 App 幸运礼物抽奖事实表';