refund-manual-close.php
✔ 隔离库 jnc_ma_e2e_h8 就绪(105 张表,缺列 0)
【组 E refundGatewaySettledTotal 与 refundGatewayPortion 的关系】
✅ 网关已结算总额 = 10000
✅ 剩余待退额 = 总额 − 已退额 = 4000
✅ 等式 settledTotal == portion + 已退
✅ 不存在的 ddnum → 总额 0
【组 C 授权双闸 —— 缺位 / 缺 PIN / PIN 错 / 齐全】
✅ 只有工单位 38 → 被拒(权限不足)
✅ 缺位:余额一分未动
✅ 缺位:退款单仍是失败态 2
✅ 缺位:工单仍未关闭
✅ 有位但不填 PIN → 被拒
✅ 缺 PIN:余额一分未动
✅ 缺 PIN:退款单仍是失败态 2
✅ PIN 填错 → 被拒
✅ PIN 错:余额一分未动
✅ PIN 错:退款单仍是失败态 2
【组 A 金额口径 —— 部分已自动退成功的单(SEC-0036 算例)】
✅ 位 + PIN 齐全 → 成功
✅ 🔴 站内余额(vgold)增量 == 0(旧口径会 +6000)
✅ 退款单迁到已同意 1
✅ 退款单记下了 pin_verified
✅ 订单迁到 52(已退款并结清)
✅ 工单已关闭
【组 B 台账收口 —— {0,2} 补成 1 并写入 ops 提交的**真实**回执;3 留给日批复查】
✅ 两行台账都变成 status=1
✅ 原 status=2 那行写入了 ops 提交的真实回执
✅ 原本就 status=1 的那行没被改写凭证
✅ B3 全库不再出现合成串 MANUAL_T
✅ status=3 的行**仍是 3**(留给日批 stepRefundChannelRecheck)
✅ 同单里 status=2 的行仍被补成 1
✅ 该单站内增量也是 0(网关总额=ddrmbpay)
【组 B3 回执号 —— 每一笔待退行都要填真的,少一笔 / 形态不对都整笔拒】
✅ B3 一个回执号都不填 → 被拒
✅ B3 不填:台账两行都没动
✅ B3 不填:余额一分未动
✅ B3 不填:退款单仍是失败态 2
✅ B3 不填:工单仍未关闭
✅ B3 只填了两笔里的一笔 → 被拒
✅ B3 漏填:台账两行都没动(不允许部分补)
✅ B3 回执号含中文 → 被拒
✅ B3 回执号含中文:台账未改
✅ B3 回执号含空格 → 被拒
✅ B3 回执号含空格:台账未改
✅ B3 回执号超过 64 位 → 被拒
✅ B3 回执号超过 64 位:台账未改
✅ B3 逐笔填齐 → 成功
✅ B3 两笔都补成 status=1
✅ B3 两笔各自拿到自己的回执
✅ B3 两个回执号确实不相同
【组 A 守卫 —— 两条不该被误伤的正常路径】
✅ 守卫 1 纯站内单:vgold 确实 +5000(全额退站内)
✅ 守卫 1 纯站内单:退款单已完成
✅ 守卫 2 网关全失败单:站内增量 == 0(新旧口径同值,证明只动了"部分已退"那一档)
【组 D refund_retry —— 同一条性质的另一半(它已有 PIN,只缺位)】
✅ 只有工单位 38 → refund_retry 也被拒
✅ 缺位:余额一分未动
✅ 缺位:台账一行未改
✅ 补位后越过授权闸,落到既有"部分已退"守卫(全程不碰通道)
【组 R 强制记账失败回执 —— 不能把内部异常字符串拼给管理员看】
· 订单已不可迁移(状态机拒) —— 改前回执是 statechangeByddnum_strict_failed expected=0 changed=0
✅ 强制记账确实失败了(否则下面全在空转)
✅ 🔴 回执里没有 statechangeByddnum 这种内部标识
✅ 🔴 回执里没有 expected= 这种内部标识
❌ 🔴 回执是人话:说清「已不是待付款状态」
实得 false
预期 true
❌ 回执还告诉管理员下一步干什么(去通道后台核实)
实得 false
预期 true
✅ 失败后工单留开
✅ 失败后 pd 仍未入账(整笔回滚)
✅ 失败后订单金额一分未动
· 金额对不上(reject 档)也要是人话
✅ 金额对不上时也失败了
✅ 🔴 回执里没有 amount_mismatch_unpaid 这种内部标识
✅ 🔴 回执是人话:说清金额与欠款对不上
✅ 金额对不上时 pd 仍未入账
✅ 金额对不上时订单金额一分未动
· 守卫:金额与状态都对时,强制记账仍然记得成(别把闸修成全拒)
✅ 🔴 守卫:合法场景没有报「强制记账未成功」
✅ 守卫:pd 已入账
✅ 守卫:订单收到这笔钱
✅ 守卫:工单被关掉
────────────────────────────────
PASS=66 FAIL=2
✔ 已销毁 jnc_ma_e2e_h8