order-payable-status.php

20260916-201504 轮 · 看它的历史
  ✔ 隔离库 jnc_ma_e2e_h8 就绪(105 张表,缺列 0)

【组 A ddStatusPayable() 与 turncondition() 逐状态对齐】
  ✅ 状态 1:可付判据 == 状态机有 '1_3' 出边
  ✅ 状态 3:可付判据 == 状态机有 '1_3' 出边
  ✅ 状态 4:可付判据 == 状态机有 '1_3' 出边
  ✅ 状态 5:可付判据 == 状态机有 '1_3' 出边
  ✅ 状态 21:可付判据 == 状态机有 '1_3' 出边
  ✅ 状态 52:可付判据 == 状态机有 '1_3' 出边
  ✅ 状态 53:可付判据 == 状态机有 '1_3' 出边
  ✅ 状态机里"可迁到已付"的状态恰好 1 个
  ✅ 字符串 "1" 也算可付(DB 取回常是字符串)
  ✅ 0 不可付
  ✅ null 不可付(fail-closed)
  ✅ 未知状态 99 不可付(fail-closed)

【组 B User::order_pay(全在线,不带 paymode)】
  ✅ 作废单:渲染出「订单状态已变更」错误页(证明真的走到了状态闸)
  ✅ 作废单:paydetail 一行未增
  ✅ 守卫:待付单 paydetail 确实 +1(证明这条链本来通,不是被别处拦死)
  ✅ 守卫:待付单没有出现状态闸文案

【组 C User::order_pay 余额分支 —— 余额不足支路(不迁状态,无 strict 兜底)】
  ✅ 作废单:vgold 一分未减
  ✅ 作废单:dd 四个金额列一字未改
  ✅ 作废单:paydetail 一行未增
  ✅ 守卫:待付单 vgold 确实被扣光
  ✅ 守卫:待付单 ddvirtualpay 收到 200
  ✅ 守卫:待付单 ddrmbpay 一分未增(余额只走 ddvirtualpay)
  ✅ 守卫:待付单 paydetail 确实 +1
  ✅ 守卫:待付单状态仍停在 1(这一支本就不迁状态)

【组 D 网关入口状态闸 —— 同一张 dd 只翻 ddstatus,比较 redirect 的调用行号】
  ✅ 支付宝 PayV2::doalipay:作废单被弹回订单详情
  ✅ 支付宝 PayV2::doalipay:作废单没落到别的错误页
  ✅ 支付宝 PayV2::doalipay:守卫 —— 待付单同样到得了 3.5(证明本用例真跑通了这条链)
  ✅ 支付宝 PayV2::doalipay:🔴 作废单是被**更早**那道闸拦的(line 100 < 108)
  ✅ 微信 WxPayV3::index:作废单被弹回订单详情
  ✅ 微信 WxPayV3::index:作废单没落到别的错误页
  ✅ 微信 WxPayV3::index:守卫 —— 待付单同样到得了 3.5(证明本用例真跑通了这条链)
  ✅ 微信 WxPayV3::index:🔴 作废单是被**更早**那道闸拦的(line 119 < 127)
  ✅ PayPal PayPalV2::order:作废单被弹回订单详情
  ✅ PayPal PayPalV2::order:作废单没落到别的错误页
  ✅ PayPal PayPalV2::order:守卫 —— 待付单同样到得了 3.5(证明本用例真跑通了这条链)
  ✅ PayPal PayPalV2::order:🔴 作废单是被**更早**那道闸拦的(line 95 < 104)
  ✅ Xendit XenditV2::order:作废单被弹回订单详情
  ✅ Xendit XenditV2::order:作废单没落到别的错误页
  ✅ Xendit XenditV2::order:守卫 —— 待付单同样到得了 3.5(证明本用例真跑通了这条链)
  ✅ Xendit XenditV2::order:🔴 作废单是被**更早**那道闸拦的(line 78 < 86)

