From 118d4e44df99e34395a7d4fcb4f0348dbd72dc0d Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Fri, 1 May 2026 11:37:09 +0800 Subject: [PATCH] This version of Antigravity is no longer supported. Please upgrade to receive the latest features. --- frontend/app/api/city/[name]/detail/route.ts | 4 ++++ .../dashboard/scan-terminal/city-detail-utils.ts | 9 +++++++++ .../scan-terminal/scan-terminal-client.ts | 2 ++ frontend/lib/chart-utils.ts | 14 ++++++++++---- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/frontend/app/api/city/[name]/detail/route.ts b/frontend/app/api/city/[name]/detail/route.ts index f8d40621..18c9c6cf 100644 --- a/frontend/app/api/city/[name]/detail/route.ts +++ b/frontend/app/api/city/[name]/detail/route.ts @@ -24,11 +24,15 @@ export async function GET( const { name } = await context.params; const forceRefresh = req.nextUrl.searchParams.get("force_refresh") ?? "false"; + const depth = req.nextUrl.searchParams.get("depth"); const marketSlug = req.nextUrl.searchParams.get("market_slug"); const targetDate = req.nextUrl.searchParams.get("target_date"); const searchParams = new URLSearchParams({ force_refresh: forceRefresh, }); + if (depth) { + searchParams.set("depth", depth); + } if (marketSlug) { searchParams.set("market_slug", marketSlug); } diff --git a/frontend/components/dashboard/scan-terminal/city-detail-utils.ts b/frontend/components/dashboard/scan-terminal/city-detail-utils.ts index 2f0fea0a..02f090b9 100644 --- a/frontend/components/dashboard/scan-terminal/city-detail-utils.ts +++ b/frontend/components/dashboard/scan-terminal/city-detail-utils.ts @@ -37,6 +37,15 @@ export function countDetailForecastDays(detail?: CityDetail | null) { export function isFullEnoughForDeepAnalysis(detail?: CityDetail | null) { if (!detail) return false; if (detail.detail_depth && detail.detail_depth !== "full") return false; + const hourlyTimes = Array.isArray(detail.hourly?.times) + ? detail.hourly?.times || [] + : []; + const hourlyTemps = Array.isArray(detail.hourly?.temps) + ? detail.hourly?.temps || [] + : []; + if (!detail.local_time || hourlyTimes.length === 0 || hourlyTemps.length === 0) { + return false; + } return ( countDetailModels(detail, detail.local_date) > 1 && countDetailForecastDays(detail) > 1 diff --git a/frontend/components/dashboard/scan-terminal/scan-terminal-client.ts b/frontend/components/dashboard/scan-terminal/scan-terminal-client.ts index 97186e3b..2d759cfe 100644 --- a/frontend/components/dashboard/scan-terminal/scan-terminal-client.ts +++ b/frontend/components/dashboard/scan-terminal/scan-terminal-client.ts @@ -49,6 +49,7 @@ type TerminalQueryOptions = { }; type CityDetailQueryOptions = { + depth?: "panel" | "market" | "nearby" | "full"; forceRefresh?: boolean; marketSlug?: string | null; signal?: AbortSignal; @@ -273,6 +274,7 @@ async function getTerminal({ async function getCityDetail(city: string, options: CityDetailQueryOptions = {}) { const params = new URLSearchParams({ + depth: options.depth || "full", force_refresh: String(options.forceRefresh ?? false), }); if (options.marketSlug) params.set("market_slug", options.marketSlug); diff --git a/frontend/lib/chart-utils.ts b/frontend/lib/chart-utils.ts index a0d80b5e..3d4e039a 100644 --- a/frontend/lib/chart-utils.ts +++ b/frontend/lib/chart-utils.ts @@ -135,7 +135,7 @@ function buildCalibratedFuturePath({ currentMinutes: number | null; reversionMinutes?: number | null; }) { - if (currentMinutes == null || !times.length || !observations.length) { + if (!times.length || !observations.length) { return { adjustmentDelta: null as number | null, future: new Array(times.length).fill(null) as Array, @@ -151,15 +151,21 @@ function buildCalibratedFuturePath({ }, null, ); + if (latestObservationMinute == null && currentMinutes == null) { + return { + adjustmentDelta: null as number | null, + future: new Array(times.length).fill(null) as Array, + }; + } // In practice the backend `local_time` can lag the latest METAR/official // observation by one refresh cycle. Anchor the future line to the newest // observation when it is newer, otherwise the "no future obs" guard can // suppress the calibrated path even though the user already sees a fresh // green observation point on the chart. const pathStartMinutes = - latestObservationMinute != null - ? Math.max(currentMinutes, latestObservationMinute) - : currentMinutes; + latestObservationMinute == null || currentMinutes == null + ? latestObservationMinute ?? currentMinutes ?? 0 + : Math.max(currentMinutes, latestObservationMinute); const deltas = normalizedObservations .map((item) => {