-- VIP 每日金币返现由 wallet-service 独占:日 run 固化 UTC 日切金额矩阵,用户返现行保存资格、窗口和领取交易。 -- 本迁移可重复执行;不猜测任一等级金额,历史空配置会安全关闭,等待运营填 metadata_json.coin_amount 后再启用。 SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; USE hyapp_wallet; CREATE TABLE IF NOT EXISTS vip_daily_coin_rebate_runs ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码,用于多租户隔离', task_day CHAR(10) NOT NULL COMMENT 'UTC 日期,YYYY-MM-DD', run_id VARCHAR(96) NOT NULL COMMENT '稳定批任务 ID', day_start_ms BIGINT NOT NULL COMMENT 'UTC 当日开始,epoch ms', day_end_ms BIGINT NOT NULL COMMENT 'UTC 次日开始,排他结束 epoch ms', config_version BIGINT NOT NULL COMMENT '创建 run 时 VIP 配置版本', level_amounts_json JSON NOT NULL COMMENT '等级到返现金额的不可变快照', status VARCHAR(32) NOT NULL COMMENT 'running/completed', last_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '已扫描会员游标', scanned_count BIGINT NOT NULL DEFAULT 0 COMMENT '累计扫描会员数', created_count 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', completed_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '完成时间,UTC epoch ms', PRIMARY KEY (app_code, task_day), UNIQUE KEY uk_vip_rebate_run_id (app_code, run_id), KEY idx_vip_rebate_run_status (app_code, status, task_day) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='VIP 每日金币返现运行快照'; CREATE TABLE IF NOT EXISTS vip_daily_coin_rebates ( app_code VARCHAR(32) NOT NULL COMMENT '应用编码,用于多租户隔离', rebate_id VARCHAR(96) NOT NULL COMMENT '返现事实 ID', run_id VARCHAR(96) NOT NULL COMMENT '来源日 run ID', task_day CHAR(10) NOT NULL COMMENT 'UTC 日期,YYYY-MM-DD', user_id BIGINT NOT NULL COMMENT '领取用户 ID', vip_level INT NOT NULL COMMENT 'UTC 日切时付费 VIP 等级快照', vip_name VARCHAR(64) NOT NULL COMMENT 'VIP 名称快照', coin_amount BIGINT NOT NULL COMMENT '返现金币正整数快照', status VARCHAR(32) NOT NULL COMMENT 'claimable/claimed;expired 由查询层投影', available_at_ms BIGINT NOT NULL COMMENT '领取开始,UTC epoch ms', expires_at_ms BIGINT NOT NULL COMMENT '领取排他结束,UTC epoch ms', config_version BIGINT NOT NULL COMMENT '来源 run 的 VIP 配置版本', claimed_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '实际领取时间,UTC epoch ms', wallet_transaction_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '领取入账交易 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, rebate_id), UNIQUE KEY uk_vip_rebate_user_day (app_code, task_day, user_id), KEY idx_vip_rebate_user_day (app_code, user_id, task_day, rebate_id), KEY idx_vip_rebate_expiry (app_code, status, expires_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='VIP 每日金币返现领取事实'; UPDATE vip_level_benefits SET status = 'disabled', trial_enabled = FALSE WHERE benefit_code = 'daily_coin_rebate' AND ( JSON_EXTRACT(metadata_json, '$.coin_amount') IS NULL OR JSON_TYPE(JSON_EXTRACT(metadata_json, '$.coin_amount')) <> 'INTEGER' OR CAST(JSON_UNQUOTE(JSON_EXTRACT(metadata_json, '$.coin_amount')) AS DECIMAL(65, 0)) <= 0 OR CAST(JSON_UNQUOTE(JSON_EXTRACT(metadata_json, '$.coin_amount')) AS DECIMAL(65, 0)) > 9223372036854775807 ); UPDATE vip_level_benefits SET trial_enabled = FALSE, execution_scope = 'wallet' WHERE benefit_code = 'daily_coin_rebate'; UPDATE vip_level_benefits SET execution_scope = 'notice' WHERE benefit_code = 'online_global_notice'; -- 已经先上线过领取交易的环境补齐统一 VIP command guard;同 command 不能再被购买、发卡或另一返现复用。 -- 显式限定当前 App 才能使用 wallet_transactions 的 (app_code,biz_type,created_at_ms) 索引; -- 禁止在生产迁移中只按 biz_type 扫描完整钱包交易表。 INSERT IGNORE INTO vip_command_locks ( app_code, command_id, biz_type, request_hash, created_at_ms, updated_at_ms ) SELECT app_code, command_id, biz_type, request_hash, created_at_ms, updated_at_ms FROM wallet_transactions WHERE app_code IN ('lalu', 'fami', 'huwaa', 'yumi') AND biz_type = 'vip_daily_coin_rebate';