# AI智能文献模块 - API设计规范

> **文档版本：** v2.0  
> **创建日期：** 2025-10-29  
> **维护者：** AI智能文献开发团队  
> **最后更新：** 2025-11-18  
> **更新说明：** 基于实际实现代码更新，所有接口已测试验证

---

## 📋 文档说明

本文档描述AI智能文献模块的API设计规范，包括接口定义、请求响应格式、错误处理等。

**API基础信息**:
- **Base URL**: `http://localhost:3001` (开发环境)
- **API前缀**: `/api/v1/asl`
- **协议**: HTTP/HTTPS
- **数据格式**: JSON
- **认证方式**: JWT Token (测试阶段支持默认用户)

---

## 🔌 API设计原则

1. **RESTful设计**: 遵循RESTful API设计规范
2. **统一响应格式**: `{ success: boolean, data?: any, error?: string }`
3. **分页支持**: 列表接口支持分页参数
4. **版本控制**: API版本化管理 (`/api/v1/...`)
5. **错误处理**: 统一的HTTP状态码和错误消息
6. **模块化路由**: `/api/v1/asl/...` 独立路由空间

---

## 📡 核心API接口

### 1. 项目管理 (Projects)

#### 1.1 创建筛选项目

**接口**: `POST /api/v1/asl/projects`  
**认证**: 需要 (测试阶段默认用户ID)  
**说明**: 创建一个新的文献筛选项目

**请求体**:
```json
{
  "projectName": "SGLT2抑制剂系统综述",
  "picoCriteria": {
    "population": "2型糖尿病成人患者",
    "intervention": "SGLT2抑制剂",
    "comparison": "安慰剂或常规降糖疗法",
    "outcome": "心血管结局",
    "studyDesign": "随机对照试验 (RCT)"
  },
  "inclusionCriteria": "英文文献，RCT研究，2010年后发表",
  "exclusionCriteria": "病例报告，综述，动物实验",
  "screeningConfig": {
    "models": ["deepseek-chat", "qwen-max"],
    "temperature": 0
  }
}
```

**响应示例**:
```json
{
  "success": true,
  "data": {
    "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
    "userId": "asl-test-user-001",
    "projectName": "SGLT2抑制剂系统综述",
    "picoCriteria": {
      "population": "2型糖尿病成人患者",
      "intervention": "SGLT2抑制剂",
      "comparison": "安慰剂或常规降糖疗法",
      "outcome": "心血管结局",
      "studyDesign": "随机对照试验 (RCT)"
    },
    "inclusionCriteria": "英文文献，RCT研究，2010年后发表",
    "exclusionCriteria": "病例报告，综述，动物实验",
    "status": "draft",
    "screeningConfig": {
      "models": ["deepseek-chat", "qwen-max"],
      "temperature": 0
    },
    "createdAt": "2025-11-18T07:30:00.000Z",
    "updatedAt": "2025-11-18T07:30:00.000Z"
  }
}
```

**测试命令**:
```bash
curl -X POST http://localhost:3001/api/v1/asl/projects \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "测试项目",
    "picoCriteria": {
      "population": "成人患者",
      "intervention": "药物A",
      "comparison": "安慰剂",
      "outcome": "主要结局",
      "studyDesign": "RCT"
    },
    "inclusionCriteria": "英文文献",
    "exclusionCriteria": "综述"
  }'
```

---

#### 1.2 获取项目列表

**接口**: `GET /api/v1/asl/projects`  
**认证**: 需要  
**说明**: 获取当前用户的所有筛选项目

**查询参数**: 无

**响应示例**:
```json
{
  "success": true,
  "data": [
    {
      "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
      "userId": "asl-test-user-001",
      "projectName": "SGLT2抑制剂系统综述",
      "picoCriteria": {...},
      "status": "screening",
      "createdAt": "2025-11-18T07:30:00.000Z",
      "updatedAt": "2025-11-18T07:35:00.000Z",
      "_count": {
        "literatures": 3,
        "screeningResults": 3
      }
    }
  ]
}
```

