docs: add govdoc migration analysis and implementation notes
This commit is contained in:
@@ -0,0 +1,396 @@
|
||||
# 内部公文模块实施进展与运行依赖说明
|
||||
|
||||
## 1. 文档目的
|
||||
|
||||
本文档只回答 3 个问题:
|
||||
|
||||
- 当前 `govdoc` 模块代码已经接到了哪一步
|
||||
- 现在还缺哪些实现与运行依赖
|
||||
- 当前为什么仍不能视为“可正式运行”
|
||||
|
||||
本文档基于 2026-05-17 当前仓库实际代码状态整理,不讨论理想方案,只描述现状。
|
||||
|
||||
---
|
||||
|
||||
## 2. 当前实施进展
|
||||
|
||||
### 2.0 2026-05-17 运行面最新结论
|
||||
|
||||
本次联调补充确认了一个非常关键的事实:
|
||||
|
||||
- `govdoc` 前后端链路现在已经接到了当前 `leaudit-platform`
|
||||
- `GET /api/govdoc/documents` 不再是之前的 `404`
|
||||
- 当前未登录访问时,接口返回 `401 Unauthorized`
|
||||
- 当前未登录访问 `http://172.16.0.59:5173/govdoc/audits?entryModuleId=3` 时,会被正常重定向到 `/login`
|
||||
|
||||
这说明:
|
||||
|
||||
- “文档列表没有接到 1 后端”这个问题,按 2026-05-17 当前代码与运行验证结果看,**已经不是接口未接通问题**
|
||||
- 当前更真实的阻塞已经变成:
|
||||
- 运行进程是否真的按当前仓库拉起
|
||||
- 浏览器是否带了有效登录态
|
||||
- 正式部署是否还混用了旧项目或错误上游
|
||||
|
||||
本次实测时,以下链路已确认成立:
|
||||
|
||||
- `legal-platform-frontend` 的 `/api/govdoc/*` 代理会转发到当前后端 `http://127.0.0.1:8096/api/govdoc/*`
|
||||
- 后端 `8096` 确认加载的是当前仓库 `fastapi_admin.app:app`
|
||||
- `GET /api/govdoc/documents?page=1&pageSize=1` 已到达当前后端,并返回认证失败而非路由不存在
|
||||
|
||||
结论:
|
||||
|
||||
- **当前剩余主阻塞不是“列表接口没接上”,而是“运行部署链路混乱 + 登录态/正式进程不稳定”。**
|
||||
|
||||
### 2.1 业务基线已明确
|
||||
|
||||
当前业务口径已经明确:
|
||||
|
||||
- `govdoc` 是“内部公文格式审查模块”
|
||||
- 主对象是“文档”,不是 `run`
|
||||
- 上传后可自动触发审查
|
||||
- 历史 `run` 需要保留
|
||||
- 详情应以 `documentId` 为主,默认展示最新一次 `run`
|
||||
|
||||
这部分结论已在已有业务文档中明确,不再重复展开。
|
||||
|
||||
### 2.2 后端基础骨架已形成
|
||||
|
||||
当前后端已具备以下基础结构:
|
||||
|
||||
- `controller` 层已有 `govdoc` 路由入口
|
||||
- `service` 层已有 `GovdocServiceImpl`
|
||||
- `bridge` 层已有 `tasks / runner / storage_adapter / input_resolver / result_adapter`
|
||||
- `engine` 层已有 `govdoc_engine` 解析、规则执行、结构/大纲、报告相关代码
|
||||
- `model` 与 `DDL` 已具备 `govdoc_runs / govdoc_rule_results / govdoc_report_artifacts` 基础定义
|
||||
|
||||
说明:
|
||||
|
||||
- 这代表模块已经不是“纯占位”,而是已经具备一条从文档到运行结果的后端主链路雏形。
|
||||
|
||||
### 2.3 文档与运行主链路已有实际实现
|
||||
|
||||
当前 `GovdocServiceImpl` 已经实现了以下能力:
|
||||
|
||||
- 文档上传
|
||||
- 文档列表
|
||||
- 文档详情
|
||||
- 创建运行 `CreateRun`
|
||||
- 运行状态查询
|
||||
- 运行结果读取
|
||||
- findings / entities / structure / outline 读取
|
||||
- 原文下载
|
||||
- HTML / DOCX 报告地址读取
|
||||
- 规则列表 / 规则详情读取
|
||||
|
||||
说明:
|
||||
|
||||
- 这意味着服务层已经不是之前那种“多数方法占位返回空壳”的阶段。
|
||||
- 当前更准确的判断应是:**后端主链路基本接通,但仍存在关键运行依赖缺口和若干结果完整性缺口。**
|
||||
|
||||
### 2.4 worker / bridge / DDL 的 P0 已完成一轮修复
|
||||
|
||||
截至当前代码状态,以下确定性断点已完成修复:
|
||||
|
||||
- `dispatch_govdoc_task` 已支持透传 `rulesPath`
|
||||
- `govdoc_execute_task` 已支持接收 `rulesPath`
|
||||
- `GovdocRunner.Execute()` 已显式校验 `rulesPath`
|
||||
- `UpdateRunStatus()` 已兼容 `phase / Phase`
|
||||
- `govdoc_runs.rules_path` 已补入 model / DDL
|
||||
- `govdoc_rule_results.skip_reason` 已补入 model / DDL
|
||||
|
||||
这部分修复的意义是:
|
||||
|
||||
- 任务链不再因为参数签名不一致、字段缺列这类低级错位直接报错
|
||||
- 但“能跑到哪一步”仍取决于上游运行依赖是否齐全
|
||||
|
||||
---
|
||||
|
||||
## 3. 当前已完成项
|
||||
|
||||
从“能不能形成后端最小闭环”角度看,当前已完成项如下。
|
||||
|
||||
### 3.1 文档主档复用已接上
|
||||
|
||||
- 上传公文时,已复用 `leaudit_documents`
|
||||
- 原始文件已复用 `leaudit_document_files`
|
||||
- 上传后会把 `engine_type` 标记为 `govdoc`
|
||||
|
||||
### 3.2 运行记录域已接上
|
||||
|
||||
- 已创建 `govdoc_runs`
|
||||
- 已支持记录 `status / phase / total_score / result_status`
|
||||
- 已支持写入 `task_id / started_at / finished_at`
|
||||
|
||||
### 3.3 规则结果域已接上
|
||||
|
||||
- 已支持写入 `govdoc_rule_results`
|
||||
- 已支持读取 `result / severity / category / message`
|
||||
- 已支持读取 `skip_reason`
|
||||
|
||||
### 3.4 异步任务链已接上
|
||||
|
||||
- 已支持 `CreateRun -> dispatch_govdoc_task -> govdoc_execute_task -> GovdocRunner.Execute`
|
||||
- 已支持 worker 中更新 run/document 状态
|
||||
|
||||
### 3.5 结果读取链已接上
|
||||
|
||||
- 已支持从 `govdoc_runs + govdoc_rule_results` 读取结果摘要
|
||||
- 已支持组装 `checkedRules / findings / structure / outline`
|
||||
- 已支持详情页所需的最新运行与历史运行信息
|
||||
|
||||
---
|
||||
|
||||
## 4. 当前待完成项
|
||||
|
||||
以下内容属于“主链路已经搭上,但还没有真正闭环”。
|
||||
|
||||
### 4.1 规则文件已落位,但规则来源策略仍是临时写法
|
||||
|
||||
当前实现里,`GovdocServiceImpl._resolve_rules_path()` 仍只尝试两个固定候选路径:
|
||||
|
||||
- `/home/wren-dev/Porject/leaudit-platform/rules/govdoc/govdoc_general/rules.yaml`
|
||||
- `/home/wren-dev/Porject/leaudit-platform/rules/govdoc_general/rules.yaml`
|
||||
|
||||
按 2026-05-17 当前仓库实际状态看:
|
||||
|
||||
- 第一条路径对应的规则文件已经存在
|
||||
- 当前真实运行也已经证明 `govdoc` 审查链路可以成功加载该规则并完成一次完整审查
|
||||
|
||||
因此:
|
||||
|
||||
- 现在的问题已经不是“规则文件本体不存在”
|
||||
- 而是**规则来源策略仍然是硬编码单规则集**
|
||||
|
||||
当前仍待补的问题是:
|
||||
|
||||
- 不支持按文种/类型切换不同规则集
|
||||
- 不支持按地区/版本切换规则集
|
||||
- 不支持平台化规则绑定与管理
|
||||
|
||||
这不是当前链路跑不通的主阻塞,但它是后续正式化接入前必须收口的技术债。
|
||||
|
||||
### 4.2 govdoc 专用规则资产已入库,但尚未平台化
|
||||
|
||||
当前仓库已存在明确的 `govdoc` 规则目录:
|
||||
|
||||
- `rules/govdoc/govdoc_general/rules.yaml`
|
||||
|
||||
这说明:
|
||||
|
||||
- `govdoc` 已经不再处于“只有代码骨架,没有规则资产”的阶段
|
||||
- 后端规则读取、规则列表、规则详情的最小语义已经有了真实落点
|
||||
|
||||
但当前仍只能视为“单规则集可运行”:
|
||||
|
||||
- 规则目录结构尚未接入统一规则管理策略
|
||||
- `rules_path` 仍主要服务于当前单套内部公文规则
|
||||
- 规则版本、切换与配置来源还没有平台化闭环
|
||||
|
||||
### 4.3 报告产物主闭环已打通,但历史运行仍需补跑
|
||||
|
||||
当前代码已补齐正式报告产物生成与写库:
|
||||
|
||||
- 审查完成后会生成 `annotated_docx`
|
||||
- 审查完成后会生成 `html_report`
|
||||
- 审查完成后会生成 `paragraph_html`
|
||||
- 产物会落入 `govdoc_report_artifacts`
|
||||
|
||||
并且已做过真实运行验证。
|
||||
|
||||
但仍有两个现实问题没有自动消失:
|
||||
|
||||
- 历史上在修复前跑成功的 run,并不会自动补出产物
|
||||
- 这类历史 run 需要重新触发一次审查,才能补齐正式报告文件
|
||||
|
||||
### 4.4 页面接入已通,但真实登录态联调尚未完成
|
||||
|
||||
虽然本文档不展开前端全部细节,但从当前代码与运行态核对结果看,前端接入边界已经比较明确:
|
||||
|
||||
- `/govdoc/audits` 已接到当前 `legal-platform-frontend`
|
||||
- 页面真实数据请求走的是 `/api/govdoc/* -> 8096/api/govdoc/*`
|
||||
- 未登录访问时,`app/(audit)/layout.tsx -> requireAuth()` 会先基于 `user_info` cookie 重定向到 `/login`
|
||||
- `/api/*` 请求上的 `Authorization` 由 `middleware.ts` 从 `access_token` cookie 注入
|
||||
|
||||
因此当前状态更适合描述为:
|
||||
|
||||
- 前端页面和代理链路已经接通
|
||||
- 当前仍缺“带真实登录态”的完整回归验收
|
||||
- 当前若页面跳 `/login` 或接口 `401`,不能再直接判断为“govdoc 没接后端”
|
||||
|
||||
---
|
||||
|
||||
## 5. 当前已知运行阻塞
|
||||
|
||||
以下是“现在就会影响模块能否真实跑通”的已知阻塞。
|
||||
|
||||
### 5.1 阻塞一:正式运行进程与旧链路混用
|
||||
|
||||
这是当前最关键、最真实的运行阻塞。
|
||||
|
||||
现状:
|
||||
|
||||
- 当前仓库后端标准端口应为 `8096`
|
||||
- 当前仓库 worker 应从 `leaudit-platform/scripts/start_worker.sh` 启动
|
||||
- 实机上曾长期存在旧 worker:
|
||||
- `python start_worker_with_routing.py --config-port 8096`
|
||||
- `cwd=/home/wren-dev/Porject/docauditai`
|
||||
- 实机联调过程中还出现过:
|
||||
- `5173` 前端入口存在
|
||||
- 但 `8096` 没有当前仓库后端在监听
|
||||
- 因此页面表现为 `502 / 404 / 500` 来回切换
|
||||
|
||||
结果:
|
||||
|
||||
- 浏览器打开页面,不代表当前仓库后端已经真正生效
|
||||
- 即使代码已经修好,只要正式进程仍混用旧项目,上层依然会报错
|
||||
|
||||
结论:
|
||||
|
||||
- **当前 `govdoc` 最大阻塞已经不是接口代码未接通,而是部署运行链路未彻底切回当前仓库。**
|
||||
|
||||
### 5.2 阻塞二:旧 `docauditai` worker 仍长期存活
|
||||
|
||||
当前机器上已确认存在旧进程:
|
||||
|
||||
- `python start_worker_with_routing.py --config-port 8096`
|
||||
- `cwd=/home/wren-dev/Porject/docauditai`
|
||||
- `PPID=1`
|
||||
- 标准输出与错误输出落在 `/tmp/worker_8096.log`
|
||||
|
||||
这说明它更像是:
|
||||
|
||||
- 历史上人工或脚本后台拉起后长期遗留的旧 worker
|
||||
|
||||
它与当前仓库的主要冲突点不是抢占 `8096` HTTP 端口,而是:
|
||||
|
||||
- 它仍可能消费旧 `docauditai` 任务链路
|
||||
- 它会制造“页面是新的,执行链还是旧的”的混合运行态
|
||||
- 它会严重干扰“问题究竟在当前仓库还是旧仓库”的判断
|
||||
|
||||
在没有确认任务投递、结果写回、旧队列消费都已切到当前仓库前,不宜只凭主观感觉直接停掉该进程。
|
||||
|
||||
### 5.3 阻塞三:规则来源策略仍是临时写法
|
||||
|
||||
当前 `_resolve_rules_path()` 只使用硬编码候选路径。
|
||||
|
||||
这意味着即便后续补了规则文件,也仍然存在以下待补问题:
|
||||
|
||||
- 不支持按文档类型选择不同规则
|
||||
- 不支持按地区 / 版本 / 规则集切换
|
||||
- 不支持平台化规则管理
|
||||
|
||||
这个问题不一定导致“立刻报错”,但会阻碍后续正式上线。
|
||||
|
||||
### 5.4 阻塞四:当前终端启动方式不等于正式部署方式
|
||||
|
||||
本次排障中还发现一个容易误判的问题:
|
||||
|
||||
- 在当前 Codex 执行环境里,普通“后台启动后退出命令”的方式,子进程可能随会话一起被回收
|
||||
- 因此会出现:
|
||||
- 日志显示 `startup complete`
|
||||
- 但随后端口马上消失
|
||||
|
||||
这个现象说明:
|
||||
|
||||
- 不能把当前临时终端会话,等同于正式 supervisor / systemd / PM2 / nginx upstream 部署环境
|
||||
- 正式部署必须由稳定守护方式接管
|
||||
- 不能仅凭一次临时 shell `start` 成功,就判断运行问题已经彻底解决
|
||||
|
||||
这属于运行验证边界,不属于 govdoc 业务逻辑问题。
|
||||
|
||||
---
|
||||
|
||||
## 6. 当前运行依赖清单
|
||||
|
||||
从“要让 `govdoc` 至少完成一次真实审查”角度,当前最小运行依赖如下。
|
||||
|
||||
### 6.1 数据库依赖
|
||||
|
||||
- `leaudit_documents`
|
||||
- `leaudit_document_files`
|
||||
- `govdoc_runs`
|
||||
- `govdoc_rule_results`
|
||||
- `govdoc_report_artifacts`
|
||||
|
||||
并且需执行当前 `schema_add_govdoc_module.sql`,保证以下列存在:
|
||||
|
||||
- `govdoc_runs.rules_path`
|
||||
- `govdoc_rule_results.skip_reason`
|
||||
- `leaudit_documents.engine_type`
|
||||
|
||||
### 6.2 文件与存储依赖
|
||||
|
||||
- 上传文档需能写入 OSS / MinIO
|
||||
- worker 执行时需能下载原始文档到本地临时目录
|
||||
|
||||
### 6.3 异步任务依赖
|
||||
|
||||
- Celery worker 需可消费当前 `leaudit-platform` 队列
|
||||
- 当前实际队列为 `leaudit.normal` / `leaudit.urgent`
|
||||
- worker 进程需可访问数据库、OSS、本地临时目录
|
||||
|
||||
### 6.4 规则引擎依赖
|
||||
|
||||
- 必须存在可用的 `govdoc rules.yaml`
|
||||
- `rulesPath` 必须能被 service 层解析出来
|
||||
- worker 所在运行环境必须能读取该规则文件
|
||||
|
||||
### 6.5 解析与报告依赖
|
||||
|
||||
- `python-docx` 相关解析依赖需正常
|
||||
- 段落解析、规则执行、结构/大纲构建需可正常运行
|
||||
- 审查完成后需能生成并上传正式报告产物
|
||||
|
||||
---
|
||||
|
||||
## 7. 当前剩余细节清单
|
||||
|
||||
从“业务语义已经基本对齐”往“可稳定交付”推进,当前剩余细节主要有这些:
|
||||
|
||||
### 7.1 运行部署侧
|
||||
|
||||
- 正式 `8096` 后端进程要固定切到当前 `leaudit-platform`
|
||||
- 正式 worker 要确认只消费当前 `leaudit-platform` 队列
|
||||
- 旧 `docauditai` 的 `start_worker_with_routing.py` 需要在确认安全前置条件后退出正式链路
|
||||
- `5173` 对应的 nginx / 前端上游要固定指向当前前端服务
|
||||
- 需要一份正式重启与巡检手册,避免以后又混回旧进程
|
||||
|
||||
### 7.2 数据与历史运行侧
|
||||
|
||||
- 修复前的历史成功 run 需要补跑一次,才能产出正式报告文件
|
||||
- 需要确认 `leaudit_documents.current_run_id` 是否都正确指向最新成功 run
|
||||
|
||||
### 7.3 产品细节侧
|
||||
|
||||
- `canonical.docx` 与 `result.json` 还没有作为显式产物沉淀
|
||||
- 前端某些展示位仍以 `run completed` 为主判断,而不是严格以产物存在性判断
|
||||
- 按钮开放策略还需要继续保持“和其他文档类型一致,但不额外放出不该开放的按钮”
|
||||
|
||||
### 7.4 验收侧
|
||||
|
||||
- 需要带真实登录态回归验证:
|
||||
- 列表页
|
||||
- 详情页
|
||||
- HTML 报告
|
||||
- DOCX 报告
|
||||
- 段落联动视图
|
||||
- 重跑与历史 run 切换
|
||||
|
||||
---
|
||||
|
||||
## 8. 当前结论
|
||||
|
||||
截至 2026-05-17,`govdoc` 当前真实状态应表述为:
|
||||
|
||||
- 业务语义基线已经明确
|
||||
- 后端主链路已经接通
|
||||
- 正式报告产物主闭环已经补齐
|
||||
- 前端列表/详情接口已接到当前后端契约
|
||||
- 当前 `rules/govdoc/govdoc_general/rules.yaml` 已存在且已被真实运行验证过
|
||||
- 当前最主要问题已经转为运行部署链路不稳定,而不是业务逻辑未实现
|
||||
|
||||
因此后续工作重点不应再回到“列表接口有没有接上”,而应转向:
|
||||
|
||||
- 固化正式运行方式
|
||||
- 清理旧 worker / 旧上游
|
||||
- 带登录态做完整联调验收
|
||||
Reference in New Issue
Block a user