feat(payment): 悬账自动退款与部分退款
通道确认收到、但订单已经取消的钱(悬账)原先只在账目上留一条问题记录等人工,没有任何自动出口;
而首笔部分退款之后剩余金额永远退不了。两件都是 2026-09-10 审计列出的未落地项(§8 后半段、§14)。
- 新增窄口子退款入口 refundStranded(orderNo):断言订单已取消、通道确认收过钱、未退款、无退款记录,
仍经 OrderFundBoundaryService 锁订单行(与撤销核销、交易确认、普通退款串行化)。
- 放宽支付键可见性:从「仅已成功流水」到「已成功,或已关闭且通道已确认成功」——旧实现下这类悬账
连支付键都看不到,退款无从发起。
- 新增定时消费者 StrandedPaymentRefundRetry:扫「订单已取消但通道确认收款」的问题记录 → 调窄口子
退款 → 受理成功标为已解决;通道拒绝则升级告警(另记 STRANDED_REFUND_REJECTED 并 log.error),
问题记录保持未结,绝不静默吞掉。
- 部分退款改为按「已成功金额 + 处理中金额 < 实付」控制,退款能否发起由订单行锁 + 金额额度判定,
不再因「存在退款中或已退款」而拒绝。
回归:StrandedPaymentRefundTests(悬账退发起并结掉问题、通道拒绝走告警、已关闭但通道确认成功的支付
仍能被定位、窄口子拒绝非悬账与在途退款、100 退 40 再退 60 且超额被拒、人才端列表 refundStatus=2)。