Files
hjc-web/app/utils/orderStatus.ts
T
weicw1996 a7399e0624 feat(tender): 我的订单加「去支付」「取消订单」入口,并新建收银台
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 字符串(包装方式一改就会静默失效)
2026-09-17 03:39:59 +08:00

70 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 订单状态展示口径(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
}