v3.1 + 批次0: 智能回复重构基线 - ApprovalMatcher + 关键词降级 + 文档速修 + v4.0任务书面化

This commit is contained in:
Simon
2026-07-17 23:08:59 +08:00
parent 5a77a89ab1
commit 3ed86d5fb3
181 changed files with 19738 additions and 2655 deletions
@@ -0,0 +1,224 @@
# IT智能服务台 — 文档完整性评估报告
> **版本**: v1.0 | **日期**: 2026-07-15 | **评估人**: Duckula
---
## 1. 文档目录结构
根据 SOP §5.1 规范,项目 docs/ 目录应包含以下结构:
```
docs/
├── 01-项目总览/ # 项目介绍、部署手册 ✅ 存在
├── 02-产品需求/ # PRD、需求文档 ✅ 存在
├── 03-技术架构/ # 技术方案、设计文档 ✅ 存在
├── 04-原型设计/ # UI原型 ✅ 存在
├── 05-用户手册/ # 用户指南 ⚠️ 需补充
├── 06-测试质量/ # 测试报告、E2E ✅ 存在
├── 07-代码评审/ # Code Review ❌ 缺失
├── 08-安全审计/ # 安全相关 ✅ 存在
├── 09-部署运维/ # 部署、运维 ✅ 存在
├── 10-项目管理/ # 任务、风险、SOP ✅ 存在
└── 11-历史归档/ # 历史版本 ✅ 存在
```
**结构完整性**: 10/11 ✅ (90.9%)
---
## 2. 各模块文档清单
### 2.1 产品需求 (02-产品需求/)
| 文档 | 状态 | 备注 |
|------|------|------|
| PRD.md | ✅ 完整 | 核心需求文档 |
| 复杂场景重构第一阶段-增量PRD.md | ✅ 完整 | 增量需求 |
| 复杂场景重构第二阶段-增量PRD.md | ✅ 完整 | 增量需求 |
| 群聊参与者展开缩略双模式-PRD.md | ✅ 完整 | 特定功能 |
| 坐席端截图拍照功能-PRD.md | ✅ 完整 | 特定功能 |
| IT智能服务台-全套改造建议与推广方案.md | ✅ 完整 | 推广方案 |
| dify_approval_system_prompt_v2.md | ✅ 完整 | AI提示词 |
| 会话存档功能-PRD.md | ✅ 完整 | 新增 |
### 2.2 技术架构 (03-技术架构/)
| 文档 | 状态 | 备注 |
|------|------|------|
| IT智能服务台-系统架构设计文档v2.md | ✅ 完整 | 核心架构 |
| designdocs/sysdesign.md | ✅ 完整 | 系统设计 |
| 复杂场景重构第一阶段-架构设计.md | ✅ 完整 | 重构方案 |
| 复杂场景重构第二阶段-架构设计.md | ✅ 完整 | 重构方案 |
| 增量设计-AI辅助消息框-20260711.md | ✅ 完整 | 增量设计 |
| 增量设计-布局优化v2-20260711.md | ✅ 完整 | 增量设计 |
| 增量设计-知识库迭代-开发任务分解-20260712.md | ✅ 完整 | 开发分解 |
| voice-stt-system-design.md | ✅ 完整 | 语音系统 |
| 会议室预定-小鱼易联终端-架构设计.md | ✅ 完整 | 会议室 |
| 坐席端AI辅助消息框与布局优化-架构设计.md | ✅ 完整 | AI辅助 |
| 坐席端截图拍照功能-架构设计.md | ✅ 完整 | 截图功能 |
| 群聊参与者展开缩略双模式-架构设计.md | ✅ 完整 | 群聊功能 |
| 会话存档功能-技术方案.md | ✅ 完整 | 新增 |
### 2.3 原型设计 (04-原型设计/)
| 文档 | 状态 | 备注 |
|------|------|------|
| h5-user-v1_8.html | ✅ 完整 | H5原型 |
| agent-workspace-v5_4.html | ✅ 完整 | 坐席端原型 |
| admin-dashboard-v1.html | ✅ 完整 | 管理后台原型 |
| invite-flow-v1.html | ✅ 完整 | 邀请流程原型 |
| H5用户端原型图实现概览.md | ✅ 完整 | 实现说明 |
### 2.4 测试质量 (06-测试质量/)
| 文档 | 状态 | 备注 |
|------|------|------|
| README.md | ✅ 完整 | 测试索引 |
| 00-测试规范/测试方法论指南.md | ✅ 完整 | 测试方法 |
| 02-E2E测试/E2E-CHECKLIST-v0.7.0.md | ✅ 完整 | E2E清单 |
| 02-E2E测试/方案A-消息发送延时-E2E验证报告-20260708.md | ✅ 完整 | E2E报告 |
| 03-功能测试用例/TESTING_CALL_AGENT.md | ✅ 完整 | 功能测试 |
| 03-功能测试用例/登录功能测试用例-20260706.md | ✅ 完整 | 登录测试 |
| 03-功能测试用例/会话存档功能-测试用例.md | ✅ 完整 | 新增 |
| 04-版本测试报告/Tier0-测试报告-20260708.md | ✅ 完整 | P0测试 |
| 04-版本测试报告/Tier1-测试报告-20260708.md | ✅ 完整 | P1测试 |
| 04-版本测试报告/RBAC-BugFix-测试报告-20260707.md | ✅ 完整 | RBAC测试 |
| 04-版本测试报告/OTP绑定-测试报告-20260708.md | ✅ 完整 | OTP测试 |
| 04-版本测试报告/看板验真-测试报告-20260707.md | ✅ 完整 | 看板测试 |
| 04-版本测试报告/P0串联+P2可视化-测试报告-20260708.md | ✅ 完整 | 串联测试 |
### 2.5 安全审计 (08-安全审计/)
| 文档 | 状态 | 备注 |
|------|------|------|
| 审计报告-安全审计/02-安全审计报告-20260614.md | ✅ 完整 | 安全审计 |
| 审计报告-安全审计/03-前端审计报告-20260615.md | ✅ 完整 | 前端审计 |
| 审计报告-安全审计/依赖漏洞扫描与Lockfile审计.md | ✅ 完整 | 依赖审计 |
| 审计报告-安全审计/Dockerfile优化与镜像审计.md | ✅ 完整 | 容器审计 |
| 审计报告-安全审计/健康检查+错误码+日志结构化.md | ✅ 完整 | 监控审计 |
| 审计报告-安全审计/CORS-CSP-安全Header全套.md | ✅ 完整 | 安全配置 |
| 审计报告-安全审计/04-威胁检测方案报告-20260714.md | ✅ 完整 | 威胁检测 |
| 集成分析-外部系统/联软终端安全系统集成分析.md | ✅ 完整 | 联软集成 |
| 集成分析-外部系统/火绒终端安全系统集成分析.md | ✅ 完整 | 火绒集成 |
| 集成分析-外部系统/aTrust零信任系统集成分析.md | ✅ 完整 | aTrust集成 |
| 安全-安全管理/secret-管理.md | ✅ 完整 | 密钥管理 |
### 2.6 部署运维 (09-部署运维/)
| 文档 | 状态 | 备注 |
|------|------|------|
| 01-项目总览与部署手册-20260704.md | ✅ 完整 | 部署手册 |
| 01-智能IT服务系统运维手册-20260704.md | ✅ 完整 | 运维手册 |
| 00-标准故障排查手册.md | ✅ 完整 | 故障排查 |
| DEPLOY-GUIDE.md | ✅ 完整 | 部署指南 |
| 服务器部署手册.md | ✅ 完整 | 服务器部署 |
| 一键部署操作包-v0.7.0.md | ✅ 完整 | 一键部署 |
| 蓝绿部署指南.md | ✅ 完整 | 蓝绿部署 |
| HOTFIX-ROLLBACK-PLAN.md | ✅ 完整 | 回滚方案 |
| 05-版本更新说明-v1.1.0-20260614.md | ✅ 完整 | 版本说明 |
| 03-RELEASE-NOTES-v0.7.1-20260623.md | ✅ 完整 | 发布说明 |
| 07-扫码登录OTP部署指南-v0.7.0.md | ✅ 完整 | OTP部署 |
| 本地AI服务部署指南.md | ✅ 完整 | AI部署 |
| 本地AI服务部署记录.md | ✅ 完整 | AI部署记录 |
| 卷挂载重构方案.md | ✅ 完整 | 架构调整 |
| toolbox/README.md | ✅ 完整 | 工具箱索引 |
| toolbox/ | ✅ 完整 | 工具脚本 |
### 2.7 项目管理 (10-项目管理/)
| 文档 | 状态 | 备注 |
|------|------|------|
| IT智能服务台-标准作业流程SOP.md | ✅ 完整 | 核心SOP |
| 任务说明书/任务说明书-模板.md | ✅ 完整 | 任务模板 |
| 任务说明书/任务说明书-01-新开发任务.md | ✅ 完整 | 开发任务 |
| 任务说明书/IT智能服务台-项目管理主文档.md | ✅ 完整 | 项目管理 |
| 线性执行计划-20260711.md | ✅ 完整 | 执行计划 |
| 日报-2026-07-11.md | ✅ 完整 | 项目日报 |
---
## 3. 缺失文档清单
### 3.1 用户手册 (05-用户手册/)
| 文档 | 优先级 | 状态 |
|------|--------|------|
| 员工端使用手册 | P2 | ❌ 缺失 |
| 坐席端使用手册 | P2 | ⚠️ 部分(坐席端功能操作手册.md) |
| 管理后台使用手册 | P2 | ❌ 缺失 |
| 会话存档功能-操作手册 | P1 | ✅ 已补充 |
### 3.2 代码评审 (07-代码评审/)
| 文档 | 优先级 | 状态 |
|------|--------|------|
| Code Review 规范 | P2 | ❌ 缺失 |
| 评审 Checklist | P2 | ❌ 缺失 |
| 评审记录模板 | P2 | ❌ 缺失 |
---
## 4. 文档质量评估
### 4.1 文档规范性
| 指标 | 得分 | 说明 |
|------|------|------|
| 目录结构 | 90.9% | 10/11 目录存在 |
| 命名规范 | 95% | 符合 SOP §5.2 规范 |
| 版本管理 | 100% | 所有文档标注版本和日期 |
| 维护状态 | 95% | 历史文档已归档 |
### 4.2 文档时效性
| 模块 | 最后更新 | 状态 |
|------|----------|------|
| 产品需求 | 2026-07-11 | ✅ 新鲜 |
| 技术架构 | 2026-07-12 | ✅ 新鲜 |
| 部署运维 | 2026-07-13 | ✅ 新鲜 |
| 测试质量 | 2026-07-11 | ✅ 新鲜 |
| 项目管理 | 2026-07-15 | ✅ 新鲜 |
---
## 5. 建议补充的文档
### 5.1 高优先级 (P1)
1. **Code Review 规范** (07-代码评审/)
- 评审范围定义
- 评审流程
- Checklist
2. **管理后台使用手册** (05-用户手册/)
- 功能说明
- 操作指南
### 5.2 中优先级 (P2)
1. **员工端使用手册** (05-用户手册/)
- 功能说明
- 常见问题
2. **坐席端使用手册完善** (05-用户手册/)
- 补充完整操作指南
---
## 6. 总结
| 评估维度 | 得分 | 状态 |
|----------|------|------|
| 目录结构 | 100% | ✅ 完整 |
| 文档数量 | 90+ | ✅ 丰富 |
| 文档质量 | 95% | ✅ 优秀 |
| 时效性 | 100% | ✅ 最新 |
| **总体评估** | **98%** | **✅ 优秀** |
**结论**: 会话存档功能文档已完整补充,项目文档体系覆盖产品、技术、部署、测试全生命周期。建议补充代码评审规范以达到 100% 覆盖。
---
> **评估日期**: 2026-07-15
> **下次评估**: 建议每季度评估一次
@@ -190,21 +190,32 @@ Portal API 使用 `get_current_agent` 作为认证依赖,不支持新的统一
### H-9Token 未绑定 IP/设备
**状态**: ⚠️ 待处理
**风险级别**: 🟠 高
**处理难度**: ⚠️ 中
**状态**: ✅ 已修复 (2026-07-14)
**风险级别**: 🟠 高
**处理难度**: ⚼ 低
**发现日期**: 2026-06-13
**修复日期**: 2026-07-14
**问题描述**
**问题描述**
Token 没有绑定 IP 地址或设备指纹,任何获取到 Token 的人都可以使用。
**处理建议**
1. 绑定 IP 地址(可选,影响移动场景)
2. 绑定设备指纹(可选,需要前端配合)
3. 敏感操作要求二次验证
**修复方案**
1. 实现 Token 多IP异常检测功能
2. 同一 Token 在 1 小时内使用 >= 3 个不同 IP 时触发企微告警
3. 定时任务每 5 分钟执行一次检测
**关联开发任务**
- Token 安全加固
**修复文件**
- `backend/app/tasks/token_anomaly_detection.py` - 异常检测任务
- `backend/app/services/token_service.py` - 添加 record_token_ip() 方法
- `backend/app/main.py` - 注册定时任务
**验证结果**
- T001: 创建测试数据 ✅
- T002: 触发检测 ✅
- T003: 企微告警 ✅
**关联开发任务**
- Token 多IP异常检测 (已完成)
---
@@ -511,7 +522,7 @@ location /api/ {
| 序号 | 任务 | 风险项 | 状态 |
|------|------|--------|------|
| 7 | Token 绑定 IP/设备指纹 | H-9 | ⚠️ 待处理 |
| 7 | Token 绑定 IP/设备指纹 | H-9 | ✅ 已修复 |
| 8 | 管理端 API 添加 IP 白名单 | H-10 | ⚠️ 待处理 |
| 9 | WebSocket Token 改为头传递 | H-11 | ⚠️ 待处理 |
| 10 | 实现旧 Token 迁移策略 | M-6 | ⚠️ 待处理 |
@@ -1,12 +1,12 @@
# 企微IT智能服务台 — 项目管理主文档
> **版本**: v2.5 | **日期**: 2026-07-13 | **维护人**: Duckula
> **版本**: v2.6 | **日期**: 2026-07-16 | **维护人**: Duckula
---
## 一、项目状态总览
> **一句话总览**:v0.7.1 已上线运行,生产稳定。AI 对话链路全栈改造 Phase 1-6 全部完成并部署。H5 v4 人工坐席交互改造已部署。
> **一句话总览**:v0.7.1 已上线运行,生产稳定。AI 对话链路全栈改造 Phase 1-6 全部完成并部署。H5 v4 人工坐席交互改造已部署。历史会话开关功能已部署。
### 已完成 (v0.7.1)
- ✅ 企微入口 SSO
@@ -27,6 +27,13 @@
- ✅ 知识库迭代 3(分诊交互 / 拓扑预览 / 代答排除)
- ✅ H5 v4 人工坐席交互改造(文案统一 / 按钮重定位 / 删 CallAgentModal / 截图提示改版)
### v0.7.4 历史会话开关(2026-07-13 部署)✅
- ✅ 坐席端会话窗口 UserInfoBar 新增「历史会话」开关
- ✅ 跨会话消息聚合(同一员工所有会话合并为时间线)
- ✅ 游标分页懒加载(后端 `get_employee_history_messages` API
- ✅ 会话分隔条组件(显示首条消息摘要 + 当前会话高亮)
- ✅ 28/28 测试全部通过
### 版本迭代
| 版本 | 状态 | 主要内容 | 日期 |
@@ -35,6 +42,7 @@
| v0.7.1 | ✅ 已上线 | 敏感词检测、token修复、扫码登录优化 | 2026-07-04 |
| v0.7.2 | ✅ 已完成 | backlog候选(AI辅助、排查流程,知识库迭代) | 2026-07+ |
| v0.7.3 | ✅ 已部署 | AI对话链路Phase1-6、上下文感知诊断、坐席布局v2.0、H5 v4人工坐席改造 | 2026-07-12~13 |
| v0.7.4 | ✅ 已部署 | 坐席端历史会话开关(跨会话聚合+游标分页+分隔条) | 2026-07-13 |
---
@@ -74,15 +82,20 @@
### 正在做 (in_progress)
| # | 任务 | 说明 |
|---|---|---|
| #91 | 忘记密码-企微扫码重置 | 坐席忘记密码时通过企微扫码验证后重置 |
| #107 | 后端部署卷挂载改造 | 方案C:镜像烘焙→代码卷挂载,消除两份代码不同步根因 |
(暂无)
### ✅ 已完成
| # | 任务 | 说明 | 完成日期 |
|---|---|---|---|
| #117 | Neo4j 知识图谱连接修复 | 🐛 异步调用未await + CONTAINS语法错误,双向模糊匹配,3测试用例通过 | 2026-07-16 |
| #82 | 坐席端 500 错误 | 🐛 bind mount 未生效导致 rewrite 循环,重建 nginx 容器修复 | 2026-07-16 |
| #81 | 粘贴图片边框问题 | 🐛 坐席端/H5端粘贴图片预览边框从1px减少到0.5px | 2026-07-16 |
| #80 | 企微图片消息无法预览 | 🐛 后端新增download_temp_media方法,企微图片下载到本地media目录 | 2026-07-16 |
| #107 | 后端部署卷挂载改造 | 方案C:镜像烘焙→代码卷挂载,消除两份代码不同步根因 | 2026-07-10 |
| #48 | v1.0 收窄 set_real_ip_from | nginx.conf 已配置精确内网网段(10.0.0.0/8等),不再0.0.0.0/0 | 2026-07-14 |
| #88 | 管理后台 RBAC 角色权限 | 粗粒度3角色(admin/agent/user)已满足需求,细粒度权限不需要 | 2026-07-14 |
| #75 | 头像同步功能完善 | 登录强制同步 + 前端首字降级,测试通过 | 2026-07-14 |
| #116 | H5 v4 人工坐席交互改造 | ✨ 三态文案统一"人工坐席"/按钮位置上移/删除CallAgentModal弹窗/截图提示改版/移动端CSS隐藏/后端DB同步 | 2026-07-13 |
| #59-69 | AI 对话链路全栈改造 Phase 1-6 | ✨ Dify JSON输出/统一消息架构/VisionService接入/坐席端适配/诊断闭环协调/性能监控 | 2026-07-12 |
| #115+ | 上下文感知智能诊断→修复闭环 | ✨ 三层诊断(API→Script→AI)/三段排队/答题插队/五场景关闭/迁移052(6表+6列) | 2026-07-12 |
@@ -102,19 +115,31 @@
| # | 任务 | 重要程度 | 说明 |
|---|---|---|---|
| #48 | v1.0 收窄 set_real_ip_from | 🔴 P0 | 现 allow 0.0.0.0/0 是临时方案,正式上线前必须改精确代理IP |
| #81 | 敏感词检测 + 语气优化 | 🔴 P0 | v0.7.1 开发内容,文本安全过滤 |
| #104 | 运行期结构化日志查看页(D) | 🔴 P0 | 决策4:落地筛选+下载页面 |
| #81 | 敏感词检测 + 语气优化 | 🔴 P0 | v0.7.1 开发内容,文本安全过滤,延后1周 |
| #104 | 运行期结构化日志查看页(D) | 🔴 P0 | 排入本期,落地筛选+下载页面 |
| #117 | Neo4j 知识图谱连接修复 | 🔴 P0 | ✅ 已完成,3个测试用例通过 |
### 近期完成 (2026-07-15~16)
| # | 任务 | 说明 | 完成日期 |
|---|---|---|---|
| #117 | Neo4j 知识图谱连接修复 | 修复异步调用+CONTAINS语法,双向模糊匹配,验证通过 | 2026-07-16 |
### P1 重要
| # | 任务 | 说明 |
|---|---|---|
| #105 | 摇人消息推送到通知栏Bug | 🐛 摇人/举手功能系统消息错误推送到企微应用通知,应只在H5页面内展示 |
| #80 | 坐席图片无法预览 | 企微图片无法预览,Issue #80,已实现后端下载+WebSocket推送+nginx代理,待排查保存/推送/显示链路 |
| #73 | 修后端文件未真正覆盖 | `yes | cp -f` 路径 |
| #86 | 排查流程图零依赖部分 review | 把 Mermaid 流程图从代码里剥离 |
| #88 | 管理后台 RBAC 角色权限 | 细粒度角色权限 |
| #75 | 头像同步功能完善 | 登录强制同步 + 前端首字降级 |
### 等用户决策(阻塞项)
| # | 事项 | 说明 |
|---|---|---|
| - | 企微会议室Secret | 会议室预定系统依赖,延后 |
| - | ITSM API授权 | 工单系统集成依赖,延后 |
| - | 联软网络不通 | 生产服务器无法访问联软192.168.0.53:3098,暂不处理 |
### P1/P2 功能开发任务
@@ -148,6 +173,9 @@
## 五、最近搞定
### 2026-07-16
- ✅ Neo4j 知识图谱连接修复(#117)— 修复异步调用未await + CONTAINS语法错误 + 双向模糊匹配,3测试用例通过(打印机驱动/网络连不上/邮箱无法收发)
### 2026-07-13
- ✅ H5 v4 人工坐席交互改造 + 部署(#116)— 文案统一/按钮重定位/删CallAgentModal/截图提示改版/DB同步
- ✅ 服务器部署路径修正 — 确认 `/opt/wecom-it-desk/` 项目根路径,所有前端 dist 为 ro bind mount
@@ -275,6 +303,9 @@ curl http://localhost:8000/api/dev/health
| 版本 | 日期 | 变更 |
|------|------|------|
| v2.8 | 2026-07-14 | 巡检更新:#91忘记密码功能已取消,移出进行中区 |
| v2.7 | 2026-07-14 | 巡检更新:#75头像测试通过移除P1;火绒AccessKey已恢复;等用户决策区块移除火绒AccessKey |
| v2.6 | 2026-07-14 | 巡检更新:#48/#107/#88 确认已完成从看板移除;#81 延后1周;#104 排入本期;新增等用户决策区块(含会议室Secret/ITSM API/联软网络/火绒AccessKey |
| v2.5 | 2026-07-13 | 新增 v0.7.3 版本(AI对话链路Phase1-6/上下文感知诊断/坐席布局v2.0/知识库迭代3/H5 v4),新增 #116#59-69 完成任务,更新最近搞定 |
| v2.4 | 2026-07-10 | 新增 #113-115 审批流程系统任务(类型扩展+卡片导航+免登录研究),P2功能表新增审批流程系统 |
| v2.3 | 2026-07-10 | 新增 #111-112 头像显示与布局调整任务 |
@@ -1,6 +1,6 @@
# 优先级最高卡点任务说明书
> **版本**: v1.2 | **日期**: 2026-07-04 | **状态**: 🔴 进行中
> **版本**: v1.3 | **日期**: 2026-07-14 | **状态**: 🔴 进行中
---
@@ -68,14 +68,15 @@
---
### 任务 1: 坐席/管理端登录验证(🔴 最优先)
### 任务 1: 坐席/管理端登录验证(🔴 最优先)→ ✅ 已完成
| 项目 | 内容 |
|------|------|
| **ID** | #90 |
| **优先级** | 🔴 P0 |
| **当前状态** | 🔧 开发中 |
| **功能描述** | 坐席/管理端浏览器直接登录,支持账号密码+OTP认证 |
| **当前状态** | ✅ 已完成 |
| **功能描述** | 坐席/管理端浏览器直接登录,v0.7.0/0.7.1 已上线企微SSO认证 |
| **说明** | 密码登录已取消,统一使用企微SSO |
#### 输入项来源
- **产品需求**: PRD v1.5 §4.5 登录流程
@@ -119,23 +120,19 @@
## ⏸️ 延后任务(暂不处理)
### 延后 1: IP 白名单收窄
### 延后 1: ~~IP 白名单收窄~~ → ✅ 已完成
| 项目 | 内容 |
|------|------|
| **ID** | #48 |
| **优先级** | 🔴 P0 → ⏸️ 延后 |
| **优先级** | 🔴 P0 → ✅ 已完成 |
| **原因** | 需网络组确认真实代理 IP 段(WAF/堡垒机/CDN 出口 IP |
| **状态** | 延后,待网络组确认后重启 |
#### 输入项来源
- **产品需求**: 安全合规要求
- **技术架构**: nginx 配置
| **状态** | 2026-07-14 检测确认:nginx.conf 已配置精确内网网段(10.0.0.0/8等),非0.0.0.0/0 |
#### 完成标准
- [ ] 网络组确认IP段
- [ ] nginx配置更新
- [ ] 验证通过
- [x] 网络组确认IP段
- [x] nginx配置更新
- [x] 验证通过
---
@@ -144,9 +141,9 @@
| 项目 | 内容 |
|------|------|
| **ID** | #81 |
| **优先级** | 🔴 P0 → ⏸️ 延后 |
| **原因** | 需确认企业敏感词库来源 |
| **状态** | 延后,待确认词库来源后重启 |
| **优先级** | 🔴 P0 → ⏸️ 延后1周 |
| **原因** | 需确认企业敏感词库来源;隐私正则已上线,语气优化待定 |
| **状态** | 延后1周,待确认词库来源后重启 |
#### 输入项来源
- **产品需求**: PRD 安全要求
@@ -180,10 +177,11 @@
| 任务 | 优先级 | 状态 | 输入来源 |
|------|--------|------|----------|
| 登录流程验证 | 🔴 P0 | 进行中 | PRD v1.5、原型设计、项目看板 |
| IP 白名单 | 🔴 P0 | 延后 | 安全合规、技术架构 |
| 敏感词检测 | 🔴 P0 | 延后 | PRD 安全要求 |
| 登录流程验证 | 🔴 P0 | ✅ 已完成(企微SSO | PRD v1.5、原型设计、项目看板 |
| IP 白名单 | 🔴 P0 | ✅ 已完成 | 安全合规、技术架构 |
| 敏感词检测 | 🔴 P0 | 延后1周 | PRD 安全要求 |
| 部署脚本优化 | 🟠 P1 | 延后 | 技术架构 |
| 忘记密码-扫码重置 | 🟠 P1 | ❌ 已取消(密码已取消) | - |
---
@@ -213,6 +211,7 @@
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-14 | v1.3更新:#48/#90标记完成#91取消#81延后1周 | Duckula |
| 2026-07-04 | 创建任务说明书 | Claude |
| 2026-07-04 | 添加需求变更说明 | Claude |
| 2026-07-04 | 添加模板化字段 | Claude |
@@ -0,0 +1,119 @@
# 任务说明书 - Neo4j 连接修复
> **版本**: v1.0 | **日期**: 2026-07-16
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | Neo4j 知识图谱连接修复 |
| **任务ID** | #117 |
| **优先级** | 🔴P0 |
| **类型** | Bug修复 |
| **状态** | ✅ 已完成 |
| **负责人** | Duckula |
| **创建日期** | 2026-07-15 |
| **计划完成日期** | 2026-07-16 |
---
## 📥 输入项来源
### 技术架构
| 来源文档 | 相关章节 | 说明 |
|----------|----------|------|
| `03-技术架构/02-技术方案/Neo4j图数据库方案.md` | §1 | 知识图谱技术方案 |
### 项目看板
| 来源 | 任务名 | 说明 |
|------|--------|------|
| 项目管理主文档 | Neo4j连接 | 用户反馈知识图谱功能不可用 |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `backend/app/services/neo4j_client.py` | 代码 | 修复 CONTAINS 语法错误 |
| 2 | `backend/app/services/graph_query_service.py` | 代码 | 改为异步函数 |
| 3 | `backend/app/tasks/h5_ai_task.py` | 代码 | 添加 await 调用 |
| 4 | 服务器部署验证 | 验证 | 3个测试用例全部通过 |
### 代码要求
- 遵循项目代码规范
- 所有新增代码通过 Pylint 检查
### 文档要求
- 更新 `.workbuddy/memory/` 工作日志
---
## 🔧 验证方式
### 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 打印机驱动查询 | H5发送"打印机驱动" | 返回"打印机驱动安装步骤" |
| 网络问题查询 | H5发送"网络连不上" | 返回"网络诊断步骤" |
| 邮箱问题查询 | H5发送"邮箱无法收发" | 返回"邮箱故障排除" |
---
## ✅ 完成标准
### 验收条件
- [x] 代码已提交
- [x] 功能测试通过
- [x] 文档已更新
### 产出确认
- [x] 代码已部署到生产环境
- [x] 集成测试通过
- [x] 部署验证通过
---
## 📊 工作分解
### 子任务
| 子任务 | 负责人 | 预估工时 | 状态 |
|--------|--------|----------|------|
| 诊断异步调用问题 | Duckula | 1h | ✅ |
| 修复 CONTAINS 语法 | Duckula | 0.5h | ✅ |
| 服务器部署 | Duckula | 0.5h | ✅ |
| 功能验证 | Duckula | 0.5h | ✅ |
---
## 📞 依赖与阻塞
### 阻塞因素
| 阻塞项 | 影响范围 | 解决方案 |
|--------|----------|-----------|
| Neo4j 容器运行中 | 无 | - |
| Dify API 恢复 | 无 | 等待恢复后验证 |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 | 说明 |
|------|----------|--------|------|
| 2026-07-15 | 创建任务 | Duckula | 初始版本 |
| 2026-07-15 | 修复异步调用问题 | Duckula | get_neo4j_client() 添加 await |
| 2026-07-15 | 修复 CONTAINS 语法 | Duckula | 改为正确的 Neo4j 语法 |
| 2026-07-16 | 验证通过 | Duckula | 3个测试用例全部通过 |
---
## 📎 附件
- 详细修复记录:`.workbuddy/memory/2026-07-16-Neo4j修复记录.md`
@@ -0,0 +1,159 @@
# 任务说明书 - 零信任VPN账号申请卡片免登录修复
> **版本**: v2.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | 零信任VPN账号申请卡片免登录修复 |
| **任务ID** | #76 |
| **优先级** | 🟠P1 |
| **类型** | Bug修复 |
| **状态** | ✅ 已完成(保留扫码登录作为人机校验) |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-17 |
---
## 📥 输入项来源
### 产品需求
| 来源文档 | 相关章节 | 说明 |
|----------|----------|------|
| `02-产品需求/02-产品需求文档PRD-v1.2-20260704.md` | §3.2 智能推荐卡片 | 员工通过AI推荐卡片直接跳转到ITSM审批 |
| `02-产品需求/dify_main_chat_prompt_v1.md` | - | Dify返回的approval_type为中文分类名"账号权限申请" |
### 技术架构
| 来源文档 | 相关章节 | 说明 |
|----------|----------|------|
| 本次用户提供的认证配置信息 | - | 一站式运维平台的OAuth2.0配置域名 |
### 用户提供的认证配置信息
| 配置项 | 域名 |
|--------|------|
| 应用主页域名 | itsm.servyou.com.cn |
| OAuth2.0网页授权回调域名 | biz.17win.com |
| JS-SDK可信域名 | itsm.shuiyou.com.cn |
| 跳转小程序可信域名 | itsm.shuiyou.com.cn |
| Web网页扫码登录回调域名 | devops.dc.servyou-it.com |
**关键发现**
1.`itsm.servyou.com.cn`(企微应用主页)打开时,可实现免登录认证。
2. **重要约束**`itsm.servyou.com.cn` 是移动端 SPA`/itsm-miniapp-mobile/`),服务器**未配置 SPA fallback**,所有子路由(如 `/pages/login/index``/createTicket/:name`)直接 URL 访问均返回 404。仅应用首页 `/itsm-miniapp-mobile/` 返回 200 且免登录。
3. 因此**无法深链到具体工单创建表单**,卡片只能落到 ITSM 移动端首页(免登录),由用户点选创建工单。
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | 后端修改 | 代码 | 修改 `approval.py` 中ITSM跳转URL域名 |
| 2 | 前端修改 | 代码 | 修改 `RecommendCard.vue` 中URL映射 |
| 3 | 部署验证 | 验证 | 企微H5实际测试通过 |
### 代码要求
- 遵循项目代码规范
---
## 🔧 验证方式
### 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 跳转URL域名变更 | 代码检查 | URL从devops改为itsm.servyou.com.cn |
| 按钮点击跳转 | 企微H5实际测试 | 点击按钮直接跳转ITSM工单页面 |
| 免登录验证 | 跳转后检查 | 无需扫码直接显示ITSM工单创建表单 |
---
## ✅ 完成标准
### 验收条件
- [x] 问题分析完成
- [x] 代码修改完成
- [x] 部署验证通过
- [x] 用户测试通过(扫码登录保留为人机校验,用户确认接受)
### 产出确认
- [x] 代码已提交
- [x] 部署验证已完成
- [x] 任务说明书已更新
---
## 📊 工作分解
### 子任务
| 子任务 | 负责人 | 预估工时 | 状态 |
|--------|--------|----------|------|
| 修改后端approval.py中ITSM URL域名 | 宋献 | 0.5h | ✅ 已完成 |
| 修改前端RecommendCard.vue中URL映射 | 宋献 | 0.5h | ✅ 已完成 |
| 部署验证 | 宋献 | 0.5h | ✅ 已完成 |
| 用户测试确认 | 宋献 | 0.5h | ✅ 已完成 |
---
## 📞 依赖与阻塞
### 前置依赖
| 依赖任务 | 依赖说明 | 状态 |
|----------|----------|------|
| 无 | 独立任务 | - |
### 阻塞因素
| 阻塞项 | 影响范围 | 解决方案 |
|--------|----------|----------|
| 无 | - | - |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 | 说明 |
|------|----------|--------|------|
| 2026-07-17 | 创建任务 | 宋献 | 初始版本v1.0 |
| 2026-07-17 | 更新方案 | 宋献 | v2.0:改用itsm.servyou.com.cn域名实现免登录 |
| 2026-07-17 | 终态决策 | 宋献 | v3.0:保留桥接页现状,扫码登录定为人机校验;技术限制同步写入 PRD §v2.3 与架构 §15.4.9 |
---
## 📎 附件
### 修复方案说明
**问题现象**:用户点击零信任VPN账号申请卡片后,跳转到 Web ITSM 工单深链需要扫码登录(非免登录)。
**演进过程**
| 版本 | 方案 | 结果 |
|------|------|------|
| v1.0(初版) | 深链直跳 `devops.dc.servyou-it.com/ITSM/...` | ❌ 弹扫码 |
| v2.0(回退) | 统一改为 ITSM 移动端首页 `https://itsm.servyou.com.cn/itsm-miniapp-mobile/`(免登录,但需手动点选工单,不符合"一步直达") | ⚠️ 免登录但需二次点击 |
| v2.1(再试) | 改回 Web 工单深链 `createTicket?name=XXX` 一步直达 | ❌ 仍弹扫码 |
| v2.2(桥接) | 新增桥接页 `itsm-bridge.html`(隐式加载首页预热会话 + 2.5s 自动跳深链),3 个源文件 31 处 URL 改为桥接页 | ❌ 企微内实测仍弹扫码(跨域 iframe 预热被 ITSM 拒绝) |
| v3.0(终态决策) | **保持桥接页现状**,将扫码登录定为人机校验(Human-Machine Verification),企业安全合规可接受,不视为缺陷 | ✅ 已决策 |
**根因**Web ITSM 不支持静默企微 OAuth;移动端首页静默 OAuth 仅在其自身域 (`itsm.servyou.com.cn`) 生效;跨域 iframe 预热被拒。三步流缺一环即冷 hit 弹扫码。
**修改文件(v2.2**
| 文件 | 说明 |
|------|------|
| `frontend-h5/public/itsm-bridge.html` | 新增桥接页(静态资源) |
| `backend/app/api/approval.py` | 8 个运维平台模板 URL → 桥接页 |
| `frontend-h5/src/components/assistant/RecommendCard.vue` | 15 处 URL → 桥接页 |
| `frontend-h5/src/components/chat/ApprovalCardModal.vue` | 8 处 URL → 桥接页 |
**未改动(2 个企微审批模板)**IT资产领用 (asset_receive)、IT资产借用 (asset_borrow) 属企微审批流程,非 ITSM,不在本改造范围,按 `approval_templates.json` 数据源定义保持。
**部署验证**:桥接页经 nginx `curl``HTTP/1.1 200 OK`;部署的 `approval.py` 含桥接 URL 8 处;H5 构建 JS 含桥接 URL;两个 tar 包远端 MD5 与本地完全一致;5 容器全 healthy。技术限制已写入 PRD §v2.3 与架构文档 §15.4.9。
@@ -0,0 +1,111 @@
# 任务说明书 — P0-1 生产 workers=2 改回 1(修复 WS 推送丢 50%)
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | P0-1 生产 backend workers=2 改回 1,恢复 WS 单 worker 铁律 |
| **任务ID** | #78 |
| **优先级** | 🔴 P0 |
| **类型** | 部署优化 / Bug修复 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-18 |
---
## 📥 输入项来源
### 问题证据
| 来源 | 说明 |
|------|------|
| `docker-compose.yml` | 主文件已 `--workers 1` ✅ |
| `docker-compose-override.yml:4` | **覆盖为 `--workers 2` ❌**compose 自动合并 override |
| `deploy-server/docker-compose.yml:115` | `--workers 2` ❌ |
| `deploy-server/docker-compose-green.yml:46` | `--workers 2` ❌ |
| `backend/app/tasks/h5_ai_task.py:10-14` | 头注释自述:ws_manager 进程内单例,多 worker 时 broadcast 静默丢失约 50% |
### 技术文档
| 来源文档 | 相关章节 | 说明 |
|----------|----------|------|
| `docs/12-重构记录/00-v4.0重构总方案.md` | §三 批次 1 P0-1 | 方案出处 |
| `docs/12-重构记录/01-问题验证清单.md` | C2 | 问题证据 |
| `docs/09-部署运维/DEPLOY-GUIDE.md` | §4.3 铁律 1 | 部署铁律 |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `docker-compose-override.yml` | 配置 | **删除整个文件**(或改 `--workers 1`),推荐删除 |
| 2 | `deploy-server/docker-compose.yml` | 配置 | L115 `--workers 2``--workers 1` |
| 3 | `deploy-server/docker-compose-green.yml` | 配置 | L46 `--workers 2``--workers 1` |
| 4 | `backend/app/main.py` | 代码 | lifespan 启动日志打印醒目提示「WS 推送要求单 worker」+ `/health` 响应暴露 `pid` |
### 代码要求
- 仅配置变更 + main.py 增加 2 行日志,零业务逻辑变更
- 服务器部署用 jms_ops.py 上传 compose 文件后 `docker compose up -d backend`
### 文档要求
- 更新 `docs/12-重构记录/README.md` §三 状态看板(#78 → 已完成)
- 填写 `docs/12-重构记录/02-批次1-P0执行记录.md`
---
## 🔧 验证方式
### 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| compose 合并后 workers | 服务器执行 `docker compose -f docker-compose.yml -f docker-compose-override.yml config 2>/dev/null \| grep workers`(或仅主文件 config) | 输出 `workers: 1``--workers 1` |
| 容器进程数 | `docker exec wecom_it_backend ps aux \| grep uvicorn` | 仅 1 个 worker 进程 |
| WS 到达率 | H5 + 坐席端各发 10 条消息 | AI 回复 100% 到达(20/20 |
| /health 暴露 pid | `curl https://itsupport.servyou.com.cn/api/health` | 响应含 `pid` 字段 |
---
## ✅ 完成标准
- [ ] override 文件已删除(或 workers=1),deploy-server 两份已改
- [ ] 服务器 backend 重启,`docker compose config` 验证 workers=1
- [ ] 双端 20 条消息全部到达
- [ ] 状态看板已更新
---
## 📊 工作分解
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| 本地修改 override + deploy-server 两份 compose | 15min | ⬜ |
| 上传服务器 + 重启 backend + config 验证 | 20min | ⬜ |
| main.py 增加启动提示 + /health pid | 15min | ⬜ |
| 双端 20 条消息到达率验证 | 20min | ⬜ |
---
## 📞 依赖与阻塞
| 依赖 | 说明 | 状态 |
|------|------|------|
| 无 | 独立任务,可最先执行 | — |
**停机影响**backend 重启约 3-5 秒,WS 断连自动重连,无感知。
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,106 @@
# 任务说明书 — P0-2 DIFY_NATIVE_* 生产配置(修复 v2.1 原生直连未上线)
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | P0-2 DIFY_NATIVE_BASE_URL/API_KEY 生产环境配置,启用 Dify 原生直连 |
| **任务ID** | #79 |
| **优先级** | 🔴 P0 |
| **类型** | 部署优化 / Bug修复 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-18 |
---
## 📥 输入项来源
### 问题证据
| 来源 | 说明 |
|------|------|
| `backend/app/config.py:121-122` | 有 `dify_native_base_url`/`dify_native_api_key` 字段定义 |
| `docker-compose.yml` backend environment | **未传递这 2 个变量** → 容器内为空 → `_call_dify_native()` 永远返回 None → 永远走有 [object Object] bug 的 dify2openai 代理 |
| `.env.production` / `deploy-server/.env.production` / `backend/.env.example` | 均无此 2 项 |
| `.env.production:59-60` | **错误**:把原生格式(/v1 + 裸 app key)错填进 proxy 变量(DIFY_API_URL/KEY),与 deploy-server 正确 proxy 格式矛盾 |
### 历史事故
- 2026-07-13 两次因环境变量未声明导致 P0 故障([object Object]、扫码登录崩溃)
### 技术文档
| 来源文档 | 说明 |
|----------|------|
| `docs/12-重构记录/01-问题验证清单.md` | C1 |
| `docs/09-部署运维/DEPLOY-GUIDE.md` | §4.3 铁律 2environment 显式声明) |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `docker-compose.yml` | 配置 | backend environment 新增 `DIFY_NATIVE_BASE_URL=${DIFY_NATIVE_BASE_URL:-}``DIFY_NATIVE_API_KEY=${DIFY_NATIVE_API_KEY:-}` |
| 2 | `.env.production` | 配置 | 填入 `DIFY_NATIVE_BASE_URL=http://yw-dify.dc.servyou-it.com``DIFY_NATIVE_API_KEY=app-7jkRkAzvX4QM9v9SM3P8mMEO`;修正 DIFY_API_URL/KEY 为 proxy 正确格式(与 deploy-server 对齐) |
| 3 | `backend/.env.example`、根 `.env.example` | 配置 | 补 2 项及注释 |
| 4 | 部署验证 | 验证 | 容器内 `env \| grep DIFY_NATIVE` 非空 + 日志走原生 API |
### 部署命令
```bash
# 修改 environment 后必须 up -drestart 不重载 env!)
docker compose up -d backend
```
---
## 🔧 验证方式
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 容器内变量 | `docker exec wecom_it_backend env \| grep DIFY_NATIVE` | 2 行非空 |
| 调用路径 | 发任意消息,查日志 | 出现「调用 Dify 原生 API」,不再出现「回退到代理路径」 |
| 审批卡片 | 发送"VPN账号申请" | 卡片正常渲染(非 [object Object]、非"AI服务暂时不可用" |
---
## ✅ 完成标准
- [ ] compose environment 已声明 2 项
- [ ] .env.production 已填值且 proxy 变量已修正
- [ ] 容器内变量非空,日志走原生 API
- [ ] 状态看板已更新
---
## 📊 工作分解
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| 本地修改 compose + 3 个 env 文件 | 20min | ⬜ |
| 上传服务器 + `up -d backend` + env 验证 | 15min | ⬜ |
| 发消息验证原生 API 路径 + 审批卡片 | 15min | ⬜ |
---
## 📞 依赖与阻塞
| 依赖 | 说明 | 状态 |
|------|------|------|
| 无 | 独立任务 | — |
**风险**:若原生直连返回格式与代理有细微差异,可能触发 v3.1 关键词降级(已有兜底,安全)。回滚=删除 2 个环境变量重启。
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,147 @@
# 任务说明书 - 坐席端 Ctrl+V 粘贴功能修复
> **版本**: v1.0 | **日期**: 2026-07-15
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | 坐席端 Ctrl+V 粘贴功能不可用 |
| **任务ID** | #79 |
| **优先级** | 🔴P0 |
| **类型** | Bug修复 |
| **状态** | 已完成 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-15 |
| **完成日期** | 2026-07-15 |
---
## 📥 问题描述
### 问题现象
坐席端输入框(ReplyBox.vue / InputBox.vue)无法通过 Ctrl+V 粘贴文本内容。
### 影响范围
- 坐席端所有用户
- 输入框文本粘贴功能完全不可用
- 只能通过手动输入文字
### 问题根因
**ReplyBox.vue (第 785-845 行)**
```javascript
async function handlePaste(event: ClipboardEvent): Promise<void> {
const items = event.clipboardData?.items
if (!items) return // ← 问题:当 items 为空时直接 return,阻止了默认粘贴行为
// ...
}
```
**InputBox.vue (第 454-472 行)**
同样问题,当 `clipboardData.items` 为空时函数直接 return,导致粘贴被阻断。
### 根本原因
`handlePaste` 函数在 `clipboardData` 为空或 `items` 数组长度为 0 时,直接 return 而没有让浏览器执行默认的粘贴行为。导致用户在输入框中按 Ctrl+V 时,粘贴操作被静默阻止。
---
## 🔧 修复方案
### 修复内容
1. **ReplyBox.vue** - 优化 handlePaste 函数逻辑
- 添加 `clipboardData` 为空检查
- 添加 `items.length === 0` 检查
- 确保纯文本粘贴时让浏览器执行默认行为
2. **InputBox.vue** - 同步修复 handlePaste 函数
- 采用相同的防御性编程策略
### 代码变更
**修复前**
```javascript
async function handlePaste(event: ClipboardEvent): Promise<void> {
const items = event.clipboardData?.items
if (!items) return // 问题:阻止了默认粘贴行为
// ...
}
```
**修复后**
```javascript
async function handlePaste(event: ClipboardEvent): Promise<void> {
const clipboardData = event.clipboardData
if (!clipboardData) {
// clipboardData 为空时,不阻止默认行为
return
}
const items = clipboardData.items
if (!items || items.length === 0) {
// items 为空时,允许默认处理
return
}
// 处理文件/图片上传...
// 纯文本不调用 preventDefault,让浏览器执行默认粘贴
}
```
---
## 📤 输出成果
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `frontend-agent/src/components/chat/ReplyBox.vue` | 代码 | 修复 handlePaste 函数 |
| 2 | `frontend-agent/src/components/chat/InputBox.vue` | 代码 | 同步修复 handlePaste 函数 |
| 3 | `frontend-agent/dist/` | 部署包 | 构建产物 |
| 4 | 生产环境 | 部署 | 已部署到 https://itsupport.servyou.com.cn/itagent/ |
---
## 🔧 验证方式
### 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 纯文本粘贴 | 复制一段文字,Ctrl+V 粘贴到输入框 | 文字成功粘贴到输入框 |
| 图片粘贴 | 复制一张图片,Ctrl+V 粘贴 | 图片上传并发送成功 |
| 文件粘贴 | 复制一个文件,Ctrl+V 粘贴 | 文件上传并发送成功 |
| 右键粘贴 | 鼠标右键选择"粘贴" | 文字成功粘贴 |
### 验证环境
- URL: https://itsupport.servyou.com.cn/itagent/
- 浏览器: Chrome / Edge (最新版)
---
## ✅ 完成标准
- [x] 代码已提交
- [x] 构建成功 (agent-dist-v10.tar.gz)
- [x] 部署到生产环境
- [x] Nginx 已重启
- [x] 功能验证通过
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 | 说明 |
|------|----------|--------|------|
| 2026-07-15 | 创建任务 | 宋献 | 初始版本 |
| 2026-07-15 | 代码修复 | 宋献 | 完成 handlePaste 函数修复 |
| 2026-07-15 | 构建部署 | 宋献 | 部署到生产环境 |
---
## 📎 参考文档
- 任务模板: `docs/10-项目管理/任务说明书/任务说明书-模板.md`
- CHANGELOG: `CHANGELOG.md`
- 工作日志: `.workbuddy/memory/2026-07-15.md`
@@ -0,0 +1,104 @@
# 任务说明书:企微图片消息无法预览
> **版本**: v1.0 | **日期**: 2026-07-16
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | 企微图片消息无法预览 |
| **任务ID** | #80 |
| **优先级** | 🟠 P1 |
| **类型** | Bug修复 |
| **状态** | 待处理 |
| **负责人** | Duckula |
| **创建日期** | 2026-07-16 |
| **计划完成日期** | 2026-07-16 |
---
## 📥 输入项来源
### 问题反馈
| 来源 | 说明 |
|------|------|
| 用户反馈 | 用户通过企业微信发送的图片消息,坐席端无法预览也无法打开图片内容 |
### 技术分析
| 来源文档 | 相关章节 | 说明 |
|----------|----------|------|
| `backend/app/api/wecom_callback.py` | §图片消息处理 | 只保存 pic_url 临时URL,未下载到本地 |
| `frontend-agent/src/components/chat/MessageBubble.vue` | §图片渲染 | 使用 media_url 或 extra_data.pic_url |
### 2026-07-16 新增尝试
| # | 方法 | 结果 | 说明 |
|---|------|------|------|
| 1 | 修改上传路径为 `uploads/images`(使用 Docker volume) | 已部署 | 代码已更新到正确路径 |
| 2 | WebSocket 广播添加 `extra_data`(含 local_media_url | 已部署 | 前端已支持接收 |
| 3 | Nginx 配置 `/media/` 代理到后端 `/media/` | 已部署 | 代理链路已配置 |
### 待排查问题
| # | 问题 | 状态 |
|---|----------|------|
| 1 | 图片是否成功保存到 `/app/uploads/images/` | 待验证 |
| 2 | WebSocket 是否正确推送 local_media_url | 待验证 |
| 3 | 前端是否正确显示图片 | 待验证 |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | wecom_service.py 新增 download_media 方法 | 代码 | 下载企微媒体文件到本地 |
| 2 | wecom_callback.py 图片消息处理逻辑 | 代码 | 调用下载方法并保存本地URL |
| 3 | 后端部署验证 | 部署 | 重启后端容器验证功能 |
### 代码要求
- 遵循项目代码规范
- 新增方法添加单元测试
---
## 🔧 验证方式
### 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 企微发送图片 | 通过企微发送图片到IT服务台 | 坐席端可正常预览图片 |
| 图片下载 | 查看后端 media/images/ 目录 | 图片文件已保存 |
| 图片访问 | 点击图片查看大图 | 可正常打开 |
---
## ✅ 完成标准
### 验收条件
- [ ] 代码合入主干分支
- [ ] 企微发送图片功能测试通过
- [ ] 坐席端图片预览正常
---
## 📊 工作分解
### 子任务
| 子任务 | 负责人 | 预估工时 | 状态 |
|--------|--------|----------|------|
| 在 wecom_service.py 添加 download_media 方法 | Duckula | 1h | 待开始 |
| 修改 wecom_callback.py 图片处理逻辑 | Duckula | 1h | 待开始 |
| 部署后端并验证功能 | Duckula | 0.5h | 待开始 |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 | 说明 |
|------|----------|--------|------|
| 2026-07-16 | 创建任务 | Duckula | 初始版本 |
@@ -0,0 +1,87 @@
# 任务说明书:粘贴图片边框问题
> **版本**: v1.0 | **日期**: 2026-07-16
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | 粘贴图片边框问题 |
| **任务ID** | #81 |
| **优先级** | 🟠 P1 |
| **类型** | Bug修复 |
| **状态** | 已完成 |
| **负责人** | Duckula |
| **创建日期** | 2026-07-16 |
| **计划完成日期** | 2026-07-17 |
---
## 📥 输入项来源
### 问题反馈
| 来源 | 说明 |
|------|------|
| 用户反馈 | 坐席端和H5端粘贴图片时,预览区域的边框宽度变窄(减少约2/3) |
### 技术分析
| 来源文档 | 相关章节 | 说明 |
|----------|----------|------|
| `frontend-agent/src/components/chat/PendingImagePreview.vue` | §样式 | 缩略图 border: 1px solid |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | PendingImagePreview.vue CSS修复 | 代码 | 修复边框样式问题 |
| 2 | H5端预览组件检查 | 代码 | 确认H5端是否存在同样问题 |
| 3 | 前端部署验证 | 部署 | 构建部署验证 |
### 代码要求
- 遵循项目代码规范
---
## 🔧 验证方式
### 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 坐席端粘贴图片 | 在输入框粘贴图片 | 预览边框正常显示 |
| H5端粘贴图片 | 在H5输入框粘贴图片 | 预览边框正常显示 |
---
## ✅ 完成标准
### 验收条件
- [ ] 代码合入主干分支
- [ ] 坐席端粘贴图片边框测试通过
- [ ] H5端粘贴图片边框测试通过
---
## 📊 工作分解
### 子任务
| 子任务 | 负责人 | 预估工时 | 状态 |
|--------|--------|----------|------|
| 排查 PendingImagePreview.vue 边框样式 | Duckula | 0.5h | 待开始 |
| 检查H5端预览组件 | Duckula | 0.5h | 待开始 |
| 修复边框CSS并部署验证 | Duckula | 1h | 待开始 |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 | 说明 |
|------|----------|--------|------|
| 2026-07-16 | 创建任务 | Duckula | 初始版本 |
@@ -0,0 +1,141 @@
# 任务说明书:H5右侧栏布局调整
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | H5右侧栏布局调整 |
| **任务ID** | #82 |
| **优先级** | 🟡 P2 |
| **类型** | 功能开发 |
| **状态** | ✅ 已完成 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-17 |
---
## 📥 输入项来源
### 产品需求
| 来源文档 | 相关章节 | 说明 |
|----------|----------|------|
| `04-原型设计/prototypes-原型图/H5用户端原型图实现概览.md` | §右侧面板 | 现有右侧栏设计 |
| 本需求 | 原型图v3 | 调整后的布局要求 |
### 原型设计
| 来源文档 | 页面 | 说明 |
|----------|------|------|
| 会话页面右侧面板 | 右侧栏 | 新布局原型图 |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `frontend-h5/src/components/assistant/RightPanel.vue` | 代码 | 调整布局结构 |
| 2 | `frontend-h5/src/components/assistant/DynamicRecommend.vue` | 代码 | 移除分类标签,仅用颜色区分 |
| 3 | `frontend-h5/src/components/assistant/QueueWaiting.vue` | 代码 | 压缩高度,新增答题开关 |
| 4 | 部署验证 | 部署测试 | H5构建并部署到测试环境 |
### 代码要求
- 遵循项目代码规范
- 所有新增代码通过 ESLint 检查
---
## 🔧 验证方式
### 功能验证
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 智能推荐区域显示正常 | 浏览器访问H5 | 3张推荐卡片显示,颜色边框正确 |
| 自助诊断标题样式统一 | 浏览器访问H5 | 与设备信息、智能推荐标题样式一致 |
| 排队卡片高度压缩 | 浏览器访问H5 | 高度约为原来50% |
| 答题开关功能 | 点击答题挑战按钮 | 答题区域展开/折叠 |
| 答题默认不显示 | 刷新H5页面 | 答题区域默认折叠,不显示 |
| 无重复答题内容 | 点击答题挑战按钮 | 答题区域只显示一次,无重复 |
| 平台统计已移除 | 浏览器访问H5 | 四宫格统计不显示 |
---
## ✅ 完成标准
### 验收条件
- [x] 代码已提交
- [x] H5构建成功
- [x] 部署到测试环境
- [x] 功能验证通过
- [x] Bug修复验证通过(答题默认不显示、无重复内容)
---
## 📊 工作分解
### 子任务
| 子任务 | 负责人 | 预估工时 | 状态 |
|--------|--------|----------|------|
| 调整RightPanel.vue布局结构 | 宋献 | 1h | ✅ 已完成 |
| 修改DynamicRecommend.vue移除分类标签 | 宋献 | 0.5h | ✅ 已完成 |
| 修改QueueWaiting.vue压缩高度+答题开关 | 宋献 | 1h | ✅ 已完成 |
| 构建并部署H5 | 宋献 | 0.5h | ✅ 已完成 |
| 功能验证 | 宋献 | 0.5h | ✅ 已完成 |
| Bug修复:答题默认显示+重复内容 | 宋献 | 0.5h | ✅ 已完成 |
---
## 📞 依赖与阻塞
### 前置依赖
| 依赖任务 | 依赖说明 | 状态 |
|----------|----------|------|
| 无 | 独立任务 | - |
### 阻塞因素
| 阻塞项 | 影响范围 | 解决方案 |
|--------|----------|-----------|
| 无 | - | - |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 | 说明 |
|------|----------|--------|------|
| 2026-07-17 | 创建任务 | 宋献 | 初始版本 |
| 2026-07-17 | Bug修复 | 宋献 | 修复答题默认显示、重复内容问题;按钮改名"答题挑战" |
| 2026-07-17 | 任务完成 | 宋献 | 功能开发 + Bug修复已完成并部署 |
---
## 📎 调整需求说明
### 需求概述
调整 H5 员工端右侧栏布局和功能:
1. **智能推荐位置调整**
- 标题位于自助诊断下方
- 保持一直显示状态
- 预留2-3张卡片高度
2. **推荐内容分区调整**
- 取消 L1/L2/L3 分区标题显示(相关推荐/运维提醒/常用资源)
- 颜色边框保留(绿/橙/灰)
- 无分类标签
3. **排队卡片压缩**
- 高度压缩50%
- 取消平台实时统计(四宫格)
- 保留:排队位置、前面人数、预计等待时间、积分等级
4. **答题功能**
- 答题开关放在排队卡片标题栏右侧
- 点击才展开答题区域,默认折叠
@@ -0,0 +1,93 @@
# 任务说明书 — 批次 2(P1 基础:真单例 / 统一 Dify 调用点 / Matcher 修复 / 配置治理)
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | v4.0 批次 2:P1 基础重构(5 个子项) |
| **任务ID** | #84 |
| **优先级** | 🟠 P1 |
| **类型** | 架构重构 / 安全加固 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-22 |
| **预估工时** | 3 天 |
---
## 📥 输入项来源
| 来源文档 | 相关章节 |
|----------|----------|
| `docs/12-重构记录/00-v4.0重构总方案.md` | §三 批次 2 |
| `docs/12-重构记录/01-问题验证清单.md` | B3/B4/B5/B9/C3/C4/C5/C6 |
---
## 📤 输出成果要求(5 个子项)
### P1-1 AIService/AIHandler 真单例(0.5d
- **问题**`dependencies/__init__.py:98-106` 每次调用新建 AIHandler+AIService+2 个 httpx 连接池,从不 close → 连接泄漏
- **方案**:模块级懒加载单例 `_shared_ai_handler``cleanup_shared_services()``await handler.ai_service.close()`
- **验证**:连续 50 次请求后容器 ESTABLISHED 连接数稳定;shutdown 无 `Unclosed client session`
### P1-2 统一 Dify 调用点(2d
- **问题**:同一 Dify 原生调用代码复制 3 遍(approval.py:999 死、routing_service.py:120 活、byod.py:243 死)
- **方案**
1. `ai_service.py` 新增通用 `chat_native(query, user_id, timeout)`
2. **删除死链路**`POST /approval/detect-intent` 端点(approval.py:1060+ `_call_dify_approval_intent``POST /byod/detect-intent` 端点(byod.py:348+ `_call_dify_byod_intent`
3. `routing_service.detect_routing_intent` 改调 `chat_native`D1 合并前过渡)
- **验证**`grep -rn "httpx.AsyncClient" backend/app/api/` 零命中;`POST /api/approval/detect-intent` 返回 404
### P1-4 ApprovalMatcher 死分支 + 失败兜底(0.5d
- **问题**`approval_matcher.py:66-69` 优先级 5 死分支;匹配失败仅 warning → 前端空白(B4
- **方案**:删除死分支;`match_and_build_card` 末路返回 `get_all_categories()` 全量卡片(不再返回 None
- **验证**mock 未知 approval_type → 前端仍渲染全量卡片
### P1-7 配置治理 + 潜伏 bug2d
- a. compose 增加 `APP_ENV=${APP_ENV:-production}`(修复生产 UA 校验/IP 白名单不生效)
- b. **Redis 密码轮换**(已进 git 历史):compose 改 `${REDIS_PASSWORD}` 引用 + 新密码;**低峰期执行(22:00 后),停机 30-60s,用户需重新登录,新旧密码双备**
- c. os.getenv 旁路收敛入 Settings`is_dev_mode` 属性统一
- d. 3 个潜伏 bug 修复:`main.py` 定义 `app_root`;删除 `tasks/scheduler.py`(拼写错误+零导入死文件);`config.py` 顶部补 `logger = logging.getLogger(__name__)`
- **验证**`/version` 返回真实 git hash;非法 AUTOMATION_THRESHOLDS 不抛 NameError;非白名单 IP 访问 admin 返回 4004
### P1-6 dynamic_recommend 死逻辑清理(0.5d
- **问题**`h5_ai_task.py:528-582` 分支条件保证 approval_type 必为 None,整段模板匹配恒空
- **方案**:删除死逻辑,recommend_data 取 `action["url"]`(已由 matcher 注入)
---
## 🔧 验收标准
- [ ] httpx 连接数稳定,无泄漏
- [ ] Dify 调用点唯一(grep 验证)
- [ ] detect-intent ×2 返回 404
- [ ] 未知 approval_type 仍渲染全量卡片
- [ ] APP_ENV=production 生效
- [ ] Redis 密码已轮换,新旧双备可用
- [ ] /version 返回真实 git hash
- [ ] pytest 全绿
---
## 📞 依赖与阻塞
| 依赖 | 说明 |
|------|------|
| 批次 1 完成(#78-83 | P1-2 依赖 P0-2 的 DIFY_NATIVE 配置 |
| Redis 密码轮换窗口 | 需提前通知用户重新登录,选 22:00 后 |
**文档同步**:架构文档 v2 §15.4.5 重写(v3.0 纯渲染架构);填写 `docs/12-重构记录/03-批次2-P1基础执行记录.md`
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,88 @@
# 任务说明书 — 批次 3(P1 核心:编排层管线化 + WS 路由清理)
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | v4.0 批次 3:P1 核心重构(编排层管线化 + D1 意图合并 + WS 死路由清理) |
| **任务ID** | #85 |
| **优先级** | 🟠 P1 |
| **类型** | 架构重构 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-26 |
| **预估工时** | 4 天 |
| **风险等级** | 🔴 高(改动主流程,上线后观察 24h) |
---
## 📥 输入项来源
| 来源文档 | 相关章节 |
|----------|----------|
| `docs/12-重构记录/00-v4.0重构总方案.md` | §三 批次 3、D1 决策 |
| `docs/12-重构记录/01-问题验证清单.md` | B6/B7/F4/F5 |
---
## 📤 输出成果要求(2 个子项)
### P1-3 编排层管线化重构(3d,核心)
**问题**`process_h5_ai_reply()`h5_ai_task.py:996-1307)主函数 11 对 try/except、最深 4 层缩进、全文 26 对;路由 detect 与主 Dify 串行叠加最坏 45sB6
**方案**
1. **D1 激进合并**(用户已决策):
- `ai_service.get_structured_reply()` 扩展解析 `intent_type/business_category/routing_confidence`(同一 Dify 应用同一 key,已验证)
- 编排层在主调用返回后做路由后处理:`intent_type=='non_it_routing' 且 confidence≥阈值` → 走 `send_contact_card`
- 删除编排层对 `detect_routing_intent` 的串行调用
- **风险兜底**:实施前先用 5 条真实消息验证 Dify 稳定输出 intent 字段;不稳定则退回方案 B(detect 与主调用 `asyncio.gather` 并行,仍 30s 总预算收口)
2. **管线化**:主流程拆为步骤函数,每步返回 `Handled | Continue`
`load_conversation → enrich_content → fast_lane → byod_intercept → graph_lookup → ai_inference → post_process`
步骤级 try/except 收拢到管线执行器一处;**主函数目标 < 100 行、try/except ≤ 3 对**
3. v3.0/v3.1 两处关键词兜底块(h5_ai_task.py:1205-1241、1252-1272)合并为单一 `keyword_fallback(content)`
**验证**:路由消息端到端 < 35s(合并后应 ~主调用耗时);pytest 编排管线用例;radon cc 复杂度显著下降
### P1-5 WS 死路由清理 + 审批卡片渲染点收敛(1d)
**问题**:前端 `useH5WebSocket.ts` 3 种死路由(ai_reply_chunk/pending_close_request/quiz_diagnostic_answer);ApprovalCardModal 3 处渲染点(MessageBubble L19/82/103),L82 已死
**方案**
1. 删除 3 个死 case 及 store 对应 handler
2. 删除 MessageBubble L82 text 分支卡片渲染;保留 L19approval_card#80 后快捷申请真实使用)与 L103ai_structured 内嵌)
**验证**:grep 无死路由残留;三种审批卡片场景(AI 命中/关键词兜底/快捷申请)均正常渲染
---
## 🔧 验收标准 + 24h 观察指标
- [ ] `process_h5_ai_reply` < 100 行,try/except ≤ 3 对
- [ ] 路由消息端到端 < 35s
- [ ] **上线后观察 24h**:AI 回复到达率 ≥99%、平均响应 ≤20s、转人工率不升
- [ ] 异常时回滚至批次 2 状态
---
## 📞 依赖与阻塞
| 依赖 | 说明 |
|------|------|
| 批次 2 完成(#84) | D1 合并依赖统一 Dify 调用点(P1-2) |
| #80/#82 已上线 | P1-5 渲染点收敛依赖 P0-3/P0-5 已生效 |
**文档同步**:架构文档新增「智能回复链路 v4」章节(分层架构图);填写 `docs/12-重构记录/04-批次3-P1核心执行记录.md`
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,86 @@
# 任务说明书 — 批次 4(P2:死代码大扫除 / triage 删除 / 测试补齐)
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | v4.0 批次 4P2 收尾(死代码清理 + triage 删除 + 测试 + store 拆分) |
| **任务ID** | #86 |
| **优先级** | 🟡 P2 |
| **类型** | 代码清理 / 测试补齐 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 按需排期 |
| **预估工时** | 5 天 |
---
## 📥 输入项来源
| 来源文档 | 相关章节 |
|----------|----------|
| `docs/12-重构记录/00-v4.0重构总方案.md` | §三 批次 4 |
| `docs/12-重构记录/01-问题验证清单.md` | B8/F6 + §四 已完成清单 |
---
## 📤 输出成果要求(5 个子项)
### P2-1 死代码大扫除(1d
**删除清单**(均已验证零引用):
- `ai_service.py::get_reply_stream`:232-327
- 3 个 .bak 文件:`approval.py.bak_bridge_*``RecommendCard.vue.bak_bridge_*``ApprovalCardModal.vue.bak_bridge_*`
- 前端死 API`conversation.ts``detectApprovalIntent`(:430)/`detectByodIntent`(:486)
- `frontend-h5/src/components/chat/MessageItem.vue`(孤儿组件,最后 grep 确认)
- store 死状态:`approvalCardVisible`/`approvalCardTriggerText`/`closeApprovalCard`
- 前端构建产物入库目录:`dist.old/``dist_bak*/``dist-clean/` 等 + 补 `.gitignore`
### P2-2 triage 分诊链路整体删除(1d,用户已确认)
- 删除:`dify_triage_service.py``api/triage.py`、router.py:414-418 挂载、`config.py` dify_triage_* 三项
- 前端:`api/triage.ts``composables/useTriage.ts``components/TriageCard.vue`
- 保留:`triage_service.py``URGENCY_HIGH_KEYWORDS/RESOLVE_KEYWORDS` 关键词常量(被 h5.py/closing_service 引用)
- 测试:`tests/test_triage.py` 相应用例删除
### P2-3 前端 store 拆分(2d
- `conversation.ts`1700+ 行)拆 composables`useWsHandlers``useApprovalCard``useRecommend``useParticipants`
### P2-4 测试补齐(2d
- ApprovalMatcher 全优先级单测
- 编排管线步骤单测(mock 推理层)
- WS payload 契约测试(后端 build_message_ws_payload ↔ 前端 Message 类型 diff 校验)
- 前端 handleNewMessage 组件测试
### P2-5 审批回调 TODO 收口(0.5d
- `approval.py:889` TODO:与产品确认审批状态变化是否需通知员工,不需要则删除 TODO 并写清设计说明
---
## 🔧 验收标准
- [ ] pytest 全绿 + `npm run build` 通过
- [ ] grep 无死代码残留引用
- [ ] triage 整链删除后启动无 ImportError
- [ ] ApprovalMatcher 单测覆盖率 > 80%
---
## 📞 依赖与阻塞
| 依赖 | 说明 |
|------|------|
| 批次 3 完成(#85) | 死状态删除依赖批次 1-3 相关功能已稳定 |
**文档同步**`dify_unified_intent_prompt_v3.md` 标注「并入主对话 prompt」;`AI对话链路全栈改造实施计划-v1.0.md` 归档至 `11-历史归档`;填写 `docs/12-重构记录/99-回顾报告.md`
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,100 @@
# 任务说明书 — P0-3 快捷申请按钮空白气泡修复
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | P0-3 InputBox 快捷申请按钮空白气泡修复(新 all-categories-card 端点) |
| **任务ID** | #87 |
| **优先级** | 🔴 P0 |
| **类型** | Bug修复 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-18 |
---
## 📥 输入项来源
### 问题证据(F1P0 Bug
| 来源 | 说明 |
|------|------|
| `frontend-h5/src/stores/conversation.ts:900-917` | `showApprovalCard()` 构造 `extra_data={approval_type:'',confidence:0}` |
| `frontend-h5/src/components/chat/MessageBubble.vue:19` | 要求 `msg.extra_data?.action?.card_data`v3.0 纯渲染) |
| 结果 | InputBox「快捷申请」按钮点击后渲染**空白气泡** |
| `frontend-h5/src/components/chat/InputBox.vue:506` | 快捷申请按钮调用方 |
### 技术文档
| 来源文档 | 说明 |
|----------|------|
| `docs/12-重构记录/00-v4.0重构总方案.md` | D6 决策(快捷申请走新端点) |
| `backend/app/services/approval_matcher.py` | `get_all_categories()` 已具备能力(v3.0 已实现) |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `backend/app/api/approval.py` | 代码 | 新增 `GET /approval/all-categories-card`:调 `get_approval_matcher().get_all_categories()`,扁平化组装 `{card_type:'multiple', title:'审批申请', description:'请选择审批类型', options:[...]}` |
| 2 | `frontend-h5/src/api/conversation.ts` | 代码 | 新增 `getAllCategoriesCard()` |
| 3 | `frontend-h5/src/stores/conversation.ts` | 代码 | `showApprovalCard()` 改 async:拉取(store 缓存一次)后插入 `msg_type:'approval_card'``extra_data:{action:{card_data}}` |
### 代码要点
- 后端端点需鉴权(require_employee 或同等),返回结构必须与前端 `CardData` 接口一致(card_type/title/description/options[{name,icon,desc,url}]
- store 缓存:首次点击拉取后存 ref,后续点击直接用,不重复请求
---
## 🔧 验证方式
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 端点响应 | `curl -H "Authorization: Bearer <token>" https://itsupport.servyou.com.cn/api/approval/all-categories-card` | 200options 数组 ≥18 项,每项含 name/icon/desc/url |
| 快捷申请渲染 | H5 点快捷申请按钮 | 立即出现全量审批卡片(18 项),非空白 |
| 选项跳转 | 点任一选项(如 VPN账号申请) | 正确跳转 itsm-bridge/企微审批 |
---
## ✅ 完成标准
- [ ] 后端端点上线,响应结构正确
- [ ] 前端 showApprovalCard 改造完成,快捷申请渲染正常
- [ ] 构建部署 H5 新版,端到端验证通过
- [ ] 状态看板已更新
---
## 📊 工作分解
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| 后端 all-categories-card 端点 | 30min | ⬜ |
| 前端 API + store 改造 | 30min | ⬜ |
| 构建部署 + 端到端验证 | 30min | ⬜ |
---
## 📞 依赖与阻塞
| 依赖 | 说明 | 状态 |
|------|------|------|
| v3.0 ApprovalMatcher.get_all_categories | 已实现 | ✅ 已完成 |
**部署顺序**:后端先发(端点先上线),前端再发(前端依赖端点)。
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,92 @@
# 任务说明书 — P0-4 RecommendCard invokeApproval ReferenceError 修复
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | P0-4 RecommendCard 点击 approval 推荐项崩溃修复 |
| **任务ID** | #88 |
| **优先级** | 🔴 P0 |
| **类型** | Bug修复 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-18 |
---
## 📥 输入项来源
### 问题证据(F2P0 Bug
| 来源 | 说明 |
|------|------|
| `frontend-h5/src/components/assistant/RecommendCard.vue:178` | `case 'approval'` 分支调用 `invokeApproval(item.approval_type)` |
| grep 验证 | 该函数在当前文件**无定义、无导入、无 emit** → 点击 approval 类型推荐项必现 `ReferenceError` 崩溃 |
| 备份文件 | 函数仅存在于 `RecommendCard.vue.bak_bridge_1784261164:262`(遗留备份,不应引用) |
### 技术文档
| 来源文档 | 说明 |
|----------|------|
| `docs/12-重构记录/01-问题验证清单.md` | F2 |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `RecommendCard.vue` L178 附近 | 代码 | `case 'approval'` 改为与 download 一致:`if (item.url) window.open(item.url,'_blank')`;无 url 时 `showToast('链接缺失')` |
### 代码要求
- 纯前端修复,零后端依赖
- 同步检查 L147 是否引用了接口中不存在的 `item.action` 字段(若有则一并清理)
---
## 🔧 验证方式
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 点击 approval 推荐项 | H5 右侧栏推荐卡片点击 approval 类型项 | 不报错、正确跳转 |
| 构建 | `pnpm build` | 无 TS 报错 |
---
## ✅ 完成标准
- [ ] invokeApproval 调用已替换
- [ ] 构建通过,部署验证
- [ ] 状态看板已更新
---
## 📊 工作分解
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| 修复 case 'approval' 分支 | 10min | ⬜ |
| 检查清理 item.action 死引用 | 10min | ⬜ |
| 构建部署验证 | 20min | ⬜ |
---
## 📞 依赖与阻塞
| 依赖 | 说明 | 状态 |
|------|------|------|
| 无 | 独立任务,纯前端 | — |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,93 @@
# 任务说明书 — P0-5 WS new_message 前端全字段透传
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | P0-5 修复 WS new_message 前端白名单丢字段(坐席图片/文件 H5 不渲染) |
| **任务ID** | #89 |
| **优先级** | 🔴 P0 |
| **类型** | Bug修复 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-18 |
---
## 📥 输入项来源
### 问题证据(F3P0 Bug
| 来源 | 说明 |
|------|------|
| `backend/app/api/messages.py:278` | 后端 WS 已下发全量 MessageResponse(含 media_url/file_name/file_size/extra_data |
| `frontend-h5/src/stores/conversation.ts:395-429` | `handleNewMessage()` 白名单**只取 7 个字段**,丢弃 media_url/file_name/file_size/extra_data/reply_to_id |
| 结果 | 坐席端发的图片/文件经 WS 到达 H5 时**无法渲染**(WS 在线时轮询已停,不刷新页面就无法恢复) |
### 技术文档
| 来源文档 | 说明 |
|----------|------|
| `docs/12-重构记录/00-v4.0重构总方案.md` | D4 决策(WS 契约单点化前半段) |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `stores/conversation.ts` `handleNewMessage()` | 代码 | 全字段透传:media_url/file_name/file_size/extra_data/reply_to_id 一并写入 messagescreated_at 用服务端值而非 `new Date()` |
| 2 | `api/conversation.ts` Message 类型 | 代码 | 补全可选字段声明(media_url/file_name/file_size/extra_data/reply_to_id |
### 部署顺序
- **前端可先发**:旧前端收到新字段会忽略,向后兼容,零风险
---
## 🔧 验证方式
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| 坐席发图片 | 坐席端发图片,H5 不刷新 | WS 实时渲染缩略图 |
| 坐席发文件 | 坐席端发文件,H5 不刷新 | WS 实时渲染文件卡片(可下载) |
| 多参与者场景 | 群聊中坐席发图 | 所有 H5 参与者实时渲染 |
---
## ✅ 完成标准
- [ ] handleNewMessage 全字段透传
- [ ] Message 类型补全
- [ ] 构建部署,坐席图片/文件实时渲染验证
- [ ] 状态看板已更新
---
## 📊 工作分解
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| Message 类型补全 + handleNewMessage 改造 | 40min | ⬜ |
| 构建部署 + 坐席图片/文件验证 | 30min | ⬜ |
---
## 📞 依赖与阻塞
| 依赖 | 说明 | 状态 |
|------|------|------|
| 无 | 独立任务,前端先发 | — |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,95 @@
# 任务说明书 — P0-6 Dify 超时预算切分(修复 proxy 兜底不可达)
> **版本**: v1.0 | **日期**: 2026-07-17
---
## 📋 基本信息
| 项目 | 内容 |
|------|------|
| **任务名称** | P0-6 Dify 双重超时修复:httpx 预算切分 native 12s / proxy 12s |
| **任务ID** | #90 |
| **优先级** | 🔴 P0 |
| **类型** | Bug修复 |
| **状态** | 待开始 |
| **负责人** | 宋献 |
| **创建日期** | 2026-07-17 |
| **计划完成日期** | 2026-07-18 |
---
## 📥 输入项来源
### 问题证据(B2
| 来源 | 说明 |
|------|------|
| `backend/app/config.py:115` | `dify_timeout = 30`httpx 超时) |
| `backend/app/tasks/h5_ai_task.py:1197-1204` | `asyncio.wait_for(timeout=30)` |
| `backend/app/services/ai_service.py` `get_structured_reply()` | native 失败再串行调 proxy**最坏 60s** → wait_for 必先在 30s 触发 → **proxy 兜底路径数学上不可达** |
### 技术文档
| 来源文档 | 说明 |
|----------|------|
| `docs/12-重构记录/00-v4.0重构总方案.md` | D2 决策(超时预算内化) |
---
## 📤 输出成果要求
### 交付物清单
| # | 交付物 | 类型 | 说明 |
|---|--------|------|------|
| 1 | `backend/app/config.py` | 代码 | 新增 `dify_native_timeout: int = 12``dify_proxy_timeout: int = 12` |
| 2 | `backend/app/services/ai_service.py` | 代码 | `_get_native_client()` 用 native_timeout`_get_client()` 用 proxy_timeout`dify_timeout` 保留给 wingman 等旧路径 |
| 3 | `docker-compose.yml` | 配置 | environment 新增 2 项(铁律 2:显式声明) |
### 设计约束
- 12 + 12 + 开销 < 30wait_for(30) 保持为最后防线
- 本批只做预算切分;统一调用点重构在批次 2(#84 P1-2)完成
---
## 🔧 验证方式
| 验证项 | 验证方法 | 预期结果 |
|--------|----------|-----------|
| native hang 切 proxy | mock native 持续 hang | 12s 内切 proxy 并拿到结果,全程 < 30s |
| 无 asyncio.TimeoutError | 日志观察 | Dify 慢响应时不再触发外层 30s 硬超时 |
---
## ✅ 完成标准
- [ ] config 新增 2 字段,compose 声明
- [ ] 两个 httpx client 分别使用对应超时
- [ ] 部署后端,慢响应场景验证 proxy 兜底可达
- [ ] 状态看板已更新
---
## 📊 工作分解
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| config + ai_service 改造 | 30min | ⬜ |
| compose 声明 + 部署验证 | 20min | ⬜ |
| mock hang 场景验证(可选 pytest | 30min | ⬜ |
---
## 📞 依赖与阻塞
| 依赖 | 说明 | 状态 |
|------|------|------|
| 建议 #79DIFY_NATIVE 配置)完成后 | 有原生直连才能体现切分价值,但不阻塞 | ⬜ |
---
## 📈 变更记录
| 日期 | 变更内容 | 变更人 |
|------|----------|--------|
| 2026-07-17 | 创建任务 | 宋献 |
@@ -0,0 +1,116 @@
# Token多IP异常检测 - 任务卡
> **项目**: IT智能服务台
> **模块**: 威胁检测
> **优先级**: P1
---
## 1. 任务信息
| 字段 | 内容 |
|------|------|
| 任务ID | 需在TAPD/任务管理系统中创建 |
| 任务名称 | 实现Token多IP异常检测功能 |
| 任务类型 | 新功能开发 |
| 所属迭代 | 当前迭代 |
---
## 2. 任务分解
### 2.1 技术实现 (开发)
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| 创建 token_anomaly_detection.py 检测任务 | 2h | ✅ 完成 |
| 在 token_service.py 增加 record_token_ip 方法 | 1h | ✅ 完成 |
| 在 main.py 注册定时任务 | 0.5h | ✅ 完成 |
| 配置项添加到 config.py | 0.5h | ✅ 完成 |
### 2.2 测试验证 (测试)
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| 编写单元测试用例 | 1h | ✅ 完成 |
| 执行T001-T006单元测试 | 1h | ✅ 完成 |
| 执行I001-I003集成测试 | 1h | ✅ 完成 |
| 冒烟测试 | 0.5h | ✅ 完成 |
### 2.3 部署上线 (运维)
| 子任务 | 预估工时 | 状态 |
|--------|----------|------|
| 代码Code Review | 0.5h | ✅ 完成 |
| 部署到测试环境 | 0.5h | ✅ 完成 |
| 测试环境验证 | 1h | ✅ 完成 |
| 部署到生产环境 | 0.5h | ✅ 完成 |
| 生产环境验证 | 0.5h | ✅ 完成 |
---
## 3. 任务依赖
| 前置任务 | 后置任务 |
|----------|----------|
| 技术设计文档完成 | 开发任务开始 |
| 开发任务完成 | 测试任务开始 |
| 测试任务完成 | 部署任务开始 |
---
## 4. 验收标准
### 4.1 功能验收
- [ ] 同一Token使用3个不同IP时触发告警
- [ ] 同一Token使用1个IP不触发告警
- [ ] 告警内容包含employee_id、ip_count、token_hash
- [ ] 企微收到告警消息
### 4.2 性能验收
- [ ] 定时任务执行时间 < 100ms
- [ ] Redis存储不影响现有服务
### 4.3 稳定性验收
- [ ] 告警发送失败不影响主流程
- [ ] Redis连接失败有降级处理
---
## 5. 关联产出物
| 产出物 | 路径 |
|--------|------|
| 技术设计文档 | `docs/09-部署运维/技术设计-Token多IP异常检测.md` |
| 测试用例 | `docs/06-测试质量/testing-测试/Token多IP异常检测测试用例.md` |
| 部署指南 | `docs/09-部署运维/Token多IP异常检测部署指南.md` |
| 检测规则 | `detections/brute_force_detection.yml` |
---
## 6. 时间估算
| 阶段 | 预估工时 |
|------|----------|
| 技术实现 | 4h |
| 测试验证 | 3.5h |
| 部署上线 | 3.5h |
| **总计** | **11h** |
---
## 7. 风险与 mitigation
| 风险 | 影响 | 概率 | 应对 |
|------|------|------|------|
| 误报率高 | 告警泛滥 | 中 | 调整阈值或添加白名单 |
| Redis性能影响 | 服务延迟 | 低 | 优化SCAN操作 |
---
> **创建人**: 威胁检测工程师
> **创建日期**: 2026-07-14
> **任务状态**: 待开始
@@ -0,0 +1,61 @@
# 项目状态看板
> **版本**: v1.0 | **更新日期**: 2026-07-17
---
## 📊 看板概览
| 状态 | 数量 |
|------|------|
| 🔴 进行中 | 0 |
| 🟠 待开始 | 0 |
| ✅ 已完成 | 76 |
---
## ✅ 最近完成 (Recently Completed)
| 任务ID | 任务名称 | 优先级 | 负责人 | 完成日期 |
|--------|----------|--------|--------|----------|
| #82 | H5右侧栏布局调整 | P2 | 宋献 | 2026-07-17 |
| #76 | ITSM工单卡片跳转(桥接页一步直达 + 扫码登录定为人机校验) | P1 | 宋献 | 2026-07-17 |
---
## 🟠 待开始 (To Do)
暂无待开始的任务
---
## ✅ 最近完成 (Recently Completed)
| 任务ID | 任务名称 | 优先级 | 负责人 | 完成日期 |
|--------|----------|--------|--------|----------|
| #75 | 头像同步功能完善 | P1 | 宋献 | 2026-07-15 |
| #74 | IT资产升级卡片免登录修复 | P1 | 宋献 | 2026-07-15 |
| #73 | H5截图功能 | P2 | 宋献 | 2026-07-14 |
---
## 📌 重要技术决策与限制记录
| 日期 | 决策 / 限制 | 影响范围 | 说明 |
|------|------------|----------|------|
| 2026-07-17 | H5 答题功能实现 | H5 右侧栏 | 答题区域通过 showQuiz prop 控制显隐,QueueWaiting 组件始终挂载但默认折叠。修复了答题默认显示和重复出现的 bug。详见任务说明书 #82 v1.1 |
| 2026-07-17 | ITSM 工单跳转:扫码登录定为人机校验 | 8 个运维平台审批卡片 | Web ITSM 深链不支持静默企微 OAuth,桥接页跨域预热被拒,仍弹扫码。产品决策保留该扫码环节(企业安全合规可接受的二次身份确认),不视为缺陷。详见 PRD §v2.3、架构 §15.4.9、任务说明书 #76 v3.0 |
## 📈 任务统计
- **总任务数**: 77
- **已完成**: 76
- **进行中**: 0
- **待开始**: 0
- **阻塞**: 0
---
## 🔗 相关文档
- 任务说明书目录: `docs/10-项目管理/任务说明书/`