# flask_app/routes/get_deviation.py from flask import Blueprint, Response, g import os from flask_app.general.format_change import download_file from flask_app.routes.偏离表main import get_tech_and_business_deviation from flask_app.routes.utils import generate_deviation_response, validate_and_setup_logger,create_response,sse_format from flask_app.ConnectionLimiter import require_connection_limit get_deviation_bp = Blueprint('get_deviation', __name__) @get_deviation_bp.route('/get_deviation', methods=['POST']) @validate_and_setup_logger @require_connection_limit(timeout=720) def get_deviation(): logger = g.logger unique_id = g.unique_id file_url = g.file_url zb_type = g.zb_type output_folder = g.output_folder def generate(): try: logger.info("call /get_deviation: 开始解析 URL: " + file_url) if zb_type not in [1, 2]: logger.error(f"无效的 zb_type: {zb_type}. 期望 zb_type: 1 或 2") response = create_response( message='此端点仅支持 zb_type 1 或 2', status='error', data='' ) yield sse_format(response) return # 终止生成器 # 直接下载并处理文件 filename = "ztbfile" downloaded_filename = os.path.join(output_folder, filename) # 下载文件 downloaded_filepath, file_type = download_file(file_url, downloaded_filename) if downloaded_filepath is None or file_type == 4: logger.error("下载地址不存在或不支持的文件类型!") response = create_response( message='下载地址不存在或不支持的文件类型!', status='error', data='' ) yield sse_format(response) return # 终止生成器 logger.info("Local file path: " + downloaded_filepath) # 处理文件 deviations = get_tech_and_business_deviation( downloaded_filepath, file_type, unique_id, output_folder, zb_type ) if deviations is None: logger.info(f"上传的文件非招标文件或文件内容不完整!") response = create_response( message='上传的文件非招标文件或文件内容不完整!', status='error', data='' ) yield sse_format(response) return # 终止生成器 # 解包返回值 (tech_deviation, tech_star_deviation, business_deviation, business_star_deviation, zigefuhe_deviation, proof_materials) = deviations # 生成偏差响应 tech_deviation_response, tech_deviation_star_response, zigefuhe_deviation_response, \ shangwu_deviation_response, shangwu_star_deviation_response, proof_materials_response = generate_deviation_response( tech_deviation, tech_star_deviation, business_deviation, business_star_deviation, zigefuhe_deviation, proof_materials, logger ) final_response = { 'message': 'processed successfully', 'status': 'success', 'data': 'END' } # 流式返回数据 yield sse_format(tech_deviation_response) yield sse_format(tech_deviation_star_response) yield sse_format(zigefuhe_deviation_response) yield sse_format(shangwu_deviation_response) yield sse_format(shangwu_star_deviation_response) yield sse_format(proof_materials_response) yield sse_format(final_response) except Exception as e: logger.error('发生异常: ' + str(e)) response = create_response( message=str(e), status='error', data='' ) yield sse_format(response) return Response(generate(), mimetype='text/event-stream')