# 产品关键信息提取与申报文件自动填表开发计划 ## 文档信息 | 项目 | 内容 | | --- | --- | | 需求分析文档 | 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 check;2. 运行文件汇总测试;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、RegulatoryReviewBatch;5. 添加 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. 运行 makemigrations;2. 检查 migration 只包含第三批相关变更;3. 运行 migrate;4. 测试批次创建;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. 定义 version;2. 定义 source_dir;3. 配置 `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_batch;5. 初始化 `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/skipped;5. `pdf_convert` 本期标记 skipped;6. 失败时写 batch.failed | | 验收标准 | 空实现节点可完整跑到 success;PDF 节点 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_conditions;3. 从文件抽取候选读取 registration_type;4. 未指定模板时首次注册生成注册证 + 基本原则清单;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_file;2. 复制到 `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. 编写字段抽取 prompt;2. 输入模板字段、文件上下文和候选文本;3. 要求输出 JSON fields/checklist_items;4. 解析 JSON;5. 捕获超时和解析失败;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. 使用 ThreadPoolExecutor;2. 规则和 LLM 两路并行;3. 组装 regex_results、llm_results、selected_templates、source_evidence;4. 保存 JSON;5. 写 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. 说明书与其他文件冲突时标记 conflict;6. 输出 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/cells;3. 匹配第一列 row_label;4. 写入第二列;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. 对冲突字段写入 run;2. 设置字体颜色 `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 使用 word,workflow_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. 生成“字段追溯”Sheet;2. 生成“冲突字段”Sheet;3. 生成“低置信度条目”Sheet;4. 生成“生成结果”Sheet;5. 保存 Excel;6. 保存 merged_fields.json;7. 创建导出和产物记录 | | 验收标准 | 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=mock;3. 写 template_codes、export_ids、message_summary;4. 支持 send_status success/failed;5. 失败时记录 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 成功时 success;2. 至少一个 Word 成功但非关键产物失败时 partial_success;3. 所有 Word 失败时 failed;4. 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、exports;4. 校验 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_fill;2. 定义节点文案;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 check;2. 运行自动填表测试;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 转换是否保持在待办边界内 | 待执行时确认 |