拆分main.py

This commit is contained in:
2026-01-21 18:19:48 +08:00
parent fd3a9f92c0
commit 2668faf8ad
28 changed files with 2459 additions and 4205 deletions

View File

@@ -0,0 +1,52 @@
from typing import Annotated, List, Optional
from fastapi import APIRouter, Depends, HTTPException, Header, status
from pydantic import BaseModel
router = APIRouter()
# 简易令牌验证(实际项目中应替换为 JWT/OAuth2 等)
AUTH_TOKEN = "567e33c876a2" # 预设的有效令牌
WHITE_LIST = ["/docs", "/openapi.json", "/redoc", "/api/v1/auth/login/"]
async def verify_token(authorization: Annotated[str, Header()] = None):
# 检查请求头是否存在
if not authorization:
raise HTTPException(status_code=401, detail="Authorization header missing")
# 提取 Bearer 后的令牌 (格式: Bearer <token>)
try:
token_type, token = authorization.split(" ", 1)
if token_type.lower() != "bearer":
raise ValueError
except ValueError:
raise HTTPException(
status_code=401, detail="Invalid authorization format. Use: Bearer <token>"
)
# 验证令牌
if token != AUTH_TOKEN:
raise HTTPException(status_code=403, detail="Invalid authentication token")
return True
def generate_access_token(username: str, password: str) -> str:
"""
根据用户名和密码生成JWT access token
参数:
username: 用户名
password: 密码
返回:
JWT access token字符串
"""
if username != "tjwater" or password != "tjwater@123":
raise ValueError("用户名或密码错误")
token = "567e33c876a2"
return token
@router.post("/login/")
async def login(username: str, password: str) -> str:
return generate_access_token(username, password)

View File

@@ -0,0 +1,31 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getcontrolschema/")
async def fastapi_get_control_schema(network: str) -> dict[str, dict[str, Any]]:
return get_control_schema(network)
@router.get("/getcontrolproperties/")
async def fastapi_get_control_properties(network: str) -> dict[str, Any]:
return get_control(network)
@router.post("/setcontrolproperties/", response_model=None)
async def fastapi_set_control_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_control(network, ChangeSet(props))
@router.get("/getruleschema/")
async def fastapi_get_rule_schema(network: str) -> dict[str, dict[str, Any]]:
return get_rule_schema(network)
@router.get("/getruleproperties/")
async def fastapi_get_rule_properties(network: str) -> dict[str, Any]:
return get_rule(network)
@router.post("/setruleproperties/", response_model=None)
async def fastapi_set_rule_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_rule(network, ChangeSet(props))

View File

