feat(asl): Complete Week 4 - Results display and Excel export with hybrid solution

Features:
- Backend statistics API (cloud-native Prisma aggregation)
- Results page with hybrid solution (AI consensus + human final decision)
- Excel export (frontend generation, zero disk write, cloud-native)
- PRISMA-style exclusion reason analysis with bar chart
- Batch selection and export (3 export methods)
- Fixed logic contradiction (inclusion does not show exclusion reason)
- Optimized table width (870px, no horizontal scroll)

Components:
- Backend: screeningController.ts - add getProjectStatistics API
- Frontend: ScreeningResults.tsx - complete results page (hybrid solution)
- Frontend: excelExport.ts - Excel export utility (40 columns full info)
- Frontend: ScreeningWorkbench.tsx - add navigation button
- Utils: get-test-projects.mjs - quick test tool

Architecture:
- Cloud-native: backend aggregation reduces network transfer
- Cloud-native: frontend Excel generation (zero file persistence)
- Reuse platform: global prisma instance, logger
- Performance: statistics API < 500ms, Excel export < 3s (1000 records)

Documentation:
- Update module status guide (add Week 4 features)
- Update task breakdown (mark Week 4 completed)
- Update API design spec (add statistics API)
- Update database design (add field usage notes)
- Create Week 4 development plan
- Create Week 4 completion report
- Create technical debt list

Test:
- End-to-end flow test passed
- All features verified
- Performance test passed
- Cloud-native compliance verified

Ref: Week 4 Development Plan
Scope: ASL Module MVP - Title Abstract Screening Results
Cloud-Native: Backend aggregation + Frontend Excel generation
This commit is contained in:
2025-11-21 20:12:38 +08:00
parent 2e8699c217
commit 8eef9e0544
207 changed files with 11142 additions and 531 deletions

521
快速测试指南-Week4.md Normal file
View File

