From fdf07e0dab0ca583a981858e8f5dc04e97526797 Mon Sep 17 00:00:00 2001 From: whm <973418690@qq.com> Date: Fri, 6 Feb 2026 18:16:44 +0800 Subject: [PATCH] =?UTF-8?q?1.=E9=80=82=E9=85=8D=E6=96=B0=E7=9A=84=E5=B7=A5?= =?UTF-8?q?=E5=86=B5=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/construction_monitor.py | 105 ++++++++++++------------- app/utils/get_operating_mode.py | 123 ++++++++++++++++++++++-------- 2 files changed, 145 insertions(+), 83 deletions(-) diff --git a/app/utils/construction_monitor.py b/app/utils/construction_monitor.py index ea61261..a49ab58 100644 --- a/app/utils/construction_monitor.py +++ b/app/utils/construction_monitor.py @@ -3,15 +3,31 @@ from typing import List, Dict import warnings import copy # 注意:根据实际项目路径调整导入,若本地测试可注释掉 -from ..core.logging_config import get_logger +# from ..core.logging_config import get_logger import json + +# 本地测试时的logger替代(可根据实际情况删除) +class MockLogger: + def warning(self, msg): + print(f"[WARNING] {msg}") + def info(self, msg): + print(f"[INFO] {msg}") + +def get_logger(name): + return MockLogger() + logger = get_logger(__name__) class ConstructionMonitorUtils: def __init__(self): - # 原始工况周期映射表(保持不变) + # 原始工况周期映射表(保持不变,重复key会自动保留后面的) self.base_periods = { + "路基或预压土填筑,连续填筑":1, + "路基或预压土填筑,两次填筑间隔时间较长":7, + "预压土或路基填筑完成,第1~3个月":7, + "预压土或路基填筑完成,第4~6个月":14, "仰拱(底板)施工完成后,第1个月": 7, + "预压土或路基填筑完成,6个月以后":30, "仰拱(底板)施工完成后,第2至3个月": 14, "仰拱(底板)施工完成后,3个月以后": 30, "仰拱(底板)施工完成后,第1个月": 7, # 原:仰拱(底板)施工完成后,第1个月 @@ -50,56 +66,43 @@ class ConstructionMonitorUtils: "架桥机(运梁车) 首次通过后": 7, # 原:架桥机(运梁车)首次通过后(仅加空格) "轨道板(道床)铺设后,第1个月": 14, # 原:轨道板(道床)铺设后,第1个月 "轨道板(道床)铺设后,第2至3个月": 30, # 原:轨道板(道床)铺设后,第2至3个月 - "轨道板(道床)铺设后,3个月以后": 90 # 未出现在待处理集,保留原始格式 + "轨道板(道床)铺设后,3个月以后": 90, + "架桥机(运梁车)首次通过前": 1, + "架桥机(运梁车)首次通过后,前3天": 1, + "架桥机(运梁车)首次通过后": 7, + "轨道板铺设前": 14, + "轨道板(道床)铺设后,第1至3个月": 14, + "轨道板(道床)铺设后,第4至6个月": 30, + "轨道板(道床)铺设后,6个月以后": 90, + "站场填方路基段填筑完成至静态验收": 14, + "桥墩(台)地面处拆模后": 30, + "敦身混凝土施工": 30, + "预制梁桥,架梁前": 30, + "预制梁桥,预制梁架设前": 1, + "预制梁桥预制梁架设后": 7, + "现浇梁,浇筑前": 30, + "现浇梁上部结构施工中": 1, + "架桥机(运梁车)通过": 2, + "桥梁主体工程完工后,第1至3个月": 7, + "桥梁主体工程完工后,第4至6个月": 14, + "侨梁主体工程完工后,6个月以后": 30, + "轨道铺设,前": 30, + "轨道铺设,后": 14, + "轨道铺设完成后,第1个月": 14, + "轨道铺设完成后,2至3个月": 30, + "轨道铺设完成后,4至12个月": 90, + "轨道铺设完成后,12个月以后": 180, + "仰拱(底板)施工完成后,第1个月": 7, + "仰拱(底板)施工完成后第,2至3个月": 14, + "仰拱(底板)施工完成后,3个月以后": 30, + "轨道板铺设前": 14, + "无砟轨道铺设后,第1至3个月": 30, + "无砟轨道铺设后,4至12个月": 90, + "无砟轨道铺设后,12个月以后": 180, + "特殊地段隧道施工完成后至静态验收": 14 } - # 构建中英文括号+逗号兼容映射表 - self.compatible_periods = self._build_compatible_brackets_map() - - - def _build_compatible_brackets_map(self) -> Dict[str, int]: - """构建支持中英文括号、中英文逗号,且忽略所有空格的兼容映射表""" - compatible_map = {} - for original_key, period in self.base_periods.items(): - # ========== 第一步:处理原始key的空格和符号,生成基础变体 ========== - # 1. 清洗空格:去除首尾+全角空格+合并连续空格+最终删除所有空格 - key_no_space = original_key.strip().replace(" ", " ").replace(" ", " ").replace(" ", "") - # 2. 原始key(未清洗空格) - compatible_map[original_key] = period - # 3. 无空格的原始符号key - if key_no_space not in compatible_map: - compatible_map[key_no_space] = period - - # ========== 第二步:生成中文括号变体(含空格/无空格) ========== - # 带空格的中文括号key - chinese_bracket_key = original_key.replace("(", "(").replace(")", ")") - if chinese_bracket_key != original_key and chinese_bracket_key not in compatible_map: - compatible_map[chinese_bracket_key] = period - # 无空格的中文括号key - chinese_bracket_no_space = key_no_space.replace("(", "(").replace(")", ")") - if chinese_bracket_no_space not in compatible_map: - compatible_map[chinese_bracket_no_space] = period - - # ========== 第三步:生成中文逗号变体(含空格/无空格) ========== - # 带空格的中文逗号key - chinese_comma_key = original_key.replace(",", ",") - if chinese_comma_key != original_key and chinese_comma_key not in compatible_map: - compatible_map[chinese_comma_key] = period - # 无空格的中文逗号key - chinese_comma_no_space = key_no_space.replace(",", ",") - if chinese_comma_no_space not in compatible_map: - compatible_map[chinese_comma_no_space] = period - - # ========== 第四步:生成中文括号+逗号混合变体(含空格/无空格) ========== - # 带空格的混合变体key - mixed_key = chinese_bracket_key.replace(",", ",") - if mixed_key != original_key and mixed_key not in compatible_map: - compatible_map[mixed_key] = period - # 无空格的混合变体key - mixed_no_space = chinese_bracket_no_space.replace(",", ",") - if mixed_no_space not in compatible_map: - compatible_map[mixed_no_space] = period - - return compatible_map + # 移除兼容映射表,直接使用原始base_periods(字典特性:重复key自动保留后面的) + self.compatible_periods = self.base_periods def get_due_data(self, input_data: List[List[Dict]], start: int = 0, end: int = 0, current_date: datetime = None) -> Dict[str, List[Dict]]: result = {"winter": [], "data": [], "error_data": []} diff --git a/app/utils/get_operating_mode.py b/app/utils/get_operating_mode.py index 98ac99e..23d48cc 100644 --- a/app/utils/get_operating_mode.py +++ b/app/utils/get_operating_mode.py @@ -14,9 +14,9 @@ class OperatingModePredictor: def __init__(self): """初始化类,加载内置的工况配置、分组规则和切换触发规则""" - # 基础工况配置(键:工况名称,值:基础监测周期参考) + # 基础工况配置(更新为最新的工况列表,重复key保留后面的值) self.base_periods = self._load_base_periods() - # 工况分组(将同义不同格式的工况归类,共用切换规则) + # 工况分组(同步更新分组规则,匹配最新工况名称) self.condition_group = self._load_condition_group() # 工况切换触发规则(键:分组ID,值:触发天数+目标工况候选) self.group_transition_rules = self._load_group_transition_rules() @@ -24,40 +24,45 @@ class OperatingModePredictor: self.winter_break_labels = self._load_winter_break_labels() def _load_base_periods(self): - """加载基础工况配置(私有方法,内部使用)""" + """加载基础工况配置(更新为最新工况列表,重复key自动保留后面的值)""" return { + "路基或预压土填筑,连续填筑":1, + "路基或预压土填筑,两次填筑间隔时间较长":7, + "预压土或路基填筑完成,第1~3个月":7, + "预压土或路基填筑完成,第4~6个月":14, "仰拱(底板)施工完成后,第1个月": 7, + "预压土或路基填筑完成,6个月以后":30, "仰拱(底板)施工完成后,第2至3个月": 14, "仰拱(底板)施工完成后,3个月以后": 30, - "仰拱(底板)施工完成后,第1个月": 7, - "仰拱(底板)施工完成后,第2至3个月": 14, - "仰拱(底板)施工完成后,3个月以后": 30, - "无砟轨道铺设后,第1至3个月": 30, - "无砟轨道铺设后,4至12个月": 90, - "无砟轨道铺设后,12个月以后": 180, + "仰拱(底板)施工完成后,第1个月": 7, # 重复key,保留此值 + "仰拱(底板)施工完成后,第2至3个月": 14, # 重复key,保留此值 + "仰拱(底板)施工完成后,3个月以后": 30, # 重复key,保留此值 + "无砟轨道铺设后,第1至3个月": 30, # 重复key,保留此值 + "无砟轨道铺设后,4至12个月": 90, # 重复key,保留此值 + "无砟轨道铺设后,12个月以后": 180, # 重复key,保留此值 "墩台施工到一定高度": 30, "墩台混凝土施工": 30, - "预制梁桥,架梁前": 30, - "预制梁桥,预制梁架设前": 1, + "预制梁桥,架梁前": 30, # 重复key,保留此值 + "预制梁桥,预制梁架设前": 1, # 重复key,保留此值 "预制梁桥,预制梁架设后": 7, "桥位施工桥梁,制梁前": 30, "桥位施工桥梁,上部结构施工中": 1, - "架桥机(运梁车)通过": 7, + "架桥机(运梁车)通过": 2, # 重复key,保留此值(原7→2) "桥梁主体工程完工后,第1至3个月": 7, - "桥梁主体工程完工后,第4至6个月": 14, - "桥梁主体工程完工后,6个月以后": 30, + "桥梁主体工程完工后,第4至6个月": 14, # 重复key,保留此值 + "桥梁主体工程完工后,6个月以后": 30, # 重复key,保留此值 "轨道铺设期间,前": 30, "轨道铺设期间,后": 14, - "轨道铺设完成后,第1个月": 14, - "轨道铺设完成后,2至3个月": 30, - "轨道铺设完成后,4至12个月": 90, - "轨道铺设完成后,12个月以后": 180, + "轨道铺设完成后,第1个月": 14, # 重复key,保留此值 + "轨道铺设完成后,2至3个月": 30, # 重复key,保留此值 + "轨道铺设完成后,4至12个月": 90, # 重复key,保留此值 + "轨道铺设完成后,12个月以后": 180, # 重复key,保留此值 "铺路或堆载,一般情况": 1, "填筑或堆载,一般情况": 1, "铺路或堆载,沉降量突变情况": 1, - "填筑或堆载,两次填筑间隔时间较长情况": 3, + "填筑或堆载,两次填筑间隔时间较长情况":3, "铺路或堆载,两次铺路间隔时间较长情况": 3, - "堆载预压或路基填筑完成,第1至3个月": 7, + "堆载预压或路基填筑完成,第1至3个月":7, "堆载预压或路基填筑完成,第4至6个月": 14, "堆载预压或路基填筑完成,6个月以后": 30, "架桥机(运梁车) 首次通过前": 1, @@ -66,62 +71,116 @@ class OperatingModePredictor: "轨道板(道床)铺设后,第1个月": 14, "轨道板(道床)铺设后,第2至3个月": 30, "轨道板(道床)铺设后,3个月以后": 90, - "冬休": 0 # 仅保留冬休 + "架桥机(运梁车)首次通过前": 1, + "架桥机(运梁车)首次通过后,前3天": 1, + "架桥机(运梁车)首次通过后": 7, + "轨道板铺设前": 14, # 新增工况 + "轨道板(道床)铺设后,第1至3个月": 14, # 新增工况 + "轨道板(道床)铺设后,第4至6个月": 30, # 新增工况 + "轨道板(道床)铺设后,6个月以后": 90, # 新增工况 + "站场填方路基段填筑完成至静态验收": 14, # 新增工况 + "桥墩(台)地面处拆模后": 30, # 新增工况 + "敦身混凝土施工": 30, # 新增工况 + "预制梁桥预制梁架设后": 7, # 新增工况 + "现浇梁,浇筑前": 30, # 新增工况 + "现浇梁上部结构施工中": 1, # 新增工况 + "侨梁主体工程完工后,6个月以后": 30, # 新增工况(注意错别字) + "轨道铺设,前": 30, # 新增工况 + "轨道铺设,后": 14, # 新增工况 + "仰拱(底板)施工完成后第,2至3个月": 14, # 新增工况(标点位置异常) + "特殊地段隧道施工完成后至静态验收": 14, # 新增工况 + "冬休": 0 # 保留冬休工况 } def _load_condition_group(self): - """加载工况分组规则(私有方法,内部使用)""" + """加载工况分组规则(同步更新,匹配最新工况名称)""" condition_group = { + # 仰拱相关 "仰拱(底板)施工完成后,第1个月": "YG_DIBAN_1", "仰拱(底板)施工完成后,第1个月": "YG_DIBAN_1", "仰拱(底板)施工完成后,第2至3个月": "YG_DIBAN_2_3", "仰拱(底板)施工完成后,第2至3个月": "YG_DIBAN_2_3", "仰拱(底板)施工完成后,3个月以后": "YG_DIBAN_AFTER_3", "仰拱(底板)施工完成后,3个月以后": "YG_DIBAN_AFTER_3", + "仰拱(底板)施工完成后第,2至3个月": "YG_DIBAN_2_3", # 新增异常格式工况分组 + + # 架桥机相关 "架桥机(运梁车) 首次通过前": "JQJ_FIRST_BEFORE", + "架桥机(运梁车)首次通过前": "JQJ_FIRST_BEFORE", # 新增无空格版本 "架桥机(运梁车) 首次通过后,前3天": "JQJ_FIRST_AFTER_3D", + "架桥机(运梁车)首次通过后,前3天": "JQJ_FIRST_AFTER_3D", # 新增无空格版本 "架桥机(运梁车) 首次通过后": "JQJ_FIRST_AFTER", + "架桥机(运梁车)首次通过后": "JQJ_FIRST_AFTER", # 新增无空格版本 + "架桥机(运梁车)通过": "STATIC", + + # 堆载预压/路基填筑相关 "堆载预压或路基填筑完成,第1至3个月": "DZYY_1_3", "堆载预压或路基填筑完成,第4至6个月": "DZYY_4_6", "堆载预压或路基填筑完成,6个月以后": "DZYY_AFTER_6", + "路基或预压土填筑,连续填筑": "STATIC", + "路基或预压土填筑,两次填筑间隔时间较长": "STATIC", + "预压土或路基填筑完成,第1~3个月": "DZYY_1_3", + "预压土或路基填筑完成,第4~6个月": "DZYY_4_6", + "预压土或路基填筑完成,6个月以后": "DZYY_AFTER_6", + + # 轨道板相关 "轨道板(道床)铺设后,第1个月": "GDB_1", "轨道板(道床)铺设后,第2至3个月": "GDB_2_3", "轨道板(道床)铺设后,3个月以后": "GDB_AFTER_3", + "轨道板铺设前": "STATIC", + "轨道板(道床)铺设后,第1至3个月": "GDB_1", + "轨道板(道床)铺设后,第4至6个月": "GDB_2_3", + "轨道板(道床)铺设后,6个月以后": "GDB_AFTER_3", + + # 预制梁桥相关 + "预制梁桥,架梁前": "STATIC", "预制梁桥,预制梁架设前": "YZLQ_BEFORE_JS", "预制梁桥,预制梁架设后": "YZLQ_AFTER_JS", + "预制梁桥预制梁架设后": "YZLQ_AFTER_JS", # 新增工况分组 + + # 桥梁主体相关 "桥梁主体工程完工后,第1至3个月": "QL_ZHUTI_1_3", "桥梁主体工程完工后,第4至6个月": "QL_ZHUTI_4_6", "桥梁主体工程完工后,6个月以后": "QL_ZHUTI_AFTER_6", + "侨梁主体工程完工后,6个月以后": "QL_ZHUTI_AFTER_6", # 错别字工况分组 + + # 轨道铺设相关 "轨道铺设完成后,第1个月": "GD_1", "轨道铺设完成后,2至3个月": "GD_2_3", "轨道铺设完成后,4至12个月": "GD_4_12", "轨道铺设完成后,12个月以后": "GD_AFTER_12", + "轨道铺设期间,前": "STATIC", + "轨道铺设期间,后": "STATIC", + "轨道铺设,前": "STATIC", + "轨道铺设,后": "STATIC", + + # 无砟轨道相关 "无砟轨道铺设后,第1至3个月": "WZGD_1_3", "无砟轨道铺设后,4至12个月": "WZGD_4_12", "无砟轨道铺设后,12个月以后": "WZGD_AFTER_12", + + # 静态工况(无切换规则) "墩台施工到一定高度": "STATIC", "墩台混凝土施工": "STATIC", - "预制梁桥,架梁前": "STATIC", "桥位施工桥梁,制梁前": "STATIC", "桥位施工桥梁,上部结构施工中": "STATIC", - "架桥机(运梁车)通过": "STATIC", - "轨道铺设期间,前": "STATIC", - "轨道铺设期间,后": "STATIC", "铺路或堆载,一般情况": "STATIC", "填筑或堆载,一般情况": "STATIC", "铺路或堆载,沉降量突变情况": "STATIC", "填筑或堆载,两次填筑间隔时间较长情况": "STATIC", - "铺路或堆载,两次铺路间隔时间较长情况": "STATIC" - } - # 冬休分组(仅冬休) - winter_break_groups = { + "铺路或堆载,两次铺路间隔时间较长情况": "STATIC", + "站场填方路基段填筑完成至静态验收": "STATIC", + "桥墩(台)地面处拆模后": "STATIC", + "敦身混凝土施工": "STATIC", + "现浇梁,浇筑前": "STATIC", + "现浇梁上部结构施工中": "STATIC", + "特殊地段隧道施工完成后至静态验收": "STATIC", "冬休": "STATIC" } - condition_group.update(winter_break_groups) return condition_group def _load_group_transition_rules(self): - """加载工况切换触发规则(私有方法,内部使用)""" + """加载工况切换触发规则(保持原有规则,适配新增工况)""" return { "YG_DIBAN_1": {"trigger_days": 30, "next_candidates": ["仰拱(底板)施工完成后,第2至3个月", "仰拱(底板)施工完成后,第2至3个月"]}, "YG_DIBAN_2_3": {"trigger_days": 60, "next_candidates": ["仰拱(底板)施工完成后,3个月以后", "仰拱(底板)施工完成后,3个月以后"]},