Files
HaHafeng 66255368b7 feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
2026-01-16 13:42:10 +08:00

1219 lines
36 KiB
Markdown
Raw Permalink 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.
# ASL 模块任务分解To-do List
> **文档版本:** V3.2
> **创建日期:** 2025-11-16
> **适用阶段:** MVP标题摘要初筛
> **预计周期:** 4 周
> **最后更新:** 2025-11-21
> **⭐ 重要基于真实架构Frontend-v2 + Backend + asl_schema**
> **📊 MVP核心功能进度** ✅ 100% 完成Week 1-3 提前完成)
> **📊 质量优化进度:** 🔄 60% 完成准确率60%目标85%
---
## 📋 使用说明
本文档是 **ASL 标题摘要初筛模块** 的详细任务分解清单,基于 **真实的架构基础**
- ✅ Frontend-v2顶部导航 + 模块注册)- Week 2 已完成
- ✅ Backend 增量演进legacy/ + common/ + modules/- Week 2 已完成
- ✅ 数据库 10个Schema隔离 - Week 1 已完成
**任务状态标记**
- `[ ]` - 待开始
- `[🔄]` - 进行中
- `[✅]` - 已完成
- `[❌]` - 已取消/跳过
---
## 🌥️ 云原生开发要求2025-11-16 新增)
> **⭐ 重要提醒**:所有任务必须遵循云原生开发规范
> **详细规范**[云原生开发规范](../../../04-开发规范/08-云原生开发规范.md)
### 核心要求
| 要求 | 说明 |
|------|------|
| ✅ **存储抽象层** | 使用 `StorageFactory`,支持本地/OSS切换 |
| ✅ **内存解析** | Excel导入使用 `xlsx.read(buffer)`,不落盘 |
| ✅ **异步任务** | LLM筛选必须异步处理> 10秒 |
| ✅ **环境变量** | 所有配置从 `.env` 读取 |
| ✅ **数据库连接池** | 使用全局 `prisma` 实例 |
| ✅ **OSS字段预留** | `pdfUrl`, `pdfOssKey`, `pdfFileSize` |
### 每日检查清单
提交代码前必须确认:
- [ ] 是否使用存储抽象层?
- [ ] 是否避免文件落盘?
- [ ] 是否使用全局 prisma 实例?
- [ ] 是否所有配置都从环境变量读取?
- [ ] 长时间任务是否异步处理?
---
## 🗓️ Week 1: 数据库Schema与后端API框架Day 1-5✅ 已完成
**完成日期**: 2025-11-18
**实际耗时**: 1天提前4天
**完成报告**: [Week 1完成报告](../05-开发记录/2025-11-18-Week1完成报告.md)
**API测试**: [ASL-API测试报告](../../../../backend/ASL-API-测试报告.md)
### Day 1: Prisma Schema 设计 ✅
#### 数据库任务
- [✅] **T1.1.1** 设计 asl_schema 表结构
- 文件:`backend/prisma/schema.prisma`
- 新增4个模型
- `AslScreeningProject`(筛选项目表)
- `AslLiterature`(文献条目表)
- `AslScreeningResult`(筛选结果表)
- `AslScreeningTask`(筛选任务表)
- 使用 `@@schema("asl_schema")` 指定Schema
- **⭐ 新增要求(云原生)**:在 `AslLiterature` 中添加 OSS 字段
- `pdfUrl String? @map("pdf_url")` - PDF访问URL
- `pdfOssKey String? @map("pdf_oss_key")` - OSS存储Key
- `pdfFileSize Int? @map("pdf_file_size")` - 文件大小(字节)
- 说明MVP阶段预留V1.0阶段使用
- 预计耗时2 小时
- 负责人:后端开发
- 参考:`02-标题摘要初筛开发计划.md` Week 1 Day 1
- [✅] **T1.1.2** 在 User 模型中添加关联
```prisma
// backend/prisma/schema.prisma - User模型添加
aslProjects AslScreeningProject[] @relation("AslProjects")
```
- 实际耗时5 分钟
- 完成人AI Assistant
- [✅] **T1.1.3** 运行 Prisma 迁移
```bash
cd backend
npx tsx scripts/create-asl-tables.ts # 手动SQL创建
```
- 实际耗时10 分钟
- 完成人AI Assistant
- [✅] **T1.1.4** 生成 Prisma Client
```bash
npx prisma generate
```
- 实际耗时3 分钟
- 完成人AI Assistant
- [✅] **T1.1.5** 验证数据库表创建
- 使用脚本验证数据库
- 检查 asl_schema 下的4个表 ✅
- 检查索引和外键 ✅
- 实际耗时5 分钟
- 完成人AI Assistant
**Day 1 验收标准** ✅:
- ✅ asl_schema 4张表创建成功
- ✅ Prisma Client 生成无错误
- ✅ 可查询 asl_schema 表
---
### Day 2: 后端目录结构创建 ✅
> **⭐ 前置条件2025-11-17 更新)**:平台基础设施已完成实施 ✅
> **完成状态**8个核心模块100%测试通过
> **完成报告**[平台基础设施实施完成报告](../../../08-项目管理/03-每周计划/2025-11-17-平台基础设施实施完成报告.md)
> **使用指南**[backend/src/common/README.md](../../../../backend/src/common/README.md)
#### 平台已提供的8个核心模块ASL模块无需实现
**平台基础设施已完成2025-11-17**
| # | 服务 | 路径 | 使用方式 | 说明 |
|---|------|------|---------|------|
| 1 | 存储服务 | `common/storage/` | `import { storage } from '@/common/storage'` | 文件上传下载(本地/OSS切换 |
| 2 | 日志系统 | `common/logging/` | `import { logger } from '@/common/logging'` | 结构化JSON日志 |
| 3 | 缓存服务 | `common/cache/` | `import { cache } from '@/common/cache'` | 内存/Redis缓存 |
| 4 | 异步任务 | `common/jobs/` | `import { jobQueue } from '@/common/jobs'` | 长时间任务处理 |
| 5 | 健康检查 | `common/health/` | `import { registerHealthRoutes } from '@/common/health'` | SAE健康检查 |
| 6 | 监控指标 | `common/monitoring/` | `import { Metrics } from '@/common/monitoring'` | 性能监控和告警 |
| 7 | 数据库连接池 | `config/database.ts` | `import { prisma } from '@/config/database'` | 全局Prisma实例 |
| 8 | 环境配置 | `config/env.ts` | `import { env } from '@/config/env'` | 统一配置管理 |
**示例代码**
```typescript
// ASL模块直接使用平台服务
import { storage, logger, cache, jobQueue } from '@/common'
import { prisma } from '@/config/database'
import { Metrics } from '@/common/monitoring'
// 上传文件
const url = await storage.upload('asl/literature/123.pdf', pdfBuffer)
// 记录日志
logger.info('Literature uploaded', { projectId, url })
// 缓存数据
await cache.set(`project:${projectId}`, data, 3600)
// 创建异步任务
const job = await jobQueue.push('asl:screening', { projectId })
// 记录监控指标
Metrics.recordAPIResponseTime('POST', '/api/v1/asl/screening', 200, 150)
```
**⚠️ 禁止的操作(必须遵守)**
| 禁止操作 | 正确做法 | 原因 |
|---------|---------|------|
| `fs.writeFileSync()` | 使用 `storage.upload()` | Serverless容器重启丢失文件 |
| `new PrismaClient()` | 使用全局 `prisma` 实例 | 避免连接数暴增(已配置连接池) |
| 硬编码配置 | 使用 `process.env` 或 `env` | 配置管理混乱 |
| 同步处理LLM批量任务 | 使用 `jobQueue.push()` | 避免Serverless超时 |
| 直接使用 `console.log()` | 使用 `logger.info()` | 日志格式标准化 |
| 自己实现缓存逻辑 | 使用 `cache.set()` / `cache.get()` | 平台已提供分布式缓存 |
---
#### 后端任务
- [✅] **T1.2.1** 创建 ASL 模块目录结构
```bash
cd backend/src/modules
mkdir -p asl/{routes,controllers,services,schemas,types,utils}
```
- 预计耗时5 分钟
- 负责人:后端开发
- [ ] **T1.2.2** 创建路由文件
- `routes/index.ts` - 路由注册
- 实现占位函数返回404或空数组
- 预计耗时30 分钟
- 负责人:后端开发
- [ ] **T1.2.3** 创建控制器文件
- `controllers/projectController.ts` - 项目控制器
- `controllers/literatureController.ts` - 文献控制器
- `controllers/screeningController.ts` - 筛选控制器
- 创建占位函数每个控制器5-7个函数
- 预计耗时1 小时
- 负责人:后端开发
- [ ] **T1.2.4** 创建服务层文件
- `services/projectService.ts` - 项目业务逻辑
- `services/literatureService.ts` - 文献业务逻辑
- `services/llmScreeningService.ts` - LLM筛选服务
- 预计耗时30 分钟
- 负责人:后端开发
- [✅] **T1.2.5** 创建类型定义文件
```typescript
// types/screening.types.ts
export interface Literature { ... }
export interface ScreeningResult { ... }
export interface Protocol { ... }
```
- 预计耗时30 分钟
- 负责人:后端开发
**Day 2 验收标准** ✅:
- ✅ ASL 模块目录结构完整5个子目录9个文件
- ✅ 所有占位文件创建完成
- ✅ **可正常使用平台服务8个核心模块**
- ✅ `import { storage } from '@/common/storage'` 可用
- ✅ `import { logger } from '@/common/logging'` 可用
- ✅ `import { cache } from '@/common/cache'` 可用
- ✅ `import { jobQueue } from '@/common/jobs'` 可用
- ✅ `import { prisma } from '@/config/database'` 可用
- ✅ `import { Metrics } from '@/common/monitoring'` 可用
---
### Day 3: 注册ASL路由 ✅
#### 后端任务
- [✅] **T1.3.1** 实现 `routes/index.ts`
- 注册所有API路由
- 参考 `legacy/routes/` 的风格
- 预计耗时1 小时
- 负责人:后端开发
- 参考:`02-标题摘要初筛开发计划.md` Week 1 Day 2
- [✅] **T1.3.2** 在 `src/index.ts` 中注册ASL路由
```typescript
import { aslRoutes } from './modules/asl/routes/index.js'
await app.register(aslRoutes, { prefix: '/api/v1/asl' })
console.log('✅ ASL 路由已注册到 /api/v1/asl/*')
```
- 预计耗时10 分钟
- 负责人:后端开发
- [✅] **T1.3.3** 测试路由可访问性
```bash
# 启动后端服务
cd backend && npm run dev
# 测试健康检查
curl http://localhost:3001/api/v1/asl/projects
```
- 预计耗时10 分钟
- 负责人:后端开发
**Day 3 验收标准** ✅:
- ✅ 后端服务正常启动
- ✅ ASL路由注册成功/api/v1/asl
- ✅ API可访问10个端点
---
### Day 4-5: 实现基础API ✅
#### 后端任务
- [✅] **T1.4.1** 实现 `projectService.ts`
- `createProject(userId, data)` - 创建项目
- `listProjects(userId)` - 获取项目列表
- `getProject(projectId)` - 获取项目详情
- 使用 Prisma Client 操作 asl_schema
- 预计耗时2 小时
- 负责人:后端开发
- [✅] **T1.4.2** 实现 `projectController.ts`
- `createProject` - 控制器
- `listProjects` - 控制器
- `getProject` - 控制器
- 请求验证、响应格式化
- 预计耗时1.5 小时
- 负责人:后端开发
- [✅] **T1.4.3** 实现 `literatureService.ts`
- `importBatch(projectId, literatures)` - 批量导入
- `listLiteratures(projectId, page, pageSize)` - 分页查询
- 去重逻辑基于DOI和标题
- 预计耗时2 小时
- 负责人:后端开发
- [✅] **T1.4.4** 实现 `literatureController.ts`
- `importLiteratures` - 导入控制器
- `listLiteratures` - 列表控制器
- Excel数据验证
- 预计耗时1.5 小时
- 负责人:后端开发
- [✅] **T1.4.5** API测试完整测试脚本
- 创建 Postman 测试集合
- 测试所有已实现的API
- 预计耗时1 小时
- 负责人:后端开发
**Day 4-5 验收标准** ✅:
- ✅ 项目管理API可调用5个接口
- ✅ 文献导入API可调用4个接口
- ✅ 数据正确保存到 asl_schema
- ✅ 所有测试通过7/7 - 100%
---
## 🗓️ Week 2: LLM筛选核心Day 6-10✅ 已完成
**完成日期**: 2025-11-21
**实际耗时**: 3天
**完成报告**: [Prompt设计与测试完成报告](../05-开发记录/2025-11-18-Prompt设计与测试完成报告.md)
**实际准确率**: 60%目标85%,需优化)
### Day 6: JSON Schema 与提示词设计 ✅
#### 后端任务
- [✅] **T2.1.1** 定义 JSON Schema
- 文件:`backend/src/modules/asl/schemas/screening.schema.ts`
- 定义输出结构decision, reason, confidence, pico
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.1.2** 安装验证库
```bash
cd backend
npm install ajv
```
- 实际耗时5 分钟
- 完成人AI Assistant
- [✅] **T2.1.3** 编写 Schema 验证函数
- 使用 `Ajv` 验证
- 错误信息格式化
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T2.1.4** 设计提示词模板 v1.0.0
- 文件:`backend/prompts/asl/screening/v1.0.0-mvp.txt`
- 包含PICO标准、纳排标准、输出格式
- 实际耗时4 小时
- 完成人AI Assistant + 用户
- [✅] **T2.1.5** 人工测试提示词
- 手动调用 LLM使用 10 篇样本)
- 评估输出质量
- 迭代优化提示词
- 实际耗时2 小时
- 完成人AI Assistant + 用户
**Day 6 验收标准** ✅:
- ✅ JSON Schema 定义完成
- ⚠️ 提示词人工测试准确率 60%目标80%,需后续优化)
---
### Day 7: LLM 服务封装 ✅
#### 后端任务
- [✅] **T2.2.1** 创建 `llmScreeningService.ts`
- 实际耗时10 分钟
- 完成人AI Assistant
- [✅] **T2.2.2** 实现 `callModel` 方法
- 调用 `LLMFactory.createLLM()`(复用 common/llm
- 设置参数temperature: 0
- 错误处理
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.2.3** 实现 `parseModelOutput` 方法
- JSON 解析(使用 `common/utils/jsonParser.js`
- Schema 验证
- 格式化为 `ModelDecision`
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.2.4** 实现 `compareDecisions` 方法
- 对比两个模型的 PICO 判断
- 识别冲突字段(仅结论不一致)
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.2.5** 实现 `shouldReview` 方法
- 自动分流规则
- 置信度阈值(< 0.7
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T2.2.6** 实现 `dualModelScreening` 方法
- 并行调用两个模型(`Promise.all`
- 汇总结果
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.2.7** 单元测试
- 测试 JSON 解析
- 测试冲突检测
- 测试分流规则
- 实际耗时2 小时
- 完成人AI Assistant
**Day 7 验收标准** ✅:
- ✅ 可成功调用 DeepSeek 和 Qwen3
- ✅ JSON Schema 验证通过率 100%
- ✅ 冲突检测准确(仅结论不一致)
---
### Day 8: 批量筛选任务管理 ✅
#### 后端任务
- [✅] **T2.3.1** 实现 `batchScreening` 方法
- 串行处理避免API限流
- 进度计算
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T2.3.2** 实现任务创建
- `screeningService.startScreeningTask`
- 初始化任务记录AslScreeningTask表
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.3.3** 实现任务状态更新
- `screeningService.processLiteraturesInBackground`
- 更新 processedItems, deepseekProcessed, qwenProcessed 等
- 实际耗时1.5 小时
- 完成人AI Assistant
- [✅] **T2.3.4** 实现结果保存
- 单篇保存到 `AslScreeningResult` 表
- 冲突检测(仅结论不一致)
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T2.3.5** 错误处理和重试
- 单篇失败不影响整体
- 记录错误信息
- 实际耗时1 小时
- 完成人AI Assistant
**Day 8 验收标准** ✅:
- ✅ 可批量处理 199 篇文献(串行)
- ✅ 任务状态正确记录
- ✅ 结果正确保存到数据库
- ✅ 进度实时更新每1条
---
### Day 9: 筛选 API 开发 ✅
#### 后端任务
- [✅] **T2.4.1** 实现启动筛选 API
- 自动在文献导入后启动(`literatureController.importLiteratures`
- 创建任务
- **⭐ 云原生要求**异步执行筛选立即返回taskId后台处理
- 避免请求超时SAE默认30秒超时限制
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T2.4.2** 实现进度查询 API
- `GET /api/v1/asl/projects/:projectId/screening-task`
- 返回实时进度总数、已处理、成功、冲突、失败、DS处理数、Qwen处理数
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.4.3** 实现结果查询 API
- `GET /api/v1/asl/projects/:projectId/screening-results`
- 支持过滤all, conflict, included, excluded, reviewed
- 分页(后端分页)
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T2.4.4** 实现更新决策 API
- `POST /api/v1/asl/screening-results/:resultId/review`
- 人工复核提交
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T2.4.5** Postman 测试
- 创建测试集合
- 测试各种场景
- 实际耗时1 小时
- 完成人AI Assistant
**Day 9 验收标准** ✅:
- ✅ API 调用成功
- ✅ 任务可异步执行
- ✅ 进度查询实时准确1秒轮询
---
### Day 10: 后端集成测试 ✅
#### 后端任务
- [✅] **T2.5.1** 端到端测试199篇文献
- 导入文献 → 自动启动筛选 → 查询结果
- 实际耗时1 小时执行 + 1小时分析
- 完成人AI Assistant + 用户
- [✅] **T2.5.2** 性能测试
- 测试 199 篇文献筛选时间
- 实际约33-66分钟串行处理
- 实际耗时1 小时
- 完成人AI Assistant + 用户
- [✅] **T2.5.3** 质量评估
- 计算准确率(对比金标准)
- 计算双模型一致率
- 计算冲突率
- 实际耗时2 小时
- 完成人AI Assistant + 用户
- **结果**准确率60%, 一致率70-100%, JSON验证率100%
- [✅] **T2.5.4** 修复 Bug
- 修复字段映射问题PICOS、模型名称
- 修复列表顺序问题
- 修复进度显示问题
- 实际耗时3 小时
- 完成人AI Assistant
**Week 2 总验收标准** ⚠️ 部分达标:
- ✅ 可成功筛选 199 篇文献
- ⚠️ 准确率 60%目标85%需Prompt优化
- ✅ 双模型一致率 70-100%
- ⚠️ 性能199篇约33-66分钟串行处理可优化为并发
- ✅ JSON Schema验证率100%
---
## 🗓️ Week 3: 前端模块开发Day 11-15✅ 已完成
**完成日期**: 2025-11-21
**实际耗时**: 2天
**完成报告**: [Week2-Day2完成报告](../05-开发记录/2025-11-19-Week2-Day2完成报告.md)
**说明**: Week 3任务实际在Week 2完成
### Day 11: 前端模块结构创建 ✅
#### 前端任务
- [✅] **T3.1.1** 更新 `modules/asl/index.tsx`
- 创建左侧导航布局ASLLayout
- 7个主模块标题摘要初筛含3个子页面
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T3.1.2** 创建 ASL 子目录
```bash
cd frontend-v2/src/modules/asl
mkdir pages components api hooks types utils
```
- 实际耗时5 分钟
- 完成人AI Assistant
- [✅] **T3.1.3** 创建路由配置
- 直接在 `index.tsx` 中使用 `<Route>` 定义
- 使用 `lazy()` 懒加载
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T3.1.4** 创建3个主页面
- `pages/TitleScreeningSettings.tsx` - 设置与启动
- `pages/ScreeningWorkbench.tsx` - 审核工作台
- `pages/ScreeningResults.tsx` - 初筛结果(占位)
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T3.1.5** 测试路由
- 启动前端:`cd frontend-v2 && npm run dev`
- 访问 `http://localhost:3001/literature`
- 确认顶部导航显示"AI智能文献"
- 实际耗时10 分钟
- 完成人AI Assistant + 用户
**Day 11 验收标准** ✅:
- ✅ 顶部导航显示"AI智能文献"
- ✅ 左侧导航显示7个模块
- ✅ 点击后进入"设置与启动"页面
---
### Day 12: Excel 上传功能 ✅
#### 前端任务
- [✅] **T3.2.1** 安装依赖
```bash
cd frontend-v2
npm install xlsx
```
- 实际耗时5 分钟
- 完成人AI Assistant
- [✅] **T3.2.2** 创建 Excel上传组件
- 集成在 `TitleScreeningSettings.tsx` 中
- 文件选择(`antd Upload.Dragger`
- 文件类型验证(.xls, .xlsx
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T3.2.3** 实现 Excel 解析逻辑
- 使用 `xlsx` 库解析
- **⭐ 云原生要求**:内存解析 `xlsx.read(buffer)`,禁止落盘
- 字段映射Title/title → title支持中英文
- 数据验证title和abstract必填
- 文件:`utils/excelUtils.ts`
- 实际耗时3 小时
- 完成人AI Assistant
- [✅] **T3.2.4** 实现去重逻辑
- 基于 DOI 去重(优先)
- 基于标题去重(标准化,去空格/标点)
- 去重统计展示
- 文件:`utils/excelUtils.ts`
- 实际耗时1.5 小时
- 完成人AI Assistant
- [✅] **T3.2.5** 实现文献预览表格
- 使用 `Ant Design Table`
- 显示序号、标题、摘要、作者、年份、期刊、PMID、DOI
- 固定列宽、Tooltip显示全文
- 无分页(内存中)
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T3.2.6** 实现Excel模板下载
- 生成包含字段说明的Excel模板
- 两个Sheet文献列表、字段说明
- 实际耗时1 小时
- 完成人AI Assistant
**Day 12 验收标准** ✅:
- ✅ 可成功上传 Excel 文件
- ✅ 解析后数据正确展示
- ✅ 去重功能正常DOI优先标题辅助
- ✅ Excel模板下载正常
---
### Day 13: API 客户端封装 ✅
#### 前端任务
- [✅] **T3.3.1** 创建 API 客户端
- `api/index.ts`
- 使用 `fetch` + 统一错误处理
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T3.3.2** 实现项目 API
- `createProject(data)`
- `listProjects()`
- `getProject(id)`
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T3.3.3** 实现文献 API
- `importLiteratures(projectId, literatures)`
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T3.3.4** 实现筛选 API
- `getScreeningTask(projectId)` - 获取任务进度
- `getScreeningResultsList(projectId, params)` - 获取结果列表
- `getScreeningResultDetail(resultId)` - 获取结果详情
- `reviewScreeningResult(resultId, data)` - 人工复核
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T3.3.5** 前后端联调
- 测试所有API调用
- 错误处理统一message提示
- Loading 状态
- 实际耗时2 小时
- 完成人AI Assistant + 用户
**Day 13 验收标准** ✅:
- ✅ API 客户端可正常调用后端
- ✅ 上传Excel后数据保存到数据库
- ✅ 自动启动筛选任务
---
### Day 14-15: 审核工作台核心UI
#### 前端任务
- [✅] **T3.4.1** 实现 `ScreeningWorkbench` 页面
- 任务进度显示轮询1秒/次)
- 双行表格结构(使用`rowSpan`
- 实际耗时3 小时
- 完成人AI Assistant
- [✅] **T3.4.2** 实现表头
- 序号、文献标题、结论、操作、模型、P、I、C、S
- 压缩列宽、模型名缩写DS/Qw
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T3.4.3** 实现主行(双行)
- 点击标题展开/收起证据
- 文献标题、DS和Qwen的PICO判断单字母
- 冲突状态(红色背景)
- 结论Tag纳入/排除)
- 实际耗时4 小时
- 完成人AI Assistant
- [✅] **T3.4.4** 实现展开行
- 显示DS和Qwen的详细PICOS判断、证据、理由
- 两栏布局左DS右Qwen
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T3.4.5** 实现冲突高亮
- 冲突行背景色浅红(仅结论不一致)
- 冲突Tag显示
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T3.4.6** 实现复核Drawer
- 使用 `Ant Design Drawer`1000px宽
- 左侧70%:文献详情、模型判断、证据
- 右侧30%人工复核表单sticky
- 实际耗时4 小时
- 完成人AI Assistant
- [✅] **T3.4.7** 实现筛选Tab
- 全部、冲突、已纳入、已排除、已复核
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T3.4.8** 实现分页
- 后端分页20条/页)
- 实际耗时30 分钟
- 完成人AI Assistant
**Day 14-15 验收标准** ✅:
- ✅ 审核工作台完整可用
- ✅ 表格可正确展示筛选结果(双行)
- ✅ 冲突项高亮显示(红色背景)
- ✅ 复核Drawer可弹出并提交
- ✅ 进度实时更新1秒轮询
- ✅ 列表顺序与Excel上传一致
---
## 🗓️ Week 4: 结果展示与集成测试Day 16-20✅ 已完成
**完成日期**: 2025-11-21
**实际耗时**: 1天3小时
**完成报告**: [Week4完成报告](../05-开发记录/2025-11-21-Week4完成报告.md)
**架构验证**: ✅ 完全符合云原生开发规范
### Day 16: 结果统计与展示 ✅
#### 前端任务
- [✅] **T4.1.1** 实现统计概览卡片
- 4个卡片总数、纳入、排除、待复核
- 使用 `Ant Design Statistic`
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T4.1.2** 实现 PRISMA 式排除总结
- 按排除原因分组统计(后端聚合)
- 柱状图展示Progress组件
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T4.1.3** 实现结果列表 Tab 页
- 全部、已纳入、已排除、待复核 Tab
- Tab数量动态显示
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T4.1.4** 实现结果表格(混合方案)
- 列序号、标题、AI共识、排除原因、人工最终决策、状态、操作
- 可点击标题展开查看双模型详细判断
- 总宽度870px无需横向滚动
- 实际耗时2 小时
- 完成人AI Assistant
- [✅] **T4.1.5** 实现后端统计API
- GET /projects/:projectId/statistics
- Prisma并行聚合查询
- 实际耗时1 小时
- 完成人AI Assistant
**Day 16 验收标准** ✅:
- ✅ 统计数据正确展示
- ✅ PRISMA 排除总结清晰
- ✅ 结果列表可正常查看
- ✅ 混合方案解决逻辑矛盾
- ✅ 云原生架构验证通过
---
### Day 17: Excel 导出功能
#### 后端任务
- [ ] **T4.2.1** 后端实现导出逻辑
- 使用 `exceljs` 库
- 生成 Excel 文件
- 预计耗时2 小时
- 负责人:后端开发
- [ ] **T4.2.2** 实现导出 API
- `GET /api/v1/asl/projects/:id/screening/results/export`
- 支持过滤参数(导出全部/仅纳入/仅排除)
- 预计耗时1.5 小时
- 负责人:后端开发
#### 前端任务
- [ ] **T4.2.3** 前端实现导出按钮
- 调用导出 API
- 下载文件
- 预计耗时1 小时
- 负责人:前端开发
- [✅] **T4.2.1** 创建Excel导出工具
- 文件:`utils/excelExport.ts`
- 使用 `xlsx` 库(前端生成,零文件落盘)
- 实际耗时1.5 小时
- 完成人AI Assistant
- [✅] **T4.2.2** 实现导出功能
- 导出统计摘要2个Sheet
- 导出初筛结果当前Tab
- 导出选中项
- 实际耗时1 小时
- 完成人AI Assistant
- [✅] **T4.2.3** Excel格式优化混合方案
- 共40列完整信息
- 包含AI共识、双模型详细判断、人工决策
- 一行显示全部信息
- 自动设置列宽
- 实际耗时30 分钟
- 完成人AI Assistant
**Day 17 验收标准** ✅:
- ✅ 可成功导出 Excel3种方式
- ✅ 导出格式规范40列
- ✅ 数据完整准确
- ✅ 云原生:前端生成,零文件落盘
---
### Day 18: 完整流程测试 ✅
#### 集成测试任务
- [✅] **T4.3.1** 端到端完整流程测试
- 上传 → 筛选 → 复核 → 统计 → 导出
- 使用真实的 7 篇测试数据
- 实际耗时1 小时
- 完成人AI Assistant + 用户
- [✅] **T4.3.2** UI/UX优化
- 修复逻辑矛盾(纳入不显示排除原因)
- 实现混合方案AI共识+人工决策)
- 优化表格宽度870px无需滚动
- 实际耗时1 小时
- 完成人AI Assistant + 用户
- [✅] **T4.3.3** 性能测试
- 统计API<500ms199篇
- Excel导出<3秒199篇
- 实际耗时30 分钟
- 完成人AI Assistant
- [✅] **T4.3.4** 创建快速测试工具
- `scripts/get-test-projects.mjs`
- 自动推荐有数据的项目
- 生成测试URL
- 实际耗时30 分钟
- 完成人AI Assistant
**Day 18 验收标准** ✅:
- ✅ 完整流程无阻塞
- ✅ 混合方案解决问题
- ✅ 性能达标
- ✅ 符合云原生规范
---
### Day 19: 质量验收
#### 质量验收任务
- [ ] **T4.4.1** 准确率测试
- 使用金标准数据集199 篇)
- 计算准确率、召回率、F1
- 目标:准确率 ≥ 85%
- 预计耗时2 小时
- 负责人AI工程师 + 医学专家
- [ ] **T4.4.2** 双模型一致性测试
- 计算一致率
- 目标:≥ 80%
- 预计耗时1 小时
- 负责人AI工程师
- [ ] **T4.4.3** JSON Schema 验证率测试
- 统计验证通过率
- 目标:≥ 95%
- 预计耗时30 分钟
- 负责人:后端开发
- [ ] **T4.4.4** 人工复核队列测试
- 统计需人工复核的比例
- 目标:≤ 20%
- 预计耗时30 分钟
- 负责人AI工程师
- [ ] **T4.4.5** 根据测试结果优化
- 调整提示词
- 调整分流阈值
- 预计耗时3 小时
- 负责人AI工程师
**Day 19 验收标准**
- ✅ 准确率 ≥ 85%
- ✅ 双模型一致率 ≥ 80%
- ✅ JSON Schema 验证通过率 ≥ 95%
- ✅ 人工复核队列 ≤ 20%
---
### Day 20: 文档与交付
#### 文档任务
- [ ] **T4.5.1** 编写用户手册
- 功能介绍
- 操作步骤
- 常见问题
- 预计耗时3 小时
- 负责人:产品经理
- [ ] **T4.5.2** 编写技术文档
- 架构设计
- API 文档
- 数据库设计
- 预计耗时2 小时
- 负责人:后端开发
- [ ] **T4.5.3** 编写测试报告
- 测试用例
- 测试结果
- 质量指标
- 预计耗时2 小时
- 负责人:测试
- [ ] **T4.5.4** 代码审查
- 代码规范检查
- 安全性检查
- 性能检查
- 预计耗时2 小时
- 负责人:技术 Leader
- [ ] **T4.5.5** 准备演示环境
- 部署到测试环境
- 准备演示数据
- 预计耗时1 小时
- 负责人:运维
**Day 20 验收标准**
- ✅ 文档完整
- ✅ 代码质量合格
- ✅ 测试报告完整
- ✅ 演示环境就绪
---
## 📊 总体验收清单2025-11-21 更新)
### 功能完整性MVP核心
- [✅] 用户可上传 Excel 文件
- [✅] Excel 格式验证正常(中英文表头)
- [✅] 文献去重功能正常DOI优先标题辅助
- [✅] AI 双模型筛选可运行DeepSeek + Qwen
- [✅] 冲突自动检测和标记(仅结论不一致)
- [✅] 人工复核界面完整DetailReviewDrawer
- [✅] 批量选择功能正常Checkbox多选
- [✅] 结果统计正确展示(统计概览+PRISMA排除分析
- [✅] Excel 导出功能正常3种导出方式
- [✅] ASL模块在顶部导航显示并可点击
- [✅] 混合方案解决逻辑矛盾AI决策+人工决策明确区分)
### 质量指标
- [⚠️] 准确率 60%**目标85%需Prompt优化**
- [✅] 双模型一致率 70-100%
- [✅] JSON Schema 验证通过率 100%
- [⚠️] 人工复核队列 20-30%目标≤20%
### 性能指标
- [⚠️] 199 篇文献筛选 33-66 分钟(串行,**可优化为3-5并发**
- [✅] Excel 上传响应 < 1 秒(内存解析)
- [✅] 页面加载 < 2 秒
### 架构验证
- [✅] ASL模块正确注册左侧导航
- [✅] 后端路由注册到 /api/v1/asl/*
- [✅] 数据保存到 asl_schema
- [✅] 复用 common/llm 成功LLMFactory
- [✅] Prisma Client 正常工作(全局实例)
- [✅] 云原生要求内存解析Excel
- [✅] 云原生要求:异步处理筛选任务
---
---
## 🚀 Phase 2: 智能Prompt生成模块Week 5-7
> **前置条件**: MVP阶段Week 1-4完成
> **开发周期**: 3周
> **优先级**: P1高级功能
> **详细设计**: [智能Prompt生成模块开发计划](../02-技术设计/07-智能Prompt生成模块开发计划.md)
### 核心目标
**解决问题**: 消除AI与人类对边界情况的理解差异
**核心流程**:
```
用户输入PICOS → AI分析边界情况 → 用户确认 → 生成自定义Prompt → 筛选
```
---
### 🗓️ Week 5: 后端开发Day 21-25
#### Day 21-22: PICOS分析服务
- [ ] **T5.1.1** 创建Prompt配置数据表
- 文件:`backend/prisma/schema.prisma`
- 新增模型:`PromptConfiguration`
- 预计耗时2小时
- [ ] **T5.1.2** 实现PICOS分析服务
- 文件:`backend/src/modules/asl/services/picosAnalyzer.ts`
- 功能调用LLM分析PICOS生成边界问题
- 预计耗时1天
- [ ] **T5.1.3** API: 分析PICOS
- 路由:`POST /api/v1/asl/prompt/analyze`
- 预计耗时3小时
#### Day 23: Prompt生成服务
- [ ] **T5.2.1** 实现Prompt生成逻辑
- 文件:`backend/src/modules/asl/services/promptGenerator.ts`
- 预计耗时1天
- [ ] **T5.2.2** API: 确认边界规则并生成Prompt
- 路由:`POST /api/v1/asl/prompt/confirm-rules`
- 预计耗时2小时
#### Day 24: Prompt保存与使用
- [ ] **T5.3.1** API: 保存最终Prompt
- 路由:`POST /api/v1/asl/prompt/save`
- 预计耗时3小时
- [ ] **T5.3.2** 修改筛选服务支持自定义Prompt
- 新增参数:`customPromptOverride?: string`
- 预计耗时2小时
#### Day 25: 测试与优化
- [ ] **T5.4.1** 单元测试
- 预计耗时3小时
- [ ] **T5.4.2** 集成测试
- 预计耗时3小时
---
### 🗓️ Week 6: 前端开发Day 26-30
#### Day 26: PICOS输入界面
- [ ] **T6.1.1** 创建PICOS配置页面
- 路径:`/asl/projects/:id/prompt-config`
- 预计耗时4小时
- [ ] **T6.1.2** PICOS输入表单组件
- 7个输入字段
- 预计耗时4小时
#### Day 27-28: 用户确认界面
- [ ] **T6.2.1** AI理解展示组件
- 显示必须纳入/排除的要素
- 预计耗时1天
- [ ] **T6.2.2** 边界问题确认组件
- 逐个确认边界问题
- 预计耗时1天
#### Day 29: Prompt编辑器
- [ ] **T6.3.1** Prompt预览与编辑组件
- 支持用户编辑和保存
- 预计耗时1天
#### Day 30: 集成与测试
- [ ] **T6.4.1** 完整流程集成
- 预计耗时3小时
- [ ] **T6.4.2** UI/UX优化
- 预计耗时3小时
---
### 🗓️ Week 7: 优化与上线Day 31-35
#### Day 31-32: 功能完善
- [ ] **T7.1.1** Prompt模板管理
- 预计耗时1天
- [ ] **T7.1.2** 在筛选任务中使用自定义Prompt
- 预计耗时4小时
#### Day 33: 测试
- [ ] **T7.2.1** 端到端测试
- 预计耗时1天
#### Day 34-35: 优化与上线
- [ ] **T7.3.1** 性能优化
- 预计耗时4小时
- [ ] **T7.3.2** 用户文档
- 预计耗时4小时
- [ ] **T7.3.3** 上线部署
- 预计耗时4小时
---
### Phase 2 验收标准
- [ ] 用户可以输入PICOS和纳排标准
- [ ] AI可以分析并生成5-8个边界问题
- [ ] 用户可以确认每个边界问题的处理方式
- [ ] 系统可以自动生成自定义Prompt
- [ ] 用户可以编辑生成的Prompt
- [ ] 筛选任务可以使用自定义Prompt
- [ ] Prompt生成准确率 ≥ 90%
---
## 📊 完整进度跟踪2025-11-21 更新)
| 阶段 | Week | 任务 | 状态 | 完成时间 | 备注 |
|------|------|------|------|----------|------|
| **MVP** | Week 1 | 数据库+后端API | ✅ | 2025-11-18 | 提前4天完成 |
| **MVP** | Week 2 | LLM筛选核心 | ✅ | 2025-11-21 | 准确率60%,需优化 |
| **MVP** | Week 3 | 前端UI设置+工作台) | ✅ | 2025-11-21 | 实际在Week 2完成 |
| **MVP** | Week 4 | 结果展示+导出 | ✅ | 2025-11-21 | **混合方案,云原生架构** |
| **MVP优化** | - | **Prompt优化** | 🔄 | - | **下一步提升至85%** |
| **MVP优化** | - | 并发处理优化 | ⏸️ | - | 3-5并发提升性能 |
| **Phase 2** | Week 5 | 智能Prompt后端 | ⬜ | - | 待MVP质量达标后开始 |
| **Phase 2** | Week 6 | 智能Prompt前端 | ⬜ | - | - |
| **Phase 2** | Week 7 | 优化+上线 | ⬜ | - | - |
---
## 📚 相关文档
- [开发里程碑](./01-开发里程碑.md)
- [标题摘要初筛开发计划](./02-标题摘要初筛开发计划.md)
- [质量保障策略](../02-技术设计/06-质量保障与可追溯策略.md)
- [技术选型](../02-技术设计/07-文献处理技术选型.md)
- [API 设计规范](../02-技术设计/02-API设计规范.md)
- [智能Prompt生成模块](../02-技术设计/07-智能Prompt生成模块开发计划.md) ⭐ **新增**
- [前后端模块化架构设计-V2](../../../00-系统总体设计/前后端模块化架构设计-V2.md)
- [Schema隔离架构设计](../../../09-架构实施/01-Schema隔离架构设计10个.md)
---
**更新日志**
- 2025-11-21: V3.3 更新Week 4功能完成结果展示+Excel导出混合方案解决逻辑矛盾
- 2025-11-21: V3.2 更新反映MVP核心功能完成状态Week 1-3已完成准确率60%需优化)
- 2025-11-18: V4.0 更新整合智能Prompt生成模块Phase 2: Week 5-7
- 2025-11-18: V3.1 更新补充平台基础设施完成状态8个核心模块禁止操作清单
- 2025-11-16: V3.0 完全重写基于真实架构Frontend-v2 + Backend + asl_schema详细到每个任务
- 2025-11-16: V2.0 完全重写,详细到每个任务(预计耗时、负责人、验收标准)
- 2025-10-29: V1.0 创建,初始占位符