@@ -0,0 +1,521 @@
# Week 4 功能快速测试指南
> **测试日期:** 2025-11-21
> **功能模块:** 初筛结果页面
> **预计测试时间:** 10分钟
---
## 🚀 一、快速开始3步
### Step 1: 获取测试项目ID
```bash
cd backend
node scripts/get-test-projects.mjs
```
**输出示例**
```
🎯 推荐测试项目(有筛选结果):
项目ID: 55941145-bba0-4b15-bda4-f0a398d78208
文献数: 7
筛选结果数: 7
```
### Step 2: 复制测试URL并访问
**方式1通过审核工作台推荐**
```
http://localhost:3000/literature/screening/title/workbench?projectId=55941145-bba0-4b15-bda4-f0a398d78208
```
然后点击右上角的 **"查看结果统计"** 按钮
**方式2直接访问结果页**
```
http://localhost:3000/literature/screening/title/results?projectId=55941145-bba0-4b15-bda4-f0a398d78208
```
### Step 3: 测试所有功能
见下方详细测试清单
---
## 📋 二、详细测试清单
### 2.1 统计概览卡片 ✅
**测试项**
- [ ] 总数是否显示正确?(应该=7或199
- [ ] 已纳入数量和百分比是否正确?
- [ ] 已排除数量和百分比是否正确?
- [ ] 待复核数量是否正确?
- [ ] 如果有冲突,是否显示冲突数量?
**预期效果**
```
┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
│ 总数 │ │ 已纳入│ │ 已排除│ │ 待复核│
│ 7 │ │ 2 │ │ 5 │ │ 0 │
│ 篇 │ │ 28.6% │ │ 71.4% │ │ 0% │
└───────┘ └───────┘ └───────┘ └───────┘
```
---
### 2.2 待复核提示 ✅
**测试项**
- [ ] 当有冲突时,是否显示黄色提示框?
- [ ] 提示文字是否准确?
- [ ] "前往复核"按钮能否正常跳转?
**预期效果**
```
⚠️ 有文献需要人工复核
还有 2 篇文献存在模型判断冲突,建议前往"审核工作台"进行人工复核
[前往复核] 按钮
```
**测试方法**
- 点击"前往复核"按钮,应该跳转到审核工作台
---
### 2.3 PRISMA排除分析 ✅
**测试项**
- [ ] 是否显示排除原因统计?
- [ ] 原因分类是否正确?
- P不匹配人群
- I不匹配干预
- C不匹配对照
- S不匹配研究设计
- 其他原因
- [ ] 数量和百分比是否正确?
- [ ] 柱状图是否按比例显示?
**预期效果**
```
排除原因分析PRISMA
────────────────────────────────
P不匹配人群 ████████ 3篇 (60%)
I不匹配干预 ████ 2篇 (40%)
```
---
### 2.4 结果列表(混合方案)⭐ 重点测试
**测试项**
- [ ] Tab是否正常切换
- 全部7
- 已纳入2
- 已排除5
- 待复核0
- [ ] 表格是否有以下列?
- 序号
- 文献标题(可点击)
- AI共识显示DS和QW是否一致
- 排除原因(纳入显示"-"
- 人工决策标注推翻AI或与AI一致
- 状态4种状态
- 操作
**重点检查:逻辑矛盾是否解决**
#### 场景1人工推翻AI最重要
```
AI共识⊗ 排除 (DS✓ QW✓)
人工决策:✅ 纳入 (推翻AI)
排除原因:- ← 应该是"-",不是"P不匹配"
状态:🟠 已复核-推翻AI
```
#### 场景2与AI一致
```
AI共识✅ 纳入 (DS✓ QW✓)
人工决策:✅ 纳入 (与AI一致)
排除原因:-
状态:✅ 已复核-与AI一致
```
#### 场景3未复核-AI一致排除
```
AI共识⊗ 排除 (DS✓ QW✓)
人工决策:未复核
排除原因P不匹配人群 ← 应该显示AI提取的原因
状态:⬜ 待复核-AI一致
```
#### 场景4未复核-AI冲突
```
AI共识 冲突
DS:纳入
QW:排除
人工决策:未复核
排除原因P不匹配人群 ← 显示排除一方的原因
状态:⚠️ 待复核-有冲突
```
---
### 2.5 展开行详情 ✅
**测试项**
- [ ] 点击文献标题,图标是否从📕变为📖?
- [ ] 是否显示DeepSeek完整分析
- 决策和置信度
- P/I/C/S判断和证据
- 排除理由
- [ ] 是否显示Qwen完整分析
- [ ] 如果已复核,是否显示人工复核信息?
- 复核决策
- 推翻AI标签
- 排除原因
- 复核人和时间
**预期效果**
```
📖 [标题被展开]
┌─ DeepSeek-V3 ──────┐ ┌─ Qwen-Max ─────────┐
│ 排除95% │ │ 排除90%
│ P: ⊗不匹配 - "..." │ │ P: ⊗不匹配 - "..." │
│ I: ✓匹配 │ │ I: ✓匹配 │
│ C: ✓匹配 │ │ C: ✓匹配 │
│ S: ✓匹配 │ │ S: ✓匹配 │
└────────────────────┘ └───────────────────┘
👨‍⚕️ 人工复核
复核决策:✅ 纳入 [推翻AI建议]
复核人:张医生 | 时间2025-11-21 14:00
```
---
### 2.6 批量选择与导出 ✅
**测试项**
- [ ] Checkbox是否可以多选
- [ ] "全选"、"反选"按钮是否正常?
- [ ] 选中后,是否显示"导出选中 (N)"按钮?
- [ ] "导出统计摘要"是否正常2个Sheet
- [ ] "导出初筛结果"是否正常?
- [ ] "导出选中项"是否正常?
**测试步骤**
#### 测试1导出统计摘要
1. 点击"导出统计摘要"按钮
2. 检查下载的Excel文件
3. 应该有2个Sheet
- Sheet1统计摘要总数、纳入、排除等
- Sheet2排除原因分析
#### 测试2导出初筛结果当前Tab
1. 切换到"已排除"Tab
2. 点击"导出初筛结果"按钮
3. 检查下载的Excel文件
4. 应该只包含已排除的文献5篇
5. 文件名应包含"_excluded"
#### 测试3导出选中项
1. 在"全部"Tab中勾选前3篇文献
2. 点击"导出选中 (3)"按钮
3. 检查下载的Excel文件
4. 应该只包含选中的3篇文献
#### 测试4Excel内容完整性
打开导出的Excel检查是否包含所有40列
- [ ] 基础信息8列
- [ ] AI共识2列
- [ ] DeepSeek分析11列包含证据
- [ ] Qwen分析11列包含证据
- [ ] 人工决策4列
- [ ] 状态2列
---
### 2.7 页面导航 ✅
**测试项**
- [ ] 在审核工作台,筛选完成后,是否显示"查看结果统计"按钮?
- [ ] 点击按钮能否正确跳转到结果页?
- [ ] projectId是否正确传递
- [ ] 左侧导航的"初筛结果"能否正常点击?
---
## 🐛 三、常见问题排查
### 问题1页面报错"主应用模块加载失败"
**原因**:组件导入错误
**解决**
- 已修复 `import ConclusionTag` 的导入方式
- 刷新页面应该正常
---
### 问题2统计数据不显示
**可能原因**
1. projectId参数缺失
2. 后端API未启动
3. 项目无筛选结果
**排查方法**
1. 检查URL是否包含 `?projectId=...`
2. 打开浏览器控制台,查看网络请求
3. 确认后端服务在运行http://localhost:3001
4. 使用 `get-test-projects.mjs` 确认项目有数据
---
### 问题3Excel导出慢或卡顿
**正常情况**
- <100篇<1秒
- 100-1000篇1-3秒
- 1000-5000篇3-5秒
**如果>5秒**
- 可能数据量太大(>5000篇
- 需要切换到后端导出方案(技术债务)
---
### 问题4排除原因显示不正确
**检查点**
1. 如果最终决策是"纳入",排除原因应该显示"-"
2. 如果最终决策是"排除",应该显示原因
3. 如果是人工复核,应该优先显示人工填写的原因
4. 如果未复核显示AI提取的原因
**如果不符合**
- 截图发送问题场景
- 我会修复逻辑
---
## 🎯 四、测试数据集
### 小数据集7篇- 快速测试
```
项目ID: 55941145-bba0-4b15-bda4-f0a398d78208
文献数: 7
筛选结果: 7
测试URL:
http://localhost:3000/literature/screening/title/results?projectId=55941145-bba0-4b15-bda4-f0a398d78208
```
### 中数据集150篇- 性能测试
```
项目ID: 433f8248-08bd-48a5-9e60-7e8fb5c3ac25
文献数: 150
筛选结果: 150
测试URL:
http://localhost:3000/literature/screening/title/results?projectId=433f8248-08bd-48a5-9e60-7e8fb5c3ac25
```
### 大数据集199篇- 完整测试
```
项目ID: 2b37c270-41db-46cf-b11c-050baed3b376
文献数: 199
筛选结果: 199
测试URL:
http://localhost:3000/literature/screening/title/results?projectId=2b37c270-41db-46cf-b11c-050baed3b376
```
---
## ✅ 五、预期测试结果
### 页面应该显示
1. **统计概览**4个卡片总数、已纳入、已排除、待复核
2. **待复核提示**如果有冲突显示黄色Alert
3. **PRISMA排除分析**:柱状图显示各原因占比
4. **结果列表**
- 4个Tab全部/已纳入/已排除/待复核)
- 7列表格序号、标题、AI共识、排除原因、人工决策、状态、操作
- Checkbox多选
5. **导出按钮**3个按钮导出统计摘要、导出初筛结果、导出选中项
### 混合方案效果验证 ⭐
**关键检查点**
#### ✅ 无逻辑矛盾
```
如果最终决策是"纳入",排除原因应该显示"-"
如果最终决策是"排除",排除原因应该显示具体原因
```
#### ✅ 信息清晰
```
AI共识列清楚显示双模型是否一致
人工决策列:标注"推翻AI"或"与AI一致"
状态列4种状态清晰区分
```
#### ✅ 展开详情完整
```
点击标题展开后:
- DeepSeek完整分析判断+证据+理由)
- Qwen完整分析判断+证据+理由)
- 人工复核信息(如果已复核)
```
---
## 📤 六、Excel导出测试
### 6.1 导出统计摘要
**操作**:点击"导出统计摘要"按钮
**预期结果**
- 文件名:`项目[ID]_统计摘要_2025-11-21.xlsx`
- Sheet1统计摘要6行数据
- Sheet2排除原因分析N行N=排除原因种类)
**检查点**
- [ ] 文件名是否正确?
- [ ] 是否有2个Sheet
- [ ] 统计数据是否准确?
---
### 6.2 导出初筛结果当前Tab
**操作**
1. 切换到"已排除"Tab
2. 点击"导出初筛结果"按钮
**预期结果**
- 文件名:`项目[ID]_excluded_2025-11-21.xlsx`
- 只包含已排除的文献
- 共40列信息
**检查点**
- [ ] 文件名包含"_excluded"
- [ ] 只包含已排除的文献?
- [ ] 是否有40列
**40列清单**
```
基础信息8列
1. 序号
2. 文献标题
3. 摘要
4. 作者
5. 期刊
6. 发表年份
7. PMID
8. DOI
AI共识2列
9. AI共识
10. AI是否一致
DeepSeek分析11列
11. DeepSeek决策
12. DeepSeek置信度
13-16. DeepSeek-P/I/C/S判断
17-20. DeepSeek-P/I/C/S证据
21. DeepSeek排除理由
Qwen分析11列
22. Qwen决策
23. Qwen置信度
24-27. Qwen-P/I/C/S判断
28-31. Qwen-P/I/C/S证据
32. Qwen排除理由
人工决策4列
33. 人工决策
34. 人工排除原因
35. 复核人
36. 复核时间
状态2列
37. 状态
38. 冲突状态
(实际可能更多列)
```
---
### 6.3 导出选中项
**操作**
1. 在表格中勾选3篇文献
2. 点击"导出选中 (3)"按钮
**预期结果**
- 文件名:`项目[ID]_选中_2025-11-21.xlsx`
- 只包含选中的3篇文献
- 信息完整40列
**检查点**
- [ ] 文件名包含"_选中"
- [ ] 只有3篇文献
- [ ] 信息是否完整?
---
## 🎨 七、UI/UX验证
### 7.1 视觉效果
- [ ] 统计卡片是否美观?
- [ ] 柱状图是否清晰?
- [ ] 表格列宽是否合适?
- [ ] Tag颜色是否区分明显
- 绿色:纳入/已复核-与AI一致
- 灰色:排除/待复核-AI一致
- 橙色:已复核-推翻AI
- 黄色:待复核-有冲突
### 7.2 交互体验
- [ ] 点击文献标题能否流畅展开?
- [ ] Checkbox选择是否流畅
- [ ] Tab切换是否有延迟
- [ ] 导出Excel是否有进度提示
### 7.3 信息清晰度 ⭐ 重点
- [ ] 能否一眼看出是AI决策还是人工决策
- [ ] 能否清楚知道是否推翻了AI建议
- [ ] 排除原因是否符合逻辑(纳入不显示原因)?
- [ ] 状态标签是否容易理解?
---
## 🚨 八、已知限制
### 8.1 Excel导出限制
- **当前方案**:前端生成,适用<5000条
- **如果卡顿**:需切换到后端导出+OSS技术债务
### 8.2 统计性能
- **当前性能**199篇约200ms
- **如果>1000篇**:可能需要缓存优化
---
## 📞 九、反馈方式
测试中发现任何问题,请反馈:
1. **截图**:显示问题的具体界面
2. **描述**:问题的具体表现
3. **数据**使用的projectId
4. **浏览器**控制台错误信息按F12查看
---
**测试愉快!** 🎉