diff --git a/frontend/app/api/city/[name]/route.ts b/frontend/app/api/city/[name]/route.ts index 5fa5e8ca..67971d38 100644 --- a/frontend/app/api/city/[name]/route.ts +++ b/frontend/app/api/city/[name]/route.ts @@ -66,6 +66,9 @@ function buildFallbackCityDetail(name: string, depth: string, summary: Record + callback: (value, index) => typeof index === "number" && index % 4 === 0 - ? chartData.times[index] + ? String(value) : "", color: "#6B7A90", font: { size: 10 }, diff --git a/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx b/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx index f8d8c88c..cd1df1e1 100644 --- a/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx +++ b/frontend/components/dashboard/scan-terminal/AiCityTemperatureChart.tsx @@ -174,9 +174,9 @@ export const AiCityTemperatureChart = memo(function AiCityTemperatureChart({ det x: { grid: { color: "rgba(159, 178, 199, 0.08)" }, ticks: { - callback: (_value, index) => + callback: (value, index) => typeof index === "number" && index % 3 === 0 - ? chartData.times[index] + ? String(value) : "", color: "#6B7A90", font: { size: 10 }, diff --git a/frontend/lib/chart-utils.ts b/frontend/lib/chart-utils.ts index 41df65fb..3bdebe6f 100644 --- a/frontend/lib/chart-utils.ts +++ b/frontend/lib/chart-utils.ts @@ -370,13 +370,16 @@ export function getTemperatureChartData( const hourly = detail.hourly || {}; const rawTimes = Array.isArray(hourly.times) ? hourly.times : []; const rawTemps = Array.isArray(hourly.temps) ? hourly.temps : []; - const times = rawTimes - .map((time) => String(time || "").trim()) - .filter(Boolean); - const temps = times.map((_, index) => { - const value = Number(rawTemps[index]); - return Number.isFinite(value) ? value : null; - }); + const validEntries = rawTimes + .map((time, index) => ({ + tail: String(time || "").trim(), + value: Number(rawTemps[index]), + })) + .filter((entry) => entry.tail !== ""); + const times = validEntries.map((entry) => entry.tail); + const temps = validEntries.map((entry) => + Number.isFinite(entry.value) ? entry.value : null, + ); const suppressAnkaraMgmObservation = isTurkishMgmCity(detail); if (!times.length) return null; diff --git a/src/utils/telegram_push.py b/src/utils/telegram_push.py index 6f7fad51..63595af5 100644 --- a/src/utils/telegram_push.py +++ b/src/utils/telegram_push.py @@ -990,7 +990,10 @@ def _run_high_freq_airport_cycle( # 用观测数据时间而非当前本地时间 airport_cur = city_weather.get("airport_current") or {} - obs_local = airport_cur.get("obs_time") or city_weather.get("local_time") or "" + amos_obs = (city_weather.get("amos") or {}).get("observation_time_local") or "" + if amos_obs and len(str(amos_obs)) >= 16: + amos_obs = str(amos_obs)[11:16] # "2026-05-15 17:32:00" → "17:32" + obs_local = amos_obs or airport_cur.get("obs_time") or city_weather.get("local_time") or "" message = _build_airport_status_message(city, city_weather, deb_pred, obs_local) sent = False