feat(iit): Complete V3.1 QC engine + GCP business reports + AI timeline + bug fixes

V3.1 QC Engine:
- QcExecutor unified entry + D1-D7 dimension engines + three-level aggregation
- HealthScoreEngine + CompletenessEngine + ProtocolDeviationEngine + QcAggregator
- B4 flexible cron scheduling (project-level cronExpression + pg-boss dispatcher)
- Prisma migrations for qc_field_status, event_status, project_stats

GCP Business Reports (Phase A - 4 reports):
- D1 Eligibility: record_summary full list + qc_field_status D1 overlay
- D2 Completeness: data entry rate and missing rate aggregation
- D3/D4 Query Tracking: severity distribution from qc_field_status
- D6 Protocol Deviation: D6 dimension filtering
- 4 frontend table components + ReportsPage 5-tab restructure

AI Timeline Enhancement:
- SkillRunner outputs totalRules (33 actual rules vs 1 skill)
- iitQcCockpitController severity mapping fix (critical->red, warning->yellow)
- AiStreamPage expandable issue detail table with Chinese labels
- Event label localization (eventLabel from backend)

Business-side One-click Batch QC:
- DashboardPage batch QC button with SyncOutlined icon
- Auto-refresh QcReport cache after batch execution

Bug Fixes:
- dimension_code -> rule_category in 4 SQL queries
- D1 eligibility data source: record_summary full + qc_field_status overlay
- Timezone UTC -> Asia/Shanghai (QcReportService toBeijingTime helper)
- Pass rate calculation: passed/totalEvents instead of passed/totalRecords

Docs:
- Update IIT module status with GCP reports and bug fix milestones
- Update system status doc v6.6 with IIT progress

Tested: Backend compiles, frontend linter clean, batch QC verified
Made-with: Cursor
This commit is contained in:
2026-03-01 22:49:49 +08:00
parent 0b29fe88b5
commit 2030ebe28f
50 changed files with 8687 additions and 1492 deletions

View File

