20260923165454
This commit is contained in:
1 parent
0abe3706c8
commit
e6935b8fa4
173 files changed
+14975
-2295
No files matched your search
@@ -0,0 +1,659 @@
|
||||
# 查询体验重构实施计划
|
||||
|
||||
## 1. 重构目标
|
||||
|
||||
本次重构的目标不是增加查询表达力,而是缩短业务人员从“知道要找什么”到“看到结果”的路径。
|
||||
|
||||
重构后,列表页应满足:
|
||||
|
||||
- 打开页面即可看到常用工作队列,不需要先打开高级查询;
|
||||
- 默认只暴露高频查询条件和必要字段,减少视觉噪声;
|
||||
- 状态页签、快捷筛选、精确筛选形成渐进式查询路径;
|
||||
- 业务人员使用业务语言,不需要理解 `AND`、`OR`、括号或查询表达式;
|
||||
- 重复查询可以保存、设为默认并再次使用;
|
||||
- 查询条件、分页、排序和当前视图可通过 URL 分享和恢复;
|
||||
- 查询权限、字段权限和数据范围始终由后端 SQL 强制执行;
|
||||
- 不保留旧查询接口、旧查询配置或旧数据结构的兼容转发层。
|
||||
|
||||
## 2. 核心设计原则
|
||||
|
||||
### 2.1 三层查询模型
|
||||
|
||||
```text
|
||||
工作队列页签 我现在要处理哪一类?
|
||||
↓
|
||||
快捷筛选 我大概知道是哪几条?
|
||||
↓
|
||||
更多筛选 我需要精确查找哪一条?
|
||||
```
|
||||
|
||||
对应到页面:
|
||||
|
||||
1. **工作队列页签**:预置常用状态或业务视图,进入页面即可使用。
|
||||
2. **快捷筛选**:展示 3~5 个最高频的结构化条件。
|
||||
3. **更多筛选**:按字段类型提供完整但易懂的筛选控件,默认收起。
|
||||
|
||||
暂不实现条件树、任意层级括号和查询语言。只有在后续确认存在稳定的分析师角色及真实使用需求后,才单独评估 L3/L4 能力。
|
||||
|
||||
### 2.2 页签和筛选的职责分离
|
||||
|
||||
- 页签代表工作队列或预设查询视图,不等同于数据库状态字段;
|
||||
- 快捷筛选用于进一步缩小当前页签结果;
|
||||
- 页签条件与用户筛选条件之间固定使用 `AND`;
|
||||
- `有异常`、`我的订单`、`即将到期` 等跨字段场景也可以是页签;
|
||||
- 不把所有生命周期状态平铺到页签,默认显示 4~6 个,其余进入“更多”。
|
||||
|
||||
### 2.3 业务语言优先
|
||||
|
||||
控件和文案不暴露技术表达式:
|
||||
|
||||
- 多选枚举:显示“满足任一”或“满足全部”;
|
||||
- 日期:提供“今天、 本周、 本月、近三个月、自定义”;
|
||||
- 数值:提供“大于、小于、介于”;
|
||||
- 文本:默认“包含”,可选“等于、开头是”;
|
||||
- 布尔值:提供“是、否、不限”,不强迫用户选择一个值。
|
||||
|
||||
## 3. 目标页面结构
|
||||
|
||||
```text
|
||||
模块标题 新增 导出 更多
|
||||
|
||||
全部 128 | 待处理 12 | 有异常 5 | 已订舱 31 | 已完成 72 | 更多
|
||||
|
||||
[ 搜索订单号、客户、提单号、船名、航次 ]
|
||||
|
||||
[ 客户 ] [ ETD ] [ 业务员 ] [ 目的港 ] [ 更多筛选 ] 清除全部
|
||||
|
||||
客户:东方国际 × ETD:本月 ×
|
||||
|
||||
订单号 | 客户 | 航线/目的港 | ETD | 负责人 | 状态 | 异常 | 操作
|
||||
```
|
||||
|
||||
### 3.1 页面区域职责
|
||||
|
||||
| 区域 | 职责 | 默认行为 |
|
||||
| --- | --- | --- |
|
||||
| 页面头部 | 模块标题、主操作、导出和更多操作 | 保持简洁,不能被筛选器挤压 |
|
||||
| 工作队列页签 | 切换预设查询视图 | 默认打开模块配置的默认视图 |
|
||||
| 关键词搜索 | 跨关键字段模糊搜索 | 回车或防抖后查询,保留输入值 |
|
||||
| 快捷筛选 | 高频字段筛选 | 最多展示 3~5 个,可由模块配置 |
|
||||
| 更多筛选 | 完整字段筛选 | 抽屉或弹层打开,关闭后保留已选条件 |
|
||||
| 条件回显区 | 展示当前生效条件 | 每个条件可单独删除 |
|
||||
| 数据表格 | 展示精简后的默认列 | 默认 6~8 列,支持列设置 |
|
||||
|
||||
## 4. 工作队列页签设计
|
||||
|
||||
工作队列页签、关键词搜索和快捷筛选均必须通过模块查询配置生成,不能在页面组件中写死业务字段、状态值或显示顺序。前端只实现通用渲染器和交互,不针对海运订单、报关单等模块增加专用分支。
|
||||
|
||||
配置的职责边界如下:
|
||||
|
||||
| 能力 | 配置决定的内容 | 前端通用能力 |
|
||||
| --- | --- | --- |
|
||||
| 工作队列页签 | 编码、文案、顺序、默认项、数量开关、预设条件、权限范围 | 渲染页签、切换视图、展示数量 |
|
||||
| 关键词搜索 | 占位文案、可搜索字段、匹配方式、触发方式 | 输入、清除、防抖/回车触发 |
|
||||
| 快捷筛选 | 字段、标签、顺序、控件类型、选项来源、默认值 | 根据字段元数据渲染控件、编辑值 |
|
||||
| 更多筛选 | 字段分组、可用操作符、字段顺序、显示条件 | 抽屉布局、字段控件和条件回显 |
|
||||
|
||||
模块配置变更后,页面无需重新发布前端代码即可改变查询入口。前端只允许从服务端返回的字段元数据生成查询请求,不接受页面代码中额外注入的可查询字段。
|
||||
|
||||
### 4.1 页签配置模型
|
||||
|
||||
页签使用统一的预设视图模型,不限定只能绑定一个状态字段。
|
||||
|
||||
```json
|
||||
{
|
||||
"moduleCode": "sea_order",
|
||||
"code": "pending",
|
||||
"label": "待处理",
|
||||
"type": "preset",
|
||||
"order": 10,
|
||||
"showCount": true,
|
||||
"isDefault": true,
|
||||
"query": {
|
||||
"conditions": [
|
||||
{
|
||||
"field": "status",
|
||||
"operator": "in",
|
||||
"value": ["pending_audit", "pending_booking"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
一个模块的完整查询入口配置示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"moduleCode": "sea_order",
|
||||
"defaultViewCode": "pending",
|
||||
"views": [
|
||||
{
|
||||
"code": "all",
|
||||
"label": "全部",
|
||||
"type": "all",
|
||||
"order": 1,
|
||||
"showCount": true
|
||||
},
|
||||
{
|
||||
"code": "pending",
|
||||
"label": "待处理",
|
||||
"type": "preset",
|
||||
"order": 2,
|
||||
"showCount": true,
|
||||
"isDefault": true,
|
||||
"query": {
|
||||
"conditions": [
|
||||
{
|
||||
"field": "status",
|
||||
"operator": "in",
|
||||
"value": ["pending_audit", "pending_booking"]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": "exception",
|
||||
"label": "有异常",
|
||||
"type": "preset",
|
||||
"order": 3,
|
||||
"showCount": true,
|
||||
"query": {
|
||||
"conditions": [
|
||||
{
|
||||
"field": "has_exception",
|
||||
"operator": "=",
|
||||
"value": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"keywordSearch": {
|
||||
"placeholder": "搜索订单号、客户、提单号、船名、航次",
|
||||
"trigger": "enter_or_debounce",
|
||||
"fields": [
|
||||
{ "field": "order_no", "operator": "contains" },
|
||||
{ "field": "customer_name", "operator": "contains" },
|
||||
{ "field": "bill_of_lading_no", "operator": "contains" },
|
||||
{ "field": "vessel_name", "operator": "contains" },
|
||||
{ "field": "voyage_no", "operator": "contains" }
|
||||
]
|
||||
},
|
||||
"quickFilters": [
|
||||
{
|
||||
"field": "customer_id",
|
||||
"label": "客户",
|
||||
"control": "select",
|
||||
"multiple": true,
|
||||
"optionSource": "customer",
|
||||
"matchMode": "any",
|
||||
"order": 1
|
||||
},
|
||||
{
|
||||
"field": "etd",
|
||||
"label": "ETD",
|
||||
"control": "date_range",
|
||||
"presets": ["today", "this_week", "this_month", "next_month"],
|
||||
"order": 2
|
||||
},
|
||||
{
|
||||
"field": "owner_id",
|
||||
"label": "业务员",
|
||||
"control": "select",
|
||||
"multiple": true,
|
||||
"optionSource": "current_user_scope",
|
||||
"matchMode": "any",
|
||||
"order": 3
|
||||
}
|
||||
],
|
||||
"filterGroups": [
|
||||
{
|
||||
"code": "basic",
|
||||
"label": "基础信息",
|
||||
"order": 1,
|
||||
"fields": ["customer_id", "owner_id", "status", "carrier_id"]
|
||||
},
|
||||
{
|
||||
"code": "schedule",
|
||||
"label": "船期与港口",
|
||||
"order": 2,
|
||||
"fields": ["etd", "eta", "pol", "pod"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
配置中的 `field` 必须引用模块字段元数据中的合法字段,`control`、`operator` 和 `optionSource` 必须由后端字段定义校验。前端不得仅因为配置返回了一个字段就绕过字段权限。
|
||||
|
||||
支持的页签类型:
|
||||
|
||||
- `all`:全部数据;
|
||||
- `preset`:模块配置的固定预设查询;
|
||||
- `personal`:用户保存的查询方案;
|
||||
- `shared`:角色或团队共享的查询方案。
|
||||
|
||||
### 4.2 页签规则
|
||||
|
||||
- 默认展示 4~6 个页签;
|
||||
- 超出数量的视图进入“更多”;
|
||||
- 页签顺序、显示/隐藏、默认页签由模块配置和用户偏好共同决定;
|
||||
- 用户偏好只能调整布局和默认视图,不能扩大权限范围;
|
||||
- 页签统计数量使用与列表相同的权限、数据范围和过滤规则;
|
||||
- 统计请求失败不阻塞列表,显示无数量状态并记录错误日志;
|
||||
- 切换页签时保留用户已有的快捷筛选,若发生明显冲突则移除冲突条件并提示;
|
||||
- 页签条件和快捷/更多筛选条件始终按 `AND` 组合。
|
||||
|
||||
### 4.3 数量统计策略
|
||||
|
||||
优先为待处理、有异常等具有行动价值的页签显示数量。数量统计接口应支持批量返回当前模块所有页签的数量,避免一个页签发起一次请求。
|
||||
|
||||
建议接口返回:
|
||||
|
||||
```json
|
||||
{
|
||||
"counts": {
|
||||
"all": 128,
|
||||
"pending": 12,
|
||||
"exception": 5,
|
||||
"completed": 72
|
||||
},
|
||||
"generatedAt": "2026-09-23T08:30:00+08:00"
|
||||
}
|
||||
```
|
||||
|
||||
数量不是强一致业务数据。允许短时间缓存,但必须在用户切换页签或刷新列表时提供可预测的刷新行为。
|
||||
|
||||
## 5. 查询条件设计
|
||||
|
||||
### 5.1 关键词搜索
|
||||
|
||||
每个模块配置一组关键词字段,关键词默认对这些字段执行跨字段模糊匹配。关键词框本身是通用组件,模块只提供占位文案、字段清单和触发策略。
|
||||
|
||||
示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"keyword": {
|
||||
"placeholder": "搜索订单号、客户、提单号、船名、航次",
|
||||
"searchableFields": [
|
||||
"orderNo",
|
||||
"customerName",
|
||||
"billOfLadingNo",
|
||||
"vesselName",
|
||||
"voyageNo"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
关键词搜索不要求用户先选择字段。字段可见性和可查询权限仍由后端校验。
|
||||
|
||||
### 5.2 快捷筛选
|
||||
|
||||
每个模块配置 3~5 个快捷条件。选择依据:使用频率、业务价值、结果收敛效果和字段稳定性。页面不根据模块名称或路由写 `if/else` 决定快捷条件。
|
||||
|
||||
推荐字段:
|
||||
|
||||
- 客户;
|
||||
- 负责人/业务员;
|
||||
- 日期范围;
|
||||
- 目的港或业务区域;
|
||||
- 运输方式、船公司等高频枚举。
|
||||
|
||||
快捷筛选控件由字段类型决定,不允许所有字段统一使用普通文本框。
|
||||
|
||||
### 5.3 更多筛选
|
||||
|
||||
“更多筛选”以抽屉形式打开,按业务分组展示字段。默认只加载当前模块允许查询的字段,按需展开低频分组。
|
||||
|
||||
字段控件规则:
|
||||
|
||||
| 字段类型 | 控件 | 默认语义 |
|
||||
| --- | --- | --- |
|
||||
| 枚举 | 多选下拉/标签选择 | 满足任一 |
|
||||
| 布尔 | 三态选择 | 不限 |
|
||||
| 日期 | 预置区间 + 自定义范围 | 区间包含起止日期 |
|
||||
| 数值 | 操作符 + 数值框 | 大于、小于、介于 |
|
||||
| 文本 | 匹配方式 + 输入框 | 包含 |
|
||||
| 多值字段 | 任一/全部切换 + 多选 | 满足任一 |
|
||||
|
||||
筛选抽屉底部固定提供:
|
||||
|
||||
```text
|
||||
[重置] [取消] [应用筛选]
|
||||
```
|
||||
|
||||
点击“取消”不改变当前已应用查询,点击“应用筛选”后统一刷新列表并回到第一页。
|
||||
|
||||
## 6. 表格和视图设计
|
||||
|
||||
### 6.1 默认列
|
||||
|
||||
每个模块必须定义一套精简的默认列,原则上控制在 6~8 列。默认列优先展示:
|
||||
|
||||
- 用户识别记录所需的主标识;
|
||||
- 判断是否需要处理所需的状态;
|
||||
- 判断时效所需的日期;
|
||||
- 处理责任人;
|
||||
- 异常或风险提示;
|
||||
- 最常用的业务维度。
|
||||
|
||||
不在默认列表展示低频、技术性或详情级字段。低频字段通过详情页、列设置和导出字段获取。
|
||||
|
||||
### 6.2 列设置和预设视图
|
||||
|
||||
提供以下视图能力:
|
||||
|
||||
- 日常处理:面向操作员的精简列;
|
||||
- 运营跟踪:包含船期、港口、节点等字段;
|
||||
- 财务核对:包含金额、费用、开票等字段;
|
||||
- 自定义:用户调整后的列和顺序。
|
||||
|
||||
列可见性、列顺序和列宽属于用户布局偏好,不得影响后端权限判断。
|
||||
|
||||
## 7. 保存查询方案
|
||||
|
||||
保存查询方案是本次重构的核心留存能力之一,优先级高于复杂逻辑组合。
|
||||
|
||||
支持:
|
||||
|
||||
- 保存当前页签、关键词、筛选条件、排序和列视图;
|
||||
- 自定义名称;
|
||||
- 设为默认;
|
||||
- 最近使用;
|
||||
- 删除和重新命名;
|
||||
- 按用户、角色或团队共享;
|
||||
- 将高频方案固定为页签或快捷入口。
|
||||
|
||||
查询方案保存的内容应是结构化查询状态,不保存最终 SQL。
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "本月未订舱",
|
||||
"moduleCode": "sea_order",
|
||||
"viewCode": "pending",
|
||||
"keyword": "",
|
||||
"filters": {
|
||||
"etd": { "preset": "this_month" },
|
||||
"bookingStatus": ["unbooked"]
|
||||
},
|
||||
"sort": { "field": "etd", "direction": "asc" },
|
||||
"columnPreset": "daily"
|
||||
}
|
||||
```
|
||||
|
||||
## 8. URL 状态和查询行为
|
||||
|
||||
> **实施状态(2026-09)**:URL 状态同步与查询分享**本期不做**(下期评估)。
|
||||
> 原因:布局层的页签 key 与 keep-alive 缓存 key 都是 `route.fullPath`,直接把查询状态写进
|
||||
> URL 会派生出新页签、破坏页面缓存;做 URL 同步需要先给列表路由做 key 归一化,属独立改动。
|
||||
> 本节以下内容保留为下期目标。
|
||||
|
||||
以下状态必须可序列化到 URL:
|
||||
|
||||
- 当前页签/查询方案;
|
||||
- 关键词;
|
||||
- 结构化筛选条件;
|
||||
- 排序;
|
||||
- 当前页码和每页数量;
|
||||
- 列视图(如需要)。
|
||||
|
||||
要求:
|
||||
|
||||
- 刷新页面后可恢复查询;
|
||||
- 复制 URL 给有权限的同事后可打开相同查询;
|
||||
- 无权限字段或无效条件由后端拒绝并由前端清晰提示;
|
||||
- URL 不包含最终 SQL,不把权限判断交给前端;
|
||||
- 条件变化后重置到第一页;修改单个条件不清空其他条件。
|
||||
|
||||
## 9. 后端和接口设计
|
||||
|
||||
### 9.1 统一查询请求
|
||||
|
||||
前端提交结构化查询状态,后端负责将配置、页签条件、用户条件、权限和数据范围组合成 SQL。
|
||||
|
||||
```json
|
||||
{
|
||||
"moduleCode": "sea_order",
|
||||
"viewCode": "pending",
|
||||
"keyword": "东方",
|
||||
"filters": {
|
||||
"customerId": [1001],
|
||||
"etd": {
|
||||
"from": "2026-09-01",
|
||||
"to": "2026-09-30"
|
||||
}
|
||||
},
|
||||
"sort": {
|
||||
"field": "etd",
|
||||
"direction": "asc"
|
||||
},
|
||||
"page": 1,
|
||||
"pageSize": 20
|
||||
}
|
||||
```
|
||||
|
||||
后端处理顺序:
|
||||
|
||||
1. 加载模块、字段、页签和视图配置;
|
||||
2. 校验字段可查询权限和操作符;
|
||||
3. 合并页签预设条件和用户筛选条件;
|
||||
4. 注入用户数据范围和权限条件;
|
||||
5. 生成参数化 SQL 或执行模块配置中的合法 `SELECT`;
|
||||
6. 返回分页数据、总数和必要的展示元数据。
|
||||
|
||||
### 9.2 查询配置接口
|
||||
|
||||
页面首次加载时获取模块查询配置,配置接口应一次返回当前用户可用的视图、关键词搜索、快捷筛选、更多筛选分组、字段元数据和默认列。
|
||||
|
||||
```json
|
||||
{
|
||||
"moduleCode": "sea_order",
|
||||
"version": 3,
|
||||
"defaultViewCode": "pending",
|
||||
"views": [],
|
||||
"keywordSearch": {},
|
||||
"quickFilters": [],
|
||||
"filterGroups": [],
|
||||
"fields": [],
|
||||
"columnPresets": []
|
||||
}
|
||||
```
|
||||
|
||||
配置接口必须完成以下处理:
|
||||
|
||||
- 过滤当前用户无权查看的页签、字段和选项来源;
|
||||
- 过滤已停用或不存在的字段,记录配置错误;
|
||||
- 校验页签预设条件和快捷筛选字段的合法性;
|
||||
- 返回可直接渲染的字段类型、标签、操作符和选项元数据;
|
||||
- 返回配置版本,便于前端缓存失效和问题定位。
|
||||
|
||||
### 9.3 建议接口
|
||||
|
||||
接口名称可按现有 API 风格落地,职责保持以下边界:
|
||||
|
||||
```text
|
||||
GET/POST 查询模块配置
|
||||
POST 查询列表
|
||||
POST 查询数量统计
|
||||
GET 查询方案列表
|
||||
POST 保存查询方案
|
||||
PUT 修改查询方案
|
||||
DELETE 删除查询方案
|
||||
```
|
||||
|
||||
列表查询和数量统计必须复用相同的过滤、权限和数据范围构建逻辑,避免页签数量与列表结果不一致。
|
||||
|
||||
### 9.4 数据库配置模型
|
||||
|
||||
新模型至少需要表达:
|
||||
|
||||
- 模块可查询字段及字段类型;
|
||||
- 字段权限和可选操作符;
|
||||
- 关键词搜索字段;
|
||||
- 快捷筛选字段;
|
||||
- 更多筛选字段分组;
|
||||
- 默认表格列和列预设;
|
||||
- 工作队列页签;
|
||||
- 默认视图;
|
||||
- 查询方案的所属用户、角色或团队。
|
||||
|
||||
具体表名应复用现有模块、字段、权限和用户配置体系。若现有结构无法表达上述关系,直接调整为新结构,不增加旧结构兼容读取逻辑。
|
||||
|
||||
## 10. 前端实现拆分
|
||||
|
||||
建议按页面职责拆分,具体目录以现有列表模块目录为准:
|
||||
|
||||
```text
|
||||
list-page/
|
||||
├── index.vue 页面编排、查询状态和数据加载
|
||||
├── WorkQueueTabs.vue 工作队列页签和数量
|
||||
├── KeywordSearch.vue 关键词搜索
|
||||
├── QuickFilters.vue 快捷筛选
|
||||
├── FilterDrawer.vue 更多筛选
|
||||
├── ActiveFilterPills.vue 已应用条件回显
|
||||
├── ResultTable.vue 表格和列设置入口
|
||||
├── SavedQueryMenu.vue 保存查询方案和最近使用
|
||||
└── query-utils.js 查询状态序列化、规范化和纯转换函数
|
||||
```
|
||||
|
||||
职责要求:
|
||||
|
||||
- `index.vue` 持有唯一查询状态源,负责加载配置、拼接请求、分页和刷新;
|
||||
- `index.vue` 不包含模块编码判断、业务状态常量、固定快捷字段或固定关键词字段;
|
||||
- 各筛选组件只负责展示和编辑条件,通过 `v-model` 或语义明确的事件通信;
|
||||
- `WorkQueueTabs.vue`、`KeywordSearch.vue` 和 `QuickFilters.vue` 均只消费配置,不内置模块专用选项;
|
||||
- 不在多个组件复制查询条件;
|
||||
- 不在子组件中自行请求同一列表或配置数据;
|
||||
- 查询状态规范化、URL 编解码和条件标签生成等纯逻辑集中维护并可单测;
|
||||
- 组件不直接拼接 SQL,也不承担权限判断。
|
||||
|
||||
## 11. 实施阶段
|
||||
|
||||
### 阶段一:查询模型和接口
|
||||
|
||||
- 确认新查询请求、响应和配置结构;
|
||||
- 建立字段类型、操作符和筛选值的统一定义;
|
||||
- 建立页签/预设视图模型;
|
||||
- 建立模块查询配置接口,统一返回工作队列、关键词搜索、快捷筛选和字段元数据;
|
||||
- 为首批模块录入查询配置,不在前端页面写入模块专用查询定义;
|
||||
- 建立统一列表查询和数量统计服务;
|
||||
- 将权限、字段权限和数据范围接入查询构建流程;
|
||||
- 直接切换到新接口,不保留旧查询兼容入口。
|
||||
|
||||
### 阶段二:列表页基础体验
|
||||
|
||||
- 实现工作队列页签;
|
||||
- 实现批量数量统计;
|
||||
- 实现关键词搜索;
|
||||
- 实现快捷筛选;
|
||||
- 实现条件回显、单条件删除和全部清除;
|
||||
- 实现查询变更后的分页重置;
|
||||
- 精简默认表格列。
|
||||
|
||||
### 阶段三:更多筛选
|
||||
|
||||
- 实现字段类型到控件的映射;
|
||||
- 实现日期预设区间和自定义范围;
|
||||
- 实现数值比较和文本匹配方式;
|
||||
- 实现多值字段“任一/全部”;
|
||||
- 实现筛选抽屉的应用、取消和重置行为;
|
||||
- 实现空结果提示和条件放宽入口。
|
||||
|
||||
### 阶段四:保存和个性化
|
||||
|
||||
- 实现保存查询方案;
|
||||
- 实现默认视图、最近使用和方案删除;
|
||||
- 实现列预设和用户列布局;
|
||||
- 实现方案共享;
|
||||
- 实现 URL 状态同步和查询分享。
|
||||
|
||||
### 阶段五:按模块推广
|
||||
|
||||
- 选择海运订单、报关单、费用单等状态清晰且使用频繁的模块作为首批模块;
|
||||
- 为每个模块定义 4~6 个工作队列页签;
|
||||
- 根据实际查询日志调整快捷字段和默认列;
|
||||
- 再推广到客户档案等没有明显生命周期的模块,此类模块可以只启用关键词、快捷筛选和更多筛选,不强制配置页签。
|
||||
|
||||
## 12. 测试计划
|
||||
|
||||
### 12.1 后端测试
|
||||
|
||||
- 页签条件与用户筛选条件按 `AND` 合并;
|
||||
- 多选字段“任一/全部”生成正确 SQL;
|
||||
- 日期边界、时区和包含起止日期行为正确;
|
||||
- 数值比较符行为正确;
|
||||
- 关键词跨字段搜索行为正确;
|
||||
- 字段权限、模块权限和数据范围始终生效;
|
||||
- 列表数量与页签统计使用相同条件;
|
||||
- 非法字段、非法操作符和越权条件被拒绝;
|
||||
- 分页、排序和筛选参数不会产生非查询 SQL;
|
||||
- 查询方案只能被授权用户读取或修改。
|
||||
|
||||
### 12.2 前端测试
|
||||
|
||||
- 默认页签和默认条件正确加载;
|
||||
- 切换页签保留或清理筛选条件的规则正确;
|
||||
- 条件标签可单独删除;
|
||||
- 更多筛选的取消不影响已应用条件;
|
||||
- 应用筛选后回到第一页;
|
||||
- 刷新或打开分享 URL 可恢复查询;
|
||||
- 空结果状态能够定位和清除条件;
|
||||
- 数量加载失败不阻塞列表;
|
||||
- 表格列视图切换不改变查询结果;
|
||||
- 保存、修改、删除和设为默认查询方案正常。
|
||||
|
||||
### 12.3 验收场景
|
||||
|
||||
至少用真实业务流程验证:
|
||||
|
||||
1. 业务员进入海运订单,直接点击“待处理”处理自己的工作队列;
|
||||
2. 在“待处理”下筛选某客户和本月 ETD;
|
||||
3. 通过“更多筛选”查找同时包含多个服务项的订单;
|
||||
4. 将“本月未订舱”保存为个人默认查询;
|
||||
5. 复制查询 URL 给另一位有权限的同事;
|
||||
6. 无权限用户打开同一 URL 时看不到越权数据;
|
||||
7. 查询无结果时能明确看到条件并一键放宽或清除。
|
||||
|
||||
## 13. 观测指标
|
||||
|
||||
上线后按模块记录以下指标,用于持续收敛默认配置:
|
||||
|
||||
- 从进入列表到首次有效查询的耗时;
|
||||
- 页签点击占比及各页签使用频率;
|
||||
- 快捷筛选使用频率;
|
||||
- 更多筛选打开率和应用成功率;
|
||||
- 空结果率;
|
||||
- 查询后再次修改条件的次数;
|
||||
- 保存查询方案数量和复用次数;
|
||||
- 默认列设置被修改的比例;
|
||||
- 列表查询接口耗时、数量统计接口耗时和错误率。
|
||||
|
||||
判断标准不是“可配置项是否足够多”,而是业务是否更少打开复杂筛选、更少遇到空结果、更快找到需要处理的数据。
|
||||
|
||||
## 14. 明确不做的事项
|
||||
|
||||
- 不在第一版实现任意层级的 AND/OR 条件树;
|
||||
- 不实现查询表达式语言;
|
||||
- 不把所有字段默认展示为筛选项;
|
||||
- 不把所有生命周期状态都平铺为页签;
|
||||
- 不把最终 SQL 保存到用户查询方案;
|
||||
- 不在前端执行权限过滤代替后端 SQL;
|
||||
- 不保留旧查询接口、旧查询配置、旧字段映射或旧数据兼容逻辑;
|
||||
- 不为每个业务模块复制一套专用查询接口;
|
||||
- **本期不做**:URL 状态同步与查询分享(见 §8 实施状态);保存查询方案与列预设视图亦下期再做。
|
||||
|
||||
## 15. 完成标准
|
||||
|
||||
- 新查询模型和新接口在目标模块生效,旧查询入口已移除;
|
||||
- 工作队列页签、关键词搜索和快捷筛选均由模块配置生成,前端没有模块专用分支;
|
||||
- 新增或调整模块查询入口只需要修改模块配置和字段元数据,不需要修改前端组件代码;
|
||||
- 列表页默认只展示必要的工作队列、筛选条件和表格列;
|
||||
- 业务人员可以不打开“更多筛选”完成主要日常工作;
|
||||
- 复杂查询通过字段类型匹配的业务控件完成,不需要理解技术表达式;
|
||||
- 查询条件可回显、单独修改、清除和通过 URL 恢复;
|
||||
- 常用查询可以保存、设为默认并再次使用;
|
||||
- 页签数量与列表结果遵守相同的权限和数据范围;
|
||||
- 关键前后端测试通过,真实业务验收场景可完成;
|
||||
- 查询日志和性能指标已接入,能够根据使用数据继续调整页签、快捷字段和默认列。
|
||||
Reference in new issue
Block a user