backup: 价格bug修复 + 订单批量识别设计文档

This commit is contained in:
2026-07-19 16:17:12 +08:00
parent 968a6f8d22
commit cc66448327
6 changed files with 473 additions and 35 deletions
@@ -0,0 +1,81 @@
# ALIGNMENT — 订单批量识别(OCR 元信息提取 + 批量一键处理)
## 一、目标
完善 OCR → result 完整链路,新增 3 个能力:
1. **OCR 元信息识别与持久化**:从图片 OCR 原文识别供应商、单据日期、应付金额,存 SQLite
2. **基于元信息的文件命名**result 文件 + 原图片按"采购单_YYYYMMDD_供应商_<hash>.xls"格式命名
3. **批量一键处理**:扫描 `data/input/` 内所有图片,批量跑完整流程,每张独立出 result(默认不合并)
## 二、需求边界(已与用户确认)
### 必做
- OCR 后从原始 OCR 文本识别 3 个字段:
- **供应商名称**:从 OCR 文本顶部识别(关键词:供货/供应/酒行/商行/批发等,取匹配行原文)
- **单据日期**:从 OCR 文本识别(关键词:日期/单据日期/年月日;正则提取 YYYY-MM-DD / YYYY/MM/DD / YYYY.MM.DD / YYYYMMDD 等多种格式)
- **总金额**:取"应付金额/实付金额/金额合计"字段;如无则取"总计"行最大金额
- 三个字段存到新增 SQLite 表 `order_metadata`(与现有 `product_cache.db` 共用文件)
- result 文件名格式:`采购单_{YYYYMMDD}_{供应商名}_{原文件hash}.xls`
- 原图片(input 目录)重命名为:`原名_{YYYYMMDD}_{供应商名}_{hash}.{原扩展名}`(保留扩展名,hash 不变)
- 批量处理:`data/input/` 内全部图片 → OCR → process_excel → result;输出 `data/result/采购单_*.xls`
- 完整流程跑完,日志末尾显示 3 个参数汇总(按文件列出供应商/日期/金额 + 成功/失败状态)
- 三个字段任一识别失败 → 填"未知",文件后缀仍含原 hash 保证唯一性
### 不做
- 不修改现有 fill_template 模板
- 不改商品资料库 / 条码映射 / 单位转换逻辑
- 不合并多个订单为单个 result(用户明确"默认全部不合并")
- 不做供应商库匹配(图片原文识别优先)
- 不做 OCR 失败重试机制增强(沿用现有 OCRService.process_image
### 已确认决策
| 决策点 | 选择 |
|---|---|
| 供应商识别来源 | OCR 原文顶部文本(关键词匹配) |
| 总金额字段 | 应付金额/实付/金额合计,缺则取总计行最大金额 |
| 日期格式 | YYYYMMDD 作文件名后缀 |
| 识别失败默认值 | "未知供应商" + 原 hash |
| Result 输出位置 | `data/result/`(不分子目录) |
## 三、对现有项目的影响
### 需要修改的文件
- `app/core/ocr/table_ocr.py` 或新增 `app/core/ocr/metadata_extractor.py`:识别 3 个字段
- `app/core/db/product_db.py`:新增 `order_metadata` 表及 CRUD
- `app/services/order_service.py`:在 process_excel 流程里提取元信息 + 落库 + 应用新文件名
- `app/ui/main_window.py` / `action_handlers.py`:新增"批量处理"按钮 + 进度条 + 完成后日志汇总
- `app/services/processor_service.py`:新增批量入口 `process_all_inputs`
### 新增文件
- `app/core/ocr/metadata_extractor.py`:单据元信息识别器
- `tests/test_metadata_extractor.py`:单元测试
### 不需要修改
- 模板、银豹格式、单位转换、记忆库核心逻辑
## 四、验收标准
### 功能验收
- [ ] OCR 后能识别出供应商/日期/应付金额(真实单子样本)
- [ ] 三个字段存到 `data/product_cache.db``order_metadata`
- [ ] result 文件名 = `采购单_YYYYMMDD_供应商_<hash>.xls`
- [ ] 原图片在 input 中按相同规则重命名(保留扩展名)
- [ ] 一键处理按钮能扫描 `data/input/` 全部图片,串行处理(避免并发占资源)
- [ ] 完整流程跑完,日志显示每张的处理结果 + 3 个参数 + 状态
- [ ] 全部 191 个现有测试不破坏
### 边界验收
- [ ] 三个字段都识别不到时,使用"未知"+原 hash
- [ ] 部分识别失败,文件名仍包含原 hash 保证唯一性
- [ ] `data/input/` 为空时,按钮点击给出"无待处理图片"提示
## 五、不确定点(已澄清或可后续处理)
- **OCR 文本顶部区域范围**:取 OCR 返回的前 20 行文本(覆盖常见采购单抬头区域),如有"供应商"明确标注则取该标注
- **日期格式多样性**:正则同时支持 4 种格式,标准化为 YYYYMMDD
- **并发处理**:本期串行(10 张单子每张 1~2 秒,串行 10~20 秒可接受);并发留待后续
- **历史 result 重命名**:本期**不**迁移历史 result(避免破坏现有用户数据)
## 六、后续文档
- DESIGN_订单批量识别.md(架构设计)
- TASK_订单批量识别.md(任务拆分)