| .. | ||
| input | ||
| logs | ||
| output | ||
| templets | ||
| .gitignore | ||
| baidu_ocr.py | ||
| baidu_table_ocr.py | ||
| clean_files.py | ||
| clean_logs.py | ||
| excel_processor_step2.py | ||
| merge_purchase_orders.py | ||
| README.md | ||
| requirements.txt | ||
| run_ocr.py | ||
| test_ocr_log.py | ||
| test_unit_conversion.py | ||
OCR订单处理系统
这是一个基于OCR技术的订单处理系统,用于自动识别和处理Excel格式的订单文件。系统支持多种格式的订单处理,包括普通订单和赠品订单的处理。
主要功能
-
OCR识别
- 支持图片和PDF文件的文字识别
- 支持表格结构识别
- 支持多种格式的订单识别
-
Excel处理
- 自动处理订单数据
- 支持赠品订单处理
- 自动提取商品规格和数量信息
- 从商品名称智能推断规格信息
- 从数量字段提取单位信息
- 支持多种格式的订单合并
-
日志管理
- 自动记录处理过程
- 支持日志文件压缩
- 自动清理过期日志
- 日志文件自动重建
- 支持日志大小限制
- 活跃日志文件保护机制
-
文件管理
- 自动备份清理的文件
- 支持按时间和模式清理文件
- 文件统计和状态查看
- 支持输入输出目录的独立管理
系统要求
- Python 3.8+
- Windows 10/11
安装说明
- 克隆项目到本地:
git clone [项目地址]
cd orc-order
- 安装依赖:
pip install -r requirements.txt
- 配置百度OCR API:
- 在百度AI开放平台注册账号
- 创建OCR应用并获取API Key和Secret Key
- 将密钥信息填入
config.ini文件
使用说明
1. OCR处理流程
- 运行OCR识别:
python run_ocr.py [输入文件路径]
- 使用百度OCR API:
python baidu_ocr.py [输入文件路径]
- 处理表格OCR:
python baidu_table_ocr.py [输入文件路径]
2. Excel处理
python excel_processor_step2.py [输入Excel文件路径]
或者不指定输入文件,自动处理output目录中最新的Excel文件:
python excel_processor_step2.py
2.1 Excel处理逻辑说明
-
列名识别与映射:
- 系统首先检查是否存在直接匹配的列(如"商品条码"列)
- 如果没有,系统会尝试将多种可能的列名映射到标准列名
- 支持特殊表头格式处理(如基本条码、仓库全名等)
-
条码识别与处理:
- 验证条码格式(确保长度在8-13位之间)
- 对特定的错误条码进行修正(如5开头改为6开头)
- 识别特殊条码(如"5321545613")
- 跳过条码为"仓库"或"仓库全名"的行
-
智能规格推断:
- 当规格信息为空时,从商品名称自动推断规格
- 支持多种商品命名模式:
- 445水溶C血橙15入纸箱 → 规格推断为 1*15
- 500-东方树叶-绿茶115-纸箱装 → 规格推断为 115
- 12.9L桶装水 → 规格推断为 12.9L*1
- 900树叶茉莉花茶12入纸箱 → 规格推断为 1*12
- 500茶π蜜桃乌龙15纸箱 → 规格推断为 1*15
-
单位自动提取:
- 当单位信息为空时,从数量字段中自动提取单位
- 支持格式:2箱、5桶、3件、10瓶等
- 自动分离数字和单位部分
-
赠品识别:
- 通过以下条件识别赠品:
- 商品单价为0或为空
- 商品金额为0或为空
- 单价非有效数字
- 通过以下条件识别赠品:
-
数据合并与处理:
- 对同一条码的多个正常商品记录,累加数量
- 对同一条码的多个赠品记录,累加赠品数量
- 如果同一条码有不同单价,取平均值
3. 订单合并
merge_purchase_orders.py是专门用来合并多个采购单Excel文件的工具,可以高效处理多份采购单并去重。
3.1 基本用法
自动合并output目录下的所有采购单文件(以"采购单_"开头的Excel文件):
python merge_purchase_orders.py
指定要合并的特定文件:
python merge_purchase_orders.py --input "output/采购单_1.xls,output/采购单_2.xls"
3.2 合并逻辑说明
-
数据识别与映射:
- 自动识别Excel文件中的列名(支持多种表头格式)
- 将不同格式的列名映射到标准列名(如"条码"、"条码(必填)"等)
- 支持特殊表头结构的处理(如表头在第3行的情况)
-
相同商品的处理:
- 自动检测相同条码和单价的商品
- 对相同商品进行数量累加处理
- 保持商品名称、条码和单价不变
-
赠送量的处理:
- 自动检测和处理赠送量
- 对相同商品的赠送量进行累加
- 当原始文件中赠送量为空时,合并后保持为空(不显示为0)
-
数据格式保持:
- 保持条码的原始格式(不转换为小数)
- 单价保持四位小数格式
- 避免"nan"值的显示,空值保持为空
4. 单位处理规则(核心规则)
系统支持多种单位的智能处理,能够自动识别和转换不同的计量单位。所有开发必须严格遵循以下规则处理单位转换。
4.1 标准单位处理
| 单位 | 处理规则 | 示例 |
|---|---|---|
| 件 | 数量×包装数量 单价÷包装数量 单位转换为"瓶" |
1件(规格1*12) → 12瓶 单价108元/件 → 9元/瓶 |
| 箱 | 数量×包装数量 单价÷包装数量 单位转换为"瓶" |
2箱(规格1*24) → 48瓶 单价120元/箱 → 5元/瓶 |
| 包 | 保持原数量和单位不变 | 3包 → 3包 |
| 其他单位 | 保持原数量和单位不变 | 5瓶 → 5瓶 |
4.2 提和盒单位特殊处理
系统对"提"和"盒"单位有特殊的处理逻辑:
-
当规格是三级格式(如1512)时:
- 按照件的计算方式处理
- 数量 = 原始数量 × 包装数量
- 单位转换为"瓶"
- 单价 = 原始单价 ÷ 包装数量
示例:3提(规格1512) → 36瓶
-
当规格是二级格式(如1*16)时:
- 保持原数量不变
- 保持原单位不变
示例:3提(规格1*16) → 仍然是3提
4.3 特殊条码处理
系统支持对特定条码进行特殊处理,这些条码的处理规则会覆盖上述的标准单位处理规则:
-
特殊条码配置:
special_barcodes = { '6925019900087': { 'multiplier': 10, # 数量乘以10 'target_unit': '瓶', # 目标单位 'description': '特殊处理:数量*10,单位转换为瓶' } # 可以添加更多特殊条码的配置 } -
处理规则:
- 当遇到特殊条码时,无论规格是二级还是三级
- 无论单位是提还是盒还是件
- 都按照特殊条码配置进行处理
- 数量乘以配置的倍数
- 单位转换为配置的目标单位
- 如果有单价,单价除以配置的倍数
-
添加新的特殊条码的正确方法:
- 在
ExcelProcessorStep2类的__init__方法中的special_barcodes字典中添加新的配置 - 每个特殊条码需要配置:
multiplier: 数量乘以的倍数target_unit: 转换后的目标单位description: 处理规则的描述
- 在
-
注意事项:
- 特殊条码处理优先级高于标准单位处理
- 添加新的特殊条码前,需要确认该条码是否真的需要特殊处理,或者可以使用现有的标准规则
- 如果商品单位是"件"且有规格信息,应首先考虑使用标准的"件"单位处理规则
-
示例:
- 条码6925019900087,单位为"副",原始数量为2:
- 无论规格如何
- 最终数量 = 2 * 10 = 20,单位为"瓶"
- 如原单价为50元/副,则转换后为5元/瓶
- 条码6925019900087,单位为"副",原始数量为2:
5. 开发注意事项
-
遵循原有处理逻辑:
- 在进行任何修改前,必须理解并遵循现有的单位处理逻辑
- 对于"件"单位,必须按照"数量×包装数量"进行处理
- 对于"提"和"盒"单位,必须检查规格是二级还是三级格式,按相应规则处理
-
添加特殊条码处理:
- 只有在明确确认某条码无法使用现有规则处理的情况下,才添加特殊处理规则
- 添加特殊条码处理前,先咨询相关负责人确认处理逻辑
-
代码更改原则:
- 任何代码修改都不应破坏现有的处理逻辑
- 添加新功能时,先确保理解并保留现有功能
- 如需修改核心处理逻辑,必须详细记录变更并更新本文档
-
文档同步更新:
- 当修改代码逻辑时,必须同步更新README文档
- 确保文档准确反映当前系统的处理逻辑
- 记录所有特殊处理规则和条码
注意事项
- 确保输入文件格式正确
- 定期检查日志文件大小
- 及时更新百度OCR API密钥
- 建议定期备份重要数据
- 清理文件前先查看统计信息
- 重要文件建议手动备份后再清理
- 日志文件会自动重建,可以放心清理
- 规格推断功能适用于特定命名格式的商品
- 单位提取功能依赖于数量字段的格式
常见问题
-
OCR识别失败
- 检查图片质量
- 确认API密钥配置正确
- 查看日志文件了解详细错误信息
-
Excel处理错误
- 确认Excel文件格式正确
- 检查商品信息是否完整
- 查看处理日志了解具体错误
-
规格推断失败
- 检查商品名称是否符合支持的格式
- 尝试手动在Excel中填写规格信息
- 查看日志中的推断过程信息
-
单位提取失败
- 检查数量字段格式是否为"数字+单位"格式
- 确认数量字段没有额外的空格或特殊字符
- 尝试手动在Excel中填写单位信息
-
文件清理问题
- 清理前使用
--test参数预览要删除的文件 - 清理前检查文件统计信息
--stats - 对于重要文件,先使用
--test确认后再实际删除 - 对于被占用的文件,尝试关闭占用的程序后再清理
- Windows下某些文件无法删除时,可以使用
--force参数 - 日志文件清理时可以使用
--clean-all-logs参数
- 清理前使用
更新日志
v1.2.1 (2024-05-04)
- 新增日志文件活跃标记保护机制
- 修复OCR处理器日志文件被意外删除的问题
- 改进日志清理工具,避免删除活跃日志
- 优化文件清理逻辑
- 更新README文档
v1.2.0 (2024-05-03)
- 新增对"提"单位的支持(1提=10袋)
- 新增对三级规格格式(1510)的解析支持
- 优化单位转换逻辑
- 改进规格解析能力
v1.1.0 (2024-05-02)
- 新增从商品名称智能推断规格功能
- 新增从数量字段提取单位功能
- 优化赠品处理逻辑
- 修复缩进错误和代码问题
- 改进日志记录内容
v1.0.0 (2024-05-01)
- 初始版本发布
- 支持基本的OCR识别功能
- 支持Excel订单处理
- 支持日志管理功能
- 添加文件清理工具
- 优化文件命名和目录结构
- 完善日志自动重建功能
许可证
MIT License