orc-order-v2/README.md

323 lines
12 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.1
- **发布日期**: 2025-05-07
- **作者**: OCR订单处理团队
## 功能特点
- **图像OCR识别**支持对采购单图片进行OCR识别并生成Excel文件
- **Excel数据处理**读取OCR识别的Excel文件并提取商品信息
- **采购单生成**按照模板格式生成标准采购单Excel文件
- **采购单合并**:支持多个采购单合并为一个总单
- **批量处理**:支持批量处理多张图片
- **图形界面**:提供简洁直观的图形界面,方便操作
- **命令行支持**:支持命令行方式调用,便于自动化处理
## 系统架构
### 目录结构
```
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
```
## 使用方法
### 图形界面
运行`启动器.py`启动图形界面:
```bash
python 启动器.py
```
图形界面包括以下功能:
- **处理单个文件**:选择并处理单个图片文件
- **批量处理**处理data/input目录中的所有图片文件
- **合并处理**:合并多个采购单
- **清理文件**清理input和output目录中的文件
- **查看日志**:实时显示处理日志
### 命令行模式
```bash
# 处理单个文件
python run.py --file=image.jpg
# 批量处理目录中的所有文件
python run.py --batch
# 合并采购单
python run.py --merge
```
## 单位处理规则
系统支持多种单位的智能处理,自动识别和转换不同的计量单位。单位处理逻辑如下:
### 标准单位处理
| 单位 | 处理规则 | 示例 |
|------|----------|------|
| 件 | 数量×包装数量<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.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或联系开发者。