orc-order-v2/run.py
houhuan 4a8169ff63 ## v1.5.3 (2024-03-21)
- 优化了完整流程处理逻辑:
  - 修改了OCR处理逻辑,当遇到已处理的图片时自动跳过并继续执行
  - 改进了错误处理,避免因图片已处理而中断流程
  - 优化了日志提示信息,提供更清晰的处理状态反馈
- 改进了OCRService的process_image方法:
  - 添加了文件存在性检查
  - 添加了文件类型验证
  - 添加了已处理文件检查
  - 优化了错误处理和日志记录
2025-05-10 12:58:28 +08:00

206 lines
7.2 KiB
Python
Raw Permalink 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.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
OCR订单处理系统 - 主入口
---------------------
提供命令行接口整合OCR识别、Excel处理和订单合并功能。
"""
import os
import sys
import argparse
from typing import List, Optional
from app.config.settings import ConfigManager
from app.core.utils.log_utils import get_logger, close_all_loggers, set_log_level
from app.services.ocr_service import OCRService
from app.services.order_service import OrderService
from app.services.tobacco_service import TobaccoService
logger = get_logger(__name__)
def parse_args():
"""
解析命令行参数
Returns:
解析后的参数
"""
parser = argparse.ArgumentParser(description='OCR订单处理系统')
# 通用选项
parser.add_argument('--config', type=str, help='配置文件路径')
parser.add_argument('--log-level', type=str, choices=['debug', 'info', 'warning', 'error', 'critical'], help='日志级别')
# 子命令
subparsers = parser.add_subparsers(dest='command', help='子命令')
# OCR识别命令
ocr_parser = subparsers.add_parser('ocr', help='OCR识别')
ocr_parser.add_argument('--input', type=str, help='输入图片路径')
ocr_parser.add_argument('--batch', action='store_true', help='批量处理')
ocr_parser.add_argument('--batch-size', type=int, default=5, help='批处理大小')
ocr_parser.add_argument('--max-workers', type=int, default=4, help='最大线程数')
# Excel处理命令
excel_parser = subparsers.add_parser('excel', help='Excel处理')
excel_parser.add_argument('--input', type=str, help='输入Excel文件路径')
# 合并命令
merge_parser = subparsers.add_parser('merge', help='合并采购单')
merge_parser.add_argument('--input', type=str, help='输入采购单文件路径(逗号分隔)')
# 完整流程命令
pipeline_parser = subparsers.add_parser('pipeline', help='完整处理流程')
pipeline_parser.add_argument('--input', type=str, help='输入图片路径')
pipeline_parser.add_argument('--merge', action='store_true', help='是否合并采购单')
# 烟草订单处理
tobacco_parser = subparsers.add_parser('tobacco', help='处理烟草订单')
tobacco_parser.add_argument('--input', type=str, help='输入订单明细文件路径')
# 解析参数
parsed_args = parser.parse_args()
return parsed_args
def main():
"""
主函数入口
Returns:
退出码
"""
# 解析命令行参数
args = parse_args()
if not args.command:
argparse.ArgumentParser().print_help()
return 1
# 加载配置
config_path = args.config
config_manager = ConfigManager(config_path)
config = config_manager.config
# 设置日志级别
log_level = getattr(args, 'log_level', None)
if log_level:
set_log_level(log_level)
try:
if args.command == 'ocr':
# OCR识别处理
ocr_service = OCRService(config)
if args.batch:
# 批量处理
total, success = ocr_service.batch_process(
batch_size=args.batch_size,
max_workers=args.max_workers
)
return 0 if success > 0 else 1
else:
# 处理单个文件
result = ocr_service.process_image(args.input)
return 0 if result else 1
elif args.command == 'excel':
# Excel处理
order_service = OrderService(config)
if args.input:
# 处理指定文件
result = order_service.process_excel(args.input)
else:
# 处理最新文件
result = order_service.process_excel()
return 0 if result else 1
elif args.command == 'merge':
# 合并采购单
order_service = OrderService(config)
if args.input:
# 合并指定文件
file_list = args.input.split(',')
result = order_service.merge_purchase_orders(file_list)
else:
# 合并所有采购单
result = order_service.merge_all_purchase_orders()
return 0 if result else 1
elif args.command == 'pipeline':
# 完整流程
ocr_service = OCRService(config)
order_service = OrderService(config)
# 1. OCR处理
if args.input:
# 处理单个文件
excel_file = ocr_service.process_image(args.input)
else:
# 批量处理
total, success = ocr_service.batch_process()
if total == 0:
logger.warning("没有找到需要处理的图片")
elif success == 0:
logger.warning("OCR处理没有成功处理任何新文件")
excel_file = None # 批量处理不返回具体文件
# 2. Excel处理
if excel_file:
# 处理指定的Excel文件
result = order_service.process_excel(excel_file)
else:
# 处理最新的Excel文件
result = order_service.process_excel()
if not result:
logger.error("Excel处理失败")
return 1
# 3. 合并采购单(可选)
if args.merge:
result = order_service.merge_all_purchase_orders()
if not result:
logger.warning("合并采购单失败")
# 不影响整体流程,继续执行
return 0
elif args.command == 'tobacco':
# 烟草订单处理
tobacco_service = TobaccoService(config)
if args.input:
# 处理指定文件
logger.info(f"开始处理烟草订单,输入文件: {args.input}")
result = tobacco_service.process_tobacco_order(args.input)
else:
# 处理最新文件
logger.info("开始烟草公司订单处理")
result = tobacco_service.process_tobacco_order()
# 检查结果是否为None
if result is None:
logger.error("烟草订单处理失败")
return 1
else:
logger.info(f"烟草订单处理成功,输出文件: {result}")
# 确保result是绝对路径
if not os.path.isabs(result):
result = os.path.abspath(result)
logger.info(f"烟草订单处理完成,绝对路径: {result}")
return 0
else:
logger.error(f"未知命令: {args.command}")
return 1
except Exception as e:
logger.error(f"执行过程中发生错误: {e}", exc_info=True)
return 1
finally:
# 关闭所有日志记录器
close_all_loggers()
if __name__ == "__main__":
sys.exit(main())