模块: OA 审批 · 待办 / 已办 / 我发起的 / 抄送我的
日期: 2026-08-11
状态: 已实现
UI Demo: docs/demos/oa-approval-task-filter-demo.html
决策记录:
list_tasks 查询参数 + 四页各自加 filter-block)watchDebounced 300ms)+ 保留「搜索」「重置」四页任务列表(pending / done / mine / cc)目前仅分页拉取,抄送页仅有「阅读状态」筛选。用户需要在列表上方按流程名称、申请时间、流程状态等条件检索,并在输入/选择条件后自动触发查询,无需依赖点击「搜索」才能看到结果。
成功标准:
filter-block 检索区total 与列表一致| 页面 | 路由视图 | 流程名称 | 申请人 | 申请时间 | 流程状态 | 阅读状态 |
|---|---|---|---|---|---|---|
| 待办中心 | views/oa-approval/pending/index.vue |
✓ | ✓ | ✓ | ✓ | — |
| 已办中心 | views/oa-approval/done/index.vue |
✓ | ✓ | ✓ | ✓ | — |
| 我发起的 | views/oa-approval/mine/index.vue |
✓ | — | ✓ | ✓ | — |
| 抄送我的 | views/oa-approval/cc/index.vue |
✓ | ✓ | ✓ | ✓ | ✓(已有) |
字段语义:
oa_app.app_name;同时允许匹配实例标题 oa_instance.titlesys_user.nick_name(与 _user_name_map / 列表列 initiatorUserName 同源)create_time(与列表列 applyTime 同源)oa_instance.statusreadStatus=unread|read|all与 oa_instance.status 注释及引擎终态标签一致(不含任务态 approved / pending 等):
| value | 展示文案 |
|---|---|
"" |
全部 |
running |
进行中 |
completed |
已完成 |
rejected |
已拒绝 |
returned |
已打回 |
cancelled |
已撤销 |
对齐 Fresh Mint §5 与现有列表页(单位列表、订单列表、展馆预约、抄送我的):
panel-top → filter-block →(抄送保留工具栏)→ list-body list-wrap → 分页filter-form + 四列 filter-grid + filter-actions-rowbtn-ghost + RefreshLeft)+ 搜索(btn-main + Search)searchForm(及日期区间)使用 watchDebounced(..., { debounce: 300, deep: true });触发时将 page 置为 1 再 loadload(页码回 1)readStatus 默认仍为 unread;其余为空),页码回 1 并 loadel-date-picker type="daterange",value-format="YYYY-MM-DD"参考 Demo: docs/demos/oa-approval-task-filter-demo.html
继续使用:
GET {OA_BASE}/tasks/{kind}
kind ∈ { pending, done, mine, cc }
| 参数 | 必填 | 说明 |
|---|---|---|
appName |
否 | 流程名称关键词,trim 后非空才参与 LIKE |
initiatorName |
否 | 申请人姓名关键词;mine 可不传 |
applyTimeFrom |
否 | 申请日起始日 YYYY-MM-DD(含当日 00:00:00) |
applyTimeTo |
否 | 申请日结束日 YYYY-MM-DD(含当日 23:59:59) |
instanceStatus |
否 | 实例状态精确匹配;不在 §2.2 枚举内的值视为未传(不加状态条件) |
readStatus |
否 | 仅 cc,现有行为不变 |
page / pageSize |
否 | 现有行为不变 |
响应形状不变: { list, total }。
list_tasks)OaInstance 为主查询;按条件 join OaApp / SysUser(发起人)过滤;order_by create_time DESC 后分页OaTask 为主查询(既有 kind 条件保留);通过 instance_id join OaInstance,再按需 join OaApp / 发起人 SysUser;过滤后对任务分页tenant_no + del_flag=0| 文件 | 改动 |
|---|---|
web-admin/src/api/oaApproval.ts |
fetchOaTasks params 扩展上述字段并透传 |
web-admin/src/views/oa-approval/pending/index.vue |
增加筛选区 + 即时检索 |
web-admin/src/views/oa-approval/done/index.vue |
同上 |
web-admin/src/views/oa-approval/mine/index.vue |
同上(无申请人字段) |
web-admin/src/views/oa-approval/cc/index.vue |
在现有阅读状态筛选上扩展字段 + 改为即时检索 |
建议四页共用同一套状态文案/选项常量(可在各页内联小常量或抽到 oa-approval 下小 util;本设计不强制新文件)。
| 文件 | 改动 |
|---|---|
backend/app/api/oa_approval.py |
list_oa_tasks 增加 Query,传入 list_tasks |
backend/app/services/oa_engine.py |
list_tasks 增加过滤参数并在分页前应用 |
backend/tests/test_oa_engine.py 或新测文件 |
覆盖名称 / 时间 / 状态 / 抄送组合过滤 |
无表结构变更,无需新 SQL DDL。
appName / initiatorName / 时间区间 / instanceStatus 时结果与 total 正确;cc + readStatus 与新条件可组合SysUser.nick_name(与 _user_name_map 一致),避免「筛得到但展示名对不上」applyTimeTo 须包含结束日全天,避免只比较日期字符串导致漏当日下午数据running,「流程状态」在待办页仍保留以支持边界数据与体验统一filter-block / 四列栅格 / 重置+搜索)