2026-07-15 09:43:33 +08:00

127 lines
8.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}