【组 E WxApi::order_pay(小程序)+ WxWeb 两个入口(Flutter WebView)】
  ✅ WxApi 作废单:回「订单状态已变更」
  ✅ WxApi 作废单:paydetail 一行未增
  ✅ 守卫:WxApi 待付单越过状态闸,落到通道白名单那一句
  ✅ WxWeb/PayPal v2 作废单:回「订单状态已变更」
  ✅ WxWeb/PayPal v2 作废单:paydetail 一行未增
  ✅ 守卫:WxWeb/PayPal v2 待付单 paydetail 确实 +1
  ✅ WxWeb/微信 v3 作废单:回「订单状态已变更」
  ✅ WxWeb/微信 v3 作废单:paydetail 一行未增
  ✅ 守卫:WxWeb/微信 v3 待付单 paydetail 确实 +1

【组 G User::pay_select(展示)+ pay_select_do(提交),两者必须成对】
  ✅ 作废单:pay_select 不产出任何页面(被弹回订单详情)
  ✅ 守卫:待付单 pay_select 确实渲染出支付页(含本单 ddnum)
  ✅ 作废单:pay_select_do 没有把 ddapplymode 写进作废单
  ✅ 守卫:待付单 pay_select_do 确实写入了 ddapplymode=8(证明这条链本来通)

【组 F 残留窗口 —— 作废单真被付了钱时,结算侧会发生什么 + ops 从哪儿看得到】
  ✅ 作废单结算:判为 reject(CAS 之前就拒,不再靠状态机迁不动整笔回滚)
  ✅ 作废单结算:原因是 order_not_payable
  ✅ 作废单结算:结果带 alert_logged(PayPal 那条「reject 再告警」的分支据此不重复)
  ✅ 作废单结算:pd 仍是未结(pdstatus=0)
  ✅ 作废单结算:dd 四个金额列一字未改(钱确实没入账)
  ✅ 作废单结算:告警已落 jnc_sys_log(不是静默回滚)
  ✅ B1 作废单结算:建出了工单
  ✅ B1 工单 source 是 payment_uncertain
  ✅ B1 工单未关闭(status=0,会出现在 pending 列表)
  ✅ B1 工单挂在本单 ddnum 上
  ✅ B1 工单正文能直接定位到 pd
  ✅ B1 工单正文点名了拒绝原因
  ✅ B1 同一个 pd 再失败一次:工单仍然只有 1 张
  · R-1:余额+在线混合支付 → 取消(余额已退回,未付额回到全额)→ 网关那笔仍付进来
  ✅ R-1 金额对不上:reject / amount_mismatch_unpaid
  ✅ R-1 pd 仍是未结
  ✅ R-1 dd 金额列一字未改
  ✅ 🔴 R-1 建出了工单(原先这条 reject 什么都不留)
  ✅ R-1 告警已落 jnc_sys_log
  ✅ 🔴 守卫 待付单金额相符:settled
  ✅ 守卫 待付单:pd 已结(pdstatus=1)
  ✅ 守卫 待付单:没有工单

【组 H _pollOrderPaymentIfNeeded —— 结算触发器这条路也要先看订单还能不能付】
  ✅ H1 作废单:status = order_not_payable
  ✅ H1 作废单:should_reload = false
  ✅ H1 作废单:响应里没有 channel 键(通道没被 dispatch)
  ✅ H1 作废单:pd_last_poll_at 仍是 NULL(连节流戳都没写)
  ✅ H2 守卫 待付单:确实走到了通道 dispatch
  ✅ H2 守卫 待付单:通道回「invoice 还没建」(零外呼)
  ✅ H2 守卫 待付单:节流戳被写上了
  ✅ H3 守卫 已结算 pd:仍是 already_settled(不是 order_not_payable)
  ✅ H4 守卫 已付清单:仍是 no_unpaid(不是 order_not_payable)
  ✅ H5 前置:测试库里有 vip=9 管理员
  ✅ H5 复查作废单:提示点明「已不是待付款状态」
  ✅ H5 复查作废单:不再沿用"通道仍未确认到账"那句
  ✅ H5 复查作废单:工单没有被误关

────────────────────────────────
PASS=87  FAIL=0
  ✔ 已销毁 jnc_ma_e2e_h8