orc-order-v2/README.md

398 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 烟草订单明细文件路径]
```
## 单位处理规则
系统支持多种单位的智能处理,自动识别和转换不同的计量单位。单位处理逻辑如下:
### 标准单位处理
| 单位 | 处理规则 | 示例 |
|------|----------|------|
| 件 | 数量×包装数量<br>单价÷包装数量<br>单位转换为"瓶" | 1件(规格1*12) → 12瓶<br>单价108元/件 → 9元/瓶 |
| 箱 | 数量×包装数量<br>单价÷包装数量<br>单位转换为"瓶" | 2箱(规格1*24) → 48瓶<br>单价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或联系开发者。