# 2. 法规完整性检查详细设计

## 1. 设计目标

本步骤承接“资料包导入与目录汇总”的输出，目标是对照 NMPA 体外诊断试剂注册申报资料要求，检查当前资料包是否齐套、章节点是否匹配、资料是否错放、是否存在需要人工复核的完整性问题。

本步骤需要完成以下业务结果：

1. 识别当前审核任务适用的法规流程，V1 默认使用 `registration` 注册申报流程。
2. 装载本地法规规则包，默认以公告附件包为主规则来源。
3. 将资料包目录结果与法规目录模板进行匹配。
4. 区分已提供、缺失、疑似提供、错放、待人工复核等状态。
5. 对缺失、错放和不确定项生成完整性风险等级和处理建议。
6. 通过 RAG 检索法规原文证据，但不把 RAG 命中结果作为最终裁判。
7. 输出结构化 `registration_completeness_report`，供 Chat 页面、Audit 和后续风险预警使用。

本步骤不负责产品字段抽取，不负责跨文档字段一致性检查，不负责最终综合风险报告。它只产出法规完整性维度的结论和证据。

## 2. 所属模块与边界

### 2.1 Scenarios

`apps.scenarios` 负责定义“法规完整性核查”任务入口。

建议配置项：

1. `scenario_id`: `registration_completeness_check`
2. `workflow_type`: `registration`
3. `required_input`: `registration_overview_report`
4. `rule_package`: `nmpa_ivd_registration_v1`
5. `enable_rag_evidence`: `true`
6. `output_schema`: `registration_completeness_report`

### 2.2 Documents

`apps.documents` 提供第一步生成的文档主数据和目录汇总结果。

本步骤读取：

1. 批次信息。
2. 文件相对路径。
3. 文件名。
4. 文件类型。
5. 页数。
6. 章节点。
7. 文档角色。
8. 处理状态。
9. 待人工复核标记。

### 2.3 Agent Core

`agent_core` 是本步骤的执行主体，负责编排规则包加载、流程识别、规则匹配、完整性判定、法规证据检索和报告生成。

本步骤建议产生以下中文 Skill：

1. `法规完整性检查Skill`
2. `法规规则包加载Skill`
3. `法规流程识别Skill`
4. `资料要求匹配Skill`
5. `缺失错放判定Skill`
6. `法规证据检索Skill`
7. `完整性报告生成Skill`

### 2.4 RAG

RAG 只负责证据定位和解释引用。

RAG 可以回答：

1. 当前缺失项对应公告附件中的哪段要求。
2. 当前章节点属于哪类资料要求。
3. 当前格式要求来源于哪份附件。

RAG 不负责决定：

1. 某资料是否必交。
2. 当前资料是否合规。
3. 缺失项是否高风险。

这些结论必须来自结构化规则。

### 2.5 Audit

`apps.audit` 记录本次完整性检查的输入、规则版本、匹配结果、缺失项、证据和错误。

审计中必须保留：

1. `batch_id`
2. `scenario_id`
3. `workflow_type`
4. `rule_package_id`
5. `rule_version`
6. `selected_document_ids`
7. `matched_items`
8. `missing_items`
9. `misplaced_items`
10. `manual_review_items`
11. `evidence_refs`

## 3. 输入输出

### 3.1 输入

```json
{
  "batch_id": 1001,
  "scenario_id": "registration_completeness_check",
  "workflow_type": "registration",
  "rule_package_id": "nmpa_ivd_registration_v1",
  "chapter_scope": ["CH1"],
  "selected_document_ids": [1, 2, 3],
  "enable_rag_evidence": true
}
```

其中 `chapter_scope` 可为空。为空时默认检查当前批次已识别章节点及 V1 默认范围；演示首版建议优先检查 `CH1`，同时保留全六章规则结构。

### 3.2 输出

本步骤输出 `registration_completeness_report`：

```json
{
  "report_type": "registration_completeness_report",
  "batch_id": 1001,
  "workflow_type": "registration",
  "rule_package_id": "nmpa_ivd_registration_v1",
  "rule_version": "2026-06-03",
  "chapter_scope": ["CH1"],
  "summary": {
    "required_item_count": 8,
    "provided_item_count": 6,
    "missing_item_count": 1,
    "suspected_item_count": 1,
    "misplaced_item_count": 0,
    "manual_review_item_count": 1,
    "highest_risk_level": "high",
    "pass_status": "failed"
  },
  "matched_items": [],
  "missing_items": [],
  "misplaced_items": [],
  "manual_review_items": [],
  "evidence_refs": [],
  "suggestions": []
}
```

### 3.3 结果状态

