Files
wecom_it_smart_desk/docs/06-测试质量/04-版本测试报告/知识迭代Bug修复报告-20260711.md
T

150 lines
4.4 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.
# 知识迭代模块 Bug 修复报告
> **日期**: 2026-07-11
> **修复人**: 寇豆码(工程师) / 严过关(QA验证)
> **团队**: `software-bugfix-ki-bugs`
> **测试**: 21/21 通过
> **部署状态**: ⏳ 待部署(`docker compose restart backend`
---
## 修复概览
| # | 优先级 | 问题 | 修复文件 | 状态 |
|---|--------|------|---------|------|
| 8 | P1 | `POST /suggestions` 返回 405 | `knowledge_iteration.py` | ✅ |
| 7 | P2 | Neo4j 关系创建重复 | `neo4j_client.py` | ✅ |
| 6 | P2 | 过期建议状态永不更新 | `main.py` | ✅ |
---
## #8 P1: POST /suggestions 端点缺失
### 问题描述
- 前端 `KnowledgeIteration.vue:626` 发送 `POST /api/admin/knowledge-iteration/suggestions`
- 后端 `knowledge_iteration.py` 只有 `GET /suggestions`(行80),无 POST 根端点
- 返回 405 Method Not Allowed,手动创建建议功能完全不可用
### 修复方案
- **文件**: `backend/app/api/knowledge_iteration.py:168`
- **新增**: `create_suggestion` 端点
- **接收**: `KnowledgeSuggestionCreate` body(校验 title/content/source_type 必填)
- **创建**: 记录 status=pending
- **返回**: `KnowledgeSuggestionResponse`
### 代码变更
```python
@router.post("/suggestions", response_model=KnowledgeSuggestionResponse)
async def create_suggestion(
suggestion: KnowledgeSuggestionCreate,
db: Session = Depends(get_db),
current_user = Depends(require_admin)
):
"""手动创建知识建议"""
db_suggestion = KnowledgeSuggestion(
title=suggestion.title,
content=suggestion.content,
source_type=suggestion.source_type,
status="pending",
created_by=current_user.id
)
db.add(db_suggestion)
db.commit()
db.refresh(db_suggestion)
return db_suggestion
```
---
## #7 P2: Neo4j 关系创建重复
### 问题描述
- `neo4j_client.py:526` 使用 `CREATE` 而非 `MERGE`
- 重复审批会产生重复关系边,污染知识图谱
### 修复方案
- **文件**: `backend/app/services/neo4j_client.py:526`
- **变更**: Cypher 关键词 `CREATE``MERGE`(一词之差)
- 效果:关系创建幂等化,重复审批不再产生重复边
---
## #6 P2: 过期建议状态永不更新
### 问题描述
- `enums.py:34,53` 定义了 `expired` 状态
- `main.py:133-161` APScheduler 只注册了 `check_unreplied_sessions`
- 无 expired 检查 jobstats 中 expired 永远 = 0
### 修复方案
- **文件**: `backend/app/main.py`
- **新增函数**: `expire_pending_suggestions()`(行133
- **注册定时任务**: APScheduler(行199),interval=1小时
- **SQL**: `UPDATE knowledge_suggestions SET status='expired' WHERE status='pending' AND created_at < NOW() - INTERVAL '72 hours'`
### 代码变更
```python
async def expire_pending_suggestions():
"""每小时检查并过期超过72小时未处理的pending建议"""
async with AsyncSessionLocal() as db:
await db.execute(text(
"UPDATE knowledge_suggestions "
"SET status='expired' "
"WHERE status='pending' "
"AND created_at < NOW() - INTERVAL '72 hours'"
))
await db.commit()
# APScheduler 注册
scheduler.add_job(
expire_pending_suggestions,
trigger="interval",
hours=1,
id="expire_pending_suggestions",
name="Expire pending knowledge suggestions"
)
```
---
## 测试覆盖
| 测试项 | 用例数 | 状态 |
|--------|--------|------|
| #8 POST /suggestions | 11 | ✅ |
| #7 MERGE 幂等 | 3 | ✅ |
| #6 过期检查 | 7 | ✅ |
| **合计** | **21** | **全部通过** |
测试文件: `backend/tests/test_bugfix_ki_suggestions.py`
---
## 预存 Bug(非本次修复)
> `backend/app/services/itsm_service.py:33`
> `httpx.Timeout(connect=10.0, read=30.0)` 缺 write/pool 参数
> 当前 httpx 版本要求四参数全传或传 default
> QA 在 conftest.py 加了兼容补丁,生产环境仍需修复
> **建议**: 改为 `httpx.Timeout(timeout=30.0, connect=10.0, read=30.0)`
---
## 部署指南
```bash
# 1. 确认代码已在服务器(bind mount ./app:/app/app
# 2. 重启后端容器
docker compose restart backend
# 3. 验证
# 检查 POST /suggestions 端点
curl -sk -X POST https://localhost/api/admin/knowledge-iteration/suggestions \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"test","content":"test","source_type":"manual"}'
# 检查 APScheduler 注册
docker logs wecom_it_backend 2>&1 | grep "expire_pending"
```