# 内部公文模块业务逻辑梳理 ## 1. 文档目的 本文档用于明确当前 `leaudit-platform` 中 `govdoc`(内部公文模块)的业务定位、核心对象、标准流程、权限边界与结果语义。 这份文档的目标不是讲技术实现,而是先把“这个模块业务上到底是什么、用户怎么用、系统应该怎么理解”说清楚,作为后续前后端对接补齐和修复的业务基线。 --- ## 2. 模块定位 `govdoc` 模块是当前平台中的一个一等业务模块,不是外挂独立系统。 它的核心业务目标是: - 上传一份内部公文文件 - 按公文格式规范自动发起审查 - 输出结构化问题、规则检查结果、结构/大纲/实体识别结果 - 提供 HTML 报告、批注 DOCX、原文下载 - 全流程复用当前平台的账号、权限、地区、文档主档、OSS、异步任务体系 一句话概括: **内部公文模块本质上是平台里的“公文格式审查模块”。** --- ## 3. 业务边界 ### 3.1 本模块负责的事 - 公文文档上传 - 自动格式审查 - 审查结果展示 - 审查历史留痕 - 规则查看 - 报告下载 ### 3.2 本模块不负责的事 - 公文流转审批 - 协同编辑 - 发文流程管理 - 独立规则平台 - 第二套独立文档系统 - 通用 RAG / 合同评审 / 交叉评查 因此,第一阶段不要把 `govdoc` 理解成“公文业务平台”,而应理解成“公文格式审查能力模块”。 --- ## 4. 审查对象 从现有页面文案、规则展示和引擎能力看,`govdoc` 模块重点审查的是“公文格式规范”,而不是公文业务内容是否正确。 它重点关注的对象包括但不限于: - 标题 - 发文字号 - 主送机关 - 正文层级 - 附件标记 - 附件标题 - 署名 - 成文日期 - 字体字号 - 行距 - 标点 - 禁用表述 - 易混词 - 文种合法性 - 层级编号规范 - 需要 AI/语义辅助判断的规则 因此,模块输出的“分数”和“问题”,本质上是: **公文格式规范符合度结果,不是业务内容质量结果。** --- ## 5. 核心业务对象 本模块建议围绕以下 4 层业务对象展开。 ### 5.1 文档 文档是平台主档中的一份公文文件。 业务语义: - 用户上传的一份公文文件 - 是平台中的主对象 - 需要标记该文档属于 `govdoc` 模块 建议复用: - `leaudit_documents` - `leaudit_document_files` 同时在主档中补充模块标识,例如: - `engine_type = 'govdoc'` ### 5.2 审查运行(Run) Run 表示: - 某份文档的一次审查执行记录 - 同一份文档可以有多次 run - 新 run 不覆盖旧 run - run 是执行留痕,不是业务主对象 ### 5.3 规则结果 规则结果表示: - 每条规则对当前文档检查后的结果 单条规则最终状态不是只有“通过/不通过”,而是: - `pass` - `fail` - `skipped` 其中 `skipped` 表示: - 条件不足,无法检查 - 或外部依赖能力异常,临时跳过 ### 5.4 报告产物 审查完成后会产出一组可展示或可下载的结果文件,例如: - HTML 报告 - 批注 DOCX - 段落 HTML - 原文下载 - 其他结构化中间结果 --- ## 6. 主对象结论 结合当前业务确认,推荐正式拍板如下: - **业务主对象是文档,不是 run** - run 是文档的一次审查执行留痕 原因: - 列表页已经确定为文档列表 - 首页统计按文档最新结果计算 - 删除、下载原文、权限继承都天然是文档维度 - 用户面对的是“这份公文”,而不是技术上的 run --- ## 7. 详情页主键结论 推荐正式拍板如下: - **详情页路由主键使用 `documentId`** - 页面默认展示该文档“最新一次 run”的结果 - 历史 run 在详情页内切换查看 推荐语义: - 页面入口面向文档 - 页面内容展示 run 结果 - 最新 run 为默认视图 不建议直接把页面主键设计成 `runId`,否则会带来这些问题: - 用户难以理解自己打开的是“哪份文档” - 同一文档多次审查后页面入口不稳定 - 列表页与详情页的主对象不一致 --- ## 8. 标准业务流程 ### 8.1 进入模块 用户进入 `govdoc` 模块后,可以看到: - 模块首页/概览 - 最近文档 - 统计数据 ### 8.2 上传公文 用户上传一份公文文件。 第一阶段支持的文件类型应以现有前端为准,例如: - `doc` - `docx` - `wps` 上传成功后: - 创建平台文档主档 - 文档被标记为 `govdoc` ### 8.3 自动发起审查 已确认第一阶段默认行为为: - 上传成功后自动发起审查 也就是: - 上传成功 - 立即创建一条新的 run - 投递异步任务处理 因此在业务上: - 上传 ≠ 审查结果已经出来 - 上传 = 文档入库 + 自动创建 run ### 8.4 异步执行审查 Worker 异步执行完整审查链路,包括: - 读取原文 - 解析段落与样式 - 识别段落角色 - 抽取实体 - 加载规则 - 执行规则评估 - 生成问题结果 - 生成报告产物 - 回写数据库与 OSS ### 8.5 查看详情 用户打开某份文档详情后,默认应看到: - 该文档最新一次 run 的结果 包括: - 问题列表 - 已通过规则 - 已跳过规则 - 结构面板 - 大纲面板 - 实体面板 - 报告下载 ### 8.6 查看历史审查记录 同一份文档允许存在多个 run。 已确认需要保留历史 run,因此: - 新 run 不覆盖旧 run - 历史记录在详情页中查看 - 第一阶段前端不主动开放“重跑按钮”,但底层模型要支持 --- ## 9. 列表页业务定义 已确认列表页应为: - **文档列表** 不是: - run 列表 因此每一行表示的是: - 一份公文文档 展示的是该文档当前/最近一次审查摘要,例如: - 文档名称 - 文件类型 - 上传时间 - 当前状态 - 最新分数 - 最新问题数 - 最近一次审查时间 为什么不能做成 run 列表: - 同一份文档多次重跑会出现多行重复记录 - 用户业务上关心的是“这份公文当前状态如何” - 列表页会与文档权限、删除语义、首页统计口径冲突 --- ## 10. Run 的业务定位 Run 是内部执行留痕,不是页面主对象,但它在业务上必须存在。 Run 的业务价值: - 记录某次审查什么时候发起 - 记录谁触发了审查 - 记录本次状态、阶段、分数、错误信息 - 保留历史版本,支持追踪和回溯 当前业务确认: - 需要支持重跑 - 但前端第一阶段不开放重跑按钮 - 处理方式与其他文档类型保持一致 因此应理解为: - 能力层支持多 run - 数据层必须保留历史 run - 交互层是否开放重跑,可后续逐步释放 --- ## 11. 结果页业务语义 结果页中几个核心对象的业务含义如下。 ### 11.1 Findings Findings 是最细粒度的问题明细。 其业务语义是: - 某条规则在某一段落或某个结构位置上发现的问题 典型信息包括: - 规则 ID - 规则名称 - 严重级别 - 分类 - 位置 - 实际值 - 期望值 - 建议 - 证据文本 本质上是“段落级问题清单”。 ### 11.2 Checked Rules 这是规则维度的检查结果。 每条规则的最终状态只有一个: - `pass` - `fail` - `skipped` 这个列表用于回答: - 哪些规则通过了 - 哪些规则失败了 - 哪些规则因为条件不足被跳过了 ### 11.3 Structure Structure 表示: - 文档结构统计 它关注的是: - 识别出了哪些结构角色 - 各角色出现了多少次 - 是否缺少预期结构 - 样式是否一致 ### 11.4 Outline Outline 表示: - 文档大纲树 本质上是标题层级结构,用于帮助用户快速跳到对应段落。 ### 11.5 Entities Entities 表示: - 从公文中识别出的关键实体 例如: - 标题 - 发文字号 - 主送机关 - 附件 - 署名 - 日期 - 文种 --- ## 12. 右侧结果面板的业务定义 当前详情右侧面板可归纳为 3 类结果: ### 12.1 问题 显示: - 所有失败规则对应的问题明细 这是用户最主要的修正文档入口。 ### 12.2 已通过 显示: - 当前 run 中已通过的规则 作用: - 帮助用户知道哪些规范项已经满足 ### 12.3 已跳过 显示: - 当前 run 中未被真正执行的规则 典型原因: - 目标实体未识别到 - 检查条件不满足 - 外部智能检查服务不可用 业务上要明确: - `skipped` 不算失败 - 但也不等于通过 --- ## 13. 评分语义 已确认分数语义为: - **格式审查分** 它表示: - 这份公文在格式规范层面的符合程度 不表示: - 公文业务内容质量 - 法律风险程度 - 审批流转质量 因此用户看到的分数,本质上是格式规范扣分结果。 --- ## 14. 首页统计口径 已确认首页统计应按: - **文档最新结果** 而不是: - 所有历史 run 累加 因此统计时应遵循: - 一份文档多次重跑,只按最新结果参与当前统计 - “本月评查文件数”按文档数,不按 run 数 - “问题数”“通过率”也按文档最新结果计算 如果按所有 run 统计,会导致: - 文档数量虚高 - 问题数虚高 - 同一文档反复重跑导致指标失真 --- ## 15. 权限模型 本模块应使用独立的 `govdoc` 权限命名空间,不与其他模块混用。 ### 15.1 模块级权限 - `govdoc:module:read` ### 15.2 文档权限 - `govdoc:document:create` - `govdoc:document:read` - `govdoc:document:update` - `govdoc:document:delete` ### 15.3 Run 权限 - `govdoc:run:create` - `govdoc:run:read` - `govdoc:run:retry` ### 15.4 结果与报告权限 - `govdoc:result:read` - `govdoc:report:read` ### 15.5 规则权限 - `govdoc:rule:read` - `govdoc:rule:manage` --- ## 16. 数据范围规则 当前业务确认如下。 ### 16.1 普通用户(common) - 只能看自己上传/自己触发的文档与结果 - 不能通过参数查看别人数据 ### 16.2 地区管理员(admin) - 只能看本地区数据 - 即使前端传入其他 `region`,后端也必须拦截 ### 16.3 全局角色 - `super_admin` - `provincial_admin` 可看更大范围或全量数据 --- ## 17. 结果与报告权限继承原则 已确认以下资源不单独放宽: - findings - entities - HTML 报告 - 批注 DOCX - 原文下载 统一原则: - **能否查看结果 = 能否查看该文档** 也就是说: - 不能看这份文档,就不能看它的任何结果和报告产物 --- ## 18. 删除语义 已确认删除语义为: - **软删除文档** 业务含义: - 删除的是文档在模块中的业务可见性/状态 - 不是立刻物理删除 OSS 文件 - 历史 run 和产物先保留 因此第一阶段不应把“删除文档”理解成“彻底清除所有数据”。 --- ## 19. 文档修改权限 已确认普通用户默认不应具备较高的文档管理权限。 推荐权限语义: - 普通用户可 `create/read` - 普通用户默认不具备 `update/delete` 因此: - `govdoc:document:update` - `govdoc:document:delete` 应高于: - `govdoc:document:create` - `govdoc:document:read` - `govdoc:run:create` --- ## 20. 规则模块关系 已确认规则模块口径为: - **按照现有规则模块功能怎么做,内部公文模块就怎么接** 这意味着: - `govdoc` 不额外发明一套私有规则治理方式 - 规则版本、生效规则、规则选择逻辑,应尽量复用平台现有规则体系 - `govdoc` 只是作为一个业务模块接入既有规则治理框架 因此第一阶段不建议: - 单独做一套 `govdoc` 私有规则选择交互 - 单独维护一套与平台脱节的规则管理入口 --- ## 21. 第一阶段用户可见能力 第一阶段用户可见能力应聚焦在: - 上传公文 - 自动格式审查 - 查看问题 - 查看结构/大纲/实体 - 下载报告 不作为第一阶段重点暴露的能力: - 手动重跑按钮 - 高级规则版本选择 - 复杂模块配置页 其中: - 重跑能力底层可以支持 - 规则版本能力可先遵循现有平台规则模块现状 --- ## 22. 推荐正式拍板结论 为了保证后续前后端对接和修复方向稳定,推荐正式拍板以下两条: ### 22.1 主对象结论 - 主对象 = 文档 ### 22.2 详情页结论 - 详情页路由 = `documentId` - 页面默认展示该文档最新 run - 历史 run 在详情页内部切换查看 这两条一旦定稿,以下模块都会更清晰: - 列表页 - 详情聚合 - 权限继承 - 首页统计 - 历史记录展示 - 下载与删除语义 --- ## 23. 一句话总结 `govdoc` 模块应被定义为: **以“公文文档”为主对象、以“审查 run”为执行留痕、以“规则结果 + 报告产物”为输出、复用平台统一底座的内部公文格式审查模块。**