/** * 订单状态展示口径(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 = { 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 }