Merge branch 'main' of http://119.6.225.4:3000/lhx/project
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
@@ -354,11 +355,13 @@ class SettlementDataService(BaseService[SettlementData]):
|
|||||||
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(
|
||||||
|
SettlementData,
|
||||||
|
Checkpoint.section_id, # 从Checkpoint模型获取section_id
|
||||||
|
SectionData.work_site # 从SectionData模型获取work_site
|
||||||
|
)\
|
||||||
|
.join(
|
||||||
|
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))\
|
.filter(SettlementData.NYID.in_(target_nyids))\
|
||||||
.order_by(
|
.order_by(
|
||||||
SettlementData.NYID.desc(), # 期数从新到旧
|
SettlementData.NYID.desc(), # 期数从新到旧
|
||||||
SettlementData.MTIME_W.asc() # 同期内按观测时间从早到晚
|
SettlementData.MTIME_W.asc() # 同期内按观测时间升序
|
||||||
)\
|
)\
|
||||||
.all()
|
.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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user