import json from fastapi import APIRouter, HTTPException, Query, Depends from app.infra.db.metadb.repositories.metadata_repository import MetadataRepository from app.auth.project_dependencies import ( get_metadata_repository, ) from app.domain.schemas.metadata import ProjectMetaResponse from app.services.tjnetwork import ( ChangeSet, export_inp, get_all_vertices, get_all_scada_info, ) router = APIRouter() @router.get("/projects/current", summary="获取项目信息", description="从数据库获取项目的详细信息,包括地图范围等。", response_model=ProjectMetaResponse) async def get_project_info_endpoint( network: str = Query(..., description="管网名称(或项目代码)"), metadata_repo: MetadataRepository = Depends(get_metadata_repository), ): """ 获取项目信息 - **network**: 管网名称(或项目代码) """ project_detail = await metadata_repo.get_project_detail_by_code(network) if not project_detail: raise HTTPException(status_code=404, detail=f"Project {network} not found") return ProjectMetaResponse( project_id=project_detail.project_id, name=project_detail.name, code=project_detail.code, description=project_detail.description, gs_workspace=project_detail.gs_workspace, map_extent=project_detail.map_extent, status=project_detail.status, project_role="viewer", # Default role for public access ) @router.get("/projects/current/exports/change-set", response_model=None, summary="导出项目为 ChangeSet", description="导出项目的变更集 (ChangeSet),包含顶点、SCADA 元素、DMA、SA、VD 等信息。") def export_inp_endpoint( network: str = Query(..., description="管网名称(或数据库名称)"), version: str = Query(..., description="版本号 (通常用于增量更新)") ) -> ChangeSet: """ 导出项目为 ChangeSet - **network**: 管网名称(或数据库名称) - **version**: 版本号 """ cs = export_inp(network, version) op = cs.operations[0] op["vertex"] = json.dumps(get_all_vertices(network)) op["scada"] = json.dumps(get_all_scada_info(network)) return cs