diff --git a/app/services/settlement_data.py b/app/services/settlement_data.py index 4f59e7d..8dce92d 100644 --- a/app/services/settlement_data.py +++ b/app/services/settlement_data.py @@ -7,6 +7,7 @@ from sqlalchemy.orm import Session from typing import Dict, List from ..models.settlement_data import SettlementData from ..models.level_data import LevelData +from ..models.section_data import SectionData import logging from datetime import datetime @@ -351,14 +352,16 @@ class SettlementDataService(BaseService[SettlementData]): # 根据水准线路编码获取最新的NYID并获取对应的测点数据 def get_settlement_by_linecode( - self, - db: Session, - linecode: str, - num: int = 1 # 新增参数:控制返回的期数,默认1(最新一期) -) -> Dict: + self, + db: Session, + linecode: str, + num: int = 1 # 控制返回的期数,默认1(最新一期) + ) -> Dict: """ 根据水准线路编码(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 linecode: 目标水准线路编码 :param num: 返回的期数(按NYID从大到小排序),默认1(最新一期) @@ -367,55 +370,84 @@ class SettlementDataService(BaseService[SettlementData]): try: logger.info(f"开始查询linecode={linecode}对应的沉降数据(取前{num}期)") - # 1. 根据linecode查询水准线路表,获取所有关联的NYID(去重后按NYID降序排序) + # 1. 根据linecode查询水准线路表,获取前N期的NYID nyid_query = db.query(LevelData.NYID)\ .filter(LevelData.linecode == linecode)\ .distinct()\ - .order_by(LevelData.NYID.desc()) # 按NYID降序,确保最新的在前 + .order_by(LevelData.NYID.desc()) - # 根据num参数截取前N期的NYID top_nyids = nyid_query.limit(num).all() - if not top_nyids: logger.warning(f"未查询到linecode={linecode}对应的水准线路记录") return {"settlement_data": []} - # 提取NYID字符串列表(按降序排列,保持最新的在前) target_nyids = [item.NYID for item in top_nyids] - # 2. 根据NYID列表查询沉降数据表,按NYID降序、观测时间升序排列 - settlement_records = db.query(SettlementData)\ - .filter(SettlementData.NYID.in_(target_nyids))\ - .order_by( - SettlementData.NYID.desc(), # 期数从新到旧 - SettlementData.MTIME_W.asc() # 同期内按观测时间从早到晚 - )\ - .all() + # 2. 关联查询:沉降数据 → 观测点表 → 断面表(使用模型类名,而非表名) + 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))\ + .order_by( + SettlementData.NYID.desc(), # 期数从新到旧 + SettlementData.MTIME_W.asc() # 同期内按观测时间升序 + )\ + .all() - # 3. 转换模型实例为字典列表(处理日期格式) + # 3. 转换数据并新增work_type字段 settlement_data = [] 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 = { - "id": record.id, - "point_id": record.point_id, - "CVALUE": record.CVALUE, - "MAVALUE": record.MAVALUE, - "MTIME_W": record.MTIME_W.strftime("%Y-%m-%d %H:%M:%S") if record.MTIME_W else None, - "NYID": record.NYID, - "PRELOADH": record.PRELOADH, - "PSTATE": record.PSTATE, - "REMARK": record.REMARK, - "WORKINFO": record.WORKINFO, - "createdate": record.createdate.strftime("%Y-%m-%d %H:%M:%S") if record.createdate else None, - "day": record.day, - "day_jg": record.day_jg, - "isgzjdxz": record.isgzjdxz, - "mavalue_bc": record.mavalue_bc, - "mavalue_lj": record.mavalue_lj, - "sjName": record.sjName, - "useflag": record.useflag, - "workinfoname": record.workinfoname, - "upd_remark": record.upd_remark + "id": settlement.id, + "point_id": settlement.point_id, + "section_id": section_id, # 新增:观测点关联的断面ID + "work_site": work_site, # 新增:断面的工点信息 + "work_type": work_type, # 新增:工点类型编码(1-隧道,2-区间路基,3-桥) + "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)