| 状态 | 含义 |
|---|---|
| `provided` | 已提供，命中文档和章节点 |
| `missing` | 必交资料未找到 |
| `suspected` | 疑似提供，但命名、章节点或文档角色不确定 |
| `misplaced` | 文件存在，但章节点或路径位置不匹配 |
| `manual_review_required` | 规则无法直接判断，需人工复核 |
| `not_applicable` | 当前流程或适用条件下不要求 |

## 4. 主工作流

```text
用户发起法规完整性检查
-> 读取资料包目录汇总结果
-> 确认法规流程类型
-> 装载法规规则包
-> 展开章节和必交项规则
-> 将实际文档与规则项匹配
-> 判定已提供/缺失/疑似/错放/待复核
-> 映射风险等级与处理建议
-> 检索法规原文证据
-> 生成完整性检查报告
-> 写入审计留痕
-> 返回 Web/飞书可展示结果
```

## 5. 节点详细设计

### 5.1 节点一：读取目录汇总结果

业务功能：

1. 根据 `batch_id` 读取第一步产出的 `registration_overview_report`。
2. 校验资料包是否完成目录汇总。
3. 过滤当前检查范围内的文档。
4. 收集待人工复核文档，作为完整性检查的不确定性输入。

使用技术：

1. Django ORM
2. JSONField
3. Pydantic 或 dataclass schema 校验

产生方法：

1. `load_overview_report(batch_id) -> RegistrationOverviewReport`
2. `select_documents_for_completeness(report, chapter_scope, selected_document_ids) -> list[DocumentFact]`
3. `collect_document_uncertainties(documents) -> list[DocumentUncertainty]`

对应 Skill：

1. `法规完整性检查Skill`

### 5.2 节点二：法规流程识别

业务功能：

1. 确认当前任务属于注册申报、变更备案、变更注册还是延续注册。
2. V1 默认使用 `registration`。
3. 如果用户选择了不支持流程，返回业务化提示。
4. 防止把变更或延续规则误用于首次注册申报。

使用技术：

1. 场景配置 YAML
2. 批次字段 `workflow_type`
3. 规则包元数据

产生方法：

1. `resolve_workflow_type(batch, scenario_config, user_input) -> WorkflowTypeResult`
2. `validate_workflow_supported(workflow_type, rule_package) -> bool`

对应 Skill：

1. `法规流程识别Skill`

### 5.3 节点三：法规规则包加载

业务功能：

1. 加载本地结构化法规规则文件。
2. 校验规则版本、适用流程和章节结构。
3. 按“章 -> 条 -> 要求项 -> 模板字段”四级结构展开规则。
4. 区分资料要求层、结构目录层和格式模板层。

使用技术：

1. YAML 规则文件
2. Pydantic schema
3. Django cache 或内存缓存
4. 规则版本号

建议规则目录：

```text
configs/registration/rules/
  nmpa_ivd_registration_v1.yaml
  chapter_catalog.yaml
  risk_mapping.yaml
```

规则项示例：

```yaml
rule_package_id: nmpa_ivd_registration_v1
workflow_type: registration
version: "2026-06-03"
chapters:
  - chapter_code: CH1
    chapter_name: 监管信息
    requirements:
      - requirement_id: CH1.4
        requirement_name: 申请表
        required: true
        expected_document_roles:
          - application_form
        risk_level_if_missing: high
        evidence_query: "体外诊断试剂 注册申报 申请表 监管信息"
```

产生方法：

1. `load_rule_package(rule_package_id) -> RulePackage`
2. `validate_rule_package(rule_package) -> RulePackageValidationResult`
3. `expand_requirement_items(rule_package, workflow_type, chapter_scope) -> list[RequirementItem]`

对应 Skill：

1. `法规规则包加载Skill`

### 5.4 节点四：资料要求匹配

业务功能：

1. 将当前资料包文档与法规要求项进行匹配。
2. 优先使用章节点编码匹配。
3. 其次使用文档角色匹配。
4. 再使用文件名和资料名称关键词匹配。
5. 保留匹配证据和匹配置信度。

匹配优先级：

1. `document.chapter_code == requirement.requirement_id`
2. `document.document_role in requirement.expected_document_roles`
3. 文件名命中规则关键词。
4. 相对路径命中章节名称。
5. 人工修正字段命中。

使用技术：

1. Python 规则匹配
2. 字符串标准化
3. 简单中文关键词匹配
4. 可选 rapidfuzz 模糊匹配，V1 谨慎使用

产生方法：

1. `match_documents_to_requirements(documents, requirements) -> RequirementMatchSet`
2. `match_by_chapter_code(document, requirement) -> MatchEvidence | None`
3. `match_by_document_role(document, requirement) -> MatchEvidence | None`
4. `match_by_keywords(document, requirement) -> MatchEvidence | None`
5. `calculate_match_confidence(evidences) -> str`

