Files
wecom_it_smart_desk/docs/01-产品文档/02-会话管理/PRD-REQ-会话-001-员工结束会话-v1.1.archive.md
T
Simon facc04aa65 chore: docs 结构整改 + compose 双目录对齐(合并重建提交)
本提交为 .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-*/
2026-08-07 22:31:32 +08:00

289 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 员工结束会话 PRD
> **版本**: v1.1
> **日期**: 2026-07-30
> **REQ编号**: REQ-会话-001
> **优先级**: P1
> **阶段**: 近期
> **状态**: 待评审(v1.1 调整稿)
> **基线版本**: v1.02026-07-24
---
## 一、需求概述
### 1.1 需求背景
**v1.0 背景**(延续):
1. 用户无法主动结束会话,若要结束错误对话历史(如 AI 回答错误),只能开启新会话
2. 人工咨询场景缺少员工主动结束的入口
3. 满意度评价仅在 AI 判定问题已解决时触发,无法覆盖所有会话场景
**v1.1 新增背景**
1. **AI 能力演进**:短期 AI 咨询无法取代人工(高频刚需:VPN、密码、紧急断网等),但长期 AI 咨询将逐步取代人工常规工作内容。设计需兼顾"现在好用"和"未来演进"。
2. **按钮维度过载**v1.0 把"服务可用性"(坐席离线/繁忙)和"会话进程"(呼叫/排队/结束)合并到同一按钮,导致 5 种状态文案切换,老人找错功能。
3. **右栏信息冗余**:右栏底部"排队等待标签" + "答题挑战"占视觉位且非核心路径,桌面端右栏过度堆砌,移动端(<500px)又根本不渲染右栏。
4. **2026-07-27 实现变更**InputBar 已实际采用 5 态合并按钮(hidden/disabled/active/urgent/waiting),并移除"结束咨询"按钮态,统一由头像右边红色按钮触发满意度评价。PRD 需与实现对齐。
### 1.2 需求目标
| 目标 | 说明 | 状态 |
|------|------|------|
| G1 | 员工可主动结束当前会话 | 延续 v1.0 ✅ |
| G2 | 结束会话时强制收集满意度评价 | 延续 v1.0 ✅ |
| G3 | 操作按钮承载"会话进程"(呼叫-排队) | v1.1 调整 ✏️ |
| G4 | 服务可用性(坐席是否在线)在显眼位置可见 | v1.1 新增 🆕 |
| G5 | 排队进度反馈靠近底部、不污染对话流 | v1.1 新增 🆕 |
| G6 | 右栏聚焦核心:设备诊断 + 智能推荐 | v1.1 新增 🆕 |
---
## 二、用户故事
| # | 角色 | 用户故事 | 优先级 |
|---|------|----------|--------|
| US-1 | 员工 | 作为员工,我希望在会话结束时能主动关闭会话,以便开始新会话获取正确回答 | P0 |
| US-2 | 员工 | 作为员工,我希望结束会话时能评价本次服务,以便反馈服务质量 | P0 |
| US-3 | 员工 | 作为员工,我希望一眼看到坐席是否在线,以便判断"AI 答不出时能否转人工" | P1 🆕 |
| US-4 | 员工 | 作为员工,我希望排队时能看到进度(前面几个人、还要多久),以便降低焦虑 | P1 🆕 |
---
## 三、功能详情
### 3.1 设计哲学:维度分离
**核心思想**:把 5 个状态按性质拆成两个独立维度,每个维度用最合适的 UI 形式呈现。
| 维度 | 性质 | UI 形式 | 位置 |
|---|---|---|---|
| **A. 服务可用性** | 系统状态(坐席/排班决定) | 标题栏徽章 | 顶部,永远可见 |
| **B. 会话进程** | 用户动作(员工点击决定) | 操作按钮 5 态切换 | 输入栏上方 |
| **C. 排队进度** | 实时反馈(WS 推送) | 底部消息胶囊 | 输入框上方,锚定底部 |
**为什么这样拆**
- 服务可用性是"系统告诉员工能不能叫到人" → 不该占用操作按钮位
- 会话进程是"员工告诉系统想干什么" → 操作按钮正确
- 排队进度是"系统实时反馈" → 既不能丢(员工焦虑),又不能污染对话流(影响 AI 上下文)
### 3.2 操作按钮状态机(v1.1 与实现对齐)
**位置**:输入栏控件区第一层(独占一行),与发送按钮上下相邻
**5 态定义**(与 InputBar.vue:194-243 实现完全一致):
| 状态 | 触发条件 | 按钮文案 | 按钮图标 | 样式 | 可点击 |
|------|---------|---------|---------|------|--------|
| **hidden** | 无会话 / 会话已关闭 | (不显示) | — | — | — |
| **disabled** | 坐席离线(!store.agentOnline | 人工坐席 | 🔒 | 灰色禁用 | ❌ |
| **waiting** | 排队中(conv.status === 'waiting' | 排队等待 | ⏳ | 橙色描边 | ✅(点击取消) |
| **active** | AI 回复 ≥ 3 次 / 无紧急词 | 人工坐席 | 🎧 | 绿色描边 | ✅ |
| **urgent** | 检测到紧急关键词 | 人工坐席 | 🚨 | 红色脉冲 | ✅ |
**2026-07-27 变更说明**
- 移除 v1.0 PRD 中的"结束咨询"按钮态
- 服务中(坐席已接入)不再通过按钮触发结束,统一由头像右边红色按钮(`chat-panel__exit-btn`)触发
- 这样按钮语义更聚焦:**只承担"呼叫"和"取消排队"两个动作**
**优先级顺序**(代码行 214):
```
hidden > waiting > active/urgent > disabled
```
### 3.3 服务可用性指示(v1.1 新增 / G4)
**位置**:标题栏左上角,与"IT 智能服务"标题相邻
**当前实现**ChatPanel.vue:21-28):
```
[IT] 智能IT服务 · 🟢 坐席在线
[IT] 智能IT服务 · ⚫ 坐席离线
```
**v1.1 增强要求**
- 永远显示,不随页面滚动消失
- 颜色区分:在线 = 绿色圆点(`chat-panel__status--online`),离线 = 灰色圆点(`chat-panel__status--offline`
- 后续 v1.2 可扩展为"在线 / 繁忙 / 离线"三态(增加预计等待时长)
### 3.4 排队进度消息胶囊(v1.1 新增 / G5)
**核心思想**:参考"会话已关闭"系统消息(conversation.ts:1800-1814 的 `getResolveMessageText`)的视觉样式,但**视觉锚定到对话区底部**(输入框上方),不随对话流向上滚动消失。
**位置**
```
┌──────────────────────────────┐
│ (主对话流消息列表) │ ← 正常消息流
│ │
│ │
│ │
├──────────────────────────────┤
│ ⏳ 排队中 · 前面 3 人 · 1:32 │ ← 排队进度胶囊(sticky bottom
├──────────────────────────────┤
│ 😊 📎 [输入框] 🎤 [发送] │ ← 输入栏
└──────────────────────────────┘
```
**状态映射**
| 排队状态 | 胶囊文案 | 颜色 |
|---------|---------|------|
| 未排队 | (不显示胶囊) | — |
| 排队中 | `⏳ 排队中 · 前面 N 人 · 预计 MM:SS` | 橙色 |
| 已接入 | `🟢 已接入 · 客服小王` | 绿色,3 秒后淡出 |
**更新机制**
- 仅在**关键节点**触发胶囊内容更新,不每次位置变化都重渲染
- 关键节点:进入排队、每跳 3 位(如 5 → 2 → 1)、接听
- 普通位置变化由胶囊内的数字自动平滑过渡(CSS transition
**与对话流的关系**
-**不作为消息插入对话历史**(避免污染 AI 上下文与推荐系统)
- ✅ 作为独立 UI 元素渲染,DOM 位置在 `chat-panel__messages``InputBar` 之间
- ✅ 类似 "会话已关闭"消息的视觉样式,但**位置上移到对话流底部区域**
### 3.5 右栏简化(v1.1 新增 / G6
**删除**
- 右栏底部整段 `right-panel__queue-section`(含标题栏、QueueWaiting 组件、答题挑战)
- 连带的 `__divider` 分隔线
- WebSocket 中 `queue_position_update` 事件回调(改由底部胶囊消费)
- `api/queue` + `api/quiz` 两个 API 模块
- `useConversationStore``queuePositionData` / `cancelQueue` / `handleQueuePositionUpdate`
- `ChatPanel.vue``handleCancelQueue` 流程(改为按钮直接 emit 到 store
**保留**(桌面端右栏最终结构):
```
┌─ 右栏 ─────────────────────┐
│ ▼ 设备信息(默认折叠) │ 保留
│ ▼ 自助诊断(异常徽章) │ 保留
├─────────────────────────────┤
│ ⚡ 智能推荐卡片 │ 保留
├─────────────────────────────┤
│ │
│ (空,剩余滚动空间) │
│ │
└─────────────────────────────┘
```
**移动端**:<500px 默认不渲染右栏,无变化。
### 3.6 结束会话流程(延续 v1.0,对齐 2026-07-27 变更)
**触发方式**:点击标题栏右侧红色退出按钮(`chat-panel__exit-btn`SVG 退出图标)
**流程**
```
点击"结束会话"红色按钮
弹出确认对话框:"退出后会话记录会清空,当前咨询进度将丢失"
↓ 确认
调用后端 employeeClose API → 会话状态变为 resolved
前端同步 store 状态为 resolved(防止 WS 延迟)
弹出满意度评价组件(EvaluationDialog
用户提交评价(必填)
评价提交成功 → 关闭窗口 / 跳转登录页
```
**技术要点**
- 必须同步更新前端 store(防 BUG-用户-003 重现,参见 ChatPanel.vue:438-444 的修复)
- axios 拦截器先弹 `res.message`ChatPanel catch 兜底再显示一次(双重错误信息)
- 三层降级关闭窗口:WeixinJSBridge → window.close() → 跳转 /h5/login
---
## 四、非目标
| # | 明确不做 |
|---|----------|
| N1 | 不修改人工呼叫的后端逻辑(仅前端 UI 与状态管理调整) |
| N2 | 不区分 AI 会话与人工会话的结束流程 |
| N3 | 不支持跳过评价直接关闭(必须评价) |
| N4 | **不做 AI 意图识别"叫人工"功能**v1.2 路线图,本期不实现) |
| N5 | **不做答题挑战 / 插队机制**(v1.1 移除,保留代码可未来恢复) |
| N6 | **不做"在线/繁忙/离线"三态服务可用性**(v1.2 路线图,本期仅在线/离线二态) |
---
## 五、验收指标
| # | 指标 | 目标值 | 验收方式 |
|---|------|--------|---------|
| AC1 | 员工可主动结束会话 | 100% | 点击"结束会话"红色按钮可触发关闭流程 |
| AC2 | 评价提交率 | =100% | 关闭会话前必须提交评价 |
| AC3 | 操作按钮状态切换正确 | 5 种状态正确切换 | 人工呼叫全流程测试 |
| AC4 | 服务可用性永远可见 | 标题栏徽章在所有页面状态可见 | 滚动 + 弹窗场景测试 |
| AC5 | 排队进度胶囊准确显示 | 排队时显示位置/时间,接听后淡出 | WS 推送全链路测试 |
| AC6 | 右栏底部 queue section 完全移除 | 桌面端右栏只含 2 大区块 | 构建产物 + 视觉回归 |
| AC7 | 不污染对话流 | 排队进度不进入 store.messages | store 检查 + AI 推荐效果对比 |
---
## 六、关联文档
| 文档 | 说明 |
|------|------|
| `前端组件-InputBar.vue` | 操作按钮 5 态实现(hidden/disabled/active/urgent/waiting |
| `前端组件-ChatPanel.vue` | 标题栏坐席状态徽章 + 结束会话流程 |
| `前端组件-ResolveFeedback.vue` / `EvaluationDialog.vue` | 满意度评价组件 |
| `前端组件-RightPanel.vue` | 右栏(v1.1 移除 queue section |
| `前端组件-QueueWaiting.vue` | 右栏排队组件(v1.1 标记弃用,保留文件) |
| `API-h5.py` | 关闭会话 API |
| `PRD-REQ-集成-002-邀请功能` | 会话管理系列功能 |
| `原型-REQ-会话-001-结束会话流程-v1.1.html` | v1.1 原型图(重绘) |
---
## 七、里程碑
| 阶段 | 任务 | 预计时间 |
|------|------|---------|
| M1 | PRD v1.1 评审 | 0.5 天 |
| M2 | 移除右栏 queue section | 0.5 天 |
| M3 | 实现底部进度消息胶囊 | 1 天 |
| M4 | 操作按钮文案与样式微调 | 0.5 天 |
| M5 | 联调测试 + 回归 | 1 天 |
| M6 | 上线 | 0.5 天 |
| **合计** | | **4 天** |
---
## 八、风险与依赖
| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| R1:底部胶囊位置冲突 | 可能与排查步骤(TroubleshootFlow)、参与者缩略头像条(ParticipantStrip)重叠 | 胶囊仅在排队中显示,其他 UI 元素按现有优先级层叠 |
| R2:标题栏徽章挤占空间 | 移动端窄屏下"坐席在线"可能被截断 | 响应式:<360px 改为图标 only |
| R3API 清理影响其他模块 | api/queue 和 api/quiz 可能被其他文件引用 | 搜索全项目引用,确认无人调用后再删 |
| R4:胶囊与"会话已关闭"消息同时出现 | 排队中会话关闭时,胶囊和系统消息并存 | 关闭会话时立即清除胶囊,避免视觉冲突 |
| R5:WS 推送频率影响胶囊渲染 | 每次位置变化都推 → 胶囊频繁重渲染 | 已在 3.4 节加限制,仅关键节点更新内容 |
**依赖**
- D1WebSocket `queue_position_update` 事件已实现(useH5WebSocket.ts:460
- D2`store.agentOnline` 字段已存在(用于服务可用性指示)
- D3EvaluationDialog 组件已实现
---
## 九、变更记录(v1.0 → v1.1
| 变更项 | v1.0 | v1.1 | 原因 |
|--------|------|------|------|
| 按钮状态数 | 3 态(人工咨询/排队等待/结束咨询) | 5 态(hidden/disabled/active/urgent/waiting | 与 InputBar.vue 实际实现对齐 + 2026-07-27 移除"结束咨询"按钮态 |
| 服务可用性 UI | 未单独呈现 | 标题栏徽章(在线/离线) | v1.1 G4 新增要求 |
| 排队进度位置 | 右栏底部 QueueWaiting 卡片 | 底部消息胶囊(输入框上方) | v1.1 G5:移动端不可见右栏、桌面端右栏过度堆砌 |
| 答题挑战 | 右栏内嵌(含插队机制) | 完全移除 | v1.1 N5:非核心路径、游戏化双刃剑 |
| 结束会话入口 | 操作按钮"结束咨询"态 | 头像右边红色按钮 | 2026-07-27 已变更,对齐实现 |
| 右栏结构 | 4 大区块(设备/诊断/推荐/排队) | 2 大区块(设备+诊断 / 推荐) | v1.1 G6:聚焦核心 |
| API 清理 | 保留 queue + quiz API | 移除 api/queue + api/quiz | 配套代码清理 |
---
## 十、关联缺陷
| 缺陷编号 | 标题 | 状态 | 优先级 |
|----------|------|------|--------|
| [BUG-用户-003](../../03-测试文档/05-缺陷单/BUG-用户-H5结束会话失败-003.md) | H5员工端"结束会话失败,请稍后重试" | 已修复(2026-07-30 | P2-Medium |