# 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`：待办清单