docs(application-form-fill): 完善申报文件自动填表设计文档

This commit is contained in:
2026-06-07 17:05:08 +08:00
parent 3e8720e521
commit 56225f40d9
6 changed files with 3071 additions and 4 deletions

View File

@@ -0,0 +1,632 @@
# 产品关键信息提取与申报文件自动填表开发计划
## 文档信息
| 项目 | 内容 |
| --- | --- |
| 需求分析文档 | docs/1.需求分析/3.产品关键信息提取与申报文件自动填表.md |
| 功能设计文档 | docs/2.功能设计/3.产品关键信息提取与申报文件自动填表.md |
| 详细设计文档 | docs/3.详细设计/3.产品关键信息提取与申报文件自动填表.md |
| 数据库设计文档 | docs/4.数据库设计/3.产品关键信息提取与申报文件自动填表.md |
| 功能名称 | 产品关键信息提取与申报文件自动填表 |
| 所属模块 | 审核智能体 review_agent |
| 执行方式 | 单人开发 + Codex 目标模式自动化执行 |
| 计划日期 | 2026-06-07 |
| 计划版本 | V1.0 |
---
## 一、开发计划目标
本开发计划用于指导 Codex 目标模式按阶段完成“产品关键信息提取与申报文件自动填表”功能开发。该功能作为独立工作流 `application_form_fill` 实现,由用户对话触发,默认复用当前对话最近成功的文件汇总批次;如本次消息带新附件,则先串联文件汇总,再执行自动填表。
本期必须完成:独立填表批次、过程产物、飞书通知记录、模板配置、注册证 `.docx` 模板填充、字段抽取与合并、冲突高亮、追溯清单、Word 下载、自动填表工作流卡片和权限校验。
本期明确不强制完成PDF 转换、字段级数据库表、`.doc` 模板自动转换、完整安全和性能基本原则清单条目拆解。这些事项已进入 `docs/6.待办计划/第二阶段暂缓事项.md`
---
## 二、已确认开发规则
| 规则项 | 内容 |
| --- | --- |
| 工作流类型 | 新增独立 `application_form_fill`,不塞入 `regulatory_review` 工作流 |
| 触发方式 | 用户对话触发,如“帮我填注册证”“给我这个内容对应的表格”“为我该方案生成申报模板” |
| 模板指定 | 用户可指定模板;未指定时按注册类型生成适用模板 |
| 文件来源 | 无新附件时复用当前对话最近成功 `FileSummaryBatch`;有新附件时先自动汇总 |
| 模板配置 | 放在 `review_agent/application_form_fill/templates/application_form_templates_v1.yaml` |
| 字段抽取 | 规则/正则与 LLM 结构化抽取并行,合并处理 |
| 冲突处理 | 说明书优先;冲突字段在 Word 中黄色底色、红色字体 |
| 输出范围 | Demo 主链路优先 Word + Excel/JSON 追溯清单 |
| PDF | 数据结构预留,工作流节点可 skipped不作为本期强验收 |
| 飞书 | 新增自动填表通知记录表,通知失败不阻断下载 |
| 数据库 | 新增三张表;字段级明细表暂缓 |
| Git 提交 | 每个阶段完成并验证通过后提交一次 |
| 测试要求 | 每阶段至少运行对应 pytest前端阶段补卡片和渲染测试 |
---
## 三、总体验收标准
| 类别 | 完成标准 |
| --- | --- |
| 数据库 | `ApplicationFormFillBatch``ApplicationFormFillArtifact``ApplicationFormFillNotificationRecord` 可通过 migration 落库 |
| 导出类型 | `ExportedSummaryFile.ExportType` 支持 `word``pdf`,并兼容既有 markdown/excel/json |
| 模块结构 | 新增 `review_agent/application_form_fill/` 独立模块 |
| 触发 | 用户说“帮我填注册证”等语句可触发 `application_form_fill` |
| 文件来源 | 无新附件时复用最近成功汇总批次;无汇总批次时提示上传资料 |
| 模板配置 | YAML 可加载、校验,并至少配置注册证格式 `.docx` 已识别字段 |
| 字段抽取 | 规则/正则与 LLM 抽取结果均可留底LLM 失败时规则结果可继续 |
| 字段合并 | 说明书优先,冲突字段进入 `conflict_summary` 和追溯清单 |
| Word 填充 | 能按表格行名填入注册证模板字段,缺失字段留空 |
| 冲突高亮 | 冲突字段在 Word 内黄底红字 |
| 追溯清单 | 生成 Excel/JSON记录规则结果、LLM 结果、合并字段、冲突和来源证据 |
| 下载 | 对话框提供填好 Word 和追溯清单下载链接 |
| 工作流卡片 | 前端支持 `application_form_fill` 卡片,展示准备资料、选择模板、复制模板、抽取字段、填写 Word 等节点 |
| 飞书通知 | 填表完成后写通知记录,可 mock失败不阻断文件下载 |
| 权限 | A 对话不能查询或下载 B 对话的填表批次和导出文件 |
| 回归 | 第一批文件汇总、第二批法规核查既有测试不回归 |
---
## 四、阶段总览
| 阶段 | 名称 | 目标 | 阶段验收 |
| --- | --- | --- | --- |
| AFF-0 | 准备与回归 | 创建开发分支,确认现有测试基线 | `python manage.py check` 和关键回归测试通过 |
| AFF-1 | 数据模型与通用导出扩展 | 新增三张表,扩展 word/pdf 导出类型 | migration、模型测试通过 |
| AFF-2 | 模块骨架与模板配置 | 新建独立模块、YAML 配置和配置校验 | 模板配置测试通过 |
| AFF-3 | 触发与工作流骨架 | 对话触发、批次创建、节点事件和状态查询 | 可创建并运行空工作流 |
| AFF-4 | 模板选择与文件来源 | 复用最近汇总批次,支持指定/默认模板选择 | 模板选择和来源批次测试通过 |
| AFF-5 | 字段抽取与合并 | 规则/正则 + LLM 并行抽取、冲突归并和产物留底 | 字段抽取、冲突测试通过 |
| AFF-6 | Word 填充与追溯导出 | 注册证 Word 填充、冲突高亮、Excel/JSON 追溯 | 可下载 Word 和追溯清单 |
| AFF-7 | 飞书通知与对话摘要 | 生成助手摘要、下载链接和通知记录 | 通知、摘要、下载权限测试通过 |
| AFF-8 | 前端卡片与总体验收 | 自动填表工作流卡片、状态恢复、全量回归 | 全量测试通过 |
---
## 五、AFF-0 准备与回归
### AFF-0-001 创建开发分支并确认现状
| 项目 | 内容 |
| --- | --- |
| 任务类型 | Git / 准备 |
| 前置任务 | 无 |
| 涉及文件 | 无固定文件 |
| 目标 | 从当前稳定分支创建 `codex/YYYYMMDD-申报文件自动填表` 开发分支,并确认工作区状态 |
| 开发步骤 | 1. 检查当前分支和 `git status`2. 确认第三批设计文档存在3. 创建开发分支4. 记录已有未提交变更,不得回滚用户变更 |
| 验收标准 | 分支创建成功,工作区变更来源清楚 |
| 验证命令 | `git branch --show-current`; `git status --short` |
| Codex 执行提示 | 请创建第三批自动填表开发分支,检查当前工作区状态和设计文档,不要回滚用户已有变更。 |
### AFF-0-002 运行基线回归
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 测试 / 回归 |
| 前置任务 | AFF-0-001 |
| 涉及文件 | 无固定文件 |
| 目标 | 确认现有文件汇总和法规核查主流程在开发前可用 |
| 开发步骤 | 1. 运行 Django check2. 运行文件汇总测试3. 运行法规核查测试4. 记录失败项并先判断是否为既有问题 |
| 验收标准 | 关键回归测试通过,或记录清楚既有失败和本阶段处理策略 |
| 验证命令 | `python manage.py check`; `pytest tests/test_file_summary_*.py tests/test_regulatory_*.py` |
| Codex 执行提示 | 请在开发前运行 Django check 和文件汇总/法规核查关键测试,确认基线稳定。若存在既有失败,请记录,不要直接改无关代码。 |
---
## 六、AFF-1 数据模型与通用导出扩展
### AFF-1-001 新增自动填表 ORM 模型
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 数据库 / 后端 |
| 前置任务 | AFF-0 |
| 涉及文件 | `review_agent/models.py` |
| 目标 | 新增 `ApplicationFormFillBatch``ApplicationFormFillArtifact``ApplicationFormFillNotificationRecord` |
| 开发步骤 | 1. 定义批次状态枚举2. 定义产物类型枚举3. 定义通知状态和渠道枚举4. 添加外键到 Conversation、User、Message、FileSummaryBatch、RegulatoryReviewBatch5. 添加 JSONField、hash、路径、时间字段6. 添加 `db_table`、索引和唯一约束 |
| 验收标准 | 模型字段、表名、索引与数据库设计一致 |
| 验证命令 | `python manage.py check` |
| Codex 执行提示 | 请按 `docs/4.数据库设计/3.产品关键信息提取与申报文件自动填表.md` 新增自动填表三张表模型,模型集中放在 `review_agent/models.py`。 |
### AFF-1-002 扩展导出类型和权限查询能力
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 数据库 / 下载 |
| 前置任务 | AFF-1-001 |
| 涉及文件 | `review_agent/models.py`、导出下载权限相关视图 |
| 目标 | 为 `ExportedSummaryFile.ExportType` 增加 `word``pdf`,并确保下载权限支持 `application_form_fill` |
| 开发步骤 | 1. 扩展 `ExportType.WORD`2. 扩展 `ExportType.PDF`3. 检查下载接口按 workflow_type 分派权限4. 增加 application_form_fill 反查批次的权限路径 |
| 验收标准 | Word/ PDF 导出记录可创建;填表导出下载权限可追溯到当前用户 |
| 验证命令 | `python manage.py check`; `pytest tests/test_file_summary_views.py -k download` |
| Codex 执行提示 | 请扩展 ExportedSummaryFile 支持 word/pdf并让现有下载接口能通过 workflow_type=application_form_fill 校验填表批次权限。 |
### AFF-1-003 生成迁移并补模型测试
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 数据库 / 测试 |
| 前置任务 | AFF-1-002 |
| 涉及文件 | `review_agent/migrations/``tests/test_application_form_fill_models.py` |
| 目标 | 生成迁移并覆盖新增表的基础约束和权限关系 |
| 开发步骤 | 1. 运行 makemigrations2. 检查 migration 只包含第三批相关变更3. 运行 migrate4. 测试批次创建5. 测试产物 hash 字段6. 测试通知重试字段7. 测试 ExportedSummaryFile word 类型 |
| 验收标准 | migration 可执行,模型测试通过 |
| 验证命令 | `python manage.py makemigrations review_agent`; `python manage.py migrate`; `pytest tests/test_application_form_fill_models.py` |
| Codex 执行提示 | 请为第三批模型生成迁移并新增模型测试,覆盖批次、产物、通知记录和 word/pdf 导出类型。 |
### AFF-1 阶段验证
```bash
python manage.py check
pytest tests/test_application_form_fill_models.py tests/test_file_summary_views.py -k download
```
---
## 七、AFF-2 模块骨架与模板配置
### AFF-2-001 创建 application_form_fill 模块骨架
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 模块 |
| 前置任务 | AFF-1 |
| 涉及文件 | `review_agent/application_form_fill/` |
| 目标 | 建立独立模块目录、常量、schemas、storage、workflow、views 和 services 包 |
| 开发步骤 | 1. 创建模块目录2. 创建 `constants.py`3. 创建 `schemas.py`4. 创建 `storage.py`5. 创建 `workflow.py`6. 创建 `views.py`7. 创建 services 子模块8. 创建 templates 和 prompts 目录 |
| 验收标准 | 模块可 import不影响既有应用启动 |
| 验证命令 | `python manage.py check` |
| Codex 执行提示 | 请新增 `review_agent/application_form_fill/` 独立模块骨架先只放常量、schema、空服务和基础 import不要改动法规核查模块。 |
### AFF-2-002 编写模板配置 YAML
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 配置 / 模板 |
| 前置任务 | AFF-2-001 |
| 涉及文件 | `review_agent/application_form_fill/templates/application_form_templates_v1.yaml` |
| 目标 | 建立模板配置,至少覆盖注册证 `.docx` 已识别字段 |
| 开发步骤 | 1. 定义 version2. 定义 source_dir3. 配置 `registration_certificate`4. 配置 `change_registration``.doc` 待转换模板5. 配置 `essential_principles``.doc` 待转换模板6. 为注册证配置注册人名称、注册人住所、生产地址、产品名称、包装规格、主要组成成分、预期用途、储存条件及有效期、附件等字段 |
| 验收标准 | YAML 可解析,注册证字段映射到 table_row |
| 验证命令 | `pytest tests/test_application_form_fill_template_config.py` |
| Codex 执行提示 | 请新增自动填表模板配置 YAML配置路径必须是 `review_agent/application_form_fill/templates/application_form_templates_v1.yaml`,先完整录入注册证表格字段。 |
### AFF-2-003 实现模板配置加载与校验
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 配置 |
| 前置任务 | AFF-2-002 |
| 涉及文件 | `review_agent/application_form_fill/services/template_config.py``tests/test_application_form_fill_template_config.py` |
| 目标 | 读取、校验模板配置并计算 hash |
| 开发步骤 | 1. 实现 `load_template_config()`2. 实现 `validate_template_config()`3. 实现 `compute_config_hash()`4. 校验 version、source_dir、templates、code 唯一、source_file 存在、target.type 支持5. 对 `.doc` 待转换模板允许配置存在但标记运行时处理 |
| 验收标准 | 有效配置通过,缺失 source_dir 或重复 code 能被测试捕获 |
| 验证命令 | `pytest tests/test_application_form_fill_template_config.py` |
| Codex 执行提示 | 请实现模板配置加载和校验服务,配置错误必须返回清晰错误列表,不要在 import 时直接崩溃。 |
### AFF-2 阶段验证
```bash
python manage.py check
pytest tests/test_application_form_fill_template_config.py
```
---
## 八、AFF-3 触发与工作流骨架
### AFF-3-001 扩展意图路由
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 意图识别 |
| 前置任务 | AFF-2 |
| 涉及文件 | `review_agent/skill_router.py``review_agent/application_form_fill/constants.py``tests/test_application_form_fill_trigger.py` |
| 目标 | 用户话语命中自动填表意图时返回 `application_form_fill` |
| 开发步骤 | 1. 增加触发关键词2. 支持“帮我填注册证”“对应的表格”“生成申报模板”等3. 支持指定模板识别入口4. 保持文件汇总和法规核查路由不回归 |
| 验收标准 | 自动填表语句触发正确,普通对话不误触发 |
| 验证命令 | `pytest tests/test_application_form_fill_trigger.py tests/test_regulatory_workflow.py -k router` |
| Codex 执行提示 | 请扩展现有意图路由,新增 application_form_fill 动作。不要破坏 file_summary 和 regulatory_review 的现有触发。 |
### AFF-3-002 实现批次创建和节点初始化
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 工作流 |
| 前置任务 | AFF-3-001 |
| 涉及文件 | `review_agent/application_form_fill/workflow.py``review_agent/application_form_fill/storage.py``tests/test_application_form_fill_workflow.py` |
| 目标 | 创建填表批次、生成工作目录、初始化节点 |
| 开发步骤 | 1. 实现 `build_batch_no()`2. 实现 `build_batch_work_dir()`3. 实现 `create_application_form_fill_batch()`4. 绑定 conversation、user、trigger_message、source_summary_batch5. 初始化 `FORM_FILL_NODE_DEFINITIONS` 节点6. 写 workflow_created 事件 |
| 验收标准 | 批次编号唯一,节点数量正确,工作目录在受控路径 |
| 验证命令 | `pytest tests/test_application_form_fill_workflow.py -k create` |
| Codex 执行提示 | 请实现自动填表批次创建和节点初始化workflow_type 必须写 application_form_fill。 |
### AFF-3-003 实现工作流执行器骨架
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 工作流 |
| 前置任务 | AFF-3-002 |
| 涉及文件 | `review_agent/application_form_fill/workflow.py``tests/test_application_form_fill_workflow.py` |
| 目标 | 实现节点串行执行、状态更新、事件推送和 skipped PDF 节点 |
| 开发步骤 | 1. 实现 `FormFillWorkflowExecutor.run()`2. 实现 `_nodes()`3. 实现 `_run_node()`4. 每个节点写 running/success/skipped5. `pdf_convert` 本期标记 skipped6. 失败时写 batch.failed |
| 验收标准 | 空实现节点可完整跑到 successPDF 节点 skipped |
| 验证命令 | `pytest tests/test_application_form_fill_workflow.py -k executor` |
| Codex 执行提示 | 请实现自动填表工作流执行器骨架先让节点状态可完整流转PDF 转换节点本期标记 skipped。 |
### AFF-3-004 接入流式对话启动逻辑
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 对话 |
| 前置任务 | AFF-3-003 |
| 涉及文件 | `review_agent/services.py``review_agent/application_form_fill/views.py` |
| 目标 | 用户触发自动填表时启动工作流;有附件时先自动汇总,无附件时使用最近成功汇总批次 |
| 开发步骤 | 1. 在 stream_message 中处理 application_form_fill 路由2. 如本次存在新附件复用文件汇总启动逻辑3. 无新附件时查找最近成功 `FileSummaryBatch`4. 无来源批次时回复请上传资料5. 返回 workflow meta |
| 验收标准 | 对话触发能创建填表批次;无汇总批次时不崩溃 |
| 验证命令 | `pytest tests/test_application_form_fill_workflow.py -k stream` |
| Codex 执行提示 | 请把 application_form_fill 接入现有 stream_message。无附件时复用最近成功汇总批次有新附件时先自动汇总。 |
### AFF-3 阶段验证
```bash
python manage.py check
pytest tests/test_application_form_fill_trigger.py tests/test_application_form_fill_workflow.py
```
---
## 九、AFF-4 模板选择与文件来源
### AFF-4-001 实现模板指定解析
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 模板选择 |
| 前置任务 | AFF-3 |
| 涉及文件 | `review_agent/application_form_fill/services/template_select.py``tests/test_application_form_fill_template_select.py` |
| 目标 | 从用户话语中识别指定模板 |
| 开发步骤 | 1. 识别注册证2. 识别变更注册备案文件3. 识别安全和性能基本原则清单4. 识别全部模板5. 未指定返回空数组 |
| 验收标准 | 指定模板语句可返回正确 template_codes |
| 验证命令 | `pytest tests/test_application_form_fill_template_select.py -k requested` |
| Codex 执行提示 | 请实现用户指定模板解析,支持注册证、变更注册备案文件、安全和性能基本原则清单、全部模板。 |
### AFF-4-002 实现注册类型识别和模板选择
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 模板选择 |
| 前置任务 | AFF-4-001 |
| 涉及文件 | `review_agent/application_form_fill/services/template_select.py``tests/test_application_form_fill_template_select.py` |
| 目标 | 按用户话语、法规确认条件、文件抽取识别注册类型,并选择模板 |
| 开发步骤 | 1. 用户话语识别首次注册、变更注册、备案2. 从 `source_regulatory_batch.condition_json` 读取 confirmed_conditions3. 从文件抽取候选读取 registration_type4. 未指定模板时首次注册生成注册证 + 基本原则清单5. 变更/备案生成变更文件 + 基本原则清单6. 指定不适用模板允许生成但写 risk_notes |
| 验收标准 | 模板选择规则与功能设计一致 |
| 验证命令 | `pytest tests/test_application_form_fill_template_select.py` |
| Codex 执行提示 | 请实现注册类型识别和默认模板选择优先级是用户话语、已确认法规核查条件、文件抽取、unknown。 |
### AFF-4-003 实现模板复制服务
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 模板 |
| 前置任务 | AFF-4-002 |
| 涉及文件 | `review_agent/application_form_fill/services/template_repository.py``review_agent/application_form_fill/storage.py``tests/test_application_form_fill_template_repository.py` |
| 目标 | 将原始模板复制到批次目录,原始模板只读 |
| 开发步骤 | 1. 根据 TemplateSpec 定位 source_file2. 复制到 `work_dir/templates`3. 记录 ApplicationFormFillArtifact(template_copy)4. `.doc` 且无工作模板时返回模板失败不影响其他模板5. 路径必须在受控工作目录内 |
| 验收标准 | 注册证 `.docx` 可复制;原始文件不被修改;产物 hash 写入 |
| 验证命令 | `pytest tests/test_application_form_fill_template_repository.py` |
| Codex 执行提示 | 请实现模板复制服务,只允许复制到批次工作目录,不能直接写原始法规材料目录。 |
### AFF-4 阶段验证
```bash
pytest tests/test_application_form_fill_template_select.py tests/test_application_form_fill_template_repository.py
```
---
## 十、AFF-5 字段抽取与合并
### AFF-5-001 实现规则/正则字段抽取
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 字段抽取 |
| 前置任务 | AFF-4 |
| 涉及文件 | `review_agent/application_form_fill/services/field_extract.py``tests/test_application_form_fill_field_extract.py` |
| 目标 | 从说明书、产品技术要求等文本中按标签和章节抽取字段 |
| 开发步骤 | 1. 复用 `regulatory_review.services.text_extract.extract_text`2. 识别文件角色3. 匹配 `字段名:值` 标签行4. 支持多行值拼接5. 保存 source_file、source_role、evidence、confidence、extractor=rule |
| 验收标准 | 能从测试说明书文本抽取产品名称、预期用途、储存条件、有效期、包装规格 |
| 验证命令 | `pytest tests/test_application_form_fill_field_extract.py -k rules` |
| Codex 执行提示 | 请实现自动填表规则/正则字段抽取,优先覆盖注册证模板字段,抽取结果必须包含来源文件、来源角色和证据片段。 |
### AFF-5-002 实现 LLM 结构化抽取封装
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / LLM |
| 前置任务 | AFF-5-001 |
| 涉及文件 | `review_agent/application_form_fill/services/field_extract.py``review_agent/application_form_fill/prompts/field_extract.md``tests/test_application_form_fill_field_extract.py` |
| 目标 | 调用现有 LLM 能力输出字段 JSON失败时降级 |
| 开发步骤 | 1. 编写字段抽取 prompt2. 输入模板字段、文件上下文和候选文本3. 要求输出 JSON fields/checklist_items4. 解析 JSON5. 捕获超时和解析失败6. 失败返回空 LLM 结果,不阻断规则抽取 |
| 验收标准 | monkeypatch LLM 后可解析结构化字段LLM 异常时工作流继续 |
| 验证命令 | `pytest tests/test_application_form_fill_field_extract.py -k llm` |
| Codex 执行提示 | 请实现 LLM 结构化抽取封装必须可测试、可降级。LLM 输出解析失败不能导致整个填表批次失败。 |
### AFF-5-003 实现并行抽取和产物留底
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 字段抽取 |
| 前置任务 | AFF-5-002 |
| 涉及文件 | `review_agent/application_form_fill/services/field_extract.py``review_agent/application_form_fill/storage.py` |
| 目标 | 并行执行规则/正则和 LLM 抽取,并保存 `field_extract_result.json` |
| 开发步骤 | 1. 使用 ThreadPoolExecutor2. 规则和 LLM 两路并行3. 组装 regex_results、llm_results、selected_templates、source_evidence4. 保存 JSON5. 写 ApplicationFormFillArtifact(field_extract_result) |
| 验收标准 | JSON 产物包含两路结果和模板列表 |
| 验证命令 | `pytest tests/test_application_form_fill_field_extract.py -k parallel` |
| Codex 执行提示 | 请实现字段并行抽取和 field_extract_result.json 产物留底LLM 失败时也必须保存规则结果。 |
### AFF-5-004 实现字段合并与冲突检测
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 字段合并 |
| 前置任务 | AFF-5-003 |
| 涉及文件 | `review_agent/application_form_fill/services/field_merge.py``tests/test_application_form_fill_field_merge.py` |
| 目标 | 合并规则和 LLM 字段,说明书优先,并生成冲突摘要 |
| 开发步骤 | 1. 实现字段值归一化2. 实现来源优先级排序3. 同字段多值一致时合并4. 不一致时选择最高优先级来源5. 说明书与其他文件冲突时标记 conflict6. 输出 merged_fields 和 conflicts |
| 验收标准 | 说明书优先;冲突字段包含 selected_value、selected_source、conflict_values、handling |
| 验证命令 | `pytest tests/test_application_form_fill_field_merge.py` |
| Codex 执行提示 | 请实现字段合并服务,严格按说明书优先处理冲突,并把冲突列表写成可用于对话摘要和追溯清单的结构。 |
### AFF-5 阶段验证
```bash
pytest tests/test_application_form_fill_field_extract.py tests/test_application_form_fill_field_merge.py
```
---
## 十一、AFF-6 Word 填充与追溯导出
### AFF-6-001 实现 Word 表格行填充
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / Word |
| 前置任务 | AFF-5 |
| 涉及文件 | `review_agent/application_form_fill/services/word_fill.py``tests/test_application_form_fill_word_fill.py` |
| 目标 | 使用 `python-docx` 按表格行名写入注册证模板 |
| 开发步骤 | 1. 打开 docx 模板副本2. 遍历 tables/rows/cells3. 匹配第一列 row_label4. 写入第二列5. 缺失字段保持空白6. 保存 output_path |
| 验收标准 | 产品名称、包装规格、预期用途等能写入注册证模板对应行 |
| 验证命令 | `pytest tests/test_application_form_fill_word_fill.py -k table` |
| Codex 执行提示 | 请实现 Word 表格行填充服务,先支持注册证模板的两列表格行名匹配。 |
### AFF-6-002 实现冲突高亮
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / Word |
| 前置任务 | AFF-6-001 |
| 涉及文件 | `review_agent/application_form_fill/services/word_fill.py``tests/test_application_form_fill_word_fill.py` |
| 目标 | 冲突字段在 Word 中黄底红字 |
| 开发步骤 | 1. 对冲突字段写入 run2. 设置字体颜色 `FF0000`3. 设置单元格 shading `FFFF00`4. 非冲突字段保持原样式5. 测试读取 docx XML 验证颜色和底色 |
| 验收标准 | 冲突字段样式可在 docx XML 中验证 |
| 验证命令 | `pytest tests/test_application_form_fill_word_fill.py -k highlight` |
| Codex 执行提示 | 请实现 Word 冲突高亮,冲突字段必须红色字体和黄色底色,测试需检查 docx XML。 |
### AFF-6-003 创建 Word 导出记录
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 导出 |
| 前置任务 | AFF-6-002 |
| 涉及文件 | `review_agent/application_form_fill/services/word_fill.py``review_agent/application_form_fill/workflow.py` |
| 目标 | Word 生成后写入 `ExportedSummaryFile(export_type=word)` 和产物记录 |
| 开发步骤 | 1. 按批次号、产品名、模板标签生成文件名2. 保存到 `work_dir/filled`3. 创建 `ApplicationFormFillArtifact(filled_template)`4. 创建 `ExportedSummaryFile`5. 记录模板失败时错误 |
| 验收标准 | 可查询到 word 导出记录和 filled_template 产物 |
| 验证命令 | `pytest tests/test_application_form_fill_word_fill.py -k export` |
| Codex 执行提示 | 请把 Word 填充结果保存为导出文件export_type 使用 wordworkflow_type 使用 application_form_fill。 |
### AFF-6-004 实现追溯清单 Excel/JSON
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 导出 |
| 前置任务 | AFF-6-003 |
| 涉及文件 | `review_agent/application_form_fill/services/traceability_export.py``tests/test_application_form_fill_traceability.py` |
| 目标 | 输出字段来源追溯清单和合并结果 JSON |
| 开发步骤 | 1. 生成“字段追溯”Sheet2. 生成“冲突字段”Sheet3. 生成“低置信度条目”Sheet4. 生成“生成结果”Sheet5. 保存 Excel6. 保存 merged_fields.json7. 创建导出和产物记录 |
| 验收标准 | Excel 可打开,包含字段、来源、证据、冲突、处理方式 |
| 验证命令 | `pytest tests/test_application_form_fill_traceability.py` |
| Codex 执行提示 | 请实现字段来源追溯清单导出,必须包含规则/LLM 合并结果、冲突字段和生成结果。 |
### AFF-6 阶段验证
```bash
pytest tests/test_application_form_fill_word_fill.py tests/test_application_form_fill_traceability.py
```
---
## 十二、AFF-7 飞书通知与对话摘要
### AFF-7-001 生成助手 Markdown 摘要
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 对话 |
| 前置任务 | AFF-6 |
| 涉及文件 | `review_agent/application_form_fill/services/traceability_export.py``review_agent/application_form_fill/workflow.py` |
| 目标 | 工作流完成后向当前对话写入下载链接和冲突摘要 |
| 开发步骤 | 1. 汇总 Word 导出2. 汇总 PDF 状态为待增强3. 汇总冲突字段4. 添加追溯清单下载链接5. 创建 assistant Message |
| 验收标准 | 对话中出现 Markdown 表格、Word 下载、追溯清单下载和冲突摘要 |
| 验证命令 | `pytest tests/test_application_form_fill_workflow.py -k summary` |
| Codex 执行提示 | 请实现自动填表完成后的助手 Markdown 摘要PDF 本期显示为待增强,不作为失败。 |
### AFF-7-002 实现飞书通知记录和 mock 通知
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 通知 |
| 前置任务 | AFF-7-001 |
| 涉及文件 | `review_agent/application_form_fill/services/notifier.py``tests/test_application_form_fill_notification.py` |
| 目标 | 填表完成后记录通知,可 mock 发送,失败不阻断下载 |
| 开发步骤 | 1. 实现 `notify_completion()`2. 默认 channel=mock3. 写 template_codes、export_ids、message_summary4. 支持 send_status success/failed5. 失败时记录 error_message 和 retry_count |
| 验收标准 | 通知记录可查;通知失败不影响批次核心产物 |
| 验证命令 | `pytest tests/test_application_form_fill_notification.py` |
| Codex 执行提示 | 请实现自动填表通知服务,先用 mock 通知记录即可。通知失败不得阻断 Word 下载。 |
### AFF-7-003 完成工作流状态归并
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 工作流 |
| 前置任务 | AFF-7-002 |
| 涉及文件 | `review_agent/application_form_fill/workflow.py``tests/test_application_form_fill_workflow.py` |
| 目标 | 根据 Word、追溯清单、通知结果标记 success/partial_success/failed |
| 开发步骤 | 1. 所有目标 Word 成功时 success2. 至少一个 Word 成功但非关键产物失败时 partial_success3. 所有 Word 失败时 failed4. PDF skipped 不导致失败5. 发送 workflow_completed 事件 |
| 验收标准 | 批次状态符合详细设计 |
| 验证命令 | `pytest tests/test_application_form_fill_workflow.py -k status` |
| Codex 执行提示 | 请完成自动填表工作流状态归并PDF skipped 不影响 success通知失败最多导致 partial_success。 |
### AFF-7 阶段验证
```bash
pytest tests/test_application_form_fill_workflow.py tests/test_application_form_fill_notification.py
```
---
## 十三、AFF-8 前端卡片与总体验收
### AFF-8-001 后端状态接口
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 后端 / 接口 |
| 前置任务 | AFF-7 |
| 涉及文件 | `review_agent/application_form_fill/views.py``review_agent/urls.py` 或相关 URL 文件 |
| 目标 | 提供自动填表启动和状态查询接口 |
| 开发步骤 | 1. 新增 start 接口2. 新增 detail/status 接口3. 返回 batch、nodes、conflicts、exports4. 校验 conversation/user 权限5. 接入 URL |
| 验收标准 | 当前用户可查自己的填表批次,不能查他人批次 |
| 验证命令 | `pytest tests/test_application_form_fill_views.py` |
| Codex 执行提示 | 请实现自动填表启动和状态查询接口,所有查询必须校验当前用户权限。 |
### AFF-8-002 前端支持 application_form_fill 卡片
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 前端 / 工作流卡片 |
| 前置任务 | AFF-8-001 |
| 涉及文件 | `static/js/app.js``templates/home.html`、静态 CSS 文件 |
| 目标 | 前端展示自动填表工作流卡片,并根据 SSE 更新节点 |
| 开发步骤 | 1. 解析 workflow_type=application_form_fill2. 定义节点文案3. 创建卡片4. 更新节点状态5. PDF 节点显示待增强/跳过6. 页面刷新后恢复 |
| 验收标准 | 自动填表卡片可显示准备资料、选择模板、复制模板、抽取字段、填写 Word、追溯清单、飞书通知 |
| 验证命令 | `pytest tests/test_application_form_fill_frontend.py` 或现有前端测试命令 |
| Codex 执行提示 | 请在现有工作流卡片逻辑中新增 application_form_fill 类型,展示自动填表节点并支持状态恢复。 |
### AFF-8-003 前端展示结果和下载链接
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 前端 / Markdown |
| 前置任务 | AFF-8-002 |
| 涉及文件 | `static/js/app.js`、模板和 CSS |
| 目标 | 对话框正常展示 Word 下载、追溯清单、冲突摘要 |
| 开发步骤 | 1. 确认助手 Markdown 渲染支持表格2. 验证 Word 下载链接点击3. 验证冲突摘要表格4. PDF 列显示待增强 |
| 验收标准 | 对话结果可读、链接可用、PDF 待增强不被误判为失败 |
| 验证命令 | 前端/Playwright 对应测试 |
| Codex 执行提示 | 请验证并完善自动填表结果展示,确保 Markdown 表格、Word 下载链接、追溯清单链接和冲突摘要正常显示。 |
### AFF-8-004 总体验收与回归
| 项目 | 内容 |
| --- | --- |
| 任务类型 | 验收 / 回归 |
| 前置任务 | AFF-8-003 |
| 涉及文件 | 全项目 |
| 目标 | 运行全量测试,确认前三批能力均不回归 |
| 开发步骤 | 1. 运行 Django check2. 运行自动填表测试3. 运行文件汇总测试4. 运行法规核查测试5. 如可用,运行前端/Playwright 测试6. 检查 git status |
| 验收标准 | 全量测试通过;失败项均有解释;无意外文件变更 |
| 验证命令 | `python manage.py check`; `pytest` |
| Codex 执行提示 | 请执行第三批自动填表总体验收,运行 Django check 和 pytest 全量回归,确认文件汇总与法规核查不回归。 |
### AFF-8 阶段验证
```bash
python manage.py check
pytest
```
---
## 十四、测试分层要求
| 层级 | 验证内容 | 建议文件 |
| --- | --- | --- |
| 模型测试 | 三张新表、word/pdf 导出类型、权限关系 | `tests/test_application_form_fill_models.py` |
| 配置测试 | YAML 加载、模板配置校验、hash | `tests/test_application_form_fill_template_config.py` |
| 选择测试 | 触发语句、指定模板、注册类型优先级、默认模板 | `tests/test_application_form_fill_template_select.py` |
| 抽取测试 | 规则/正则、LLM 降级、并行抽取、字段合并 | `tests/test_application_form_fill_field_extract.py``tests/test_application_form_fill_field_merge.py` |
| Word 测试 | 表格行填充、冲突高亮、导出记录 | `tests/test_application_form_fill_word_fill.py` |
| 导出测试 | 追溯清单 Excel、JSON 产物、下载权限 | `tests/test_application_form_fill_traceability.py``tests/test_application_form_fill_views.py` |
| 工作流测试 | 批次创建、节点流转、状态归并、助手摘要 | `tests/test_application_form_fill_workflow.py` |
| 通知测试 | mock 通知、失败记录、重试字段 | `tests/test_application_form_fill_notification.py` |
| 前端测试 | 卡片节点、PDF 待增强、下载链接、冲突摘要 | `tests/test_application_form_fill_frontend.py` |
---
## 十五、Codex 自动化执行规则
| 规则 | 内容 |
| --- | --- |
| 顺序执行 | 必须从 AFF-0 到 AFF-8 顺序执行,不得跳阶段 |
| TDD | 新行为先写失败测试,再实现 |
| 当前阶段优先 | 某阶段失败时先修复当前阶段,不继续后续阶段 |
| 回归保护 | 文件汇总和法规核查已有测试不得回归 |
| PDF 边界 | PDF 节点本期可 skipped不为 PDF 引入强依赖 |
| 字段表边界 | 不新增字段级数据库表,后续增强已在待办计划 |
| 每阶段验证 | 每阶段完成后运行对应验证命令 |
| 每阶段提交 | 每阶段验证通过后生成提交摘要并本地提交 |
| 不覆盖变更 | 不得回滚或覆盖用户已有未提交变更 |
---
## 十六、推荐目标模式提示词
后续可直接对 Codex 输入:
```text
请按 docs/5.开发计划/3.产品关键信息提取与申报文件自动填表.md 执行第三批开发。
目标:
完成独立 application_form_fill 工作流,通过用户对话触发自动填表,复用当前对话最近成功 FileSummaryBatch支持模板配置、注册证 Word 自动填写、规则/正则与 LLM 并行字段抽取、说明书优先冲突归并、冲突高亮、字段来源追溯清单、Word 下载、自动填表工作流卡片和飞书 mock 通知记录。
执行规则:
1. 创建 codex/YYYYMMDD-申报文件自动填表 分支。
2. 按 AFF-0 到 AFF-8 顺序执行,不跳阶段。
3. 每阶段先写测试,再实现,完成后运行对应验证命令。
4. 不实现字段级数据库表。
5. PDF 转换本期作为 skipped/待增强,不引入强制 LibreOffice 依赖。
6. 模板配置路径必须为 review_agent/application_form_fill/templates/application_form_templates_v1.yaml。
7. Word 模板优先支持注册证格式 docx两个 doc 模板可标记待转换或部分成功。
8. 每阶段验证通过后调用 git-commit-summary 生成提交摘要并本地提交。
9. 最后运行 python manage.py check 和 pytest 全量验收。
```
---
## 十七、待执行前检查清单
| 检查项 | 状态 |
| --- | --- |
| 第三批需求分析、功能设计、详细设计、数据库设计均已存在 | 待执行时确认 |
| 当前分支是否适合创建开发分支 | 待执行时确认 |
| 是否存在用户未提交变更 | 待执行时确认 |
| `python-docx``openpyxl``PyYAML` 是否可用 | 待执行时确认 |
| 现有文件汇总和法规核查测试是否通过 | 待执行时确认 |
| 执行机器是否提供 `git-commit-summary` skill | 待执行时确认 |
| `.doc` 模板和 PDF 转换是否保持在待办边界内 | 待执行时确认 |