zbparse/flask_app/routes/little_zbparse.py

115 lines
4.0 KiB
Python
Raw 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.

# flask_app/routes/little_zbparse.py
import json
import os
from flask import Blueprint, g
from flask_app.ConnectionLimiter import require_connection_limit
from flask_app.general.format_change import download_file
from flask_app.routes.小解析main import little_parse_main
from flask_app.routes.utils import validate_and_setup_logger, create_response_normal, log_error_unique_id
little_zbparse_bp = Blueprint('little_zbparse', __name__)
@little_zbparse_bp.route('/little_zbparse', methods=['POST'])
@validate_and_setup_logger
@require_connection_limit(timeout=300)
def little_zbparse(): #小解析
logger = g.logger
file_url = g.file_url
zb_type = g.zb_type
unique_id = g.unique_id
try:
logger.info(f"Starting parsing URL: {file_url}")
final_json_path = download_and_process_file(file_url, zb_type)
if not final_json_path:
logger.error("错误的招标文件类型或者文件类型或者下载地址不存在!")
log_error_unique_id(unique_id,2)
return create_response_normal(
message='错误的招标文件类型或者文件类型或者下载地址不存在!',
status='error',
data=''
)
response = generate_response(final_json_path)
return response
except Exception as e:
logger.error(f'内部服务器错误: {e}')
log_error_unique_id(unique_id,2)
return create_response_normal(
message='内部服务器错误',
status='error',
data=''
)
def download_and_process_file(file_url, zb_type):
"""
下载并处理文件,根据 zb_type 选择处理函数。
参数:
file_url (str): 文件的 URL 地址。
zb_type (int): 标的类型1 表示工程标2 表示货物标。
返回:
str or None: 处理后的文件路径,或在失败时返回 None。
"""
logger = g.logger
output_folder = g.output_folder
unique_id = g.unique_id
filename = "ztbfile"
downloaded_filename = os.path.join(output_folder, filename)
if zb_type not in [1, 2, 3]:
logger.error(f"无效的 zb_type: {zb_type}. 期望 zb_type: 1、2 或 3")
log_error_unique_id(unique_id, 2) # 假设这是一个用于记录错误的函数
return None # 返回 None 以指示失败
# 映射 zb_type如果是 3 则映射为 2
mapped_zb_type = 2 if zb_type == 3 else zb_type
downloaded_filepath, file_type = download_file(file_url, downloaded_filename,True)
if downloaded_filepath is None or file_type == 4:
return None
logger.info(f"Local file path: {downloaded_filepath}")
processed_file_path = little_parse_main(output_folder, downloaded_filepath, file_type, mapped_zb_type, g.unique_id)
return processed_file_path
def generate_response(final_json_path):
"""
生成最终的成功响应或错误响应。
参数:
final_json_path (str): 处理后的 JSON 文件路径。
返回:
tuple: Flask 响应对象和状态码。
"""
logger = g.logger
unique_id = g.unique_id # 获取 unique_id
if not os.path.exists(final_json_path):
logger.error(f'final_json 未找到!: {final_json_path}')
log_error_unique_id(unique_id, 2)
return create_response_normal(
message='final_json not found',
status='error',
data=''
)
try:
with open(final_json_path, 'r', encoding='utf-8') as f:
zbparse_data = json.load(f)
json_str = json.dumps(zbparse_data, ensure_ascii=False)
except Exception as e:
logger.error(f'Error reading or parsing final_json: {e}')
log_error_unique_id(unique_id, 2)
return create_response_normal(
message='Error processing final_json.',
status='error',
data=''
)
return create_response_normal(
message='Little Parse processed successfully',
status='success',
data=json_str
)