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")