#!/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())