对应 Skill：

1. `资料要求匹配Skill`

### 5.5 节点五：缺失、错放与待复核判定

业务功能：

1. 对每个法规要求项生成完整性状态。
2. 判断必交项是否缺失。
3. 判断文件是否存在但错放章节。
4. 判断疑似提供但证据不足的情况。
5. 将第一步处理失败或页数待复核文件纳入不确定性。

判定规则：

| 条件 | 状态 |
|---|---|
| 必交项有高置信匹配文档 | `provided` |
| 必交项无任何匹配文档 | `missing` |
| 有低置信匹配文档 | `suspected` |
| 文档角色匹配但章节点不匹配 | `misplaced` |
| 文档本身待人工复核 | `manual_review_required` |
| 规则项不适用于当前流程 | `not_applicable` |

使用技术：

1. Python 规则引擎
2. 风险映射 YAML
3. dataclass/Pydantic 结果对象

产生方法：

1. `evaluate_requirement_status(requirement, matches, document_uncertainties) -> CompletenessItemResult`
2. `detect_missing_items(requirements, matches) -> list[MissingItem]`
3. `detect_misplaced_items(requirements, matches) -> list[MisplacedItem]`
4. `detect_manual_review_items(requirements, matches, uncertainties) -> list[ManualReviewItem]`

对应 Skill：

1. `缺失错放判定Skill`

### 5.6 节点六：完整性风险映射

业务功能：

1. 根据规则项定义映射风险等级。
2. 缺失高风险必交项时，本维度判定不通过。
3. 对待复核项不直接判失败，但标记结果可信度下降。
4. 生成基础处理建议。

风险等级：

1. `high`
2. `medium`
3. `low`

准入规则：

1. 任一高风险缺失项：`pass_status = failed`
2. 无高风险但存在中风险缺失项：`pass_status = review_required`
3. 只有低风险或待复核项：`pass_status = conditional_pass`
4. 无缺失、无错放、无待复核：`pass_status = passed`

使用技术：

1. 规则包内风险配置
2. 本地建议模板
3. Python 枚举

产生方法：

1. `map_completeness_risk(item_result, risk_rules) -> RiskMappingResult`
2. `calculate_pass_status(item_results) -> str`
3. `build_completeness_suggestion(item_result) -> str`

对应 Skill：

1. `缺失错放判定Skill`

### 5.7 节点七：法规证据检索

业务功能：

1. 针对缺失项、错放项和待复核项检索法规原文。
2. 返回法规来源文档、章节、片段和匹配查询。
3. 将证据附加到完整性结果和审计记录。

使用技术：

1. Chroma 或 fallback 检索
2. 本地法规原文切片
3. metadata 过滤
4. 关键词查询兜底

检索过滤条件：

1. `source_role = regulation`
2. `workflow_type = registration`
3. `rule_package_id = nmpa_ivd_registration_v1`
4. `chapter_code` 或 `requirement_id`

产生方法：

1. `retrieve_regulation_evidence(requirement_item, query_context) -> list[EvidenceRef]`
2. `build_evidence_query(requirement_item) -> str`
3. `filter_evidence_by_metadata(results, requirement_item) -> list[EvidenceRef]`

对应 Skill：

1. `法规证据检索Skill`

### 5.8 节点八：完整性报告生成

业务功能：

1. 汇总完整性检查结果。
2. 生成结构化报告。
3. 生成页面展示摘要。
4. 生成飞书摘要所需的短消息结构。
5. 写入审计记录。

使用技术：

1. Pydantic 或 dataclass schema
2. JSONField
3. Django template 或页面组件消费 JSON
4. Audit 服务层

产生方法：

1. `build_completeness_report(context, item_results, evidence_refs) -> RegistrationCompletenessReport`
2. `build_completeness_summary(item_results) -> CompletenessSummary`
3. `build_display_sections(report) -> list[DisplaySection]`
4. `record_completeness_audit(report, execution_context) -> AuditLog`

对应 Skill：

1. `完整性报告生成Skill`

## 6. Skill 清单

本步骤产生以下 Skill 设计文档：

1. [法规完整性检查Skill](skill/法规完整性检查Skill.md)
2. [法规规则包加载Skill](skill/法规规则包加载Skill.md)
3. [法规流程识别Skill](skill/法规流程识别Skill.md)
4. [资料要求匹配Skill](skill/资料要求匹配Skill.md)
5. [缺失错放判定Skill](skill/缺失错放判定Skill.md)
6. [法规证据检索Skill](skill/法规证据检索Skill.md)
7. [完整性报告生成Skill](skill/完整性报告生成Skill.md)

