from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List from ..core.database import get_db from ..core.response_code import ResponseCode, ResponseMessage from ..schemas.level_data import ( LevelDataRequest, LevelDataListResponse, LevelDataResponse, BatchDeleteByLinecodesRequest, BatchDeleteByLinecodesResponse, LinecodeRequest, NyidListResponse, SyncLoseDataRequest, SyncLoseDataResponse, ) from ..services.level_data import LevelDataService router = APIRouter(prefix="/level_data", tags=["水准数据"]) @router.post("/get_level_data_by_project", response_model=LevelDataListResponse) def get_level_data_by_project(request: LevelDataRequest, db: Session = Depends(get_db)): """ 通过标段名称获取全部水准线路 """ try: level_service = LevelDataService() level_data_list = level_service.get_level_data_by_project_name(db, project_name=request.project_name, nyid_max=request.nyid_max) return LevelDataListResponse( code=ResponseCode.SUCCESS, message="查询成功", total=len(level_data_list), data=level_data_list ) except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"查询失败: {str(e)}" ) @router.post("/get_nyids_by_linecode", response_model=NyidListResponse) def get_nyids_by_linecode(request: LinecodeRequest, db: Session = Depends(get_db)): """ 通过水准线路编码返回该线路下所有 NYID,只返回 NYID 列表(去重、按 NYID 降序) """ try: level_service = LevelDataService() level_list = level_service.get_by_linecode(db, linecode=request.linecode) nyids = sorted( {str(item.NYID) for item in level_list if item.NYID}, key=lambda x: int(x) if str(x).isdigit() else 0, reverse=True, ) return NyidListResponse( code=ResponseCode.SUCCESS, message=ResponseMessage.SUCCESS, data=nyids, ) except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"查询失败: {str(e)}", ) @router.post("/batch_delete_by_linecodes", response_model=BatchDeleteByLinecodesResponse) def batch_delete_by_linecodes(request: BatchDeleteByLinecodesRequest, db: Session = Depends(get_db)): """ 根据水准线路编码列表批量删除相关数据 删除顺序:原始数据 → 沉降数据 → 观测点数据 → 水准数据 删除前会备份数据为SQL文件 """ try: level_service = LevelDataService() result = level_service.batch_delete_by_linecodes(db, linecodes=request.linecodes) return BatchDeleteByLinecodesResponse( code=0 if result['success'] else 1, message=result['message'], success=result['success'], backup_file=result.get('backup_file'), deleted_counts=result.get('deleted_counts') ) except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"批量删除失败: {str(e)}" ) @router.post("/sync_lose_data", response_model=SyncLoseDataResponse) def sync_lose_data( request: SyncLoseDataRequest = SyncLoseDataRequest(), db: Session = Depends(get_db), ): """ 同步缺失数据到 lose_data 表。 - 不传 linecode:按所有水准线路的 NYID 计算缺失并写入,仅返回是否处理成功。 - 传 linecode:只处理该水准线路,并返回该线路的缺失数据记录列表。 缺失规则:原始数据无=1、沉降数据无=2,lose_data 为二者之和(0/1/2/3)。 """ try: level_service = LevelDataService() result = level_service.sync_lose_data(db, linecode=request.linecode) if result.get("data") is None: data = {"success": result["success"]} if not result["success"]: return SyncLoseDataResponse( code=1, message=result.get("message", "处理失败"), data=data, ) else: data = result["data"] return SyncLoseDataResponse( code=0 if result["success"] else 1, message=ResponseMessage.SUCCESS if result["success"] else (result.get("message") or "处理失败"), data=data, ) except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"同步缺失数据失败: {str(e)}", )