# 4. 一致性核查详细设计

## 1. 设计目标

本步骤承接“字段抽取与统一字段池”的输出，目标是核查同一审核范围内不同文档之间的关键字段是否完全一致，并识别跨产品资料混入、字段冲突、来源不确定和需要人工复核的问题。

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

1. 明确本次一致性核查的审核范围，避免把不同产品样例直接合并审核。
2. 加载强一致字段规则，V1 默认按完全一致处理。
3. 从统一字段池读取字段候选值和来源证据。
4. 按字段和来源文档分组。
5. 对强一致字段执行完全一致比对。
6. 识别字段冲突、疑似混档、待人工复核和一致通过项。
7. 生成冲突明细、风险建议和证据链。
8. 输出结构化 `registration_consistency_report`。

本步骤不负责重新抽取字段，不负责综合风险汇总，不负责自动修正字段池。它只对字段池中已有的字段事实进行一致性判断。

## 2. 所属模块与边界

### 2.1 Documents

`apps.documents` 提供文档主数据，用于确认字段来源文档是否属于同一批次、同一审核范围和相同业务资料角色。

本步骤读取：

1. 文档 ID。
2. 文档名称。
3. 章节点。
4. 文档角色。
5. 批次 ID。
6. 处理状态。
7. 是否待人工复核。

### 2.2 Agent Core

`agent_core` 是本步骤的执行主体，负责编排审核范围确认、强一致规则加载、字段池读取、字段分组、完全一致比对、混档识别、报告生成和审计留痕。

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

1. `一致性核查编排Skill`
2. `审核范围确认Skill`
3. `强一致规则加载Skill`
4. `字段分组Skill`
5. `字段完全一致比对Skill`
6. `混档风险识别Skill`
7. `一致性报告生成Skill`

### 2.3 LLM Provider

本步骤默认不使用 LLM 作为判断引擎。

LLM 只可用于：

1. 将规则结论组织成自然语言说明。
2. 生成处理建议文案。
3. 对复杂冲突进行解释性摘要。

LLM 不可用于：

1. 将不一致字段判为一致。
2. 覆盖强一致规则结论。
3. 无证据地解释跨产品资料混入。

### 2.4 Audit

`apps.audit` 记录一致性核查的审核范围、字段规则、冲突字段、来源文档、处理建议和最终状态。

审计中必须保留：

1. `batch_id`
2. `selected_document_ids`
3. `scope_confirmation`
4. `field_rule_version`
5. `consistent_fields`
6. `conflict_fields`
7. `mixed_package_warnings`
8. `manual_review_fields`
9. `evidence_refs`

## 3. 输入输出

### 3.1 输入

```json
{
  "batch_id": 1001,
  "scenario_id": "registration_consistency_review",
  "selected_document_ids": [11, 12, 13],
  "field_rule_id": "ivd_strict_consistency_v1",
  "target_field_keys": [
    "product_name",
    "applicant_name",
    "package_specification",
    "classification_code"
  ],
  "strict_mode": true
}
```

### 3.2 输出

本步骤输出 `registration_consistency_report`：

```json
{
  "report_type": "registration_consistency_report",
  "batch_id": 1001,
  "field_rule_id": "ivd_strict_consistency_v1",
  "summary": {
    "checked_field_count": 4,
    "consistent_field_count": 2,
    "conflict_field_count": 1,
    "manual_review_field_count": 1,
    "mixed_package_warning_count": 1,
    "highest_risk_level": "high",
    "pass_status": "failed"
  },
  "consistent_fields": [],
  "conflict_fields": [],
  "manual_review_fields": [],
  "mixed_package_warnings": [],
  "suggestions": []
}
```

### 3.3 一致性状态

| 状态 | 含义 |
|---|---|
| `consistent` | 同一字段在审核范围内完全一致 |
| `conflict` | 同一字段出现不同标准值或原始值 |
| `single_source` | 只有一个来源，无法跨文档比对 |
| `manual_review_required` | 来源文档或字段值不确定 |
| `not_checked` | 字段不在本次核查范围 |
| `mixed_package_suspected` | 疑似跨产品资料混入 |

## 4. 主工作流

```text
用户发起一致性核查
-> 读取统一字段池
-> 确认审核范围
-> 加载强一致字段规则
-> 筛选目标字段
-> 按字段分组候选值
-> 按完全一致规则比对
-> 识别字段冲突
-> 识别疑似混档风险
-> 生成处理建议
-> 写入字段池冲突状态
-> 生成一致性报告
-> 写入审计留痕
-> 返回 Web/飞书可展示结果
```

## 5. 节点详细设计

### 5.1 节点一：读取统一字段池

业务功能：

1. 根据 `batch_id` 读取字段池。
2. 过滤本次目标字段。
3. 读取每个字段的所有候选值和推荐值。
4. 加载字段来源文档信息。

