Files
DEMO-AGENT/docs/5.开发计划/3.产品关键信息提取与申报文件自动填表.md

633 lines
37 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 产品关键信息提取与申报文件自动填表开发计划
## 文档信息
| 项目 | 内容 |
| --- | --- |
| 需求分析文档 | 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 转换是否保持在待办边界内 | 待执行时确认 |