This commit is contained in:
lhx
2025-10-30 14:55:52 +08:00

View File

@@ -7,6 +7,7 @@ from sqlalchemy.orm import Session
from typing import Dict, List from typing import Dict, List
from ..models.settlement_data import SettlementData from ..models.settlement_data import SettlementData
from ..models.level_data import LevelData from ..models.level_data import LevelData
from ..models.section_data import SectionData
import logging import logging
from datetime import datetime from datetime import datetime
@@ -351,14 +352,16 @@ class SettlementDataService(BaseService[SettlementData]):
# 根据水准线路编码获取最新的NYID并获取对应的测点数据 # 根据水准线路编码获取最新的NYID并获取对应的测点数据
def get_settlement_by_linecode( def get_settlement_by_linecode(
self, self,
db: Session, db: Session,
linecode: str, linecode: str,
num: int = 1 # 新增参数:控制返回的期数默认1最新一期 num: int = 1 # 控制返回的期数默认1最新一期
) -> Dict: ) -> Dict:
""" """
根据水准线路编码(linecode)查询对应沉降数据,支持按期数筛选 根据水准线路编码(linecode)查询对应沉降数据,支持按期数筛选
关联逻辑:LevelData.linecode → LevelData.NYID → SettlementData.NYID 关联逻辑:
LevelData.linecode → LevelData.NYID → SettlementData.NYID
SettlementData.point_id字符串→ Checkpoint.point_id → Checkpoint.section_id → SectionData.section_id → SectionData.work_site
:param db: 数据库会话 :param db: 数据库会话
:param linecode: 目标水准线路编码 :param linecode: 目标水准线路编码
:param num: 返回的期数按NYID从大到小排序默认1最新一期 :param num: 返回的期数按NYID从大到小排序默认1最新一期
@@ -367,55 +370,84 @@ class SettlementDataService(BaseService[SettlementData]):
try: try:
logger.info(f"开始查询linecode={linecode}对应的沉降数据(取前{num}期)") logger.info(f"开始查询linecode={linecode}对应的沉降数据(取前{num}期)")
# 1. 根据linecode查询水准线路表获取所有关联的NYID去重后按NYID降序排序 # 1. 根据linecode查询水准线路表获取前N期的NYID
nyid_query = db.query(LevelData.NYID)\ nyid_query = db.query(LevelData.NYID)\
.filter(LevelData.linecode == linecode)\ .filter(LevelData.linecode == linecode)\
.distinct()\ .distinct()\
.order_by(LevelData.NYID.desc()) # 按NYID降序确保最新的在前 .order_by(LevelData.NYID.desc())
# 根据num参数截取前N期的NYID
top_nyids = nyid_query.limit(num).all() top_nyids = nyid_query.limit(num).all()
if not top_nyids: if not top_nyids:
logger.warning(f"未查询到linecode={linecode}对应的水准线路记录") logger.warning(f"未查询到linecode={linecode}对应的水准线路记录")
return {"settlement_data": []} return {"settlement_data": []}
# 提取NYID字符串列表按降序排列保持最新的在前
target_nyids = [item.NYID for item in top_nyids] target_nyids = [item.NYID for item in top_nyids]
# 2. 根据NYID列表查询沉降数据按NYID降序、观测时间升序排列 # 2. 关联查询沉降数据 → 观测点表 → 断面表(使用模型类名,而非表名)
settlement_records = db.query(SettlementData)\ settlement_records = db.query(
.filter(SettlementData.NYID.in_(target_nyids))\ SettlementData,
.order_by( Checkpoint.section_id, # 从Checkpoint模型获取section_id
SettlementData.NYID.desc(), # 期数从新到旧 SectionData.work_site # 从SectionData模型获取work_site
SettlementData.MTIME_W.asc() # 同期内按观测时间从早到晚 )\
)\ .join(
.all() Checkpoint, # 关联观测点模型(类名)
SettlementData.point_id == Checkpoint.point_id, # 字符串类型匹配
isouter=True # 左连接:避免测点未关联观测点时丢失数据
)\
.join(
SectionData, # 关联断面模型(类名)
Checkpoint.section_id == SectionData.section_id, # 字符串类型匹配
isouter=True # 左连接避免断面ID未关联断面表时丢失数据
)\
.filter(SettlementData.NYID.in_(target_nyids))\
.order_by(
SettlementData.NYID.desc(), # 期数从新到旧
SettlementData.MTIME_W.asc() # 同期内按观测时间升序
)\
.all()
# 3. 转换模型实例为字典列表(处理日期格式) # 3. 转换数据并新增work_type字段
settlement_data = [] settlement_data = []
for record in settlement_records: for record in settlement_records:
# 解析查询结果(元组:(沉降数据实例, section_id, work_site)
settlement, section_id, work_site = record
# 根据work_site判断work_type默认0表示未匹配或无数据
work_type = 0
if work_site:
work_site_str = str(work_site).strip() # 确保为字符串且去空格
if "隧道" in work_site_str:
work_type = 1
elif "区间路基" in work_site_str:
work_type = 2
elif "" in work_site_str:
work_type = 3
# 组装返回字典(包含新增字段)
record_dict = { record_dict = {
"id": record.id, "id": settlement.id,
"point_id": record.point_id, "point_id": settlement.point_id,
"CVALUE": record.CVALUE, "section_id": section_id, # 新增观测点关联的断面ID
"MAVALUE": record.MAVALUE, "work_site": work_site, # 新增:断面的工点信息
"MTIME_W": record.MTIME_W.strftime("%Y-%m-%d %H:%M:%S") if record.MTIME_W else None, "work_type": work_type, # 新增工点类型编码1-隧道2-区间路基3-桥)
"NYID": record.NYID, "CVALUE": settlement.CVALUE,
"PRELOADH": record.PRELOADH, "MAVALUE": settlement.MAVALUE,
"PSTATE": record.PSTATE, "MTIME_W": settlement.MTIME_W.strftime("%Y-%m-%d %H:%M:%S") if settlement.MTIME_W else None,
"REMARK": record.REMARK, "NYID": settlement.NYID,
"WORKINFO": record.WORKINFO, "PRELOADH": settlement.PRELOADH,
"createdate": record.createdate.strftime("%Y-%m-%d %H:%M:%S") if record.createdate else None, "PSTATE": settlement.PSTATE,
"day": record.day, "REMARK": settlement.REMARK,
"day_jg": record.day_jg, "WORKINFO": settlement.WORKINFO,
"isgzjdxz": record.isgzjdxz, "createdate": settlement.createdate.strftime("%Y-%m-%d %H:%M:%S") if settlement.createdate else None,
"mavalue_bc": record.mavalue_bc, "day": settlement.day,
"mavalue_lj": record.mavalue_lj, "day_jg": settlement.day_jg,
"sjName": record.sjName, "isgzjdxz": settlement.isgzjdxz,
"useflag": record.useflag, "mavalue_bc": settlement.mavalue_bc,
"workinfoname": record.workinfoname, "mavalue_lj": settlement.mavalue_lj,
"upd_remark": record.upd_remark "sjName": settlement.sjName,
"useflag": settlement.useflag,
"workinfoname": settlement.workinfoname,
"upd_remark": settlement.upd_remark
} }
settlement_data.append(record_dict) settlement_data.append(record_dict)