使用技术：

1. Django ORM
2. JSONField
3. dataclass/Pydantic schema

产生方法：

1. `load_field_pool(batch_id) -> list[FieldPoolItem]`
2. `load_field_candidates(batch_id, field_keys) -> list[FieldCandidateRecord]`
3. `attach_source_documents(candidates) -> list[FieldCandidateWithDocument]`

对应 Skill：

1. `一致性核查编排Skill`

### 5.2 节点二：审核范围确认

业务功能：

1. 确认哪些文档属于同一项目、批次和本次审核范围。
2. 如果用户选择了文档范围，只对选中范围执行。
3. 如果未选择范围，默认使用当前批次业务资料。
4. 对疑似不同产品、不同来源、不同流程资料给出范围警告。

范围确认规则：

1. 同一 `batch_id` 是最低要求。
2. `source_role` 必须为 `submission`。
3. 法规资料不进入一致性核查。
4. 待人工复核文档可以进入，但相关字段不直接判通过。
5. 疑似跨产品文档进入混档风险提示。

使用技术：

1. 文档主数据
2. 资料包批次
3. 文档角色规则
4. 用户选中文档范围

产生方法：

1. `resolve_review_scope(batch_id, selected_document_ids) -> ReviewScope`
2. `validate_scope_documents(documents) -> ScopeValidationResult`
3. `detect_scope_uncertainties(documents) -> list[ScopeWarning]`

对应 Skill：

1. `审核范围确认Skill`

### 5.3 节点三：强一致规则加载

业务功能：

1. 加载强一致字段规则。
2. 确认字段是否要求完全一致。
3. 定义冲突严重度。
4. 定义字段缺少多个来源时的处理方式。

规则示例：

```yaml
field_rule_id: ivd_strict_consistency_v1
version: "2026-06-03"
strict_mode: true
fields:
  - field_key: product_name
    field_label: 产品名称
    consistency_required: true
    compare_mode: exact
    risk_level_if_conflict: high
  - field_key: performance_index
    consistency_required: false
    compare_mode: not_checked
```

使用技术：

1. YAML
2. Pydantic schema
3. Django cache

产生方法：

1. `load_consistency_rules(field_rule_id) -> ConsistencyRuleSet`
2. `validate_consistency_rules(rule_set) -> RuleValidationResult`
3. `select_consistency_fields(rule_set, target_field_keys) -> list[ConsistencyFieldRule]`

对应 Skill：

1. `强一致规则加载Skill`

### 5.4 节点四：字段分组

业务功能：

1. 按 `field_key` 分组字段候选。
2. 按来源文档分组同一字段。
3. 保留标准值、原始值、来源位置、置信度。
4. 标记单来源字段和多来源字段。

使用技术：

1. Python 分组
2. 字段池候选表
3. 文档元数据

产生方法：

1. `group_candidates_by_field(candidates) -> dict[str, list[FieldCandidateWithDocument]]`
2. `group_candidates_by_document(candidates) -> dict[int, list[FieldCandidateWithDocument]]`
3. `build_field_compare_units(grouped_candidates) -> list[FieldCompareUnit]`

对应 Skill：

1. `字段分组Skill`

### 5.5 节点五：字段完全一致比对

业务功能：

1. 对强一致字段执行完全一致比对。
2. 对标准化值不同的字段判定冲突。
3. 对标准化值相同但原始值差异较大的字段标记待复核。
4. 对单来源字段标记无法跨文档比对。

比对规则：

1. `compare_mode = exact` 时，标准值必须完全一致。
2. 不采用语义相近判定。
3. 空值不参与通过判定。
4. 待人工复核来源不作为通过证据。

使用技术：

1. Python 严格字符串比较
2. 字段标准化结果
3. 风险映射规则

产生方法：

1. `compare_exact(field_compare_unit, rule) -> FieldCompareResult`
2. `detect_value_conflict(values) -> bool`
3. `detect_raw_value_variation(values) -> bool`
4. `build_conflict_detail(result) -> ConflictDetail`

对应 Skill：

1. `字段完全一致比对Skill`

### 5.6 节点六：混档风险识别

业务功能：

1. 基于产品名称、检测靶标、申请人等核心字段识别疑似跨产品资料混入。
2. 当同一审核范围内出现明显不同产品名称时，输出混档风险。
3. 区分“字段冲突”和“疑似资料包范围错误”。

典型规则：

1. 产品名称出现两个不同值：高风险混档。
2. 检测靶标与产品名称指向明显不同产品：高风险混档。
3. 申请人不同：高风险或待复核。
4. 同一文档角色出现多个版本：中风险或待复核。

使用技术：

1. 字段比对结果
2. 文档角色分析
3. 批次范围校验
4. 规则映射 YAML