**测试命令**:
```bash
curl http://localhost:3001/api/v1/asl/projects
```

---

#### 1.3 获取项目详情

**接口**: `GET /api/v1/asl/projects/:projectId`  
**认证**: 需要  
**说明**: 获取指定项目的详细信息

**路径参数**:
- `projectId`: 项目ID (UUID)

**响应示例**:
```json
{
  "success": true,
  "data": {
    "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
    "userId": "asl-test-user-001",
    "projectName": "SGLT2抑制剂系统综述",
    "picoCriteria": {
      "population": "2型糖尿病成人患者",
      "intervention": "SGLT2抑制剂",
      "comparison": "安慰剂或常规降糖疗法",
      "outcome": "心血管结局",
      "studyDesign": "随机对照试验 (RCT)"
    },
    "inclusionCriteria": "英文文献，RCT研究，2010年后发表",
    "exclusionCriteria": "病例报告，综述，动物实验",
    "status": "screening",
    "screeningConfig": {
      "models": ["deepseek-chat", "qwen-max"],
      "temperature": 0
    },
    "createdAt": "2025-11-18T07:30:00.000Z",
    "updatedAt": "2025-11-18T07:35:00.000Z",
    "_count": {
      "literatures": 3,
      "screeningResults": 3,
      "screeningTasks": 1
    }
  }
}
```

**测试命令**:
```bash
curl http://localhost:3001/api/v1/asl/projects/{projectId}
```

---

#### 1.4 更新项目

**接口**: `PUT /api/v1/asl/projects/:projectId`  
**认证**: 需要  
**说明**: 更新项目信息

**路径参数**:
- `projectId`: 项目ID (UUID)

**请求体**（支持部分更新）:
```json
{
  "projectName": "更新后的项目名称",
  "status": "screening",
  "inclusionCriteria": "更新后的纳入标准"
}
```

**响应示例**:
```json
{
  "success": true,
  "data": {
    "id": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
    "projectName": "更新后的项目名称",
    "status": "screening",
    ...
  }
}
```

**测试命令**:
```bash
curl -X PUT http://localhost:3001/api/v1/asl/projects/{projectId} \
  -H "Content-Type: application/json" \
  -d '{"status": "screening"}'
```

---

#### 1.5 删除项目

**接口**: `DELETE /api/v1/asl/projects/:projectId`  
**认证**: 需要  
**说明**: 删除项目及所有关联数据（级联删除）

**路径参数**:
- `projectId`: 项目ID (UUID)

**响应示例**:
```json
{
  "success": true,
  "message": "Project deleted successfully"
}
```

**测试命令**:
```bash
curl -X DELETE http://localhost:3001/api/v1/asl/projects/{projectId}
```

---

### 2. 文献管理 (Literatures)

#### 2.1 导入文献（JSON格式）

**接口**: `POST /api/v1/asl/literatures/import`  
**认证**: 需要  
**说明**: 批量导入文献（JSON格式）

**请求体**:
```json
{
  "projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
  "literatures": [
    {
      "pmid": "12345678",
      "title": "Efficacy of SGLT2 inhibitors in type 2 diabetes",
      "abstract": "Background: SGLT2 inhibitors are a new class...",
      "authors": "Smith J, Jones A, Brown B",
      "journal": "New England Journal of Medicine",
      "publicationYear": 2020,
      "doi": "10.1056/NEJMoa1234567"
    },
    {
      "title": "Another study on SGLT2 inhibitors",
      "abstract": "Objective: To evaluate...",
      "authors": "Johnson M",
      "journal": "The Lancet",
      "publicationYear": 2019
    }
  ]
}
```

**响应示例**:
```json
{
  "success": true,
  "data": {
    "importedCount": 2
  }
}
```

