fix(worker): 售后追缴自动驳回提现并扣冻结资金,修复欠款抵扣 500

- 修复欠款抵扣 SQL 参数类型冲突(debt_amount = $1 与 $1 = 0 推断不一致),
  此前手动偿还、验收报酬抵扣、充值/押金解冻/寄卖自动抵扣都会 500
- 追缴顺序改为 待解冻押金 → 提现冻结 → 可用余额 → 欠款:
  驳回待审核提现并直接扣走冻结资金,扣不完的部分退回可用余额
- 迁移 109:售后单记录 withdraw_deduction_amount,补 pending 提现部分索引
- 新增流水类型 after_sales_withdraw_deduction,前后端展示与标签同步
- 提现驳回退回余额后补调欠款自动抵扣,与充值/结算/解冻/寄卖路径对齐
- 补追缴分配单测与 SQL 参数类型静态门禁
This commit is contained in:
yml2213
2026-10-29 19:05:37 +08:00
parent fba0a13d44
commit c7d650b482
18 changed files with 372 additions and 10 deletions
@@ -0,0 +1,22 @@
-- 109_after_sales_withdraw_deduction.sql
--
-- 售后追缴要能把「提现冻结中」的钱一并扣掉。
--
-- 背景:追缴原本只扣「待解冻押金 + 可用余额」,打手在验收后立刻申请提现,
-- 钱就从可用余额挪进 frozen_withdraw_amount,追缴只能扣到零头,剩下挂欠款;
-- 而提现驳回后钱回到可用余额,也不会再抵扣。生产 case AS4f0566f0a192 即为此:
-- 追缴 75.15,实扣 0.35,1 分 27 秒后提现被驳回,75.00 停留在可用余额。
--
-- 现在的口径:追缴按 待解冻押金 → 提现冻结 → 可用余额 → 欠款 依次扣,
-- 动到提现冻结时自动把对应提现申请置为 rejected(备注写明是售后追缴驳回)。
ALTER TABLE worker_after_sales_cases
ADD COLUMN IF NOT EXISTS withdraw_deduction_amount BIGINT NOT NULL DEFAULT 0;
COMMENT ON COLUMN worker_after_sales_cases.withdraw_deduction_amount IS
'本单从「提现冻结」中扣走的金额(同时会驳回对应提现申请)';
-- 追缴时需要按打手捞 pending 提现申请并加行锁,补一个部分索引。
CREATE INDEX IF NOT EXISTS idx_worker_finance_requests_worker_pending_withdraw
ON worker_finance_requests (worker_id, created_at, id)
WHERE request_type = 'withdraw' AND status = 'pending';