产生方法：

1. `detect_mixed_package_risk(compare_results, scope) -> list[MixedPackageWarning]`
2. `detect_product_identity_conflict(field_results) -> MixedPackageWarning | None`
3. `classify_mixed_package_risk(warning) -> str`

对应 Skill：

1. `混档风险识别Skill`

### 5.7 节点七：字段池冲突状态回写

业务功能：

1. 将一致性核查结果回写到字段池。
2. 对冲突字段标记 `conflict`。
3. 对待复核字段标记 `manual_review_required`。
4. 对一致字段标记 `consistent`。

使用技术：

1. Django ORM
2. 批量更新
3. 字段池版本记录

产生方法：

1. `update_field_pool_consistency_status(compare_results) -> FieldPoolUpdateResult`
2. `mark_conflict_field(field_key, conflict_detail) -> None`
3. `mark_consistent_field(field_key) -> None`

对应 Skill：

1. `一致性核查编排Skill`

### 5.8 节点八：一致性报告生成

业务功能：

1. 汇总一致字段、冲突字段、待复核字段和混档风险。
2. 生成结构化报告。
3. 生成页面展示区块。
4. 生成飞书摘要载荷。
5. 写入审计记录。

使用技术：

1. dataclass/Pydantic
2. JSONField
3. Audit 服务
4. 页面展示 schema

产生方法：

1. `build_consistency_report(context, compare_results, mixed_warnings) -> RegistrationConsistencyReport`
2. `build_consistency_summary(compare_results, mixed_warnings) -> dict`
3. `build_consistency_display_sections(report) -> list[dict]`
4. `record_consistency_audit(report, 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. 强一致字段设计

V1 建议强一致字段：

| 字段编码 | 中文名 | 风险等级 |
|---|---|---|
| `product_name` | 产品名称 | 高 |
| `applicant_name` | 申请人名称 | 高 |
| `package_specification` | 包装规格 | 中 |
| `classification_code` | 分类编码 | 高 |
| `detection_target` | 检测靶标 | 高 |
| `intended_use` | 适用范围 / 预期用途 | 中 |

## 8. 页面展示

一致性核查页面建议展示：

1. 当前审核范围。
2. 参与核查文档。
3. 强一致字段规则版本。
4. 一致字段数量。
5. 冲突字段数量。
6. 待人工复核字段数量。
7. 混档风险提示。
8. 字段冲突明细表。
9. 来源证据。
10. 审计入口。

冲突明细表字段：

1. 字段名称。
2. 冲突值。
3. 来源文档。
4. 来源位置。
5. 风险等级。
6. 建议动作。

## 9. 异常处理

1. 字段池不存在：提示先执行字段抽取。
2. 未选择文档且批次为空：返回业务错误。
3. 审核范围内只有单个文档：输出单来源提示，不判冲突。
4. 强一致规则缺失：任务不可执行，写失败审计。
5. 字段全部为空：标记待人工复核。
6. 来源文档待复核：字段不直接判通过。
7. 混档风险存在：本步骤 `pass_status` 直接失败。

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

后续风险预警读取：

1. `pass_status`
2. `highest_risk_level`
3. `conflict_fields`
4. `mixed_package_warnings`
5. `manual_review_fields`
6. `suggestions`

后续 Word 回填读取：

1. 字段池中的 `conflict_status`。
2. 冲突字段清单。
3. 待人工复核字段清单。
4. 可安全回填字段清单。

## 11. 测试设计

### 11.1 单元测试

1. 审核范围确认正确。
2. 强一致规则加载成功。
3. 字段按 `field_key` 分组正确。
4. 完全一致比对正确。
5. 字段冲突识别正确。
6. 单来源字段不判冲突。
7. 混档风险识别正确。

### 11.2 服务层测试

1. 产品名称不同输出高风险冲突。
2. 产品名称相同输出一致。
3. 申请人不同输出冲突。
4. 待复核字段进入人工复核清单。
5. 冲突状态回写字段池。
6. 一致性报告写入审计。

### 11.3 页面测试

1. 页面展示审核范围。
2. 页面展示冲突字段来源。
3. 页面展示混档风险。
4. 页面展示待人工复核状态。
5. 页面展示审计入口。

## 12. V1 实现建议

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

1. 从统一字段池读取产品名称、申请人名称、包装规格、分类编码。
2. 按完全一致规则比对。
3. 识别样例中可能出现的产品名称冲突。
4. 输出冲突明细和混档风险。
5. 回写字段池 `conflict_status`。
6. 生成一致性核查报告并写审计。

增强阶段再补齐：

1. 更多强一致字段。
2. 版本重复识别。
3. 文档结构一致性检查。
4. 人工确认后重新判定。
5. 冲突字段修正建议。