**字段说明**:
- `pmid`: PubMed ID (可选)
- `title`: 文献标题 (必填)
- `abstract`: 摘要 (必填)
- `authors`: 作者 (可选)
- `journal`: 期刊 (可选)
- `publicationYear`: 发表年份 (可选)
- `doi`: DOI (可选)

**测试命令**:
```bash
curl -X POST http://localhost:3001/api/v1/asl/literatures/import \
  -H "Content-Type: application/json" \
  -d '{
    "projectId": "{projectId}",
    "literatures": [
      {
        "title": "测试文献",
        "abstract": "这是测试摘要"
      }
    ]
  }'
```

---

#### 2.2 导入文献（Excel文件）

**接口**: `POST /api/v1/asl/literatures/import-excel`  
**认证**: 需要  
**说明**: 从Excel文件批量导入文献

**请求类型**: `multipart/form-data`

**表单字段**:
- `file`: Excel文件 (.xlsx)
- `projectId`: 项目ID

**Excel格式要求**:
| 列名（中英文均可） | 必填 | 说明 |
|------------------|------|------|
| PMID / pmid / PMID编号 | 否 | PubMed ID |
| Title / title / 标题 | 是 | 文献标题 |
| Abstract / abstract / 摘要 | 是 | 摘要 |
| Authors / authors / 作者 | 否 | 作者 |
| Journal / journal / 期刊 | 否 | 期刊名称 |
| Year / year / 年份 | 否 | 发表年份 |
| DOI / doi | 否 | DOI |

**响应示例**:
```json
{
  "success": true,
  "data": {
    "importedCount": 15,
    "totalRows": 15
  }
}
```

**测试命令**:
```bash
curl -X POST http://localhost:3001/api/v1/asl/literatures/import-excel \
  -F "file=@literatures.xlsx" \
  -F "projectId={projectId}"
```

---

#### 2.3 获取文献列表

**接口**: `GET /api/v1/asl/projects/:projectId/literatures`  
**认证**: 需要  
**说明**: 获取项目的文献列表（支持分页）

**路径参数**:
- `projectId`: 项目ID (UUID)

**查询参数**:
- `page`: 页码（默认: 1）
- `limit`: 每页数量（默认: 50，最大: 100）

**响应示例**:
```json
{
  "success": true,
  "data": {
    "literatures": [
      {
        "id": "lit-uuid-001",
        "projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
        "pmid": "12345678",
        "title": "Efficacy of SGLT2 inhibitors...",
        "abstract": "Background: SGLT2 inhibitors...",
        "authors": "Smith J, Jones A",
        "journal": "NEJM",
        "publicationYear": 2020,
        "doi": "10.1056/NEJMoa1234567",
        "createdAt": "2025-11-18T07:32:00.000Z",
        "screeningResults": [
          {
            "conflictStatus": "none",
            "finalDecision": "include"
          }
        ]
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 3,
      "totalPages": 1
    }
  }
}
```

**测试命令**:
```bash
curl "http://localhost:3001/api/v1/asl/projects/{projectId}/literatures?page=1&limit=50"
```

---

#### 2.4 删除文献

**接口**: `DELETE /api/v1/asl/literatures/:literatureId`  
**认证**: 需要  
**说明**: 删除指定文献（级联删除筛选结果）

**路径参数**:
- `literatureId`: 文献ID (UUID)

**响应示例**:
```json
{
  "success": true,
  "message": "Literature deleted successfully"
}
```

**测试命令**:
```bash
curl -X DELETE http://localhost:3001/api/v1/asl/literatures/{literatureId}
```

---

### 3. 筛选任务管理 (Screening Tasks)

> **注意**: 以下接口为待实现功能（Week 2计划）

#### 3.1 启动筛选任务

**接口**: `POST /api/v1/asl/projects/:projectId/screening/start`  
**认证**: 需要  
**说明**: 启动AI筛选任务（异步执行）

