From b45010a92eec351a8ac3c175e6278bd72298d11a Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Fri, 15 May 2026 15:37:25 +0800 Subject: [PATCH] feat: implement runway observations dashboard panel, add telegram alert utility, and create city payload service --- .../scan-terminal/RunwayObservationsPanel.tsx | 2 +- src/utils/telegram_push.py | 10 +++++++--- web/services/city_payloads.py | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/frontend/components/dashboard/scan-terminal/RunwayObservationsPanel.tsx b/frontend/components/dashboard/scan-terminal/RunwayObservationsPanel.tsx index da849aeb..4c60e9dd 100644 --- a/frontend/components/dashboard/scan-terminal/RunwayObservationsPanel.tsx +++ b/frontend/components/dashboard/scan-terminal/RunwayObservationsPanel.tsx @@ -148,7 +148,7 @@ export function RunwayObservationsPanel() { async () => { await Promise.allSettled( RUNWAY_OBSERVATION_CITIES.map((city) => - ensureCityDetail(city.key, false, "panel"), + ensureCityDetail(city.key, true, "panel"), ), ); }, diff --git a/src/utils/telegram_push.py b/src/utils/telegram_push.py index 15afd19c..4f24f17e 100644 --- a/src/utils/telegram_push.py +++ b/src/utils/telegram_push.py @@ -502,6 +502,7 @@ MARKET_MONITOR_CITIES = [ _FUNCTION_HASHTAGS = { "runway": "#跑道观测", + "airport": "#机场观测", "market": "#市场监控", "trade": "#交易机会", } @@ -714,10 +715,10 @@ def _build_airport_status_message( and latest_temp - max_so_far >= 0.3) flag = " \U0001f536新" if new_high else "" + has_runway = bool(runway_pairs and runway_temps and len(runway_pairs) == len(runway_temps)) hashtag_line = _build_telegram_hashtag_line( - "runway", + "runway" if has_runway else "airport", city=city, - station=airport_icao, ) lines = [hashtag_line, header + flag, ""] runway_shown = False @@ -1020,6 +1021,7 @@ def _run_market_monitor_cycle(bot: Any, chat_ids: List[str]) -> bool: sent_any = False try: from web.app import _analyze + from web.services.city_payloads import build_city_market_scan_payload except Exception as exc: logger.warning("market monitor push skipped: analyze import failed: {}", exc) return False @@ -1027,9 +1029,11 @@ def _run_market_monitor_cycle(bot: Any, chat_ids: List[str]) -> bool: for city in MARKET_MONITOR_CITIES: try: city_weather = _analyze(city) - market = city_weather.get("market_scan") or {} + scan_payload = build_city_market_scan_payload(city_weather) + market = scan_payload.get("market_scan") or {} if not market.get("available"): continue + city_weather["market_scan"] = market message = _build_market_monitor_message(city, city_weather) for chat_id in chat_ids: try: diff --git a/web/services/city_payloads.py b/web/services/city_payloads.py index dad6500c..6af6e7bc 100644 --- a/web/services/city_payloads.py +++ b/web/services/city_payloads.py @@ -265,6 +265,7 @@ def build_city_detail_payload( "center_station_candidate": data.get("center_station_candidate"), "airport_vs_network_delta": data.get("airport_vs_network_delta"), "airport_current": data.get("airport_current") or {}, + "amos": data.get("amos") or {}, "nearby_source": data.get("nearby_source") or ("mgm" if str(data.get("name") or "").lower() in TURKISH_MGM_CITIES else "metar_cluster"), "ai_analysis": data.get("ai_analysis") or "", "errors": {},