From de3ce2365423bddc2c6dc3e4c1f489e3225d8209 Mon Sep 17 00:00:00 2001 From: whm <973418690@qq.com> Date: Thu, 29 Jan 2026 18:15:44 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E8=BF=94=E5=9B=9E=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/settlement_data.py | 143 ++++++++++++++++++++++++++++++-- 1 file changed, 135 insertions(+), 8 deletions(-) diff --git a/app/services/settlement_data.py b/app/services/settlement_data.py index 633c5fb..65a9338 100644 --- a/app/services/settlement_data.py +++ b/app/services/settlement_data.py @@ -600,11 +600,120 @@ class SettlementDataService(BaseService[SettlementData]): } # 根据水准线路编码获取最新的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( self, db: Session, linecode: str, - num: int = 1000 # 控制返回的期数,默认1(最新一期) + num: int = 1000 # 控制返回的期数,默认1000(最新1000期) ) -> Dict: """ 根据水准线路编码(linecode)查询对应沉降数据,支持按期数筛选 @@ -613,8 +722,8 @@ class SettlementDataService(BaseService[SettlementData]): 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" + :param num: 返回的期数(按NYID从大到小排序),默认1000(最新1000期) + :return: 字典格式,包含分组后的沉降数据嵌套列表,键为 "settlement_data" """ try: logger.info(f"开始查询linecode={linecode}对应的沉降数据(取前{num}期)") @@ -656,8 +765,8 @@ class SettlementDataService(BaseService[SettlementData]): )\ .all() - # 3. 转换数据并新增字段 - settlement_data = [] + # 3. 转换数据并新增字段(先组装成原始记录列表) + raw_settlement_data = [] for record in settlement_records: # 解析查询结果(元组:(沉降数据实例, section_id, aname, work_site)) settlement, section_id, aname, work_site = record @@ -701,10 +810,28 @@ class SettlementDataService(BaseService[SettlementData]): "workinfoname": settlement.workinfoname, "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)}条沉降数据") - return {"settlement_data": settlement_data} + # 4. 按point_id分组,且每个分组内按NYID降序排序(核心修改部分) + 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: logger.error(f"查询linecode={linecode}的沉降数据失败:{str(e)}", exc_info=True)