feat(order): 收银台与购标流程改为先选支付方式再发起支付

- 新增 useHjcPayFlow(select/code 两段状态机)与 HjcPayPanel(两处共用):
  进页只查单、不发起支付,不预选支付方式;出码后不再有切换控件,
  只能显式「更换支付方式」回到选择态(不自动重发、不停查单)
- 发起失败留在选择态并保留所选(渠道侧什么都没产生,没有理由锁住用户)
- 收银台 pages/tender/pay.vue 只留订单侧职责:取单、终态屏、超时锁、付款成功跳列表
- 购标流程 BuyDocument:下单后停在选择态(不再按默认微信自动发起),
  补支付剩余时间与超时锁,超时后回表单步重新下单
- 订单详情:只有已完成订单才显示支付方式渠道名,其余显示「—」;
  标签按前缀判,修掉 ALIPAY_QR 被显示成「微信支付」
- useHjcPayStatus:新增结构化 channelClosed——「渠道单已关闭」在选择态说
  「重新选择支付方式」、出码态才说「重新获取二维码」,不靠匹配 message 字符串

Refs .scratch/cashier-pay-method-selection/issues/01-pay-method-before-pay.md
This commit is contained in:
2026-09-30 09:16:36 +08:00
parent 85207e1648
commit 57543cfade
6 changed files with 690 additions and 550 deletions
+21 -1
View File
@@ -185,6 +185,7 @@ import type { HjcOrder } from '~/types/tender'
import {
hjcCanActOn,
hjcOrderStatusClass,
hjcOrderStatusKey,
hjcOrderStatusLabel
} from '~/utils/orderStatus'
@@ -221,7 +222,26 @@ const cancelling = ref(false)
/** 已支付:标书附件是否下发的唯一依据(与后端 `isPaid` 同一口径,只看 payStatus) */
const isPaid = computed(() => order.value?.payStatus === 1)
const payMethodLabel = computed(() => (order.value?.payMethod === 'ALIPAY' ? '支付宝' : '微信支付'))
/**
* 「支付方式」这一行的显示口径。
*
* **只有已完成的订单才把 `payMethod` 当事实**:它建单时就被写成 `WECHAT_NATIVE`,只有真发起过
* 一次支付才会被渠道响应改写——所以未支付订单上的值并不代表买家选过什么,也区分不了
* "没选过"与"选过微信没付"(见 CONTEXT.md 的「支付渠道」)。未支付一律显示「—」,
* 不去声称一种买家可能根本没选过的方式。
*
* 标签按**前缀**判而不是精确等值:支付宝侧有 `ALIPAY`(电脑网站支付)与 `ALIPAY_QR`(扫码),
* 原先只认 `ALIPAY` 一个值,扫码支付过的单在详情里会被显示成"微信支付"。
*/
const payMethodLabel = computed(() => {
const o = order.value
if (!o || hjcOrderStatusKey(o) !== 'done') return '—'
const method = String(o.payMethod || '')
if (method.startsWith('ALIPAY')) return '支付宝'
if (method.startsWith('WECHAT')) return '微信支付'
return '—'
})
/**
* 还能不能操作(去支付 / 取消):共享判定,**不在这里重写一遍**——