fix(withdraw): 新人档提现没成功也被判定已用(解绑微信退回后 0.1 永久锁死) #142
Reference in New Issue
Block a user
Delete Branch "fix/newbie-tier-restore-on-refund"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
新人提现 0.1 元,提现审核中时解绑微信 —— 现金正常退回,但「新人领取的 0.1 元」被判定为已使用:该档位从提现页永久消失,重提报 400。
根因
新人档(0.1/0.3)「一次性」的判定口径只看有没有发起过,完全不看提现单的最终状态。
withdraw_tier_states()里的used_newbie查询没有任何status过滤:而解绑微信时,
refund_reviewing_withdraws_on_unbind→_refund_withdraw把待审核单退回现金 + 置failed,但记录仍在库里。两者相撞:那条failed的单照样落进used_newbie→ 钱退了,资格没退。改法
判定口径从「发起过没有」改为「钱是不是真到手 / 正在路上」——只认
reviewing/pending/success:reviewing/pendingsuccessfailedrejected核心即查询加一行
WithdrawOrder.status.in_(_NEWBIE_TIER_HELD_STATUSES)。withdraw-info)与下单校验(create_withdraw)共用withdraw_tier_states,改一处两处同时生效,不会出现「显示能提、点了 400」。status语义,无新字段、无 alembic 迁移。failed,新查询天然排除它),无需数据修复脚本;已成功提现过的(success)仍正确锁死,不会误恢复。⚠️ 行为变更
7-9 定的「新人档发起就算(含被拒/失败)」按本次拍板放宽为「没成功打款就恢复」。
常规档(0.5 / 10 / 20)的「当天名额发起就算、被拒不退」规则一行未动。
🔴 测试按要求不进本 PR —— 但既有测试会失败,合入前需同步处理
本 PR 只含源码改动。既有测试
tests/test_withdraw_tiers.py::test_newbie_tiers_independent_and_once_forever锁死的正是本次推翻的旧口径(它断言「被拒后 0.1 消失、重提 400」)。已实测(main 上的原版测试 + 本 PR 的新代码):
本 PR 合入前需同步调整该测试,否则 main 会红。 本地已备好可用的测试改动(反转该断言,另加「解绑退回后恢复」回归 + 「成功打款后永久锁死」),需要即可单独提供。
待办
🤖 Generated with Claude Code
faa7039e7dto1b799a146a