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
864 lines
25 KiB
Markdown
864 lines
25 KiB
Markdown
# IIT Manager Agent MVP 开发任务清单
|
||
|
||
> **版本:** V1.1(基于架构评审修正版)
|
||
> **时间规划:** 2周(10个工作日)
|
||
> **目标:** 打通 REDCap → Node.js → 企微 的完整闭环
|
||
> **参考文档:** `02-技术设计/IIT Manager Agent 完整技术开发方案 (V1.1).md`
|
||
|
||
---
|
||
|
||
## 📅 Week 1:基础连接层(Day 1-5)
|
||
|
||
### Day 1:环境初始化(8小时)✅ **已完成(2025-12-31 ~ 2026-01-01)**
|
||
|
||
#### 数据库初始化(4小时)✅
|
||
|
||
- [x] 创建 `iit_schema` 数据库Schema
|
||
- [x] 编写 Prisma Schema
|
||
- [x] IitProject 表(含V1.1新增字段:cachedRules, lastSyncAt)
|
||
- [x] IitPendingAction 表(影子状态)
|
||
- [x] IitTaskRun 表(任务管理)
|
||
- [x] IitUserMapping 表(含V1.1新增字段:miniProgramOpenId, sessionKey)
|
||
- [x] IitAuditLog 表(审计日志)
|
||
- [x] 同步数据库:`npx prisma db push`
|
||
- [x] 生成 Prisma Client:`npx prisma generate`
|
||
- [x] 验证:编写测试CRUD操作(`test-iit-database.ts`)
|
||
|
||
**验收标准**:
|
||
- ✅ 5个表全部创建成功
|
||
- ✅ Prisma Client可正常导入
|
||
- ✅ 测试脚本能执行CRUD(11/11测试通过)
|
||
|
||
**完成情况**:
|
||
- ✅ Schema定义完整(223行类型定义)
|
||
- ✅ 数据库表创建成功
|
||
- ✅ CRUD操作验证通过
|
||
|
||
#### 企业微信初始化(2小时)✅
|
||
|
||
- [x] 注册企业微信开发者账号
|
||
- [x] 创建自建应用:`IIT Manager Agent`
|
||
- [x] 获取并保存凭证:
|
||
- [x] CorpID: `ww01cb7b72ea2db83c`
|
||
- [x] AgentID: `1000002`
|
||
- [x] Secret: `F3XqlAqKdcOKHi9pLGv5a2dSUowWbevdcDRrBk2pXLM`
|
||
- [x] 配置环境变量到后端 SAE
|
||
- [x] 测试:获取Access Token成功
|
||
|
||
**验收标准**:
|
||
- ✅ 企微账号注册成功
|
||
- ✅ 能成功获取Access Token
|
||
- ✅ **网页授权及JS-SDK授权已获取**
|
||
- ✅ **可信域名配置成功:iit.xunzhengyixue.com**
|
||
|
||
**完成情况**:
|
||
- ✅ 企业微信应用创建成功
|
||
- ✅ Access Token获取测试通过(`test-wechat-push.ts`)
|
||
- ✅ 前端域名验证文件部署成功(v1.2)
|
||
- ✅ 可信域名授权完成
|
||
|
||
#### 项目初始化(2小时)✅
|
||
|
||
- [x] 创建模块目录结构
|
||
```
|
||
backend/src/modules/iit-manager/
|
||
├── controllers/
|
||
├── services/
|
||
├── agents/
|
||
├── adapters/
|
||
├── routes/
|
||
└── types/
|
||
```
|
||
- [x] 配置路由前缀:`/api/v1/iit`
|
||
- [x] 配置健康检查端点
|
||
- [x] 创建基础类型定义(223行)
|
||
|
||
**验收标准**:
|
||
- ✅ 目录结构完整
|
||
- ✅ 路由骨架已创建
|
||
- ✅ 类型定义完整
|
||
|
||
**完成情况**:
|
||
- ✅ 模块目录结构创建完成
|
||
- ✅ `types/index.ts` 完整定义(223行)
|
||
- ✅ 路由骨架创建(`routes/index.ts`)
|
||
- ✅ 主模块入口创建(`index.ts`)
|
||
|
||
---
|
||
|
||
### 📊 Day 1 完成总结
|
||
|
||
**实际完成时间**:2025-12-31 ~ 2026-01-01
|
||
**任务完成度**:11/11(100%)
|
||
**关键成果**:
|
||
1. ✅ 数据库Schema创建(iit_schema,5个表)
|
||
2. ✅ Prisma Schema编写(223行类型定义)
|
||
3. ✅ 模块目录结构创建
|
||
4. ✅ 企业微信应用注册和配置
|
||
5. ✅ 企业微信Access Token获取成功
|
||
6. ✅ 企业微信可信域名配置成功(iit.xunzhengyixue.com)
|
||
7. ✅ 前端域名验证文件部署(v1.2)
|
||
|
||
**重要里程碑**:
|
||
- 🎉 IIT Manager Agent模块正式启动
|
||
- 🎉 企业微信集成基础完成
|
||
- 🎉 网页授权及JS-SDK授权已获取
|
||
|
||
---
|
||
|
||
### Day 2:REDCap实时集成(8小时)✅ **已完成(2026-01-02)**
|
||
|
||
#### REDCap API Adapter(4小时)✅
|
||
|
||
- [x] 创建 `RedcapAdapter.ts`(271行)
|
||
- [x] 实现 `exportRecords()` 方法
|
||
- [x] 支持 `dateRangeBegin` 时间过滤
|
||
- [x] 支持 `fields` 字段过滤
|
||
- [x] 支持 `records` 记录过滤
|
||
- [x] 实现 `importRecords()` 方法(回写数据)
|
||
- [x] 实现 `exportMetadata()` 方法(获取字段定义)
|
||
- [x] 配置超时和重试机制
|
||
- [x] 编写集成测试脚本
|
||
|
||
**验收标准**:
|
||
- ✅ 能成功拉取REDCap数据(test0102项目,PID 16)
|
||
- ✅ 时间过滤功能正常
|
||
- ✅ 集成测试通过(test-redcap-api.ts)
|
||
|
||
**完成情况**:
|
||
- ✅ RedcapAdapter 实现完整(7个核心方法)
|
||
- ✅ 支持REDCap REST API v15.8.0
|
||
- ✅ API测试验证通过
|
||
|
||
#### WebhookController + SyncManager(4小时)✅
|
||
|
||
- [x] 创建 `WebhookController.ts`(327行)
|
||
- [x] 实现 DET webhook 接收(<10ms响应)
|
||
- [x] 幂等性检查(防重复处理)
|
||
- [x] 队列任务推送(iit_quality_check)
|
||
- [x] 审计日志记录
|
||
- [x] 创建 `SyncManager.ts`(398行)
|
||
- [x] 实现定时轮询机制(pg-boss schedule)
|
||
- [x] 增量数据拉取(按时间过滤)
|
||
- [x] 全量数据同步(初始化或修复)
|
||
- [x] Worker 注册(iit_redcap_poll)
|
||
- [x] 配置 Fastify 路由
|
||
- [x] POST `/api/v1/iit/webhooks/redcap`
|
||
- [x] POST `/api/v1/iit/projects/:id/sync`
|
||
- [x] POST `/api/v1/iit/projects/:id/full-sync`
|
||
- [x] 添加 form-urlencoded 解析器(支持REDCap DET格式)
|
||
|
||
**验收标准**:
|
||
- ✅ DET实时触发成功(0ms延迟)
|
||
- ✅ 轮询任务正常调度(pg-boss)
|
||
- ✅ 幂等性保护生效
|
||
- ✅ 审计日志完整
|
||
|
||
**完成情况**:
|
||
- ✅ WebhookController响应时间 <10ms
|
||
- ✅ 集成测试12/12通过
|
||
- ✅ 真实场景验证通过(REDCap → Node.js → 队列)
|
||
- ✅ Docker网络问题解决(host.docker.internal)
|
||
|
||
---
|
||
|
||
### 📊 Day 2 完成总结
|
||
|
||
**实际完成时间**:2026-01-02
|
||
**任务完成度**:100%
|
||
**关键成果**:
|
||
1. ✅ RedcapAdapter 实现完整(271行,7个方法)
|
||
2. ✅ WebhookController 实现完整(327行,<10ms响应)
|
||
3. ✅ SyncManager 实现完整(398行,增量+全量)
|
||
4. ✅ Worker注册(iit_quality_check + iit_redcap_poll)
|
||
5. ✅ 路由配置(5个API端点)
|
||
6. ✅ 集成测试脚本(3个,912行)
|
||
7. ✅ 真实场景验证通过
|
||
|
||
**技术亮点**:
|
||
- 🔥 REDCap DET实时触发(0ms延迟)
|
||
- 🔥 Webhook + 轮询双重机制
|
||
- 🔥 form-urlencoded格式支持
|
||
- 🔥 Postgres-Only架构(pg-boss队列)
|
||
|
||
**参考文档**:
|
||
- `06-开发记录/Day2-REDCap实时集成开发完成记录.md`
|
||
|
||
---
|
||
|
||
### Day 3:企业微信集成(8小时)✅ **已完成(2026-01-02)**
|
||
|
||
#### WechatService(企业微信推送)(2小时)✅
|
||
|
||
- [x] 创建 `WechatService.ts`(314行)
|
||
- [x] 实现 Access Token 管理(缓存+自动刷新)
|
||
- [x] 实现 `sendTextMessage()` 方法
|
||
- [x] 实现 `sendMarkdownMessage()` 方法
|
||
- [x] 审计日志记录
|
||
|
||
**验收标准**:
|
||
- ✅ Access Token 获取成功
|
||
- ✅ 消息推送功能正常
|
||
- ✅ Token缓存机制生效
|
||
|
||
**完成情况**:
|
||
- ✅ Token缓存7200秒,提前5分钟刷新
|
||
- ✅ 完整的错误处理和重试
|
||
- ✅ 详细的日志记录
|
||
|
||
#### WechatCallbackController(企业微信回调)(4小时)✅
|
||
|
||
- [x] 创建 `WechatCallbackController.ts`(501行)
|
||
- [x] 实现 URL 验证(GET请求)
|
||
- [x] 实现消息接收(POST请求)
|
||
- [x] 实现异步回复模式(规避5秒超时)
|
||
- [x] 实现消息解密(@wecom/crypto)
|
||
- [x] 实现签名验证(@wecom/crypto)
|
||
- [x] 实现关键词意图识别
|
||
- [x] 实现业务逻辑(汇总、帮助、新患者)
|
||
|
||
**验收标准**:
|
||
- ✅ URL验证通过
|
||
- ✅ 消息解密成功
|
||
- ✅ 签名验证通过
|
||
- ✅ 异步处理正常
|
||
|
||
**完成情况**:
|
||
- ✅ 企业微信开发者调试工具验证通过
|
||
- ✅ 返回状态:request: 成功
|
||
- ✅ HTTP 200,解密23位字符正确
|
||
- ✅ 异步回复模式实现完整
|
||
|
||
#### 质控Worker完善(1小时)✅
|
||
|
||
- [x] 完善 `iit_quality_check` Worker
|
||
- [x] 实现简单质控逻辑
|
||
- [x] 实现企业微信通知推送
|
||
- [x] 实现通知消息格式化
|
||
|
||
**验收标准**:
|
||
- ✅ Worker正常执行
|
||
- ✅ 企业微信推送成功
|
||
- ✅ 通知格式正确
|
||
|
||
**完成情况**:
|
||
- ✅ 质控逻辑实现(基础规则检查)
|
||
- ✅ 通知消息格式化完成
|
||
- ✅ 审计日志记录完整
|
||
|
||
#### 配置与测试(1小时)✅
|
||
|
||
- [x] 安装依赖(@wecom/crypto, xml2js)
|
||
- [x] 配置环境变量(.env)
|
||
- [x] 配置企业微信路由
|
||
- [x] natapp内网穿透配置
|
||
- [x] 企业微信URL验证测试
|
||
|
||
**验收标准**:
|
||
- ✅ 依赖安装成功
|
||
- ✅ 环境变量配置正确
|
||
- ✅ URL验证通过
|
||
- ✅ natapp隧道在线
|
||
|
||
**完成情况**:
|
||
- ✅ @wecom/crypto 和 xml2js 安装完成
|
||
- ✅ 环境变量配置验证通过
|
||
- ✅ natapp配置成功(http://iit.nat100.top)
|
||
- ✅ 企业微信调试工具验证通过
|
||
|
||
---
|
||
|
||
### 📊 Day 3 完成总结
|
||
|
||
**实际完成时间**:2026-01-03
|
||
**任务完成度**:100%
|
||
**关键成果**:
|
||
1. ✅ WechatService 实现完整(314行)
|
||
2. ✅ WechatCallbackController 实现完整(501行)
|
||
3. ✅ 质控Worker企业微信推送功能
|
||
4. ✅ 企业微信路由配置(GET + POST)
|
||
5. ✅ natapp内网穿透配置成功
|
||
6. ✅ 企业微信URL验证测试通过
|
||
7. ✅ **端到端测试通过**(REDCap → Node.js → 企业微信)
|
||
8. ✅ **Worker注册修复**(`initIitManager()` 调用)
|
||
9. ✅ **数据库字段名修复**(`action_type`)
|
||
10. ✅ **MVP闭环打通**(<2秒延迟,100%成功率)
|
||
|
||
**技术亮点**:
|
||
- 🔥 异步回复模式(规避5秒超时)
|
||
- 🔥 @wecom/crypto正确用法(decrypt 2个参数)
|
||
- 🔥 签名验证(getSignature)
|
||
- 🔥 消息解密(XML + AES)
|
||
- 🔥 natapp内网穿透(https支持)
|
||
- 🔥 **pg-boss Worker最佳范式**(符合Postgres-Only指南)
|
||
- 🔥 **审计日志非致命错误处理**
|
||
|
||
**技术难点解决**:
|
||
1. ✅ 环境变量名称不一致(WECHAT_CORP_SECRET)
|
||
2. ✅ @wecom/crypto导入方式(createRequire)
|
||
3. ✅ decrypt函数参数(2个参数,不是4个)
|
||
4. ✅ Token字符识别(小写l vs 数字1)
|
||
5. ✅ EncodingAESKey重新生成(43位正确格式)
|
||
6. ✅ **Worker未注册问题**(`initIitManager()` 未调用)
|
||
7. ✅ **数据库字段名错误**(`action` → `action_type`)
|
||
8. ✅ **循环发送问题**(pg-boss重试机制导致)
|
||
|
||
**性能指标**:
|
||
- ⚡ Webhook响应时间:5.8ms(目标<10ms)
|
||
- ⚡ Worker执行时间:~50ms(目标<100ms)
|
||
- ⚡ 端到端延迟:<2秒(目标<5秒)
|
||
- ⚡ 消息发送成功率:100%(测试5次)
|
||
|
||
**参考文档**:
|
||
- `06-开发记录/Day3-企业微信集成与端到端测试完成记录.md`
|
||
|
||
---
|
||
|
||
### ✅ Day 3 已完成任务(端到端测试)
|
||
|
||
- [x] 保存企业微信正式回调URL配置(已配置到企业微信后台)
|
||
- [x] 配置 `wechat_user_id`(使用环境变量 `WECHAT_TEST_USER_ID=FengZhiBo`)
|
||
- [x] **端到端测试**(REDCap → 企微推送)✅ **测试通过**
|
||
- [x] Worker注册修复(`initIitManager()` 在 `src/index.ts` 中调用)
|
||
- [x] 数据库字段名修复(`action` → `action_type`)
|
||
- [x] 循环发送问题修复(审计日志错误导致Worker失败重试)
|
||
- [x] 企业微信推送测试(文本/卡片/Markdown)✅ **全部通过**
|
||
- [x] 测试对话功能(发送关键词)✅ **Phase 1.5已完成(2026-01-03)**
|
||
|
||
---
|
||
|
||
### Day 3:历史数据扫描(🔥 V1.1功能补充)(8小时)
|
||
|
||
#### BulkScanService(全量扫描)(6小时)
|
||
|
||
- [ ] 创建 `BulkScanService.ts`
|
||
- [ ] 实现 `scanAllRecords()` 方法
|
||
- [ ] 轻量级拉取所有 record_id
|
||
- [ ] 智能阈值判断(<50直接处理,≥50队列)
|
||
- [ ] 实现 `scanViaQueue()` 方法
|
||
- [ ] 创建 IitTaskRun 记录
|
||
- [ ] 任务拆分(每批50条)
|
||
- [ ] 推送批次任务
|
||
- [ ] 实现 `processBatch()` Worker
|
||
- [ ] 加载断点(CheckpointService)
|
||
- [ ] 逐个拉取完整数据
|
||
- [ ] 调用质控Agent
|
||
- [ ] 每10条保存断点
|
||
- [ ] 更新任务统计
|
||
- [ ] 实现 `scanDirectly()` 方法(小批量)
|
||
- [ ] 注册 Worker:`iit:bulk-scan:batch`
|
||
|
||
**验收标准**:
|
||
- ✅ 能扫描100条历史数据
|
||
- ✅ 断点续传功能正常(模拟中断)
|
||
- ✅ 任务进度可查询
|
||
- ✅ 大批量任务正确拆分
|
||
|
||
#### API端点(2小时)
|
||
|
||
- [ ] 创建 `POST /api/v1/iit/projects/:id/scan-all`
|
||
- [ ] 创建 `GET /api/v1/iit/tasks/:taskRunId/progress`
|
||
- [ ] 实现并发扫描检查(防止重复)
|
||
- [ ] 编写API文档(Swagger)
|
||
|
||
**验收标准**:
|
||
- ✅ API端点可正常调用
|
||
- ✅ 进度查询返回正确数据
|
||
- ✅ 并发保护生效
|
||
|
||
---
|
||
|
||
### Day 4:Webhook增强(作为补充)(8小时)
|
||
|
||
#### REDCap External Module(4小时)
|
||
|
||
- [ ] 创建EM目录结构
|
||
```
|
||
iit_manager_connector_v1.0.0/
|
||
├── config.json
|
||
├── IITManagerConnector.php
|
||
├── js/
|
||
│ └── ai_assistant.js
|
||
└── README.md
|
||
```
|
||
- [ ] 编写 `config.json`(EM配置)
|
||
- [ ] 实现 `IITManagerConnector.php`
|
||
- [ ] 实现 `redcap_save_record` Hook
|
||
- [ ] 实现 Webhook 推送
|
||
- [ ] HMAC-SHA256 签名
|
||
- [ ] 错误日志记录
|
||
- [ ] 本地测试(Docker REDCap)
|
||
|
||
**验收标准**:
|
||
- ✅ EM可成功安装到REDCap
|
||
- ✅ 保存记录时触发Hook
|
||
- ✅ Webhook签名正确
|
||
|
||
#### Node.js Webhook接收器(4小时)
|
||
|
||
- [ ] 创建 `webhookController.ts`
|
||
- [ ] 实现 `handleRedcapWebhook()` 方法
|
||
- [ ] 验证签名(HMAC-SHA256)
|
||
- [ ] 防重放攻击(5分钟有效期)
|
||
- [ ] 立即返回200(不阻塞REDCap)
|
||
- [ ] 异步推送质控任务
|
||
- [ ] 实现 `verifyWebhookSignature()` 工具函数
|
||
- [ ] 配置路由:`POST /api/v1/iit/webhooks/redcap`
|
||
- [ ] 编写单元测试(模拟Webhook)
|
||
|
||
**验收标准**:
|
||
- ✅ Webhook签名验证正确
|
||
- ✅ 响应时间 < 100ms
|
||
- ✅ 异步任务正确入队
|
||
- ✅ 单元测试全部通过
|
||
|
||
---
|
||
|
||
### Day 5:企微集成与测试(8小时)
|
||
|
||
#### 企微适配器(4小时)
|
||
|
||
- [ ] 创建 `WeChatAdapter.ts`
|
||
- [ ] 实现 `getAccessToken()` 方法
|
||
- [ ] 调用企微API获取token
|
||
- [ ] 缓存到 Postgres(7000秒)
|
||
- [ ] 实现 `sendMessage()` 方法(卡片消息)
|
||
- [ ] 实现 `sendQualityAlert()` 方法(质控预警)
|
||
- [ ] 错误处理和重试机制
|
||
- [ ] 编写单元测试
|
||
|
||
**验收标准**:
|
||
- ✅ Access Token可正确获取和缓存
|
||
- ✅ 能发送卡片消息到企微
|
||
- ✅ 质控预警格式正确
|
||
|
||
#### 端到端测试(4小时)
|
||
|
||
- [ ] 场景1:Webhook模式测试
|
||
- [ ] REDCap保存记录 → Node.js收到Webhook
|
||
- [ ] 延迟 < 2秒
|
||
- [ ] 场景2:轮询模式测试
|
||
- [ ] 手动修改REDCap数据 → 轮询拉取到
|
||
- [ ] 延迟 < 10分钟
|
||
- [ ] 场景3:全量扫描测试
|
||
- [ ] 触发扫描 → 处理历史数据
|
||
- [ ] 断点续传正常
|
||
- [ ] 场景4:企微通知测试
|
||
- [ ] 质控发现问题 → 企微收到卡片
|
||
- [ ] 延迟 < 5秒
|
||
- [ ] 编写测试报告
|
||
|
||
**验收标准**:
|
||
- ✅ 4个场景全部通过
|
||
- ✅ 测试报告完成
|
||
- ✅ Week 1 里程碑达成
|
||
|
||
---
|
||
|
||
## 📅 Week 2:AI智能质控(Day 6-10)
|
||
|
||
### Day 6-7:Protocol服务与Dify集成(16小时)
|
||
|
||
#### ProtocolService(8小时)
|
||
|
||
- [ ] 创建 `ProtocolService.ts`
|
||
- [ ] 实现 `initializeProtocolKnowledgeBase()` 方法
|
||
- [ ] 上传Protocol PDF到OSS
|
||
- [ ] 调用Dify创建Dataset
|
||
- [ ] 上传文档到Dify
|
||
- [ ] 🔥 预提取关键规则(V1.1性能优化)
|
||
- [ ] 缓存规则到 `cachedRules` 字段
|
||
- [ ] 实现 `extractKeyRules()` 方法(私有)
|
||
- [ ] 调用Dify提取入排标准
|
||
- [ ] 提取关键字段规则
|
||
- [ ] 解析JSON结构
|
||
- [ ] 实现 `checkProtocolCompliance()` 方法
|
||
- [ ] 优先使用缓存规则(快速路径)
|
||
- [ ] 复杂规则调用Dify RAG(慢路径)
|
||
- [ ] 解析AI响应
|
||
- [ ] 实现 `parseComplianceResult()` 方法
|
||
- [ ] 错误处理和降级策略
|
||
|
||
**验收标准**:
|
||
- ✅ Protocol可成功上传到Dify
|
||
- ✅ 关键规则正确提取和缓存
|
||
- ✅ 简单规则检查 < 100ms
|
||
- ✅ 复杂规则检查 < 2秒
|
||
- ✅ Dify RAG准确率 > 80%
|
||
|
||
#### API端点(2小时)
|
||
|
||
- [ ] 创建 `POST /api/v1/iit/projects`(创建项目)
|
||
- [ ] 创建 `POST /api/v1/iit/projects/:id/protocol`(上传Protocol)
|
||
- [ ] 创建 `PUT /api/v1/iit/projects/:id/field-mappings`(配置映射)
|
||
- [ ] 编写API文档
|
||
|
||
**验收标准**:
|
||
- ✅ API端点可正常调用
|
||
- ✅ 字段映射配置正确存储
|
||
|
||
#### Dify集成测试(6小时)
|
||
|
||
- [ ] 准备测试Protocol(标准IIT方案)
|
||
- [ ] 测试入排标准检索
|
||
- [ ] 年龄范围(18-60岁)
|
||
- [ ] 性别要求
|
||
- [ ] 必填字段
|
||
- [ ] 测试复杂规则检索
|
||
- [ ] 用药禁忌
|
||
- [ ] 合并症排除
|
||
- [ ] 调优Dify参数(temperature, top_k等)
|
||
- [ ] 记录测试结果和准确率
|
||
|
||
**验收标准**:
|
||
- ✅ 简单规则准确率 > 95%
|
||
- ✅ 复杂规则准确率 > 80%
|
||
- ✅ 假阳性率 < 15%
|
||
|
||
---
|
||
|
||
### Day 8-9:数据质控Agent(16小时)
|
||
|
||
#### DataQualityAgent(10小时)
|
||
|
||
- [ ] 创建 `DataQualityAgent.ts`
|
||
- [ ] 实现 `checkRecord()` 方法
|
||
- [ ] 获取项目配置(字段映射、Dify DatasetId)
|
||
- [ ] 提取关键字段值
|
||
- [ ] 逐个字段检查合规性
|
||
- [ ] 调用ProtocolService检查
|
||
- [ ] 收集所有问题
|
||
- [ ] 创建影子建议(PROPOSED状态)
|
||
- [ ] 发送企微通知(严重违背)
|
||
- [ ] 实现 `createPendingActions()` 方法(私有)
|
||
- [ ] 批量创建影子记录
|
||
- [ ] 包含推理过程和证据链
|
||
- [ ] 实现 `sendWeChatNotification()` 方法(私有)
|
||
- [ ] 调用WeChatAdapter
|
||
- [ ] 格式化质控预警
|
||
- [ ] 注册 Worker:`iit:quality-check`
|
||
- [ ] 错误处理和重试
|
||
|
||
**验收标准**:
|
||
- ✅ 能检测年龄违背(如65岁)
|
||
- ✅ 能检测性别不符
|
||
- ✅ 能检测必填字段缺失
|
||
- ✅ 影子记录正确创建
|
||
- ✅ 企微通知正确发送
|
||
- ✅ Worker可靠处理任务
|
||
|
||
#### 影子状态管理(6小时)
|
||
|
||
- [ ] 创建 `PendingActionService.ts`
|
||
- [ ] 实现 `getPendingActions()` 方法
|
||
- [ ] 分页查询
|
||
- [ ] 按状态过滤
|
||
- [ ] 按项目过滤
|
||
- [ ] 实现 `getPendingActionDetail()` 方法
|
||
- [ ] 返回详细信息
|
||
- [ ] 包含证据链
|
||
- [ ] 实现 `approveAction()` 方法
|
||
- [ ] 更新状态:PROPOSED → APPROVED
|
||
- [ ] 调用REDCap API回写数据
|
||
- [ ] 更新状态:APPROVED → EXECUTED
|
||
- [ ] 记录审计日志
|
||
- [ ] 实现 `rejectAction()` 方法
|
||
- [ ] 更新状态:PROPOSED → REJECTED
|
||
- [ ] 记录拒绝原因
|
||
- [ ] 记录审计日志
|
||
- [ ] API端点
|
||
- [ ] `GET /api/v1/iit/pending-actions`
|
||
- [ ] `GET /api/v1/iit/pending-actions/:id`
|
||
- [ ] `POST /api/v1/iit/pending-actions/:id/approve`
|
||
- [ ] `POST /api/v1/iit/pending-actions/:id/reject`
|
||
|
||
**验收标准**:
|
||
- ✅ 影子建议列表可查询
|
||
- ✅ 确认后数据正确回写REDCap
|
||
- ✅ 状态流转正确(PROPOSED → APPROVED → EXECUTED)
|
||
- ✅ 审计日志完整
|
||
|
||
---
|
||
|
||
### Day 10-12:PC Workbench前端(24小时)
|
||
|
||
#### 前端骨架(8小时)
|
||
|
||
- [ ] 创建前端路由:`/iit/workbench`
|
||
- [ ] 创建主布局组件
|
||
- [ ] 顶部导航
|
||
- [ ] 侧边栏(项目列表)
|
||
- [ ] 内容区
|
||
- [ ] 创建任务列表页
|
||
- [ ] 表格组件(Ant Design Table)
|
||
- [ ] 状态筛选(PROPOSED/APPROVED/REJECTED)
|
||
- [ ] 分页功能
|
||
- [ ] 刷新按钮
|
||
- [ ] 创建项目选择器
|
||
- [ ] 下拉选择
|
||
- [ ] 快速切换
|
||
|
||
**验收标准**:
|
||
- ✅ 路由可正常访问
|
||
- ✅ 任务列表可展示
|
||
- ✅ 项目切换功能正常
|
||
|
||
#### 详情对比页(10小时)
|
||
|
||
- [ ] 创建详情页面组件
|
||
- [ ] 左侧:当前数据展示
|
||
- [ ] 字段名 + 当前值
|
||
- [ ] 高亮违背字段(红色)
|
||
- [ ] 右侧:AI建议展示
|
||
- [ ] AI建议值
|
||
- [ ] 推理过程
|
||
- [ ] 证据链(Protocol页码)
|
||
- [ ] 置信度(进度条)
|
||
- [ ] 底部:操作按钮
|
||
- [ ] [拒绝] 按钮 + 拒绝原因输入
|
||
- [ ] [确认] 按钮 + 二次确认
|
||
- [ ] 证据链高亮
|
||
- [ ] 点击跳转到Protocol PDF
|
||
- [ ] 高亮相关文字
|
||
- [ ] 实时状态更新
|
||
- [ ] WebSocket 或 轮询
|
||
|
||
**验收标准**:
|
||
- ✅ 详情页面布局合理
|
||
- ✅ 当前数据与AI建议对比清晰
|
||
- ✅ 证据链可点击查看
|
||
- ✅ 操作按钮功能正常
|
||
|
||
#### 交互优化(6小时)
|
||
|
||
- [ ] 加载状态(Skeleton)
|
||
- [ ] 错误提示(Message/Notification)
|
||
- [ ] 成功提示(绿色通知)
|
||
- [ ] 二次确认(Modal)
|
||
- [ ] 批量操作(多选)
|
||
- [ ] 快捷键支持(回车确认、ESC关闭)
|
||
- [ ] 响应式布局(适配不同屏幕)
|
||
- [ ] 性能优化
|
||
- [ ] 虚拟滚动(大列表)
|
||
- [ ] 防抖搜索
|
||
|
||
**验收标准**:
|
||
- ✅ 加载状态友好
|
||
- ✅ 错误提示清晰
|
||
- ✅ 操作响应流畅
|
||
- ✅ 快捷键可用
|
||
|
||
---
|
||
|
||
### Day 13:影子状态闭环(8小时)
|
||
|
||
#### 完整流程测试(6小时)
|
||
|
||
- [ ] 场景1:年龄违背检测
|
||
- [ ] REDCap录入年龄65岁
|
||
- [ ] AI检测到违背(18-60岁)
|
||
- [ ] 影子建议创建
|
||
- [ ] 企微通知发送
|
||
- [ ] Workbench显示建议
|
||
- [ ] CRC确认
|
||
- [ ] 数据回写REDCap(标记为排除)
|
||
- [ ] 审计日志记录
|
||
- [ ] 场景2:性别不符检测
|
||
- [ ] 场景3:必填字段缺失检测
|
||
- [ ] 场景4:复杂规则检测(用药禁忌)
|
||
- [ ] 场景5:拒绝建议流程
|
||
- [ ] 性能测试
|
||
- [ ] 100条记录批量质控
|
||
- [ ] 平均处理时间 < 10秒/条
|
||
- [ ] 压力测试
|
||
- [ ] 并发10个质控任务
|
||
- [ ] 系统稳定运行
|
||
|
||
**验收标准**:
|
||
- ✅ 5个场景全部通过
|
||
- ✅ 完整闭环(录入→发现→确认→回写)
|
||
- ✅ 审计日志完整
|
||
- ✅ 性能指标达标
|
||
|
||
#### 错误处理测试(2小时)
|
||
|
||
- [ ] REDCap连接失败
|
||
- [ ] Dify API超时
|
||
- [ ] 企微推送失败
|
||
- [ ] 数据库连接中断
|
||
- [ ] Webhook签名错误
|
||
- [ ] 轮询任务失败
|
||
- [ ] 断点续传验证
|
||
|
||
**验收标准**:
|
||
- ✅ 所有错误场景有友好提示
|
||
- ✅ 系统能自动重试
|
||
- ✅ 不影响其他任务执行
|
||
|
||
---
|
||
|
||
### Day 14:Demo录制与交付(8小时)
|
||
|
||
#### Demo录制(3小时)
|
||
|
||
- [ ] 准备Demo脚本(5分钟)
|
||
```
|
||
场景:骨科IIT研究,年龄18-60岁
|
||
|
||
第1分钟:背景介绍
|
||
第2分钟:问题录入(年龄65岁)
|
||
第3分钟:AI发现(企微卡片)
|
||
第4分钟:人类复核(Workbench)
|
||
第5分钟:价值总结
|
||
```
|
||
- [ ] 录制视频
|
||
- [ ] 屏幕录制
|
||
- [ ] 语音讲解
|
||
- [ ] 关键节点字幕
|
||
- [ ] 视频剪辑和优化
|
||
|
||
**验收标准**:
|
||
- ✅ Demo视频5分钟
|
||
- ✅ 流程清晰完整
|
||
- ✅ 价值展示到位
|
||
|
||
#### 文档整理(3小时)
|
||
|
||
- [ ] 更新部署文档
|
||
- [ ] 编写使用手册
|
||
- [ ] 管理员手册(项目配置)
|
||
- [ ] CRC手册(Workbench使用)
|
||
- [ ] PI手册(企微通知查看)
|
||
- [ ] 编写API文档(完善Swagger)
|
||
- [ ] 编写故障排查文档
|
||
|
||
**验收标准**:
|
||
- ✅ 文档完整清晰
|
||
- ✅ 新人可根据文档上手
|
||
|
||
#### 技术债务记录(2小时)
|
||
|
||
- [ ] 记录已知问题
|
||
- [ ] Dify准确率待提升
|
||
- [ ] 前端性能可优化
|
||
- [ ] 小程序待开发
|
||
- [ ] 记录改进建议
|
||
- [ ] OCR智能采集(Phase 2)
|
||
- [ ] 任务驱动Agent(Phase 2)
|
||
- [ ] 智能汇报Agent(Phase 3)
|
||
- [ ] 创建技术债务清单
|
||
- [ ] 按优先级排序
|
||
- [ ] 估算工作量
|
||
|
||
**验收标准**:
|
||
- ✅ 技术债务清单完整
|
||
- ✅ 优先级合理
|
||
- ✅ MVP可交付
|
||
|
||
---
|
||
|
||
## 📊 MVP验收标准(最终)
|
||
|
||
### 功能完整性
|
||
|
||
- [ ] ✅ REDCap数据监听(Webhook + 轮询)
|
||
- [ ] ✅ 历史数据全量扫描
|
||
- [ ] ✅ AI质控检测(Dify RAG)
|
||
- [ ] ✅ 影子状态管理
|
||
- [ ] ✅ 企微卡片通知
|
||
- [ ] ✅ PC Workbench复核
|
||
- [ ] ✅ 数据回写REDCap
|
||
- [ ] ✅ 审计日志记录
|
||
|
||
### 技术指标
|
||
|
||
| 指标 | 目标值 | 验收 |
|
||
|------|--------|------|
|
||
| Webhook响应时间 | < 100ms | [ ] |
|
||
| AI质控完成时间 | < 30秒 | [ ] |
|
||
| 企微推送延迟 | < 5秒 | [ ] |
|
||
| AI准确率 | > 80% | [ ] |
|
||
| 假阳性率 | < 15% | [ ] |
|
||
| 系统可用性 | > 99% | [ ] |
|
||
|
||
### 文档完整性
|
||
|
||
- [ ] ✅ 技术方案 V1.1
|
||
- [ ] ✅ API文档(Swagger)
|
||
- [ ] ✅ 部署文档
|
||
- [ ] ✅ 使用手册(3份)
|
||
- [ ] ✅ Demo视频(5分钟)
|
||
- [ ] ✅ 技术债务清单
|
||
|
||
---
|
||
|
||
## 📝 日常开发习惯
|
||
|
||
### 每日站会(15分钟)
|
||
|
||
- [ ] 昨天完成了什么?
|
||
- [ ] 今天计划做什么?
|
||
- [ ] 遇到什么阻碍?
|
||
|
||
### 每日提交
|
||
|
||
- [ ] 代码提交(至少1次)
|
||
- [ ] 更新TODO清单
|
||
- [ ] 记录开发笔记
|
||
|
||
### 每日复盘(10分钟)
|
||
|
||
- [ ] 今日完成度?
|
||
- [ ] 明日优先级?
|
||
- [ ] 需要调整计划?
|
||
|
||
---
|
||
|
||
## 🎯 关键里程碑
|
||
|
||
| 里程碑 | 时间 | 目标 | 状态 |
|
||
|--------|------|------|------|
|
||
| 🏁 Week 1 完成 | Day 5结束 | 基础连接层打通 | [ ] |
|
||
| 🏁 Week 2 完成 | Day 14结束 | MVP完整交付 | [ ] |
|
||
| 🏁 Demo录制 | Day 14 | 5分钟演示视频 | [ ] |
|
||
|
||
---
|
||
|
||
## 🎉 Phase 1.5 完成总结(2026-01-03 & 2026-01-04)
|
||
|
||
### **核心成果**
|
||
- ✅ **AI对话集成**: DeepSeek-V3 + LLMFactory
|
||
- ✅ **REDCap数据查询**: 基于真实数据回答,解决LLM幻觉
|
||
- ✅ **Dify知识库集成** (2026-01-04新增): 研究方案文档查询
|
||
- ✅ **混合检索**: 同时支持结构化数据(REDCap)和非结构化文档(Dify)
|
||
- ✅ **上下文记忆**: SessionMemory保存最近3轮对话
|
||
- ✅ **即时反馈**: "正在查询"消息
|
||
- ✅ **意图识别**: 关键词匹配(查记录/统计/项目信息/文档查询)
|
||
- ✅ **智能路由**: 根据意图自动选择数据源(REDCap/Dify)
|
||
|
||
### **测试验证**
|
||
- **项目**: test0102
|
||
- REDCap PID: 16, 11条记录
|
||
- Dify Dataset ID: `b49595b2-bf71-4e47-9988-4aa2816d3c6f`
|
||
- 文档: 研究方案、CRF表格(2个文件)
|
||
- **测试场景1**: 查询ID 7患者详细信息(REDCap)
|
||
- **测试场景2**: 查询研究排除标准(Dify)
|
||
- **测试场景3**: 查询CRF观察指标(Dify)
|
||
- **测试场景4**: 统计入组人数(REDCap)
|
||
- **测试结果**: ✅ 所有场景通过,数据准确,无编造
|
||
|
||
### **详细记录**
|
||
- [Phase 1.5开发计划](./Phase1.5-AI对话能力开发计划.md)
|
||
- [Phase 1.5开发完成记录 (REDCap)](../06-开发记录/Phase1.5-AI对话集成REDCap完成记录.md)
|
||
- [Dify知识库集成开发记录](../06-开发记录/2026-01-04-Dify知识库集成开发记录.md)
|
||
|
||
---
|
||
|
||
**创建日期**:2025-12-31
|
||
**最后更新**:2026-01-04
|
||
**维护者**:开发团队
|
||
**更新频率**:每日
|
||
**参考文档**:`02-技术设计/IIT Manager Agent 完整技术开发方案 (V1.1).md`
|
||
|
||
|