feat: 添加运行日志组件并集成到参数表单
在参数表单中添加运行日志组件,用于显示计算过程中的日志信息 后端增加日志处理功能,将计算日志返回给前端显示 优化tsconfig配置,添加路径别名支持
This commit is contained in:
@@ -8,7 +8,8 @@ import sys
|
||||
import json
|
||||
import math
|
||||
from pathlib import Path
|
||||
from typing import Dict, Any
|
||||
from typing import Dict, Any, List
|
||||
from datetime import datetime
|
||||
import webview
|
||||
from loguru import logger
|
||||
|
||||
@@ -26,11 +27,46 @@ from core import (
|
||||
import numpy as np
|
||||
|
||||
|
||||
class WebHandler:
|
||||
"""Web日志处理器"""
|
||||
def __init__(self, callback=None):
|
||||
self.callback = callback
|
||||
self.logs: List[Dict[str, str]] = []
|
||||
|
||||
def write(self, message):
|
||||
if message.strip():
|
||||
log_entry = {
|
||||
"level": "info",
|
||||
"time": datetime.now().strftime("%H:%M:%S"),
|
||||
"message": message.strip()
|
||||
}
|
||||
self.logs.append(log_entry)
|
||||
if self.callback:
|
||||
self.callback(log_entry)
|
||||
|
||||
|
||||
class EGMWebApp:
|
||||
"""EGM 计算程序的 Web 界面后端"""
|
||||
|
||||
def __init__(self):
|
||||
self.window = None
|
||||
self.web_handler = None
|
||||
self.logs: List[Dict[str, str]] = []
|
||||
|
||||
def add_log(self, level: str, message: str):
|
||||
"""添加日志"""
|
||||
log_entry = {
|
||||
"level": level,
|
||||
"time": datetime.now().strftime("%H:%M:%S"),
|
||||
"message": message
|
||||
}
|
||||
self.logs.append(log_entry)
|
||||
|
||||
def get_logs(self) -> List[Dict[str, str]]:
|
||||
"""获取日志列表"""
|
||||
logs = self.logs.copy()
|
||||
self.logs = []
|
||||
return logs
|
||||
|
||||
def calculate(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""
|
||||
@@ -42,9 +78,10 @@ class EGMWebApp:
|
||||
Returns:
|
||||
计算结果字典
|
||||
"""
|
||||
try:
|
||||
logger.info("开始 EGM 计算...")
|
||||
self.logs = [] # 清空日志
|
||||
self.add_log("info", "开始 EGM 计算...")
|
||||
|
||||
try:
|
||||
# 解析参数
|
||||
parameter_data = params.get('parameter', {})
|
||||
advance_data = params.get('advance', {})
|
||||
@@ -73,27 +110,54 @@ class EGMWebApp:
|
||||
para.voltage_n = int(optional_data.get('voltage_n', 3))
|
||||
para.max_i = float(optional_data.get('max_i', 200))
|
||||
|
||||
logger.info(f"参数: 额定电压={para.rated_voltage}kV, 雷暴日={para.td}d, 海拔={para.altitude}m")
|
||||
self.add_log("info", f"参数: 额定电压={para.rated_voltage}kV, 雷暴日={para.td}d, 海拔={para.altitude}m")
|
||||
|
||||
logger.info("开始执行 _do_calculate...")
|
||||
|
||||
# 执行实际计算
|
||||
self.add_log("info", "EGM 计算中...")
|
||||
result = self._do_calculate()
|
||||
|
||||
logger.info("EGM 计算完成")
|
||||
return result
|
||||
# 调试输出
|
||||
logger.info(f"_do_calculate 返回 keys: {list(result.keys())}")
|
||||
logger.info(f"日志列表: {self.logs}")
|
||||
|
||||
# 将日志添加到结果中(在返回之前添加最后一条日志)
|
||||
self.add_log("info", "EGM 计算完成")
|
||||
|
||||
# 创建一个新的返回值,确保 logs 字段被包含
|
||||
final_result = {
|
||||
"success": result.get("success", True),
|
||||
"message": result.get("message", "计算完成"),
|
||||
"data": result.get("data", {}),
|
||||
"logs": self.logs,
|
||||
"DEBUG_VERSION": "v2" # 标记版本
|
||||
}
|
||||
|
||||
logger.info(f"最终返回结果 keys: {list(final_result.keys())}")
|
||||
logger.info(f"日志数量: {len(self.logs)}")
|
||||
logger.info(f"DEBUG: self.logs = {self.logs}")
|
||||
|
||||
return final_result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"计算失败: {str(e)}")
|
||||
self.add_log("error", f"计算失败: {str(e)}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return {
|
||||
"success": False,
|
||||
"message": f"计算失败: {str(e)}",
|
||||
"error": str(e)
|
||||
"error": str(e),
|
||||
"logs": self.logs
|
||||
}
|
||||
|
||||
def _do_calculate(self) -> Dict[str, Any]:
|
||||
"""执行实际的EGM计算"""
|
||||
h_whole = para.h_arm[0]
|
||||
try:
|
||||
h_whole = para.h_arm[0]
|
||||
except Exception as e:
|
||||
self.add_log("error", f"获取参数失败: {str(e)}")
|
||||
raise
|
||||
string_g_len = para.string_g_len
|
||||
string_c_len = para.string_c_len
|
||||
h_g_sag = para.h_g_sag
|
||||
@@ -123,7 +187,7 @@ class EGMWebApp:
|
||||
results = []
|
||||
|
||||
for ground_angel in ground_angels:
|
||||
logger.info(f"地面倾角 {ground_angel / math.pi * 180:.3f}°")
|
||||
self.add_log("info", f"地面倾角 {ground_angel / math.pi * 180:.3f}°")
|
||||
rg_type = None
|
||||
rg_x = None
|
||||
rg_y = None
|
||||
@@ -205,11 +269,11 @@ class EGMWebApp:
|
||||
if min_distance_intersection < 0.1:
|
||||
break
|
||||
|
||||
logger.info(f"最大电流为 {i_max:.2f}, 最小电流为 {i_min:.2f}")
|
||||
self.add_log("info", f"最大电流为 {i_max:.2f}, 最小电流为 {i_min:.2f}")
|
||||
|
||||
curt_fineness = 0.1
|
||||
if i_min > i_max or abs(i_min - i_max) < curt_fineness:
|
||||
logger.info("最大电流小于等于最小电流,没有暴露弧。")
|
||||
self.add_log("info", "最大电流小于等于最小电流,没有暴露弧。")
|
||||
continue
|
||||
|
||||
curt_segment_n = int((i_max - i_min) / curt_fineness)
|
||||
@@ -249,7 +313,7 @@ class EGMWebApp:
|
||||
avr_n_sf += n_sf / voltage_n
|
||||
n_sf_phases[phase_conductor_foo][u_bar] = n_sf
|
||||
|
||||
logger.info(f"相{phase_conductor_foo + 1}, 跳闸率: {n_sf:.16f} 次/(100km·a)")
|
||||
self.add_log("info", f"相{phase_conductor_foo + 1}, 跳闸率: {n_sf:.16f} 次/(100km·a)")
|
||||
|
||||
result = {
|
||||
"ground_angle": f"{ground_angel / math.pi * 180:.3f}°",
|
||||
|
||||
Reference in New Issue
Block a user