docs(regulatory-info-package): 补充第1章监管信息开发计划

This commit is contained in:
zhiye.sun
2026-06-10 14:59:24 +08:00
parent dce7045a46
commit db0e94cf26

View File

@@ -0,0 +1,609 @@
# 第1章监管信息材料包生成开发计划
## 文档信息
| 项目 | 内容 |
| --- | --- |
| 需求分析文档 | docs/1.需求分析/5.第1章监管信息材料包生成.md |
| 功能设计文档 | docs/2.功能设计/5.第1章监管信息材料包生成.md |
| 数据库设计文档 | docs/3.数据库设计/5.第1章监管信息材料包生成.md |
| 详细设计文档 | docs/4.详细设计/5.第1章监管信息材料包生成.md |
| 参考开发计划 | docs/5.开发计划/3.产品关键信息提取与申报文件自动填表.md |
| 功能名称 | 第1章监管信息材料包生成 |
| 工作流编码 | regulatory_info_package |
| 批次号规则 | RIP-YYYYMMDDHHMMSS-abcdef |
| 计划日期 | 2026-06-10 |
| 计划版本 | V1.0 |
---
## 一、开发计划目标
本开发计划面向 Codex 执行,目标是把 `regulatory_info_package` 独立工作流按可验证、可回滚、可阶段提交的方式落地。计划以现有自动填表工作流 `application_form_fill` 为主要参考,但保持独立模块、独立批次、独立产物、独立通知和独立前端卡片。
开发完成后用户可在对话中上传或指定产品说明书并通过“根据说明书生成第1章监管信息”触发工作流。系统基于 `docs/0.原始材料/第1章 监管信息` 样例模板生成 7 个监管信息文件,以 `第1章 监管信息(预生成版).zip` 作为首位下载入口,同时提供单文件和追溯 Excel 辅助下载。
---
## 二、已确认开发规则
| 规则 | 内容 |
| --- | --- |
| 工作流独立 | 新增 `workflow_type=regulatory_info_package`,不并入 `application_form_fill` |
| 模块独立 | 新增 `review_agent/regulatory_info_package/`,服务与自动填表平级 |
| 模型集中 | Django 模型继续放在 `review_agent/models.py` |
| 单说明书输入 | 用户消息指定文件名优先,其次 active 附件,再兼容最近成功文件汇总 |
| 多候选处理 | 不做选择弹窗,通过对话反问用户确认说明书文件名 |
| 模板固定 | 固定处理第1章监管信息 7 个模板 |
| 抽取策略 | 规则抽取和 LLM 抽取并行LLM 最多重试 3 次,失败后规则结果继续 |
| 文档生成 | 工作流节点串行,`generate_docs` 节点内部每个文档独立线程处理 |
| `.doc` 策略 | CH1.9 优先原生 `.doc` 写入,失败后允许 `.docx` 兜底 |
| zip 策略 | zip 只包含成功或兜底成功文件,失败文件不进入 zip |
| 高亮策略 | 缺失项 `/` 黄底LLM-only 黄底;冲突黄底红字 |
| 追溯策略 | 用户下载 ExcelJSON 只写后台 logs 目录 |
| 前端策略 | 只做最小接入,不单独建设新页面或独立样式体系 |
| TDD | 新行为先写失败测试,再实现 |
| Git 提交 | 每阶段验证通过后生成提交摘要并本地提交 |
| 用户变更保护 | 不回滚、不覆盖用户已有未提交变更 |
---
## 三、规范依据与裁决
| 规范来源 | 命中内容 | 本计划裁决 |
| --- | --- | --- |
| GYRX 后端开发规范 | 接口响应、日志、增量规范 | 状态接口、下载权限、异常降级和日志留痕按现有 Django 模式实现 |
| GYRX 前端开发规范 | 样式复用、组件接入、下载图标建议 | 复用现有对话页和工作流卡片样式,必要时只补少量语义化样式 |
| 既有自动填表开发计划 | 阶段拆分、测试先行、每阶段验证 | 本计划沿用阶段结构和 Codex 执行提示粒度 |
| 第1章监管信息详细设计 | 独立模块、7 模板、doc 兜底、zip 首位 | 作为本计划最高优先级依据 |
未发现规范冲突。项目专项设计优先于通用规范。
---
## 四、总体验收标准
| 类别 | 完成标准 |
| --- | --- |
| 触发 | 固定提示词和 LLM 路由均可触发 `regulatory_info_package` |
| 输入选择 | 能按用户指定文件名、active 附件、最近文件汇总选择说明书;多候选可反问 |
| 批次 | 能创建 `RegulatoryInfoPackageBatch`,节点和事件可查询 |
| 模板 | 能加载并校验 7 个模板配置,模板复制只写批次目录 |
| 抽取 | 规则抽取可独立跑通LLM 失败不阻断主链路 |
| 合并 | missing、llm_only、conflict 均有可追溯结构和高亮决策 |
| docx 生成 | 6 个 `.docx` 文件能按模板生成并保留基本版式 |
| doc 处理 | CH1.9 优先 `.doc` 原生处理,失败时 `.docx` 兜底,状态可见 |
| ZIP | `第1章 监管信息(预生成版).zip` 排在助手回显首位,只包含成功/兜底成功文件 |
| 单文件 | 成功文件有辅助下载,失败文件显示原因且无下载链接 |
| 追溯 | 用户可下载 `traceability.xlsx`JSON 写入 `logs/` |
| 前端 | 对话快捷入口、工作流卡片、状态轮询和下载列表正常 |
| 权限 | 非批次所属用户不能下载 RIP 产物 |
| 回归 | `python manage.py check` 和相关 pytest 通过,既有文件汇总/自动填表/法规核查不回归 |
---
## 五、阶段总览
| 阶段 | 名称 | 目标 | 阶段验收 |
| --- | --- | --- | --- |
| RIP-0 | 准备与基线回归 | 创建开发分支,确认依赖和既有测试状态 | 基线命令结果已记录 |
| RIP-1 | 数据模型与导出扩展 | 新增三张模型,扩展 zip 下载能力 | migration、模型和下载权限测试通过 |
| RIP-2 | 模块骨架与模板配置 | 新建模块、schema、YAML 配置和存储服务 | 配置加载和路径安全测试通过 |
| RIP-3 | 触发与工作流骨架 | 接入路由、批次创建、节点流转和状态接口 | 可创建并运行空工作流 |
| RIP-4 | 输入选择与说明书解析 | 选择说明书,解析 docx 段落、章节和表格 | 输入选择和说明书解析测试通过 |
| RIP-5 | 字段抽取与合并 | 规则 + LLM 并行抽取、重试、合并和高亮决策 | 抽取、重试、冲突合并测试通过 |
| RIP-6 | DOCX 文档生成 | 实现 6 个 docx 模板生成、产品列表重建和高亮 | docx 生成和 XML 高亮测试通过 |
| RIP-7 | CH1.9 DOC 适配 | 实现 `.doc` 原生适配探测和 `.docx` 兜底 | doc 兜底、失败隔离测试通过 |
| RIP-8 | 追溯、ZIP 与下载权限 | 生成 Excel、logs JSON、ZIP 和导出记录 | ZIP 内容、追溯、权限测试通过 |
| RIP-9 | 摘要、通知与状态归并 | 生成助手摘要,写通知记录,落定批次状态 | partial_success 等状态测试通过 |
| RIP-10 | 前端接入与总体验收 | 接入快捷入口、卡片、状态轮询和下载展示 | 前端回归和全量后端测试通过 |
---
## 六、RIP-0 准备与基线回归
### RIP-0-001 创建开发分支并确认工作区
| 项 | 内容 |
| --- | --- |
| 目标 | 创建本功能开发分支,确认当前工作区已有变更 |
| 修改范围 | Git 分支,不修改业务代码 |
| 验收标准 | 分支名符合 `codex/` 前缀;记录已有未提交变更,不回滚用户变更 |
| Codex 执行提示 | 请创建 `codex/regulatory-info-package` 开发分支,运行 `git status --short`,确认设计文档和目录重排状态,不要回滚无关变更。 |
### RIP-0-002 确认依赖与基线测试
| 项 | 内容 |
| --- | --- |
| 目标 | 确认 Django、python-docx、openpyxl、PyYAML、可选 Word COM 环境状态 |
| 修改范围 | 不修改业务代码 |
| 验收标准 | `python manage.py check` 可执行;关键依赖可 import既有失败需记录 |
| Codex 执行提示 | 请运行 Django check 和关键回归测试,确认依赖可用。若发现既有失败,只记录并继续按计划隔离,不改无关代码。 |
### RIP-0 阶段验证
```bash
python manage.py check
pytest tests/test_file_summary_views.py -k download
```
---
## 七、RIP-1 数据模型与导出扩展
### RIP-1-001 新增监管信息材料包 ORM 模型
| 项 | 内容 |
| --- | --- |
| 目标 | 新增 `RegulatoryInfoPackageBatch``RegulatoryInfoPackageArtifact``RegulatoryInfoPackageNotificationRecord` |
| 修改范围 | `review_agent/models.py` |
| 验收标准 | 字段、枚举、索引、软删除、关联关系符合数据库设计 |
| Codex 执行提示 | 请按 `docs/3.数据库设计/5.第1章监管信息材料包生成.md` 新增三张模型,模型集中放在 `review_agent/models.py`,不要新增字段级数据库表。 |
### RIP-1-002 扩展导出类型和下载 MIME
| 项 | 内容 |
| --- | --- |
| 目标 | `ExportedSummaryFile.ExportType` 增加 `zip`,下载 MIME 支持 `.zip``.doc``.docx` |
| 修改范围 | `review_agent/models.py``review_agent/file_summary/views.py` |
| 验收标准 | zip 可下载doc/docx MIME 正确;原有导出不回归 |
| Codex 执行提示 | 请扩展 `ExportedSummaryFile` 导出类型,并在下载接口按 workflow_type 和文件后缀处理权限与 content type。 |
### RIP-1-003 生成迁移并补模型测试
| 项 | 内容 |
| --- | --- |
| 目标 | 生成数据库迁移并覆盖基础模型行为 |
| 修改范围 | `review_agent/migrations/``tests/` |
| 验收标准 | migration 可应用模型测试覆盖批次号、状态、artifact、通知、zip export type |
| Codex 执行提示 | 请生成迁移并新增 `tests/test_regulatory_info_package_models.py`,优先覆盖模型字段默认值和导出类型。 |
### RIP-1 阶段验证
```bash
python manage.py check
pytest tests/test_regulatory_info_package_models.py tests/test_file_summary_views.py -k download
```
---
## 八、RIP-2 模块骨架与模板配置
### RIP-2-001 创建 regulatory_info_package 模块骨架
| 项 | 内容 |
| --- | --- |
| 目标 | 新增独立模块目录和基础文件 |
| 修改范围 | `review_agent/regulatory_info_package/` |
| 验收标准 | 模块可 import不影响现有 `application_form_fill` |
| Codex 执行提示 | 请创建详细设计中的模块骨架先放常量、schema、storage、events、workflow 空实现和 service 包,不提前写复杂业务。 |
### RIP-2-002 编写模板配置 YAML
| 项 | 内容 |
| --- | --- |
| 目标 | 配置 7 个样例模板、输出文件名、策略和 `.doc` 标记 |
| 修改范围 | `review_agent/regulatory_info_package/templates/regulatory_info_package_templates_v1.yaml` |
| 验收标准 | 7 个模板完整zip 名称为 `第1章 监管信息(预生成版).zip` |
| Codex 执行提示 | 请按详细设计录入模板配置source_dir 指向样例目录CH1.9 必须声明 `require_legacy_doc_native: true`。 |
### RIP-2-003 实现配置加载、模板仓库和存储目录
| 项 | 内容 |
| --- | --- |
| 目标 | 实现 YAML 加载校验、模板复制、批次目录创建、路径安全检查 |
| 修改范围 | `template_config.py``template_repository.py``storage.py` |
| 验收标准 | 配置错误可返回清晰错误;模板只复制到批次目录;不写原始材料目录 |
| Codex 执行提示 | 请实现配置加载和模板复制服务,所有路径必须校验位于批次工作目录内,原始模板目录只读。 |
### RIP-2 阶段验证
```bash
python manage.py check
pytest tests/test_regulatory_info_package_template_config.py
```
---
## 九、RIP-3 触发与工作流骨架
### RIP-3-001 扩展意图路由
| 项 | 内容 |
| --- | --- |
| 目标 | 新增 `regulatory_info_package` action支持固定关键词和 LLM 路由 |
| 修改范围 | `review_agent/skill_router.py` |
| 验收标准 | 固定提示词直接命中LLM action 列表包含本工作流;原路由不回归 |
| Codex 执行提示 | 请扩展意图路由,新增 `starts_regulatory_info_package` 标记,避免破坏 file_summary、regulatory_review 和 application_form_fill。 |
### RIP-3-002 实现批次创建和节点初始化
| 项 | 内容 |
| --- | --- |
| 目标 | 创建批次、生成节点、记录事件 |
| 修改范围 | `workflow.py``events.py``constants.py` |
| 验收标准 | 可创建 `RIP-...` 批次;节点按定义初始化;事件可查询 |
| Codex 执行提示 | 请实现批次创建和节点初始化workflow_type 必须写 `regulatory_info_package`。 |
### RIP-3-003 实现执行器骨架和状态接口
| 项 | 内容 |
| --- | --- |
| 目标 | 工作流节点可完整流转status 接口可返回批次、节点、导出和风险信息 |
| 修改范围 | `workflow.py``views.py``urls.py` 或现有 URL 注册文件 |
| 验收标准 | 空工作流可从 pending 到 completed状态接口校验用户权限 |
| Codex 执行提示 | 请先实现可运行的空工作流骨架,业务节点可以临时 no-op但状态流转和权限必须真实。 |
### RIP-3-004 接入对话启动逻辑
| 项 | 内容 |
| --- | --- |
| 目标 | `stream_message` 能启动本工作流或返回说明书反问 |
| 修改范围 | `review_agent/services.py` |
| 验收标准 | 触发后发送 `workflow_started`;无输入或多候选时不误启动 |
| Codex 执行提示 | 请在 `stream_message` 增加 regulatory_info_package 分支,先调用输入选择服务,再决定启动、提示上传或反问。 |
### RIP-3 阶段验证
```bash
python manage.py check
pytest tests/test_regulatory_info_package_trigger.py tests/test_regulatory_info_package_workflow.py tests/test_regulatory_info_package_views.py
```
---
## 十、RIP-4 输入选择与说明书解析
### RIP-4-001 实现说明书输入选择
| 项 | 内容 |
| --- | --- |
| 目标 | 按用户消息、active 附件、最近汇总批次选择说明书 |
| 修改范围 | `services/input_select.py` |
| 验收标准 | 文件名模糊匹配、唯一 docx、多个说明书、无说明书均有明确结果 |
| Codex 执行提示 | 请实现 `select_instruction_input`,多候选返回 waiting_user 语义,由对话反问用户确认具体文件名。 |
### RIP-4-002 实现说明书 docx 解析
| 项 | 内容 |
| --- | --- |
| 目标 | 读取说明书段落、章节、表格、组成成分表和 front_text |
| 修改范围 | `services/instruction_extract.py` |
| 验收标准 | 能解析 `目标产品说明书.docx` 的产品名称、章节和主要表格结构 |
| Codex 执行提示 | 请使用结构化 Word 解析能力,不用脆弱的纯字符串拼接;解析结果写入可序列化 schema。 |
### RIP-4-003 写入说明书抽取日志产物
| 项 | 内容 |
| --- | --- |
| 目标 | 保存 `logs/instruction_extract.json` 并创建 artifact |
| 修改范围 | `workflow.py``storage.py``instruction_extract.py` |
| 验收标准 | JSON 只在后台 logs 目录,不进入用户下载列表 |
| Codex 执行提示 | 请在 text_extract 节点保存说明书抽取 JSONartifact 可记录,但不要创建 ExportedSummaryFile。 |
### RIP-4 阶段验证
```bash
pytest tests/test_regulatory_info_package_input_select.py tests/test_regulatory_info_package_instruction_extract.py
```
---
## 十一、RIP-5 字段抽取与合并
### RIP-5-001 实现规则字段抽取
| 项 | 内容 |
| --- | --- |
| 目标 | 从说明书章节和表格中抽取产品名称、包装规格、预期用途、组成、储存条件、样本类型、适用仪器、标准号等 |
| 修改范围 | `services/field_extract.py` |
| 验收标准 | 不依赖 LLM 时可抽取关键字段并支撑 demo |
| Codex 执行提示 | 请优先实现规则抽取,抽取结果包含 value、evidence、confidence 和 source。 |
### RIP-5-002 实现 LLM 抽取封装和三次重试
| 项 | 内容 |
| --- | --- |
| 目标 | LLM 结构化抽取,失败最多重试 3 次,失败后不阻断 |
| 修改范围 | `services/field_extract.py``prompts/field_extract.md` |
| 验收标准 | 0s/1s/2s 重试;解析失败可记录错误;规则结果继续 |
| Codex 执行提示 | 请封装 LLM 调用为可 mock 的函数,测试中不要真实调用外部模型。 |
### RIP-5-003 实现规则与 LLM 并行抽取
| 项 | 内容 |
| --- | --- |
| 目标 | 使用线程并行执行规则抽取和 LLM 抽取 |
| 修改范围 | `services/field_extract.py` |
| 验收标准 | 任一分支失败不影响另一分支结果;输出 `field_extract_result.json` |
| Codex 执行提示 | 请使用 `ThreadPoolExecutor(max_workers=2)`,不要在子线程直接写数据库。 |
### RIP-5-004 实现字段合并和高亮决策
| 项 | 内容 |
| --- | --- |
| 目标 | 输出 missing、llm_only、conflict 和最终写入值 |
| 修改范围 | `services/field_merge.py` |
| 验收标准 | 全缺失写 `/` 黄底LLM-only 黄底;冲突黄底红字;合并结果可追溯 |
| Codex 执行提示 | 请实现 `MergedField` 结构,合并结果写 `logs/merged_fields.json`,并同步批次摘要字段。 |
### RIP-5 阶段验证
```bash
pytest tests/test_regulatory_info_package_field_extract.py tests/test_regulatory_info_package_field_merge.py
```
---
## 十二、RIP-6 DOCX 文档生成
### RIP-6-001 实现 DocxDocumentAdapter
| 项 | 内容 |
| --- | --- |
| 目标 | 支持段落/表格替换、表格单元格填充、黄色底色、红字 |
| 修改范围 | `services/document_writer.py``services/docx_document.py` |
| 验收标准 | 可处理 run 拆分;测试可检查 docx XML 高亮和红字 |
| Codex 执行提示 | 请优先支持本模板需要的替换和表格填充场景,复杂通用 Word 引擎不要过度设计。 |
### RIP-6-002 实现 6 个 DOCX 文件生成策略
| 项 | 内容 |
| --- | --- |
| 目标 | 生成 CH1.2、CH1.4、CH1.5、CH1.11.1、CH1.11.5、CH1.11.6 |
| 修改范围 | `services/package_generate.py``services/standard_candidates.py` |
| 验收标准 | 6 个 docx 文件可生成;缺失/LLM-only/冲突样式正确 |
| Codex 执行提示 | 请先完成 docx 主链路。CH1.5 产品列表必须转成样例表头:包装规格、货号、组成、组分、主要组成成分、规格/数量,其中货号 `/` 黄底。 |
### RIP-6-003 实现 generate_docs 内部并发
| 项 | 内容 |
| --- | --- |
| 目标 | 每个文档独立线程生成,主线程统一写 artifact/export |
| 修改范围 | `services/package_generate.py``workflow.py` |
| 验收标准 | 单个文件失败不影响其他文件;返回 `GeneratedFileResult` 列表 |
| Codex 执行提示 | 请使用独立模板副本,子线程不要写数据库;所有异常转成文件级 failed 状态。 |
### RIP-6 阶段验证
```bash
pytest tests/test_regulatory_info_package_docx_writer.py tests/test_regulatory_info_package_package_generate.py
```
---
## 十三、RIP-7 CH1.9 DOC 适配
### RIP-7-001 实现 LegacyDocDocumentAdapter 能力探测
| 项 | 内容 |
| --- | --- |
| 目标 | 探测 Word COM、LibreOffice UNO 或可用兜底能力 |
| 修改范围 | `services/legacy_doc_document.py` |
| 验收标准 | 当前环境无原生能力时返回清晰 capability不崩溃 |
| Codex 执行提示 | 请先实现能力探测和接口骨架Windows Word COM 可作为优先实现;不可用时进入 docx 兜底。 |
### RIP-7-002 实现 CH1.9 原生写入与 docx 兜底
| 项 | 内容 |
| --- | --- |
| 目标 | CH1.9 优先 `.doc` 输出,失败时生成同语义 `.docx` |
| 修改范围 | `legacy_doc_document.py``package_generate.py` |
| 验收标准 | 原生成功状态 success兜底成功状态 fallback_success两者失败不进入 zip |
| Codex 执行提示 | 请把原生失败和兜底失败都写入 `adapter_summary``risk_notes`,不要静默转换。 |
### RIP-7-003 补充 doc 适配器测试
| 项 | 内容 |
| --- | --- |
| 目标 | 覆盖 capability、兜底成功、失败隔离 |
| 修改范围 | `tests/test_regulatory_info_package_legacy_doc.py` |
| 验收标准 | 测试不依赖本机必须安装 Word用 mock 覆盖原生成功/失败 |
| Codex 执行提示 | 请用 mock 模拟 Word COM 可用和不可用场景,保证 CI 或本地无 Word 时测试仍稳定。 |
### RIP-7 阶段验证
```bash
pytest tests/test_regulatory_info_package_legacy_doc.py tests/test_regulatory_info_package_package_generate.py
```
---
## 十四、RIP-8 追溯、ZIP 与下载权限
### RIP-8-001 实现追溯 Excel 和后台 JSON
| 项 | 内容 |
| --- | --- |
| 目标 | 生成 `exports/traceability.xlsx``logs/traceability.json` |
| 修改范围 | `services/traceability_export.py` |
| 验收标准 | Excel 可下载JSON 不进入用户下载列表 |
| Codex 执行提示 | 请用 openpyxl 生成 Excel字段包含 target_file、target_field、final_value、extraction_source、evidence、highlight_reason、needs_review。 |
### RIP-8-002 实现 zip 打包
| 项 | 内容 |
| --- | --- |
| 目标 | 生成 `第1章 监管信息(预生成版).zip` |
| 修改范围 | `services/zip_export.py` |
| 验收标准 | zip 只包含 success/fallback_success 文件;失败文件不入包 |
| Codex 执行提示 | 请用 Python 标准库 `zipfile` 打包zip 中保留最终输出文件名。CH1.9 兜底成功时放入 `.docx` 文件。 |
### RIP-8-003 创建导出记录和下载权限
| 项 | 内容 |
| --- | --- |
| 目标 | zip、单文件、Excel 均写 `ExportedSummaryFile`;下载接口校验用户权限 |
| 修改范围 | `file_summary/views.py``storage.py``zip_export.py` |
| 验收标准 | 非批次用户不能下载zip 在 exports 返回顺序中排首位 |
| Codex 执行提示 | 请按 `workflow_type=regulatory_info_package` 反查批次所属 conversation/user软删除批次不可下载。 |
### RIP-8 阶段验证
```bash
pytest tests/test_regulatory_info_package_traceability.py tests/test_regulatory_info_package_zip.py tests/test_regulatory_info_package_views.py
```
---
## 十五、RIP-9 摘要、通知与状态归并
### RIP-9-001 实现助手 Markdown 摘要
| 项 | 内容 |
| --- | --- |
| 目标 | 完成后返回 zip 首位、单文件列表、失败原因、待确认摘要 |
| 修改范围 | `services/summary.py``workflow.py` |
| 验收标准 | zip 链接在回复首位;失败文件显示原因且无下载;待确认数量准确 |
| Codex 执行提示 | 请严格按详细设计生成助手摘要partial_success 时也要展示可下载 zip 和失败文件原因。 |
### RIP-9-002 实现通知记录和统一通知接入
| 项 | 内容 |
| --- | --- |
| 目标 | 写 `RegulatoryInfoPackageNotificationRecord`,调用统一通知服务 |
| 修改范围 | `services/notifier.py``workflow.py` |
| 验收标准 | 通知失败不阻断下载;失败写 `risk_notes` |
| Codex 执行提示 | 请复用已有通知模式,先保证本地测试可 mock不要让外部通知失败影响批次主状态。 |
### RIP-9-003 完成状态归并
| 项 | 内容 |
| --- | --- |
| 目标 | 根据生成结果、zip、追溯、通知落定 success/partial_success/failed/waiting_user |
| 修改范围 | `workflow.py` |
| 验收标准 | 7 文件成功为 success部分文件失败但有 zip 为 partial_success全部失败为 failed |
| Codex 执行提示 | 请把状态归并集中在一个函数,测试覆盖 docx 兜底、zip 失败、通知失败、产品名缺失。 |
### RIP-9 阶段验证
```bash
pytest tests/test_regulatory_info_package_workflow.py tests/test_regulatory_info_package_notification.py
```
---
## 十六、RIP-10 前端接入与总体验收
### RIP-10-001 增加对话快捷入口
| 项 | 内容 |
| --- | --- |
| 目标 | 对话框底部增加“第1章监管信息”快捷提示 |
| 修改范围 | `templates/home.html` |
| 验收标准 | 点击后填入或发送 `根据说明书生成第1章监管信息` |
| Codex 执行提示 | 请复用现有 tool-chip 样式,不单独创建新前端样式文件,除非现有结构无法展示。 |
### RIP-10-002 工作流卡片和状态轮询支持
| 项 | 内容 |
| --- | --- |
| 目标 | 前端识别 `regulatory_info_package`,使用新 status URL 轮询 |
| 修改范围 | `static/js/app.js``templates/home.html` |
| 验收标准 | 卡片能展示节点、状态、风险和导出列表;终态识别 success/partial_success/failed/waiting_user |
| Codex 执行提示 | 请在现有工作流卡片逻辑中增量接入,不复制一套新卡片实现。 |
### RIP-10-003 下载展示和失败文件展示
| 项 | 内容 |
| --- | --- |
| 目标 | zip 首位展示,单文件辅助下载,失败文件展示原因 |
| 修改范围 | `static/js/app.js` |
| 验收标准 | exports 返回顺序被保留失败文件无下载按钮traceability.xlsx 可下载 |
| Codex 执行提示 | 请以后端 exports 顺序为准,不新增 `is_primary` 字段zip 已由后端排首位。 |
### RIP-10-004 总体验收与回归
| 项 | 内容 |
| --- | --- |
| 目标 | 全链路验证和回归保护 |
| 修改范围 | 测试、必要的 bug fix |
| 验收标准 | Django check、RIP 测试、关键既有测试通过;能用样例说明书生成材料包 |
| Codex 执行提示 | 请用 `docs/0.原始材料/目标产品说明书.docx` 做端到端验证,确认 zip、单文件、Excel、logs 和摘要均符合设计。 |
### RIP-10 阶段验证
```bash
python manage.py check
pytest tests/test_regulatory_info_package_frontend.py
pytest tests/test_regulatory_info_package_models.py tests/test_regulatory_info_package_trigger.py tests/test_regulatory_info_package_input_select.py tests/test_regulatory_info_package_template_config.py tests/test_regulatory_info_package_instruction_extract.py tests/test_regulatory_info_package_field_extract.py tests/test_regulatory_info_package_field_merge.py tests/test_regulatory_info_package_docx_writer.py tests/test_regulatory_info_package_legacy_doc.py tests/test_regulatory_info_package_package_generate.py tests/test_regulatory_info_package_traceability.py tests/test_regulatory_info_package_zip.py tests/test_regulatory_info_package_workflow.py tests/test_regulatory_info_package_views.py tests/test_regulatory_info_package_notification.py
```
---
## 十七、测试分层要求
| 测试层 | 覆盖内容 | 建议文件 |
| --- | --- | --- |
| 模型测试 | 批次、产物、通知、zip 导出类型 | `tests/test_regulatory_info_package_models.py` |
| 路由测试 | 固定关键词、LLM action、对话启动分支 | `tests/test_regulatory_info_package_trigger.py` |
| 输入测试 | 文件名匹配、active 附件、多候选反问 | `tests/test_regulatory_info_package_input_select.py` |
| 配置测试 | YAML 加载、模板缺失、code 唯一 | `tests/test_regulatory_info_package_template_config.py` |
| 解析测试 | 说明书章节、表格、组成成分表 | `tests/test_regulatory_info_package_instruction_extract.py` |
| 抽取测试 | 规则抽取、LLM 重试、失败降级 | `tests/test_regulatory_info_package_field_extract.py` |
| 合并测试 | missing、llm_only、conflict | `tests/test_regulatory_info_package_field_merge.py` |
| 文档测试 | docx 替换、表格、高亮、红字 | `tests/test_regulatory_info_package_docx_writer.py` |
| doc 测试 | adapter 探测、docx 兜底、失败状态 | `tests/test_regulatory_info_package_legacy_doc.py` |
| 生成测试 | 7 文件并发生成、异常隔离 | `tests/test_regulatory_info_package_package_generate.py` |
| 追溯测试 | Excel 下载、logs JSON | `tests/test_regulatory_info_package_traceability.py` |
| zip 测试 | 只打包 success/fallback_success | `tests/test_regulatory_info_package_zip.py` |
| 工作流测试 | 节点流转、状态归并、partial_success | `tests/test_regulatory_info_package_workflow.py` |
| 接口测试 | start/status/download 权限 | `tests/test_regulatory_info_package_views.py` |
| 通知测试 | 通知记录、通知失败降级 | `tests/test_regulatory_info_package_notification.py` |
| 前端测试 | chip、卡片、状态 URL、下载展示 | `tests/test_regulatory_info_package_frontend.py` |
---
## 十八、Codex 自动化执行规则
| 规则 | 内容 |
| --- | --- |
| 顺序执行 | 必须从 RIP-0 到 RIP-10 顺序执行,不得跳阶段 |
| 阶段聚焦 | 当前阶段失败时先修复当前阶段,不继续后续阶段 |
| TDD | 新行为先写失败测试,再实现 |
| 小步修改 | 每次只修改当前阶段相关文件,避免顺手重构 |
| 用户变更保护 | 不得回滚或覆盖用户已有未提交变更 |
| 过程日志 | 每阶段记录关键命令结果和既有失败 |
| 阶段验证 | 每阶段完成后运行对应验证命令 |
| 阶段提交 | 每阶段验证通过后生成提交摘要并本地提交 |
| 回归保护 | 文件汇总、法规核查、自动填表现有测试不得回归 |
| doc 风险隔离 | `.doc` 原生处理失败不得阻断其他 6 个 docx 文件生成 |
| 外部依赖隔离 | LLM、通知、Word COM 均需可 mock测试不依赖真实外部服务 |
| 下载安全 | 所有导出下载必须通过所属用户权限校验 |
---
## 十九、推荐目标模式提示词
后续可直接对 Codex 输入:
```text
请按 docs/5.开发计划/5.第1章监管信息材料包生成.md 执行开发。
执行要求:
1. 严格按 RIP-0 到 RIP-10 顺序推进,不跳阶段。
2. 每阶段先读对应需求、功能、数据库、详细设计文档。
3. 每阶段先写或补充测试,再实现代码。
4. 每阶段只修改当前阶段相关文件,不做无关重构。
5. 不回滚、不覆盖用户已有未提交变更。
6. LLM、通知、Word COM 等外部能力必须可 mock。
7. 每阶段完成后运行该阶段验证命令。
8. 验证通过后生成提交摘要并本地提交。
9. 最后使用 docs/0.原始材料/目标产品说明书.docx 做端到端验收。
```
---
## 二十、待执行前检查清单
| 检查项 | 状态 |
| --- | --- |
| 需求分析、功能设计、数据库设计、详细设计均已存在 | 待执行时确认 |
| 当前分支是否适合创建开发分支 | 待执行时确认 |
| 是否存在用户未提交变更 | 待执行时确认 |
| `python-docx``openpyxl``PyYAML` 是否可用 | 待执行时确认 |
| Word COM 或 LibreOffice UNO 是否可用 | 待执行时确认,非阻塞 |
| 目标说明书 `docs/0.原始材料/目标产品说明书.docx` 是否存在 | 待执行时确认 |
| 样例模板目录 `docs/0.原始材料/第1章 监管信息` 是否完整 | 待执行时确认 |
| 现有文件汇总、法规核查、自动填表测试是否通过 | 待执行时确认 |