1.修改返回的数据
This commit is contained in:
@@ -600,11 +600,120 @@ class SettlementDataService(BaseService[SettlementData]):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# 根据水准线路编码获取最新的NYID并获取对应的测点数据
|
# 根据水准线路编码获取最新的NYID并获取对应的测点数据
|
||||||
|
# def get_settlement_by_linecode(
|
||||||
|
# self,
|
||||||
|
# db: Session,
|
||||||
|
# linecode: str,
|
||||||
|
# num: int = 1000 # 控制返回的期数,默认1(最新一期)
|
||||||
|
# ) -> Dict:
|
||||||
|
# """
|
||||||
|
# 根据水准线路编码(linecode)查询对应沉降数据,支持按期数筛选
|
||||||
|
# 关联逻辑:
|
||||||
|
# LevelData.linecode → LevelData.NYID → SettlementData.NYID
|
||||||
|
# SettlementData.point_id(字符串)→ Checkpoint.point_id → Checkpoint.section_id → SectionData.section_id → SectionData.work_site
|
||||||
|
# :param db: 数据库会话
|
||||||
|
# :param linecode: 目标水准线路编码
|
||||||
|
# :param num: 返回的期数(按NYID从大到小排序),默认1(最新一期)
|
||||||
|
# :return: 字典格式,包含沉降数据列表,键为 "settlement_data"
|
||||||
|
# """
|
||||||
|
# try:
|
||||||
|
# logger.info(f"开始查询linecode={linecode}对应的沉降数据(取前{num}期)")
|
||||||
|
|
||||||
|
# # 1. 根据linecode查询水准线路表,获取前N期的NYID
|
||||||
|
# nyid_query = db.query(LevelData.NYID)\
|
||||||
|
# .filter(LevelData.linecode == linecode)\
|
||||||
|
# .distinct()\
|
||||||
|
# .order_by(LevelData.NYID.desc())
|
||||||
|
|
||||||
|
# top_nyids = nyid_query.limit(num).all()
|
||||||
|
# if not top_nyids:
|
||||||
|
# logger.warning(f"未查询到linecode={linecode}对应的水准线路记录")
|
||||||
|
# return {"settlement_data": []}
|
||||||
|
|
||||||
|
# target_nyids = [item.NYID for item in top_nyids]
|
||||||
|
|
||||||
|
# # 2. 关联查询:沉降数据 → 观测点表 → 断面表(新增查询Checkpoint.aname)
|
||||||
|
# settlement_records = db.query(
|
||||||
|
# SettlementData,
|
||||||
|
# Checkpoint.section_id, # 从Checkpoint模型获取section_id
|
||||||
|
# Checkpoint.aname, # 新增:从Checkpoint模型获取测点名称aname
|
||||||
|
# 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))\
|
||||||
|
# .order_by(
|
||||||
|
# SettlementData.NYID.desc(), # 期数从新到旧
|
||||||
|
# SettlementData.MTIME_W.asc() # 同期内按观测时间升序
|
||||||
|
# )\
|
||||||
|
# .all()
|
||||||
|
|
||||||
|
# # 3. 转换数据并新增字段
|
||||||
|
# settlement_data = []
|
||||||
|
# for record in settlement_records:
|
||||||
|
# # 解析查询结果(元组:(沉降数据实例, section_id, aname, work_site))
|
||||||
|
# settlement, section_id, aname, work_site = record
|
||||||
|
|
||||||
|
# # 根据work_site判断work_type(默认0表示未匹配或无数据) 涵洞H 沉降板L 观测桩G和Z(分标段) B 路基
|
||||||
|
# work_type = 0
|
||||||
|
# if work_site:
|
||||||
|
# work_site_str = str(work_site).strip() # 确保为字符串且去空格
|
||||||
|
# if "S" in aname:
|
||||||
|
# work_type = 1
|
||||||
|
# elif "L" in aname or "G" in aname or "Z" in aname or "B" in aname:
|
||||||
|
# work_type = 2
|
||||||
|
# elif "T" in aname or "D" in aname or "C " in aname:
|
||||||
|
# work_type = 3
|
||||||
|
# elif "H" in aname :
|
||||||
|
# work_type = 4
|
||||||
|
# # 组装返回字典(新增aname字段)
|
||||||
|
# record_dict = {
|
||||||
|
# "id": settlement.id,
|
||||||
|
# "point_id": settlement.point_id,
|
||||||
|
# "aname": aname, # 新增:测点名称(从Checkpoint表获取)
|
||||||
|
# "section_id": section_id, # 新增:观测点关联的断面ID
|
||||||
|
# "work_site": work_site, # 新增:断面的工点信息
|
||||||
|
# "work_type": work_type, # 新增:工点类型编码(1-隧道,2-区间路基,3-桥,4-)
|
||||||
|
# "CVALUE": settlement.CVALUE,
|
||||||
|
# "MAVALUE": settlement.MAVALUE,
|
||||||
|
# "MTIME_W": settlement.MTIME_W.strftime("%Y-%m-%d %H:%M:%S") if settlement.MTIME_W else None,
|
||||||
|
# "NYID": settlement.NYID,
|
||||||
|
# "PRELOADH": settlement.PRELOADH,
|
||||||
|
# "PSTATE": settlement.PSTATE,
|
||||||
|
# "REMARK": settlement.REMARK,
|
||||||
|
# "WORKINFO": settlement.WORKINFO,
|
||||||
|
# "createdate": settlement.createdate.strftime("%Y-%m-%d %H:%M:%S") if settlement.createdate else None,
|
||||||
|
# "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
|
||||||
|
# }
|
||||||
|
# settlement_data.append(record_dict)
|
||||||
|
|
||||||
|
# logger.info(f"查询完成,linecode={linecode}的前{num}期对应{len(settlement_data)}条沉降数据")
|
||||||
|
# return {"settlement_data": settlement_data}
|
||||||
|
|
||||||
|
# except Exception as e:
|
||||||
|
# logger.error(f"查询linecode={linecode}的沉降数据失败:{str(e)}", exc_info=True)
|
||||||
|
# raise e
|
||||||
def get_settlement_by_linecode(
|
def get_settlement_by_linecode(
|
||||||
self,
|
self,
|
||||||
db: Session,
|
db: Session,
|
||||||
linecode: str,
|
linecode: str,
|
||||||
num: int = 1000 # 控制返回的期数,默认1(最新一期)
|
num: int = 1000 # 控制返回的期数,默认1000(最新1000期)
|
||||||
) -> Dict:
|
) -> Dict:
|
||||||
"""
|
"""
|
||||||
根据水准线路编码(linecode)查询对应沉降数据,支持按期数筛选
|
根据水准线路编码(linecode)查询对应沉降数据,支持按期数筛选
|
||||||
@@ -613,8 +722,8 @@ class SettlementDataService(BaseService[SettlementData]):
|
|||||||
SettlementData.point_id(字符串)→ Checkpoint.point_id → Checkpoint.section_id → SectionData.section_id → SectionData.work_site
|
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从大到小排序),默认1000(最新1000期)
|
||||||
:return: 字典格式,包含沉降数据列表,键为 "settlement_data"
|
:return: 字典格式,包含分组后的沉降数据嵌套列表,键为 "settlement_data"
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
logger.info(f"开始查询linecode={linecode}对应的沉降数据(取前{num}期)")
|
logger.info(f"开始查询linecode={linecode}对应的沉降数据(取前{num}期)")
|
||||||
@@ -656,8 +765,8 @@ class SettlementDataService(BaseService[SettlementData]):
|
|||||||
)\
|
)\
|
||||||
.all()
|
.all()
|
||||||
|
|
||||||
# 3. 转换数据并新增字段
|
# 3. 转换数据并新增字段(先组装成原始记录列表)
|
||||||
settlement_data = []
|
raw_settlement_data = []
|
||||||
for record in settlement_records:
|
for record in settlement_records:
|
||||||
# 解析查询结果(元组:(沉降数据实例, section_id, aname, work_site))
|
# 解析查询结果(元组:(沉降数据实例, section_id, aname, work_site))
|
||||||
settlement, section_id, aname, work_site = record
|
settlement, section_id, aname, work_site = record
|
||||||
@@ -701,10 +810,28 @@ class SettlementDataService(BaseService[SettlementData]):
|
|||||||
"workinfoname": settlement.workinfoname,
|
"workinfoname": settlement.workinfoname,
|
||||||
"upd_remark": settlement.upd_remark
|
"upd_remark": settlement.upd_remark
|
||||||
}
|
}
|
||||||
settlement_data.append(record_dict)
|
raw_settlement_data.append(record_dict)
|
||||||
|
|
||||||
logger.info(f"查询完成,linecode={linecode}的前{num}期对应{len(settlement_data)}条沉降数据")
|
# 4. 按point_id分组,且每个分组内按NYID降序排序(核心修改部分)
|
||||||
return {"settlement_data": settlement_data}
|
point_group_dict = {}
|
||||||
|
for item in raw_settlement_data:
|
||||||
|
point_id = item["point_id"]
|
||||||
|
# 若该point_id未在字典中,初始化空列表
|
||||||
|
if point_id not in point_group_dict:
|
||||||
|
point_group_dict[point_id] = []
|
||||||
|
# 将当前记录添加到对应point_id的列表中
|
||||||
|
point_group_dict[point_id].append(item)
|
||||||
|
|
||||||
|
# 对每个分组内的记录按NYID降序排序(保障大的NYID在第一个)
|
||||||
|
for point_id, item_list in point_group_dict.items():
|
||||||
|
# 按NYID降序排序,NYID是数字,直接比较即可
|
||||||
|
item_list.sort(key=lambda x: x["NYID"], reverse=True)
|
||||||
|
|
||||||
|
# 5. 提取字典的值,组成最终的嵌套列表
|
||||||
|
final_settlement_data = list(point_group_dict.values())
|
||||||
|
|
||||||
|
logger.info(f"查询完成,linecode={linecode}的前{num}期对应{len(raw_settlement_data)}条沉降数据,共{len(final_settlement_data)}个不同测点")
|
||||||
|
return {"settlement_data": final_settlement_data}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"查询linecode={linecode}的沉降数据失败:{str(e)}", exc_info=True)
|
logger.error(f"查询linecode={linecode}的沉降数据失败:{str(e)}", exc_info=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user