diff --git a/app/api/comprehensive_data.py b/app/api/comprehensive_data.py index 8f20285..89fdfc2 100644 --- a/app/api/comprehensive_data.py +++ b/app/api/comprehensive_data.py @@ -13,6 +13,7 @@ from ..schemas.comprehensive_data import ( SectionDataQueryRequest, SettlementDataQueryRequest, OriginalDataQueryRequest, + SettlementDataCheckpointQueryRequest, LevelDataQueryRequest ) from ..services.section_data import SectionDataService @@ -207,6 +208,40 @@ def get_settlement(request: SettlementDataQueryRequest, db: Session = Depends(ge detail=f"查询沉降数据失败: {str(e)}" ) +# 查询沉降数据+观测点数据 +@router.post("/get_settlement_checkpoint", response_model=DataResponse) +def get_settlement_checkpoint(request: SettlementDataCheckpointQueryRequest, db: Session = Depends(get_db)): + """获取沉降数据+观测点数据,按上传时间倒序排序,支持limit参数限制返回数量""" + try: + logger.info(f"Querying settlement data with params: {request.dict()}") + + # 调用服务层的业务方法 + result_data = settlement_service.search_settlement_checkpoint_data_formatted( + db, + id=request.id, + point_id=request.point_id, + nyid=request.NYID, + sjName=request.sjName, + workinfoname=request.workinfoname, + linecode=request.linecode, + limit=request.limit + ) + + logger.info(f"Found {len(result_data)} settlement records") + return DataResponse( + success=True, + message="查询成功", + count=len(result_data), + data=result_data + ) + + except Exception as e: + logger.error(f"Query settlement data failed: {str(e)}") + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"查询沉降数据失败: {str(e)}" + ) + # 根据期数id获取原始数据 @router.post("/get_original", response_model=DataResponse) diff --git a/app/schemas/comprehensive_data.py b/app/schemas/comprehensive_data.py index 8873305..b06534b 100644 --- a/app/schemas/comprehensive_data.py +++ b/app/schemas/comprehensive_data.py @@ -103,6 +103,31 @@ class SettlementDataQueryRequest(BaseModel): upd_remark: Optional[str] = None limit: Optional[int] = None # 限制返回数量,None表示返回全部 +# 沉降数据查询请求——水准线路编码 +class SettlementDataCheckpointQueryRequest(BaseModel): + id: Optional[int] = None + point_id: Optional[int] = None + NYID: Optional[int] = None + CVALUE: Optional[str] = None + MAVALUE: Optional[str] = None + MTIME_W: Optional[str] = None + PRELOADH: Optional[str] = None + PSTATE: Optional[str] = None + createdate: Optional[str] = None + day: Optional[str] = None + day_jg: Optional[str] = None + REMARK: Optional[str] = None + WORKINFO: Optional[str] = None + useflag: Optional[str] = None + mavalue_lj: Optional[str] = None + mavalue_bc: Optional[str] = None + sjName: Optional[str] = None + workinfoname: Optional[str] = None + isgzjdxz: Optional[str] = None + upd_remark: Optional[str] = None + linecode: Optional[str] = None + limit: Optional[int] = None # 限制返回数量,None表示返回全部 + # 断面数据导入请求 class SectionDataQueryRequest(BaseModel): id: Optional[int] = None diff --git a/app/services/settlement_data.py b/app/services/settlement_data.py index 5e63794..26416ee 100644 --- a/app/services/settlement_data.py +++ b/app/services/settlement_data.py @@ -91,6 +91,117 @@ class SettlementDataService(BaseService[SettlementData]): return result + def search_settlement_checkpoint_data_formatted(self, db: Session, + id: Optional[int] = None, + point_id: Optional[str] = None, + nyid: Optional[str] = None, + sjName: Optional[str] = None, + workinfoname: Optional[str] = None, + linecode: Optional[str] = None, + limit: Optional[int] = None) -> List[Dict[str, Any]]: + """ + 通过水准线路编码查询沉降数据与观测点数据 + 业务逻辑: + 1. 先查询水准数据(通过linecode) + 2. 用水准数据的NYID查询沉降数据 + 3. 将沉降数据中观测点id对应的观测点数据查询 + 4. 返回以观测点为上层的结构,每个观测点下有沉降数据列表 + """ + from ..models.level_data import LevelData + from ..models.checkpoint import Checkpoint + + # 1. 查询水准数据(通过linecode) + query = db.query(LevelData) + if linecode is not None: + query = query.filter(LevelData.linecode == linecode) + level_data_list = query.all() + + if not level_data_list: + return [] + + # 2. 收集所有的NYID + nyid_list = [level.NYID for level in level_data_list if level.NYID] + + if not nyid_list: + return [] + + # 3. 查询沉降数据(通过NYID列表) + settlement_query = db.query(SettlementData).filter(SettlementData.NYID.in_(nyid_list)) + + # 应用其他查询条件 + if id is not None: + settlement_query = settlement_query.filter(SettlementData.id == id) + if point_id is not None: + settlement_query = settlement_query.filter(SettlementData.point_id == point_id) + if sjName is not None: + settlement_query = settlement_query.filter(SettlementData.sjName == sjName) + if workinfoname is not None: + settlement_query = settlement_query.filter(SettlementData.workinfoname == workinfoname) + + # 按上传时间倒序排序 + settlement_query = settlement_query.order_by(SettlementData.createdate.desc()) + + # 如果指定了limit,则限制返回数量 + if limit is not None and limit > 0: + settlement_query = settlement_query.limit(limit) + + settlement_data_list = settlement_query.all() + + if not settlement_data_list: + return [] + + # 4. 收集所有的观测点ID + point_id_set = set(settlement.point_id for settlement in settlement_data_list if settlement.point_id) + + # 5. 查询所有相关的观测点数据 + checkpoints = db.query(Checkpoint).filter(Checkpoint.point_id.in_(list(point_id_set))).all() + checkpoint_dict = {cp.point_id: cp for cp in checkpoints} + + # 6. 组织数据结构: 以观测点为上层,每个观测点下有沉降数据列表 + checkpoint_settlement_map = {} + for settlement in settlement_data_list: + if settlement.point_id not in checkpoint_settlement_map: + checkpoint_settlement_map[settlement.point_id] = [] + + settlement_dict = { + "id": settlement.id, + "point_id": settlement.point_id, + "CVALUE": settlement.CVALUE, + "MAVALUE": settlement.MAVALUE, + "MTIME_W": settlement.MTIME_W, + "NYID": settlement.NYID, + "PRELOADH": settlement.PRELOADH, + "PSTATE": settlement.PSTATE, + "REMARK": settlement.REMARK, + "WORKINFO": settlement.WORKINFO, + "createdate": settlement.createdate, + "day": settlement.day, + "day_jg": settlement.day_jg, + "isgzjdxz": settlement.isgzjdxz, + "mavalue_bc": settlement.mavalue_bc, + "mavalue_lj": settlement.mavalue_lj, + "sjName": settlement.sjName, + "useflag": settlement.useflag, + "workinfoname": settlement.workinfoname, + "upd_remark": settlement.upd_remark + } + checkpoint_settlement_map[settlement.point_id].append(settlement_dict) + + # 7. 构建最终结果 + result = [] + for point_id, settlements in checkpoint_settlement_map.items(): + checkpoint = checkpoint_dict.get(point_id) + checkpoint_data = { + "point_id": point_id, + "aname": checkpoint.aname if checkpoint else None, + "section_id": checkpoint.section_id if checkpoint else None, + "burial_date": checkpoint.burial_date if checkpoint else None, + "settlement_data": settlements + } + result.append(checkpoint_data) + + return result + def _check_checkpoint_exists(self, db: Session, point_id: str) -> bool: """检查观测点数据是否存在""" checkpoint = db.query(Checkpoint).filter(Checkpoint.point_id == point_id).first()