# 6. Word 回填导出详细设计

## 1. 设计目标

本步骤承接字段抽取、统一字段池、一致性核查和风险预警结果，目标是将可回填字段按模板映射写入注册申报表格或对照清单，并生成新的 Word 文件供用户下载、复核和归档。

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

1. 选择适用的 Word 模板。
2. 加载模板字段映射。
3. 从统一字段池读取可回填字段。
4. 根据风险报告和冲突状态执行回填拦截。
5. 生成回填数据集。
6. 按模板写入 Word 文档。
7. 校验输出文档版式、字段落位和导出状态。
8. 生成导出记录和下载入口。
9. 写入审计留痕。

本步骤不重新抽取字段，不修改法规判断和风险结论。若字段冲突或高风险未处理，应阻止自动生成可报送文件，或者生成“待复核草稿版”并明确标记。

## 2. 所属模块与边界

### 2.1 Documents

`apps.documents` 负责保存生成后的 Word 文件、记录导出文件元数据，并提供下载入口。

### 2.2 Agent Core

`agent_core` 负责模板选择、字段映射、回填数据集构建、Word 渲染、版式校验和导出报告生成。

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

1. `Word回填导出编排Skill`
2. `模板选择Skill`
3. `模板字段映射加载Skill`
4. `回填字段集构建Skill`
5. `回填拦截检查Skill`
6. `Word模板渲染Skill`
7. `导出版式校验Skill`
8. `导出记录生成Skill`

### 2.3 Audit

`apps.audit` 记录本次回填导出的模板版本、字段映射、回填字段、拦截状态、输出文件和失败原因。

审计中必须保留：

1. `batch_id`
2. `template_id`
3. `template_version`
4. `field_mapping_version`
5. `filled_fields`
6. `blocked_fields`
7. `output_file_id`
8. `export_status`
9. `layout_check_result`

## 3. 输入输出

### 3.1 输入

```json
{
  "batch_id": 1001,
  "scenario_id": "registration_word_fill_export",
  "template_id": "registration_application_form_v1",
  "target_output_type": "application_form",
  "allow_draft_when_blocked": true,
  "selected_field_keys": [
    "product_name",
    "detection_target",
    "intended_use",
    "storage_condition",
    "performance_index"
  ]
}
```

### 3.2 输出

本步骤输出 `registration_word_export_report`：

```json
{
  "report_type": "registration_word_export_report",
  "batch_id": 1001,
  "template_id": "registration_application_form_v1",
  "export_status": "draft_generated",
  "summary": {
    "fillable_field_count": 5,
    "filled_field_count": 4,
    "blocked_field_count": 1,
    "manual_review_field_count": 1,
    "layout_check_status": "passed"
  },
  "filled_fields": [],
  "blocked_fields": [],
  "output_file": {
    "file_id": 2001,
    "filename": "注册申报表格_回填草稿.docx",
    "download_url": "/documents/exports/2001/download/"
  }
}
```

## 4. 主工作流

```text
用户发起 Word 回填导出
-> 读取字段池和风险报告
-> 选择目标模板
-> 加载模板字段映射
-> 构建回填字段集
-> 执行冲突和风险拦截检查
-> 渲染 Word 模板
-> 校验字段落位和版式
-> 保存导出文件
-> 生成导出报告
-> 写入审计留痕
-> 返回下载入口
```

## 5. 节点详细设计

### 5.1 节点一：导出上下文加载

业务功能：

1. 读取资料包批次。
2. 读取统一字段池。
3. 读取一致性核查报告。
4. 读取风险预警报告。
5. 确认是否允许生成正式版或草稿版。

使用技术：

1. Django ORM
2. JSONField 报告快照
3. dataclass/Pydantic

产生方法：

1. `load_export_context(batch_id, template_id) -> WordExportContext`
2. `load_fillable_field_pool(batch_id) -> list[FieldPoolItem]`
3. `load_export_blockers(batch_id) -> ExportBlockerContext`

