feat(order): 官网「我的订单」列表加状态筛选 tab
加一排 tab(全部/待支付/已完成/已取消)与各状态计数,点一下只看该状态的订单。数据本来就是全量返回(/hjc/order/my 不分页、也没有状态参数),所以在前端筛,切 tab 不重新请求。选中项写进 URL(?status=pending),刷新、分享、浏览器后退都保持;认不出的值回落「全部」而不是筛成空列表。状态口径复用 utils/orderStatus.ts,页面不重写判定。不新增「已退款」tab:标书售卖没有退款(ADR 0005),payStatus=3 只是防御性展示。 Closes .scratch/web-order-status-tabs/issues/01-orders-status-tabs.md
This commit is contained in:
@@ -154,3 +154,66 @@ export function hjcCanActOnOrder(o?: HjcOrderLike | null): boolean {
|
||||
if (!o) return false
|
||||
return o.payStatus === 0 && o.orderStatus !== 2
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------ 列表筛选
|
||||
|
||||
/**
|
||||
* 订单列表的筛选键:`all`(不筛)+ 四个状态键。
|
||||
*
|
||||
* `all` 刻意**不**并进 `HjcOrderStatusKey`,而是单独一层联合:一旦把 `'all'` 混进状态键,
|
||||
* `hjcOrderStatusKey()` 的返回值就不再是"这张单真的处于什么状态",每个 `switch`
|
||||
* 都得补一个永远走不到的 `case 'all'`,漏补时 TS 还会以为已经穷尽。
|
||||
*/
|
||||
export type HjcOrderFilterKey = 'all' | HjcOrderStatusKey
|
||||
|
||||
/**
|
||||
* 列表页的筛选 tab(数组顺序即展示顺序)。
|
||||
*
|
||||
* **没有「已退款」**:标书售卖没有退款功能,`payStatus === 3` 只是防御性展示
|
||||
* (工作区根目录 `docs/adr/0005-no-refund-for-tender-sales.md`)。挂一个永远是空的 tab,
|
||||
* 只会让人追问"我的退款去哪了";真出现退款单时它在「全部」里照样找得到。
|
||||
*
|
||||
* 标签必须与 `hjc-h5/src/pages/order/list.vue` 的 tabs 保持一致——同本文件头注释的口径。
|
||||
*/
|
||||
export const HJC_ORDER_FILTER_TABS: ReadonlyArray<{ key: HjcOrderFilterKey; label: string }> = [
|
||||
{ key: 'all', label: '全部' },
|
||||
{ key: 'pending', label: '待支付' },
|
||||
{ key: 'done', label: '已完成' },
|
||||
{ key: 'cancel', label: '已取消' }
|
||||
]
|
||||
|
||||
/**
|
||||
* 每个筛选键的空列表文案。
|
||||
*
|
||||
* 必须逐键给全(`Record<HjcOrderFilterKey, string>` 会盯着):筛到「已完成」却看到一句
|
||||
* 「暂无订单」,用户无从判断是"这单没有"还是"我的单全丢了"。`refund` 目前没有对应 tab,
|
||||
* 但类型里还在,留着文案免得将来加 tab 时漏掉。
|
||||
*/
|
||||
export const HJC_ORDER_FILTER_EMPTY_TEXT: Record<HjcOrderFilterKey, string> = {
|
||||
all: '暂无订单',
|
||||
pending: '暂无待支付订单',
|
||||
done: '暂无已完成订单',
|
||||
cancel: '暂无已取消订单',
|
||||
refund: '暂无已退款订单'
|
||||
}
|
||||
|
||||
/**
|
||||
* URL 上的 `status` 查询参数 → 筛选键。
|
||||
*
|
||||
* 认不出来的一律回落 `all`,**不是**回落成"空筛选":把非法参数当成一个筛不出东西的条件,
|
||||
* 用户看到的就是"一张单都没有"且没有任何提示,只会当成丢单。
|
||||
* 容忍数组(`?status=a&status=b` 取第一个)与缺失。
|
||||
*/
|
||||
export function hjcOrderFilterFromQuery(raw: unknown): HjcOrderFilterKey {
|
||||
const value = Array.isArray(raw) ? raw[0] : raw
|
||||
const key = typeof value === 'string' ? value : ''
|
||||
return HJC_ORDER_FILTER_TABS.some((t) => t.key === key) ? (key as HjcOrderFilterKey) : 'all'
|
||||
}
|
||||
|
||||
/** 这张订单是否命中筛选键(`all` 恒命中,其余按状态键判定) */
|
||||
export function hjcMatchOrderFilter(
|
||||
o: HjcOrderLike | null | undefined,
|
||||
key: HjcOrderFilterKey
|
||||
): boolean {
|
||||
return key === 'all' || hjcOrderStatusKey(o) === key
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user