@@ -3,8 +3,14 @@
> **文档版本:** v3.1
> **创建日期:** 2026-01-01
> **维护者:** IIT Manager开发团队
> **最后更新:** 2026-03-01 **质控引擎 V3.1 架构升级计划定稿(五级数据结构 + 多维报告)**
> **最后更新:** 2026-03-01 **GCP 业务报表 + AI 工作流水增强 + 多项 Bug 修复完成!**
> **重大里程碑:**
> - **2026-03-01GCP 业务端报表全量完成!** 4 张 GCP 标准报表D1 筛选入选/D2 完整性/D3D4 质疑跟踪/D6 方案偏离)后端 API + 前端组件 + ReportsPage 五 Tab 重构
> - **2026-03-01AI 工作流水时间线增强!** 实际规则数显示33 条而非 1 条)+ 中文事件名 + 可展开问题详情表格 + severity 映射修复
> - **2026-03-01业务端一键全量质控** DashboardPage 新增按钮 + 自动刷新报告缓存 + 事件级通过率修复
> - **2026-03-01多项关键 Bug 修复!** dimension_code→rule_category / D1 仅显示 1 人→14 人 / 时区 UTC→北京时间 / 通过率 271%→正确值
> - **2026-03-01B4 定时质控灵活配置完成!** 项目级 cron → pg-boss dispatcher 每分钟匹配 → QcExecutor.executeBatch → DailyQcOrchestrator
> - **2026-03-01V3.1 质控引擎全量完成!** 17 项任务全部实现QcExecutor 统一入口 → D1-D7 全维度 → 三级聚合 → HealthScore → 前端驾驶舱 → 端到端测试
> - **2026-03-01质控引擎 V3.1 架构设计完成!** 五级数据结构CDISC ODM+ D1-D7 多维报告 + 三批次落地计划
> - **2026-03-01架构团队评审完成** 采纳 InstanceID/规则分类/状态冒泡/LLM 三不原则,暂缓 SDV/自动映射/GCP 全量报表
> - **2026-02-26前端架构调整完成** 运营管理端恢复 IIT 项目管理 + 业务端精简为日常使用 + Web AI 对话页面上线
@@ -55,7 +61,26 @@ CRA Agent 是一个**替代 CRA 岗位的自主 AI Agent**,而非辅助 CRA
- AI能力DeepSeek/Qwen + 自研 RAGpgvector+ LLM Tool Use
### 当前状态
- **开发阶段****V3.0 P0 + P1 已完成 → 正在规划 V3.1 质控引擎架构升级**
- **开发阶段****V3.1 质控引擎 + GCP 业务报表 + AI 时间线增强 + Bug 修复 → 待部署验证**
- **GCP 业务报表 + Bug 修复已完成**2026-03-01
- 4 张 GCP 标准报表后端 APIiitQcCockpitServicegetEligibilityReport/getCompletenessReport/getEqueryReport/getDeviationReport
- 4 个前端报表组件EligibilityTable/CompletenessTable/EqueryLogTable/DeviationLogTable
- ReportsPage 五 Tab 重构(执行摘要 + 4 张报表)
- AI 工作流水时间线增强SkillRunner 真实规则数 + iitQcCockpitController severity 映射 + AiStreamPage 可展开详情表格)
- 业务端一键全量质控按钮DashboardPage + 报告缓存自动刷新)
- Bug 修复dimension_code→rule_category / D1 数据源→record_summary 全量 + qc_field_status 叠加 / 时区 UTC→Asia/Shanghai / 通过率 passed/totalEvents
- **B4 已完成**2026-03-01
- 项目级 cronExpression 持久化(后端 UpdateProjectInput + Prisma update
- 全局 dispatcher 调度器pg-boss 每分钟轮询 → 匹配 cronExpression → 派发 iit_scheduled_qc
- iit_scheduled_qc Worker V3.1 升级QcExecutor.executeBatch + DailyQcOrchestrator
- 前端管理端 cron 配置 UI 增强6 个预设 + 自定义输入 + cronEnabled/cronExpression 类型修复)
- 动态生效:保存项目配置后 refreshProjectCronSchedule() 即时反映
- **V3.1 已完成**2026-03-01
- P1: 后端集成QcExecutor 统一入口 + D2/D6 维度引擎 + HealthScore 聚合)
- P2: 报告升级QcReportService 数据源切换 + dimension_summary/event_overview XML
- P3: API + 服务(新增 3 端点 + CockpitService 升级 + ToolsService 升级)
- P4: 前端DashboardPage 健康度+维度条 + 热力图 record×event + ReportsPage 维度/事件 Tab
- P5: 端到端测试脚本 + 部署清单
- **V3.0 已完成**
- P0 自驱动质控流水线 + P1 对话层 Tool Use 改造 + E2E 54/54 通过
- QC 系统深度修复null tolerance + baseline merge + record-level pass rate + LLM 报告修正)
@@ -82,10 +107,31 @@ CRA Agent 是一个**替代 CRA 岗位的自主 AI Agent**,而非辅助 CRA
-**端到端测试通过**REDCap → Node.js → 企业微信)
-~~AI对话集成完成ChatService + SessionMemory~~ → 已替换为 ChatOrchestrator
#### ✅ 已完成功能GCP 业务报表 + AI 时间线 + Bug 修复 - 2026-03-01
-**GCP 标准报表(阶段 A 4 张)**
- D1 筛选入选表getEligibilityReportrecord_summary 全量 + qc_field_status D1 叠加)
- D2 数据录入率与缺失率getCompletenessReportrecord_summary 聚合统计)
- D3/D4 数据质疑跟踪表getEqueryReportqc_field_status severity 分布)
- D6 方案偏离表getDeviationReportqc_field_status D6 维度)
-**前端 4 个报表组件**EligibilityTable / CompletenessTable / EqueryLogTable / DeviationLogTable
-**ReportsPage 五 Tab 重构**(执行摘要 LLM + 4 张报表独立 Tab
-**AI 工作流水时间线增强**
- SkillRunner 输出 totalRules33 条真实规则数替代 1 条 skill 数)
- iitQcCockpitController severity 映射修复critical→red / warning→yellow
- AiStreamPage 可展开 Collapse 详情表格(规则名/字段/描述/严重性/实际值)
- 中文事件名显示eventLabel+ 状态标签中文化(通过/严重/警告)
-**业务端一键全量质控**DashboardPage SyncOutlined 按钮 + batchQualityCheck API 调用)
-**报告缓存自动刷新**iitBatchController 批量 QC 后调用 QcReportService.refreshReport
-**Bug 修复**
- dimension_code→rule_categoryiitQcCockpitService 4 处 SQL
- D1 筛选入选仅 1 人→14 人(数据源从 qc_field_status 改为 record_summary 全量)
- 时区 UTC→北京时间QcReportService toBeijingTime + buildLlmXmlReport Asia/Shanghai
- 通过率 271%→正确值iitBatchController passed/totalEvents 替代 passed/totalRecords
#### ✅ 已完成功能P0 自驱动质控流水线 - 2026-02-26
-**变量清单导入**REDCap Data Dictionary → iit_field_metadata
-**规则配置增强**4 类规则 + AI 辅助建议 + 变量关联)
-**定时质控调度**pg-boss cron + DailyQcOrchestrator
-**定时质控调度**pg-boss cron dispatcher + 项目级 cronExpression + DailyQcOrchestrator
-**eQuery 闭环**open → responded → ai_reviewing → resolved/reopened
-**重大事件归档**SAE + 方案偏离自动归档 iit_critical_events
-**统一驾驶舱**(健康分 + 趋势图 + 风险热力图 + 核心指标卡片)
@@ -908,8 +954,8 @@ npx ts-node src/modules/iit-manager/test-wechat-push.ts
---
> **提示**本文档反映IIT Manager Agent模块的最新真实状态每个里程碑完成后必须更新
> **最后更新**2026-02-25
> **当前进度**V3.0 开发计划已定稿 | 下一步P0-1 ChatOrchestrator + ToolsService 重构
> **最后更新**2026-03-01
> **当前进度**V3.1 QC Engine 完成 | GCP 业务报表 4 张全量完成 | AI Timeline 增强 | 一键全量质控 | 多项 Bug 修复 | Phase 2: LLM 执行摘要待开发
> **核心文档**
> - [CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md) ⭐⭐⭐⭐⭐
> - [统一数字 CRA 质控平台 PRD](./04-开发计划/V3.0全新开发计划/统一数字%20CRA%20质控平台产品需求文档(PRD).md) ⭐⭐⭐⭐⭐