## 7. 规则数据设计

### 7.1 规则包元数据

| 字段 | 说明 |
|---|---|
| `rule_package_id` | 规则包标识 |
| `version` | 规则版本 |
| `workflow_type` | 适用流程 |
| `source_documents` | 法规来源文档 |
| `effective_scope` | 适用范围 |
| `chapter_count` | 章节数量 |

### 7.2 要求项字段

| 字段 | 说明 |
|---|---|
| `requirement_id` | 要求项编码，如 `CH1.4` |
| `chapter_code` | 章编码，如 `CH1` |
| `requirement_name` | 要求项名称 |
| `required` | 是否必交 |
| `condition` | 适用条件 |
| `expected_document_roles` | 期望文档角色 |
| `keywords` | 匹配关键词 |
| `risk_level_if_missing` | 缺失风险等级 |
| `evidence_query` | 法规证据检索查询 |
| `template_field_refs` | 后续模板字段映射 |

### 7.3 匹配结果字段

| 字段 | 说明 |
|---|---|
| `requirement_id` | 要求项编码 |
| `status` | 完整性状态 |
| `matched_document_ids` | 命中文档 ID |
| `match_confidence` | 匹配置信度 |
| `match_evidence` | 匹配证据 |
| `risk_level` | 风险等级 |
| `suggestion` | 处理建议 |
| `evidence_refs` | 法规证据引用 |

## 8. 页面展示

Chat/工作台页面建议展示：

1. 当前规则包名称和版本。
2. 当前检查流程类型。
3. 当前检查章节点范围。
4. 总体结论。
5. 缺失项数量。
6. 错放项数量。
7. 待人工复核数量。
8. 高风险缺失项。
9. 完整性检查明细表。
10. 法规证据引用。
11. 审计入口。

明细表字段：

1. 章节点。
2. 法规要求项。
3. 当前状态。
4. 命中文档。
5. 风险等级。
6. 处理建议。
7. 法规依据。

## 9. 异常处理

1. 未找到批次：返回“当前资料包不存在或已删除”。
2. 目录汇总未完成：提示先完成资料包导入与目录汇总。
3. 规则包不存在：任务不可执行，记录失败审计。
4. 规则包版本不支持当前流程：提示流程配置错误。
5. 文档章节点大量缺失：可执行，但报告标记低可信。
6. RAG 检索失败：不阻断规则判断，报告中标记证据检索不可用。
7. 所选文档为空：返回空范围检查结果，并提示用户选择资料范围。
8. 文档仍待人工复核：完整性报告保留不确定状态。

## 10. 与后续步骤的接口

后续风险预警读取：

1. `pass_status`
2. `highest_risk_level`
3. `missing_items`
4. `misplaced_items`
5. `manual_review_items`
6. `suggestions`
7. `evidence_refs`

后续字段抽取可读取：

1. 已命中的申请表、产品列表、说明书等文档 ID。
2. 待人工复核文档清单。
3. 当前规则包中声明的模板字段映射。

## 11. 测试设计

### 11.1 单元测试

1. 规则包加载成功。
2. 不支持流程被拦截。
3. 章节点编码匹配成功。
4. 文档角色匹配成功。
5. 必交项缺失被识别。
6. 错放文件被识别。
7. 风险等级映射正确。
8. RAG 失败不影响规则判断。

### 11.2 服务层测试

1. 基于第一步目录汇总执行完整性检查。
2. 缺失 `CH1.4` 时输出高风险。
3. `CH1.2` 目录类文档能作为命中文档进入报告。
4. 待复核文档会进入 `manual_review_items`。
5. 规则包缺失时写入失败审计。

### 11.3 页面测试

1. 页面展示规则包版本。
2. 页面展示缺失项和风险等级。
3. 页面展示法规证据。
4. 页面展示审计入口。
5. RAG 不可用时页面仍显示规则判断结果。

## 12. V1 实现建议

V1 建议先完成以下最小闭环：

1. 基于本地 YAML 规则包实现 `CH1` 完整性检查。
2. 检查 `CH1.2`、`CH1.4`、`CH1.5`、`CH1.9`、`CH1.11.1`、`CH1.11.5`、`CH1.11.6`。
3. 基于第一步的 `chapter_code` 和 `document_role` 做规则匹配。
4. 输出缺失项、疑似项和待复核项。
5. RAG 证据检索先使用 fallback 检索，后续接 Chroma。
6. 完整性报告写入审计。

增强阶段再补齐：

1. 第 2 至第 6 章完整规则。
2. 资料格式要求层检查。
3. 安全和性能基本原则清单映射检查。
4. 后台规则人工校订。
5. 在线法规更新能力。