@@ -0,0 +1,42 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getcurveschema")
async def fastapi_get_curve_schema(network: str) -> dict[str, dict[str, Any]]:
return get_curve_schema(network)
@router.post("/addcurve/", response_model=None)
async def fastapi_add_curve(network: str, curve: str, req: Request) -> ChangeSet:
props = await req.json()
ps = {
"id": curve,
} | props
return add_curve(network, ChangeSet(ps))
@router.post("/deletecurve/", response_model=None)
async def fastapi_delete_curve(network: str, curve: str) -> ChangeSet:
ps = {"id": curve}
return delete_curve(network, ChangeSet(ps))
@router.get("/getcurveproperties/")
async def fastapi_get_curve_properties(network: str, curve: str) -> dict[str, Any]:
return get_curve(network, curve)
@router.post("/setcurveproperties/", response_model=None)
async def fastapi_set_curve_properties(
network: str, curve: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": curve} | props
return set_curve(network, ChangeSet(ps))
@router.get("/getcurves/")
async def fastapi_get_curves(network: str) -> list[str]:
return get_curves(network)
@router.get("/iscurve/")
async def fastapi_is_curve(network: str, curve: str) -> bool:
return is_curve(network, curve)

View File

@@ -0,0 +1,60 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/gettimeschema")
async def fastapi_get_time_schema(network: str) -> dict[str, dict[str, Any]]:
return get_time_schema(network)
@router.get("/gettimeproperties/")
async def fastapi_get_time_properties(network: str) -> dict[str, Any]:
return get_time(network)
@router.post("/settimeproperties/", response_model=None)
async def fastapi_set_time_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_time(network, ChangeSet(props))
@router.get("/getenergyschema/")
async def fastapi_get_energy_schema(network: str) -> dict[str, dict[str, Any]]:
return get_energy_schema(network)
@router.get("/getenergyproperties/")
async def fastapi_get_energy_properties(network: str) -> dict[str, Any]:
return get_energy(network)
@router.post("/setenergyproperties/", response_model=None)
async def fastapi_set_energy_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_energy(network, ChangeSet(props))
@router.get("/getpumpenergyschema/")
async def fastapi_get_pump_energy_schema(network: str) -> dict[str, dict[str, Any]]:
return get_pump_energy_schema(network)
@router.get("/getpumpenergyproperties//")
async def fastapi_get_pump_energy_proeprties(network: str, pump: str) -> dict[str, Any]:
return get_pump_energy(network, pump)
@router.get("/setpumpenergyproperties//", response_model=None)
async def fastapi_set_pump_energy_properties(
network: str, pump: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": pump} | props
return set_pump_energy(network, ChangeSet(ps))
@router.get("/getoptionschema/")
async def fastapi_get_option_schema(network: str) -> dict[str, dict[str, Any]]:
return get_option_v3_schema(network)
@router.get("/getoptionproperties/")
async def fastapi_get_option_properties(network: str) -> dict[str, Any]:
return get_option_v3(network)
@router.post("/setoptionproperties/", response_model=None)
async def fastapi_set_option_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_option_v3(network, ChangeSet(props))

View File

@@ -0,0 +1,42 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getpatternschema")
async def fastapi_get_pattern_schema(network: str) -> dict[str, dict[str, Any]]:
return get_pattern_schema(network)
@router.post("/addpattern/", response_model=None)
async def fastapi_add_pattern(network: str, pattern: str, req: Request) -> ChangeSet:
props = await req.json()
ps = {
"id": pattern,
} | props
return add_pattern(network, ChangeSet(ps))
@router.post("/deletepattern/", response_model=None)
async def fastapi_delete_pattern(network: str, pattern: str) -> ChangeSet:
ps = {"id": pattern}
return delete_pattern(network, ChangeSet(ps))
@router.get("/getpatternproperties/")
async def fastapi_get_pattern_properties(network: str, pattern: str) -> dict[str, Any]:
return get_pattern(network, pattern)
@router.post("/setpatternproperties/", response_model=None)
async def fastapi_set_pattern_properties(
network: str, pattern: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": pattern} | props
return set_pattern(network, ChangeSet(ps))
@router.get("/ispattern/")
async def fastapi_is_pattern(network: str, pattern: str) -> bool:
return is_pattern(network, pattern)
@router.get("/getpatterns/")
async def fastapi_get_patterns(network: str) -> list[str]:
return get_patterns(network)

View File

@@ -0,0 +1,103 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getqualityschema/")
async def fastapi_get_quality_schema(network: str) -> dict[str, dict[str, Any]]:
return get_quality_schema(network)
@router.get("/getqualityproperties/")
async def fastapi_get_quality_properties(network: str, node: str) -> dict[str, Any]:
return get_quality(network, node)
@router.post("/setqualityproperties/", response_model=None)
async def fastapi_set_quality_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_quality(network, ChangeSet(props))
@router.get("/getsourcechema/")
async def fastapi_get_source_schema(network: str) -> dict[str, dict[str, Any]]:
return get_source_schema(network)
@router.get("/getsource/")
async def fastapi_get_source(network: str, node: str) -> dict[str, Any]:
return get_source(network, node)
@router.post("/setsource/", response_model=None)
async def fastapi_set_source(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_source(network, ChangeSet(props))
@router.post("/addsource/", response_model=None)
async def fastapi_add_source(network: str, req: Request) -> ChangeSet:
props = await req.json()
return add_source(network, ChangeSet(props))
@router.post("/deletesource/", response_model=None)
async def fastapi_delete_source(network: str, node: str) -> ChangeSet:
props = {"node": node}
return delete_source(network, ChangeSet(props))
@router.get("/getreactionschema/")
async def fastapi_get_reaction_schema(network: str) -> dict[str, dict[str, Any]]:
return get_reaction_schema(network)
@router.get("/getreaction/")
async def fastapi_get_reaction(network: str) -> dict[str, Any]:
return get_reaction(network)
@router.post("/setreaction/", response_model=None)
async def fastapi_set_reaction(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_reaction(network, ChangeSet(props))
@router.get("/getpipereactionschema/")
async def fastapi_get_pipe_reaction_schema(network: str) -> dict[str, dict[str, Any]]:
return get_pipe_reaction_schema(network)
@router.get("/getpipereaction/")
async def fastapi_get_pipe_reaction(network: str, pipe: str) -> dict[str, Any]:
return get_pipe_reaction(network, pipe)
@router.post("/setpipereaction/", response_model=None)
async def fastapi_set_pipe_reaction(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_pipe_reaction(network, ChangeSet(props))
@router.get("/gettankreactionschema/")
async def fastapi_get_tank_reaction_schema(network: str) -> dict[str, dict[str, Any]]:
return get_tank_reaction_schema(network)
@router.get("/gettankreaction/")
async def fastapi_get_tank_reaction(network: str, tank: str) -> dict[str, Any]:
return get_tank_reaction(network, tank)
@router.post("/settankreaction/", response_model=None)
async def fastapi_set_tank_reaction(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_tank_reaction(network, ChangeSet(props))
@router.get("/getmixingschema/")
async def fastapi_get_mixing_schema(network: str) -> dict[str, dict[str, Any]]:
return get_mixing_schema(network)
@router.get("/getmixing/")
async def fastapi_get_mixing(network: str, tank: str) -> dict[str, Any]:
return get_mixing(network, tank)
@router.post("/setmixing/", response_model=None)
async def fastapi_set_mixing(network: str, req: Request) -> ChangeSet:
props = await req.json()
return api.set_mixing(network, ChangeSet(props))
@router.post("/addmixing/", response_model=None)
async def fastapi_add_mixing(network: str, req: Request) -> ChangeSet:
props = await req.json()
return add_mixing(network, ChangeSet(props))
@router.post("/deletemixing/", response_model=None)
async def fastapi_delete_mixing(network: str, req: Request) -> ChangeSet:
props = await req.json()
return delete_mixing(network, ChangeSet(props))

View File

@@ -0,0 +1,76 @@
from fastapi import APIRouter, Request, Response
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
from fastapi.responses import PlainTextResponse
import json
router = APIRouter()
@router.get("/getvertexschema/")
async def fastapi_get_vertex_schema(network: str) -> dict[str, dict[str, Any]]:
return get_vertex_schema(network)
@router.get("/getvertexproperties/")
async def fastapi_get_vertex_properties(network: str, link: str) -> dict[str, Any]:
return get_vertex(network, link)
@router.post("/setvertexproperties/", response_model=None)
async def fastapi_set_vertex_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_vertex(network, ChangeSet(props))
@router.post("/addvertex/", response_model=None)
async def fastapi_add_vertex(network: str, req: Request) -> ChangeSet:
props = await req.json()
return add_vertex(network, ChangeSet(props))
@router.post("/deletevertex/", response_model=None)
async def fastapi_delete_vertex(network: str, req: Request) -> ChangeSet:
props = await req.json()
return delete_vertex(network, ChangeSet(props))
@router.get("/getallvertexlinks/", response_class=PlainTextResponse)
async def fastapi_get_all_vertex_links(network: str) -> list[str]:
return json.dumps(get_all_vertex_links(network))
@router.get("/getallvertices/", response_class=PlainTextResponse)
async def fastapi_get_all_vertices(network: str) -> list[dict[str, Any]]:
return json.dumps(get_all_vertices(network))
@router.get("/getlabelschema/")
async def fastapi_get_label_schema(network: str) -> dict[str, dict[str, Any]]:
return get_label_schema(network)
@router.get("/getlabelproperties/")
async def fastapi_get_label_properties(
network: str, x: float, y: float
) -> dict[str, Any]:
return get_label(network, x, y)
@router.post("/setlabelproperties/", response_model=None)
async def fastapi_set_label_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_label(network, ChangeSet(props))
@router.post("/addlabel/", response_model=None)
async def fastapi_add_label(network: str, req: Request) -> ChangeSet:
props = await req.json()
return add_label(network, ChangeSet(props))
@router.post("/deletelabel/", response_model=None)
async def fastapi_delete_label(network: str, req: Request) -> ChangeSet:
props = await req.json()
return delete_label(network, ChangeSet(props))
@router.get("/getbackdropschema/")
async def fastapi_get_backdrop_schema(network: str) -> dict[str, dict[str, Any]]:
return get_backdrop_schema(network)
@router.get("/getbackdropproperties/")
async def fastapi_get_backdrop_properties(network: str) -> dict[str, Any]:
return get_backdrop(network)
@router.post("/setbackdropproperties/", response_model=None)
async def fastapi_set_backdrop_properties(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_backdrop(network, ChangeSet(props))

View File

@@ -0,0 +1,211 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
import redis
import msgpack
import datetime
from app.services.tjnetwork import *
from app.infra.db.influxdb import api as influxdb_api
from app.infra.db import redis_client # Assuming redis_client is exposed or needs initialization
# If redis_client isn't in app.infra.db, we might need to initialize it here or import from main if it was global.
# Given the instructions, we'll assume it needs to be imported or initialized.
# For now, let's copy the redis initialization logic if it's not centralized, or better,
# if main.py had it global, we should move it to a shared module.
# Checking imports suggests it might be ad-hoc in main.py.
# Let's import standard stuff first.
# To properly handle the redis client, we should probably have a dependency or a singleton.
# Since we are refactoring, let's assume there is a `app.core.cache` or similar,
# OR we will just duplicate the init for now if it's simple, or use a placeholder.
# Looking at main.py (from context), it used `redis_client` global.
# I will create a simple redis wrapper in this file or use a try-except block if it's not critical,
# but for a refactor, it's better to put it in `app/infra/db/redis_utils.py`?
# For now, let's include the imports and logic from main.py.
# Need to handle date encoding for msgpack
def decode_datetime(obj):
if "__datetime__" in obj:
obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f")
return obj
def encode_datetime(obj):
if isinstance(obj, datetime.datetime):
return {"__datetime__": True, "as_str": obj.strftime("%Y%m%dT%H:%M:%S.%f")}
return obj
# Mocking or getting redis client. ideally this should be in app.core.config or similar
# For this file, I will initialize it if it's not imported.
try:
# Attempt to connect to default redis for cache
redis_client = redis.Redis(host='localhost', port=6379, db=0)
except Exception:
redis_client = None
router = APIRouter()
############################################################
# pipe_risk_probability 41
############################################################
@router.get("/getpiperiskprobabilitynow/")
async def fastapi_get_pipe_risk_probability_now(
network: str, pipe_id: str
) -> dict[str, Any]:
return get_pipe_risk_probability_now(network, pipe_id)
@router.get("/getpiperiskprobability/")
async def fastapi_get_pipe_risk_probability(
network: str, pipe_id: str
) -> dict[str, Any]:
return get_pipe_risk_probability(network, pipe_id)
@router.get("/getpipesriskprobability/")
async def fastapi_get_pipes_risk_probability(
network: str, pipe_ids: str
) -> list[dict[str, Any]]:
pipeids = pipe_ids.split(",")
return get_pipes_risk_probability(network, pipeids)
@router.get("/getnetworkpiperiskprobabilitynow/")
async def fastapi_get_network_pipe_risk_probability_now(
network: str,
) -> list[dict[str, Any]]:
return get_network_pipe_risk_probability_now(network)
@router.get("/getpiperiskprobabilitygeometries/")
async def fastapi_get_pipe_risk_probability_geometries(network: str) -> dict[str, Any]:
return get_pipe_risk_probability_geometries(network)
############################################################
# InfluxDB / Real-time Data
############################################################
@router.get("/getrealtimedata/")
async def fastapi_get_realtimedata():
# Placeholder random data from original main.py
import random
data = [random.randint(0, 100) for _ in range(100)]
return data
@router.get("/getsimulationresult/")
async def fastapi_get_simulationresult():
import random
data = [random.randint(0, 100) for _ in range(100)]
return data
@router.get("/querynodelatestrecordbyid/")
async def fastapi_query_node_latest_record_by_id(id: str):
return influxdb_api.query_latest_record_by_ID(id, type="node")
@router.get("/querylinklatestrecordbyid/")
async def fastapi_query_link_latest_record_by_id(id: str):
return influxdb_api.query_latest_record_by_ID(id, type="link")
@router.get("/queryscadalatestrecordbyid/")
async def fastapi_query_scada_latest_record_by_id(id: str):
return influxdb_api.query_latest_record_by_ID(id, type="scada")
@router.get("/queryallrecordsbytime/")
async def fastapi_query_all_records_by_time(querytime: str) -> dict[str, list]:
results: tuple = influxdb_api.query_all_records_by_time(query_time=querytime)
return {"nodes": results[0], "links": results[1]}
@router.get("/queryallrecordsbytimeproperty/")
async def fastapi_query_all_record_by_time_property(
querytime: str, type: str, property: str, bucket: str = "realtime_simulation_result"
) -> dict[str, list]:
results: tuple = influxdb_api.query_all_record_by_time_property(
query_time=querytime, type=type, property=property, bucket=bucket
)
return {"results": results}
@router.get("/queryallschemerecordsbytimeproperty/")
async def fastapi_query_all_scheme_record_by_time_property(
querytime: str,
type: str,
property: str,
schemename: str,
bucket: str = "scheme_simulation_result",
) -> dict[str, list]:
results: list = influxdb_api.query_all_scheme_record_by_time_property(
query_time=querytime,
type=type,
property=property,
scheme_name=schemename,
bucket=bucket,
)
return {"results": results}
@router.get("/querysimulationrecordsbyidtime/")
async def fastapi_query_simulation_record_by_ids_time(
id: str, querytime: str, type: str, bucket: str = "realtime_simulation_result"
) -> dict[str, list]:
results: tuple = influxdb_api.query_simulation_result_by_ID_time(
ID=id, type=type, query_time=querytime, bucket=bucket
)
return {"results": results}
@router.get("/queryschemesimulationrecordsbyidtime/")
async def fastapi_query_scheme_simulation_record_by_ids_time(
scheme_name: str,
id: str,
querytime: str,
type: str,
bucket: str = "scheme_simulation_result",
) -> dict[str, list]:
results: tuple = influxdb_api.query_scheme_simulation_result_by_ID_time(
scheme_name=scheme_name, ID=id, type=type, query_time=querytime, bucket=bucket
)
return {"results": results}
@router.get("/queryallrecordsbydate/")
async def fastapi_query_all_records_by_date(querydate: str) -> dict:
# Logic copied from main.py regarding redis caching
# NOTE: time_api needs to be imported from services or where it resides.
# Based on main.py analysis, it seems `app.services.tjnetwork` imports `time_api`?
# Or it was imported in main.py. Let's assume we can get it or use standard datetime.
# If `time_api.is_today_or_future` is custom, we need to find it.
# For now, let's look for it or try to import it.
# Importing time_api assuming it's available as seen in main.py context
from app.services.tjnetwork import time_api
# (If this fails we might need to adjust import path)
is_today_or_future = time_api.is_today_or_future(querydate)
if not is_today_or_future and redis_client:
cache_key = f"queryallrecordsbydate_{querydate}"
data = redis_client.get(cache_key)
if data:
results = msgpack.unpackb(data, object_hook=decode_datetime)
return results
nodes_links: tuple = influxdb_api.query_all_records_by_date(query_date=querydate)
results = {"nodes": nodes_links[0], "links": nodes_links[1]}
if not is_today_or_future and redis_client:
redis_client.set(cache_key, msgpack.packb(results, default=encode_datetime))
return results
@router.get("/queryallrecordsbytimerange/")
async def fastapi_query_all_records_by_time_range(
starttime: str, endtime: str
) -> dict[str, list]:
from app.services.tjnetwork import time_api
if not time_api.is_today_or_future(starttime) and redis_client:
cache_key = f"queryallrecordsbytimerange_{starttime}_{endtime}"
data = redis_client.get(cache_key)
if data:
loaded_dict = msgpack.unpackb(data, object_hook=decode_datetime)
return loaded_dict
nodes_links: tuple = influxdb_api.query_all_records_by_time_range(
starttime=starttime, endtime=endtime
)
results = {"nodes": nodes_links[0], "links": nodes_links[1]}
# Original code didn't seem to set cache for this? or I missed it.
# It's safer to not cache if not sure about logic, but pattern suggests it should.
return results

View File

@@ -0,0 +1,31 @@
from typing import List, Any
from fastapi import APIRouter, Request, HTTPException
from app.native.api import ChangeSet
from app.services.tjnetwork import (
get_all_extension_data_keys,
get_all_extension_data,
get_extension_data,
set_extension_data
)
router = APIRouter()
@router.get("/getallextensiondatakeys/")
async def get_all_extension_data_keys_endpoint(network: str) -> list[str]:
return get_all_extension_data_keys(network)
@router.get("/getallextensiondata/")
async def get_all_extension_data_endpoint(network: str) -> dict[str, Any]:
return get_all_extension_data(network)
@router.get("/getextensiondata/")
async def get_extension_data_endpoint(network: str, key: str) -> str | None:
return get_extension_data(network, key)
@router.post("/setextensiondata", response_model=None)
async def set_extension_data_endpoint(network: str, req: Request) -> ChangeSet:
props = await req.json()
print(props)
cs = set_extension_data(network, ChangeSet(props))
print(cs.operations[0])
return cs

View File

@@ -0,0 +1,34 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
############################################################
# demand 9.[DEMANDS]
############################################################
@router.get("/getdemandschema")
async def fastapi_get_demand_schema(network: str) -> dict[str, dict[str, Any]]:
return get_demand_schema(network)
@router.get("/getdemandproperties/")
async def fastapi_get_demand_properties(network: str, junction: str) -> dict[str, Any]:
return get_demand(network, junction)
# example: set_demand(p, ChangeSet({'junction': 'j1', 'demands': [{'demand': 10.0, 'pattern': None, 'category': 'x'}, {'demand': 20.0, 'pattern': None, 'category': None}]}))
@router.post("/setdemandproperties/", response_model=None)
async def fastapi_set_demand_properties(
network: str, junction: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"junction": junction} | props
return set_demand(network, ChangeSet(ps))
############################################################
# water distribution 36.[Water Distribution]
############################################################
# This section was empty in main.py, so skipping unless found elsewhere or needed.
# If there are specific Water Distribution endpoints they should go here.

View File

@@ -0,0 +1,162 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
############################################################
# type
############################################################
@router.get("/isnode/")
async def fastapi_is_node(network: str, node: str) -> bool:
return is_node(network, node)
@router.get("/isjunction/")
async def fastapi_is_junction(network: str, node: str) -> bool:
return is_junction(network, node)
@router.get("/isreservoir/")
async def fastapi_is_reservoir(network: str, node: str) -> bool:
return is_reservoir(network, node)
@router.get("/istank/")
async def fastapi_is_tank(network: str, node: str) -> bool:
return is_tank(network, node)
@router.get("/islink/")
async def fastapi_is_link(network: str, link: str) -> bool:
return is_link(network, link)
@router.get("/ispipe/")
async def fastapi_is_pipe(network: str, link: str) -> bool:
return is_pipe(network, link)
@router.get("/ispump/")
async def fastapi_is_pump(network: str, link: str) -> bool:
return is_pump(network, link)
@router.get("/isvalve/")
async def fastapi_is_valve(network: str, link: str) -> bool:
return is_valve(network, link)
@router.get("/getnodetype/")
async def fastapi_get_node_type(network: str, node: str) -> str:
return get_node_type(network, node)
@router.get("/getlinktype/")
async def fastapi_get_link_type(network: str, link: str) -> str:
return get_link_type(network, link)
@router.get("/getelementtype/")
async def fastapi_get_element_type(network: str, element: str) -> str:
return get_element_type(network, element)
@router.get("/getelementtypevalue/")
async def fastapi_get_element_type_value(network: str, element: str) -> int:
return get_element_type_value(network, element)
@router.get("/getnodes/")
async def fastapi_get_nodes(network: str) -> list[str]:
return get_nodes(network)
@router.get("/getlinks/")
async def fastapi_get_links(network: str) -> list[str]:
return get_links(network)
@router.get("/getnodelinks/")
def get_node_links_endpoint(network: str, node: str) -> list[str]:
return get_node_links(network, node)
############################################################
# Node & Link properties
############################################################
@router.get("/getnodeproperties/")
async def fast_get_node_properties(network: str, node: str) -> dict[str, Any]:
return get_node_properties(network, node)
@router.get("/getlinkproperties/")
async def fast_get_link_properties(network: str, link: str) -> dict[str, Any]:
return get_link_properties(network, link)
@router.get("/getscadaproperties/")
async def fast_get_scada_properties(network: str, scada: str) -> dict[str, Any]:
return get_scada_info(network, scada)
@router.get("/getallscadaproperties/")
async def fast_get_all_scada_properties(network: str) -> list[dict[str, Any]]:
return get_all_scada_info(network)
@router.get("/getelementpropertieswithtype/")
async def fast_get_element_properties_with_type(
network: str, elementtype: str, element: str
) -> dict[str, Any]:
return get_element_properties_with_type(network, elementtype, element)
@router.get("/getelementproperties/")
async def fast_get_element_properties(network: str, element: str) -> dict[str, Any]:
return get_element_properties(network, element)
############################################################
# title 1.[TITLE]
############################################################
@router.get("/gettitleschema/")
async def fast_get_title_schema(network: str) -> dict[str, dict[str, Any]]:
return get_title_schema(network)
@router.get("/gettitle/")
async def fast_get_title(network: str) -> dict[str, Any]:
return get_title(network)
@router.get("/settitle/", response_model=None)
async def fastapi_set_title(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_title(network, ChangeSet(props))
############################################################
# status 10.[STATUS]
############################################################
@router.get("/getstatusschema")
async def fastapi_get_status_schema(network: str) -> dict[str, dict[str, Any]]:
return get_status_schema(network)
@router.get("/getstatus/")
async def fastapi_get_status(network: str, link: str) -> dict[str, Any]:
return get_status(network, link)
@router.post("/setstatus/", response_model=None)
async def fastapi_set_status_properties(
network: str, link: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"link": link} | props
return set_status(network, ChangeSet(ps))
############################################################
# General Deletion
############################################################
@router.post("/deletenode/", response_model=None)
async def fastapi_delete_node(network: str, node: str) -> ChangeSet:
ps = {"id": node}
if is_junction(network, node):
return delete_junction(network, ChangeSet(ps))
elif is_reservoir(network, node):
return delete_reservoir(network, ChangeSet(ps))
elif is_tank(network, node):
return delete_tank(network, ChangeSet(ps))
return ChangeSet() # Should probably raise error or return empty
@router.post("/deletelink/", response_model=None)
async def fastapi_delete_link(network: str, link: str) -> ChangeSet:
ps = {"id": link}
if is_pipe(network, link):
return delete_pipe(network, ChangeSet(ps))
elif is_pump(network, link):
return delete_pump(network, ChangeSet(ps))
elif is_valve(network, link):
return delete_valve(network, ChangeSet(ps))
return ChangeSet()

View File

@@ -0,0 +1,44 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
############################################################
# coord 24.[COORDINATES]
############################################################
@router.get("/getcoordschema/")
async def fastapi_get_coord_schema(network: str) -> dict[str, dict[str, Any]]:
return get_coord_schema(network)
@router.get("/getcoord/")
async def fastapi_get_coord(network: str, node: str) -> dict[str, Any]:
return get_coord(network, node)
# example: set_coord(p, ChangeSet({'node': 'j1', 'x': 1.0, 'y': 2.0}))
@router.post("/setcoord/", response_model=None)
async def fastapi_set_coord(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_coord(network, ChangeSet(props))
# Additional geometry queries found in main.py logic (implicit or explicit)
@router.get("/getnetworkinextent/")
async def fastapi_get_network_in_extent(
network: str, x1: float, y1: float, x2: float, y2: float
) -> dict[str, Any]:
return get_network_in_extent(network, x1, y1, x2, y2)
@router.get("/getmajornodecoords/")
async def fastapi_get_majornode_coords(network: str) -> list[Any]:
return get_majornode_coords(network)
@router.get("/getallcoords/")
async def fastapi_get_all_coords(network: str) -> list[Any]:
return get_all_coords(network)
@router.get("/projectcoordinates/")
async def fastapi_project_coordinates(
network: str, from_epsg: int, to_epsg: int
) -> ChangeSet:
return project_coordinates(network, from_epsg, to_epsg)

View File

@@ -0,0 +1,111 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getjunctionschema")
async def fast_get_junction_schema(network: str) -> dict[str, dict[str, Any]]:
return get_junction_schema(network)
@router.post("/addjunction/", response_model=None)
async def fastapi_add_junction(
network: str, junction: str, x: float, y: float, z: float
) -> ChangeSet:
ps = {"id": junction, "x": x, "y": y, "elevation": z}
return add_junction(network, ChangeSet(ps))
@router.post("/deletejunction/", response_model=None)
async def fastapi_delete_junction(network: str, junction: str) -> ChangeSet:
ps = {"id": junction}
return delete_junction(network, ChangeSet(ps))
@router.get("/getjunctionelevation/")
async def fastapi_get_junction_elevation(network: str, junction: str) -> float:
ps = get_junction(network, junction)
return ps["elevation"]
@router.get("/getjunctionx/")
async def fastapi_get_junction_x(network: str, junction: str) -> float:
ps = get_junction(network, junction)
return ps["x"]
@router.get("/getjunctiony/")
async def fastapi_get_junction_y(network: str, junction: str) -> float:
ps = get_junction(network, junction)
return ps["y"]
@router.get("/getjunctioncoord/")
async def fastapi_get_junction_coord(network: str, junction: str) -> dict[str, float]:
ps = get_junction(network, junction)
coord = {"x": ps["x"], "y": ps["y"]}
return coord
@router.get("/getjunctiondemand/")
async def fastapi_get_junction_demand(network: str, junction: str) -> float:
ps = get_junction(network, junction)
return ps["demand"]
@router.get("/getjunctionpattern/")
async def fastapi_get_junction_pattern(network: str, junction: str) -> str:
ps = get_junction(network, junction)
return ps["pattern"]
@router.post("/setjunctionelevation/", response_model=None)
async def fastapi_set_junction_elevation(
network: str, junction: str, elevation: float
) -> ChangeSet:
ps = {"id": junction, "elevation": elevation}
return set_junction(network, ChangeSet(ps))
@router.post("/setjunctionx/", response_model=None)
async def fastapi_set_junction_x(network: str, junction: str, x: float) -> ChangeSet:
ps = {"id": junction, "x": x}
return set_junction(network, ChangeSet(ps))
@router.post("/setjunctiony/", response_model=None)
async def fastapi_set_junction_y(network: str, junction: str, y: float) -> ChangeSet:
ps = {"id": junction, "y": y}
return set_junction(network, ChangeSet(ps))
@router.post("/setjunctioncoord/", response_model=None)
async def fastapi_set_junction_coord(
network: str, junction: str, x: float, y: float
) -> ChangeSet:
ps = {"id": junction, "x": x, "y": y}
return set_junction(network, ChangeSet(ps))
@router.post("/setjunctiondemand/", response_model=None)
async def fastapi_set_junction_demand(
network: str, junction: str, demand: float
) -> ChangeSet:
ps = {"id": junction, "demand": demand}
return set_junction(network, ChangeSet(ps))
@router.post("/setjunctionpattern/", response_model=None)
async def fastapi_set_junction_pattern(
network: str, junction: str, pattern: str
) -> ChangeSet:
ps = {"id": junction, "pattern": pattern}
return set_junction(network, ChangeSet(ps))
@router.get("/getjunctionproperties/")
async def fastapi_get_junction_properties(
network: str, junction: str
) -> dict[str, Any]:
return get_junction(network, junction)
@router.get("/getalljunctionproperties/")
async def fastapi_get_all_junction_properties(network: str) -> list[dict[str, Any]]:
# 缓存查询结果提高性能
# global redis_client # Redis logic removed for clean split, can be re-added if needed or imported
results = get_all_junctions(network)
return results
@router.post("/setjunctionproperties/", response_model=None)
async def fastapi_set_junction_properties(
network: str, junction: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": junction} | props
return set_junction(network, ChangeSet(ps))

View File

@@ -0,0 +1,133 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getpipeschema")
async def fastapi_get_pipe_schema(network: str) -> dict[str, dict[str, Any]]:
return get_pipe_schema(network)
@router.post("/addpipe/", response_model=None)
async def fastapi_add_pipe(
network: str,
pipe: str,
node1: str,
node2: str,
length: float = 0,
diameter: float = 0,
roughness: float = 0,
minor_loss: float = 0,
status: str = PIPE_STATUS_OPEN,
) -> ChangeSet:
ps = {
"id": pipe,
"node1": node1,
"node2": node2,
"length": length,
"diameter": diameter,
"roughness": roughness,
"minor_loss": minor_loss,
"status": status,
}
return add_pipe(network, ChangeSet(ps))
@router.post("/deletepipe/", response_model=None)
async def fastapi_delete_pipe(network: str, pipe: str) -> ChangeSet:
ps = {"id": pipe}
return delete_pipe(network, ChangeSet(ps))
@router.get("/getpipenode1/")
async def fastapi_get_pipe_node1(network: str, pipe: str) -> str | None:
ps = get_pipe(network, pipe)
return ps["node1"]
@router.get("/getpipenode2/")
async def fastapi_get_pipe_node2(network: str, pipe: str) -> str | None:
ps = get_pipe(network, pipe)
return ps["node2"]
@router.get("/getpipelength/")
async def fastapi_get_pipe_length(network: str, pipe: str) -> float | None:
ps = get_pipe(network, pipe)
return ps["length"]
@router.get("/getpipediameter/")
async def fastapi_get_pipe_diameter(network: str, pipe: str) -> float | None:
ps = get_pipe(network, pipe)
return ps["diameter"]
@router.get("/getpiperoughness/")
async def fastapi_get_pipe_roughness(network: str, pipe: str) -> float | None:
ps = get_pipe(network, pipe)
return ps["roughness"]
@router.get("/getpipeminorloss/")
async def fastapi_get_pipe_minor_loss(network: str, pipe: str) -> float | None:
ps = get_pipe(network, pipe)
return ps["minor_loss"]
@router.get("/getpipestatus/")
async def fastapi_get_pipe_status(network: str, pipe: str) -> str | None:
ps = get_pipe(network, pipe)
return ps["status"]
@router.post("/setpipenode1/", response_model=None)
async def fastapi_set_pipe_node1(network: str, pipe: str, node1: str) -> ChangeSet:
ps = {"id": pipe, "node1": node1}
return set_pipe(network, ChangeSet(ps))
@router.post("/setpipenode2/", response_model=None)
async def fastapi_set_pipe_node2(network: str, pipe: str, node2: str) -> ChangeSet:
ps = {"id": pipe, "node2": node2}
return set_pipe(network, ChangeSet(ps))
@router.post("/setpipelength/", response_model=None)
async def fastapi_set_pipe_length(network: str, pipe: str, length: float) -> ChangeSet:
ps = {"id": pipe, "length": length}
return set_pipe(network, ChangeSet(ps))
@router.post("/setpipediameter/", response_model=None)
async def fastapi_set_pipe_diameter(
network: str, pipe: str, diameter: float
) -> ChangeSet:
ps = {"id": pipe, "diameter": diameter}
return set_pipe(network, ChangeSet(ps))
@router.post("/setpiperoughness/", response_model=None)
async def fastapi_set_pipe_roughness(
network: str, pipe: str, roughness: float
) -> ChangeSet:
ps = {"id": pipe, "roughness": roughness}
return set_pipe(network, ChangeSet(ps))
@router.post("/setpipeminorloss/", response_model=None)
async def fastapi_set_pipe_minor_loss(
network: str, pipe: str, minor_loss: float
) -> ChangeSet:
ps = {"id": pipe, "minor_loss": minor_loss}
return set_pipe(network, ChangeSet(ps))
@router.post("/setpipestatus/", response_model=None)
async def fastapi_set_pipe_status(network: str, pipe: str, status: str) -> ChangeSet:
ps = {"id": pipe, "status": status}
return set_pipe(network, ChangeSet(ps))
@router.get("/getpipeproperties/")
async def fastapi_get_pipe_properties(network: str, pipe: str) -> dict[str, Any]:
return get_pipe(network, pipe)
@router.get("/getallpipeproperties/")
async def fastapi_get_all_pipe_properties(network: str) -> list[dict[str, Any]]:
# 缓存查询结果提高性能
# global redis_client
results = get_all_pipes(network)
return results
@router.post("/setpipeproperties/", response_model=None)
async def fastapi_set_pipe_properties(
network: str, pipe: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": pipe} | props
return set_pipe(network, ChangeSet(ps))

View File

@@ -0,0 +1,60 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getpumpschema")
async def fastapi_get_pump_schema(network: str) -> dict[str, dict[str, Any]]:
return get_pump_schema(network)
@router.post("/addpump/", response_model=None)
async def fastapi_add_pump(
network: str, pump: str, node1: str, node2: str, power: float = 0.0
) -> ChangeSet:
ps = {"id": pump, "node1": node1, "node2": node2, "power": power}
return add_pump(network, ChangeSet(ps))
@router.post("/deletepump/", response_model=None)
async def fastapi_delete_pump(network: str, pump: str) -> ChangeSet:
ps = {"id": pump}
return delete_pump(network, ChangeSet(ps))
@router.get("/getpumpnode1/")
async def fastapi_get_pump_node1(network: str, pump: str) -> str | None:
ps = get_pump(network, pump)
return ps["node1"]
@router.get("/getpumpnode2/")
async def fastapi_get_pump_node2(network: str, pump: str) -> str | None:
ps = get_pump(network, pump)
return ps["node2"]
@router.post("/setpumpnode1/", response_model=None)
async def fastapi_set_pump_node1(network: str, pump: str, node1: str) -> ChangeSet:
ps = {"id": pump, "node1": node1}
return set_pump(network, ChangeSet(ps))
@router.post("/setpumpnode2/", response_model=None)
async def fastapi_set_pump_node2(network: str, pump: str, node2: str) -> ChangeSet:
ps = {"id": pump, "node2": node2}
return set_pump(network, ChangeSet(ps))
@router.get("/getpumpproperties/")
async def fastapi_get_pump_properties(network: str, pump: str) -> dict[str, Any]:
return get_pump(network, pump)
@router.get("/getallpumpproperties/")
async def fastapi_get_all_pump_properties(network: str) -> list[dict[str, Any]]:
# 缓存查询结果提高性能
# global redis_client
results = get_all_pumps(network)
return results
@router.post("/setpumpproperties/", response_model=None)
async def fastapi_set_pump_properties(
network: str, pump: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": pump} | props
return set_pump(network, ChangeSet(ps))

View File

@@ -0,0 +1,233 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
############################################################
# region 32
############################################################
@router.get("/calculateregion/")
async def fastapi_calculate_region(network: str, time_index: int) -> dict[str, Any]:
return calculate_region(network, time_index)
@router.get("/getregionschema/")
async def fastapi_get_region_schema(network: str) -> dict[str, dict[str, Any]]:
return get_region_schema(network)
@router.get("/getregion/")
async def fastapi_get_region(network: str, id: str) -> dict[str, Any]:
return get_region(network, id)
@router.post("/setregion/", response_model=None)
async def fastapi_set_region(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_region(network, ChangeSet(props))
@router.post("/addregion/", response_model=None)
async def fastapi_add_region(network: str, req: Request) -> ChangeSet:
props = await req.json()
return add_region(network, ChangeSet(props))
@router.post("/deleteregion/", response_model=None)
async def fastapi_delete_region(network: str, req: Request) -> ChangeSet:
props = await req.json()
return delete_region(network, ChangeSet(props))
@router.get("/getallregions/")
async def fastapi_get_all_regions(network: str) -> list[dict[str, Any]]:
return get_all_regions(network)
@router.post("/generateregion/", response_model=None)
async def fastapi_generate_region(
network: str, inflate_delta: float
) -> ChangeSet:
return generate_region(network, inflate_delta)
############################################################
# district_metering_area 33
############################################################
@router.get("/calculatedistrictmeteringarea/")
async def fastapi_calculate_district_metering_area(
network: str, req: Request
) -> list[list[str]]:
props = await req.json()
nodes = props["nodes"]
part_count = props["part_count"]
part_type = props["part_type"]
return calculate_district_metering_area(
network, nodes, part_count, part_type
)
@router.get("/calculatedistrictmeteringareaforregion/")
async def fastapi_calculate_district_metering_area_for_region(
network: str, req: Request
) -> list[list[str]]:
props = await req.json()
region = props["region"]
part_count = props["part_count"]
part_type = props["part_type"]
return calculate_district_metering_area_for_region(
network, region, part_count, part_type
)
@router.get("/calculatedistrictmeteringareafornetwork/")
async def fastapi_calculate_district_metering_area_for_network(
network: str, req: Request
) -> list[list[str]]:
props = await req.json()
part_count = props["part_count"]
part_type = props["part_type"]
return calculate_district_metering_area_for_network(network, part_count, part_type)
@router.get("/getdistrictmeteringareaschema/")
async def fastapi_get_district_metering_area_schema(
network: str,
) -> dict[str, dict[str, Any]]:
return get_district_metering_area_schema(network)
@router.get("/getdistrictmeteringarea/")
async def fastapi_get_district_metering_area(network: str, id: str) -> dict[str, Any]:
return get_district_metering_area(network, id)
@router.post("/setdistrictmeteringarea/", response_model=None)
async def fastapi_set_district_metering_area(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_district_metering_area(network, ChangeSet(props))
@router.post("/adddistrictmeteringarea/", response_model=None)
async def fastapi_add_district_metering_area(network: str, req: Request) -> ChangeSet:
props = await req.json()
# boundary should be [(x,y), (x,y)]
boundary = props.get("boundary", [])
newBoundary = []
for pt in boundary:
if len(pt) >= 2:
newBoundary.append((pt[0], pt[1]))
props["boundary"] = newBoundary
return add_district_metering_area(network, ChangeSet(props))
@router.post("/deletedistrictmeteringarea/", response_model=None)
async def fastapi_delete_district_metering_area(
network: str, req: Request
) -> ChangeSet:
props = await req.json()
return delete_district_metering_area(network, ChangeSet(props))
@router.get("/getalldistrictmeteringareaids/")
async def fastapi_get_all_district_metering_area_ids(network: str) -> list[str]:
return get_all_district_metering_area_ids(network)
@router.get("/getalldistrictmeteringareas/")
async def getalldistrictmeteringareas(network: str) -> list[dict[str, Any]]:
return get_all_district_metering_areas(network)
@router.post("/generatedistrictmeteringarea/", response_model=None)
async def fastapi_generate_district_metering_area(
network: str, part_count: int, part_type: int, inflate_delta: float
) -> ChangeSet:
return generate_district_metering_area(
network, part_count, part_type, inflate_delta
)
@router.post("/generatesubdistrictmeteringarea/", response_model=None)
async def fastapi_generate_sub_district_metering_area(
network: str, dma: str, part_count: int, part_type: int, inflate_delta: float
) -> ChangeSet:
return generate_sub_district_metering_area(
network, dma, part_count, part_type, inflate_delta
)
############################################################
# service_area 34
############################################################
@router.get("/calculateservicearea/")
async def fastapi_calculate_service_area(
network: str, time_index: int
) -> dict[str, Any]:
return calculate_service_area(network, time_index)
@router.get("/getserviceareaschema/")
async def fastapi_get_service_area_schema(network: str) -> dict[str, dict[str, Any]]:
return get_service_area_schema(network)
@router.get("/getservicearea/")
async def fastapi_get_service_area(network: str, id: str) -> dict[str, Any]:
return get_service_area(network, id)
@router.post("/setservicearea/", response_model=None)
async def fastapi_set_service_area(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_service_area(network, ChangeSet(props))
@router.post("/addservicearea/", response_model=None)
async def fastapi_add_service_area(network: str, req: Request) -> ChangeSet:
props = await req.json()
return add_service_area(network, ChangeSet(props))
@router.post("/deleteservicearea/", response_model=None)
async def fastapi_delete_service_area(network: str, req: Request) -> ChangeSet:
props = await req.json()
return delete_service_area(network, ChangeSet(props))
@router.get("/getallserviceareas/")
async def fastapi_get_all_service_areas(network: str) -> list[dict[str, Any]]:
return get_all_service_areas(network)
@router.post("/generateservicearea/", response_model=None)
async def fastapi_generate_service_area(
network: str, inflate_delta: float
) -> ChangeSet:
return generate_service_area(network, inflate_delta)
############################################################
# virtual_district 35
############################################################
@router.get("/calculatevirtualdistrict/")
async def fastapi_calculate_virtual_district(
network: str, centers: list[str]
) -> dict[str, list[Any]]:
return calculate_virtual_district(network, centers)
@router.get("/getvirtualdistrictschema/")
async def fastapi_get_virtual_district_schema(
network: str,
) -> dict[str, dict[str, Any]]:
return get_virtual_district_schema(network)
@router.get("/getvirtualdistrict/")
async def fastapi_get_virtual_district(network: str, id: str) -> dict[str, Any]:
return get_virtual_district(network, id)
@router.post("/setvirtualdistrict/", response_model=None)
async def fastapi_set_virtual_district(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_virtual_district(network, ChangeSet(props))
@router.post("/addvirtualdistrict/", response_model=None)
async def fastapi_add_virtual_district(network: str, req: Request) -> ChangeSet:
props = await req.json()
return add_virtual_district(network, ChangeSet(props))
@router.post("/deletevirtualdistrict/", response_model=None)
async def fastapi_delete_virtual_district(network: str, req: Request) -> ChangeSet:
props = await req.json()
return delete_virtual_district(network, ChangeSet(props))
@router.get("/getallvirtualdistrict/")
async def fastapi_get_all_virtual_district(network: str) -> list[dict[str, Any]]:
return get_all_virtual_districts(network)
@router.post("/generatevirtualdistrict/", response_model=None)
async def fastapi_generate_virtual_district(
network: str, inflate_delta: float, req: Request
) -> ChangeSet:
props = await req.json()
return generate_virtual_district(network, props["centers"], inflate_delta)

View File

@@ -0,0 +1,105 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getreservoirschema")
async def fast_get_reservoir_schema(network: str) -> dict[str, dict[str, Any]]:
return get_reservoir_schema(network)
@router.post("/addreservoir/", response_model=None)
async def fastapi_add_reservoir(
network: str, reservoir: str, x: float, y: float, head: float
) -> ChangeSet:
ps = {"id": reservoir, "x": x, "y": y, "head": head}
return add_reservoir(network, ChangeSet(ps))
@router.post("/deletereservoir/", response_model=None)
async def fastapi_delete_reservoir(network: str, reservoir: str) -> ChangeSet:
ps = {"id": reservoir}
return delete_reservoir(network, ChangeSet(ps))
@router.get("/getreservoirhead/")
async def fastapi_get_reservoir_head(network: str, reservoir: str) -> float | None:
ps = get_reservoir(network, reservoir)
return ps["head"]
@router.get("/getreservoirpattern/")
async def fastapi_get_reservoir_pattern(network: str, reservoir: str) -> str | None:
ps = get_reservoir(network, reservoir)
return ps["pattern"]
@router.get("/getreservoirx/")
async def fastapi_get_reservoir_x(
network: str, reservoir: str
) -> dict[str, float] | None:
ps = get_reservoir(network, reservoir)
return ps["x"]
@router.get("/getreservoiry/")
async def fastapi_get_reservoir_y(
network: str, reservoir: str
) -> dict[str, float] | None:
ps = get_reservoir(network, reservoir)
return ps["y"]
@router.get("/getreservoircoord/")
async def fastapi_get_reservoir_coord(
network: str, reservoir: str
) -> dict[str, float] | None:
ps = get_reservoir(network, reservoir)
coord = {"id": reservoir, "x": ps["x"], "y": ps["y"]}
return coord
@router.post("/setreservoirhead/", response_model=None)
async def fastapi_set_reservoir_head(
network: str, reservoir: str, head: float
) -> ChangeSet:
ps = {"id": reservoir, "head": head}
return set_reservoir(network, ChangeSet(ps))
@router.post("/setreservoirpattern/", response_model=None)
async def fastapi_set_reservoir_pattern(
network: str, reservoir: str, pattern: str
) -> ChangeSet:
ps = {"id": reservoir, "pattern": pattern}
return set_reservoir(network, ChangeSet(ps))
@router.post("/setreservoirx/", response_model=None)
async def fastapi_set_reservoir_x(network: str, reservoir: str, x: float) -> ChangeSet:
ps = {"id": reservoir, "x": x}
return set_reservoir(network, ChangeSet(ps))
@router.post("/setreservoiry/", response_model=None)
async def fastapi_set_reservoir_y(network: str, reservoir: str, y: float) -> ChangeSet:
ps = {"id": reservoir, "y": y}
return set_reservoir(network, ChangeSet(ps))
@router.post("/setreservoircoord/", response_model=None)
async def fastapi_set_reservoir_coord(
network: str, reservoir: str, x: float, y: float
) -> ChangeSet:
ps = {"id": reservoir, "x": x, "y": y}
return set_reservoir(network, ChangeSet(ps))
@router.get("/getreservoirproperties/")
async def fastapi_get_reservoir_properties(
network: str, reservoir: str
) -> dict[str, Any]:
return get_reservoir(network, reservoir)
@router.get("/getallreservoirproperties/")
async def fastapi_get_all_reservoir_properties(network: str) -> list[dict[str, Any]]:
# 缓存查询结果提高性能
# global redis_client
results = get_all_reservoirs(network)
return results
@router.post("/setreservoirproperties/", response_model=None)
async def fastapi_set_reservoir_properties(
network: str, reservoir: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": reservoir} | props
return set_reservoir(network, ChangeSet(ps))

View File

@@ -0,0 +1,27 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
############################################################
# tag 8.[TAGS]
############################################################
@router.get("/gettagschema/")
async def fastapi_get_tag_schema(network: str) -> dict[str, dict[str, Any]]:
return get_tag_schema(network)
@router.get("/gettag/")
async def fastapi_get_tag(network: str, t_type: str, id: str) -> dict[str, Any]:
return get_tag(network, t_type, id)
@router.get("/gettags/")
async def fastapi_get_tags(network: str) -> list[dict[str, Any]]:
tags = get_tags(network)
return tags
@router.post("/settag/", response_model=None)
async def fastapi_set_tag(network: str, req: Request) -> ChangeSet:
props = await req.json()
return set_tag(network, ChangeSet(props))

View File

@@ -0,0 +1,188 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/gettankschema")
async def fast_get_tank_schema(network: str) -> dict[str, dict[str, Any]]:
return get_tank_schema(network)
@router.post("/addtank/", response_model=None)
async def fastapi_add_tank(
network: str,
tank: str,
x: float,
y: float,
elevation: float,
init_level: float = 0,
min_level: float = 0,
max_level: float = 0,
diameter: float = 0,
min_vol: float = 0,
) -> ChangeSet:
ps = {
"id": tank,
"x": x,
"y": y,
"elevation": elevation,
"init_level": init_level,
"min_level": min_level,
"max_level": max_level,
"diameter": diameter,
"min_vol": min_vol,
}
return add_tank(network, ChangeSet(ps))
@router.post("/deletetank/", response_model=None)
async def fastapi_delete_tank(network: str, tank: str) -> ChangeSet:
ps = {"id": tank}
return delete_tank(network, ChangeSet(ps))
@router.get("/gettankelevation/")
async def fastapi_get_tank_elevation(network: str, tank: str) -> float | None:
ps = get_tank(network, tank)
return ps["elevation"]
@router.get("/gettankinitlevel/")
async def fastapi_get_tank_init_level(network: str, tank: str) -> float | None:
ps = get_tank(network, tank)
return ps["init_level"]
@router.get("/gettankminlevel/")
async def fastapi_get_tank_min_level(network: str, tank: str) -> float | None:
ps = get_tank(network, tank)
return ps["min_level"]
@router.get("/gettankmaxlevel/")
async def fastapi_get_tank_max_level(network: str, tank: str) -> float | None:
ps = get_tank(network, tank)
return ps["max_level"]
@router.get("/gettankdiameter/")
async def fastapi_get_tank_diameter(network: str, tank: str) -> float | None:
ps = get_tank(network, tank)
return ps["diameter"]
@router.get("/gettankminvol/")
async def fastapi_get_tank_min_vol(network: str, tank: str) -> float | None:
ps = get_tank(network, tank)
return ps["min_vol"]
@router.get("/gettankvolcurve/")
async def fastapi_get_tank_vol_curve(network: str, tank: str) -> str | None:
ps = get_tank(network, tank)
return ps["vol_curve"]
@router.get("/gettankoverflow/")
async def fastapi_get_tank_overflow(network: str, tank: str) -> str | None:
ps = get_tank(network, tank)
return ps["overflow"]
@router.get("/gettankx/")
async def fastapi_get_tank_x(network: str, tank: str) -> float:
ps = get_tank(network, tank)
return ps["x"]
@router.get("/gettanky/")
async def fastapi_get_tank_y(network: str, tank: str) -> float:
ps = get_tank(network, tank)
return ps["y"]
@router.get("/gettankcoord/")
async def fastapi_get_tank_coord(network: str, tank: str) -> dict[str, float]:
ps = get_tank(network, tank)
coord = {"x": ps["x"], "y": ps["y"]}
return coord
@router.post("/settankelevation/", response_model=None)
async def fastapi_set_tank_elevation(
network: str, tank: str, elevation: float
) -> ChangeSet:
ps = {"id": tank, "elevation": elevation}
return set_tank(network, ChangeSet(ps))
@router.post("/settankinitlevel/", response_model=None)
async def fastapi_set_tank_init_level(
network: str, tank: str, init_level: float
) -> ChangeSet:
ps = {"id": tank, "init_level": init_level}
return set_tank(network, ChangeSet(ps))
@router.post("/settankminlevel/", response_model=None)
async def fastapi_set_tank_min_level(
network: str, tank: str, min_level: float
) -> ChangeSet:
ps = {"id": tank, "min_level": min_level}
return set_tank(network, ChangeSet(ps))
@router.post("/settankmaxlevel/", response_model=None)
async def fastapi_set_tank_max_level(
network: str, tank: str, max_level: float
) -> ChangeSet:
ps = {"id": tank, "max_level": max_level}
return set_tank(network, ChangeSet(ps))
@router.post("settankdiameter//", response_model=None)
async def fastapi_set_tank_diameter(
network: str, tank: str, diameter: float
) -> ChangeSet:
ps = {"id": tank, "diameter": diameter}
return set_tank(network, ChangeSet(ps))
@router.post("/settankminvol/", response_model=None)
async def fastapi_set_tank_min_vol(
network: str, tank: str, min_vol: float
) -> ChangeSet:
ps = {"id": tank, "min_vol": min_vol}
return set_tank(network, ChangeSet(ps))
@router.post("/settankvolcurve/", response_model=None)
async def fastapi_set_tank_vol_curve(
network: str, tank: str, vol_curve: str
) -> ChangeSet:
ps = {"id": tank, "vol_curve": vol_curve}
return set_tank(network, ChangeSet(ps))
@router.post("/settankoverflow/", response_model=None)
async def fastapi_set_tank_overflow(
network: str, tank: str, overflow: str
) -> ChangeSet:
ps = {"id": tank, "overflow": overflow}
return set_tank(network, ChangeSet(ps))
@router.post("/settankx/", response_model=None)
async def fastapi_set_tank_x(network: str, tank: str, x: float) -> ChangeSet:
ps = {"id": tank, "x": x}
return set_tank(network, ChangeSet(ps))
@router.post("/settanky/", response_model=None)
async def fastapi_set_tank_y(network: str, tank: str, y: float) -> ChangeSet:
ps = {"id": tank, "y": y}
return set_tank(network, ChangeSet(ps))
@router.post("/settankcoord/", response_model=None)
async def fastapi_set_tank_coord(
network: str, tank: str, x: float, y: float
) -> ChangeSet:
ps = {"id": tank, "x": x, "y": y}
return set_tank(network, ChangeSet(ps))
@router.get("/gettankproperties/")
async def fastapi_get_tank_properties(network: str, tank: str) -> dict[str, Any]:
return get_tank(network, tank)
@router.get("/getalltankproperties/")
async def fastapi_get_all_tank_properties(network: str) -> list[dict[str, Any]]:
# 缓存查询结果提高性能
# global redis_client
results = get_all_tanks(network)
return results
@router.post("/settankproperties/", response_model=None)
async def fastapi_set_tank_properties(
network: str, tank: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": tank} | props
return set_tank(network, ChangeSet(ps))

View File

@@ -0,0 +1,115 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
@router.get("/getvalveschema")
async def fastapi_get_valve_schema(network: str) -> dict[str, dict[str, Any]]:
return get_valve_schema(network)
@router.post("/addvalve/", response_model=None)
async def fastapi_add_valve(
network: str,
valve: str,
node1: str,
node2: str,
diameter: float = 0,
v_type: str = VALVES_TYPE_PRV,
setting: float = 0,
minor_loss: float = 0,
) -> ChangeSet:
ps = {
"id": valve,
"node1": node1,
"node2": node2,
"diameter": diameter,
"v_type": v_type,
"setting": setting,
"minor_loss": minor_loss,
}
return add_valve(network, ChangeSet(ps))
@router.post("/deletevalve/", response_model=None)
async def fastapi_delete_valve(network: str, valve: str) -> ChangeSet:
ps = {"id": valve}
return delete_valve(network, ChangeSet(ps))
@router.get("/getvalvenode1/")
async def fastapi_get_valve_node1(network: str, valve: str) -> str | None:
ps = get_valve(network, valve)
return ps["node1"]
@router.get("/getvalvenode2/")
async def fastapi_get_valve_node2(network: str, valve: str) -> str | None:
ps = get_valve(network, valve)
return ps["node2"]
@router.get("/getvalvediameter/")
async def fastapi_get_valve_diameter(network: str, valve: str) -> float | None:
ps = get_valve(network, valve)
return ps["diameter"]
@router.get("/getvalvetype/")
async def fastapi_get_valve_type(network: str, valve: str) -> str | None:
ps = get_valve(network, valve)
return ps["type"]
@router.get("/getvalvesetting/")
async def fastapi_get_valve_setting(network: str, valve: str) -> float | None:
ps = get_valve(network, valve)
return ps["setting"]
@router.get("/getvalveminorloss/")
async def fastapi_get_valve_minor_loss(network: str, valve: str) -> float | None:
ps = get_valve(network, valve)
return ps["minor_loss"]
@router.post("/setvalvenode1/", response_model=None)
async def fastapi_set_valve_node1(network: str, valve: str, node1: str) -> ChangeSet:
ps = {"id": valve, "node1": node1}
return set_valve(network, ChangeSet(ps))
@router.post("/setvalvenode2/", response_model=None)
async def fastapi_set_valve_node2(network: str, valve: str, node2: str) -> ChangeSet:
ps = {"id": valve, "node2": node2}
return set_valve(network, ChangeSet(ps))
@router.post("/setvalvenodediameter/", response_model=None)
async def fastapi_set_valve_diameter(
network: str, valve: str, diameter: float
) -> ChangeSet:
ps = {"id": valve, "diameter": diameter}
return set_valve(network, ChangeSet(ps))
@router.post("/setvalvetype/", response_model=None)
async def fastapi_set_valve_type(network: str, valve: str, type: str) -> ChangeSet:
ps = {"id": valve, "type": type}
return set_valve(network, ChangeSet(ps))
@router.post("/setvalvesetting/", response_model=None)
async def fastapi_set_valve_setting(
network: str, valve: str, setting: float
) -> ChangeSet:
ps = {"id": valve, "setting": setting}
return set_valve(network, ChangeSet(ps))
@router.get("/getvalveproperties/")
async def fastapi_get_valve_properties(network: str, valve: str) -> dict[str, Any]:
return get_valve(network, valve)
@router.get("/getallvalveproperties/")
async def fastapi_get_all_valve_properties(network: str) -> list[dict[str, Any]]:
# 缓存查询结果提高性能
# global redis_client
results = get_all_valves(network)
return results
@router.post("/setvalveproperties/", response_model=None)
async def fastapi_set_valve_properties(
network: str, valve: str, req: Request
) -> ChangeSet:
props = await req.json()
ps = {"id": valve} | props
return set_valve(network, ChangeSet(ps))

View File

@@ -0,0 +1,202 @@
import json
from fastapi import APIRouter, Request, HTTPException
from fastapi.responses import PlainTextResponse
from typing import Any, Dict
import app.services.project_info as project_info
from app.native.api import ChangeSet
from app.services.tjnetwork import (
list_project,
have_project,
create_project,
delete_project,
is_project_open,
open_project,
close_project,
copy_project,
import_inp,
export_inp,
read_inp,
dump_inp,
get_all_vertices,
get_all_scada_elements,
get_all_district_metering_areas,
get_all_service_areas,
get_all_virtual_districts,
get_extension_data,
convert_inp_v3_to_v2,
)
# For inp file upload/download
import os
from fastapi import Response, status
from fastapi.responses import FileResponse
inpDir = "data/" # Assuming data directory exists or is defined somewhere.
# In main.py it was likely global. For safety, let's use a relative path or get from config.
# But let's stick to what main.py probably used or a default.
router = APIRouter()
lockedPrjs: Dict[str, str] = {}
@router.get("/listprojects/")
async def list_projects_endpoint() -> list[str]:
return list_project()
@router.get("/haveproject/")
async def have_project_endpoint(network: str):
return have_project(network)
@router.post("/createproject/")
async def create_project_endpoint(network: str):
create_project(network)
return network
@router.post("/deleteproject/")
async def delete_project_endpoint(network: str):
delete_project(network)
return True
@router.get("/isprojectopen/")
async def is_project_open_endpoint(network: str):
return is_project_open(network)
@router.post("/openproject/")
async def open_project_endpoint(network: str):
open_project(network)
return network
@router.post("/closeproject/")
async def close_project_endpoint(network: str):
close_project(network)
return True
@router.post("/copyproject/")
async def copy_project_endpoint(source: str, target: str):
copy_project(source, target)
return True
@router.post("/importinp/")
async def import_inp_endpoint(network: str, req: Request):
jo_root = await req.json()
inp_text = jo_root["inp"]
ps = {"inp": inp_text}
ret = import_inp(network, ChangeSet(ps))
print(ret)
return ret
@router.get("/exportinp/", response_model=None)
async def export_inp_endpoint(network: str, version: str) -> ChangeSet:
cs = export_inp(network, version)
op = cs.operations[0]
open_project(network)
op["vertex"] = json.dumps(get_all_vertices(network))
op["scada"] = json.dumps(get_all_scada_elements(network))
op["dma"] = json.dumps(get_all_district_metering_areas(network))
op["sa"] = json.dumps(get_all_service_areas(network))
op["vd"] = json.dumps(get_all_virtual_districts(network))
op["legend"] = get_extension_data(network, "legend")
db = get_extension_data(network, "scada_db")
print(db)
scada_db = ""
if db:
scada_db = db
print(scada_db)
op["scada_db"] = scada_db
close_project(network)
return cs
@router.post("/readinp/")
async def read_inp_endpoint(network: str, inp: str) -> bool:
read_inp(network, inp)
return True
@router.get("/dumpinp/")
async def dump_inp_endpoint(network: str, inp: str) -> bool:
dump_inp(network, inp)
return True
@router.get("/isprojectlocked/")
async def is_project_locked_endpoint(network: str, req: Request):
return network in lockedPrjs.keys()
@router.get("/isprojectlockedbyme/")
async def is_project_locked_by_me_endpoint(network: str, req: Request):
client_host = req.client.host
return lockedPrjs.get(network) == client_host
# 0 successfully locked
# 1 already locked by you
# 2 locked by others
@router.post("/lockproject/")
async def lock_project_endpoint(network: str, req: Request):
client_host = req.client.host
if not network in lockedPrjs.keys():
lockedPrjs[network] = client_host
return 0
else:
if lockedPrjs.get(network) == client_host:
return 1
else:
return 2
@router.post("/unlockproject/")
def unlock_project_endpoint(network: str, req: Request):
client_host = req.client.host
if lockedPrjs.get(network) == client_host:
print("delete key")
del lockedPrjs[network]
return True
return False
# inp file operations
@router.post("/uploadinp/", status_code=status.HTTP_200_OK)
async def fastapi_upload_inp(afile: bytes, name: str):
if not os.path.exists(inpDir):
os.makedirs(inpDir, exist_ok=True)
filePath = inpDir + str(name)
with open(filePath, "wb") as f:
f.write(afile)
return True
@router.get("/downloadinp/", status_code=status.HTTP_200_OK)
async def fastapi_download_inp(name: str, response: Response):
filePath = inpDir + name
if os.path.exists(filePath):
return FileResponse(
filePath, media_type="application/octet-stream", filename="inp.inp"
)
else:
response.status_code = status.HTTP_400_BAD_REQUEST
return True
# DingZQ, 2024-12-28, convert v3 to v2
@router.get("/convertv3tov2/", response_model=None)
async def fastapi_convert_v3_to_v2(req: Request) -> ChangeSet:
network = "v3Tov2"
jo_root = await req.json()
inp = jo_root["inp"]
cs = convert_inp_v3_to_v2(inp)
op = cs.operations[0]
open_project(network)
op["vertex"] = json.dumps(get_all_vertices(network))
op["scada"] = json.dumps(get_all_scada_elements(network))
op["dma"] = json.dumps(get_all_district_metering_areas(network))
op["sa"] = json.dumps(get_all_service_areas(network))
op["vd"] = json.dumps(get_all_virtual_districts(network))
op["legend"] = get_extension_data(network, "legend")
db = get_extension_data(network, "scada_db")
print(db)
scada_db = ""
if db:
scada_db = db
print(scada_db)
op["scada_db"] = scada_db
close_project(network)
return cs

View File

@@ -0,0 +1,17 @@
from typing import Any
from fastapi import APIRouter
from app.native.api import ChangeSet
from app.services.tjnetwork import (
get_scada_info,
get_all_scada_info,
)
router = APIRouter()
@router.get("/getscadaproperties/")
async def fast_get_scada_properties(network: str, scada: str) -> dict[str, Any]:
return get_scada_info(network, scada)
@router.get("/getallscadaproperties/")
async def fast_get_all_scada_properties(network: str) -> list[dict[str, Any]]:
return get_all_scada_info(network)

View File

@@ -0,0 +1,140 @@
from typing import Any
from fastapi import APIRouter, HTTPException
from fastapi.responses import PlainTextResponse
from app.infra.cache.redis_client import redis_client
from app.services.tjnetwork import (
run_project,
run_project_return_dict,
run_inp,
dump_output,
)
from app.algorithms.online_Analysis import (
burst_analysis,
valve_close_analysis,
flushing_analysis,
contaminant_simulation,
age_analysis,
scheduling_analysis,
pressure_regulation,
project_management,
daily_scheduling_analysis,
network_update,
pump_failure,
pressure_sensor_placement_sensitivity,
pressure_sensor_placement_kmeans,
)
router = APIRouter()
# 必须用这个PlainTextResponse不然每个key都有引号
@router.get("/runproject/", response_class=PlainTextResponse)
async def run_project_endpoint(network: str) -> str:
lock_key = "exclusive_api_lock"
timeout = 120 # 锁自动过期时间(秒)
# 尝试获取锁NX=True: 不存在时设置EX=timeout: 过期时间)
acquired = redis_client.set(lock_key, "locked", nx=True, ex=timeout)
if not acquired:
raise HTTPException(status_code=409, detail="is in simulation")
else:
try:
return run_project(network)
finally:
# 手动释放锁(可选,依赖过期时间自动释放更安全)
redis_client.delete(lock_key)
# DingZQ, 2025-02-04, 返回dict[str, Any]
# output 和 report
# output 是 json
# report 是 text
@router.get("/runprojectreturndict/")
async def run_project_return_dict_endpoint(network: str) -> dict[str, Any]:
lock_key = "exclusive_api_lock"
timeout = 120 # 锁自动过期时间(秒)
# 尝试获取锁NX=True: 不存在时设置EX=timeout: 过期时间)
acquired = redis_client.set(lock_key, "locked", nx=True, ex=timeout)
if not acquired:
raise HTTPException(status_code=409, detail="is in simulation")
else:
try:
return run_project_return_dict(network)
finally:
# 手动释放锁(可选,依赖过期时间自动释放更安全)
redis_client.delete(lock_key)
# put in inp folder, name without extension
@router.get("/runinp/")
async def run_inp_endpoint(network: str) -> str:
return run_inp(network)
# path is absolute path
@router.get("/dumpoutput/")
async def dump_output_endpoint(output: str) -> str:
return dump_output(output)
# Analysis Endpoints
@router.get("/burstanalysis/")
async def burst_analysis_endpoint(network: str, pipe_id: str, start_time: str, end_time: str, burst_flow: float):
return burst_analysis(network, pipe_id, start_time, end_time, burst_flow)
@router.get("/valvecloseanalysis/")
async def valve_close_analysis_endpoint(network: str, valve_id: str, start_time: str, end_time: str):
return valve_close_analysis(network, valve_id, start_time, end_time)
@router.get("/flushinganalysis/")
async def flushing_analysis_endpoint(network: str, pipe_id: str, start_time: str, duration: float, flow: float):
return flushing_analysis(network, pipe_id, start_time, duration, flow)
@router.get("/contaminantsimulation/")
async def contaminant_simulation_endpoint(network: str, node_id: str, start_time: str, duration: float, concentration: float):
return contaminant_simulation(network, node_id, start_time, duration, concentration)
@router.get("/ageanalysis/")
async def age_analysis_endpoint(network: str):
return age_analysis(network)
@router.get("/schedulinganalysis/")
async def scheduling_analysis_endpoint(network: str):
return scheduling_analysis(network)
@router.get("/pressureregulation/")
async def pressure_regulation_endpoint(network: str, target_node: str, target_pressure: float):
return pressure_regulation(network, target_node, target_pressure)
@router.get("/projectmanagement/")
async def project_management_endpoint(network: str):
return project_management(network)
@router.get("/dailyschedulinganalysis/")
async def daily_scheduling_analysis_endpoint(network: str):
return daily_scheduling_analysis(network)
@router.get("/networkupdate/")
async def network_update_endpoint(network: str):
return network_update(network)
@router.get("/pumpfailure/")
async def pump_failure_endpoint(network: str, pump_id: str, time: str):
return pump_failure(network, pump_id, time)
@router.get("/pressuresensorplacementsensitivity/")
async def pressure_sensor_placement_sensitivity_endpoint(
name: str, scheme_name: str, sensor_number: int, min_diameter: int, username: str
):
return pressure_sensor_placement_sensitivity(
name, scheme_name, sensor_number, min_diameter, username
)
@router.get("/pressuresensorplacementkmeans/")
async def pressure_sensor_placement_kmeans_endpoint(
name: str, scheme_name: str, sensor_number: int, min_diameter: int, username: str
):
return pressure_sensor_placement_kmeans(
name, scheme_name, sensor_number, min_diameter, username
)

View File

@@ -0,0 +1,104 @@
from fastapi import APIRouter, Request
from app.native.api import ChangeSet
from app.services.tjnetwork import (
get_current_operation,
execute_undo,
execute_redo,
list_snapshot,
have_snapshot,
have_snapshot_for_operation,
have_snapshot_for_current_operation,
take_snapshot_for_operation,
take_snapshot_for_current_operation,
take_snapshot,
pick_snapshot,
pick_operation,
sync_with_server,
execute_batch_commands,
execute_batch_command,
get_restore_operation,
set_restore_operation,
)
router = APIRouter()
@router.get("/getcurrentoperationid/")
async def get_current_operation_id_endpoint(network: str) -> int:
return get_current_operation(network)
@router.post("/undo/")
async def undo_endpoint(network: str):
return execute_undo(network)
@router.post("/redo/")
async def redo_endpoint(network: str):
return execute_redo(network)
@router.get("/getsnapshots/")
async def list_snapshot_endpoint(network: str) -> list[tuple[int, str]]:
return list_snapshot(network)
@router.get("/havesnapshot/")
async def have_snapshot_endpoint(network: str, tag: str) -> bool:
return have_snapshot(network, tag)
@router.get("/havesnapshotforoperation/")
async def have_snapshot_for_operation_endpoint(network: str, operation: int) -> bool:
return have_snapshot_for_operation(network, operation)
@router.get("/havesnapshotforcurrentoperation/")
async def have_snapshot_for_current_operation_endpoint(network: str) -> bool:
return have_snapshot_for_current_operation(network)
@router.post("/takesnapshotforoperation/")
async def take_snapshot_for_operation_endpoint(
network: str, operation: int, tag: str
) -> None:
return take_snapshot_for_operation(network, operation, tag)
@router.post("/takesnapshotforcurrentoperation")
async def take_snapshot_for_current_operation_endpoint(network: str, tag: str) -> None:
return take_snapshot_for_current_operation(network, tag)
@router.post("/takesnapshot/")
async def take_snapshot_endpoint(network: str, tag: str) -> None:
return take_snapshot(network, tag)
@router.post("/picksnapshot/", response_model=None)
async def pick_snapshot_endpoint(network: str, tag: str, discard: bool = False) -> ChangeSet:
return pick_snapshot(network, tag, discard)
@router.post("/pickoperation/", response_model=None)
async def pick_operation_endpoint(
network: str, operation: int, discard: bool = False
) -> ChangeSet:
return pick_operation(network, operation, discard)
@router.get("/syncwithserver/", response_model=None)
async def sync_with_server_endpoint(network: str, operation: int) -> ChangeSet:
return sync_with_server(network, operation)
@router.post("/batch/", response_model=None)
async def execute_batch_commands_endpoint(network: str, req: Request) -> ChangeSet:
jo_root = await req.json()
cs: ChangeSet = ChangeSet()
cs.operations = jo_root["operations"]
rcs = execute_batch_commands(network, cs)
return rcs
@router.post("/compressedbatch/", response_model=None)
async def execute_compressed_batch_commands_endpoint(
network: str, req: Request
) -> ChangeSet:
jo_root = await req.json()
cs: ChangeSet = ChangeSet()
cs.operations = jo_root["operations"]
return execute_batch_command(network, cs)
@router.get("/getrestoreoperation/")
async def get_restore_operation_endpoint(network: str) -> int:
return get_restore_operation(network)
@router.post("/setrestoreoperation/")
async def set_restore_operation_endpoint(network: str, operation: int) -> None:
return set_restore_operation(network, operation)

View File

@@ -0,0 +1,37 @@
from fastapi import APIRouter, Request
from typing import Any, List, Dict, Union
from app.services.tjnetwork import *
router = APIRouter()
###########################################################
# user 39
###########################################################
@router.get("/getuserschema/")
async def fastapi_get_user_schema(network: str) -> dict[str, dict[Any, Any]]:
return get_user_schema(network)
@router.get("/getuser/")
async def fastapi_get_user(network: str, user_name: str) -> dict[Any, Any]:
return get_user(network, user_name)
@router.get("/getallusers/")
async def fastapi_get_all_users(network: str) -> list[dict[Any, Any]]:
return get_all_users(network)
############################################################
# scheme 40
############################################################
@router.get("/getschemeschema/")
async def fastapi_get_scheme_schema(network: str) -> dict[str, dict[Any, Any]]:
return get_scheme_schema(network)
@router.get("/getscheme/")
async def fastapi_get_scheme(network: str, schema_name: str) -> dict[Any, Any]:
return get_scheme(network, schema_name)
@router.get("/getallschemes/")
async def fastapi_get_all_schemes(network: str) -> list[dict[Any, Any]]:
return get_all_schemes(network)

View File

@@ -2,19 +2,70 @@ from fastapi import APIRouter
from app.api.v1.endpoints import (
auth,
project,
network_elements,
simulation,
scada,
extension,
snapshots
snapshots,
data_query,
users
)
from app.api.v1.endpoints.network import (
general,
junctions,
reservoirs,
tanks,
pipes,
pumps,
valves,
tags,
demands,
geometry,
regions,
)
from app.api.v1.endpoints.components import (
curves,
patterns,
controls,
options,
quality,
visuals,
)
api_router = APIRouter()
api_router.include_router(auth.router, prefix="/auth", tags=["auth"])
api_router.include_router(project.router, prefix="/projects", tags=["projects"])
api_router.include_router(network_elements.router, prefix="/elements", tags=["network-elements"])
api_router.include_router(simulation.router, prefix="/simulation", tags=["simulation"])
api_router.include_router(scada.router, prefix="/scada", tags=["scada"])
api_router.include_router(extension.router, prefix="/extension", tags=["extension"])
api_router.include_router(snapshots.router, prefix="/snapshots", tags=["snapshots"])
# Core Services
api_router.include_router(auth.router, tags=["Auth"])
api_router.include_router(project.router, tags=["Project"])
# Network Elements (Node/Link Types)
api_router.include_router(general.router, tags=["Network General"])
api_router.include_router(junctions.router, tags=["Junctions"])
api_router.include_router(reservoirs.router, tags=["Reservoirs"])
api_router.include_router(tanks.router, tags=["Tanks"])
api_router.include_router(pipes.router, tags=["Pipes"])
api_router.include_router(pumps.router, tags=["Pumps"])
api_router.include_router(valves.router, tags=["Valves"])
# Network Features
api_router.include_router(tags.router, tags=["Tags"])
api_router.include_router(demands.router, tags=["Demands"])
api_router.include_router(geometry.router, tags=["Geometry & Coordinates"])
api_router.include_router(regions.router, tags=["Regions & DMAs"])
# Components & Controls
api_router.include_router(curves.router, tags=["Curves"])
api_router.include_router(patterns.router, tags=["Patterns"])
api_router.include_router(controls.router, tags=["Controls & Rules"])
api_router.include_router(options.router, tags=["Options"])
api_router.include_router(quality.router, tags=["Quality"])
api_router.include_router(visuals.router, tags=["Visuals"])
# Simulation & Data
api_router.include_router(simulation.router, tags=["Simulation Control"])
api_router.include_router(data_query.router, tags=["Data Query & InfluxDB"])
api_router.include_router(scada.router, tags=["SCADA"])
api_router.include_router(snapshots.router, tags=["Snapshots"])
api_router.include_router(users.router, tags=["Users & Schemes"])
# Extension
api_router.include_router(extension.router, tags=["Extension"])