Files
AIclinicalresearch/docs/03-业务模块/Redcap/00-模块概览/02-REDCap对接总体方案.md
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

1201 lines
40 KiB
Markdown
Raw 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.
# REDCap与AIclinicalresearch平台对接总体方案
> **文档版本:** v1.0
> **创建日期:** 2025-12-30
> **最后更新:** 2025-12-30
> **文档状态:** 规划中
> **作者:** 技术架构师
---
## 📋 文档说明
本文档定义REDCap15.8.0与壹证循AI科研平台的**完整对接方案**,包括:
1. 对接架构设计
2. External Module开发方案
3. API集成方案
4. 数据流设计
5. 开发计划与实施步骤
**前置条件:**
- ✅ 已获得REDCap官方授权
- ✅ 拥有REDCap 15.8.0源代码
- ✅ 拥有External Module Framework文档
**相关文档:**
- [REDCap 二次开发深度指南](./REDCap%20二次开发深度指南.md)
- [系统架构分层设计](../../00-系统总体设计/01-系统架构分层设计.md)
---
## 🎯 对接目标与价值
### 核心目标
**将REDCap的强大EDC能力与AI科研平台的AI增值功能深度融合**
```
REDCap (数据采集) + AIclinicalresearch (AI能力)
↓ ↓
临床数据录入 AI智能处理、分析、洞察
↓ ↓
完整的AI驱动临床研究闭环
```
### 业务价值
| 功能模块 | REDCap基础能力 | AI平台增值能力 | 协同价值 |
|---------|--------------|--------------|---------|
| **数据采集** | ✅ 表单设计、数据录入、验证 | 🎁 AI辅助录入、智能质控 | 提升录入效率50% |
| **数据清洗** | ⚠️ 手动查询、导出Excel | 🎁 DC模块自动清洗、NER提取 | 减少数据处理时间80% |
| **统计分析** | ⚠️ 需导出到R/SPSS | 🎁 SSA模块一键分析、可视化 | 降低统计门槛分析速度提升10倍 |
| **文献支持** | ❌ 无 | 🎁 ASL模块智能文献筛选 | 系统评价效率提升5倍 |
| **AI问答** | ❌ 无 | 🎁 AIA模块10+智能体辅助 | 全流程AI辅助 |
| **知识库** | ❌ 无 | 🎁 PKB模块RAG问答 | 项目知识沉淀 |
---
## 🏗️ 对接架构设计
### 整体架构
```
┌─────────────────────────────────────────────────────────────────┐
│ 用户层(研究人员/医生) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 前端展示层 │
│ ┌────────────────┐ ┌─────────────────────────┐ │
│ │ REDCap Web UI │ │ AIclinicalresearch │ │
│ │ (原生界面) │◄────────────►│ Frontend (React) │ │
│ └────────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 集成层(核心) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ REDCap External Module: "AI Research Assistant" │ │
│ │ ───────────────────────────────────────────────────── │ │
│ │ ├── 数据同步服务 (Data Sync Service) │ │
│ │ ├── AI功能菜单 (AI Menu Links) │ │
│ │ ├── Hooks处理器 (Hook Handlers) │ │
│ │ └── API代理层 (API Proxy) │ │
│ └────────────────────────────────────────────────────────┘ │
│ ↕ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ AIclinicalresearch Backend RESTful API │ │
│ │ /api/v1/redcap/* │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 业务处理层AI能力
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ DC │ │ SSA │ │ ASL │ │ AIA │ │ PKB │ ... │
│ │数据 │ │统计 │ │文献 │ │问答 │ │知识库│ │
│ │清洗 │ │分析 │ │筛选 │ │ │ │ │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 数据存储层 │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ REDCap MySQL │ │ AI Platform │ │
│ │ (临床数据) │◄───────►│ PostgreSQL │ │
│ │ - 患者数据 │ 同步 │ (分析结果) │ │
│ │ - 表单元数据 │ │ - 清洗后数据 │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
### 核心对接模式
我们采用**双向对接**策略:
#### 模式AREDCap → AI平台数据推送
```
用户在REDCap录入数据
redcap_save_record Hook触发
External Module推送数据到AI平台API
AI平台处理清洗/分析/AI处理
结果返回REDCap存储
```
#### 模式BAI平台 → REDCap数据拉取
```
用户在AI平台发起分析
AI平台调用REDCap API获取数据
AI平台执行分析DC/SSA/AIA等
结果展示在AI平台前端
可选结果回写REDCap
```
---
## 🔧 技术方案详解
### 方案1REDCap External Module开发
#### 模块命名与结构
```
模块名称: ai_research_assistant
版本: v1.0.0
完整目录: <redcap-root>/modules/ai_research_assistant_v1.0.0/
目录结构:
ai_research_assistant_v1.0.0/
├── config.json # 模块配置
├── AiResearchAssistantModule.php # 主逻辑类
├── README.md # 说明文档
├── LICENSE # MIT许可
├── pages/ # 自定义页面
│ ├── dashboard.php # AI功能仪表盘
│ ├── data_sync.php # 数据同步管理
│ ├── analysis_center.php # 分析中心
│ └── settings.php # 模块设置
├── js/ # JavaScript文件
│ ├── dashboard.js
│ └── data_sync.js
├── css/ # 样式文件
│ └── style.css
└── services/ # 服务类
├── ApiClient.php # AI平台API客户端
├── DataMapper.php # 数据映射转换
└── SyncService.php # 同步服务
```
#### config.json核心配置
```json
{
"name": "AI Research Assistant",
"description": "壹证循AI科研平台集成模块 - 提供数据智能清洗、统计分析、文献支持等AI增值功能",
"authors": [
{
"name": "壹证循科技",
"email": "support@yizx.ai",
"institution": "壹证循科技"
}
],
"framework-version": 16,
"permissions": [],
"links": {
"project": [
{
"name": "🤖 AI功能中心",
"icon": "fas fa-brain",
"url": "pages/dashboard.php",
"show-header-and-footer": true
},
{
"name": "🔄 数据同步",
"icon": "fas fa-sync-alt",
"url": "pages/data_sync.php",
"show-header-and-footer": true
},
{
"name": "📊 AI分析中心",
"icon": "fas fa-chart-line",
"url": "pages/analysis_center.php",
"show-header-and-footer": true
}
],
"control-center": [
{
"name": "AI平台配置",
"icon": "fas fa-cog",
"url": "pages/settings.php"
}
]
},
"system-settings": [
{
"key": "ai_platform_url",
"name": "AI平台地址",
"type": "text",
"required": true,
"default": "https://ai.yizx.com"
},
{
"key": "ai_platform_api_key",
"name": "API密钥",
"type": "password",
"required": true
},
{
"key": "enable_auto_sync",
"name": "启用自动同步",
"type": "checkbox",
"default": true
}
],
"project-settings": [
{
"key": "sync_mode",
"name": "同步模式",
"type": "dropdown",
"choices": [
{"value": "manual", "name": "手动同步"},
{"value": "realtime", "name": "实时同步"},
{"value": "scheduled", "name": "定时同步"}
],
"default": "realtime"
},
{
"key": "enable_dc_module",
"name": "启用数据清洗模块",
"type": "checkbox",
"default": true
},
{
"key": "enable_ssa_module",
"name": "启用统计分析模块",
"type": "checkbox",
"default": true
},
{
"key": "enable_asl_module",
"name": "启用智能文献模块",
"type": "checkbox",
"default": false
}
],
"crons": [
{
"cron_name": "data_sync_cron",
"cron_description": "定时同步数据到AI平台",
"method": "syncDataToAIPlatform",
"cron_frequency": "3600",
"cron_max_run_time": "600"
}
]
}
```
#### 主逻辑类AiResearchAssistantModule.php
```php
<?php
namespace YiZhengXun\AiResearchAssistant;
use ExternalModules\AbstractExternalModule;
use REDCap;
class AiResearchAssistantModule extends AbstractExternalModule {
// API客户端实例
private $apiClient;
/**
* 构造函数 - 初始化API客户端
*/
public function __construct() {
parent::__construct();
require_once __DIR__ . '/services/ApiClient.php';
$this->apiClient = new ApiClient(
$this->getSystemSetting('ai_platform_url'),
$this->getSystemSetting('ai_platform_api_key')
);
}
/**
* Hook: 数据保存时触发
* 核心功能实时推送数据到AI平台
*/
public function redcap_save_record(
$project_id,
$record,
$instrument,
$event_id,
$group_id,
$survey_hash,
$response_id,
$repeat_instance
) {
// 检查是否启用实时同步
$syncMode = $this->getProjectSetting('sync_mode');
if ($syncMode !== 'realtime') {
return;
}
// 防止无限循环
static $is_syncing = false;
if ($is_syncing) return;
$is_syncing = true;
try {
// 获取记录数据
$data = REDCap::getData($project_id, 'array', $record);
// 转换数据格式
require_once __DIR__ . '/services/DataMapper.php';
$mapper = new DataMapper();
$mappedData = $mapper->redcapToAIPlatform($data, $project_id, $record);
// 推送到AI平台
$result = $this->apiClient->post('/api/v1/redcap/records', $mappedData);
// 记录日志
$this->log("数据同步成功", [
'project_id' => $project_id,
'record' => $record,
'instrument' => $instrument,
'ai_platform_response' => $result
]);
// 如果启用了AI数据清洗触发清洗任务
if ($this->getProjectSetting('enable_dc_module')) {
$this->triggerDataCleaning($project_id, $record);
}
} catch (\Exception $e) {
// 错误处理
$this->log("数据同步失败", [
'project_id' => $project_id,
'record' => $record,
'error' => $e->getMessage()
]);
}
$is_syncing = false;
}
/**
* Hook: 每个页面顶部
* 功能注入AI辅助录入的JavaScript
*/
public function redcap_every_page_top($project_id) {
// 仅在数据录入页面生效
if (strpos(PAGE, 'DataEntry/index.php') !== false) {
$this->injectAIAssistant();
}
}
/**
* Hook: 数据导出前
* 功能可以添加AI分析结果字段到导出
*/
public function redcap_custom_verify_username($username) {
// 验证逻辑
}
/**
* Cron任务: 定时同步数据
*/
public function syncDataToAIPlatform($cron_info) {
$projects = $this->getEnabledProjects();
foreach ($projects as $project_id) {
try {
// 获取项目所有数据
$data = REDCap::getData($project_id, 'array');
// 批量推送
$result = $this->apiClient->post('/api/v1/redcap/batch-sync', [
'project_id' => $project_id,
'data' => $data,
'timestamp' => time()
]);
$this->log("定时同步完成", [
'project_id' => $project_id,
'records_count' => count($data)
]);
} catch (\Exception $e) {
$this->log("定时同步失败", [
'project_id' => $project_id,
'error' => $e->getMessage()
]);
}
}
return "同步完成";
}
/**
* 触发AI数据清洗
*/
private function triggerDataCleaning($project_id, $record) {
$result = $this->apiClient->post('/api/v1/redcap/dc/clean', [
'project_id' => $project_id,
'record' => $record,
'auto_mode' => true
]);
return $result;
}
/**
* 注入AI辅助录入JavaScript
*/
private function injectAIAssistant() {
?>
<script src="<?= $this->getUrl('js/ai_assistant.js') ?>"></script>
<script>
const aiConfig = {
apiUrl: '<?= $this->getSystemSetting('ai_platform_url') ?>',
projectId: <?= PROJECT_ID ?>,
enableAutoComplete: true,
enableSmartValidation: true
};
AiAssistant.init(aiConfig);
</script>
<?php
}
/**
* 获取启用模块的项目列表
*/
private function getEnabledProjects() {
$sql = "SELECT project_id FROM redcap_external_modules
WHERE external_module_id = ?
AND directory_prefix = ?";
$result = $this->query($sql, [
$this->getModuleId(),
$this->PREFIX
]);
$projects = [];
while ($row = $result->fetch_assoc()) {
$projects[] = $row['project_id'];
}
return $projects;
}
}
```
---
### 方案2AI平台Backend API开发
#### 新增REDCap专用模块
```typescript
// backend/src/modules/redcap/ 目录结构
backend/src/modules/redcap/
controllers/
RedcapController.ts // 主控制器
SyncController.ts // 数据同步控制器
WebhookController.ts // Webhook控制器
services/
RedcapApiClient.ts // REDCap API客户端
DataTransformService.ts // 数据转换服务
SyncService.ts // 同步服务
ProjectMappingService.ts // 项目映射服务
models/
redcap.prisma // Prisma Schema
routes/
redcap.routes.ts // 路由定义
types/
redcap.types.ts // TypeScript类型定义
```
#### Prisma Schema设计
```prisma
// backend/prisma/schema.prisma
// REDCap Schema
datasource redcap_schema {
provider = "postgresql"
url = env("DATABASE_URL")
schemas = ["redcap_schema"]
}
// REDCap项目映射表
model RedcapProject {
id String @id @default(cuid())
redcapProjectId Int @unique // REDCap项目ID
redcapUrl String // REDCap服务器地址
redcapApiToken String @db.VarChar(64) // API Token (加密存储)
// 映射关系
dcProjectId String? // 关联的DC项目ID
ssaProjectId String? // 关联的SSA项目ID
aslProjectId String? // 关联的ASL项目ID
// 同步配置
syncEnabled Boolean @default(true)
syncMode String @default("realtime") // realtime, scheduled, manual
lastSyncAt DateTime?
// 元数据
projectName String
projectDescription String? @db.Text
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// 关联关系
syncRecords RedcapSyncRecord[]
fieldMappings RedcapFieldMapping[]
@@map("redcap_projects")
@@schema("redcap_schema")
}
// REDCap同步记录表
model RedcapSyncRecord {
id String @id @default(cuid())
projectId String
project RedcapProject @relation(fields: [projectId], references: [id], onDelete: Cascade)
recordId String // REDCap记录ID
eventId String? // REDCap事件ID
instrument String? // 表单名称
// 同步状态
status String // pending, syncing, success, failed
direction String // redcap_to_ai, ai_to_redcap
// 数据快照
redcapData Json // REDCap原始数据
aiPlatformData Json? // AI平台处理后数据
// 错误信息
errorMessage String? @db.Text
retryCount Int @default(0)
syncedAt DateTime @default(now())
@@map("redcap_sync_records")
@@schema("redcap_schema")
@@index([projectId, recordId])
@@index([status])
}
// REDCap字段映射表
model RedcapFieldMapping {
id String @id @default(cuid())
projectId String
project RedcapProject @relation(fields: [projectId], references: [id], onDelete: Cascade)
// REDCap字段信息
redcapFieldName String
redcapFieldLabel String?
redcapFieldType String // text, radio, checkbox, dropdown, etc.
// AI平台字段映射
aiPlatformField String? // 映射到AI平台的字段名
transformRule Json? // 转换规则JSON
// 映射配置
isRequired Boolean @default(false)
isIdentifier Boolean @default(false) // 是否为主键字段
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("redcap_field_mappings")
@@schema("redcap_schema")
@@unique([projectId, redcapFieldName])
}
```
#### REDCap API路由定义
```typescript
// backend/src/modules/redcap/routes/redcap.routes.ts
import { FastifyInstance } from 'fastify';
import { RedcapController } from '../controllers/RedcapController';
import { SyncController } from '../controllers/SyncController';
import { WebhookController } from '../controllers/WebhookController';
export async function redcapRoutes(fastify: FastifyInstance) {
const redcapController = new RedcapController();
const syncController = new SyncController();
const webhookController = new WebhookController();
// ========== 项目管理 ==========
// 创建REDCap项目映射
fastify.post('/api/v1/redcap/projects',
redcapController.createProject
);
// 获取项目列表
fastify.get('/api/v1/redcap/projects',
redcapController.listProjects
);
// 获取项目详情
fastify.get('/api/v1/redcap/projects/:id',
redcapController.getProject
);
// 更新项目配置
fastify.put('/api/v1/redcap/projects/:id',
redcapController.updateProject
);
// 删除项目映射
fastify.delete('/api/v1/redcap/projects/:id',
redcapController.deleteProject
);
// ========== 数据同步 ==========
// 手动触发同步REDCap → AI平台
fastify.post('/api/v1/redcap/sync/import/:projectId',
syncController.importFromRedcap
);
// 推送数据到REDCapAI平台 → REDCap
fastify.post('/api/v1/redcap/sync/export/:projectId',
syncController.exportToRedcap
);
// 查询同步状态
fastify.get('/api/v1/redcap/sync/status/:projectId',
syncController.getSyncStatus
);
// 查询同步历史
fastify.get('/api/v1/redcap/sync/history/:projectId',
syncController.getSyncHistory
);
// ========== Webhook接收 ==========
// REDCap External Module推送数据实时同步
fastify.post('/api/v1/redcap/webhook/records',
webhookController.receiveRecordUpdate
);
// 批量同步(定时任务)
fastify.post('/api/v1/redcap/webhook/batch-sync',
webhookController.receiveBatchSync
);
// ========== 字段映射管理 ==========
// 获取REDCap项目元数据字段列表
fastify.get('/api/v1/redcap/projects/:id/metadata',
redcapController.getProjectMetadata
);
// 创建/更新字段映射
fastify.post('/api/v1/redcap/projects/:id/field-mappings',
redcapController.upsertFieldMappings
);
// 获取字段映射
fastify.get('/api/v1/redcap/projects/:id/field-mappings',
redcapController.getFieldMappings
);
// ========== AI功能集成 ==========
// 触发数据清洗DC模块
fastify.post('/api/v1/redcap/dc/clean',
redcapController.triggerDataCleaning
);
// 触发统计分析SSA模块
fastify.post('/api/v1/redcap/ssa/analyze',
redcapController.triggerStatisticalAnalysis
);
// 获取AI分析结果
fastify.get('/api/v1/redcap/analysis/:recordId',
redcapController.getAnalysisResults
);
}
```
#### 核心Controller实现
```typescript
// backend/src/modules/redcap/controllers/SyncController.ts
import { FastifyRequest, FastifyReply } from 'fastify';
import { prisma } from '@/config/database';
import { logger } from '@/common/logging';
import { RedcapApiClient } from '../services/RedcapApiClient';
import { DataTransformService } from '../services/DataTransformService';
export class SyncController {
/**
* 从REDCap导入数据到AI平台
*/
async importFromRedcap(
req: FastifyRequest<{ Params: { projectId: string } }>,
res: FastifyReply
) {
const { projectId } = req.params;
try {
// 1. 获取项目配置
const project = await prisma.redcapProject.findUnique({
where: { id: projectId },
include: { fieldMappings: true }
});
if (!project) {
return res.status(404).send({
success: false,
error: '项目不存在'
});
}
// 2. 调用REDCap API获取数据
const redcapClient = new RedcapApiClient(
project.redcapUrl,
project.redcapApiToken
);
const redcapData = await redcapClient.exportRecords({
format: 'json',
type: 'flat'
});
logger.info('从REDCap获取数据成功', {
projectId,
recordCount: redcapData.length
});
// 3. 数据转换
const transformer = new DataTransformService();
const transformedData = await transformer.redcapToAIPlatform(
redcapData,
project.fieldMappings
);
// 4. 存储到AI平台数据库
// 根据项目配置推送到DC/SSA/ASL等模块
if (project.dcProjectId) {
await this.importToDCModule(project.dcProjectId, transformedData);
}
if (project.ssaProjectId) {
await this.importToSSAModule(project.ssaProjectId, transformedData);
}
// 5. 记录同步历史
await prisma.redcapSyncRecord.create({
data: {
projectId,
recordId: 'batch_import',
status: 'success',
direction: 'redcap_to_ai',
redcapData: redcapData as any,
aiPlatformData: transformedData as any
}
});
// 6. 更新同步时间
await prisma.redcapProject.update({
where: { id: projectId },
data: { lastSyncAt: new Date() }
});
return res.send({
success: true,
message: '数据导入成功',
data: {
recordCount: redcapData.length,
transformedCount: transformedData.length
}
});
} catch (error) {
logger.error('REDCap数据导入失败', {
projectId,
error: error.message
});
return res.status(500).send({
success: false,
error: '数据导入失败',
details: error.message
});
}
}
/**
* 导入到DC模块
*/
private async importToDCModule(dcProjectId: string, data: any[]) {
// 调用DC模块的导入API
// TODO: 实现DC模块集成逻辑
}
/**
* 导入到SSA模块
*/
private async importToSSAModule(ssaProjectId: string, data: any[]) {
// 调用SSA模块的导入API
// TODO: 实现SSA模块集成逻辑
}
}
```
---
## 📊 数据流设计
### 数据流1REDCap → AI平台实时同步
```
┌─────────────────────────────────────────────────────────┐
│ Step 1: 用户在REDCap录入数据 │
│ ───────────────────────────────────────────────────── │
│ 研究人员在REDCap表单中录入患者数据 │
│ 例如患者ID、年龄、性别、诊断、检验结果等 │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Step 2: REDCap触发redcap_save_record Hook │
│ ───────────────────────────────────────────────────── │
│ External Module捕获保存事件 │
│ 获取project_id, record, instrument, event_id │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Step 3: 数据获取与映射 │
│ ───────────────────────────────────────────────────── │
│ 1. 调用REDCap::getData()获取完整记录 │
│ 2. DataMapper转换REDCap EAV格式→AI平台标准格式 │
│ 3. 应用字段映射规则redcap_field_mappings表
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Step 4: HTTP POST推送到AI平台API │
│ ───────────────────────────────────────────────────── │
│ URL: https://ai.yizx.com/api/v1/redcap/webhook/records │
│ Payload: { │
│ project_id: 123, │
│ record_id: "PAT001", │
│ data: {...}, │
│ timestamp: 1735542000 │
│ } │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Step 5: AI平台接收并处理 │
│ ───────────────────────────────────────────────────── │
│ 1. WebhookController验证请求签名 │
│ 2. 存储原始数据到redcap_sync_records表 │
│ 3. 异步触发AI处理任务DC/SSA模块
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Step 6: AI处理与结果返回 │
│ ───────────────────────────────────────────────────── │
│ 1. DC模块数据清洗、NER提取、缺失值处理 │
│ 2. SSA模块自动统计分析、生成可视化图表 │
│ 3. 结果存储到AI平台数据库 │
│ 4. 可选回写结果到REDCap通过API
└─────────────────────────────────────────────────────────┘
```
### 数据流2AI平台 → REDCap分析结果回写
```
AI平台完成分析
生成分析结果JSON
调用REDCap API: importRecords
REDCap存储结果到特定字段
研究人员在REDCap中查看AI分析结果
```
---
## 🚀 开发计划与实施步骤
### Phase 1: 基础对接Week 1-2✅ 优先级P0
**目标**建立REDCap与AI平台的基本连接
#### Week 1: External Module骨架
**任务清单**
- [ ] 创建External Module目录结构
- [ ] 编写config.json配置文件
- [ ] 实现AiResearchAssistantModule.php基础类
- [ ] 实现redcap_save_record Hook基础版
- [ ] 开发ApiClient.phpHTTP客户端
- [ ] 测试REDCap保存数据→打印日志
**交付物**
- `ai_research_assistant_v1.0.0/` 完整目录
- 可在REDCap中启用的External Module
- 基础日志记录功能
#### Week 2: AI平台API端点
**任务清单**
- [ ] 创建redcap_schema数据库Schema
- [ ] 实现Prisma模型RedcapProject等3个表
- [ ] 开发WebhookController接收数据
- [ ] 实现数据转换服务DataTransformService
- [ ] 开发项目管理APICRUD
- [ ] 测试REDCap推送→AI平台接收→存储
**交付物**
- `/api/v1/redcap/*` API端点
- PostgreSQL redcap_schema创建
- Postman测试集合
---
### Phase 2: 数据同步与映射Week 3-4⭐ 优先级P1
**目标**:实现双向数据同步和字段智能映射
#### Week 3: 字段映射系统
**任务清单**
- [ ] 开发字段映射管理UI前端React
- [ ] 实现REDCap元数据获取API
- [ ] 开发字段映射配置界面
- [ ] 实现映射规则引擎DataMapper
- [ ] 支持复杂转换(如:单位转换、编码映射)
- [ ] 测试:映射配置→数据转换验证
**交付物**
- 字段映射UI页面
- 映射规则引擎
- 配置文档
#### Week 4: 双向同步
**任务清单**
- [ ] 实现批量数据导入REDCap → AI
- [ ] 实现分析结果回写AI → REDCap
- [ ] 开发Cron定时同步任务
- [ ] 实现同步状态监控界面
- [ ] 错误处理与重试机制
- [ ] 测试:完整同步流程
**交付物**
- 双向同步功能
- 同步监控Dashboard
- 错误处理机制
---
### Phase 3: AI功能集成Week 5-6🎁 优先级P1
**目标**集成DC、SSA、AIA等AI模块
#### Week 5: DC模块集成
**任务清单**
- [ ] REDCap数据→DC模块自动清洗
- [ ] 清洗结果→REDCap回写
- [ ] 在REDCap中展示清洗报告
- [ ] 支持手动触发清洗
- [ ] 测试:录入→清洗→查看结果
**交付物**
- DC集成API
- REDCap清洗报告页面
#### Week 6: SSA模块集成
**任务清单**
- [ ] REDCap数据→SSA模块自动分析
- [ ] 支持三大分析路径(队列/预测/RCT
- [ ] 在REDCap中嵌入统计报告
- [ ] 可视化图表展示
- [ ] 测试:数据录入→自动分析→报告生成
**交付物**
- SSA集成API
- 统计报告嵌入页面
---
### Phase 4: 高级功能Week 7-8🌟 优先级P2
**目标**AI辅助录入、智能质控等增值功能
#### Week 7: AI辅助录入
**任务清单**
- [ ] 开发智能自动完成(基于历史数据)
- [ ] 异常值预警实时AI判断
- [ ] 字段关联推荐AI预测
- [ ] 录入效率提升统计
- [ ] 测试:录入体验优化验证
**交付物**
- AI辅助录入JS插件
- 智能质控规则引擎
#### Week 8: 综合测试与优化
**任务清单**
- [ ] 性能测试100万条记录同步
- [ ] 安全测试API认证、数据加密
- [ ] 用户验收测试UAT
- [ ] 文档编写(用户手册+开发文档)
- [ ] 部署到生产环境
**交付物**
- 性能测试报告
- 完整文档
- 生产环境部署
---
## 🔒 安全性设计
### API认证机制
```typescript
// 使用HMAC-SHA256签名验证
// REDCap External Module发送请求时
const timestamp = Date.now();
const signature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}${JSON.stringify(payload)}`)
.digest('hex');
// Headers:
{
'X-API-Key': apiKey,
'X-Timestamp': timestamp,
'X-Signature': signature
}
// AI平台验证
function verifySignature(req) {
const { timestamp, signature } = req.headers;
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}${JSON.stringify(req.body)}`)
.digest('hex');
return signature === expectedSignature;
}
```
### 数据加密
- REDCap API Token使用AES-256加密存储
- 传输加密强制HTTPS
- 敏感字段支持字段级加密PHI数据
### 权限控制
```typescript
// REDCap用户权限同步到AI平台
interface UserPermission {
userId: string;
redcapRights: {
data_entry: boolean;
data_export: boolean;
data_analysis: boolean;
};
aiPlatformRights: {
dc_access: boolean;
ssa_access: boolean;
asl_access: boolean;
};
}
```
---
## 📚 技术栈总结
| 层级 | REDCap侧 | AI平台侧 |
|------|---------|---------|
| **编程语言** | PHP 7.4+ | TypeScript/Node.js 22 |
| **框架** | REDCap EM Framework v16 | Fastify v4 |
| **数据库** | MySQL 5.7+ | PostgreSQL 15 |
| **数据模型** | EAV模型 | 关系型+JSONB |
| **前端** | jQuery + Bootstrap 5 | React 19 + Ant Design 6 |
| **API** | REDCap RESTful API | Fastify RESTful API |
| **认证** | API Token | HMAC-SHA256签名 |
| **日志** | REDCap日志表 | Winston + SLS |
| **任务队列** | REDCap Cron | pg-boss (Postgres-Only) |
---
## 📝 下一步行动
### 立即行动(本周)
1. **确认需求**
- [ ] 确认优先级DC优先还是SSA优先
- [ ] 确认部署形态云端SaaS还是私有化部署
- [ ] 确认REDCap服务器信息URL、版本、访问权限
2. **环境准备**
- [ ] 搭建REDCap测试环境使用Docker
- [ ] 创建测试项目和测试数据
- [ ] 配置AI平台测试API
3. **启动开发**
- [ ] 创建External Module目录
- [ ] 初始化Git仓库
- [ ] 编写config.json
### 技术预研
1. **REDCap API深入测试**
2. **External Module Hook机制验证**
3. **大数据量同步性能测试**
4. **移动端REDCap Mobile App集成可行性**
---
## 🎯 成功标准
**MVP版本Phase 1-2完成**
- ✅ REDCap数据能推送到AI平台
- ✅ AI平台能接收并存储数据
- ✅ 字段映射配置功能可用
- ✅ 基础同步监控可用
**标准版本Phase 3完成**
- ✅ DC模块集成完成自动清洗
- ✅ SSA模块集成完成自动分析
- ✅ 分析结果可在REDCap中查看
- ✅ 用户体验流畅
**企业版本Phase 4完成**
- ✅ AI辅助录入提升效率50%+
- ✅ 智能质控减少错误率80%+
- ✅ 支持100万+记录同步
- ✅ 安全合规符合FDA 21 CFR Part 11
---
**文档版本**v1.0
**最后更新**2025-12-30
**下次更新**Phase 1启动后更新开发进度
---
**🚀 准备好开始了吗让我们开启REDCap与AI的融合之旅**