feat: 添加运行日志组件并集成到参数表单

在参数表单中添加运行日志组件,用于显示计算过程中的日志信息
后端增加日志处理功能,将计算日志返回给前端显示
优化tsconfig配置,添加路径别名支持
This commit is contained in:
dmy
2026-03-02 21:02:58 +08:00
parent 6ebfcf848d
commit 89e4cd4973
4 changed files with 235 additions and 14 deletions

View File

@@ -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}°",