from fastapi import APIRouter, Request, Query, Path, Body from typing import Any, List, Dict, Union from app.services.tjnetwork import ( Any, ChangeSet, add_tank, delete_tank, get_all_tanks, get_tank, get_tank_schema, set_tank, ) router = APIRouter() @router.get("/gettankschema", summary="获取水箱模式", description="获取指定网络的水箱数据结构模式定义") async def fast_get_tank_schema(network: str = Query(..., description="管网名称(或数据库名称)")) -> dict[str, dict[str, Any]]: """ 获取水箱的数据结构模式。 Args: network: 管网名称(或数据库名称) Returns: 包含水箱属性的模式定义字典 """ return get_tank_schema(network) @router.post("/addtank/", summary="新增水箱", description="向指定网络中新增一个水箱", response_model=None) async def fastapi_add_tank( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), x: float = Query(..., description="X坐标"), y: float = Query(..., description="Y坐标"), elevation: float = Query(..., description="标高"), init_level: float = Query(0, description="初始水位"), min_level: float = Query(0, description="最小水位"), max_level: float = Query(0, description="最大水位"), diameter: float = Query(0, description="直径"), min_vol: float = Query(0, description="最小体积"), ) -> ChangeSet: """ 创建新水箱。 Args: network: 管网名称(或数据库名称) tank: 水箱ID x: X坐标 y: Y坐标 elevation: 水箱标高 init_level: 初始水位,默认为0 min_level: 最小水位,默认为0 max_level: 最大水位,默认为0 diameter: 水箱直径,默认为0 min_vol: 最小体积,默认为0 Returns: 包含变更信息的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/", summary="删除水箱", description="删除指定网络中的水箱", response_model=None) async def fastapi_delete_tank( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> ChangeSet: """ 删除指定的水箱。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank} return delete_tank(network, ChangeSet(ps)) @router.get("/gettankelevation/", summary="获取水箱标高", description="获取指定水箱的标高值") async def fastapi_get_tank_elevation( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float | None: """ 获取水箱的标高。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱标高值,如果不存在则返回None """ ps = get_tank(network, tank) return ps["elevation"] @router.get("/gettankinitlevel/", summary="获取水箱初始水位", description="获取指定水箱的初始水位值") async def fastapi_get_tank_init_level( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float | None: """ 获取水箱的初始水位。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱初始水位值,如果不存在则返回None """ ps = get_tank(network, tank) return ps["init_level"] @router.get("/gettankminlevel/", summary="获取水箱最小水位", description="获取指定水箱的最小水位值") async def fastapi_get_tank_min_level( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float | None: """ 获取水箱的最小水位。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱最小水位值,如果不存在则返回None """ ps = get_tank(network, tank) return ps["min_level"] @router.get("/gettankmaxlevel/", summary="获取水箱最大水位", description="获取指定水箱的最大水位值") async def fastapi_get_tank_max_level( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float | None: """ 获取水箱的最大水位。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱最大水位值,如果不存在则返回None """ ps = get_tank(network, tank) return ps["max_level"] @router.get("/gettankdiameter/", summary="获取水箱直径", description="获取指定水箱的直径值") async def fastapi_get_tank_diameter( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float | None: """ 获取水箱的直径。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱直径值,如果不存在则返回None """ ps = get_tank(network, tank) return ps["diameter"] @router.get("/gettankminvol/", summary="获取水箱最小体积", description="获取指定水箱的最小体积值") async def fastapi_get_tank_min_vol( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float | None: """ 获取水箱的最小体积。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱最小体积值,如果不存在则返回None """ ps = get_tank(network, tank) return ps["min_vol"] @router.get("/gettankvolcurve/", summary="获取水箱容积曲线", description="获取指定水箱的容积曲线标识") async def fastapi_get_tank_vol_curve( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> str | None: """ 获取水箱的容积曲线。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱容积曲线标识,如果不存在则返回None """ ps = get_tank(network, tank) return ps["vol_curve"] @router.get("/gettankoverflow/", summary="获取水箱溢流口", description="获取指定水箱的溢流口配置") async def fastapi_get_tank_overflow( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> str | None: """ 获取水箱的溢流口配置。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱溢流口配置,如果不存在则返回None """ ps = get_tank(network, tank) return ps["overflow"] @router.get("/gettankx/", summary="获取水箱X坐标", description="获取指定水箱的X坐标值") async def fastapi_get_tank_x( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float: """ 获取水箱的X坐标。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱X坐标值 """ ps = get_tank(network, tank) return ps["x"] @router.get("/gettanky/", summary="获取水箱Y坐标", description="获取指定水箱的Y坐标值") async def fastapi_get_tank_y( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> float: """ 获取水箱的Y坐标。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 水箱Y坐标值 """ ps = get_tank(network, tank) return ps["y"] @router.get("/gettankcoord/", summary="获取水箱坐标", description="获取指定水箱的X和Y坐标") async def fastapi_get_tank_coord( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> dict[str, float]: """ 获取水箱的坐标。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 包含x和y坐标的字典 """ ps = get_tank(network, tank) coord = {"x": ps["x"], "y": ps["y"]} return coord @router.post("/settankelevation/", summary="设置水箱标高", description="设置指定水箱的标高值", response_model=None) async def fastapi_set_tank_elevation( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), elevation: float = Query(..., description="新的标高值") ) -> ChangeSet: """ 设置水箱的标高。 Args: network: 管网名称(或数据库名称) tank: 水箱ID elevation: 新的标高值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "elevation": elevation} return set_tank(network, ChangeSet(ps)) @router.post("/settankinitlevel/", summary="设置水箱初始水位", description="设置指定水箱的初始水位值", response_model=None) async def fastapi_set_tank_init_level( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), init_level: float = Query(..., description="新的初始水位值") ) -> ChangeSet: """ 设置水箱的初始水位。 Args: network: 管网名称(或数据库名称) tank: 水箱ID init_level: 新的初始水位值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "init_level": init_level} return set_tank(network, ChangeSet(ps)) @router.post("/settankminlevel/", summary="设置水箱最小水位", description="设置指定水箱的最小水位值", response_model=None) async def fastapi_set_tank_min_level( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), min_level: float = Query(..., description="新的最小水位值") ) -> ChangeSet: """ 设置水箱的最小水位。 Args: network: 管网名称(或数据库名称) tank: 水箱ID min_level: 新的最小水位值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "min_level": min_level} return set_tank(network, ChangeSet(ps)) @router.post("/settankmaxlevel/", summary="设置水箱最大水位", description="设置指定水箱的最大水位值", response_model=None) async def fastapi_set_tank_max_level( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), max_level: float = Query(..., description="新的最大水位值") ) -> ChangeSet: """ 设置水箱的最大水位。 Args: network: 管网名称(或数据库名称) tank: 水箱ID max_level: 新的最大水位值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "max_level": max_level} return set_tank(network, ChangeSet(ps)) @router.post("/settankdiameter/", summary="设置水箱直径", description="设置指定水箱的直径值", response_model=None) async def fastapi_set_tank_diameter( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), diameter: float = Query(..., description="新的直径值") ) -> ChangeSet: """ 设置水箱的直径。 Args: network: 管网名称(或数据库名称) tank: 水箱ID diameter: 新的直径值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "diameter": diameter} return set_tank(network, ChangeSet(ps)) @router.post("/settankminvol/", summary="设置水箱最小体积", description="设置指定水箱的最小体积值", response_model=None) async def fastapi_set_tank_min_vol( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), min_vol: float = Query(..., description="新的最小体积值") ) -> ChangeSet: """ 设置水箱的最小体积。 Args: network: 管网名称(或数据库名称) tank: 水箱ID min_vol: 新的最小体积值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "min_vol": min_vol} return set_tank(network, ChangeSet(ps)) @router.post("/settankvolcurve/", summary="设置水箱容积曲线", description="设置指定水箱的容积曲线标识", response_model=None) async def fastapi_set_tank_vol_curve( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), vol_curve: str = Query(..., description="新的容积曲线标识") ) -> ChangeSet: """ 设置水箱的容积曲线。 Args: network: 管网名称(或数据库名称) tank: 水箱ID vol_curve: 新的容积曲线标识 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "vol_curve": vol_curve} return set_tank(network, ChangeSet(ps)) @router.post("/settankoverflow/", summary="设置水箱溢流口", description="设置指定水箱的溢流口配置", response_model=None) async def fastapi_set_tank_overflow( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), overflow: str = Query(..., description="新的溢流口配置") ) -> ChangeSet: """ 设置水箱的溢流口配置。 Args: network: 管网名称(或数据库名称) tank: 水箱ID overflow: 新的溢流口配置 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "overflow": overflow} return set_tank(network, ChangeSet(ps)) @router.post("/settankx/", summary="设置水箱X坐标", description="设置指定水箱的X坐标值", response_model=None) async def fastapi_set_tank_x( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), x: float = Query(..., description="新的X坐标值") ) -> ChangeSet: """ 设置水箱的X坐标。 Args: network: 管网名称(或数据库名称) tank: 水箱ID x: 新的X坐标值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "x": x} return set_tank(network, ChangeSet(ps)) @router.post("/settanky/", summary="设置水箱Y坐标", description="设置指定水箱的Y坐标值", response_model=None) async def fastapi_set_tank_y( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), y: float = Query(..., description="新的Y坐标值") ) -> ChangeSet: """ 设置水箱的Y坐标。 Args: network: 管网名称(或数据库名称) tank: 水箱ID y: 新的Y坐标值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "y": y} return set_tank(network, ChangeSet(ps)) @router.post("/settankcoord/", summary="设置水箱坐标", description="设置指定水箱的X和Y坐标", response_model=None) async def fastapi_set_tank_coord( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), x: float = Query(..., description="新的X坐标值"), y: float = Query(..., description="新的Y坐标值") ) -> ChangeSet: """ 设置水箱的坐标。 Args: network: 管网名称(或数据库名称) tank: 水箱ID x: 新的X坐标值 y: 新的Y坐标值 Returns: 包含变更信息的ChangeSet对象 """ ps = {"id": tank, "x": x, "y": y} return set_tank(network, ChangeSet(ps)) @router.get("/gettankproperties/", summary="获取水箱属性", description="获取指定水箱的所有属性") async def fastapi_get_tank_properties( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID") ) -> dict[str, Any]: """ 获取水箱的所有属性。 Args: network: 管网名称(或数据库名称) tank: 水箱ID Returns: 包含水箱所有属性的字典 """ return get_tank(network, tank) @router.get("/getalltankproperties/", summary="获取所有水箱属性", description="获取指定网络中所有水箱的属性") async def fastapi_get_all_tank_properties( network: str = Query(..., description="管网名称(或数据库名称)") ) -> list[dict[str, Any]]: """ 获取网络中所有水箱的属性。 Args: network: 管网名称(或数据库名称) Returns: 包含所有水箱属性的字典列表 """ # 缓存查询结果提高性能 # global redis_client results = get_all_tanks(network) return results @router.post("/settankproperties/", summary="设置水箱属性", description="批量设置指定水箱的多个属性", response_model=None) async def fastapi_set_tank_properties( network: str = Query(..., description="管网名称(或数据库名称)"), tank: str = Query(..., description="水箱ID"), req: Request = None ) -> ChangeSet: """ 批量设置水箱的属性。 Args: network: 管网名称(或数据库名称) tank: 水箱ID req: 包含水箱属性的请求体(JSON格式) Returns: 包含变更信息的ChangeSet对象 """ props = await req.json() ps = {"id": tank} | props return set_tank(network, ChangeSet(ps))