From 71c386509c125ccb59b4825a9c6c8eed98de9099 Mon Sep 17 00:00:00 2001 From: awayings Date: Fri, 11 Sep 2026 16:25:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=B8=AA=E8=82=A1/=E6=9D=BF?= =?UTF-8?q?=E5=9D=97=E5=BC=B9=E7=AA=97=E6=97=A5K=E5=8F=AA=E5=8F=96?= =?UTF-8?q?=E8=BF=91=202=20=E5=B9=B4=EF=BC=8C=E4=B8=8D=E5=86=8D=E5=85=A8?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E5=88=86=E9=A1=B5=EF=BC=885+=20=E9=A1=B5=20?= =?UTF-8?q?=E2=86=92=201=20=E9=A1=B5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 弹窗日K只用最近 250 根,却以 count=800 逐页拉全历史(300308 约 3400 根 = 5 页),深层页还触发服务端 QFQ 负价的 NONE+XDXR 本地重算(每页多一次 协议请求)。传 startDate(近 2 年)后单页 800 根即覆盖,翻页循环第一页 即命中退出;长期停牌取不到时退回全历史,行为不变。 Co-Authored-By: Claude Code --- web-ui/src/components/BoardDialog.vue | 6 +++++- web-ui/src/components/StockDialog.vue | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/web-ui/src/components/BoardDialog.vue b/web-ui/src/components/BoardDialog.vue index 1836987..84f816f 100644 --- a/web-ui/src/components/BoardDialog.vue +++ b/web-ui/src/components/BoardDialog.vue @@ -74,7 +74,11 @@ async function loadMinute() { async function loadDaily() { dailyError.value = '' try { - const bars = await fetchBars('SH', props.code, 'DAY', undefined, undefined) + // 日K只展示最近 250 根:取近 2 年(/bars 单页 800 根即可覆盖,避免全历史分页); + // 长期停牌取不到再退回全历史。 + const since = new Date(Date.now() - 2 * 365 * 86400_000).toISOString().slice(0, 10) + let bars = await fetchBars('SH', props.code, 'DAY', since, undefined) + if (bars.length === 0) bars = await fetchBars('SH', props.code, 'DAY', undefined, undefined) if (bars.length === 0) throw new Error('该板块无日K数据') dailyBars.value = bars.slice(-250) } catch (e) { diff --git a/web-ui/src/components/StockDialog.vue b/web-ui/src/components/StockDialog.vue index 622d74c..fb2d796 100644 --- a/web-ui/src/components/StockDialog.vue +++ b/web-ui/src/components/StockDialog.vue @@ -106,7 +106,11 @@ watch(minuteDays, loadMinute) async function loadDaily() { dailyError.value = '' try { - let bars = await fetchBars(props.market, props.code, 'DAY', undefined, undefined) + // 日K只展示最近 250 根:取近 2 年(/bars 单页 800 根即可覆盖,避免全历史 + // 分页 5+ 页 + 深层 QFQ 负价重算);长期停牌取不到再退回全历史。 + const since = new Date(Date.now() - 2 * 365 * 86400_000).toISOString().slice(0, 10) + let bars = await fetchBars(props.market, props.code, 'DAY', since, undefined) + if (bars.length === 0) bars = await fetchBars(props.market, props.code, 'DAY', undefined, undefined) // 指数(或 /bars 空数据的服务器)回退指数接口 if (bars.length === 0) bars = await fetchIndexBars(props.market, props.code, 250) if (bars.length === 0) throw new Error('无日K数据(可能为新股或代码有误)') From 04f7f1f34e3ed29645133e733d418e705d6a256d Mon Sep 17 00:00:00 2001 From: awayings Date: Fri, 11 Sep 2026 16:31:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20fetchBars=20=E5=81=9C=E9=A1=B5?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=8F=96=E6=9C=AB=E6=A0=B9=EF=BC=88=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E6=A0=B9=EF=BC=89=E6=81=92=E5=81=87=EF=BC=8C=E5=B8=A6?= =?UTF-8?q?=20startDate=20=E7=9A=84=E8=AF=B7=E6=B1=82=E5=A4=9A=E7=BF=BB?= =?UTF-8?q?=E4=B8=80=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 页内升序,本页最早一根应是 pageBars[0];原代码取 pageBars[length-1] (=最新根),"最早 ≤ startDate" 恒假 → 每个限定日期范围的请求都多发 一页 800 根(sentiment 量能仪表盘 2 页→1 页,选股器/弹窗同样受益)。 Co-Authored-By: Claude Code --- web-ui/src/api.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web-ui/src/api.ts b/web-ui/src/api.ts index 75728ad..0046353 100644 --- a/web-ui/src/api.ts +++ b/web-ui/src/api.ts @@ -113,9 +113,11 @@ export async function fetchBars( allBars = allBars.concat(pageBars) - // 若已覆盖到 startDate(本页最早一根 ≤ startDate),停止翻页 + // 若已覆盖到 startDate(本页最早一根 ≤ startDate),停止翻页。 + // 页内升序:首根才是本页最早(此前取末根=最新根,判断恒假,每个带 + // startDate 的请求都多翻一页) if (startDate && pageBars.length > 0) { - const oldest = pageBars[pageBars.length - 1].datetime.slice(0, 10) + const oldest = pageBars[0].datetime.slice(0, 10) if (oldest <= startDate) break } // 不足 800 根说明已到数据起点