All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 10m15s
- 新增单行配置表 tb_asset_auto_renewal_config 与尝试记录表 tb_asset_auto_renewal_attempt(迁移 000229/000230) - 每日按上海自然日扫描,窗口内以同一资产钱包可用余额续购当前主套餐,资金/订单/套餐/审计同一事务闭合 - 唯一键保证每资产每日至多一次尝试,占位中断由后续扫描收敛,当日不重试 - 四类失败原因向客户与店铺各投递每日至多一条站内通知,并注册通知类型与个人客户白名单 - 续费成功后按条件经 Outbox 可靠投递复机,新增恢复扫描只查询回填,不使用即发即弃调用 - 配置读写仅超级管理员与平台账号,保存记录操作者、前后值快照并登记统一审计 - tasks 7.1–7.15 全部验证通过(本机隔离 PostgreSQL/Redis,零外部渠道调用)
29 lines
1.6 KiB
SQL
29 lines
1.6 KiB
SQL
-- 回滚资产钱包自动续费尝试记录表,与 up 严格成对。
|
||
-- 删除顺序与 up 的创建顺序严格倒序:先删索引与唯一键,再删表(表内 CHECK 约束随表一并移除,
|
||
-- 不留残余约束与索引)。
|
||
--
|
||
-- 不可逆说明(ENG-MIG-001 例外条件):本迁移的 down 会删除 tb_asset_auto_renewal_attempt 与
|
||
-- 其中的每日尝试、资金扣款、续费订单与复机结果快照。已发生的续费事实仍可通过 tb_order、
|
||
-- tb_payment、tb_asset_wallet_transaction、tb_package_usage 与 tb_audit_event 复核,
|
||
-- 但「该资产当日是否已尝试/被跳过/复机结果」无法由数据库自身重建,
|
||
-- 因此 down 只在上述尝试事实已无留存需求时执行。
|
||
--
|
||
-- 守卫:存在仍处于处理中(占位后未收敛)的尝试行时直接阻断回滚,避免在未收敛状态下删除记录,
|
||
-- 使次日扫描无法把中断的尝试收敛为终态。
|
||
|
||
DO $$
|
||
BEGIN
|
||
IF EXISTS (SELECT 1 FROM tb_asset_auto_renewal_attempt WHERE deleted_at IS NULL AND status = 1 LIMIT 1) THEN
|
||
RAISE EXCEPTION '存在仍处于处理中的自动续费尝试记录,拒绝回滚以避免丢失未收敛的尝试事实';
|
||
END IF;
|
||
END $$;
|
||
|
||
LOCK TABLE tb_asset_auto_renewal_attempt IN ACCESS EXCLUSIVE MODE;
|
||
|
||
DROP INDEX IF EXISTS idx_asset_auto_renewal_attempt_asset;
|
||
DROP INDEX IF EXISTS idx_asset_auto_renewal_attempt_resume_unresolved;
|
||
DROP INDEX IF EXISTS idx_asset_auto_renewal_attempt_unfinished;
|
||
DROP INDEX IF EXISTS uq_asset_auto_renewal_attempt_key;
|
||
|
||
DROP TABLE IF EXISTS tb_asset_auto_renewal_attempt;
|