日期:2026-09-08
状态:待审阅
对齐:docs/superpowers/specs/2026-09-08-crm-date-column-sort-design.md(交互与参数一致)
Demo:docs/crm-date-column-sort-demo.html(样式 2 · 双三角)
CRM 客户 / 报价 / 合同已落地日期列双三角整库排序。报销管理下多份列表已有列头漏斗(ColumnHeaderFilter + datetime),但尚不能按日期列升/降序。
asc / desc,取消后恢复现网默认序。sortField / sortOrder。ColumnHeaderFilter 上扩展(报销页已直接使用该组件),避免整页改迁 CrmColFilterHeader。resolve_datetime_order_by + 各 list 白名单。occurDate、冲抵记录子表)除非该列已是主列表带漏斗的 datetime| # | 决策 |
|---|---|
| D1 | 范围:仅「有日期列」的页面;费用项目 / 工作流 / 发票夹管理跳过 |
| D2 | 交互与 CRM 相同:双三角;同向再点取消;仅 datetime;空值升序前、降序后 |
| D3 | 架构:扩展 ColumnHeaderFilter + 页面 useColumnSort(方案 1);不用逐列手写三角 |
| D4 | 参数:sortField(列 prop)+ sortOrder(asc|desc);非法回退默认序 |
| 菜单 | 前端路径 | 日期列 prop |
|---|---|---|
| 备用金申请 | views/bx/advance/apply/index.vue |
applyTime |
| 备用金审批 | views/bx/advance/approve/index.vue |
applyTime |
| 备用金发放 | views/bx/advance/issue/index.vue |
applyTime、issueTime |
| 报销申请 | views/bx/reimburse/apply/index.vue |
applyTime |
| 报销审批 | views/bx/reimburse/approve/index.vue |
applyTime |
| 支付发放冲抵 | views/bx/payment/index.vue |
applyTime、payTime |
| 我的发票夹 | views/bx/invoice-wallet/mine/index.vue |
createTime(发票表 + 流水表,各一套 filter/sort) |
| 我的申请单 | views/bx/view/mine/index.vue |
applyTime |
| 待我审批 | views/bx/view/todo/index.vue |
applyTime |
| 全部申请单(总经理) | views/bx/view/all/index.vue |
applyTime |
跳过:expense-item、workflow/advance、workflow/reimburse、invoice-wallet/admin。
与 CRM 设计 §4 一致:
「申请时间」展示字段 applyTime 在后端多映射 create_time:排序白名单须 applyTime → create_time(或实体等价列),禁止按不存在的 apply_time 列动态拼接。
ColumnHeaderFilter在 column-header-filter/index.vue 的漏斗按钮旁:
inject('crmColumnSort')(与 CRM 同 key,避免双套 inject;可选再兼容 columnSort)。showSort = Boolean(sortApi && type === 'datetime')。.col-header-sort-pair / .col-header-sort-btn。CrmColFilterHeader 已具备三角,行为不变。未 provide 排序的页面(含跳过页)不显示三角。
const { setSort, clearSort, isSortActive, sortField, sortOrder, toQueryParams: toSortQueryParams, watchVisibleColumns: watchSortVisibleColumns } =
useColumnSort({ onChange: () => { /* page=1; reload */ } })
provide('crmColumnSort', { setSort, clearSort, isSortActive, sortField, sortOrder })
// list/export params: ...toSortQueryParams()
// watchSortVisibleColumns(visibleFilterProps)
我的发票夹:发票 Tab / 流水 Tab 可各用一套 useColumnSort,inject key 用默认 + 可选第二 key,或切换 Tab 时共用一套(实现时选改动更小者;须保证当前可见表的 datetime 列能驱动正确 list API)。
复用 backend/app/services/crm/list_sort.py 的 resolve_datetime_order_by(路径名含 crm,本批不强制搬家;若后续统一可迁到 app/services/list_sort.py,非本批必做)。
各 list(及共用路径的 export)增加可选 sortField / sortOrder,白名单示例:
| 域 | prop → Column |
|---|---|
| 备用金申请/审批/发放主列表 | applyTime → BxAdvanceApply.create_time;发放另加 issueTime → 实际发放时间列(以 model 为准,如 issue_time / pay_time) |
| 报销申请/审批 | applyTime → BxReimburseApply.create_time |
| 支付发放冲抵 | applyTime → 单据创建/申请时间列;payTime → 处理时间列(以现网字段为准) |
| 视图 mine/todo/all | 按 biz 分支映射到 advance/reimburse 的 create_time,或统一视图查询的申请时间表达式 |
| 我的发票夹 | createTime → 发票/流水表的 create_time |
非法 sortField → 现网默认(一般为 create_time DESC)。
applyTime 升/降/取消;与漏斗日期段 AND;换页保持序。issueTime 仅在已发放可见列时可用;藏列清排序。payTime 在已处理 Tab。sortField → 默认序、不 500。applyTime 与 DB create_time 映射遗漏导致排序无效或报错——实现时对照 schema validation_alias="create_time"。list_sort 抽到中性路径。docs/superpowers/specs/2026-09-08-bx-date-column-sort-design.mddocs/superpowers/specs/2026-09-08-crm-date-column-sort-design.md