2025-05-06 17:57:27 +08:00
|
|
|
|
from flask import Flask, request, jsonify, render_template
|
|
|
|
|
import subprocess
|
|
|
|
|
import sys
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
import os
|
|
|
|
|
import json
|
2025-05-12 13:50:21 +08:00
|
|
|
|
# 在server.py顶部添加
|
|
|
|
|
import pandas as pd
|
|
|
|
|
import logging
|
|
|
|
|
from logging.handlers import RotatingFileHandler
|
|
|
|
|
import time
|
|
|
|
|
|
2025-05-06 17:57:27 +08:00
|
|
|
|
app = Flask(__name__)
|
|
|
|
|
|
2025-05-12 13:50:21 +08:00
|
|
|
|
# 在Flask应用初始化后添加
|
|
|
|
|
@app.before_first_request
|
|
|
|
|
def load_batch_data():
|
|
|
|
|
# 读取批文Excel文件
|
|
|
|
|
batch_path = r'C:\Users\24011\Documents\WeChat Files\wxid_k4ep58f81rx421\FileStorage\File\2025-04\tuigua_huangjijingshi - 副本\tuigua_huangjijingshi - 副本\python1\批文.xlsx'
|
|
|
|
|
app.batch_data = pd.read_excel(batch_path)
|
|
|
|
|
|
|
|
|
|
# 在 Flask 应用初始化后添加日志配置
|
|
|
|
|
def setup_logging():
|
|
|
|
|
# 创建日志目录(如果不存在)
|
|
|
|
|
log_dir = os.path.join(os.path.dirname(__file__), 'logs')
|
|
|
|
|
os.makedirs(log_dir, exist_ok=True)
|
|
|
|
|
|
|
|
|
|
# 配置根日志
|
|
|
|
|
logging.basicConfig(
|
|
|
|
|
level=logging.INFO,
|
|
|
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
|
|
|
handlers=[
|
|
|
|
|
RotatingFileHandler(
|
|
|
|
|
os.path.join(log_dir, 'app.log'),
|
|
|
|
|
maxBytes=1024*1024*5, # 5MB
|
|
|
|
|
backupCount=5
|
|
|
|
|
),
|
|
|
|
|
logging.StreamHandler()
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 在应用初始化后调用
|
|
|
|
|
setup_logging()
|
|
|
|
|
logger = logging.getLogger(__name__)
|
2025-05-06 17:57:27 +08:00
|
|
|
|
@app.route('/')
|
|
|
|
|
def home():
|
|
|
|
|
return render_template('index.html')
|
|
|
|
|
|
|
|
|
|
@app.route('/calculate', methods=['POST'])
|
|
|
|
|
def calculate():
|
2025-05-12 13:50:21 +08:00
|
|
|
|
start_time = time.time()
|
|
|
|
|
logger.info("开始处理计算请求")
|
|
|
|
|
|
2025-05-06 17:57:27 +08:00
|
|
|
|
date_str = request.form.get('date')
|
2025-05-12 13:50:21 +08:00
|
|
|
|
time_str = request.form.get('time', '00:00:00')
|
2025-05-06 17:57:27 +08:00
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# 验证日期和时间格式
|
2025-05-12 13:50:21 +08:00
|
|
|
|
datetime.strptime(date_str, '%Y-%m-%d')
|
|
|
|
|
datetime.strptime(time_str, '%H:%M:%S')
|
2025-05-06 17:57:27 +08:00
|
|
|
|
datetime_str = f"{date_str} {time_str}"
|
|
|
|
|
|
|
|
|
|
api_path = os.path.join(os.path.dirname(__file__), 'API.py')
|
2025-05-12 13:50:21 +08:00
|
|
|
|
logger.info(f"准备调用API.py,参数: {datetime_str}")
|
|
|
|
|
|
|
|
|
|
api_start = time.time()
|
2025-05-06 17:57:27 +08:00
|
|
|
|
result = subprocess.run(
|
|
|
|
|
[sys.executable, api_path, datetime_str],
|
|
|
|
|
capture_output=True,
|
2025-05-12 13:50:21 +08:00
|
|
|
|
text=True,
|
2025-05-06 17:57:27 +08:00
|
|
|
|
check=True
|
|
|
|
|
)
|
2025-05-12 13:50:21 +08:00
|
|
|
|
api_time = time.time() - api_start
|
|
|
|
|
logger.info(f"API.py执行完成,耗时: {api_time:.2f}秒")
|
2025-05-06 17:57:27 +08:00
|
|
|
|
|
2025-05-12 13:50:21 +08:00
|
|
|
|
logger.debug("=== API.py 原始输出 ===")
|
|
|
|
|
logger.debug(f"stdout: {result.stdout[:200]}...") # 只记录前200字符
|
|
|
|
|
logger.debug(f"stderr: {result.stderr[:200]}...")
|
2025-05-06 17:57:27 +08:00
|
|
|
|
|
|
|
|
|
try:
|
2025-05-12 13:50:21 +08:00
|
|
|
|
json_start = time.time()
|
2025-05-06 17:57:27 +08:00
|
|
|
|
json_output = json.loads(result.stdout)
|
2025-05-12 13:50:21 +08:00
|
|
|
|
json_time = time.time() - json_start
|
|
|
|
|
logger.info(f"JSON解析完成,耗时: {json_time:.2f}秒")
|
|
|
|
|
|
|
|
|
|
total_time = time.time() - start_time
|
|
|
|
|
logger.info(f"请求处理完成,总耗时: {total_time:.2f}秒")
|
2025-05-06 17:57:27 +08:00
|
|
|
|
return jsonify({'success': True, 'result': json_output})
|
2025-05-12 13:50:21 +08:00
|
|
|
|
|
2025-05-06 17:57:27 +08:00
|
|
|
|
except json.JSONDecodeError as e:
|
2025-05-12 13:50:21 +08:00
|
|
|
|
error_msg = f'JSON解析失败: {str(e)}'
|
|
|
|
|
logger.error(error_msg)
|
|
|
|
|
logger.error(f"原始输出: {result.stdout[:500]}")
|
2025-05-06 17:57:27 +08:00
|
|
|
|
return jsonify({
|
|
|
|
|
'success': False,
|
2025-05-12 13:50:21 +08:00
|
|
|
|
'error': error_msg,
|
|
|
|
|
'raw_output': result.stdout[:500]
|
2025-05-06 17:57:27 +08:00
|
|
|
|
})
|
|
|
|
|
|
2025-05-12 13:50:21 +08:00
|
|
|
|
except ValueError as e:
|
|
|
|
|
error_msg = f'无效的日期格式: {str(e)}'
|
|
|
|
|
logger.error(error_msg)
|
|
|
|
|
return jsonify({'success': False, 'error': error_msg})
|
|
|
|
|
|
2025-05-06 17:57:27 +08:00
|
|
|
|
except subprocess.CalledProcessError as e:
|
2025-05-12 13:50:21 +08:00
|
|
|
|
error_msg = f'计算失败: {e.stderr}'
|
|
|
|
|
logger.error(error_msg)
|
|
|
|
|
logger.error(f"stdout: {e.stdout[:500]}")
|
2025-05-06 17:57:27 +08:00
|
|
|
|
return jsonify({
|
|
|
|
|
'success': False,
|
2025-05-12 13:50:21 +08:00
|
|
|
|
'error': error_msg,
|
|
|
|
|
'stdout': e.stdout[:500]
|
2025-05-06 17:57:27 +08:00
|
|
|
|
})
|
2025-05-12 13:50:21 +08:00
|
|
|
|
|
2025-05-06 17:57:27 +08:00
|
|
|
|
except Exception as e:
|
2025-05-12 13:50:21 +08:00
|
|
|
|
error_msg = f'服务器错误: {str(e)}'
|
|
|
|
|
logger.error(error_msg, exc_info=True)
|
|
|
|
|
return jsonify({'success': False, 'error': error_msg})
|
2025-05-06 17:57:27 +08:00
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
app.run(debug=True,host='0.0.0.0',port=5000)
|