From 869c49bb0be4af6825e3797c9cde380d34488ad9 Mon Sep 17 00:00:00 2001 From: shy3130 <415333856@qq.com> Date: Mon, 31 Aug 2026 20:54:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(kline):=20=E5=88=86=E9=92=9F=E5=A2=9E?= =?UTF-8?q?=E9=87=8F=E8=B5=B7=E7=82=B9=E6=94=B9=E4=B8=BA=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E6=A0=B9=E6=9C=AC=E8=BA=AB=20=E2=80=94=20=E5=BD=A2?= =?UTF-8?q?=E6=88=90=E4=B8=AD=E7=9A=84=E5=8A=A8=E6=80=81K=E9=9C=80?= =?UTF-8?q?=E9=87=8D=E6=8B=89=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/kline.py | 5 +++-- backend/tests/test_minute_routing.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/app/api/kline.py b/backend/app/api/kline.py index 84bea75..c2e7b2e 100644 --- a/backend/app/api/kline.py +++ b/backend/app/api/kline.py @@ -736,8 +736,9 @@ def get_minute_batch(request: Request, body: dict): _pull("stock", [s for s in full_pull if s not in etf_set], day_start) _pull("etf", [s for s in full_pull if s in etf_set], day_start) if stale_last: - # 增量公共起点 = 最旧尾部 + 1min; 起点更早的重叠由落盘/合并去重吸收 - inc_start = min(stale_last.values()) + timedelta(minutes=1) + # 增量公共起点 = 最旧的最后一根本身: 最后一根是形成中的动态K (分钟内 + # 收盘/量/额持续变化), 必须重拉并以定版值覆盖; 重叠由 upsert/合并去重吸收 + inc_start = min(stale_last.values()) if inc_start < session_end: _pull("stock", [s for s in stale_last if s not in etf_set], inc_start) _pull("etf", [s for s in stale_last if s in etf_set], inc_start) diff --git a/backend/tests/test_minute_routing.py b/backend/tests/test_minute_routing.py index 4c38ee5..2d732b8 100644 --- a/backend/tests/test_minute_routing.py +++ b/backend/tests/test_minute_routing.py @@ -363,7 +363,7 @@ def _endpoint_mocks(monkeypatch, local_df: pl.DataFrame, sync_ret: pl.DataFrame def test_minute_batch_tail_stale_pulls_incremental_and_persists(monkeypatch): - """尾部落后 (本地连续但根数不足) → 从最后一根+1min 增量拉; + """尾部落后 (本地连续但根数不足) → 从最后一根本身增量拉 (动态K重拉覆盖); 拉取结果落盘, 响应为本地+增量合并去重。""" from app.api import kline as kline_api @@ -376,7 +376,7 @@ def test_minute_batch_tail_stale_pulls_incremental_and_persists(monkeypatch): result = kline_api.get_minute_batch(req, {"symbols": ["600519.SH"], "date": "2026-01-15"}) assert len(captured) == 1 - assert captured[0]["start"] == datetime(2026, 1, 15, 9, 34) # 最后一根 + 1min + assert captured[0]["start"] == datetime(2026, 1, 15, 9, 33) # 从最后一根本身重拉 (动态K覆盖) assert captured[0]["asset"] == "stock" assert writes and writes[0].height == 2 # 取到即落盘 rows = result["data"]["600519.SH"]