a7399e0624
hjc-web 此前**没有收银台**——支付步骤内嵌在购标流程(BuyDocument 的 step='pay')里, 买家一旦离开就再也回不到未完成的支付。本提交补上按订单号付款的独立页面。 - 新建 /tender/pay 收银台:只认订单号,金额取自**订单本身**(by-no)而非支付响应 (支付一失败页面就会停在 0.00);进入先判状态,已支付/已取消/已退款**不发**统一下单, 就地显示结论——既无意义,也会多撞一次跨端 OUT_TRADE_NO_USED - 订单列表:待支付卡片加两个按钮 + 手搓 Tailwind 二次确认弹窗(照 ConsultDialog 的风格, 不用 antd 的 Modal:买家页无先例,视觉与站点自建风格不一致) - 状态口径改读 orderStatus(原先只看 payStatus,取消后会把已取消显示成「待支付」 并带上「去支付」),抽 app/utils/orderStatus.ts,与 hjc-h5 刻意保持同一套优先级 - 新增两个 Nitro 代理 order-by-no.get.ts / cancel.post.ts,照既有 my-orders / pay-status 的范式原样透传 ApiResult - 标书详情「购买人数」改读 buyerCount(后端实时统计的已付款订单数) - 跨端 OUT_TRADE_NO_USED:识别后端回带的 data.wechatCode 并给可行动提示, 不匹配 message 字符串(包装方式一改就会静默失效)
70 lines
2.6 KiB
TypeScript
70 lines
2.6 KiB
TypeScript
/**
|
||
* 订单状态展示口径(hjc-web)。
|
||
*
|
||
* **必须与 `hjc-h5/src/utils/orderStatus.js` 保持一致**——两端是不同仓库、不同技术栈
|
||
* (Nuxt4 + TS / uni-app + JS),代码无法真正共享,只能靠"两处同一套定义"来对齐。
|
||
* 改这里的时候,另一边也要改。
|
||
*
|
||
* 优先级(从高到低):
|
||
* payStatus === 3 → 已退款
|
||
* orderStatus === 2 → 已取消
|
||
* payStatus === 1 || orderStatus === 1 → 已完成
|
||
* 其余 → 待支付
|
||
*
|
||
* 为什么需要它:hjc-web 此前**完全不读 `orderStatus`**(只看 payStatus),
|
||
* 于是订单一旦被置为已取消,卡片仍会显示「待支付」并带上「去支付」按钮。
|
||
*/
|
||
|
||
/** 订单状态归类键。四端(web / h5 / 小程序 / 后台)未来的展示都应落在这四个之一。 */
|
||
export type HjcOrderStatusKey = 'pending' | 'done' | 'cancel' | 'refund'
|
||
|
||
/** 判定所需的订单字段(只用到这两个,避免依赖完整的 HjcOrder 类型) */
|
||
export interface HjcOrderLike {
|
||
payStatus?: number | null
|
||
orderStatus?: number | null
|
||
}
|
||
|
||
export function hjcOrderStatusKey(o?: HjcOrderLike | null): HjcOrderStatusKey {
|
||
if (!o) return 'pending'
|
||
if (o.payStatus === 3) return 'refund'
|
||
if (o.orderStatus === 2) return 'cancel'
|
||
if (o.payStatus === 1 || o.orderStatus === 1) return 'done'
|
||
return 'pending'
|
||
}
|
||
|
||
const LABELS: Record<HjcOrderStatusKey, string> = {
|
||
pending: '待支付',
|
||
done: '已完成',
|
||
cancel: '已取消',
|
||
refund: '已退款'
|
||
}
|
||
|
||
export function hjcOrderStatusLabel(o?: HjcOrderLike | null): string {
|
||
return LABELS[hjcOrderStatusKey(o)]
|
||
}
|
||
|
||
/** 状态徽标的 Tailwind 配色 */
|
||
export function hjcOrderStatusClass(o?: HjcOrderLike | null): string {
|
||
switch (hjcOrderStatusKey(o)) {
|
||
case 'done':
|
||
return 'bg-green-100 text-green-700'
|
||
case 'cancel':
|
||
case 'refund':
|
||
return 'bg-gray-100 text-gray-500'
|
||
default:
|
||
return 'bg-amber-100 text-amber-700'
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 这张订单是否该出现「去支付」「取消订单」。
|
||
*
|
||
* **不要用 `hjcOrderStatusKey(o) === 'pending'` 当条件**:`payStatus=2`(支付失败)也会落进
|
||
* `pending` 这个兜底键。虽然它目前是死状态(全仓 `setPayStatus` 只有 0/1/3 三个写入点),
|
||
* 但把"能不能操作"绑在一个展示口径的兜底分支上,是下次改动最容易踩的坑。
|
||
*/
|
||
export function hjcCanActOnOrder(o?: HjcOrderLike | null): boolean {
|
||
if (!o) return false
|
||
return o.payStatus === 0 && o.orderStatus !== 2
|
||
}
|