# 益选 OCR 订单处理系统

## 概览
- 面向零售与分销场景的采购单处理工具，支持图片 OCR → Excel 规范化 → 模板填充 → 合并导出全流程
- 通过供应商管理与规则引擎，适配不同供应商的格式差异（数量含单位、名称包含规格、缺失列补齐）
- 提供验证匹配面板与单价校验机制，确保输出与既定模板一致且价格合理

## 核心功能
- 图片/Excel处理：拖拽或选择文件，生成银豹采购单（`templates/银豹-采购单模板.xls`）
- **无界面自动化接口** (headless_api.py)：支持与 OpenClaw 等自动化平台对接。
  - `python headless_api.py [图片路径]`：处理指定图片。
  - `python headless_api.py`：自动处理 `data/input` 目录下最新的图片。
  - 输出：成功时在标准输出打印最终 Excel 的绝对路径，失败时在标准错误打印错误信息。
- 供应商管理（系统设置 → 供应商管理）：
  - 基本信息、文件名匹配、表头行号
  - 列映射与表头：预览前30行、表头选行、加载列、智能映射、导入/导出
  - 规则与词典：忽略词、单位同义词、包装倍数、名称正则、默认单位/包装；规则预设与步骤预览（原始→逐步→规范化）；导出预览CSV
  - 模板管理：模板列表与当前索引，批量校验报告
- 验证匹配面板（系统设置 → 验证匹配）：
  - 选择原始Excel与期望结果，运行当前流程自动对比差异并生成建议（数量拆分、单位归一、名称提规格、金额回推）
  - 一键应用建议写回供应商配置与词典，减少手动调整
- 单价校验：生成采购单后按条码比对 `templates/商品资料.xlsx` 的“进货价（必填）”；价差大于1元弹窗提示，小于等于1元不打扰

## 关键适配（蓉城易购）
- 新模板（如“订单1765440157955.xlsx”）：
  - 使用第三行作为表头（`header=2`）
  - 关键词选列并重命名到期望字段：商品条码（小条码）、订购数量（小单位）、单价（小单位)、优惠后金额（小单位）、单位
  - 单位优先匹配“单位（订购单位）”列，清洗为去空白并将“件”替换为“份”
  - 多条码行（逗号/顿号/斜杠/空格分隔）拆分为多行，数量均分并重算金额，单位保持订购单位
  - 新模板映射：将“优惠后金额（小单位）”作为单价，“出库小计(元)”作为金额来源

## 使用说明
1. 运行程序（EXE或源码运行）
2. 在主界面：
   - 拖拽或选择图片/Excel进行处理
   - 系统设置 → 供应商管理：配置供应商、列映射与规则；使用规则预览查看规范化效果
   - 系统设置 → 验证匹配：选择原始与期望文件，差异对比；应用建议后重载配置
3. 处理成功后，采购单保存到 `data/output` 或 `data/result`，最近文件列表可双击打开查看

## 构建与打包
- 依赖：Python 3.9+，虚拟环境建议
- 安装打包工具：`pip install pyinstaller`
- 运行打包脚本：`python build_exe.py`
  - 生成 EXE：`dist/OCR订单处理系统.exe`
  - 生成便携包：`release/OCR订单处理系统.exe`（包含 `templates/银豹-采购单模板.xls` 与 `templates/商品资料.xlsx`）

## Git 提交建议
- 建议忽略构建目录与运行输出（见 `.gitignore`）
- 保留模板与配置：`templates/银豹-采购单模板.xls`、`templates/商品资料.xlsx`、`config/config.ini`、`config/barcode_mappings.json`

## 常见问题
- 表头识别失败：在供应商管理的“列映射与表头”页预览表头行并选择正确行号
- 数量含单位：启用 `split_quantity_unit` 与 `normalize_unit` 规则并配置单位同义词与包装倍数
- 名称中规格：配置 `ignore_words` 与 `name_patterns`，使用步骤预览确认解析效果
- 单价校验未提示：确认 `templates/商品资料.xlsx` 存在且列名包含“进货价”与条码列（`商品条码/条码/barcode`）

## 变更记录（近期）
- 新增验证匹配面板与建议修复
- 规则预设与步骤预览（原始→逐步→规范化）
- 单价校验机制（价差>1元提示）
- 蓉城易购新模板适配（第三行表头、单位（订购单位）、多条码拆分、金额映射）

