# CLAUDE.md - 益选 OCR 订单处理系统 ## 项目概述 益选 OCR 订单处理系统 (orc-order-v2) 是一个面向零售与分销场景的采购单处理工具。 **核心流程**: 图片 OCR → Excel 规范化 → 模板填充 → 合并导出 **目标系统**: 银豹 (PosPal) POS 系统 **技术栈**: Python 3.9+, Tkinter, Pandas, Baidu OCR API, xlrd/xlwt/openpyxl ## 项目结构 ``` orc-order-v2/ ├── 启动器.py # 入口桩 (~13行, 仅导入 main) ├── headless_api.py # CLI 自动化接口 (OpenClaw 对接) ├── build_exe.py # PyInstaller 打包脚本 ├── config.ini # 全局配置 (API密钥、路径) ├── config/ │ ├── config.ini # 配置副本 │ ├── barcode_mappings.json # 条码映射规则 │ └── suppliers_config.json # 供应商配置 (列映射/清洗规则/计算规则) ├── app/ │ ├── config/ │ │ ├── settings.py # ConfigManager 单例 │ │ └── defaults.py # 默认配置 │ ├── core/ │ │ ├── excel/ │ │ │ ├── processor.py # ExcelProcessor - 标准化转换核心 │ │ │ ├── converter.py # UnitConverter - 单位转换与规格推断 │ │ │ ├── merger.py # PurchaseOrderMerger - 采购单合并 │ │ │ ├── validators.py # ProductValidator │ │ │ └── handlers/ # 条码映射、单位转换处理器 │ │ ├── handlers/ │ │ │ ├── rule_engine.py # 通用规则引擎 (split/extract/normalize/mark) │ │ │ ├── column_mapper.py # 列映射器 │ │ │ ├── data_cleaner.py # 数据清洗器 │ │ │ └── calculator.py # 计算器 │ │ ├── ocr/ │ │ │ ├── table_ocr.py # OCRProcessor │ │ │ └── baidu_ocr.py # BaiduOCRClient │ │ ├── processors/ │ │ │ ├── base.py # BaseProcessor 抽象基类 │ │ │ ├── tobacco_processor.py │ │ │ ├── ocr_processor.py │ │ │ └── supplier_processors/ │ │ │ └── generic_supplier_processor.py │ │ └── utils/ │ │ ├── file_utils.py # 文件操作工具 │ │ ├── log_utils.py # 日志工具 │ │ ├── string_utils.py # 字符串工具 │ │ └── dialog_utils.py # Tkinter 对话框工具 │ ├── services/ │ │ ├── order_service.py # 订单服务 (智能路由分发) │ │ ├── ocr_service.py # OCR 服务 │ │ ├── processor_service.py # 处理器调度服务 │ │ ├── tobacco_service.py # 烟草公司专用服务 │ │ └── special_suppliers_service.py # 特殊供应商服务 (蓉城/杨碧月) │ └── ui/ # GUI 模块 (从启动器.py拆分) │ ├── error_utils.py # L0 错误对话框 │ ├── theme.py # L0 主题管理 (THEMES, create_modern_button) │ ├── logging_ui.py # L0 日志队列与GUI日志处理器 │ ├── ui_widgets.py # L0 StatusBar, ProgressReporter, center_window │ ├── user_settings.py # L1 用户设置与最近文件管理 │ ├── result_previews.py # L1 处理结果预览对话框 │ ├── command_runner.py # L1 命令执行器 (subprocess + 日志重定向) │ ├── file_operations.py # L2 文件选择/清理/目录操作 │ ├── action_handlers.py # L2 业务操作 (OCR/Excel/合并/拖拽) │ ├── barcode_editor.py # L2 条码映射编辑 │ ├── config_dialog.py # L3 系统设置对话框 │ ├── shortcuts.py # L3 键盘快捷键绑定 │ └── main_window.py # L4 main() 主窗口构建 ├── templates/ │ ├── 银豹-采购单模板.xls # 输出模板 │ └── 商品资料.xlsx # 单价校验参考数据 ├── data/ │ ├── input/ # 输入文件 │ ├── output/ # OCR 输出 │ ├── result/ # 最终采购单 │ └── user_settings.json # 用户设置 └── docs/ └── SYSTEM_ARCHITECTURE.md # 系统架构文档 ``` ## 命令与运行 ```bash # GUI 模式 python 启动器.py # CLI 模式 (OpenClaw 对接) python headless_api.py [input] [--excel|--tobacco|--rongcheng] [--barcode X --target Y] # 打包 EXE python build_exe.py # 条码映射更新 python headless_api.py --update-mapping --barcode 6920584471055 --target 6920584471017 ``` ## 供应商智能识别逻辑 系统通过扫描 Excel 前 50 行内容特征自动路由: | 供应商 | 识别特征 | 预处理逻辑 | |--------|----------|-----------| | 烟草公司 | "专卖证号" 或 "510109104938" | B/E/G/H 列映射, 数量*10, 单价/10 | | 蓉城易购 | "RCDH" | E/N/Q/S 列映射, 多条码分裂均分数量 | | 杨碧月 | "经手人" + "杨碧月" | 列对齐, 单位转换 (件→瓶) | | 通用供应商 | suppliers_config.json 配置 | 列映射 + 规则引擎 | ## 配置系统 - **ConfigManager** (`app/config/settings.py`): 单例模式, 基于 configparser 读取 `config.ini` - **供应商配置** (`config/suppliers_config.json`): JSON 格式, 定义列映射/清洗规则/计算规则 - **条码映射** (`config/barcode_mappings.json`): 运行时可更新的条码转换规则 ## 关键约定 ### 输出格式 - 银豹采购单模板: 4 列 — 条码(B), 采购量(C), 赠送量(D), 采购单价(E) - 单价保留 4 位小数, 使用 xlwt.XFStyle - 采购单文件名: `采购单_{原文件名}.xls` ### 单位转换规则 - "件"/"箱"/"提"/"盒" → 数量*包装数量, 单价/包装数量, 单位→"瓶" - 赠品: 价格为 0 或金额为 0 的行标记为赠品 - 条码映射优先于单位转换 ### 规格推断 - 从商品名称推断: "24入纸箱" → 1*24, "450g*15" → 1*15 - 支持三级规格: 1*5*12 - OCR 修正: "IL" → "1L", "6oo" → "600" ## 已知技术债务 1. ~~**启动器.py 过大**~~ (已拆分为 13 个 `app/ui/` 模块, 入口桩仅 13 行) 2. **代码重复**: 表头识别、列映射、金额解析在多处重复实现 3. **配置不统一**: config.ini + suppliers_config.json + 硬编码路径混用 4. **无测试**: 测试目录为空, 无自动化测试 5. **旧格式依赖**: xlrd/xlwt 仅支持 .xls, 不支持 .xlsx 写入 6. **API 密钥明文**: config.ini 中百度 OCR API 密钥未加密 7. **路径硬编码**: config.ini 中 `template_folder = E:\2025Code\python\orc-order-v2\templates` 8. **日志不统一**: 混用 `get_logger()` 和 `logging.getLogger()`