facc04aa65
本提交为 .git 对象库损坏后的重建提交,内容等价于原先三个本地提交 (5e2fd4c2 / 57a53c98 / 5d7e1873)的累积结果,未做任何额外改动。 一、docs 结构整改(整改 #14) 根因:重构时新结构为 untracked 文件,执行 git stash(未带 -u)未纳入, 随后 git reset 拉回 HEAD 旧 tracked 树,导致旧树复活、新旧两棵目录 树并存于 docs/,共 791 文件、双分类体系冲突。 修复动作: - b2 同名异主题文件改名迁移保全 9 个 - C 类 39 个孤立文件按主题正确归类 - A/B1 类 222 个重复文件删除(新结构已有内容副本) - 9 个旧独有空目录删除 - 270 处内部引用按 verified 映射改写 - 整改记录 #14 登记于 04-运维文档/部署运维 结果:docs 791 → 569 文件,顶层仅规范 8 类 + 治理文件,单树恢复。 残留:约 20 处指向从未存在文件的陈旧死链,归入独立文档卫生任务。 二、compose 双目录对齐(消除踩坑 A) - docker-compose.yml:nginx 前端挂载全部由根目录 frontend-*/dist 改为 src/frontend-*/dist(h5 / agent / admin / terminal) - docker-compose.dev.yml:dev 服务 build context 与卷同步改 src/ - 效果:本地 docker compose up 不再把根目录 stale dist 挂回, 与线上一致,分叉隐患消除(已 docker compose config 校验通过) 防复发铁律: - 重构须提交;仓库修复须 git stash -u 或先 commit - 新结构须 git add 并提交,避免再次 untracked 复活 - H5 改动只动 src/frontend-h5/,禁改根目录遗留 frontend-*/
10 KiB
10 KiB
坐席端会话状态 Tab 筛选 — 产品需求文档 (PRD)
版本: v1.0
日期: 2026-08-03
作者: 宋献
状态: ✅ 已落地(生产版本index-BK_U7e10.js)
子系统: 04-坐席工作台
模块: 会话列表筛选
关联任务: #134(坐席端左栏会话状态 Tab 顺序调整 + 默认显示待处理)
关联原型:原型-REQ-坐席-000-坐席工作台-v1.2.html
1. 背景与目标
1.1 现状分析
坐席工作台左栏会话窗口已具备 Tab 筛选能力(v1.0 起即存在),但 v1.1 存在两个影响日常效率的问题:
| 问题 | 表现 | 影响 |
|---|---|---|
| Tab 顺序不合理 | 「全部」Tab 排在第一位(按字母 + 全集概念) | 高频 Tab(待处理)被埋在其他标签后面 |
| 默认激活错位 | 默认进入页面激活「全部」 | 坐席每天首次进入要先点 1 下切到「待处理」才看到工作队列 |
| 筛选粒度不足 | 「全部」Tab 混排 待处理 + 进行中 + 已完成 + 同事会话 + 历史会话 | 视觉噪音多,重点不突出 |
1.2 用户痛点
核心痛点:坐席每日首次进入坐席工作台 → 应立即看到「我现在该处理的待办队列」。
但当前版本默认显示「全部」,坐席需要:
- 看完整列表 → 识别哪些是新分派的
- 或点击「待处理」Tab → 才看到工作队列
多点击 + 视觉噪音:每天 8 小时 × 多次重入 = 累计损失明显。
1.3 目标
通过最小改动(仅 Tab 顺序调整 + 默认激活态变更),实现:
- 默认即工作队列 — 打开坐席工作台,第一眼就是待处理
- 顺序符合使用频次 — 高频 Tab 在前、低频 Tab 在后
- 「全部」沉底 — 仅作"全部查看"用,不作为默认入口
1.4 设计原则
| 原则 | 体现 |
|---|---|
| 最小改动 | 仅顺序 + 初值,不动 store / 不动样式 / 不动 key 名 |
| 后向兼容 | 保留 activeFilter 的 4 个 key('pending' | 'active' | 'done' | 'all'),switch 逻辑、API 调用、URL 参数都不变 |
| 数据准确 | status 映射规则保留:pending→queued、active→serving/ai_handling、done→resolved |
| 协同不干扰 | 同事会话(colleagueConversations)和历史会话(historyConversations)仅在「全部」Tab 下可见,其他 Tab 按 applyFilters 自然归零 |
2. 需求说明
2.1 核心功能(FR)
| FR ID | 功能描述 | 优先级 |
|---|---|---|
| FR-01 | 左栏会话窗口顶部展示 4 个 Tab,顺序为「待处理 → 进行中 → 已完成 → 全部」 | P0 |
| FR-02 | 默认进入页面激活「待处理」Tab(无需点击) | P0 |
| FR-03 | 切换 Tab 时列表实时过滤,按 applyFilters 规则(见 §2.3) |
P0 |
| FR-04 | 搜索框 + Tab 为 AND 关系(关键词 ∧ 状态) | P1 |
| FR-05 | 「全部」Tab 下展示所有会话(含同事 + 历史) | P1 |
2.2 详细说明
4 个 Tab 排序逻辑(高频在前,低频在后):
- 待处理 — 每日最高频(队列分派 / 求助举手 / 新分派会话)
- 进行中 — 高频(已回复待用户反馈的会话)
- 已完成 — 中频(结单归档的会话)
- 全部 — 低频(异常排查 / 数据回顾)
激活态与默认行为:
- 默认
activeFilter = 'pending' - 用户切换后,组件不持久化 Tab 选择(刷新即回到「待处理」)— 这是设计选择,避免历史 Tab 状态导致坐席看不到最新队列
2.3 状态映射规则(与 Store API 保持一致)
| Tab 显示文案 | activeFilter 值 |
对应 conv.status |
Store 归属 |
|---|---|---|---|
| 待处理 | 'pending' |
queued(待接单) |
myConversations |
| 进行中 | 'active' |
serving(服务中)或 ai_handling(AI 处理中) |
myConversations / colleagueConversations |
| 已完成 | 'done' |
resolved(90 天内) |
historyConversations |
| 全部 | 'all' |
不限定 | 三段全部 |
注:
activeFilterkey 名'active'(不是'in-progress')保持后向兼容;store status 命名(如serving/ai_handling)不变。
2.4 跨段渲染规则
| Tab | 我的会话(mine) | 同事会话(colleague) | 历史会话(history) |
|---|---|---|---|
| 待处理 | ✅ 显示 pending | ❌ 自然为空(store 隔离) | ❌ 自然为空 |
| 进行中 | ✅ 显示 active | ❌ 自然为空 | ❌ 自然为空 |
| 已完成 | ✅ 显示 done(跨段渲染 from history) | ❌ 自然为空 | ✅ 显示 resolved |
| 全部 | ✅ 显示 all | ✅ 显示 all | ✅ 显示 all |
「同事会话」在所有筛选 Tab 下都不出现(store 中 colleagueConversations 仅含
serving+!is_mine+!is_collaborator和ai_handling,不满足 pending/active/done 的任意状态)— 用户确认接受该行为。
3. 用户故事 & 验收标准
3.1 用户故事
| US ID | 角色 | 故事 | 优先级 |
|---|---|---|---|
| US-01 | 坐席 | 作为坐席,我希望打开坐席工作台立即看到待处理会话列表,这样能马上开始工作 | P0 |
| US-02 | 坐席 | 作为坐席,我希望 Tab 按使用频次排序(待处理在最左),这样切换更顺手 | P1 |
| US-03 | 坐席 | 作为坐席,我希望「全部」沉到底部(不是默认入口),避免误点 | P1 |
| US-04 | 资深坐席 | 作为坐席,我希望切换到「全部」Tab 还能看到同事会话和历史会话,便于排查 | P1 |
3.2 验收标准(AC)
| AC ID | 验证项 | 验收方法 | 预期结果 |
|---|---|---|---|
| AC-01 | Tab 顺序 | 视觉确认 | 从左到右:待处理 → 进行中 → 已完成 → 全部 |
| AC-02 | 默认激活 | 刷新页面 | 「待处理」Tab 蓝色高亮 |
| AC-03 | 默认列表 | 刷新页面 | 左侧仅展示 status=queued 的会话(来自 myConversations 自然过滤) |
| AC-04 | Tab 切换「进行中」 | 点击 | 列表展示 status in {serving, ai_handling} |
| AC-05 | Tab 切换「已完成」 | 点击 | 列表展示 status=resolved(来自 historyConversations) |
| AC-06 | Tab 切换「全部」 | 点击 | 三段(my + colleague + history)全部展示 |
| AC-07 | 搜索 + Tab 联动 | 输入关键词后切换 Tab | 关键词 ∧ 状态过滤均生效 |
| AC-08 | 同事会话隐藏(非全 Tab) | 切到「待处理」 | 赵敏/周芳/吴明(同事区)不显示 |
| AC-09 | 接手会话流转 | 同事会话点击「接手」 | 接手后会话归入 myConversations,「全部」Tab 下可见 |
| AC-10 | 无数据容错 | DB 清空全部会话 | 「待处理」激活,左侧显示 el-empty description="暂无会话" 占位 |
4. 交互示意
4.1 默认进入页面
┌─────────────────────────────────┐
│ [🔍 搜索用户、关键词...] │
│ │
│ [● 待处理 5] [进行中 1] ... [全部 10] │ ← Tab 行:默认 ● 待处理
│ │
│ 头像 张伟 10:25 待回复 张 │ ← 左侧会话语义化分区
│ VPN 连接失败 │
│ 头像 陈芳 09:42 待回复 陈 │
│ 系统卡顿 │
│ ... │
└─────────────────────────────────┘
4.2 切到「全部」Tab
┌─────────────────────────────────┐
│ [● 全部 10] ... [● 待处理 5] │ ← 切到全部 Tab
│ │
│ --- 我的会话 --- │
│ 头像 张伟 10:25 待回复 张 │
│ ... │
│ --- 同事会话(刘明/王强/李静)--- │
│ 头像 赵敏 OA 审批流程报错 [接手]│
│ ... │
│ --- 历史会话 --- │
│ 头像 周杰 昨日 VPN 证书过期—已解决 │
└─────────────────────────────────┘
5. 不在本 PRD 范围(明确边界)
为避免范围蔓延,以下问题由后续独立 PRD 处理:
| 项 | 说明 | 后续 PRD 候选 |
|---|---|---|
| Tab 数量徽章(待处理 5 等) | v1.2 原型里有该设计,但需要 store 新增 4 个 computed 计算实时数量 | #135 候选 |
| 空状态文案("暂无待处理会话") | 当前复用 el-empty description="暂无会话",已能覆盖空场景 |
视真实使用反馈决定是否独立 PRD |
| 持久化 Tab 选择(localStorage) | 当前切换刷新即回默认;若坐席希望保留,可加 1 行 localStorage | 视需求反馈 |
6. 关联文档
| 文档 | 路径 | 说明 |
|---|---|---|
| 原型 v1.2(最新版) | docs/01-产品文档/04-坐席工作台/原型-REQ-坐席-000-坐席工作台-v1.2.html |
UI 设计基准 |
| 技术方案(会话列表) | docs/02-技术文档/技术架构/技术方案-REQ-坐席-002-AI辅助消息框-v1.0.md |
新增 §X.Y 段(commit 时同步) |
| 任务说明书 #134 | docs/07-项目管理/任务说明书/任务说明书-134-坐席端左栏会话状态Tab顺序调整+默认显示待处理.md |
落地过程记录 |
| 前端源码 | src/frontend-agent/src/components/conversation/ConversationList.vue |
filterTags + activeFilter 2 处改动 |
| Pinia Store | src/frontend-agent/src/stores/conversation.ts |
myConversations / colleagueConversations / historyConversations 数据分区(未改) |
| Git commit | 566bb46 feat(agent): 坐席端左栏会话状态 Tab 顺序调整 + 默认显示待处理 (#134) |
单一原子提交 |
7. 变更记录
| 日期 | 变更内容 | 变更人 |
|---|---|---|
| 2026-08-03 | 创建 PRD #009,承接 #134 落地需求 | 宋献 |
| 2026-08-03 | 同步技术方案 #002 加入交叉引用 | 宋献 |