feat(iit): Implement real-time quality control system

Summary:

- Add 4 new database tables: iit_field_metadata, iit_qc_logs, iit_record_summary, iit_qc_project_stats

- Implement pg-boss debounce mechanism in WebhookController

- Refactor QC Worker for dual output: QC logs + record summary

- Enhance HardRuleEngine to support form-based rule filtering

- Create QcService for QC data queries

- Optimize ChatService with new intents: query_enrollment, query_qc_status

- Add admin batch operations: one-click full QC + one-click full summary

- Create IIT Admin management module: project config, QC rules, user mapping

Status: Code complete, pending end-to-end testing
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-07 21:56:11 +08:00
parent 0c590854b5
commit 5db4a7064c
74 changed files with 13383 additions and 2129 deletions

View File

@@ -4,7 +4,9 @@
> **更新日期:** 2026-02-05
> **关联文档:** [IIT Manager Agent V2.6 综合开发计划](./IIT%20Manager%20Agent%20V2.6%20综合开发计划.md)
>
> **V2.9 更新**
> **V2.9.1 更新**
> - **新增 Phase 1.5**隐私安全与自动化工具P0 合规必需)
> - Phase 1 新增 AutoMapperService 任务
> - Phase 3 新增反馈循环任务
> - Phase 4 新增 ProfilerService 和 Cron Skill 任务
> - Phase 5 新增多意图处理任务
@@ -14,15 +16,15 @@
## 1. 开发阶段总览
```
Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
基础工具层 │ ──▶ │ SOP 引擎 │ ──▶ReAct 引擎 │ ──▶ 调度系统 │ ──▶ 智能路由 │ ──▶ 视觉能力
│ │ │ + 记忆L2 + 记忆L1 + 记忆L3 (延后)
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
▼ ▼
ToolsService SopEngine ReActEngine SchedulerService IntentService VisionService
FieldMapping HotMemory FlowMemory WeeklyReports MixedRouting (Postponed)
HardRuleEngine SoftRuleEngine AgentTrace ReportService StreamingFB
Phase 1 Phase 1.5 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6
┌──────────┐ ┌──────────┐ ──────────┐ ──────────┐ ──────────┐ ──────────┐ ──────────┐
│基础工具层│ ──▶│ 隐私安全 │ ──▶│ SOP 引擎 │ ──▶ReAct 引擎│ ──▶ 调度系统 │ ──▶ 智能路由 │ ──▶ 视觉能力 │
P0必需 + 记忆L2 │ + 记忆L1 │ + 记忆L3 │ (延后) │
└──────────┘ └──────────┘ ──────────┘ ──────────┘ ──────────┘ ──────────┘ ──────────┘
ToolsService Anonymizer SopEngine ReActEngine Scheduler IntentService VisionService
FieldMapping AutoMapper HotMemory FlowMemory WeeklyReports MixedRouting (Postponed)
HardRule PII Audit SoftRule AgentTrace ReportService StreamingFB
```
---
@@ -46,17 +48,72 @@ Phase 1 Phase 2 Phase 3 Phase 4
| P1-05 | 实现 `search_protocol` 工具 | 高 | 待开始 | P1-03 |
| P1-06 | 实现 `HardRuleEngine` | 高 | 待开始 | - |
| P1-07 | 集成字段映射到 ToolsService | 中 | 待开始 | P1-02, P1-03 |
| P1-08 | 单元测试覆盖 | 中 | 待开始 | P1-01~P1-07 |
| P1-08 | **[V2.9.1]** 实现 `AutoMapperService` | 中 | 待开始 | P1-02 |
| P1-09 | **[V2.9.1]** 实现 REDCap Data Dictionary 解析器 | 中 | 待开始 | P1-08 |
| P1-10 | **[V2.9.1]** 实现 LLM 语义映射 Job | 中 | 待开始 | P1-08 |
| P1-11 | **[V2.9.1]** 实现管理后台映射确认 UI | 低 | 待开始 | P1-10 |
| P1-12 | 单元测试覆盖 | 中 | 待开始 | P1-01~P1-11 |
### 2.3 验收标准
- [ ] 工具可通过名称调用
- [ ] 字段映射正确生效LLM 用 "年龄" → 实际调用 "dem_age"
- [ ] 硬规则拦截生效
- [ ] **[V2.9.1]** AutoMapper 可解析 REDCap Data Dictionary
- [ ] **[V2.9.1]** LLM 可生成字段映射建议
- [ ] 测试覆盖率 > 80%
---
## 2.5 Phase 1.5: 隐私安全与自动化工具P0 合规必需)
> **⚠️ 重要**:此阶段必须在 Phase 2 调用 LLM 之前完成!
> 临床数据包含患者隐私信息,未脱敏直接发送给 LLM 将违反数据保护法规。
### 2.5.1 目标
- 实现 PII 脱敏中间件
- 建立脱敏审计日志
- 确保合规性
### 2.5.2 任务清单
| 任务ID | 任务名称 | 优先级 | 状态 | 前置依赖 |
|--------|----------|--------|------|----------|
| P1.5-01 | 创建 `iit_pii_audit_log` 表 | **P0** | 待开始 | - |
| P1.5-02 | 实现 PII 识别正则库 | **P0** | 待开始 | - |
| P1.5-03 | 实现 `AnonymizerService.mask()` | **P0** | 待开始 | P1.5-01, P1.5-02 |
| P1.5-04 | 实现 `AnonymizerService.unmask()` | **P0** | 待开始 | P1.5-03 |
| P1.5-05 | 实现脱敏映射加密存储 | 高 | 待开始 | P1.5-03 |
| P1.5-06 | 集成到 ChatService 调用链 | **P0** | 待开始 | P1.5-04 |
| P1.5-07 | 单元测试:各类 PII 识别 | 高 | 待开始 | P1.5-02 |
| P1.5-08 | 端到端测试:脱敏还原完整流程 | 高 | 待开始 | P1.5-01~P1.5-06 |
### 2.5.3 验收标准
- [ ] 身份证号正确识别并脱敏18位
- [ ] 手机号正确识别并脱敏11位
- [ ] 中文姓名正确识别并脱敏2-4字
- [ ] 病历号正确识别并脱敏
- [ ] LLM 收到的 Payload 不包含任何 PII
- [ ] LLM 回复正确还原占位符
- [ ] 审计日志正确记录(加密存储)
### 2.5.4 PII 脱敏流程
```
用户输入: "张三身份证420101199001011234今天血压偏高"
↓ AnonymizerService.mask()
LLM 收到: "[PATIENT_1](身份证[ID_CARD_1])今天血压偏高"
↓ 同时写入 iit_pii_audit_log加密存储映射表
↓ LLM 处理
LLM 返回: "[PATIENT_1] 的血压需要关注..."
↓ AnonymizerService.unmask()
用户看到: "张三 的血压需要关注..."
```
---
## 3. Phase 2: SOP 引擎 + 热记忆
### 3.1 目标
@@ -260,6 +317,8 @@ gantt
| **[V2.9]** 用户多意图混乱 | 任务遗漏 | ReAct Prompt 多意图拆分 | ✅ |
| **[V2.9]** 回复不符用户偏好 | 体验差 | 反馈循环 + 用户画像 | ✅ |
| **[V2.9]** 主动提醒打扰用户 | 用户投诉 | 最佳通知时间 + 个性化 | ✅ |
| **[V2.9.1]** 患者隐私泄露给 LLM | **法律风险** | PII 脱敏中间件 + 审计日志 | ✅ |
| **[V2.9.1]** 字段映射配置繁琐 | 效率低 | AutoMapper LLM 语义匹配 | ✅ |
---