# OCR订单处理系统 v1.0 基于百度OCR API的订单处理系统,用于识别采购订单图片并生成Excel采购单。 ## 版本信息 - **当前版本**: v1.5 - **发布日期**: 2025-05-09 - **作者**: OCR订单处理团队 ## 功能特点 - **图像OCR识别**:支持对采购单图片进行OCR识别并生成Excel文件 - **Excel数据处理**:读取OCR识别的Excel文件并提取商品信息 - **采购单生成**:按照模板格式生成标准采购单Excel文件 - **采购单合并**:支持多个采购单合并为一个总单 - **批量处理**:支持批量处理多张图片 - **图形界面**:提供简洁直观的图形界面,方便操作 - **命令行支持**:支持命令行方式调用,便于自动化处理 - **OCR识别**: 支持图片中表格的自动识别和提取 - **Excel处理**: 将OCR识别结果处理为规范的Excel表格 - **订单合并**: 将多个采购单自动合并为一个总表 - **完整流程**: 一键执行从OCR识别到订单合并的完整处理流程 - **烟草订单处理**: 专门处理烟草公司特定格式的订单明细文件,生成银豹采购单 ## 系统架构 ### 目录结构 ``` orc-order-v2/ │ ├── app/ # 应用主目录 │ ├── config/ # 配置目录 │ │ ├── settings.py # 配置管理 │ │ └── defaults.py # 默认配置值 │ │ │ ├── core/ # 核心功能 │ │ ├── ocr/ # OCR相关功能 │ │ │ ├── baidu_ocr.py # 百度OCR接口 │ │ │ └── table_ocr.py # 表格OCR处理 │ │ │ │ │ ├── excel/ # Excel处理 │ │ │ ├── processor.py # Excel处理核心 │ │ │ ├── merger.py # 订单合并功能 │ │ │ └── converter.py # 单位转换与规格处理 │ │ │ │ │ └── utils/ # 工具函数 │ │ ├── file_utils.py # 文件处理工具 │ │ └── log_utils.py # 日志工具 │ │ │ └── services/ # 服务层 │ ├── ocr_service.py # OCR服务 │ └── excel_service.py # Excel处理服务 │ ├── data/ # 数据目录 │ ├── input/ # 输入图片目录 │ ├── output/ # 处理结果输出目录 │ ├── temp/ # 临时文件目录 │ └── backup/ # 备份目录 │ ├── logs/ # 日志目录 │ ├── templates/ # 模板目录 │ └── 银豹-采购单模板.xls # Excel模板文件 │ ├── config.ini # 配置文件 ├── run.py # 命令行入口脚本 ├── 启动器.py # 图形界面启动器 └── README.md # 项目说明文档 ``` ## 安装与配置 ### 环境要求 - Python 3.8+ - 百度OCR API账号及密钥 ### 安装依赖 ```bash pip install -r requirements.txt ``` ### 配置文件 在`config.ini`中配置以下信息: ```ini [OCR] api_key = 你的百度OCR API Key secret_key = 你的百度OCR Secret Key [Paths] input_folder = data/input output_folder = data/output template_file = templates/银豹-采购单模板.xls ``` ## 使用方法 1. **启动系统** - 双击运行 `启动器.py` 文件,启动图形界面 - 或者通过命令行运行 `python run.py <命令> [选项]` 2. **图形界面操作** - **处理Excel文件**: 处理指定的Excel文件或最新的Excel文件 - **OCR批量识别**: 批量处理input目录下的所有图片 - **完整处理流程**: 一键执行OCR识别、Excel处理和订单合并 - **处理单个图片**: 处理指定的单张图片 - **合并采购单**: 合并多个采购单为一个总表 - **处理烟草订单**: 处理烟草公司特定格式的订单明细文件,生成银豹采购单格式 - **整理项目文件**: 整理项目文件结构 - **清除处理缓存**: 清除处理缓存,使系统重新处理所有文件 - **清理文件**: 清理所有数据文件 - **切换主题**: 在浅色和深色主题之间切换 ## 命令行使用 系统支持通过命令行操作,基本用法: ``` python run.py <命令> [选项] ``` 支持的命令: 1. **ocr**: OCR识别 ``` python run.py ocr [--input 图片路径] [--batch] [--batch-size 批大小] [--max-workers 最大线程数] ``` 2. **excel**: Excel处理 ``` python run.py excel [--input Excel文件路径] ``` 3. **merge**: 订单合并 ``` python run.py merge [--input 采购单文件路径列表,以逗号分隔] ``` 4. **pipeline**: 完整流程 ``` python run.py pipeline [--input 图片路径] ``` 5. **tobacco**: 烟草订单处理 ``` python run.py tobacco [--input 烟草订单明细文件路径] ``` ## 单位处理规则 系统支持多种单位的智能处理,自动识别和转换不同的计量单位。单位处理逻辑如下: ### 标准单位处理 | 单位 | 处理规则 | 示例 | |------|----------|------| | 件 | 数量×包装数量
单价÷包装数量
单位转换为"瓶" | 1件(规格1*12) → 12瓶
单价108元/件 → 9元/瓶 | | 箱 | 数量×包装数量
单价÷包装数量
单位转换为"瓶" | 2箱(规格1*24) → 48瓶
单价120元/箱 → 5元/瓶 | | 包 | 保持原数量和单位不变 | 3包 → 3包 | | 其他单位 | 保持原数量和单位不变 | 5瓶 → 5瓶 | ### 单位自动推断规则 系统能够在缺少单位信息时,根据规格和其他信息自动推断单位: 1. 当单位为空,并且同时具备以下条件时: - 有商品编码 - 有规格信息 - 有数量信息 - 有单价信息 - 规格符合容量*数量格式(如"500ml*15"、"1L*12"等)或简单的数量*数量格式(如"1*12") 系统会: - 自动将单位设置为"件" - 然后按照件的处理规则进行转换 示例: - 商品编码: 6954767400129 - 名称: 美汁源果粒橙1.8L*8瓶 - 规格: 1.8L*8 - 数量: 1 - 单价: 65 - 单位: (空) 处理后: - 单位被推断为"件" - 数量: 1 * 8 = 8 - 单价: 65 / 8 = 8.125 - 单位: 瓶 ### 提和盒单位特殊处理 系统对"提"和"盒"单位有特殊的处理逻辑: 1. 当规格是三级格式(如1*5*12)时: - 按照件的计算方式处理 - 数量 = 原始数量 × 包装数量 - 单位转换为"瓶" - 单价 = 原始单价 ÷ 包装数量 示例:3提(规格1*5*12) → 36瓶 2. 当规格是二级格式(如1*16)时: - **保持原数量不变** - **保持原单位不变** 示例:3提(规格1*16) → 仍然是3提 ### 特殊条码处理 系统支持对特定条码进行特殊处理,这些条码的处理规则会覆盖上述的标准单位处理规则: 1. 特殊条码配置: ```python special_barcodes = { '6925019900087': { 'multiplier': 10, # 数量乘以10 'target_unit': '瓶', # 目标单位 'description': '特殊处理:数量*10,单位转换为瓶' }, # 条码映射配置 '6920584471055': { 'map_to': '6920584471017', # 映射到新条码 'description': '条码映射:6920584471055 -> 6920584471017' } # 可以添加更多特殊条码的配置 } ``` 2. 条码映射规则: - 当遇到特定条码时,自动将其映射为对应的目标条码 - 条码映射完成后,会继续按照标准单位处理规则处理数量和单价的转换 - 如果映射的条码单位是"件"或"箱",会按照件/箱的规则展开处理 - 系统内置的条码映射规则包括: 1. 6920584471055 → 6920584471017 2. 6925861571159 → 69021824 3. 6923644268923 → 6923644268480 3. 其他特殊处理规则: - 当遇到特殊条码时,无论规格是二级还是三级 - 无论单位是提还是盒还是件 - 都按照特殊条码配置进行处理 - 数量乘以配置的倍数 - 单位转换为配置的目标单位 - 如果有单价,单价除以配置的倍数 ## 智能规格推断 当规格信息为空时,系统能从商品名称自动推断规格: 1. 匹配"xx入"格式: - 如"445水溶C血橙15入纸箱" → 规格推断为 1*15 2. 匹配直接包含规格的格式: - 如"500-东方树叶-绿茶1*15-纸箱装" → 规格推断为 1*15 3. 匹配容量格式: - 如"12.9L桶装水" → 规格推断为 12.9L*1 4. 其他商品命名模式: - 如"900树叶茉莉花茶12入纸箱" → 规格推断为 1*12 - 如"500茶π蜜桃乌龙15纸箱" → 规格推断为 1*15 ## 注意事项 1. 确保输入文件格式正确,支持jpg、png等图片格式 2. 处理结果将输出到data/output目录下 3. 定期清理临时文件和日志文件 4. 及时更新百度OCR API密钥 5. 为避免数据丢失,可使用清理功能前的备份选项 ## 错误排查 - **OCR识别失败**:检查API密钥是否正确,图片是否符合要求 - **Excel处理失败**:检查OCR识别结果是否包含必要的列(条码、数量、单价等) - **模板填充错误**:确保模板文件存在且格式正确 ## 开发说明 如需进行二次开发或扩展功能,请参考以下说明: 1. 核心逻辑位于`app/core`目录 2. 添加新功能建议遵循已有的模块化结构 3. 使用`app/services`目录中的服务类调用核心功能 4. 日志记录已集成到各模块,便于调试 ## 许可证 MIT License ## 更新日志 ### v1.5 (2025-05-09) #### 功能改进 - 烟草订单处理结果展示:改进烟草订单处理完成后的结果展示界面 - 美化结果 展示界面,显示订单时间、总金额和处理条目数 - 添加文件信息展示,包括文件大小和创建时间 - 提供打开文件、打开所在文件夹等便捷操作按钮 - 统一与Excel处理结果展示风格,提升用户体验 - 增强结果文件路径解析能力,确保正确找到并显示结果文件 - 条码映射编辑功能: - 添加图形化条码映射编辑工具,方便管理条码映射和特殊处理规则 - 支持添加、修改和删除条码映射关系 - 支持配置特殊处理规则,如乘数、目标单位、固定单价等 - 自动保存到配置文件,便于后续使用 #### 问题修复 - 修复烟草订单处理时出现双重弹窗问题 - 修复烟草订单处理完成后结果展示弹窗无法正常显示的问题 - 修复ConfigParser兼容性问题,支持标准ConfigParser对象 - 修复百度OCR客户端中getint方法调用不兼容问题 - 修复OCRService中缺少batch_process方法的问题,确保OCR功能正常工作 - 改进日志管理,确保所有日志正确关闭 - 优化UI界面,统一按钮样式 - 修复启动器中处理烟草订单按钮的显示样式 - 修复run.py中close_logger调用缺少参数的问题 #### 代码改进 - 改进TobaccoService类对配置的处理方式,使用标准get方法 - 添加fallback机制以增强配置健壮性 - 优化启动器中结果预览逻辑,避免重复弹窗 - 统一UI组件风格,提升用户体验 - 增强错误处理,提供更清晰的错误信息 ### v1.4 (2025-05-09) #### 新功能 - 烟草订单处理:新增烟草公司特定格式订单明细文件处理功能 - 支持自动处理标准烟草订单明细格式 - 根据烟草公司"盒码"作为条码生成银豹采购单 - 自动将"订单量"转换为"采购量"并计算采购单价 - 处理结果以银豹采购单格式保存,方便直接导入 #### 功能优化 - 配置兼容性:优化配置处理逻辑,兼容标准ConfigParser对象 - 启动器优化:启动器界面增加"处理烟草订单"功能按钮 - 代码结构优化:将烟草订单处理功能模块化,集成到整体服务架构 ### v1.3 (2025-07-20) #### 功能优化 - 采购单赠品处理逻辑优化:修改了银豹采购单中赠品的处理方式 - ~~之前:赠品数量单独填写在"赠送量"列,与正常采购量分开处理~~ - ~~现在:将赠品数量合并到采购量中,赠送量列留空~~ - ~~有正常商品且有赠品的情况:采购量 = 正常商品数量 + 赠品数量,单价 = 原单价 × 正常商品数量 ÷ 总数量~~ - ~~只有赠品的情况:采购量填写赠品数量,单价为0~~ - 更新说明:经用户反馈,赠品处理逻辑已还原为原始方式,正常商品数量和赠品数量分开填写 ### v1.2 (2025-07-15) #### 功能优化 - 规格提取优化:改进了从商品名称中提取规格的逻辑,优先识别"容量*数量"格式 - 例如从"美汁源果粒橙1.8L*8瓶"能准确提取"1.8L*8"而非错误的"1.8L*1" - 规格解析增强:优化`parse_specification`方法,能正确解析"1.8L*8"格式规格,确保准确提取包装数量 - 单位推断增强:在`extract_product_info`方法中增加新逻辑,当单位为空且有条码、规格、数量、单价时,根据规格格式(如容量*数量格式或简单数量*数量格式)自动推断单位为"件" - 件单位处理优化:确保当设置单位为"件"时,正确触发UnitConverter单位处理逻辑,将数量乘以包装数量,单价除以包装数量,单位转为"瓶" - 整体改进:提高了系统处理复杂格式商品名称和规格的能力,使单位转换更加准确可靠 - 规格提取逻辑修正:修复了在Excel中已有规格信息时仍会从商品名称推断规格的问题,现在系统会优先使用Excel中的数据,只有在规格为空时才尝试从商品名称推断 ### v1.1 (2025-05-07) #### 功能更新 - 单位自动推断:当单位为空但有商品编码、规格、数量、单价等信息,且规格符合容量*数量格式时,自动将单位设置为"件"并按照件的处理规则进行转换 - 规格解析优化:改进对容量*数量格式规格的解析,如"1.8L*8"能正确识别包装数量为8 - 规格提取增强:从商品名称中提取"容量*数量"格式的规格时,能正确识别如"美汁源果粒橙1.8L*8瓶"中的"1.8L*8"部分 - 条码映射功能:增加特定条码的自动映射功能,支持将特定条码自动转换为指定的目标条码 - 6920584471055 → 6920584471017 - 6925861571159 → 69021824 - 6923644268923 → 6923644268480 - 条码映射后会继续按照件/箱等单位的标准处理规则进行数量和单价的转换 ### v1.0 (2025-05-02) #### 主要功能 - 图像OCR识别:支持对采购单图片进行OCR识别并生成Excel文件 - Excel数据处理:智能处理Excel文件,提取和转换商品信息 - 采购单生成:按照模板格式生成标准采购单Excel文件 - 采购单合并:支持多个采购单合并为一个总单 - 图形界面:提供简洁直观的操作界面 - 命令行支持:支持命令行调用,方便自动化处理 #### 技术改进 - 模块化架构:重构代码为配置、核心功能、服务和CLI等模块 - 单位智能处理:完善的单位转换规则,支持多种计量单位 - 规格智能推断:从商品名称自动推断规格信息 - 日志管理:完善的日志记录系统,支持终端和GUI同步显示 - 表头智能识别:自动识别Excel中的表头位置,兼容多种格式 - 改进用户体验:界面优化,批量处理支持,实时状态反馈 ## 联系方式 如有问题,请提交Issue或联系开发者。