package mysql import "context" // ensureActivityTemplateTables mirrors deploy/mysql/migrations/010_activity_templates.sql for explicitly enabled local auto-migrate. // Production still applies the numbered SQL migration so schema history remains reviewable and deterministic. func (r *Repository) ensureActivityTemplateTables(ctx context.Context) error { statements := []string{ `CREATE TABLE IF NOT EXISTS activity_templates ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', template_code VARCHAR(64) NOT NULL COMMENT 'App 内唯一业务编码', name VARCHAR(128) NOT NULL COMMENT '后台内部名称', activity_type VARCHAR(32) NOT NULL DEFAULT 'gift_challenge' COMMENT '活动类型', status VARCHAR(24) NOT NULL DEFAULT 'draft' COMMENT 'draft/published/disabled/archived', start_ms BIGINT NOT NULL DEFAULT 0 COMMENT '活动开始,UTC epoch ms,包含', end_ms BIGINT NOT NULL DEFAULT 0 COMMENT '活动结束,UTC epoch ms,不包含', all_regions BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否覆盖全部区域', daily_leaderboard_size INT NOT NULL DEFAULT 100 COMMENT '日榜最多展示人数', total_leaderboard_size INT NOT NULL DEFAULT 100 COMMENT '总榜最多展示人数', display_config_json JSON NOT NULL COMMENT '客户端布局和样式配置', revision BIGINT NOT NULL DEFAULT 1 COMMENT '后台编辑乐观锁版本', published_version BIGINT NOT NULL DEFAULT 0 COMMENT '最近发布快照版本', created_by_admin_id BIGINT NOT NULL COMMENT '创建管理员', updated_by_admin_id BIGINT NOT NULL COMMENT '最后更新管理员', published_by_admin_id 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', published_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '最近发布时间,UTC epoch ms', archived_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '软归档时间,UTC epoch ms', PRIMARY KEY (app_code, template_id), UNIQUE KEY uk_activity_template_code (app_code, template_code), KEY idx_activity_template_list (app_code, status, updated_at_ms, template_id), KEY idx_activity_template_period (app_code, status, start_ms, end_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='可排期运营活动模版实例'`, `CREATE TABLE IF NOT EXISTS activity_template_publish_locks ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', updated_at_ms BIGINT NOT NULL COMMENT '最近获取发布锁时间,UTC epoch ms', PRIMARY KEY (app_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版发布事务互斥行'`, `CREATE TABLE IF NOT EXISTS activity_template_regions ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', region_id BIGINT NOT NULL COMMENT '投放区域 ID', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', PRIMARY KEY (app_code, template_id, region_id), KEY idx_activity_template_region_match (app_code, region_id, template_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版投放区域'`, `CREATE TABLE IF NOT EXISTS activity_template_locales ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', locale VARCHAR(24) NOT NULL COMMENT 'BCP-47 基础语言码', title VARCHAR(160) NOT NULL DEFAULT '' COMMENT '客户端活动标题', rules MEDIUMTEXT NOT NULL 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, template_id, locale) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版多语言文案'`, `CREATE TABLE IF NOT EXISTS activity_template_gifts ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', gift_id VARCHAR(96) NOT NULL COMMENT 'wallet 礼物 ID', sort_order INT NOT NULL DEFAULT 0 COMMENT '展示顺序', name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '发布展示名称快照', icon_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '发布展示图标快照', coin_price BIGINT NOT NULL DEFAULT 0 COMMENT '发布时金币价格快照,仅供展示', price_version VARCHAR(64) 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, template_id, gift_id), KEY idx_activity_template_gift_match (app_code, gift_id, template_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版指定礼物和展示快照'`, `CREATE TABLE IF NOT EXISTS activity_template_tasks ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', task_key VARCHAR(64) NOT NULL COMMENT '模版内稳定任务键', task_type VARCHAR(32) NOT NULL COMMENT 'daily_visit/gift_count/gift_coin_amount', target_value BIGINT NOT NULL DEFAULT 0 COMMENT '任务达成阈值', reward_resource_group_id BIGINT NOT NULL DEFAULT 0 COMMENT 'wallet 奖励资源组 ID', sort_order INT 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, template_id, task_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版每日任务配置'`, `CREATE TABLE IF NOT EXISTS activity_template_rank_rewards ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', board_type VARCHAR(16) NOT NULL COMMENT 'daily/total', rank_from INT NOT NULL COMMENT '奖励起始名次,闭区间', rank_to INT NOT NULL COMMENT '奖励结束名次,闭区间', resource_group_id BIGINT NOT NULL DEFAULT 0 COMMENT 'wallet 奖励资源组 ID', sort_order INT 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, template_id, board_type, rank_from, rank_to) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版日榜和总榜名次奖励'`, `CREATE TABLE IF NOT EXISTS activity_template_assets ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', asset_key VARCHAR(64) NOT NULL COMMENT '素材位键', locale VARCHAR(24) NOT NULL DEFAULT '*' COMMENT '* 表示共享素材,否则为语言码', url VARCHAR(1024) NOT NULL COMMENT 'COS/CDN 素材地址', media_type VARCHAR(16) NOT NULL COMMENT 'image/webp/svga/pag', sort_order INT 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, template_id, asset_key, locale) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版客户端素材'`, `CREATE TABLE IF NOT EXISTS activity_template_versions ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码', template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID', version_no BIGINT NOT NULL COMMENT '单模版递增发布版本', snapshot_json JSON NOT NULL COMMENT '发布时完整不可变配置快照', published_by_admin_id BIGINT NOT NULL COMMENT '发布管理员', published_at_ms BIGINT NOT NULL COMMENT '发布时间,UTC epoch ms', PRIMARY KEY (app_code, template_id, version_no), KEY idx_activity_template_version_list (app_code, template_id, published_at_ms) ) 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 }