205 lines
7.1 KiB
Python
205 lines
7.1 KiB
Python
#!/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_latest_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 success == 0:
|
||
logger.error("OCR处理失败,没有成功处理任何文件")
|
||
return 1
|
||
excel_file = None # 批量处理不返回具体文件
|
||
|
||
# 2. Excel处理
|
||
if excel_file:
|
||
# 处理指定的Excel文件
|
||
result = order_service.process_excel(excel_file)
|
||
else:
|
||
# 处理最新的Excel文件
|
||
result = order_service.process_latest_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()) |