**请求体**:
```json
{
  "taskType": "title_abstract",
  "models": ["deepseek-chat", "qwen-max"],
  "concurrency": 3
}
```

**响应示例**:
```json
{
  "success": true,
  "data": {
    "taskId": "task-uuid-001",
    "status": "running",
    "totalItems": 100,
    "startedAt": "2025-11-18T08:00:00.000Z"
  }
}
```

---

#### 3.2 获取筛选进度

**接口**: `GET /api/v1/asl/tasks/:taskId/progress`  
**认证**: 需要  
**说明**: 获取筛选任务进度

**响应示例**:
```json
{
  "success": true,
  "data": {
    "taskId": "task-uuid-001",
    "status": "running",
    "totalItems": 100,
    "processedItems": 45,
    "successItems": 40,
    "failedItems": 2,
    "conflictItems": 3,
    "progress": 45,
    "estimatedEndAt": "2025-11-18T08:15:00.000Z"
  }
}
```

---

#### 3.3 获取筛选结果

**接口**: `GET /api/v1/asl/projects/:projectId/results`  
**认证**: 需要  
**说明**: 获取筛选结果列表

**查询参数**:
- `page`: 页码（默认: 1）
- `limit`: 每页数量（默认: 50）
- `conflictOnly`: 只显示冲突项（布尔值）
- `finalDecision`: 筛选决策（include / exclude / pending）

**响应示例**:
```json
{
  "success": true,
  "data": {
    "results": [
      {
        "id": "result-uuid-001",
        "literatureId": "lit-uuid-001",
        "literature": {
          "title": "...",
          "abstract": "..."
        },
        "dsConclusion": "include",
        "qwenConclusion": "include",
        "conflictStatus": "none",
        "finalDecision": "include",
        "createdAt": "2025-11-18T08:05:00.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 100,
      "totalPages": 2
    }
  }
}
```

---

#### 3.4 审核冲突文献

**接口**: `POST /api/v1/asl/results/review`  
**认证**: 需要  
**说明**: 批量审核冲突文献

**请求体**:
```json
{
  "projectId": "d67f0b9a-b035-4804-aca1-0bd672c27d81",
  "reviews": [
    {
      "resultId": "result-uuid-001",
      "finalDecision": "include"
    },
    {
      "resultId": "result-uuid-002",
      "finalDecision": "exclude",
      "exclusionReason": "不符合PICO标准中的干预措施"
    }
  ]
}
```

**响应示例**:
```json
{
  "success": true,
  "data": {
    "reviewedCount": 2
  }
}
```

---

## 📋 响应格式规范

### 1. 成功响应

**格式**:
```json
{
  "success": true,
  "data": {
    // 响应数据
  }
}
```

**HTTP状态码**: 
- `200` - 成功（GET、PUT）
- `201` - 创建成功（POST）

---

### 2. 错误响应

**格式**:
```json
{
  "success": false,
  "error": "错误描述"
}
```

或（详细错误）:
```json
{
  "error": "Missing required fields"
}
```

**常见HTTP状态码**:
- `400` - 请求参数错误
- `401` - 未授权
- `403` - 无权限
- `404` - 资源不存在
- `500` - 服务器内部错误

**错误示例**:
```json
// 400 - 参数错误
{
  "error": "Missing required fields"
}

// 404 - 资源不存在
{
  "error": "Project not found"
}

// 500 - 服务器错误
{
  "error": "Failed to create project"
}
```

---

### 3. 分页响应

**格式**:
```json
{
  "success": true,
  "data": {
    "items": [...],  // 或 literatures、results 等
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 150,
      "totalPages": 3
    }
  }
}
```

**分页参数**:
- `page`: 当前页码（从1开始）
- `limit`: 每页数量
- `total`: 总记录数
- `totalPages`: 总页数

---

## 🔐 认证授权

### 当前状态（测试模式）

