feat(iit): QC deep fix + V3.1 architecture plan + project member management

QC System Deep Fix:
- HardRuleEngine: add null tolerance + field availability pre-check (skipped status)
- SkillRunner: baseline data merge for follow-up events + field availability check
- QcReportService: record-level pass rate calculation + accurate LLM XML report
- iitBatchController: legacy log cleanup (eventId=null) + upsert RecordSummary
- seed-iit-qc-rules: null/empty string tolerance + applicableEvents config

V3.1 Architecture Design (docs only, no code changes):
- QC engine V3.1 plan: 5-level data structure (CDISC ODM) + D1-D7 dimensions
- Three-batch implementation strategy (A: foundation, B: bubbling, C: new engines)
- Architecture team review: 4 whitepapers reviewed + feedback doc + 4 critical suggestions
- CRA Agent strategy roadmap + CRA 4-tool explanation doc for clinical experts

Project Member Management:
- Cross-tenant member search and assignment (remove tenant restriction)
- IIT project detail page enhancement with tabbed layout (KB + members)
- IitProjectContext for business-side project selection
- System-KB route access control adjustment for project operators

Frontend:
- AdminLayout sidebar menu restructure
- IitLayout with project context provider
- IitMemberManagePage new component
- Business-side pages adapt to project context

Prisma:
- 2 new migrations (user-project RBAC + is_demo flag)
- Schema updates for project member management

Made-with: Cursor
This commit is contained in:
2026-03-01 15:27:05 +08:00
parent c3f7d54fdf
commit 0b29fe88b5
61 changed files with 6877 additions and 524 deletions

View File

@@ -0,0 +1,99 @@
# **Skill 化配置架构与业务流转技术设计文档**
**文档版本**V2.1 (5层架构与语义解耦全景版)
**核心理念**:规则必须脱离底层代码;质控逻辑必须基于“医学语义”而非“物理字段”进行配置,以适应不同的 IIT 项目。
## **第一章 架构总览从“硬编码”到“Skill 驱动”**
我们将数据、规则与报告的生成链路设计为高度解耦的三段式架构:
\[阶段一:基建与抽象\] \[阶段二Skill 编排配置\] \[阶段三:执行与映射\]
(项目前置准备) (DM 规则配置) (引擎自动计算)
1\. REDCap 字典同步 1\. 选择 Skill 模板 1\. 监听数据变化 (Webhook)
2\. 知识库向量化 (RAG) \-\> 2\. 绑定语义标签 \-\> 2\. 提取 5 层级联坐标
3\. LLM 语义映射对齐 3\. 设定阈值与报警级别 3\. 引擎执行逻辑 (硬/软)
(AutoMapper) (赋能 D1-D7 维度) 4\. 结果落入 5层数据底座
5\. 自动组装 5大 GCP 报告
## **第二章 配置前置准备 (Project Initialization)**
在配置具体的质控 Skill 前,系统必须完成项目的“数字孪生”构建:
### **2.1 结构化数据基建REDCap 元数据同步**
* **动作**:调用 exportMetadata 获取字典包含分支逻辑Branching Logic。这为 D2 (缺失率) 计算打下基石。
### **2.2 非结构化知识基建:建立专属 RAG 大脑**
* **动作**:上传方案 Protocol、ICF进行向量化。为 D5/D6 的 SoftRule 模糊推理提供依据。
### **2.3 核心解耦AutoMapper 语义映射 (重中之重)**
* **动作**:利用 LLM将 REDCap 毫无规律的物理变量名(如 ie\_01, ae\_term映射为**系统内置标准医学语义标签**(如 \[入选标准\_年龄\], \[不良事件\_名称\])。
* **价值**DM 面向通用语义配置规则,无需关心物理表名,实现通用 Skill 的跨项目复用。
## **第三章 Skill 核心数据模型设计 (The Skill Schema)**
### **3.1 数据库表结构 (iit\_skills)**
model IitSkill {
id String @id @default(cuid())
projectId String // 绑定到具体项目
name String // e.g., "ALT 重度异常监测"
category String // 关键!挂载到 7 大维度: D1, D2, D3, D5, D6
// 质控深度,全面升级支持 5 层架构
targetLevel String // RECORD, EVENT, FORM, INSTANCE, FIELD
engineType String // HARD\_RULE (JSON Logic) 或 SOFT\_RULE (LLM)
triggerType String // WEBHOOK (实时) 或 CRON (定时)
configuration Json // JSON 配置体
isActive Boolean @default(true)
}
### **3.2 Configuration 字段设计 (配置解析)**
**A. HardRule (硬规则 \- 适用于 D1, D3, D7)**
采用 JSON Logic 语法,实现毫秒级绝对判定。
{
"semantic\_tags": \["实验室\_谷丙转氨酶"\],
"logic": {
"\>": \[{"var": "实验室\_谷丙转氨酶"}, 150\]
},
"on\_fail\_message": "谷丙转氨酶(ALT)达到重度异常标准,触发安全预警。",
"severity": "CRITICAL"
}
**B. SoftRule (软规则 \- 适用于 D5, D6)**
采用 Prompt 模板,供 LLM 结合 RAG 在各个 Instance 间进行推理。
{
"semantic\_tags": \["不良事件\_症状描述", "合并用药\_药物名称"\],
"prompt\_template": "患者主诉发生了 {不良事件\_症状描述},请检索知识库禁忌药目录,评估这是否与患者填报的第 {InstanceID} 行用药 {合并用药\_药物名称} 存在禁忌冲突?",
"rag\_enabled": true,
"severity": "WARNING"
}
## **第四章 配置工作流与执行链路 (How it works in action)**
### **4.1 DM 配置工作流 (UI 交互层)**
1. **选择维度**DM 选择配置【D1 入排标准】。
2. **选择模板**:选择“数值范围检验”。
3. **绑定语义**:下拉选择 \[入选标准\_年龄\]。
4. **设置条件**\>= 18 且 \<= 75。保存发布。
### **4.2 引擎自动化执行链路 (Execution Pipeline)**
1. **触发与拦截**REDCap Webhook 抵达。
2. **提取五层坐标**:解析出 Record:P005 \-\> Event:V2 \-\> Form:AE\_Log \-\> Instance:2 \-\> Field:ae\_term。
3. **加载 Skills**:查询匹配的 active Skills。
4. **装填数据**:按 AutoMapper 映射装填数值。
5. **引擎计算**:调起 HardRuleEngine 或 SoftRuleEngine。
6. **状态回写**:若失败,将原因写入 qc\_field\_status携带 Category (如 D5),红灯沿五层坐标向上一路冒泡至 Record 级。