126 lines
4.7 KiB
Python
126 lines
4.7 KiB
Python
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)}",
|
||
) |