feat: 2026-07-11 全量更新 - 代办集成+会议室预定+知识迭代修复+UI统一+Bug修复

== 已部署上线 (9项) ==
- 代办事项真实数据源集成 (企微审批API 8bug修复链)
- H5/坐席端 Logo样式统一+绿色背景
- 视频引导页修复 (localStorage key v2)
- 坐席端 v9 Vue版本修复 (ElMessage._context)
- 截图按钮 v10 修复 (getDisplayMedia user gesture)
- 扫码样式恢复+H5扫码登录跳转修复
- H5截图快捷键提示

== 代码完成待部署 (3项) ==
- 知识迭代3Bug修复 (#8 POST端点/#7 MERGE幂等/#6 过期检查)
- 会议室预定-小鱼易联终端 (40文件, 40/40测试通过)
- IT资产升级审批推送 (asset_service.py)

== 需求文档 (2项) ==
- 坐席端AI辅助消息框-PRD (4项新功能确认)
- 坐席端布局优化建议 v2.0 (7天计划)

== 新增文档 ==
- 日报-2026-07-11.md
- 知识迭代Bug修复报告-20260711.md
- 会议室预定-部署指南.md
- CHANGELOG.md 更新

== 测试 ==
- test_todo_integration.py: 40/40
- test_meetingroom.py: 40/40
- test_bugfix_ki_suggestions.py: 21/21
This commit is contained in:
Simon
2026-07-11 23:13:10 +08:00
parent 3d152fc8eb
commit bea288e414
928 changed files with 85169 additions and 54205 deletions
+60 -106
View File
@@ -1,123 +1,77 @@
# IT智能服务台 - 项目记忆
## 锁定的设计决策
- **AI交互原则**:小段多回合交互,禁止一次性大段回复
- **文档管理**:统一保存 `docs/` 目录,按类型分子目录
- **资源申请流程**:所有资源申请→`docs/资源申请清单.md`
- **原型已锁定**:坐席v5.3 + H5 v1.1
- **UI偏好**:企微浅色扁平风格,accent=#07C160
- **术语统一**"人工"=用户呼叫坐席;"摇人"=坐席呼叫坐席
- **双企微应用**:正式(itsupport.servyou.com.cn) + 测试(已下线)
- **统一入口架构**`/itportal/` 角色选择 → user/agent/admin
- **OTP双因素认证**:admin角色访问时验证
## 设计决策(锁定)
- AI交互:小段多回合;术语:"人工"=用户呼叫坐席,"摇人"=坐席呼叫坐席
- 原型:坐席v5.3 + H5 v1.1UI:企微浅色扁平,accent=#07C160
- 统一入口 `/itportal/` → user/agent/adminadmin需OTP
## 技术架构
- **前端**:坐席(Vue3+Element Plus) / H5(Vue3+Vant4) / 管理后台(Vue3+Element+Tailwind)
- **后端**FastAPI + SQLAlchemy + PostgreSQL + Redis
- **本地开发**Python 3.12 venv + SQLite
- **字段映射**:后端`id`/`sender_type` → H5前端`message_id`/`message_type`,映射层在 `frontend-h5/src/api/conversation.ts``mapMessage()`
- **WS广播**H5发消息后通过 `ws_manager.broadcast()` 实时推送给坐席
- **API超时**:默认20s,消息发送30s,文件上传60s
- 前端:坐席(Vue3+Element Plus) / H5(Vue3+Vant4) / 管理后台(Vue3+Element+Tailwind)
- 后端FastAPI + SQLAlchemy + PostgreSQL + Redis(代码在 `app/`
- 字段映射:后端`id`/`sender_type` → 前端`message_id`/`message_type``conversation.ts``mapMessage()`
- WS双连接池:`active_connections`(agent) + `employee_connections`(H5)
## 部署
- **NAS测试**~~itdesk.amanzac.com~~ (已下线)
- **正式服务器**itsupport.servyou.com.cn (10.90.5.110)
- **堡垒机**sxn@10.212.189.210:2222 (OTP)
- **文件上传**:只能通过堡垒机手动上传到 `/tmp/`
- 正式服务器:itsupport.servyou.com.cn (10.90.5.110),出口IP `218.75.34.87`
- 堡垒机:sxn@10.212.189.210:2222 (OTP),脚本 `C:\Users\simon\.workbuddy\skills\jumpserver-ops\scripts\jms_ops.py`
- 后端卷挂载:`./app:/app/app``.py`变更→`docker compose restart backend`env变更→`up -d backend`
- 前端:rm旧→tar解压dist/→`restart nginx`Nginx: H5→`/html/h5` / Agent→`/html/itagent` / Admin→`/html/itadmin`
- Docker bind mount铁律:rm后重建必须重启容器
- 部署工具:`jms_ops.py pack-upload <local_dir> <remote_dir>`(≥100KB用此)
- httpx.Timeout须含default`httpx.Timeout(timeout=30.0, connect=10.0, read=30.0)`
## 外部系统集成
- **火绒企业版**:HMAC-SHA1认证,核心接口 `_leak`(高危漏洞) / `_virus_events`(病毒事件)
- **联软LV7000**:三层认证,核心价值 `strusername` 字段=员工→终端映射
- **Dify**:生产 `http://yw-dify.dc.servyou-it.com/dify2openai/`
- **RAGFlow**:生产 `http://10.80.0.85:8080/` / API `:9380`
- **aTrust**HMAC-SHA256,待获取API密钥
- **映射策略**:联软(主) > aTrust(VPN辅) > eHR(静态)
## 外部集成
- 企微通讯录:Secret `BM6iosc3gKnPqkEXmsQN3ErJUpfO-whfMUN646eezB8`Redis key=`wecom:contact_access_token`
- Dify`http://yw-dify.dc.servyou-it.com/v1/chat-messages`;审批意图Key `app-7jkRkAzvX4QM9v9SM3P8mMEO`
- RAGFlow:生产 `http://10.80.0.85:8080/` / API `:9380`
- 映射策略:联软(主) > aTrust(VPN) > eHR(静态)
## 管理后台
- 路由前缀 `/api/admin/`;权限 require_admin
- 已实现:仪表盘/功能开关/坐席管理/分配模式/快速回复审核/集成配置/会话监控/会话审计/坐席绩效/系统日志/角色管理
- 集成三种配置模式:url_key / access_key / account_password
## 群聊系统
- 摇人(`collaborating_agent_ids`) / 邀请(`participants`);四角色权限
- 参与者展开/缩略双模式;头像代理 `/api/avatar/proxy` 解决 COEP/CSP
## H5端消息推送
- 双通道:企微消息(必达) + WebSocket(即时)
- WS端点:`/ws/h5/{employee_id}?token=xxx`
- 降级策略:WS断连→3秒轮询
- **本地消息缓存 (v0.7.4+)**
- 登录后优先加载本地缓存消息,立即显示历史记录
- 同时异步从后端获取最新消息,合并去重后更新缓存
- 缓存key`h5_messages_cache`,有效期7天,最多100条/会话
- 发送消息和轮询时自动更新缓存
- 登出时清除缓存
## 审批流程系统(2026-07-10上线)
- 12种审批类型 / 18个流程;意图识别三级链路:关键词→Dify→降级
- 卡片导航用 `window.location.href`(同窗口)
## 近期问题修复 (2026-07)
- **OAuth重定向计数残留**:页面刷新后`oauth_redirect_count`未重置,导致误报"登录状态异常" → 在`employee.ts` store初始化时检测有效token后自动清除计数
- **API响应解析错误**:Axios拦截器返回`{code:0, data:{}, message}`包装格式,但部分API直接访问`response.xxx`而非`response.data.xxx` → 修正`conversation.ts``sendMessage`函数的响应映射
- **数据库缺失列**`messages`表缺少`is_recalled`列 → `ALTER TABLE messages ADD COLUMN IF NOT EXISTS is_recalled BOOLEAN DEFAULT FALSE;`
- **数据库列类型错误**`messages.id`列为uuid类型但代码传入varchar → `ALTER TABLE messages ALTER COLUMN id TYPE character varying(36);`
- **Nginx部署目录**:构建产物上传到`/opt/wecom-it-desk/frontend-h5/`但nginx挂载在`/opt/wecom-it-desk/html/itdesk/` → 部署时需复制文件到正确目录
## 代办事项真实数据源集成(2026-07-11部署+修复完成)
- **PRD**`docs/02-产品需求/prd_todo_integration.md`
- **后端**`todo_source_service.py` / `itsm_service.py` / `todo_aggregator_service.py`(Redis缓存45s)
- **前端**`TodoPanel.vue` / `todo.ts`(API+Store)
- **企微审批API**`getapprovalinfo`(旧`getapprovaldata`已废弃404)→ Semaphore(10)并发`getapprovaldetail` → 代码层过滤template_id
- **Token方案**:统一用 `TokenManager`(IT支持应用Secret,IP已在白名单)
- **缓存策略**:初始+60s自动=用缓存(无_force) / 手动🔄=跳过缓存(_force=1) / TTL=45s
- **8个Bug修复链**env未注入→Redis密码→bind mount丢失→API废弃→token decode→IP白名单60020→filter参数301025→**_extract_current_approver字段名全错**
- **企微API实际字段名**(dump确认):`sp_record[].sp_status`(非status/ `details[].approver.userid`(非approver[].userid
- **验证**:sxn名下2条审批单正确返回(IT资产外修申请)
- **ITSM**:工单详情API已实现,代办列表API待抓包;签名 app_id+app_secret+SHA1
- **测试**40/40通过
## 五阶段演进
1. MVP:转人工+H5+坐席+邀请+管理后台
2. 完整流程:WS+排队+满意度+OAuth2
3. AI Wingman+排查流程图
4. 知识库+数据看板
5. 自动化闭环
## IT资产升级审批推送(待部署)
- 模板ID`Bs7ucTGsPuFhxfk8pn8EydxrWxkVetB4JR8Pb6PHS`
- 新建 `asset_service.py`;修改 `approval.py`(+urge端点) / `config.py`(+asset_excel_path)
- 资产Excel12月度sheet,编码列(2)匹配,日期列(41)算年限
## 堡垒机运维 (jumpserver-ops)
## 语音识别转文字(2026-07-11部署)
- 手机企微=JS-SDK / PC企微=百度ASR(AppID=123947532) / Mac=隐藏
- H5内联录音:🎤→⏹→⏳(disabled)
**脚本位置**`C:\Users\simon\.workbuddy\skills\jumpserver-ops\scripts\jms_ops.py`
## 坐席端截图+拍照(2026-07-11部署)
- 截图编辑器(马赛克/文字/箭头/矩形/撤销);拍照(getUserMedia→兜底input capture)
- 铁律:`.selection-box`必须`pointer-events:none`;文字工具CSS类切换非v-if`getDisplayMedia()`必须同步调用
### ⚠️ 服务器操作规则(重要
## 复杂场景重构(2026-07-11部署
- P0~P3:任务中断恢复/信息更正/上下文压缩/多轮纠错
- 路由前缀`/itportal/automation/`;迁移链修复041→028_merge_heads
**在对服务器进行任何操作时,优先使用 jumpserver-ops 自动完成,而非让用户手动操作。**
## 知识库迭代(待确认)
- 技术方案:`docs/03-技术架构/增量设计-知识库迭代与痛点缓解-20260711.md`
- 原型图:`docs/01-产品设计/知识库迭代-未实现功能原型设计-20260711.md`
| 操作类型 | 自动执行方式 |
|----------|-------------|
| 远程命令 | `python jms_ops.py exec -c "命令"` |
| 文件上传 | `python jms_ops.py upload 本地文件 /tmp/远程路径` |
| 文件下载 | `python jms_ops.py download /tmp/远程文件 ./本地路径` |
## 近期修复 (2026-07)
- H5非企微环境→扫码登录页;Vue版本不一致白屏→重装+`ElMessage._context`
- 消息重复/头像COEP/OAuth残留→已修
### 使用方式
```bash
# 第一次执行(自动登录并缓存会话)
python jms_ops.py exec -c "hostname"
# 连续测试:使用 --reuse 复用会话(30分钟内有效,2-3秒执行)
python jms_ops.py exec -c "uptime" --reuse
python jms_ops.py exec -c "docker ps" -c "curl -s http://localhost/api/health" --reuse
# 文件上传(自动根据大小选择方式)
# - ≤10MB: base64 编码传输(快速)
# - >10MB: elFinder Web UI(浏览器自动化)
python jms_ops.py upload local_file.txt /tmp/remote_file.txt
# 文件下载
python jms_ops.py download /tmp/remote_file.txt local_file.txt
# 批量命令
python jms_ops.py batch -f commands.txt
# 文件传输
python jms_ops.py upload local.conf /tmp/remote.conf
python jms_ops.py download /remote/path ./local.conf
```
### 性能
| 场景 | 首次执行 | --reuse 复用 |
|------|----------|--------------|
| 单命令 | ~13s | ~2s |
| 3 条命令 | ~13s | ~3s |
### 关键参数
- `--reuse`:复用上次会话(减少登录次数,30分钟有效)
- `--parallel`:并行模式(每命令独立 token+会话)
- `--cmd-timeout`:每命令超时秒数(默认 15s
## 文档关联修复 (2026-07-05)
- **起因**2026-07-04 docs/ 重组为数字编号子目录(01-项目总览~11-历史归档),但 mkdocs.yml nav / 文档间交叉引用 / 巡检自动化路径未同步,全面断链
- **修复**mkdocs.yml nav 9处断链重写(移除2个归档项,纳入5份新文档)+ 11处交叉引用修复 + 索引版本号修正(v1.0→v1.3) + 巡检自动化适配
- **关键发现**:巡检 automation-1782986180887 原依赖的"小组任务书/任务执行状态看板.md"及A/B/C三组体系(认证加固16/消息系统16/AI数据19)从未创建,每日巡检必然失败;已适配为基于 01-项目状态看板.md 的状态巡检(P0/P1/等决策/进行中)
- **修复报告**:docs/01-项目总览/文档关联修复报告-20260705.md
- **保留未改**:目录树展示(历史快照)、归档文档内旧路径、历史任务标题
## 运维工具
- SOP`docs/10-项目管理/IT智能服务台-标准作业流程SOP.md`
- 故障排查:`docs/09-部署运维/00-标准故障排查手册.md`