**测试用户**:
- **用户ID**: `asl-test-user-001`
- **邮箱**: `asl-test@example.com`
- **权限**: 完全访问

**实现方式**: 
- 优先从JWT中获取`userId`
- JWT不存在时使用默认测试用户ID

### 生产环境（待实现）

**认证流程**:
1. 用户登录获取JWT Token
2. 请求头携带Token: `Authorization: Bearer {token}`
3. 中间件验证Token并提取`userId`
4. 控制器使用`userId`查询用户数据

**中间件示例**:
```typescript
// 待实现
fastify.addHook('preHandler', async (request, reply) => {
  const token = request.headers.authorization?.replace('Bearer ', '');
  if (!token) {
    return reply.status(401).send({ error: 'Unauthorized' });
  }
  const userId = await verifyJWT(token);
  (request as any).userId = userId;
});
```

---

## 🧪 API测试

### 快速测试脚本

**测试所有API**:
```bash
cd AIclinicalresearch/backend
npx tsx scripts/test-asl-api.ts
```

**测试结果**:
```
🚀 开始测试 ASL 模块 API...
📍 测试 1/7: 健康检查              ✅
📍 测试 2/7: 创建筛选项目          ✅
📍 测试 3/7: 获取项目列表          ✅
📍 测试 4/7: 获取项目详情          ✅
📍 测试 5/7: 导入文献              ✅
📍 测试 6/7: 获取文献列表          ✅
📍 测试 7/7: 更新项目              ✅
═══════════════════════════════════
🎉 所有测试通过！(7/7 - 100%)
═══════════════════════════════════
```

### Postman集合

**导入说明**:
1. 创建新的Collection: `ASL API`
2. 设置环境变量:
   - `base_url`: `http://localhost:3001`
   - `api_prefix`: `/api/v1/asl`
3. 导入下方接口

**示例请求** (Postman):
```
POST {{base_url}}{{api_prefix}}/projects
Headers:
  Content-Type: application/json
Body (raw JSON):
{
  "projectName": "测试项目",
  "picoCriteria": {...},
  "inclusionCriteria": "英文文献",
  "exclusionCriteria": "综述"
}
```

---

## 📊 性能指标

### 响应时间目标

| 接口类型 | 目标响应时间 | 说明 |
|---------|-------------|------|
| 单个查询 | < 100ms | 项目详情、文献详情 |
| 列表查询 | < 200ms | 项目列表、文献列表 |
| 创建/更新 | < 300ms | 创建项目、更新项目 |
| 批量导入 | < 2s | 导入100篇文献 |
| LLM筛选 | 4-6s/篇 | 双模型并行筛选 |

### 并发能力

- **API服务器**: 支持100+并发请求
- **LLM筛选**: 并发数为3（可配置）
- **数据库连接池**: 17个连接

---

## 🔄 版本历史

### v2.0 (2025-11-18)
- ✅ 实现10个核心API端点
- ✅ 完成项目管理功能
- ✅ 完成文献管理功能
- ✅ 添加测试脚本和文档
- ✅ 所有接口测试通过

### v1.0 (2025-10-29)
- 初始API设计规范
- 定义接口结构

---

## ⏳ 后续规划

### Week 2
- [ ] 实现筛选任务API (3个接口)
- [ ] 实现冲突审核API (2个接口)
- [ ] 添加SSE进度推送
- [ ] 集成异步任务队列

### Week 3-4
- [ ] 添加JWT认证中间件
- [ ] 实现权限控制
- [ ] 添加API限流
- [ ] 完善错误处理

---

**文档版本：** v2.0  
**最后更新：** 2025-11-18  
**维护者：** AI智能文献开发团队

---

## 📚 相关文档

- [数据库设计文档](./01-数据库设计.md)
- [API测试报告](../../../backend/ASL-API-测试报告.md)
- [Week 1完成报告](../05-开发记录/2025-11-18-Week1完成报告.md)
