From b1d0e41fd4c83f84e184ab4b34f871ea0b9dbee1 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Tue, 12 May 2026 21:12:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8A=E6=97=A5=E5=AE=9E=E6=B5=8B=E6=9C=80?= =?UTF-8?q?=E9=AB=98=E6=94=B9=E4=B8=BA=E4=BB=8E=20airport=5Fobs=5Flog=20?= =?UTF-8?q?=E5=8F=96=E5=80=BC=EF=BC=8C=E5=BB=B6=E9=95=BF=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E8=87=B3=2024h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不再依赖 city_weather.current.max_so_far(可能来自 METAR 等非机场源), 直接从 airport_obs_log 的机场站点观测历史中计算当日最高温及时间。 obs_log 保留期从 2h 延长到 24h 以支撑跨天查询。 Tested: pytest 176 passed, ruff check 通过 --- src/database/db_manager.py | 2 +- src/utils/telegram_push.py | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/database/db_manager.py b/src/database/db_manager.py index 28447e66..d3198b16 100644 --- a/src/database/db_manager.py +++ b/src/database/db_manager.py @@ -1861,7 +1861,7 @@ class DBManager: temp_c, wind_kt, pressure_hpa, str(obs_time)), ) conn.execute( - "DELETE FROM airport_obs_log WHERE created_at < datetime('now', '-2 hours')" + "DELETE FROM airport_obs_log WHERE created_at < datetime('now', '-24 hours')" ) conn.commit() diff --git a/src/utils/telegram_push.py b/src/utils/telegram_push.py index 20d018a1..103806f2 100644 --- a/src/utils/telegram_push.py +++ b/src/utils/telegram_push.py @@ -763,14 +763,40 @@ def _build_airport_status_message( lines.append(f"当前实测:{station_temp:.1f}°C") if deb_pred is not None: lines.append(f"今日DEB预报最高:{deb_pred:.1f}°C") - max_so_far = current.get("max_so_far") - max_temp_time = current.get("max_temp_time") + max_so_far, max_temp_time = _get_airport_daily_high(city) if max_so_far is not None: time_str = f"({max_temp_time})" if max_temp_time else "" lines.append(f"今日实测最高:{max_so_far:.1f}°C{time_str}") return "\n".join(lines) +def _get_airport_daily_high(city: str): + """Get today's observed high from airport_obs_log for this city.""" + icao = HIGH_FREQ_AIRPORT_ICAO.get(city, "") + if not icao: + return None, None + try: + from src.database.db_manager import DBManager + db = DBManager() + obs = db.get_airport_obs_recent(icao, minutes=1440) # last 24h + if not obs: + return None, None + best = max(obs, key=lambda r: r.get("temp_c") or -999) + temp_c = best.get("temp_c") + obs_time = best.get("obs_time") or "" + if temp_c is None: + return None, None + try: + from datetime import datetime + dt = datetime.fromisoformat(str(obs_time)) + time_str = dt.strftime("%H:%M") + except Exception: + time_str = str(obs_time)[:5] if obs_time else "" + return round(float(temp_c), 1), time_str + except Exception: + return None, None + + # Per-city push interval matching native data refresh rate (seconds) _AIRPORT_PUSH_INTERVAL = { "seoul": 60, # AMOS 1-min