323 lines
12 KiB
Markdown
323 lines
12 KiB
Markdown
# 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或联系开发者。 |