zbparse/flask_app/routes/get_deviation.py

77 lines
3.6 KiB
Python
Raw Permalink Normal View History

# flask_app/routes/get_deviation.py
2024-12-03 09:58:50 +08:00
from flask import Blueprint, jsonify, Response, g
import json
import os
2024-12-05 15:01:37 +08:00
from flask_app.general.format_change import download_file
2024-12-16 13:56:28 +08:00
from flask_app.routes.偏离表main import get_tech_and_business_deviation
2024-12-03 09:58:50 +08:00
from flask_app.routes.utils import generate_deviation_response, validate_and_setup_logger
2024-11-25 16:04:53 +08:00
from flask_app.ConnectionLimiter import require_connection_limit
get_deviation_bp = Blueprint('get_deviation', __name__)
@get_deviation_bp.route('/get_deviation', methods=['POST'])
2024-11-26 11:32:24 +08:00
@validate_and_setup_logger
2024-12-02 14:06:01 +08:00
@require_connection_limit(timeout=720)
def get_deviation():
logger = g.logger
unique_id = g.unique_id
2024-12-02 11:10:49 +08:00
file_url = g.file_url
zb_type = g.zb_type
try:
logger.info("开始解析 URL: " + file_url)
if zb_type != 2:
logger.error(f"无效的 zb_type: {zb_type}. 期望 zb_type: 2")
return jsonify({
'error': 'Invalid zb_type',
'message': '此端点仅支持 zb_type 2 (采购需求)'
}), 400
else:
tech_deviation, tech_star_deviation, business_deviation, business_star_deviation, zigefuhe_deviation = download_and_process_file_for_deviation(
file_url, unique_id)
if tech_deviation is None:
return jsonify({'error': 'File processing failed'}), 500
tech_deviation_response, tech_deviation_star_response, zigefuhe_deviation_response, shangwu_deviation_response, shangwu_star_deviation_response = generate_deviation_response(
tech_deviation, tech_star_deviation, business_deviation, business_star_deviation, zigefuhe_deviation,
logger)
final_response = {
'message': 'processed successfully',
'filename': 'END',
'data': 'END'
}
def generate():
yield f"data: {json.dumps(tech_deviation_response, ensure_ascii=False)}\n\n"
yield f"data: {json.dumps(tech_deviation_star_response, ensure_ascii=False)}\n\n"
yield f"data: {json.dumps(zigefuhe_deviation_response, ensure_ascii=False)}\n\n"
yield f"data: {json.dumps(shangwu_deviation_response, ensure_ascii=False)}\n\n"
yield f"data: {json.dumps(shangwu_star_deviation_response, ensure_ascii=False)}\n\n"
yield f"data: {json.dumps(final_response, ensure_ascii=False)}\n\n"
2024-12-02 14:36:21 +08:00
return Response(generate(), mimetype='text/event-stream')
except Exception as e:
logger.error('发生异常: ' + str(e))
return jsonify({'error': str(e)}), 500
def download_and_process_file_for_deviation(file_url, unique_id):
"""
下载并处理采购需求文件
参数:
file_url (str): 文件的URL地址
返回:
tuple: (tech_deviation, tech_star_deviation, business_deviation, business_star_deviation, zigefuhe_deviation)
"""
logger = g.logger
output_folder = g.output_folder
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("Unsupported file type or failed to download file")
return None, None, None, None, None
logger.info("Local file path: " + downloaded_filepath)
tech_deviation, tech_star_deviation, business_deviation, business_star_deviation, zigefuhe_deviation = get_tech_and_business_deviation(
downloaded_filepath, file_type, unique_id, output_folder)
return tech_deviation, tech_star_deviation, business_deviation, business_star_deviation, zigefuhe_deviation