package mysql import ( "context" "hyapp/pkg/xerr" ) func (r *Repository) ensureWheelTables(ctx context.Context) error { if r == nil || r.db == nil { return xerr.New(xerr.Unavailable, "mysql repository is not configured") } statements := []string{ `CREATE TABLE IF NOT EXISTS wheel_rule_versions ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', wheel_id VARCHAR(96) NOT NULL COMMENT '转盘 ID', rule_version BIGINT NOT NULL COMMENT '不可变规则版本', enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用', draw_price_coins BIGINT NOT NULL COMMENT '单抽价格,金币', target_rtp_ppm BIGINT NOT NULL COMMENT '金币和礼物 RTP 目标,ppm', pool_rate_ppm BIGINT NOT NULL COMMENT '每笔消耗进入转盘基础奖池比例,ppm', settlement_window_draws BIGINT NOT NULL COMMENT 'RTP 观察窗口抽数', initial_pool_coins BIGINT NOT NULL DEFAULT 0 COMMENT '初始奖池水位', pool_reserve_coins BIGINT NOT NULL DEFAULT 0 COMMENT '奖池安全水位', max_single_rtp_payout BIGINT NOT NULL DEFAULT 0 COMMENT '单次计入 RTP 的最大返奖', 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, wheel_id, rule_version), KEY idx_wheel_rule_versions_latest (app_code, wheel_id, rule_version), KEY idx_wheel_rule_versions_enabled (app_code, enabled, created_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转盘规则版本表'`, `CREATE TABLE IF NOT EXISTS wheel_prize_tiers ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', wheel_id VARCHAR(96) NOT NULL COMMENT '转盘 ID', rule_version BIGINT NOT NULL COMMENT '规则版本', tier_id VARCHAR(96) NOT NULL COMMENT '奖档 ID', display_name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '展示名称快照', reward_type VARCHAR(32) NOT NULL COMMENT 'coin/gift/prop/dress', reward_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '礼物或道具资源 ID', reward_count BIGINT NOT NULL DEFAULT 1 COMMENT '奖励数量', reward_coins BIGINT NOT NULL DEFAULT 0 COMMENT '金币奖励金额', rtp_value_coins BIGINT NOT NULL DEFAULT 0 COMMENT '计入 RTP 的奖励价值;道具装扮强制为 0', weight_ppm BIGINT NOT NULL COMMENT '随机权重,ppm 口径', enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用', metadata_json JSON NOT NULL COMMENT '奖品展示和发放扩展快照', PRIMARY KEY (app_code, wheel_id, rule_version, tier_id), KEY idx_wheel_prize_tiers_rule (app_code, wheel_id, rule_version) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转盘奖档表'`, `CREATE TABLE IF NOT EXISTS wheel_rtp_windows ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', wheel_id VARCHAR(96) NOT NULL COMMENT '转盘 ID', window_index BIGINT NOT NULL COMMENT 'RTP 窗口序号', target_rtp_ppm BIGINT 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 DEFAULT 0 COMMENT '目标返奖', actual_rtp_value_coins BIGINT NOT NULL DEFAULT 0 COMMENT '实际计入 RTP 的返奖', carry_ppm BIGINT NOT NULL DEFAULT 0 COMMENT '整数除法余数', status VARCHAR(32) NOT NULL DEFAULT 'open' COMMENT 'open/closed', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, wheel_id, window_index), KEY idx_wheel_rtp_windows_open (app_code, wheel_id, status, window_index) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转盘 RTP 观察窗口'`, `CREATE TABLE IF NOT EXISTS wheel_pools ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', wheel_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 '累计 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, wheel_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转盘基础奖池'`, `CREATE TABLE IF NOT EXISTS wheel_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', visible_region_id BIGINT NOT NULL DEFAULT 0 COMMENT '可见区域 ID', wheel_id VARCHAR(96) NOT NULL COMMENT '转盘 ID', coin_spent BIGINT NOT NULL COMMENT '消耗金币', rule_version BIGINT NOT NULL COMMENT '规则版本', rtp_window_index BIGINT NOT NULL COMMENT 'RTP 窗口', selected_tier_id VARCHAR(96) NOT NULL COMMENT '命中奖档', reward_type VARCHAR(32) NOT NULL COMMENT 'coin/gift/prop/dress', reward_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '礼物或道具资源 ID', reward_count BIGINT NOT NULL DEFAULT 0 COMMENT '奖励数量', reward_coins BIGINT NOT NULL DEFAULT 0 COMMENT '金币奖励金额', rtp_value_coins BIGINT NOT NULL DEFAULT 0 COMMENT '计入 RTP 的奖励价值', candidate_tiers_json JSON NOT NULL COMMENT '候选过滤快照', rtp_snapshot_json JSON NOT NULL COMMENT 'RTP 快照', prize_metadata_json JSON NOT NULL COMMENT '奖品扩展快照', 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_wheel_draw_command (app_code, command_id), KEY idx_wheel_draw_wheel (app_code, wheel_id, created_at_ms), KEY idx_wheel_draw_user (app_code, user_id, created_at_ms), KEY idx_wheel_draw_status (app_code, reward_status, updated_at_ms), KEY idx_wheel_draw_created (app_code, created_at_ms, draw_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转盘抽奖事实'`, `CREATE TABLE IF NOT EXISTS wheel_draw_stats ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', wheel_id VARCHAR(96) NOT NULL COMMENT '转盘 ID', total_draws BIGINT NOT NULL DEFAULT 0 COMMENT '抽奖次数', unique_users BIGINT NOT NULL DEFAULT 0 COMMENT '参与用户数', total_spent_coins BIGINT NOT NULL DEFAULT 0 COMMENT '消耗金币', total_rtp_value_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, wheel_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转盘后台汇总统计'`, `CREATE TABLE IF NOT EXISTS wheel_draw_stat_users ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码', wheel_id VARCHAR(96) NOT NULL COMMENT '转盘 ID', user_id BIGINT NOT NULL COMMENT '用户 ID', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', PRIMARY KEY (app_code, wheel_id, user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转盘统计用户去重'`, } for _, statement := range statements { if _, err := r.db.ExecContext(ctx, statement); err != nil { return err } } return nil }