View File

@@ -0,0 +1,103 @@
# **业务端 GCP 质控报表开发计划专家审查报告**
**审查对象**《GCP Business Reports 开发计划》 (5aeb159b.plan)
**审查定位**:针对 D1、D2、D3/D4、D6 报表开发的逻辑闭环、性能瓶颈及 LLM 协同性进行深度排雷。
**审查结论**:总体架构极佳,完美贯彻了“硬计算归系统,软推理归 LLM”的原则。但在 D2 缺失数据写入、D6 字段解析及前端加载性能上存在 4 个隐藏坑点,需在编码前修正。
## **一、 值得高度肯定的亮点What's Good**
1. **极其敏锐的 P0 漏洞捕捉**
发现 SkillRunner 未将 category 传播给 QcExecutor导致 D1 变 D3。这个 Bug 如果在测试期才发现,会导致所有报表数据串位。修复方案非常精准。
2. **对 LLM 极其友好的底层设计**
你没有选择“把几十万条数据直接扔给 LLM 让它画表格”,而是**老老实实写了 4 个结构化的 API**。这是最顶级的 LLM 友好型架构!
*未来 LLM 只需要调用这 4 个 API 获取 JSON极低 Token就能在 Tab 0执行摘要里写出极其精准且绝对不会幻觉的全局分析报告。*
3. **前端 UI 的“渐进式展开Progressive Disclosure”设计**
D2 报表的 受试者 → 事件 → 字段清单 三级展开设计,完全对标了 Medidata J-Review 的体验,非常符合 CRA “从宏观到微观”的查错习惯。
## **二、 架构排雷与修正建议What needs fix**
### **💣 坑点 1D2 (数据完整性) 的“幽灵记录”取数陷阱**
**🔍 计划漏洞**
计划中 D2 的 API 打算用这段 SQL 统计缺失率SELECT count(\*) FROM qc\_field\_status WHERE rule\_category \= 'D2' AND status \= 'FAIL'。
**临床逻辑断层**:如果是“缺失数据”,意味着 CRC **根本没有填这个字段**。如果没填Webhook 就不会推送这个字段HardRuleEngine 如果只是遍历传来的数据,就**永远不会为这个缺失字段在 qc\_field\_status 中插入一行 FAIL 记录**。没有记录,你的 SQL 就什么都 count 不到!
**🛠️ 修正建议 (后端)**
必须明确界定 CompletenessEngine (D2 引擎) 的特殊职责:**它必须是主动轮询Proactive Polling**。
D2 引擎在运行时,必须拿患者当前的 Event 去对比 REDCap 的 Data Dictionary。对于字典里有但数据库里没有的必填项引擎必须**主动强行向 qc\_field\_status 插入一条具有五层坐标的“幽灵记录”**(实际值为空,状态为 FAIL类别为 D2
*只有这样,你计划里的 SQL 才能真正生效。请将此要求补充进 D2 的开发任务中。*
### **💣 坑点 2D6 (方案偏离) 脆断的文本解析**
**🔍 计划漏洞**
计划中写道:对于 D6 API从 actual\_value / expected\_value 解析超窗天数和方向。
**过度耦合**:如果在规则引擎里 actual\_value 存的是字符串 "延误 10 天"API 层再去用正则解析提取数字 10 和方向 late这是极其脆弱的设计只要底层提示语改一个字报表就崩了。
**🛠️ 修正建议 (后端数据结构)**
不要在 API 层解析字符串。在底层执行超窗规则D6规则引擎应该把结构化的偏离数据写入到一个元数据字段。
如果 qc\_field\_status 没有 JSONB 的 meta 字段,建议巧妙利用现有的字段,或者要求 D6 引擎输出标准的 JSON string 到 actual\_value例如
// actual\_value 存储规范
{"days": 10, "direction": "late", "text": "延误10天"}
API 直接 JSON.parse(actual\_value) 即可安全获取 deviationDays。
### **💣 坑点 3D1 (筛选入选表) Inclusion/Exclusion 的身份识别**
**🔍 计划漏洞**
D1 API 的返回结构要求明确区分 type: 'inclusion' | 'exclusion',以便分别统计。但在我们现有的 qc\_field\_status 五层表中,并没有字段标识一条规则到底是纳入还是排除。
**🛠️ 修正建议 (后端映射)**
在执行 P0 Bugfix 时,连同将规则的子分类也传递下去。或者在项目的 IitSkill 配置中,规定 D1 规则的命名必须带有前缀例如INC-年龄校验EXC-妊娠状态。D1 的 API 通过解析 ruleName 的前缀来区分 inclusion 和 exclusion从而正确归类到前端表格中。
### **💣 坑点 4D2 前端表格的三级展开 (L5) 性能雪崩**
**🔍 计划漏洞**
D2 前端组件如果一次性请求包含了整个项目所有患者、所有访视、所有缺失字段清单的“全量树状 JSON”对于一个入组 200 人、缺失 5000 个字段的 IIT 项目,这个 API payload 可能会超过 5MB导致前端渲染卡死。
**🛠️ 修正建议 (前端与 API)**
采用**过度设计审查**L5具体字段清单不能随总览 API 一起返回。
* **API 拆分**
* GET /report/completeness/summary (返回 L1, L2, L3 宏观统计和访视级统计)
* GET /report/completeness/fields?recordId=P001\&eventId=V2 (懒加载/Lazy Load API)
* **前端交互**:当 CRA 在 CompletenessTable 中点击展开某次访视的详细表单时,前端再按需调用第二个 API 获取具体的缺失字段清单。
## **三、 对 LLM 友好的延伸设计 (架构红利)**
当前的计划主要聚焦在“传统业务报表(表格)”的渲染。既然您已经做好了这 4 个高质量的结构化 API千万不要浪费了它对大模型的巨大价值
**💡 建议补充任务:增强 Tab 0 (执行摘要) 的 LLM 总结能力**
在前端加载 ReportsPage.tsx 的 Tab 0 时:
1. 前端并行请求 D1, D2, D3, D6 的 4 个 API 的 **summary 部分**(不包含 entries 明细)。
2. 将这 4 个 JSON summary 拼成一个 Context 对象:
const llmContext \= { D1: d1.summary, D2: d2.summary, D3: d3.summary, D6: d6.summary };
3. 把这个极简的 Context 喂给系统的 LLM 接口:
*Prompt: "你是一个资深项目经理,请根据以下当前项目的多维 GCP 质控摘要,写一段 200 字以内的项目质量执行总结,并指出当前最需要介入的风险点。"*
4. 将 LLM 生成的这段话展示在 Tab 0 的最顶端。
**这就是真正的 AI 原生 SaaS**:不仅能提供冷冰冰的报表,还能直接基于结构化报表进行像人一样的洞察和汇报。
## **四、 审查最终结论**
这个开发计划的**粒度非常合适**,属于“刚刚好能落地且能商用”的级别。它没有去强求一次性做完所有的 AI 关联,而是优先把 GCP 需要的“表单底子”搭了出来。
只要在开发任务Jira/Todos中**补充上述 4 个避坑建议(特别是 D2 幽灵记录的生成机制)**,这份计划就可以直接发给开发团队启动 Sprint 了!