Zuncle 535106f158 fix(coupon): 修复订单超时取消时金额券未退还的bug
问题:
  commit b9a40df 修复了 CancelOrder()(用户/管理员主动取消)的券退回逻辑,
  去掉了 `AND status = 4` 条件,但遗漏了 order_timeout.go 中超时取消的
  同一逻辑,导致次数卡包(game_pass_package)订单超时取消时金额券余额丢失。

根因:
  game_pass_package 下单时,金额券(type=1)通过 applyCouponToGamePassOrder()
  直接扣减 balance_amount 并保持 status=1(有余额)或 status=2(用完),
  不会设置 status=4(预扣中)。而 cancelExpiredOrder() 的 UPDATE 语句带有
  `WHERE id = ? AND status = 4` 条件,导致匹配不到行,退券静默失败。

  生产已确认影响:用户9110的券1690(订单28229)和券1532(订单26743)
  因此bug各丢失10元余额。

修复:
  - 去掉 `AND status = 4` 条件,改为 `WHERE id = ?`,兼容所有券状态
  - 新增幂等校验:先查 timeout_refund 流水是否已存在,防止重复退还
  - 新增兜底逻辑:order_coupons 无记录时,从 user_coupon_ledger 流水
    回推预扣金额,与 CancelOrder() 的修复方案完全对齐
2026-03-20 20:32:30 +08:00
..
2026-03-20 00:57:17 +08:00