7.8 KiB
文档图片质量校验模块定制开发计划
1. 目标收口
本次版本只做“页码级模糊预警”,不做图片级定位。
系统最终只需要给出这类提示:
第3页疑似模糊第2页、第5页疑似模糊第4页建议重拍
不需要输出:
- 第几张图片
- 图片框选位置
- bbox
- 裁剪图回显
- OCR 图块级关联
这次方案的核心原则只有两条:
- 只做预警,不阻断主流程
- 只做到页码,不追求图级精确定位
2. 与当前 OCR / 评查链路的关系
本模块必须独立于当前 OCR 抽取、评查流程之外。
现有主流程保持不变:
- 用户上传文档
- 文档进入 OCR / 抽取 / 评查 pipeline
- 系统继续正常落库、展示、评查
新增流程只是一条旁路异步任务:
- 文档上传成功
- 异步投递“页级图片质量检测任务”
- 后台生成页码级预警结果
- 前端在列表页、详情页显示提示
明确约束:
- 图片质量检测失败,不影响上传
- 图片质量检测超时,不影响 OCR
- 图片质量检测发现模糊页,不影响评查
- 整个模块只作为 warning,不参与主流程 gate
3. 检测范围与判定结果
3.1 启用策略
建议保留三层控制:
- 全局总开关
- 文档类型维度开关
- 地区维度开关
判定顺序:
- 先看全局总开关
- 再看文档类型是否命中
- 再看地区是否命中
只要任一环节不命中,就直接跳过。
3.2 文档类型跳过策略
纯文本型文档直接跳过,不做页级图片质量检测。
适用检测的主要是:
- PDF 扫描件
- 图片型案卷
- 转 PDF 后包含大量扫描页的 doc/docx/wps
不适合检测的纯文本类文档,直接标记为 skipped。
3.3 结果分档
仍保留三档结果,便于后续扩展:
pass:通过review:疑似模糊,待人工确认reject:不通过,建议重拍
前端展示文案建议直接对应:
通过疑似模糊建议重拍
4. 定位策略
这次不做“定位到哪张图片”,只做“定位到第几页”。
也就是说:
- PDF:直接逐页检测
- 图片:按单页处理
- doc/docx/wps:统一先转为稳定的页级 PDF,再逐页检测
最后只返回页码列表,例如:
pages=[2,5,8]warningText=第2页、第5页、第8页疑似模糊
这样实现最稳,也最符合你现在已经确认的需求收口。
5. 当前仓库的落点
按目前仓库结构,模块建议挂在 fastapi_leaudit 下,和当前评查链路平行存在。
当前新增代码落点如下:
fastapi_modules/fastapi_leaudit/domian/vo/pageQualityVo.pyfastapi_modules/fastapi_leaudit/services/pageQualityService.pyfastapi_modules/fastapi_leaudit/services/impl/pageQualityServiceImpl.pyfastapi_modules/fastapi_leaudit/controllers/pageQualityController.pyfastapi_modules/fastapi_leaudit/page_quality/tasks.pyfastapi_modules/fastapi_leaudit/page_quality/runner.pyscripts/创建sql/schema_add_page_quality_module.sqlscripts/创建sql/seed_page_quality_permissions.sqlscripts/创建sql/seed_page_quality_routes.sql
6. 当前实现方案
6.1 数据表
当前方案只保留两张表,足够支撑第一版:
leaudit_page_quality_runs
- 记录一次文档级检测任务
- 保存任务状态、总页数、问题页统计、摘要状态
leaudit_page_quality_results
- 记录每一页的检测结果
- 每页只保留一条结果
这版不新增图片明细表,不做图级索引。
6.2 Service 职责
PageQualityServiceImpl
DispatchForDocument- 创建 run
- 投递 Celery 异步任务
ExecuteRun- 读取文件
- 转为页级图片
- 逐页检测
- 落库结果
- 汇总文档级状态
GetDocumentSummary- 返回文档的页级检测摘要
GetDocumentDetail- 返回页级问题页详情
RecheckDocument- 手工重跑
6.3 Controller 路由
当前建议保留 3 个接口:
GET /documents/{DocumentId}/page-quality/summaryGET /documents/{DocumentId}/page-qualityPOST /documents/{DocumentId}/page-quality/recheck
这样够前端做:
- 列表轻提示
- 详情展开
- 手工重检
6.4 Celery 任务链路
当前任务入口:
leaudit.page_quality.process_document
队列配置:
LEAUDIT_PAGE_QUALITY_QUEUE_NORMALLEAUDIT_PAGE_QUALITY_QUEUE_URGENT
它和当前 OCR / 评查队列分开,避免互相影响。
7. 与现有 DocumentService 的集成方式
按当前项目代码风格,集成点放在 DocumentServiceImpl。
7.1 上传成功后自动触发
接入点:
DocumentServiceImpl.Upload
处理方式:
- 文档主文件落库成功后
- 使用
try/except异步投递页级质量检测 - 失败只记日志,不抛阻断异常
7.2 补充附件后重跑
接入点:
DocumentServiceImpl.AppendAttachments
处理方式:
- 附件写入完成后
- 触发一次
Force=True的重跑任务 - 仍然不影响主链路返回
7.3 文档接口回填摘要
当前需要在这些返回对象上挂页级质量摘要字段:
DocumentUploadVODocumentListItemVODocumentStatusItemVODocumentDetailVO
建议统一补这些字段:
pageQualityRunIdpageQualityRunStatuspageQualitySummaryStatuspageQualityIssueCountpageQualityWarningText
详情页额外补:
pageQualitySummary
8. 页级检测执行逻辑
8.1 输入统一
统一转成“按页检测”的输入:
pageNumpageImageBytes
这样后面的检测器不关心文件来源,只关心这一页图像本身。
8.2 文件处理策略
建议如下:
pdf:直接渲染每页png/jpg/jpeg/bmp/tiff/webp:按 1 页处理doc/docx/wps:先转 PDF,再逐页渲染
8.3 并发策略
第一版可以做“页级并发”,但不建议过度并发。
建议原则:
- 只在单文档内部做有限并发
- 队列级别仍由 Celery 控制
- 优先保证稳定,不追求极限吞吐
8.4 检测结果汇总
汇总规则固定如下:
- 只要有
reject页,文档摘要状态就是reject - 否则只要有
review页,文档摘要状态就是review - 否则是
pass
页码列表只展示 review/reject 页。
9. 前端改造建议
这次前端不要做复杂交互,保持轻量。
9.1 列表页
增加一个“图片质量”状态展示位:
通过疑似模糊建议重拍
如果已有问题页,hover 或轻提示展示:
第2页、第5页疑似模糊
9.2 详情页
增加一个“图片质量预警”卡片即可。
卡片内容只展示:
- 状态
- 问题页数
- 页码提示文案
- 手工重检按钮
第一版不要做跳图,不要做页内图片定位。
9.3 上传完成提示
上传返回里如果已经拿到 run 信息,可以轻提示:
图片质量检测中
等异步任务完成后,再通过详情或列表刷新展示结果。
10. 第一版不做的内容
明确不纳入本次版本:
- 图片级定位
- 第几张图模糊
- OCR visual_manifest 细粒度关联
- 页内坐标框
- 图片裁剪回显
- 基于模糊结果阻断上传
- 基于模糊结果阻断评查
- 基于模糊结果自动退件
11. 当前版本的实现价值
这一版的好处很明确:
- 复杂度大幅降低
- 能快速上线验证业务价值
- 不改现有 OCR / 评查主链核心逻辑
- 前后端联调成本低
- 后续如果业务真要升级,再往图级定位扩展也有落点
12. 最终结论
按当前仓库和你已经确认的需求,最合适的落地方案就是:
- 独立页级图片质量检测模块
- 只做页码级模糊预警
- 异步执行
- 不阻断主流程
- 列表页和详情页只展示“第几页疑似模糊 / 建议重拍”
这就是第一版最稳、最省、最适合推进开发的模块计划。