对应 Skill：

1. `Word回填导出编排Skill`

### 5.2 节点二：模板选择

业务功能：

1. 根据输出目标选择模板。
2. 校验模板是否存在。
3. 校验模板适用流程。
4. 校验模板版本是否启用。

模板类型：

1. 注册申报表格模板。
2. 法规对照清单模板。
3. 注册证或批准证明文件格式模板。

使用技术：

1. 模板库模型
2. Django Storage
3. YAML/JSON 模板元数据

产生方法：

1. `select_word_template(template_id, target_output_type) -> WordTemplate`
2. `validate_template_applicability(template, workflow_type) -> TemplateValidationResult`
3. `resolve_template_file_path(template) -> Path`

对应 Skill：

1. `模板选择Skill`

### 5.3 节点三：模板字段映射加载

业务功能：

1. 加载模板字段和统一字段池字段的映射关系。
2. 校验模板占位符是否完整。
3. 标记必填字段、可选字段和人工复核字段。

映射示例：

```yaml
template_id: registration_application_form_v1
version: "2026-06-03"
mappings:
  - placeholder: "{{ product_name }}"
    field_key: product_name
    required: true
  - placeholder: "{{ intended_use }}"
    field_key: intended_use
    required: true
```

使用技术：

1. YAML
2. Pydantic
3. 模板占位符扫描

产生方法：

1. `load_template_field_mapping(template_id) -> TemplateFieldMapping`
2. `validate_mapping_against_template(template, mapping) -> MappingValidationResult`
3. `scan_template_placeholders(template_file) -> list[str]`

对应 Skill：

1. `模板字段映射加载Skill`

### 5.4 节点四：回填字段集构建

业务功能：

1. 从字段池读取映射字段。
2. 选择推荐值。
3. 过滤不可回填字段。
4. 生成待回填字段集。

使用技术：

1. Django ORM
2. 字段池数据
3. 映射规则

产生方法：

1. `build_fill_dataset(field_pool, mapping) -> FillDataset`
2. `resolve_field_value(field_key, field_pool) -> FillValue`
3. `collect_missing_fill_values(mapping, field_pool) -> list[MissingFillValue]`

对应 Skill：

1. `回填字段集构建Skill`

### 5.5 节点五：回填拦截检查

业务功能：

1. 检查字段是否存在冲突。
2. 检查字段是否待人工复核。
3. 检查风险报告是否存在高风险。
4. 判断是否允许生成正式版或草稿版。

拦截规则：

1. 高风险未处理：禁止生成正式版。
2. 字段冲突未处理：禁止自动正式回填。
3. 必填字段缺失：禁止正式版。
4. 允许生成草稿版时，输出文件必须标记“待复核草稿”。

使用技术：

1. 风险报告
2. 字段池冲突状态
3. 回填策略规则

产生方法：

1. `check_fill_blockers(fill_dataset, risk_report) -> FillBlockerResult`
2. `determine_export_mode(blockers, allow_draft) -> str`
3. `build_blocked_field_list(blockers) -> list[BlockedField]`

对应 Skill：

1. `回填拦截检查Skill`

### 5.6 节点六：Word 模板渲染

业务功能：

1. 打开 Word 模板。
2. 替换占位符。
3. 写入表格单元格。
4. 保留标题层级、表格、页眉页脚、盖章位和原始样式。
5. 输出新的 Word 文件。

使用技术：

1. `python-docx`
2. `docxtpl` 可选
3. Django Storage
4. 临时文件目录

产生方法：

1. `render_word_template(template_file, fill_dataset, export_mode) -> RenderedWordFile`
2. `replace_paragraph_placeholders(document, values) -> None`
3. `replace_table_placeholders(document, values) -> None`
4. `save_rendered_document(document, output_path) -> Path`

对应 Skill：

1. `Word模板渲染Skill`

### 5.7 节点七：导出版式校验

业务功能：

