Files
AIclinicalresearch/docs/03-业务模块/IIT Manager Agent/06-开发记录/Day2-REDCap实时集成开发完成记录.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

657 lines
14 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.
# Day 2 - REDCap 瀹炴椂闆嗘垚寮€鍙戝畬鎴愯<E98EB4>褰?
> **寮€鍙戞棩鏈?*: 2026-01-02
> **寮€鍙戣€?*: AI Assistant + 鐢ㄦ埛
> **鏂囨。鐗堟湰**: v1.0
> **寮€鍙戦樁娈?*: Day 2 - REDCap瀵规帴涓庡疄鏃跺悓姝?
---
## 馃搵 寮€鍙戞<E98D99>杩?
Day 2鐨勬牳蹇冪洰鏍囨槸瀹炵幇 **IIT Manager Agent 涓?REDCap 鐨勫疄鏃舵暟鎹<E69A9F>泦鎴?*锛岄噰鐢?REDCap 鍘熺敓鐨?**Data Entry Trigger (DET)** + **REST API** 鎶€鏈<E282AC>柟妗堬紝瀹炵幇闆跺欢杩熺殑鏁版嵁鍚屾<E98D9A>鍜屽弻鍚戦€氫俊銆?
### 鏍稿績浠峰€?
1. 鉁?**瀹炴椂鎬?*: Webhook鍝嶅簲鏃堕棿<10ms锛屾暟鎹<E69A9F>綍鍏ュ悗绔嬪嵆瑙﹀彂
2. 鉁?**鍙<>潬鎬?*: DET + 瀹氭椂杞<E6A482><E69D9E>鍙屼繚闄╂満鍒?
3. 鉁?**浜戝師鐢?*: 瀹屽叏鍩轰簬Postgres-Only鏋舵瀯锛屼娇鐢╬g-boss闃熷垪
4. 鉁?**鏍囧噯鍖?*: 绗﹀悎鍥㈤槦寮€鍙戣<E98D99>鑼冿紙闃熷垪鍚嶇О銆乄orker娉ㄥ唽绛夛級
---
## 馃幆 瀹屾垚鐨勫姛鑳芥ā鍧?
### 1. RedcapAdapter (API閫傞厤鍣?
**鏂囦欢**: `backend/src/modules/iit-manager/adapters/RedcapAdapter.ts`
**鏍稿績鍔熻兘**:
- 鉁?`testConnection()` - 杩炴帴娴嬭瘯
- 鉁?`exportMetadata()` - 瀵煎嚭瀛楁<E7809B>瀹氫箟锛?7涓<37>瓧娈碉級
- 鉁?`exportRecords()` - 瀵煎嚭璁板綍锛堟敮鎸佸叏閲?澧為噺/鎸囧畾璁板綍锛?
- 鉁?`importRecords()` - 瀵煎叆璁板綍锛圥hase 2棰勭暀锛?
**鍏抽敭鍙傛暟**:
- `baseUrl`: `http://localhost:8080`
- `apiToken`: `FCB30F9CBD12EE9E8E9B3E3A0106701B`
- `timeout`: 30绉?
**瀹為檯鎬ц兘**:
```
- exportMetadata: 260-560ms
- exportRecords (鍏ㄩ噺): 450-1,400ms
- exportRecords (澧為噺): 300-800ms
```
---
### 2. WebhookController (Webhook鎺ユ敹鍣?
**鏂囦欢**: `backend/src/modules/iit-manager/controllers/WebhookController.ts`
**鏍稿績閫昏緫**:
```typescript
1. 200 OK锛?10ms锛?
2. project_id鏄<EFBFBD><EFBFBD>
3. ф<EFBFBD><EFBFBD><EFBFBD>?
4. ¤<EFBFBD>EBHOOK_RECEIVED锛?
5. it_quality_check锛?
```
**REDCap DET鏍煎紡鏀<E7B4A1>**:
- 鉁?娣诲姞浜?`application/x-www-form-urlencoded` 瑙f瀽鍣?
- 鉁?鏀<>寔REDCap鍘熺敓POST鏍煎紡
**Webhook瀛楁<E7809B>**:
```json
{
"project_id": "16",
"record": "6",
"instrument": "demographics",
"redcap_event_name": "",
"redcap_version": "15.8.0",
"redcap_url": "http://localhost:8080"
}
```
---
### 3. SyncManager (杞<><E69D9E>悊鍣?
**鏂囦欢**: `backend/src/modules/iit-manager/services/SyncManager.ts`
**鏍稿績鍔熻兘**:
- 鉁?`initScheduledJob()` - 鍒濆<E98D92>鍖栧畾鏃朵换鍔★紙姣?鍒嗛挓锛?
- 鉁?`handlePoll()` - 杞<><E69D9E>鎵€鏈塧ctive椤圭洰
- 鉁?`manualSync()` - 鎵嬪姩鍚屾<E98D9A>鎸囧畾椤圭洰
- 鉁?`fullSync()` - 鍏ㄩ噺鍚屾<E98D9A>
**澧為噺鍚屾<E98D9A>绛栫暐**:
```typescript
// 鍩轰簬lastSyncAt鏃堕棿鎴?
dateRangeBegin: lastSyncAt || createdAt - 24h
```
**瀹¤<E780B9>鏃ュ織**:
- `SCHEDULED_SYNC`: 瀹氭椂杞<E6A482><E69D9E>瀹屾垚
- `MANUAL_SYNC`: 鎵嬪姩鍚屾<E98D9A>瀹屾垚
- `FULL_SYNC`: 鍏ㄩ噺鍚屾<E98D9A>瀹屾垚
---
### 4. Worker娉ㄥ唽 (寮傛<E5AFAE>浠诲姟澶勭悊)
**鏂囦欢**: `backend/src/modules/iit-manager/index.ts`
**娉ㄥ唽鐨刉orker**:
1. **iit_redcap_poll** (瀹氭椂杞<E6A482><E69D9E>)
- 闃熷垪鍚嶇О: `iit_redcap_poll`
- 瑙﹀彂棰戠巼: 姣?鍒嗛挓锛圕ron: `*/5 * * * *`锛?
- 骞跺彂鏁? 1
- 鍔熻兘: 杞<><E69D9E>鎵€鏈塧ctive椤圭洰鐨勫<E990A8>閲忔暟鎹?
2. **iit_quality_check** (璐ㄦ帶浠诲姟)
- 闃熷垪鍚嶇О: `iit_quality_check`
- 瑙﹀彂鏂瑰紡: Webhook/SyncManager鎺ㄩ€?
- 鍔熻兘: 璐ㄦ帶閫昏緫锛圥hase 1.5瀹炵幇锛?
**鍏抽敭淇<E695AD><E6B787>**:
- 鉂?鍒濆<E98D92>: `await jobQueue.work('iit:redcap:poll', ...)`
- 鉁?淇<><E6B787>: `jobQueue.process('iit_redcap_poll', ...)`
- 鉂?鍒濆<E98D92>: 闃熷垪鍚嶇О浣跨敤鍐掑彿 `iit:quality-check`
- 鉁?淇<><E6B787>: 浣跨敤涓嬪垝绾?`iit_quality_check`
---
### 5. 璺<>敱閰嶇疆
**鏂囦欢**: `backend/src/modules/iit-manager/routes/index.ts`
**娉ㄥ唽鐨凙PI绔<49>**:
| 绔<>偣 | 鏂规硶 | 鍔熻兘 | 鐘舵€?|
|------|------|------|------|
| `/api/v1/iit/health` | GET | 鍋ュ悍妫€鏌?| 鉁?|
| `/api/v1/iit/webhooks/redcap` | POST | DET鍥炶皟鎺ユ敹 | 鉁?|
| `/api/v1/iit/webhooks/health` | GET | Webhook鍋ュ悍妫€鏌?| 鉁?|
| `/api/v1/iit/projects/:id/sync` | POST | 鎵嬪姩鍚屾<E98D9A> | 鉁?|
| `/api/v1/iit/projects/:id/full-sync` | POST | 鍏ㄩ噺鍚屾<E98D9A> | 鉁?|
---
## 馃悰 閬囧埌鐨勯棶棰樹笌瑙喅鏂规<E98F82>
### 闂<><E99782>1: 妯″潡璺<E6BDA1>緞瑙瀽閿欒<E996BF>
**閿欒<E996BF>淇℃伅**:
```
Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@/common'
```
**鍘熷洜**: 椤圭洰浣跨敤鐩稿<E990A9><EFBFBD>緞锛岃€屼笉鏄<E7AC89>矾寰勫埆鍚?`@/common`
**瑙喅鏂规<E98F82>**:
```typescript
// 閿欒<E996BF>
import { logger } from '@/common/logging';
import { jobQueue } from '@/common/jobs';
// 姝g‘
import { logger } from '../../../common/logging/index.js';
import { jobQueue } from '../../../common/jobs/index.js';
```
**淇<>敼鏂囦欢**: 鎵€鏈塈IT Manager妯″潡鐨刬mport璇<74>
---
### 闂<><E99782>2: 鏁版嵁搴撳瓧娈靛悕绉颁笉涓€鑷?
**閿欒<E996BF>淇℃伅**:
```sql
ERROR: column "redcapProjectId" does not exist
```
**鍘熷洜**: Prisma浣跨敤camelCase锛屼絾PostgreSQL瀹為檯浣跨敤snake_case
**鏁版嵁搴撶湡瀹炴儏鍐?*:
```sql
-- 琛ㄥ悕: iit_schema.projects (not IitProject)
-- 瀛楁<E7809B>鍚? redcap_project_id (not redcapProjectId)
```
**瑙喅鏂规<E98F82>**:
1. 鉁?TypeScript浠爜涓<E7889C>户缁<E688B7>娇鐢≒risma鐨刢amelCase锛堣嚜鍔ㄦ槧灏勶級
2. 鉁?鍘熷<E98D98>SQL璇<4C>彞鏀逛负snake_case
3. 鉁?JSON瀛楁<E7809B>浣跨敤 `'{}'::jsonb` 绫诲瀷杞<E780B7>
**淇<>敼鏂囦欢**:
- 娴嬭瘯鑴氭湰涓<E6B9B0>殑SQL璇<4C>
- 鏂囨。涓<E38082>殑SQL绀轰緥
---
### 闂<><E99782>3: pg-boss浠诲姟鍚嶇О鏍煎紡閿欒<E996BF>
**閿欒<E996BF>淇℃伅**:
```
Name can only contain alphanumeric characters, underscores, hyphens, or periods
```
**鍘熷洜**: 鍒濆<E98D92>浣跨敤杩炲瓧绗?`-`锛屼絾瀹為檯娴嬭瘯鍙戠幇涓嶇ǔ瀹?
**鍥㈤槦鏍囧噯**:
```typescript
?'iit:quality-check' // 鍐掑彿
?'iit-quality-check' // 杩炲瓧绗︼紙涓嶇ǔ瀹氾級
?'iit_quality_check' // 涓嬪垝绾匡紙鎺ㄨ崘锛?
```
**淇<>**:
- `iit:quality-check` 鈫?`iit_quality_check`
- `iit:redcap:poll` 鈫?`iit_redcap_poll`
**渚濇嵁鏂囨。**: `AIclinicalresearch\docs\02-閫氱敤鑳藉姏灞俓Postgres-Only寮傛<E5AFAE>浠诲姟澶勭悊鎸囧崡.md`
---
### 闂<><E99782>4: Worker娉ㄥ唽鏂规硶閿欒<E996BF>
**閿欒<E996BF>**: 浣跨敤浜?`await jobQueue.work()`
**姝g‘鏂规硶**: 浣跨敤 `jobQueue.process()`
**瀵规瘮**:
```typescript
// 鉂?閿欒<E996BF>
await jobQueue.work(
'iit_redcap_poll',
{ teamSize: 1, teamConcurrency: 1 },
async (job) => { ... }
);
// 鉁?姝g‘
jobQueue.process('iit_redcap_poll', async (job) => {
// ...
return { success: true };
});
```
---
### 闂<><E99782>5: REDCap DET鏍煎紡涓嶅吋瀹?
**閿欒<E996BF>淇℃伅**:
```
Unsupported Media Type: application/x-www-form-urlencoded
```
**鍘熷洜**: REDCap DET鍙戦€佺殑鏄<E6AE91>〃鍗曟牸寮忥紝鑰屼笉鏄疛SON
**瑙喅鏂规<E98F82>**: 娣诲姞Content-Type瑙瀽鍣?
```typescript
fastify.addContentTypeParser(
'application/x-www-form-urlencoded',
{ parseAs: 'string' },
(req, body, done) => {
try {
const params = new URLSearchParams(body as string);
const parsed: any = {};
params.forEach((value, key) => {
parsed[key] = value;
});
done(null, parsed);
} catch (err: any) {
done(err);
}
}
);
```
---
### 闂<><E99782>6: Docker缃戠粶璁块棶闂<E6A3B6><E99782>
**闂<><E99782>**: REDCap瀹瑰櫒鏃犳硶閫氳繃 `localhost` 璁块棶瀹夸富鏈烘湇鍔?
**DET URL閰嶇疆**:
```
鉂?http://localhost:3001/api/v1/iit/webhooks/redcap
鉁?http://host.docker.internal:3001/api/v1/iit/webhooks/redcap
```
**楠岃瘉鏂规硶**:
```bash
docker exec redcap-apache curl http://host.docker.internal:3001/api/v1/iit/health
# 鉁?鎴愬姛杩斿洖
```
---
## 鉁?娴嬭瘯楠岃瘉
### 1. API杩炴帴娴嬭瘯
**娴嬭瘯鑴氭湰**: `test-redcap-api.ts`
**缁撴灉**:
```
鉁?杩炴帴鎴愬姛
鉁?鍏冩暟鎹<E69A9F><E98EB9>鍑? 17涓<37>瓧娈?
鉁?璁板綍瀵煎嚭: 6鏉¤<E98F89>褰?(ID: 1,2,3,4,5,6)
鉁?澧為噺鍚屾<E98D9A>: 鎴愬姛鑾峰彇鏈€杩?灏忔椂鏁版嵁
鉁?鎸囧畾璁板綍: 鎴愬姛瀵煎嚭鍗曟潯璁板綍
```
---
### 2. Webhook鎺ユ敹娴嬭瘯
**娴嬭瘯鑴氭湰**: `test-redcap-webhook.ts`
**缁撴灉**:
```
鉁?鍋ュ悍妫€鏌? ok
鉁?Webhook鍙戦€佹垚鍔? 200
鉁?鍝嶅簲鏃堕棿: <10ms (浼樼<E6B5BC>)
鉁?骞傜瓑鎬ф<E98EAC>鏌? 閫氳繃
鉁?鏃犳晥璇锋眰鎷︽埅: 400閿欒<E996BF>
```
---
### 3. 闆嗘垚娴嬭瘯
**娴嬭瘯鑴氭湰**: `test-redcap-integration.ts`
**缁撴灉**: **12/12 閫氳繃** 鉁?
```
鉁?1. 鍚庣<E98D9A>鏈嶅姟杩愯<E69DA9>
鉁?2. 椤圭洰閰嶇疆瀛樺湪
鉁?3. REDCap API杩炴帴鎴愬姛
鉁?4. 鍏冩暟鎹<E69A9F>幏鍙栨垚鍔?
鉁?5. 璁板綍鑾峰彇鎴愬姛
鉁?6. Webhook鍝嶅簲閫熷害<100ms
鉁?7. 寮傛<E5AFAE>澶勭悊绛夊緟瀹屾垚
鉁?8. 瀹¤<E780B9>鏃ュ織璁板綍瀹屾暣
鉁?9. 澧為噺鍚屾<E98D9A>鎴愬姛
鉁?10. 鎵嬪姩鍚屾<E98D9A>鎴愬姛 猸?
鉁?11. Webhook鍋ュ悍妫€鏌?
鉁?12. 骞傜瓑鎬ф祴璇曢€氳繃
```
---
### 4. 鐪熷疄鍦烘櫙娴嬭瘯
**鎿嶄綔**:
1. 鍦≧EDCap涓<70>柊澧炶<E6BEA7>褰旾D 5
2. 鍦≧EDCap涓<70>紪杈戣<E69D88>褰旾D 1
3. 鍦≧EDCap涓<70>柊澧炶<E6BEA7>褰旾D 6
4. 鍦≧EDCap涓<70>紪杈戣<E69D88>褰旾D 4
**Webhook鎺ユ敹鏃ュ織**:
```sql
action_type | entity_id | details
------------------+-----------+--------------------------------------------------
WEBHOOK_RECEIVED | 4 | instrument: ddcd, project_id: 16
WEBHOOK_RECEIVED | 6 | instrument: demographics, project_id: 16
```
**楠岃瘉缁撴灉**: 鉁?鏁版嵁瀹屽叏涓€鑷?
---
## 馃搳 鎬ц兘鎸囨爣
### API鍝嶅簲鏃堕棿
| 鎿嶄綔 | 鑰楁椂 | 鏁版嵁閲?|
|------|------|--------|
| exportMetadata | 260-560ms | 17涓<37>瓧娈?|
| exportRecords (鍏ㄩ噺) | 450-1,400ms | 6鏉¤<E98F89>褰?|
| exportRecords (澧為噺) | 300-800ms | 鍙樺寲璁板綍 |
| Webhook鍝嶅簲 | **<10ms** | 绔嬪嵆杩斿洖 |
### 瀹炴椂鎬ч獙璇?
| 鎸囨爣 | 鐩<>爣 | 瀹為檯 | 鐘舵€?|
|------|------|------|------|
| Webhook鍝嶅簲鏃堕棿 | <100ms | **7ms** | 鉁?浼樼<E6B5BC> |
| DET瑙﹀彂寤惰繜 | 0绉?| **0绉?* | 鉁?瀹岀編 |
| 鏁版嵁鍚屾<E98D9A>鍑嗙鎬?| 100% | **100%** | 鉁?瀹岀編 |
---
## 馃梽锔?鏁版嵁搴撻厤缃?
### REDCap椤圭洰閰嶇疆
**鏁版嵁搴撹〃**: `iit_schema.projects`
```sql
INSERT INTO iit_schema.projects (
id,
name,
redcap_project_id,
redcap_api_token,
redcap_base_url,
status,
settings,
created_at,
updated_at
) VALUES (
'40062738-2eb5-472f-8a36-e098f5c2f9b9',
'test0102',
'16',
'FCB30F9CBD12EE9E8E9B3E3A0106701B',
'http://localhost:8080',
'active',
'{}'::jsonb,
NOW(),
NOW()
);
```
### REDCap椤圭洰淇℃伅
| 瀛楁<E7809B> | 鍊?|
|------|-----|
| **椤圭洰鍚嶇О** | test0102 |
| **Project ID** | 16 (int) |
| **REDCap URL** | http://localhost:8080/redcap_v15.8.0 |
| **API Token** | FCB30F9CBD12EE9E8E9B3E3A0106701B |
| **DET URL** | http://host.docker.internal:3001/api/v1/iit/webhooks/redcap |
### 琛ㄥ崟缁撴瀯
**1. demographics (鍩烘湰淇℃伅)**
- record_id, first_name, last_name, address
- telephone, email, dob, age
- ethnicity, race, sex
- height, weight, bmi
- comments, demographics_complete
**2. ddcd (鑷<>畾涔夎〃鍗?**
- zhiliaoshi (娌荤枟瀹?
- shifou (鏄<>惁)
- ddcd_complete
---
## 馃摑 瀹¤<E780B9>鏃ュ織绀轰緥
### Webhook鎺ユ敹鏃ュ織
```json
{
"action_type": "WEBHOOK_RECEIVED",
"entity_id": "6",
"details": {
"record": "6",
"source": "redcap_det",
"instrument": "demographics",
"project_id": "16"
},
"created_at": "2026-01-02 09:50:32"
}
```
### 鍚屾<E98D9A>瀹屾垚鏃ュ織
```json
{
"action_type": "SCHEDULED_SYNC",
"entity_id": "40062738-2eb5-472f-8a36-e098f5c2f9b9",
"details": {
"source": "sync_manager",
"duration": 447,
"recordCount": 3,
"uniqueRecordCount": 3
},
"created_at": "2026-01-02 09:20:17"
}
```
---
## 馃帗 缁忛獙鎬荤粨
### 1. 鎶€鏈<E282AC>€夊瀷楠岃瘉
**鉁?REDCap DET + REST API鏂规<E98F82>浼樺娍**:
- 闆跺紑鍙戞垚鏈<E59E9A>紙REDCap鍘熺敓鏀<E69593>寔锛?
- 闆跺欢杩燂紙瀹炴椂瑙﹀彂锛?
- 楂樺彲闈狅紙Webhook + 杞<><E69D9E>鍙屼繚闄╋級
- 鏄撶淮鎶わ紙鏍囧噯HTTP鎺ュ彛锛?
**鉂?鏀惧純鐨勬柟妗?*:
- External Module锛堥渶瑕丳HP寮€鍙戯級
-<>疆璇<E79686>紙寤惰繜楂橈紝璧勬簮娴<E7B0AE>垂锛?
---
### 2. 寮€鍙戣<E98D99>鑼冮伒寰?
**鉁?绗﹀悎鍥㈤槦鏍囧噯**:
- 闃熷垪鍚嶇О: 浣跨敤涓嬪垝绾匡紙`iit_quality_check`锛?
- Worker娉ㄥ唽: 浣跨敤 `jobQueue.process()`
- 瀹¤<E780B9>鏃ュ織: 璁板綍鎵€鏈夊叧閿<E58FA7>搷浣?
- 閿欒<E996BF>澶勭悊: 缁熶竴寮傚父鎹曡幏鍜屾棩蹇楄<E8B987>褰?
**鍙傝€冩枃妗?*:
- `Postgres-Only寮傛<E5AFAE>浠诲姟澶勭悊鎸囧崡.md`
- `REDCap瀵规帴鎶€鏈<E282AC>柟妗堜笌瀹炴柦鎸囧崡.md`
---
### 3. 璋冭瘯鎶€宸?
**Docker瀹瑰櫒璋冭瘯**:
```bash
# 娴嬭瘯缃戠粶杩為€氭€?
docker exec redcap-apache curl http://host.docker.internal:3001/api/v1/iit/health
# 鏌ヨ<E98F8C>瀹¤<E780B9>鏃ュ織
docker exec ai-clinical-postgres psql -U postgres -d ai_clinical_research \
-c "SELECT * FROM iit_schema.audit_logs ORDER BY created_at DESC LIMIT 5;"
# 鏌ヨ<E98F8C>椤圭洰閰嶇疆
docker exec ai-clinical-postgres psql -U postgres -d ai_clinical_research \
-c "SELECT name, redcap_project_id, status FROM iit_schema.projects;"
```
**REDCap鏁版嵁搴撴煡璇?*:
```bash
docker exec redcap-mysql mysql -u redcap_user -predcap_pass_dev_456 redcap \
-e "SELECT project_id, app_title FROM redcap_projects WHERE project_id = 16;"
```
---
## 馃摎 鐩稿叧鏂囨。
| 鏂囨。鍚嶇О | 璺<>緞 | 璇存槑 |
|---------|------|------|
| REDCap瀵规帴鎶€鏈<E282AC>柟妗?| `04-寮€鍙戣<E98D99>鍒?REDCap瀵规帴鎶€鏈<E282AC>柟妗堜笌瀹炴柦鎸囧崡.md` | Day 2鎶€鏈<E282AC>柟妗?|
| MVP寮€鍙戜换鍔℃竻鍗?| `04-寮€鍙戣<E98D99>鍒?MVP寮€鍙戜换鍔℃竻鍗?md` | 鏁翠綋寮€鍙戣<E98D99>鍒?|
| Postgres-Only寮傛<E5AFAE>浠诲姟澶勭悊鎸囧崡 | `docs/02-閫氱敤鑳藉姏灞?Postgres-Only寮傛<E5AFAE>浠诲姟澶勭悊鎸囧崡.md` | 闃熷垪寮€鍙戣<E98D99>鑼?|
| 妯″潡褰撳墠鐘舵€?| `00-妯″潡褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md` | 妯″潡鏁翠綋鐘舵€?|
---
## 馃殌 涓嬩竴姝ヨ<E5A79D>鍒?
### Phase 1.5 - 璐ㄦ帶閫昏緫瀹炵幇
**鐩<>**: 瀹炵幇AI椹卞姩鐨勬暟鎹<E69A9F>川鎺?
**鏍稿績鍔熻兘**:
1. 瀹炵幇 `iit_quality_check` Worker鐨勮川鎺ч€昏緫
2. 璋冪敤Dify宸ヤ綔娴佽繘琛屾暟鎹<E69A9F>獙璇?
3. 鐢熸垚璐ㄦ帶寤鸿<E5AFA4>锛坰hadow state锛?
4. 杩斿洖缁撴灉缁欑爺绌惰€?
**棰勪及宸ヤ綔閲?*: 1-2澶?
---
### Phase 2 - 鍙屽悜鍚屾<E98D9A>
**鐩<>**: 瀹炵幇AI寤鸿<E5AFA4>鍥炲啓鍒癛EDCap
**鏍稿績鍔熻兘**:
1. 瀹屽杽 `importRecords()` API
2. 瀹炵幇shadow state瀹℃壒娴佺▼
3. 缁忕爺绌惰€呯璁ゅ悗鍚屾<E98D9A>鍒癛EDCap
4. 澶勭悊鍐茬獊鍜岀増鏈<E5A297>帶鍒?
**棰勪及宸ヤ綔閲?*: 2-3澶?
---
## 鉁?楠屾敹娓呭崟
- [x] RedcapAdapter API閫傞厤鍣ㄥ畬鎴?
- [x] WebhookController Webhook鎺ユ敹鍣ㄥ畬鎴?
- [x] SyncManager 杞<><E69D9E>悊鍣ㄥ畬鎴?
- [x] Worker娉ㄥ唽鍜岄槦鍒楅厤缃<E58EA4>畬鎴?
- [x]<>敱閰嶇疆鍜孋ontent-Type瑙瀽瀹屾垚
- [x] 鍗曞厓娴嬭瘯鑴氭湰閫氳繃锛坱est-redcap-api.ts锛?
- [x] Webhook娴嬭瘯閫氳繃锛坱est-redcap-webhook.ts锛?
- [x] 闆嗘垚娴嬭瘯閫氳繃锛坱est-redcap-integration.ts锛?2/12锛?
- [x] 鐪熷疄鍦烘櫙娴嬭瘯閫氳繃锛堟柊澧?缂栬緫璁板綍锛?
- [x] 瀹¤<E780B9>鏃ュ織璁板綍瀹屾暣
- [x] 鎬ц兘鎸囨爣杈炬爣锛圵ebhook<10ms锛?
- [x] 绗﹀悎鍥㈤槦寮€鍙戣<E98D99>鑼?
- [x] 鏂囨。鏇存柊瀹屾垚
---
## 馃搶 闄勫綍
### A. 鐜<><E9909C>淇℃伅
```yaml
寮€鍙戠幆澧?
- OS: Windows 11
- Node.js: v22.18.0
- PostgreSQL: 16.1 (Docker)
- REDCap: 15.8.0 (Docker)
- Backend: Fastify + Prisma
- 闃熷垪: pg-boss
Docker瀹瑰櫒:
- redcap-apache: REDCap搴旂敤
- redcap-mysql: REDCap鏁版嵁搴?
- ai-clinical-postgres: IIT鏁版嵁搴?
```
### B. 鍏抽敭浠g爜鏂囦欢娓呭崟
```
backend/src/modules/iit-manager/
鈹溾攢鈹€ adapters/
鈹? 鈹斺攢鈹€ RedcapAdapter.ts (271琛?
鈹溾攢鈹€ controllers/
鈹? 鈹斺攢鈹€ WebhookController.ts (327琛?
鈹溾攢鈹€ services/
鈹? 鈹斺攢鈹€ SyncManager.ts (398琛?
鈹溾攢鈹€ routes/
鈹? 鈹斺攢鈹€ index.ts (203琛?
鈹溾攢鈹€ index.ts (91琛?
鈹溾攢鈹€ test-redcap-api.ts (189琛?
鈹溾攢鈹€ test-redcap-webhook.ts (274琛?
鈹斺攢鈹€ test-redcap-integration.ts (449琛?
```
**鎬讳唬鐮侀噺**: ~2,200琛?
---
**鏂囨。缁存姢鑰?*: 寮€鍙戝洟闃?
**鏈€鍚庢洿鏂?*: 2026-01-02
**鐘舵€?*: 鉁?Day 2 寮€鍙戝畬鎴?