zbparse/flask_app/routes/judge_zbfile.py

115 lines
4.0 KiB
Python
Raw Permalink Normal View History

2025-01-10 14:30:35 +08:00
import os
import threading
import time
from enum import Enum
from typing import Any
from flask import Blueprint, g
from flask_app.general.format_change import download_file
from flask_app.routes.判断是否是招标文件 import judge_zbfile_exec
from flask_app.routes.utils import validate_and_setup_logger, create_response_normal, log_error_unique_id
2025-01-10 14:30:35 +08:00
judge_zbfile_bp = Blueprint('judge_zbfile', __name__)
class JudgeResult(Enum):
ERROR = 1
YES = 2
NO = 3
@judge_zbfile_bp.route('/judge_zbfile', methods=['POST'])
@validate_and_setup_logger
2025-01-10 10:04:30 +08:00
# @require_connection_limit(timeout=30)
2025-02-07 15:27:24 +08:00
def judge_zbfile() -> Any: #判断是否是招标文件
2025-01-10 14:30:35 +08:00
"""
主函数调用 wrapper 并设置整个接口的超时时时间如果超时返回默认值
"""
logger = g.logger
file_url = g.file_url
output_folder = g.output_folder
unique_id = g.unique_id
2025-01-10 14:30:35 +08:00
result = [None] # 用于存储结果的可变对象
done = threading.Event() # 标志判断是否完成
def wrapper() -> None:
"""
包装整个 judge_zbfile 的函数逻辑
"""
try:
start_time = time.time()
downloaded_filename = os.path.join(output_folder, "ztbfile")
2025-01-10 17:38:55 +08:00
logger.info(f"接收到的url:{file_url}")
downloaded_filepath, file_type = download_file(file_url, downloaded_filename,True)
2025-01-10 14:30:35 +08:00
if not downloaded_filepath or file_type == 4:
logger.error("下载地址不存在或不支持的文件类型!")
log_error_unique_id(unique_id, 4)
2025-01-10 14:30:35 +08:00
result[0] = JudgeResult.ERROR
return
logger.info(f"Local file path: {downloaded_filepath}")
# 调用实际的判断函数
judge_result = judge_zbfile_exec(downloaded_filepath)
judge = JudgeResult.YES if judge_result else JudgeResult.NO
end_time = time.time()
logger.info(f"接口实际耗时:{end_time - start_time:.2f}")
result[0] = judge
except Exception as e:
logger.error(f'Exception occurred: {e}')
log_error_unique_id(unique_id, 4)
2025-01-10 14:30:35 +08:00
result[0] = JudgeResult.ERROR
finally:
done.set()
# 启动后台线程执行 wrapper
thread = threading.Thread(target=wrapper, daemon=True)
thread.start()
# ****设置整个接口的超时时间如果超时会默认返回create_response_normal但wrapper()仍继续执行!
timeout = 15
finished_in_time = done.wait(timeout)
if not finished_in_time:
logger.warning("整个接口执行超时,返回默认值 'yes'")
# 如果超时,返回默认响应
return create_response_normal(
message='判断是否为招标文件成功!',
status='success',
data='yes' # 默认返回值
)
else:
return build_response(result[0], logger)
def build_response(judge_result: JudgeResult, logger) -> Any:
"""
根据 judge_result 构建响应
"""
if judge_result == JudgeResult.ERROR:
logger.error("下载地址不存在或不支持的文件类型!")
return create_response_normal(
message='下载地址不存在或不支持的文件类型!',
status='error',
data=''
)
elif judge_result == JudgeResult.YES:
2025-01-13 11:27:52 +08:00
logger.info("判断是否为招标文件成功YES")
2025-01-10 14:30:35 +08:00
return create_response_normal(
message='判断是否为招标文件成功!',
status='success',
data='yes'
)
elif judge_result == JudgeResult.NO:
2025-01-13 11:27:52 +08:00
logger.info("判断是否为招标文件成功NO")
2025-01-10 14:30:35 +08:00
return create_response_normal(
message='判断是否为招标文件成功!',
status='success',
data='no'
)
else:
# 处理未知的结果
logger.error("服务器遇到不知名错误!")
return create_response_normal(
message='服务器遇到不知名错误!',
status='error',
data=''
)