2026-07-17 23:08:59 +08:00
|
|
|
|
# v4.0 重构 — 问题验证清单(20 项)
|
|
|
|
|
|
|
|
|
|
|
|
> **日期**:2026-07-17
|
|
|
|
|
|
> **验证方式**:逐项对照源码核实(文件 + 行号)
|
|
|
|
|
|
> **用途**:新会话快速理解重构问题基线,无需重新探索
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 一、后端问题(B1-B8)
|
|
|
|
|
|
|
|
|
|
|
|
| # | 问题 | 证据(文件:行号) | 现状 |
|
|
|
|
|
|
|---|------|------------------|------|
|
|
|
|
|
|
| B1 | 9 个匹配/识别入口(5 活 4 死) | 活:Dify 主 action、ApprovalMatcher、routing detect、Neo4j 图谱、关键词预过滤;死:`approval.py:1060`、`byod.py:348`、DifyTriageService、matchers.IntentMatcher | 待 P1-2 收敛 |
|
|
|
|
|
|
| B2 | 双重超时致 proxy 兜底不可达 | `ai_service.py` httpx timeout=30s(`config.py:115`)= `h5_ai_task.py:1197` wait_for(30);native→proxy 串行最坏 60s | 待 P0-6 |
|
|
|
|
|
|
| B3 | ApprovalMatcher 死分支 | `approval_matcher.py:66-69` 优先级 5 与 50-53 优先级 2 同调 `_match_by_keyword(approval_type)`,不可达 | 待 P1-4 |
|
|
|
|
|
|
| B4 | Matcher 匹配失败仅 warning | `h5_ai_task.py:461`,action 无 card_data 透传 → 前端空白 | 待 P1-4(D3 兜底) |
|
|
|
|
|
|
| B5 | 同一 Dify 调用代码复制 3 遍 | `approval.py:999-1057`(死)、`routing_service.py:120-189`(活)、`byod.py:243-300`(死),各自新建 httpx.AsyncClient | 待 P1-2 |
|
|
|
|
|
|
| B6 | 路由 detect 与主 Dify 串行 45s | `h5_ai_task.py:1060` detect(15s 超时)→ `:1197` 主调用(30s) | 待 P1-3(D1 合并) |
|
|
|
|
|
|
| B7 | 26 对 try/except | `h5_ai_task.py` 主函数 11 对,最深 4 层缩进(L1037→1196→1205→1227) | 待 P1-3 管线化 |
|
|
|
|
|
|
| B8 | 死代码 9 项 | 见 v4.0 方案 §3 表格(get_reply_stream、detect-intent×2、dynamic_recommend 死分支、matcher P5、前端死 API×2、handle_message 死分支、回调 TODO、.bak 文件) | 待 P2-1 |
|
|
|
|
|
|
| B9 | get_shared_ai_handler 伪单例 | `dependencies/__init__.py:98-106` 每次新建 AIHandler+AIService+2 个 httpx 池,从不 close | 待 P1-1 |
|
|
|
|
|
|
|
|
|
|
|
|
## 二、前端问题(F1-F6)
|
|
|
|
|
|
|
|
|
|
|
|
| # | 问题 | 证据 | 现状 |
|
|
|
|
|
|
|---|------|------|------|
|
2026-07-18 01:18:11 +08:00
|
|
|
|
| F1 | ~~showApprovalCard 空白气泡(P0)~~ **误报** | `stores/conversation.ts:900-917` 构造空 extra_data。**但 InputBox.vue 是孤儿组件(ChatPanel.vue:96 实际用 InputBar.vue),showApprovalCard 无人调用,此 bug 在用户界面不存在**。all-categories-card 端点保留备用,InputBox+showApprovalCard 列入批次4死代码 | ⚠️ 误报,批次4清理 |
|
2026-07-17 23:08:59 +08:00
|
|
|
|
| F2 | RecommendCard invokeApproval 崩溃(P0) | `RecommendCard.vue:178` 调用未定义函数(grep 确认无定义/导入/emit) | 待 P0-4 |
|
|
|
|
|
|
| F3 | WS new_message 白名单丢字段(P0) | `stores/conversation.ts:395-429` 只取 7 字段;后端 `messages.py:278` 已下发全量 | 待 P0-5 |
|
|
|
|
|
|
| F4 | WS 3 种死路由 | `useH5WebSocket.ts:392/477/489`(ai_reply_chunk/pending_close_request/quiz_diagnostic_answer),后端零产出 | 待 P1-5 |
|
|
|
|
|
|
| F5 | ApprovalCardModal 3 处渲染点 | `MessageBubble.vue:19/82/103`,L82 text 分支自 v2.4 已死;approval_card msg_type 后端从未产出 | 待 P1-5 |
|
|
|
|
|
|
| F6 | 大量死代码 | store 死状态(approvalCardVisible 等)、MessageItem.vue 孤儿组件、死 CSS、前端死 API(conversation.ts:430/486/505) | 待 P2-1 |
|
|
|
|
|
|
|
|
|
|
|
|
## 三、配置/部署问题(C1-C6)
|
|
|
|
|
|
|
|
|
|
|
|
| # | 问题 | 证据 | 现状 |
|
|
|
|
|
|
|---|------|------|------|
|
|
|
|
|
|
| C1 | DIFY_NATIVE_* 生产从未配置 | 根 compose environment 无此 2 项;`.env.production`、`deploy-server/.env.production`、`backend/.env.example` 均无 → v2.1 原生直连未上线 | 待 P0-2 |
|
|
|
|
|
|
| C2 | workers=2 破坏单 worker 铁律 | `docker-compose-override.yml:4`、`deploy-server/docker-compose.yml:115`、`docker-compose-green.yml:46` 均 `--workers 2`;主文件已 1 但被 override 覆盖 | 待 P0-1 |
|
2026-07-18 02:19:12 +08:00
|
|
|
|
| C3 | APP_ENV 未传 | `config.py:182` 默认 dev → 生产 UA 校验/IP 白名单不生效 | ✅ P1-7 已完成(2026-07-18,`APP_ENV=production` 已注入容器) |
|
|
|
|
|
|
| C4 | Redis 密码硬编码两处 | 根 compose L51(requirepass 明文)、L120(URL 编码硬编码);`.env` 的 REDIS_PASSWORD 未被引用;密码已进 git | ✅ P1-7 已完成(2026-07-18 轮换为 32 位随机密码,老密码 WRONGPASS 验证失效) |
|
2026-07-17 23:08:59 +08:00
|
|
|
|
| C5 | 15+ 处 os.getenv 旁路 | upload.py:35/49/51、auth_wecom_sso.py:65/83/161、dev_auth.py:42 等;DEV_MODE 判定重复 4 处 | 待 P1-7 |
|
2026-07-18 02:19:12 +08:00
|
|
|
|
| C6 | 3 个潜伏 bug | ① `main.py:1020` `app_root` 未定义 → /version 永远 unknown;② `tasks/scheduler.py:21` `AsyncIOSScheduler` 拼写错误(多一个 S,且零导入);③ `config.py:409` 使用未定义 `logger` | ✅ P1-7 已完成(2026-07-18 全部修复并部署) |
|
2026-07-18 10:53:00 +08:00
|
|
|
|
| C7 | employees.last_login_ip 列缺失 | OAuth 回调 WARNING:`column employees.last_login_ip does not exist`(model 有该字段但表缺列,schema 迁移缺失)。仅 WARNING 不阻塞登录 | ✅ 已完成(2026-07-18 ALTER TABLE 补列,验证 EXISTS) |
|
|
|
|
|
|
| C8 | redis decode 兼容警告 | `wecom_service.py:83`:`decode_responses=True` 返回 str 后代码再调 `.decode()` → WARNING 走降级。不致命 | ✅ 已完成(2026-07-18 修复 7 处裸 decode:wecom_service×2/employee_directory×3/auth_wecom_sso×2,统一 isinstance 保护) |
|
2026-07-17 23:08:59 +08:00
|
|
|
|
|
|
|
|
|
|
## 四、已完成的修复(v3.0/v3.1/批次 0,勿重复)
|
|
|
|
|
|
|
|
|
|
|
|
| 日期 | 修复 | 位置 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| v3.0 | 后端 ApprovalMatcher 统一匹配;前端 ApprovalCardModal 纯渲染;APPROVAL_TEMPLATES 扩展 icon/desc/category;删除前端 APPROVAL_OPTIONS / APPROVAL_URL_MAP / getApprovalKeywords API | `approval_matcher.py`、`approval.py`、`ApprovalCardModal.vue`、`MessageBubble.vue`、`RecommendCard.vue`、`conversation.ts` |
|
|
|
|
|
|
| v3.1 | Dify 无 action 降级(h5_ai_task.py:1252-1272)+ 超时降级(:1205-1241);修复 `message_content` 未定义 bug(3 处改 `content`) | `h5_ai_task.py` |
|
|
|
|
|
|
| 批次 0 | dify_main_chat_prompt v1.2 同步线上;DEPLOY-GUIDE §4.3 部署铁律;2 个 prompt 文档标废弃;本目录归档 | `docs/` |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**参考**:完整方案见 `00-v4.0重构总方案.md`;批次执行记录见 `01-批次1-P0执行记录.md` 等。
|