重构漏损识别请求,添加用户验证和输入准备

This commit is contained in:
2026-03-04 17:23:01 +08:00
parent 340808e85e
commit b8aee14c00
4 changed files with 49 additions and 14 deletions
+26 -3
View File
@@ -6,6 +6,7 @@ from typing import Any
import numpy as np
import pandas as pd
import wntr
from app.algorithms.leakage_identifier import LeakageIdentifier
from app.infra.db.influxdb import api as influxdb_api
@@ -34,7 +35,7 @@ def run_leakage_identification(
timestep: float = 5,
q_sum: float = 0.2,
q_sum_unit: str = "m3/s",
output_dir: str = "Results",
output_dir: str = "db_inp",
pop_size: int = 50,
max_gen: int = 100,
output_flow_unit: str = "m3/s",
@@ -46,8 +47,7 @@ def run_leakage_identification(
username: str = "admin",
) -> dict[str, Any]:
os.makedirs(output_dir, exist_ok=True)
inp_path = os.path.join(output_dir, f"{network}.leakage.inp")
dump_inp(network, inp_path, "2")
inp_path = _prepare_leakage_inp(network)
selected_sensor_nodes = (
list(dict.fromkeys([node for node in (sensor_nodes or []) if node]))
@@ -500,3 +500,26 @@ def _to_datetime(value: datetime | str) -> datetime:
if isinstance(value, datetime):
return value
return datetime.fromisoformat(value)
def _prepare_leakage_inp(network: str) -> str:
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
db_inp_dir = os.path.join(project_root, "db_inp")
os.makedirs(db_inp_dir, exist_ok=True)
inp_path = os.path.join(db_inp_dir, f"{network}.leakage.inp")
if _is_valid_inp_file(inp_path):
return inp_path
dump_inp(network, inp_path, "2")
if not _is_valid_inp_file(inp_path):
raise ValueError(f"漏损识别 INP 文件无效: {inp_path}")
return inp_path
def _is_valid_inp_file(inp_path: str) -> bool:
if not os.path.isfile(inp_path) or os.path.getsize(inp_path) <= 0:
return False
try:
wntr.network.WaterNetworkModel(inp_path)
return True
except Exception:
return False