1. 校验输出文件是否存在。
2. 校验必填占位符是否已替换。
3. 校验是否仍残留模板占位符。
4. 校验基础版式元素是否存在。
5. 必要时渲染预览用于人工确认。

使用技术：

1. `python-docx`
2. 文档占位符扫描
3. 可选 LibreOffice 转 PDF
4. 可选 PDF 渲染检查

产生方法：

1. `check_export_layout(output_file, mapping) -> LayoutCheckResult`
2. `detect_unfilled_placeholders(output_file) -> list[str]`
3. `validate_required_sections(output_file) -> list[LayoutWarning]`

对应 Skill：

1. `导出版式校验Skill`

### 5.8 节点八：导出记录生成

业务功能：

1. 保存输出文件记录。
2. 生成下载地址。
3. 生成导出报告。
4. 写入审计。

使用技术：

1. Django ORM
2. Django Storage
3. JSONField
4. Audit 服务

产生方法：

1. `create_export_file_record(batch, output_file) -> ExportedDocument`
2. `build_download_url(export_file) -> str`
3. `build_word_export_report(context, result) -> RegistrationWordExportReport`
4. `record_word_export_audit(report, context) -> AuditLog`

对应 Skill：

1. `导出记录生成Skill`

## 6. Skill 清单

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

1. [Word回填导出编排Skill](skill/Word回填导出编排Skill.md)
2. [模板选择Skill](skill/模板选择Skill.md)
3. [模板字段映射加载Skill](skill/模板字段映射加载Skill.md)
4. [回填字段集构建Skill](skill/回填字段集构建Skill.md)
5. [回填拦截检查Skill](skill/回填拦截检查Skill.md)
6. [Word模板渲染Skill](skill/Word模板渲染Skill.md)
7. [导出版式校验Skill](skill/导出版式校验Skill.md)
8. [导出记录生成Skill](skill/导出记录生成Skill.md)

## 7. 导出模式

| 模式 | 含义 |
|---|---|
| `formal` | 正式导出，字段无冲突且无高风险 |
| `draft` | 草稿导出，存在待复核项但允许预览 |
| `blocked` | 拦截导出，不生成文件 |

## 8. 页面展示

Word 回填导出页面建议展示：

1. 模板名称和版本。
2. 回填字段数量。
3. 已回填字段。
4. 被拦截字段。
5. 导出模式。
6. 版式校验结果。
7. Word 下载入口。
8. 审计入口。

## 9. 异常处理

1. 模板不存在：任务失败。
2. 模板字段映射缺失：任务失败。
3. 必填字段缺失：正式版导出拦截。
4. 字段冲突：正式版导出拦截。
5. 高风险未处理：正式版导出拦截。
6. Word 渲染失败：记录导出失败。
7. 版式校验失败：生成文件标记待复核。

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

飞书通知读取：

1. 导出状态。
2. 下载链接。
3. 被拦截字段。
4. 待复核字段。
5. 责任角色。

## 11. 测试设计

### 11.1 单元测试

1. 模板选择正确。
2. 字段映射加载正确。
3. 必填字段缺失被拦截。
4. 冲突字段被拦截。
5. 占位符替换正确。
6. 残留占位符可识别。

### 11.2 服务层测试

1. 能基于字段池生成 Word 草稿。
2. 高风险存在时禁止正式导出。
3. 导出文件记录生成。
4. 导出报告写入审计。

### 11.3 页面测试

1. 页面展示导出状态。
2. 页面展示下载入口。
3. 页面展示拦截原因。
4. 页面展示版式校验结果。

## 12. V1 实现建议

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

1. 维护一个注册申报表格或对照清单模板。
2. 支持字段占位符回填。
3. 支持冲突字段和高风险拦截。
4. 生成新的 `.docx` 文件。
5. 提供下载入口。
6. 写入审计。

增强阶段再补齐：

1. 多模板库管理。
2. PDF 归档件导出。
3. 高保真版式自动校验。
4. 模板版本审批。
5. 后台模板字段映射维护。

