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
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,153 +1,153 @@
# REDCap与AIclinicalresearch平台对接总体方案
> **<EFBFBD>。」迚域悽<EFBFBD>?* v1.0
> **蛻帛サコ譌・譛滂シ?* 2025-12-30
> **文档版本:** v1.0
> **创建日期:** 2025-12-30
> **最后更新:** 2025-12-30
> **<EFBFBD>。」迥カ諤<EFBFBD><EFBFBD>** 隗<><E99A97>荳?
> **文档状态:** 规划中
> **作者:** 技术架构师
---
## 📋 文档说明
譛ャ譁<EFBFBD>。」螳壻ケ嘘EDCap<EFBFBD>?5.8.0<EFBFBD>我ク主」ケ隸∝セェAI遘醍<EFBFBD>泌ケウ蜿ー逧?*螳梧紛蟇ケ謗・譁ケ譯<EFBDB9>**<2A>悟桁諡ャ<E8ABA1><EFBDAC>
本文档定义REDCap15.8.0与壹证循AI科研平台的**完整对接方案**,包括:
1. 对接架构设计
2. External Module蠑€蜿第婿譯?
2. External Module开发方案
3. API集成方案
4. 謨ー謐ョ豬∬ョセ隶?
4. 数据流设计
5. 开发计划与实施步骤
**蜑咲スョ譚。莉カ<EFBFBD>?*
- 笨?蟾イ闔キ蠕由EDCap螳俶婿謗域揀
- 笨?諡・譛嘘EDCap 15.8.0貅蝉サ」遐?
- 笨?諡・譛右xternal Module Framework<EFBFBD>。」
**前置条件:**
- ✅ 已获得REDCap官方授权
- ✅ 拥有REDCap 15.8.0源代码
- ✅ 拥有External Module Framework文档
**逶ク蜈ウ譁<EFBFBD>。」<EFBFBD>?*
- [REDCap 莠梧ャ。蠑€蜿第キア蠎ヲ謖<EFBFBD>](./REDCap%20莠梧ャ。蠑€蜿第キア蠎ヲ謖<EFBDA6><E8AC96>?md)
**相关文档:**
- [REDCap 二次开发深度指南](./REDCap%20二次开发深度指南.md)
- [系统架构分层设计](../../00-系统总体设计/01-系统架构分层设计.md)
---
## <EFBFBD>識 蟇ケ謗・逶ョ譬<EFBDAE>ク惹サキ蛟?
## 🎯 对接目标与价值
### 核心目标
**<EFBFBD>EDCap<EFBFBD>シコ螟ァEDC閭ス蜉帑ク拶I遘醍<EFBFBD>泌ケウ蜿ー逧БI蠅槫€シ蜉溯<EFBFBD>豺ア蠎ヲ陞榊<EFBFBD>?*
**将REDCap的强大EDC能力与AI科研平台的AI增值功能深度融合**
```
REDCap (数据采集) + AIclinicalresearch (AI能力)
竊? 竊?
荳エ蠎頑焚謐ョ蠖募<EFBFBD> AI譎コ閭ス螟<EFBFBD>炊縲∝<EFBFBD>譫舌€∵エ槫ッ?
竊? 竊?
临床数据录入 AI智能处理、分析、洞察
完整的AI驱动临床研究闭环
```
### 荳壼苅莉キ蛟?
### 业务价值
| 蜉溯<EFBFBD>讓。蝮<EFBFBD> | REDCap蝓コ遑€閭ス蜉<EFBFBD> | AI蟷ウ蜿ー蠅槫€シ閭ス蜉?| 蜊丞酔莉キ蛟?|
| 功能模块 | REDCap基础能力 | AI平台增值能力 | 协同价值 |
|---------|--------------|--------------|---------|
| **謨ー謐ョ驥<EFBFBD>** | 笨?陦ィ蜊戊ョセ隶。縲∵焚謐ョ蠖募<E8A096><EFBFBD>ェ瑚ッ?| <20>氏 AI霎<49>勧蠖募<E8A096>縲∵匱閭ス雍ィ謗?| 謠仙合蠖募<E8A096>謨育紫50% |
| **数据采集** | ✅ 表单设计、数据录入、验证 | 🎁 AI辅助录入、智能质控 | 提升录入效率50% |
| **数据清洗** | ⚠️ 手动查询、导出Excel | 🎁 DC模块自动清洗、NER提取 | 减少数据处理时间80% |
| **扈溯ョ。蛻<EFBFBD>** | <EFBFBD><EFBFBD><EFBFBD> 髴€蟇シ蜃コ蛻ーR/SPSS | <EFBFBD> SSA讓。蝮嶺ク€髞ョ蛻<EFBFBD>梵縲∝庄隗<EFBFBD>喧 | 髯堺ス守サ溯ョ。髣ィ讒幢シ悟<EFBDBC>譫宣€溷コヲ謠仙合10蛟?|
| **<EFBFBD>鍵謾ッ謖<EFBFBD>** | 笶?譌?| <20>氏 ASL讓。蝮玲匱閭ス譁<EFBDBD>鍵遲幃€?| 邉サ扈溯ッ<E6BAAF>サキ謨育紫謠仙合5蛟?|
| **AI髣ョ遲<EFBFBD>** | 笶?譌?| <20>氏 AIA讓。蝮<EFBDA1>10+譎コ閭ス菴楢セ<E6A5A2><EFBDBE>?| 蜈ィ豬∫ィ帰I霎<49> |
| **遏・隸<EFBFBD>コ?* | 笶?譌?| <20>氏 PKB讓。蝮由AG髣ョ遲<EFBDAE> | 鬘ケ逶ョ遏・隸<EFBDA5>イ画キ€ |
| **统计分析** | ⚠️ 需导出到R/SPSS | 🎁 SSA模块一键分析、可视化 | 降低统计门槛分析速度提升10倍 |
| **文献支持** | ❌ 无 | 🎁 ASL模块智能文献筛选 | 系统评价效率提升5倍 |
| **AI问答** | ❌ 无 | 🎁 AIA模块10+智能体辅助 | 全流程AI辅助 |
| **知识库** | ❌ 无 | 🎁 PKB模块RAG问答 | 项目知识沉淀 |
---
## <EFBFBD><EFBFBD>?蟇ケ謗・譫カ譫<EFBDB6>ョセ隶。
## 🏗️ 对接架构设计
### 整体架构
```
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 逕ィ謌キ螻ゑシ育<EFBFBD>皮ゥカ莠コ蜻<EFBFBD>/蛹サ逕滂シ? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 蜑咲ォッ螻慕、コ螻? 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏? REDCap Web UI 笏? 笏?AIclinicalresearch 笏? 笏?
笏? 笏? (蜴溽函逡碁擇) 笏や淀笏€€€€€€€€€€€€笆コ笏<EFBDBA> Frontend (React) 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? <EFBFBD><EFBFBD>螻ゑシ域<EFBFBD>ク蠢<EFBFBD>シ? 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏? REDCap External Module: "AI Research Assistant" 笏? 笏?
笏? 笏? 笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€ 笏? 笏?
笏? 笏? 笏懌楳笏€ 謨ー謐ョ蜷梧ュ・譛榊苅 (Data Sync Service) 笏? 笏?
笏? 笏? 笏懌楳笏€ AI蜉溯<E89C89>闖懷黒 (AI Menu Links) 笏? 笏?
笏? 笏? 笏懌楳笏€ Hooks<EFBFBD>炊蝎?(Hook Handlers) 笏? 笏?
笏? 笏? 笏披楳笏€ API莉」逅<EFBDA3>ア?(API Proxy) 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 竊? 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏? AIclinicalresearch Backend RESTful API 笏? 笏?
笏? 笏? /api/v1/redcap/* 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 荳壼苅螟<EFBFBD>炊螻ゑシ<EFBFBD>I閭ス蜉幢シ? 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏? 笏娯楳笏€笏€笏€笏€笏€笏? 笏娯楳笏€笏€笏€笏€笏€笏? 笏娯楳笏€笏€笏€笏€笏€笏? 笏娯楳笏€笏€笏€笏€笏€笏? 笏?
笏? 笏?DC 笏? 笏?SSA 笏? 笏?ASL 笏? 笏?AIA 笏? 笏?PKB 笏? ... 笏?
笏? 笏よ焚謐? 笏? 笏らサ溯ョ? 笏? 笏よ枚迪? 笏? 笏る琉遲? 笏? 笏ら衍隸<E8A18D>コ凪<EFBDBA>? 笏?
笏? 笏よク<E38288>エ? 笏? 笏ょ<E7AC8F>譫? 笏? 笏らュ幃€? 笏? 笏? 笏? 笏? 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏? 笏披楳笏€笏€笏€笏€笏€笏? 笏披楳笏€笏€笏€笏€笏€笏? 笏披楳笏€笏€笏€笏€笏€笏? 笏披楳笏€笏€笏€笏€笏€笏? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 謨ー謐ョ蟄伜お螻? 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏? REDCap MySQL 笏? 笏? AI Platform 笏? 笏?
笏? 笏? (荳エ蠎頑焚謐ョ) 笏や淀笏€€€€€€€笆コ笏<EFBDBA> PostgreSQL 笏? 笏?
笏? 笏? - 謔」閠<EFBDA3>焚謐? 笏? 蜷梧ュ・ 笏? (蛻<>梵扈捺棡) 笏? 笏?
笏? 笏? - 陦ィ蜊募<E89C8A>謨ー謐? 笏? 笏? - <EFBFBD>エ怜錘謨ー謐? 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
┌─────────────────────────────────────────────────────────────────┐
用户层(研究人员/医生)
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
前端展示层
│ ┌────────────────┐ ┌─────────────────────────┐ │
│ │ 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
│ │ - 患者数据 同步 │ (分析结果)
│ │ - 表单元数据 - 清洗后数据
│ └──────────────────┘ └──────────────────┘
└─────────────────────────────────────────────────────────────────┘
```
### 核心对接模式
謌台サャ驥<EFBFBD>畑**蜿悟髄蟇ケ謗・**遲也払<E4B99F>?
我们采用**双向对接**策略:
#### 讓。蠑就<EFBFBD>啌EDCap 竊?AI蟷ウ蜿ー<E89CBF>域焚謐ョ謗ィ騾<EFBDA8><EFBFBD>
#### 模式AREDCap → AI平台数据推送
```
用户在REDCap录入数据
竊?
redcap_save_record Hook触发
竊?
External Module推送数据到AI平台API
竊?
AI蟷ウ蜿ー螟<EFBFBD><EFBFBD>域ク<EFBFBD>エ?蛻<>梵/AI螟<49><EFBFBD>?
竊?
AI平台处理(清洗/分析/AI处理
结果返回REDCap存储
```
#### 讓。蠑州<EFBFBD>哂I蟷ウ蜿ー 竊?REDCap<61>域焚謐ョ諡牙叙<E78999><E58F99>
#### 模式BAI平台 → REDCap数据拉取
```
用户在AI平台发起分析
竊?
AI平台调用REDCap API获取数据
竊?
AI平台执行分析DC/SSA/AIA等
竊?
结果展示在AI平台前端
竊?
可选结果回写REDCap
```
---
## <EFBFBD>肌 謚€譛ッ譁ケ譯郁ッヲ隗?
## 🔧 技术方案详解
### 譁ケ譯<EFBFBD>1<EFBFBD>EDCap External Module蠑€蜿?
### 方案1REDCap External Module开发
#### 讓。蝮怜多蜷堺ク守サ捺<EFBFBD>?
#### 模块命名与结构
```
模块名称: ai_research_assistant
@@ -157,21 +157,21 @@ AI平台执行分析DC/SSA/AIA等
目录结构:
ai_research_assistant_v1.0.0/
├── config.json # 模块配置
笏懌楳笏€ AiResearchAssistantModule.php # 荳サ騾サ霎醍ア?
├── AiResearchAssistantModule.php # 主逻辑类
├── README.md # 说明文档
├── LICENSE # MIT许可
笏懌楳笏€ pages/ # 閾ェ螳壻ケ蛾。オ髱?
笏? 笏懌楳笏€ dashboard.php # AI蜉溯<EFBFBD>莉ェ陦ィ逶?
笏? 笏懌楳笏€ data_sync.php # 謨ー謐ョ蜷梧ュ・邂。逅<EFBFBD>
笏? 笏懌楳笏€ analysis_center.php # <EFBFBD>梵荳ュ蠢<EFBFBD>
笏? 笏披楳笏€ settings.php # 讓。蝮苓ョセ鄂ョ
├── pages/ # 自定义页面
│ ├── dashboard.php # AI功能仪表盘
│ ├── data_sync.php # 数据同步管理
│ ├── analysis_center.php # 分析中心
│ └── settings.php # 模块设置
├── js/ # JavaScript文件
笏? 笏懌楳笏€ dashboard.js
笏? 笏披楳笏€ data_sync.js
│ ├── dashboard.js
│ └── data_sync.js
├── css/ # 样式文件
笏? 笏披楳笏€ style.css
笏披楳笏€ services/ # 譛榊苅邀?
笏懌楳笏€ ApiClient.php # AI蟷ウ蜿ーAPI螳「謌キ遶?
│ └── style.css
└── services/ # 服务类
├── ApiClient.php # AI平台API客户端
├── DataMapper.php # 数据映射转换
└── SyncService.php # 同步服务
```
@@ -181,7 +181,7 @@ ai_research_assistant_v1.0.0/
```json
{
"name": "AI Research Assistant",
"description": "螢ケ隸∝セェAI遘醍<EFBFBD>泌ケウ蜿ー髮<EFBFBD><EFBFBD>讓。蝮<EFBFBD> - 謠蝉セ帶焚謐ョ譎コ閭ス貂<EFBDBD>エ励€∫サ溯ョ。蛻<EFBDA1>梵縲∵枚迪ョ謾ッ謖∫ュ陰I蠅槫€シ蜉溯<E89C89>?,
"description": "壹证循AI科研平台集成模块 - 提供数据智能清洗、统计分析、文献支持等AI增值功能",
"authors": [
{
"name": "壹证循科技",
@@ -284,7 +284,7 @@ ai_research_assistant_v1.0.0/
}
```
#### 荳サ騾サ霎醍アサ<EFBFBD><EFBFBD>iResearchAssistantModule.php<EFBFBD>?
#### 主逻辑类AiResearchAssistantModule.php
```php
<?php
@@ -295,11 +295,11 @@ use REDCap;
class AiResearchAssistantModule extends AbstractExternalModule {
// API螳「謌キ遶ッ螳樔セ?
// API客户端实例
private $apiClient;
/**
* <EFBFBD>€<EFBFBD>蜃ス謨?- 蛻晏ァ句喧API螳「謌キ遶?
* 构造函数 - 初始化API客户端
*/
public function __construct() {
parent::__construct();
@@ -311,7 +311,7 @@ class AiResearchAssistantModule extends AbstractExternalModule {
}
/**
* Hook: 謨ー謐ョ菫晏ュ俶慮隗ヲ蜿?
* Hook: 数据保存时触发
* 核心功能实时推送数据到AI平台
*/
public function redcap_save_record(
@@ -324,7 +324,7 @@ class AiResearchAssistantModule extends AbstractExternalModule {
$response_id,
$repeat_instance
) {
// 譽€譟・譏ッ蜷ヲ蜷ッ逕ィ螳樊慮蜷梧ュ?
// 检查是否启用实时同步
$syncMode = $this->getProjectSetting('sync_mode');
if ($syncMode !== 'realtime') {
return;
@@ -355,7 +355,7 @@ class AiResearchAssistantModule extends AbstractExternalModule {
'ai_platform_response' => $result
]);
// 螯よ棡蜷ッ逕ィ莠<EFBFBD>I謨ー謐ョ貂<EFBFBD>エ暦シ瑚ァヲ蜿第ク<EFBFBD>エ嶺ササ蜉?
// 如果启用了AI数据清洗触发清洗任务
if ($this->getProjectSetting('enable_dc_module')) {
$this->triggerDataCleaning($project_id, $record);
}
@@ -384,8 +384,8 @@ class AiResearchAssistantModule extends AbstractExternalModule {
}
/**
* Hook: 謨ー謐ョ蟇シ蜃コ蜑?
* 蜉溯<EFBFBD><EFBFBD>壼庄莉・豺サ蜉<EFBFBD>AI蛻<EFBFBD>梵扈捺棡蟄玲ョオ蛻ー蟇シ蜃?
* Hook: 数据导出前
* 功能可以添加AI分析结果字段到导出
*/
public function redcap_custom_verify_username($username) {
// 验证逻辑
@@ -399,10 +399,10 @@ class AiResearchAssistantModule extends AbstractExternalModule {
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,
@@ -457,7 +457,7 @@ class AiResearchAssistantModule extends AbstractExternalModule {
}
/**
* 闔キ蜿門星逕ィ讓。蝮礼噪鬘ケ逶ョ蛻苓。?
* 获取启用模块的项目列表
*/
private function getEnabledProjects() {
$sql = "SELECT project_id FROM redcap_external_modules
@@ -480,7 +480,7 @@ class AiResearchAssistantModule extends AbstractExternalModule {
---
### 譁ケ譯<EFBFBD>2<EFBFBD>哂I蟷ウ蜿ーBackend API蠑€蜿?
### 方案2AI平台Backend API开发
#### 新增REDCap专用模块
@@ -488,18 +488,18 @@ class AiResearchAssistantModule extends AbstractExternalModule {
// backend/src/modules/redcap/ 目录结构
backend/src/modules/redcap/
controllers/
? € RedcapController.ts // 荳サ謗ァ蛻カ蝎ィ
? € SyncController.ts // 謨ー謐ョ蜷梧ュ・謗ァ蛻カ蝎?
? € WebhookController.ts // Webhook謗ァ蛻カ蝎?
RedcapController.ts // 主控制器
SyncController.ts // 数据同步控制器
WebhookController.ts // Webhook控制器
services/
? € RedcapApiClient.ts // REDCap API螳「謌キ遶?
? € DataTransformService.ts // 謨ー謐ョ霓ャ謐「譛榊苅
? € SyncService.ts // 蜷梧ュ・譛榊苅
? € ProjectMappingService.ts // 鬘ケ逶ョ譏<EFBFBD><EFBFBD>恪蜉。
RedcapApiClient.ts // REDCap API客户端
DataTransformService.ts // 数据转换服务
SyncService.ts // 同步服务
ProjectMappingService.ts // 项目映射服务
models/
? € redcap.prisma // Prisma Schema
redcap.prisma // Prisma Schema
routes/
? € redcap.routes.ts // 霍ッ逕ア螳壻ケ<EFBFBD>
redcap.routes.ts // 路由定义
types/
redcap.types.ts // TypeScript类型定义
```
@@ -516,7 +516,7 @@ datasource redcap_schema {
schemas = ["redcap_schema"]
}
// REDCap鬘ケ逶ョ譏<EFBFBD><EFBFBD>。?
// REDCap项目映射表
model RedcapProject {
id String @id @default(cuid())
redcapProjectId Int @unique // REDCap项目ID
@@ -533,7 +533,7 @@ model RedcapProject {
syncMode String @default("realtime") // realtime, scheduled, manual
lastSyncAt DateTime?
// <EFBFBD>焚謐?
// 元数据
projectName String
projectDescription String? @db.Text
@@ -548,7 +548,7 @@ model RedcapProject {
@@schema("redcap_schema")
}
// REDCap蜷梧ュ・隶ー蠖戊。?
// REDCap同步记录表
model RedcapSyncRecord {
id String @id @default(cuid())
projectId String
@@ -558,13 +558,13 @@ model RedcapSyncRecord {
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蟷ウ蜿ー螟<EFBFBD>炊蜷取焚謐?
aiPlatformData Json? // AI平台处理后数据
// 错误信息
errorMessage String? @db.Text
@@ -578,7 +578,7 @@ model RedcapSyncRecord {
@@index([status])
}
// REDCap蟄玲ョオ譏<EFBFBD><EFBFBD>。?
// REDCap字段映射表
model RedcapFieldMapping {
id String @id @default(cuid())
projectId String
@@ -591,11 +591,11 @@ model RedcapFieldMapping {
// AI平台字段映射
aiPlatformField String? // 映射到AI平台的字段名
transformRule Json? // 霓ャ謐「隗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SON<EFBFBD>?
transformRule Json? // 转换规则JSON
// 映射配置
isRequired Boolean @default(false)
isIdentifier Boolean @default(false) // 譏ッ蜷ヲ荳コ荳サ髞ョ蟄玲ョ?
isIdentifier Boolean @default(false) // 是否为主键字段
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -650,17 +650,17 @@ export async function redcapRoutes(fastify: FastifyInstance) {
// ========== 数据同步 ==========
// 謇句勘隗ヲ蜿大酔豁・<EFBFBD><EFBFBD>EDCap 竊?AI蟷ウ蜿ー<E89CBF>?
// 手动触发同步REDCap → AI平台
fastify.post('/api/v1/redcap/sync/import/:projectId',
syncController.importFromRedcap
);
// 謗ィ騾∵焚謐ョ蛻ーREDCap<EFBFBD><EFBFBD>I蟷ウ蜿ー 竊?REDCap<EFBFBD>?
// 推送数据到REDCapAI平台 → REDCap
fastify.post('/api/v1/redcap/sync/export/:projectId',
syncController.exportToRedcap
);
// 譟・隸「蜷梧ュ・迥カ諤?
// 查询同步状态
fastify.get('/api/v1/redcap/sync/status/:projectId',
syncController.getSyncStatus
);
@@ -672,7 +672,7 @@ export async function redcapRoutes(fastify: FastifyInstance) {
// ========== Webhook接收 ==========
// REDCap External Module謗ィ騾∵焚謐ョ<EFBFBD>亥ョ樊慮蜷梧ュ・<EFBFBD>?
// REDCap External Module推送数据(实时同步)
fastify.post('/api/v1/redcap/webhook/records',
webhookController.receiveRecordUpdate
);
@@ -684,7 +684,7 @@ export async function redcapRoutes(fastify: FastifyInstance) {
// ========== 字段映射管理 ==========
// 闔キ蜿乏EDCap鬘ケ逶ョ蜈<EFBFBD>焚謐ョ<EFBFBD>亥ュ玲ョオ蛻苓。ィ<EFBFBD>?
// 获取REDCap项目元数据(字段列表)
fastify.get('/api/v1/redcap/projects/:id/metadata',
redcapController.getProjectMetadata
);
@@ -701,12 +701,12 @@ export async function redcapRoutes(fastify: FastifyInstance) {
// ========== AI功能集成 ==========
// 隗ヲ蜿第焚謐ョ貂<EFBFBD>エ暦シ<EFBFBD>C讓。蝮暦シ?
// 触发数据清洗DC模块
fastify.post('/api/v1/redcap/dc/clean',
redcapController.triggerDataCleaning
);
// 隗ヲ蜿醍サ溯ョ。蛻<EFBFBD><EFBFBD><EFBFBD>SA讓。蝮暦シ?
// 触发统计分析SSA模块
fastify.post('/api/v1/redcap/ssa/analyze',
redcapController.triggerStatisticalAnalysis
);
@@ -750,7 +750,7 @@ export class SyncController {
if (!project) {
return res.status(404).send({
success: false,
error: '鬘ケ逶ョ荳榊ュ伜<EFBFBD>?
error: '项目不存在'
});
}
@@ -777,8 +777,8 @@ export class SyncController {
project.fieldMappings
);
// 4. 蟄伜お蛻ーAI蟷ウ蜿ー謨ー謐ョ蠎?
// 譬ケ謐ョ鬘ケ逶ョ驟咲スョ<EFBFBD>梧耳騾∝芦DC/SSA/ASL遲画ィ。蝮?
// 4. 存储到AI平台数据库
// 根据项目配置,推送到DC/SSA/ASL等模块
if (project.dcProjectId) {
await this.importToDCModule(project.dcProjectId, transformedData);
}
@@ -848,74 +848,74 @@ export class SyncController {
---
## <EFBFBD>投 謨ー謐ョ豬∬ョセ隶?
## 📊 数据流设计
### 謨ー謐ョ豬?<3F>啌EDCap 竊?AI蟷ウ蜿ー<E89CBF>亥ョ樊慮蜷梧ュ・<EFBDAD><EFBDA5>
### 数据流1REDCap → AI平台实时同步
```
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? Step 1: 逕ィ謌キ蝨ィREDCap蠖募<EFBFBD>謨ー謐ョ 笏?
笏? 笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€ 笏?
笏? 遐皮ゥカ莠コ蜻伜惠REDCap陦ィ蜊穂クュ蠖募<E8A096>謔」閠<EFBDA3>焚謐? 笏?
笏? 萓句ヲゑシ壽ぅ閠<E38185>D縲∝ケエ鮴<EFBDB4>€€ァ蛻ォ縲∬ッ頑妙縲∵」€鬪檎サ捺棡遲<E6A3A1> 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? Step 2: REDCap隗ヲ蜿喪edcap_save_record Hook 笏?
笏? 笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€ 笏?
笏? External Module謐戊執菫晏ュ倅コ倶サカ 笏?
笏? 闔キ蜿厄シ嗔roject_id, record, instrument, event_id 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? Step 3: 謨ー謐ョ闔キ蜿紋ク取丐蟆? 笏?
笏? 笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€ 笏?
笏? 1. <EFBFBD>REDCap::getData()闔キ蜿門ョ梧紛隶ー蠖<EFBFBD> 笏?
笏? 2. DataMapper霓ャ謐「REDCap EAV譬シ蠑鞘<EFBFBD>AI蟷ウ蜿ー譬<EFBFBD>㊥譬シ蠑<EFBFBD> 笏?
笏? 3. 蠎皮畑蟄玲ョオ譏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>edcap_field_mappings陦ィ<EFBFBD><EFBFBD> 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 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蟷ウ蜿ー謗・謾カ蟷カ螟<EFBFBD><EFBFBD>? 笏?
笏? 笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€ 笏?
笏? 1. WebhookController鬪瑚ッ∬ッキ豎らュセ蜷<EFBFBD> 笏?
笏? 2. 蟄伜お蜴溷ァ区焚謐ョ蛻ーredcap_sync_records陦? 笏?
笏? 3. 蠑よュ・隗ヲ蜿羨I螟<EFBFBD>炊莉サ蜉。<EFBFBD><EFBFBD>C/SSA讓。蝮暦シ? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? Step 6: AI<EFBFBD>炊荳守サ捺棡霑泌<EFBFBD>? 笏?
笏? 笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€ 笏?
笏? 1. DC讓。蝮暦シ壽焚謐ョ貂<EFBFBD>エ励€¨ER謠仙叙縲∫シコ螟ア蛟シ螟<EFBFBD><EFBFBD>? 笏?
笏? 2. SSA讓。蝮暦シ夊<EFBFBD>蜉ィ扈溯ョ。蛻<EFBFBD>梵縲∫函謌仙庄隗<EFBFBD>喧蝗セ陦ィ 笏?
笏? 3. 扈捺棡蟄伜お蛻ーAI蟷ウ蜿ー謨ー謐ョ蠎? 笏?
笏? 4. <EFBFBD>亥庄騾会シ牙屓蜀咏サ捺棡蛻ーREDCap<EFBFBD>€夊ソ②PI<EFBFBD>? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
┌─────────────────────────────────────────────────────────┐
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
└─────────────────────────────────────────────────────────┘
```
### 謨ー謐ョ豬?<3F>哂I蟷ウ蜿ー 竊?REDCap<61><EFBFBD>譫千サ捺棡蝗槫<E89D97><E6A7AB><EFBFBD>
### 数据流2AI平台 → REDCap分析结果回写
```
AI平台完成分析
竊?
逕滓<EFBFBD><EFBFBD>梵扈捺棡<EFBFBD><EFBFBD>SON<EFBFBD>?
竊?
生成分析结果JSON
调用REDCap API: importRecords
竊?
REDCap蟄伜お扈捺棡蛻ー迚ケ螳壼ュ玲ョ?
竊?
REDCap存储结果到特定字段
研究人员在REDCap中查看AI分析结果
```
@@ -925,34 +925,34 @@ REDCap存储结果到特定字
### Phase 1: 基础对接Week 1-2✅ 优先级P0
**逶ョ譬<EFBFBD>**<EFBFBD>壼サコ遶騎EDCap荳拶I蟷ウ蜿ー逧<EFBFBD>渕譛ャ霑樊<EFBFBD>?
**目标**建立REDCap与AI平台的基本连接
#### Week 1: External Module骨架
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
**任务清单**
- [ ] 创建External Module目录结构
- [ ] 编写config.json配置文件
- [ ] 螳樒鴫AiResearchAssistantModule.php蝓コ遑€邀?
- [ ] 实现AiResearchAssistantModule.php基础类
- [ ] 实现redcap_save_record Hook基础版
- [ ] 开发ApiClient.phpHTTP客户端
- [ ] 豬玖ッ包シ啌EDCap菫晏ュ俶焚謐ョ竊呈遠蜊ー譌・蠢?
- [ ] 测试REDCap保存数据→打印日志
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- `ai_research_assistant_v1.0.0/` 完整目录
- 可在REDCap中启用的External Module
- 基础日志记录功能
#### Week 2: AI平台API端点
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
**任务清单**
- [ ] 创建redcap_schema数据库Schema
- [ ] 螳樒鴫Prisma讓。蝙具シ<EFBFBD>edcapProject遲?荳ェ陦ィ<E999A6>?
- [ ] 实现Prisma模型RedcapProject等3个表
- [ ] 开发WebhookController接收数据
- [ ] 实现数据转换服务DataTransformService
- [ ] €蜿鷹。ケ逶ョ邂。逅<EFBFBD>PI<EFBFBD><EFBFBD>RUD<EFBFBD>?
- [ ] 豬玖ッ包シ啌EDCap謗ィ騾≫<EFBFBD>AI蟷ウ蜿ー謗・謾カ竊貞ュ伜<EFBFBD>?
- [ ] 开发项目管理APICRUD
- [ ] 测试REDCap推送→AI平台接收→存储
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- `/api/v1/redcap/*` API端点
- PostgreSQL redcap_schema创建
- Postman测试集合
@@ -965,102 +965,102 @@ REDCap存储结果到特定字
#### Week 3: 字段映射系统
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
- [ ] €蜿大ュ玲ョオ譏<EFBFBD><EFBFBD>ョ。逅<EFBFBD>I<EFBFBD>亥燕遶ッReact<EFBFBD>?
**任务清单**
- [ ] 开发字段映射管理UI前端React
- [ ] 实现REDCap元数据获取API
- [ ] €蜿大ュ玲ョオ譏<EFBFBD><EFBFBD><EFBFBD>鄂ョ逡碁<EFBFBD>?
- [ ] 螳樒鴫譏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蠑墓梼<EFBFBD><EFBFBD>ataMapper<EFBFBD>?
- [ ] 开发字段映射配置界面
- [ ] 实现映射规则引擎DataMapper
- [ ] 支持复杂转换(如:单位转换、编码映射)
- [ ] 测试:映射配置→数据转换验证
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- 字段映射UI页面
- 映射规则引擎
- 配置文档
#### Week 4: 双向同步
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
- [ ] 螳樒鴫謇ケ驥乗焚謐ョ蟇シ蜈・<EFBFBD><EFBFBD>EDCap 竊?AI<41>?
- [ ] 螳樒鴫蛻<EFBFBD>梵扈捺棡蝗槫<EFBFBD><EFBFBD><EFBFBD>I 竊?REDCap<EFBFBD>?
**任务清单**
- [ ] 实现批量数据导入REDCap → AI
- [ ] 实现分析结果回写AI → REDCap
- [ ] 开发Cron定时同步任务
- [ ] 螳樒鴫蜷梧ュ・迥カ諤∫尅謗ァ逡碁<EFBFBD>?
- [ ] 髞呵ッッ螟<EFBFBD>炊荳朱㍾隸墓惻蛻?
- [ ] 豬玖ッ包シ壼ョ梧紛蜷梧ュ・豬∫ィ?
- [ ] 实现同步状态监控界面
- [ ] 错误处理与重试机制
- [ ] 测试:完整同步流程
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- 双向同步功能
- 同步监控Dashboard
- 错误处理机制
---
### Phase 3: AI蜉溯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>eek 5-6<>解沁?莨伜<E88EA8>郤ァP1
### Phase 3: AI功能集成Week 5-6🎁 优先级P1
**目标**集成DC、SSA、AIA等AI模块
#### Week 5: DC模块集成
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
**任务清单**
- [ ] REDCap数据→DC模块自动清洗
- [ ] 清洗结果→REDCap回写
- [ ] 蝨ィREDCap荳ュ螻慕、コ貂<EFBFBD>エ玲冠蜻?
- [ ] REDCap中展示清洗报告
- [ ] 支持手动触发清洗
- [ ] 豬玖ッ包シ壼ス募<EFBFBD>竊呈ク<EFBFBD>エ冷<EFBFBD>譟・逵狗サ捺<EFBFBD>?
- [ ] 测试:录入→清洗→查看结果
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- DC集成API
- REDCap清洗报告页面
#### Week 6: SSA模块集成
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
**任务清单**
- [ ] REDCap数据→SSA模块自动分析
- [ ] 謾ッ謖∽ク牙、ァ蛻<EFBFBD>梵霍ッ蠕<EFBFBD>シ磯弌蛻?鬚<><EFBFBD>/RCT<EFBFBD>?
- [ ] 蝨ィREDCap荳ュ蠏悟<EFBFBD>扈溯ョ。謚・蜻?
- [ ] 蜿ッ隗<EFBFBD>喧蝗セ陦ィ螻慕、?
- [ ] 豬玖ッ包シ壽焚謐ョ蠖募<EFBFBD>竊定<EFBFBD>蜉ィ蛻<EFBFBD>梵竊呈冠蜻顔函謌?
- [ ] 支持三大分析路径(队列/预测/RCT
- [ ] REDCap中嵌入统计报告
- [ ] 可视化图表展示
- [ ] 测试:数据录入→自动分析→报告生成
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- SSA集成API
- 统计报告嵌入页面
---
### Phase 4: 鬮倡コァ蜉溯<EFBFBD><EFBFBD><EFBFBD>eek 7-8<>解沍?莨伜<E88EA8>郤ァP2
### Phase 4: 高级功能Week 7-8🌟 优先级P2
**逶ョ譬<EFBFBD>**<EFBFBD>哂I霎<EFBFBD>勧蠖募<EFBFBD>縲∵匱閭ス雍ィ謗ァ遲牙「槫€シ蜉溯<EFBFBD>?
**目标**AI辅助录入、智能质控等增值功能
#### Week 7: AI辅助录入
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
- [ ] €蜿第匱閭ス閾ェ蜉ィ螳梧<EFBFBD><EFBFBD>亥渕莠主紙蜿イ謨ー謐ョ<EFBFBD>?
- [ ] 蠑ょクク蛟シ鬚<EFBFBD>ュヲ<EFBFBD>亥ョ樊慮AI蛻、譁ュ<EFBFBD>?
- [ ] 蟄玲ョオ蜈ウ閨疲耳闕撰シ<EFBFBD>I鬚<EFBFBD>オ具シ?
**任务清单**
- [ ] 开发智能自动完成(基于历史数据)
- [ ] 异常值预警实时AI判断
- [ ] 字段关联推荐AI预测
- [ ] 录入效率提升统计
- [ ] 豬玖ッ包シ壼ス募<EFBFBD>菴馴ェ御シ伜喧鬪瑚ッ?
- [ ] 测试:录入体验优化验证
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- AI辅助录入JS插件
- 智能质控规则引擎
#### Week 8: 扈シ蜷域オ玖ッ穂ク惹シ伜<EFBFBD>?
#### Week 8: 综合测试与优化
**莉サ蜉。貂<EFBFBD>**<EFBFBD>?
- [ ] 諤ァ閭ス豬玖ッ包シ?00荳<30>擅隶ー蠖募酔豁・<E8B181>?
**任务清单**
- [ ] 性能测试100万条记录同步
- [ ] 安全测试API认证、数据加密
- [ ] 逕ィ謌キ鬪梧噺豬玖ッ包シ<EFBFBD>AT<EFBFBD>?
- [ ] <EFBFBD>。」郛門<EFBFBD><EFBFBD>育畑謌キ謇句<EFBFBD>?蠑€蜿第枚譯」<E8ADAF><EFBDA3>
- [ ] 驛ィ鄂イ蛻ー逕滉コァ邇ッ蠅?
- [ ] 用户验收测试UAT
- [ ] 文档编写(用户手册+开发文档)
- [ ] 部署到生产环境
**莠、莉倡<EFBFBD>?*<2A>?
**交付物**
- 性能测试报告
- 完整文档
- 生产环境部署
---
## <EFBFBD>白 螳牙<E89EB3>諤ァ隶セ隶?
## 🔒 安全性设计
### API认证机制
@@ -1097,7 +1097,7 @@ function verifySignature(req) {
- REDCap API Token使用AES-256加密存储
- 传输加密强制HTTPS
- 謨乗─蟄玲ョオ<EFBFBD>壽髪謖∝ュ玲ョオ郤ァ蜉<EFBFBD><EFBFBD><EFBFBD>HI謨ー謐ョ<EFBFBD>?
- 敏感字段支持字段级加密PHI数据
### 权限控制
@@ -1122,73 +1122,73 @@ interface UserPermission {
## 📚 技术栈总结
| 螻らコァ | REDCap萓?| AI蟷ウ蜿ー萓?|
| 层级 | REDCap| AI平台侧 |
|------|---------|---------|
| **编程语言** | PHP 7.4+ | TypeScript/Node.js 22 |
| **框架** | REDCap EM Framework v16 | Fastify v4 |
| **謨ー謐ョ蠎?* | MySQL 5.7+ | PostgreSQL 15 |
| **謨ー謐ョ讓。蝙<EFBFBD>** | EAV讓。蝙<EFBFBD> | 蜈ウ邉サ蝙?JSONB |
| **数据库** | 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签名 |
| **譌・蠢<EFBFBD>** | REDCap譌・蠢苓。?| Winston + SLS |
| **日志** | REDCap日志表 | Winston + SLS |
| **任务队列** | REDCap Cron | pg-boss (Postgres-Only) |
---
## <EFBFBD>統 荳倶ク€豁・陦悟<E999A6>?
## 📝 下一步行动
### 立即行动(本周)
1. **遑ョ隶、髴€豎?*<2A>?
1. **确认需求**
- [ ] 确认优先级DC优先还是SSA优先
- [ ] 确认部署形态云端SaaS还是私有化部署
- [ ] 确认REDCap服务器信息URL、版本、访问权限
2. **邇ッ蠅<EFBFBD>㊥螟<EFBFBD>**<EFBFBD>?
- [ ] 謳ュ蟒コREDCap豬玖ッ慕識蠅<EFBFBD>シ井スソ逕ィDocker<EFBFBD>?
- [ ] 蛻帛サコ豬玖ッ暮。ケ逶ョ蜥梧オ玖ッ墓焚謐?
2. **环境准备**
- [ ] 搭建REDCap测试环境(使用Docker
- [ ] 创建测试项目和测试数据
- [ ] 配置AI平台测试API
3. **蜷ッ蜉ィ蠑€蜿?*<2A>?
3. **启动开发**
- [ ] 创建External Module目录
- [ ] 初始化Git仓库
- [ ] 编写config.json
### €譛ッ鬚<EFBFBD><EFBFBD>?
### 技术预研
1. **REDCap API深入测试**
2. **External Module Hook机制验证**
3. **大数据量同步性能测试**
4. **遘サ蜉ィ遶ッ<EFBFBD><EFBFBD>EDCap Mobile App<EFBFBD>蛾寔謌仙庄陦梧€?*
4. **移动端REDCap Mobile App)集成可行性**
---
## 🎯 成功标准
**MVP迚域悽<EFBFBD><EFBFBD>hase 1-2螳梧<EFBFBD><EFBFBD>?*<2A>?
- 笨?REDCap謨ー謐ョ閭ス謗ィ騾∝芦AI蟷ウ蜿ー
- 笨?AI蟷ウ蜿ー閭ス謗・謾カ蟷カ蟄伜お謨ー謐ョ
- 笨?蟄玲ョオ譏<EFBDB5><EFBFBD><E89F86>鄂ョ蜉溯<E89C89>蜿ッ逕ィ
- 笨?蝓コ遑€蜷梧ュ・逶第而蜿ッ逕ィ
**MVP版本Phase 1-2完成)**
- REDCap数据能推送到AI平台
- ✅ AI平台能接收并存储数据
- ✅ 字段映射配置功能可用
- ✅ 基础同步监控可用
**<EFBFBD>㊥迚域悽<EFBFBD><EFBFBD>hase 3螳梧<E89EB3><E6A2A7>?*<2A>?
- 笨?DC讓。蝮鈴寔謌仙ョ梧<EFBDAE><E6A2A7><EFBFBD>蜉ィ貂<EFBDA8>エ暦シ<E69AA6>
- 笨?SSA讓。蝮鈴寔謌仙ョ梧<EFBFBD><EFBFBD><EFBFBD>蜉ィ蛻<EFBFBD><EFBFBD><EFBFBD>
- 笨?蛻<>梵扈捺棡蜿ッ蝨ィREDCap荳ュ譟・逵?
- 笨?逕ィ謌キ菴馴ェ梧オ∫腐
**标准版本Phase 3完成**
- ✅ DC模块集成完成自动清洗
- SSA模块集成完成(自动分析)
- ✅ 分析结果可在REDCap中查看
- ✅ 用户体验流畅
**莨∽ク夂沿譛ャ<EFBFBD><EFBFBD>hase 4螳梧<E89EB3><E6A2A7>?*<2A>?
- 笨?AI霎<49>勧蠖募<E8A096>謠仙合謨育紫50%+
- 笨?譎コ閭ス雍ィ謗ァ蜃丞ー鷹漠隸ッ邇?0%+
- 笨?謾ッ謖<EFBDAF>100荳?隶ー蠖募酔豁・
- 笨?螳牙<E89EB3>蜷郁ァ<E98381>シ育ャヲ蜷<EFBDA6>DA 21 CFR Part 11<EFBFBD>?
**企业版本Phase 4完成**
- ✅ AI辅助录入提升效率50%+
- ✅ 智能质控减少错误率80%+
- ✅ 支持100万+记录同步
- ✅ 安全合规符合FDA 21 CFR Part 11
---
**文档版本**v1.0
**譛€蜷取峩譁?*<2A>?025-12-30
**荳区ャ。譖エ譁ー**<EFBFBD>hase 1蜷ッ蜉ィ蜷取峩譁ー蠑€蜿題ソ帛コ?
**最后更新**2025-12-30
**下次更新**Phase 1启动后更新开发进度
---