# 文档图片质量校验模块定制开发计划

## 1. 目标收口

本次版本只做“页码级模糊预警”，不做图片级定位。

系统最终只需要给出这类提示：

- `第3页疑似模糊`
- `第2页、第5页疑似模糊`
- `第4页建议重拍`

不需要输出：

- 第几张图片
- 图片框选位置
- bbox
- 裁剪图回显
- OCR 图块级关联

这次方案的核心原则只有两条：

- 只做预警，不阻断主流程
- 只做到页码，不追求图级精确定位

## 2. 与当前 OCR / 评查链路的关系

本模块必须独立于当前 OCR 抽取、评查流程之外。

现有主流程保持不变：

1. 用户上传文档
2. 文档进入 OCR / 抽取 / 评查 pipeline
3. 系统继续正常落库、展示、评查

新增流程只是一条旁路异步任务：

1. 文档上传成功
2. 异步投递“页级图片质量检测任务”
3. 后台生成页码级预警结果
4. 前端在列表页、详情页显示提示

明确约束：

- 图片质量检测失败，不影响上传
- 图片质量检测超时，不影响 OCR
- 图片质量检测发现模糊页，不影响评查
- 整个模块只作为 warning，不参与主流程 gate

## 3. 检测范围与判定结果

### 3.1 启用策略

建议保留三层控制：

- 全局总开关
- 文档类型维度开关
- 地区维度开关

判定顺序：

1. 先看全局总开关
2. 再看文档类型是否命中
3. 再看地区是否命中

只要任一环节不命中，就直接跳过。

### 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.py`
- `fastapi_modules/fastapi_leaudit/services/pageQualityService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/pageQualityServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/controllers/pageQualityController.py`
- `fastapi_modules/fastapi_leaudit/page_quality/tasks.py`
- `fastapi_modules/fastapi_leaudit/page_quality/runner.py`
- `scripts/创建sql/schema_add_page_quality_module.sql`
- `scripts/创建sql/seed_page_quality_permissions.sql`
- `scripts/创建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/summary`
- `GET /documents/{DocumentId}/page-quality`
- `POST /documents/{DocumentId}/page-quality/recheck`

这样够前端做：

- 列表轻提示
- 详情展开
- 手工重检

### 6.4 Celery 任务链路

当前任务入口：

- `leaudit.page_quality.process_document`

队列配置：

- `LEAUDIT_PAGE_QUALITY_QUEUE_NORMAL`
- `LEAUDIT_PAGE_QUALITY_QUEUE_URGENT`

它和当前 OCR / 评查队列分开，避免互相影响。

## 7. 与现有 DocumentService 的集成方式

按当前项目代码风格，集成点放在 `DocumentServiceImpl`。

### 7.1 上传成功后自动触发

接入点：

- `DocumentServiceImpl.Upload`

处理方式：

- 文档主文件落库成功后
- 使用 `try/except` 异步投递页级质量检测
- 失败只记日志，不抛阻断异常

### 7.2 补充附件后重跑

接入点：

- `DocumentServiceImpl.AppendAttachments`

处理方式：

- 附件写入完成后
- 触发一次 `Force=True` 的重跑任务
- 仍然不影响主链路返回

### 7.3 文档接口回填摘要

当前需要在这些返回对象上挂页级质量摘要字段：

- `DocumentUploadVO`
- `DocumentListItemVO`
- `DocumentStatusItemVO`
- `DocumentDetailVO`

建议统一补这些字段：

- `pageQualityRunId`
- `pageQualityRunStatus`
- `pageQualitySummaryStatus`
- `pageQualityIssueCount`
- `pageQualityWarningText`

详情页额外补：

- `pageQualitySummary`

## 8. 页级检测执行逻辑

### 8.1 输入统一

统一转成“按页检测”的输入：

- `pageNum`
- `pageImageBytes`

这样后面的检测器不关心文件来源，只关心这一页图像本身。

### 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. 最终结论

按当前仓库和你已经确认的需求，最合适的落地方案就是：

- 独立页级图片质量检测模块
- 只做页码级模糊预警
- 异步执行
- 不阻断主流程
- 列表页和详情页只展示“第几页疑似模糊 / 建议重拍”

这就是第一版最稳、最省、最适合推进开发的模块计划。
