106 lines
3.7 KiB
Markdown
106 lines
3.7 KiB
Markdown
# TASK — 订单批量识别(OCR 元信息提取 + 批量一键处理)
|
||
|
||
## 任务依赖图
|
||
|
||
```mermaid
|
||
graph TD
|
||
T1[任务1: metadata_extractor] --> T4[任务4: order_service 集成]
|
||
T2[任务2: order_metadata 表] --> T4
|
||
T3[任务3: OCR meta.json 落盘] --> T4
|
||
T4 --> T5[任务5: 文件命名 + 重命名原图]
|
||
T5 --> T6[任务6: processor_service 批量入口]
|
||
T6 --> T7[任务7: UI 一键处理按钮 + 进度]
|
||
T1 --> T8[任务8: 单元测试]
|
||
T2 --> T8
|
||
```
|
||
|
||
## 原子任务列表
|
||
|
||
### 任务 1:metadata_extractor.py
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | ocr_text (str)、ocr_rows (list[list[str]]) |
|
||
| 输出契约 | OrderMetadata(supplier, bill_date, total_amount, raw_supplier_text) |
|
||
| 实现约束 | 供应商关键词清单 + 启发式;日期正则;金额关键词 |
|
||
| 验收标准 | 单元测试覆盖:完整三字段、部分缺失、OCR 噪声、日期格式 4 种 |
|
||
| 依赖 | 无 |
|
||
|
||
### 任务 2:order_metadata 表 + CRUD
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | ProductDatabase 实例 |
|
||
| 输出契约 | save_order_metadata / get_order_metadata / list_all_metadata |
|
||
| 实现约束 | 建表 IF NOT EXISTS;幂等 save(PK = file_hash) |
|
||
| 验收标准 | 测试创建/查询/更新/列出 |
|
||
| 依赖 | 无 |
|
||
|
||
### 任务 3:OCR meta.json 落盘
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | OCRService.process_image 返回的 (excel_path, raw_text) |
|
||
| 输出契约 | data/output/{hash}.meta.json 含 ocr_text |
|
||
| 实现约束 | 修改 table_ocr.py 返回原始 text;OCRService 调用方写 meta.json |
|
||
| 验收标准 | OCR 一次后 meta.json 存在且含完整 text |
|
||
| 依赖 | 无 |
|
||
|
||
### 任务 4:order_service.process_excel 集成元信息
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | excel_path |
|
||
| 输出契约 | (new_result_path, metadata) |
|
||
| 实现约束 | 读 meta.json → extract → save → 应用新 result 文件名 |
|
||
| 验收标准 | 跑真实 OCR 文件后 result 文件名符合新规则 |
|
||
| 依赖 | T1、T2、T3 |
|
||
|
||
### 任务 5:原图重命名
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | (原图路径, metadata, file_hash) |
|
||
| 输出契约 | 新图路径(已重命名) |
|
||
| 实现约束 | 保留扩展名;清理非法字符;冲突加 _N |
|
||
| 验收标准 | 处理后 input 中文件名带日期/供应商/hash |
|
||
| 依赖 | T4 |
|
||
|
||
### 任务 6:processor_service.process_all_inputs
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | 无 |
|
||
| 输出契约 | dict(total, success, failed, results) |
|
||
| 实现约束 | 扫描 data/input/ 全部图片;串行;现有 processed_files.json 不重做 |
|
||
| 验收标准 | input 放 3 张图 → 处理后 results 长度=3;status 准确 |
|
||
| 依赖 | T4、T5 |
|
||
|
||
### 任务 7:UI 一键处理按钮 + 进度
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | UI 按钮点击事件 |
|
||
| 输出契约 | 进度对话框 + 主窗口日志更新 + 完成 MessageBox |
|
||
| 实现约束 | 后台线程 + UI 通信用 queue;进度不可关闭 |
|
||
| 验收标准 | 点击按钮 → 进度可见 → 完成有汇总 |
|
||
| 依赖 | T6 |
|
||
|
||
### 任务 8:单元测试
|
||
| 项 | 内容 |
|
||
|---|---|
|
||
| 输入契约 | 测试用例集 |
|
||
| 输出契约 | 191 + 新测试 全部 pass |
|
||
| 实现约束 | tests/test_metadata_extractor.py;tests/test_order_metadata.py |
|
||
| 验收标准 | `pytest tests/` 全绿 |
|
||
| 依赖 | T1、T2 |
|
||
|
||
## 工作量评估
|
||
|
||
- T1:30 分钟(算法 + 10 个测试用例)
|
||
- T2:15 分钟
|
||
- T3:20 分钟
|
||
- T4:30 分钟
|
||
- T5:20 分钟
|
||
- T6:30 分钟
|
||
- T7:40 分钟(UI 线程)
|
||
- T8:30 分钟
|
||
- 测试与集成:30 分钟
|
||
|
||
## 交付物
|
||
- 8 个原子任务全部通过
|
||
- `docs/订单批量识别/FINAL_订单批量识别.md`:项目总结
|
||
- `docs/订单批量识别/TODO_订单批量识别.md`:待办清单 |