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

View File

@@ -1,10 +1,10 @@
# AI智能文献模块 - 数据库设计
> **文档版本:** v2.0
> **文档版本:** v2.2
> **创建日期:** 2025-10-29
> **维护者:** AI智能文献开发团队
> **最后更新:** 2025-11-18
> **更新说明:** 基于实际实现代码更新,采用 asl_schema 隔离架构
> **最后更新:** 2025-11-21Week 4完成
> **更新说明:** Week 4统计功能完成混合方案实现排除原因字段说明
---
@@ -54,7 +54,10 @@ model AslScreeningProject {
// PICO标准
picoCriteria Json @map("pico_criteria")
// 结构: { population, intervention, comparison, outcome, studyDesign }
// ⚠️ 格式兼容性说明:
// 前端使用: { P, I, C, O, S }
// 后端兼容: { P, I, C, O, S } 或 { population, intervention, comparison, outcome, studyDesign }
// screeningService.ts 中有字段映射逻辑
// 筛选标准
inclusionCriteria String @map("inclusion_criteria") @db.Text
@@ -66,7 +69,11 @@ model AslScreeningProject {
// 筛选配置
screeningConfig Json? @map("screening_config")
// 结构: { models: ["deepseek-chat", "qwen-max"], temperature: 0 }
// 结构: { models: ["DeepSeek-V3", "Qwen-Max"], style: "standard" }
// ⚠️ 模型名称映射:
// 前端展示名: DeepSeek-V3 → API名: deepseek-chat
// 前端展示名: Qwen-Max → API名: qwen-max
// screeningService.ts 中有模型名映射逻辑
// 关联
literatures AslLiterature[]
@@ -226,11 +233,21 @@ model AslScreeningResult {
conflictFields Json? @map("conflict_fields")
// 示例: ["P", "I", "conclusion"]
// 最终决策
finalDecision String? @map("final_decision") // "include" | "exclude" | "pending"
// 最终决策Week 4 混合方案使用)
finalDecision String? @map("final_decision") // "include" | "exclude" | null
// ⭐ Week 4 说明:人工复核后设置此字段,作为最终决策
// - include: 人工决定纳入可能推翻AI建议
// - exclude: 人工决定排除可能推翻AI建议
// - null: 未复核使用AI决策
finalDecisionBy String? @map("final_decision_by") // userId
finalDecisionAt DateTime? @map("final_decision_at")
exclusionReason String? @map("exclusion_reason") @db.Text
// ⭐ Week 4 说明人工填写的排除原因优先级高于AI提取
// - 如果finalDecision=exclude此字段存储人工填写的原因
// - 如果为null前端自动从AI判断中提取dsPJudgment/dsIJudgment等
// - Week 4 初筛结果页使用此字段显示排除原因
// AI处理状态
aiProcessingStatus String @default("pending") @map("ai_processing_status")

View File

@@ -1,10 +1,10 @@
# AI智能文献模块 - API设计规范
> **文档版本:** v2.0
> **文档版本:** v2.1
> **创建日期:** 2025-10-29
> **维护者:** AI智能文献开发团队
> **最后更新:** 2025-11-18
> **更新说明:** 基于实际实现代码更新,所有接口已测试验证
> **最后更新:** 2025-11-21
> **更新说明:** 更新实际API格式、字段映射说明、测试数据示例
---
@@ -47,11 +47,11 @@
{
"projectName": "SGLT2抑制剂系统综述",
"picoCriteria": {
"population": "2型糖尿病成人患者",
"intervention": "SGLT2抑制剂",
"comparison": "安慰剂或常规降糖疗法",
"outcome": "心血管结局",
"studyDesign": "随机对照试验 (RCT)"
"P": "2型糖尿病成人患者",
"I": "SGLT2抑制剂empagliflozin、dapagliflozin等",
"C": "安慰剂或常规降糖疗法",
"O": "心血管结局MACE、心衰住院、心血管死亡",
"S": "随机对照试验 (RCT)"
},
"inclusionCriteria": "英文文献RCT研究2010年后发表",
"exclusionCriteria": "病例报告,综述,动物实验",
@@ -818,10 +818,64 @@ Body (raw JSON):
---
**文档版本:** v2.0
**最后更新:** 2025-11-18
---
## 🆕 Week 4 新增API
### 4.1 获取项目统计数据(云原生:后端聚合)
**接口**: `GET /api/v1/asl/projects/:projectId/statistics`
**认证**: 需要
**说明**: 获取项目的筛选统计数据(总数、纳入率、排除率、排除原因分析等)
**路径参数**:
- `projectId`: 项目ID
**响应示例**:
```json
{
"success": true,
"data": {
"total": 199,
"included": 85,
"excluded": 90,
"pending": 24,
"conflict": 24,
"reviewed": 175,
"exclusionReasons": {
"P不匹配人群": 40,
"I不匹配干预": 25,
"S不匹配研究设计": 15,
"其他原因": 10
},
"includedRate": "42.7",
"excludedRate": "45.2",
"pendingRate": "12.1"
}
}
```
**特点**
- ✅ 云原生后端Prisma聚合查询6个并行查询
- ✅ 性能:<500ms199篇文献
- ✅ 减少网络传输从MB级降到KB级
**测试命令**:
```bash
curl http://localhost:3001/api/v1/asl/projects/55941145-bba0-4b15-bda4-f0a398d78208/statistics
```
---
**文档版本:** v2.2
**最后更新:** 2025-11-21Week 4完成
**维护者:** AI智能文献开发团队
**本次更新**
- ✅ 新增统计API接口
- ✅ 更新PICOS格式说明P/I/C/O/S
- ✅ 添加云原生架构标注
---
## 📚 相关文档