增加沉降数据查询接口
This commit is contained in:
@@ -13,6 +13,7 @@ from ..schemas.comprehensive_data import (
|
|||||||
SectionDataQueryRequest,
|
SectionDataQueryRequest,
|
||||||
SettlementDataQueryRequest,
|
SettlementDataQueryRequest,
|
||||||
OriginalDataQueryRequest,
|
OriginalDataQueryRequest,
|
||||||
|
SettlementDataCheckpointQueryRequest,
|
||||||
LevelDataQueryRequest
|
LevelDataQueryRequest
|
||||||
)
|
)
|
||||||
from ..services.section_data import SectionDataService
|
from ..services.section_data import SectionDataService
|
||||||
@@ -207,6 +208,40 @@ def get_settlement(request: SettlementDataQueryRequest, db: Session = Depends(ge
|
|||||||
detail=f"查询沉降数据失败: {str(e)}"
|
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获取原始数据
|
# 根据期数id获取原始数据
|
||||||
@router.post("/get_original", response_model=DataResponse)
|
@router.post("/get_original", response_model=DataResponse)
|
||||||
|
|||||||
@@ -103,6 +103,31 @@ class SettlementDataQueryRequest(BaseModel):
|
|||||||
upd_remark: Optional[str] = None
|
upd_remark: Optional[str] = None
|
||||||
limit: Optional[int] = None # 限制返回数量,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):
|
class SectionDataQueryRequest(BaseModel):
|
||||||
id: Optional[int] = None
|
id: Optional[int] = None
|
||||||
|
|||||||
@@ -91,6 +91,117 @@ class SettlementDataService(BaseService[SettlementData]):
|
|||||||
|
|
||||||
return result
|
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:
|
def _check_checkpoint_exists(self, db: Session, point_id: str) -> bool:
|
||||||
"""检查观测点数据是否存在"""
|
"""检查观测点数据是否存在"""
|
||||||
checkpoint = db.query(Checkpoint).filter(Checkpoint.point_id == point_id).first()
|
checkpoint = db.query(Checkpoint).filter(Checkpoint.point_id == point_id).first()
|
||||||
|
|||||||
Reference in New Issue
Block a user