79 lines
4.5 KiB
SQL
79 lines
4.5 KiB
SQL
-- 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';
|