From 42894fe884fb860d374f1cdc5d174277389615ff Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sat, 22 Aug 2026 09:43:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(nas):=20bs=5F5m=20--limit=E5=86=92=E7=83=9F?= =?UTF-8?q?=E7=A6=81=E6=8E=A8chunk=20state=E2=80=94=E2=80=942026-08-22=200?= =?UTF-8?q?9:17=E7=8B=AC=E7=AB=8B=E5=AE=B9=E5=99=A8=E5=86=92=E7=83=9F(--li?= =?UTF-8?q?mit=203)=E5=AE=9E=E9=94=A4=E6=8A=8Astate=E4=BB=8E2025-08-20?= =?UTF-8?q?=E5=A4=9A=E6=8E=A8=E5=88=B02025-02-18,[2025-02-18,2025-08-20]?= =?UTF-8?q?=E5=8D=8A=E5=B9=B4=E7=89=87=E8=A2=AB3=E5=8F=AA=E8=82=A1'?= =?UTF-8?q?=E4=BB=A3=E8=A1=A8'5548=E5=8F=AA=E8=B7=B3=E8=BF=87(=E5=BD=93?= =?UTF-8?q?=E6=97=A5=E4=B8=8A=E5=8D=88=E5=B7=A1=E6=A3=80=E5=8F=91=E7=8E=B0?= =?UTF-8?q?:state=20mtime=2009:17=E6=81=B0=3D=E5=86=92=E7=83=9F=E6=97=B6?= =?UTF-8?q?=E5=88=BB,=E7=AA=97=E5=8F=A3=E7=AE=97=E6=9C=AF=E5=8F=8D?= =?UTF-8?q?=E6=8E=A8+=E4=BB=A3=E7=A0=81=E9=93=BE=E8=B7=AF=E4=B8=89?= =?UTF-8?q?=E8=AF=81=E5=90=88=E4=B8=80);=E6=A0=B9=E5=9B=A0=3Dlimit=5Freach?= =?UTF-8?q?ed=E5=8F=AA=E7=9B=AFDAILY=5FLIMIT=E9=85=8D=E9=A2=9D=E9=98=B2?= =?UTF-8?q?=E7=BA=BF(bs=5F5m=5Feod.py:220),--limit=E9=A2=84=E6=88=AA?= =?UTF-8?q?=E6=96=AD=E5=88=97=E8=A1=A8=E5=90=8E=E5=BE=AA=E7=8E=AF'?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E8=B7=91=E5=AE=8C'lr=3DFalse,286=E8=A1=8C?= =?UTF-8?q?=E6=8E=A8=E8=BF=9B=E5=AE=88=E5=8D=AB=E7=95=85=E9=80=9A;?= =?UTF-8?q?=E4=BF=AE=3Dchunk=20state=E6=8E=A8=E8=BF=9B=E9=97=B8=E9=97=A8?= =?UTF-8?q?=E5=8A=A0not=20args.limit;+=E6=B5=8B=E8=AF=95=E9=92=89=E6=AD=BB?= =?UTF-8?q?=E5=86=92=E7=83=9F=E4=B8=8D=E8=90=BDstate(Red=E5=A4=8D=E7=8E=B0?= =?UTF-8?q?=E2=86=92Green);NAS=E4=BE=A7state=E4=B8=A4=E6=AD=A5=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E8=A1=A5=E5=9B=9E(=E4=BB=8A=E6=99=9A23:5x=E2=86=92202?= =?UTF-8?q?5-08-20=E8=A1=A5=E8=B7=B3=E8=BF=87=E7=89=87,=E6=98=8E=E6=99=A8?= =?UTF-8?q?=E5=AE=8C=E5=B7=A5=E5=90=8E=E2=86=922024-08-19=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E9=87=8D=E8=B7=91);venv310=E5=85=A8=E5=A5=97177?= =?UTF-8?q?=E7=BB=BF=20[nas]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/data_platform/bs_5m_eod.py | 6 ++++-- tests/data_platform/test_bs_5m_eod.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/scripts/data_platform/bs_5m_eod.py b/scripts/data_platform/bs_5m_eod.py index fc45302..b7ce8e7 100644 --- a/scripts/data_platform/bs_5m_eod.py +++ b/scripts/data_platform/bs_5m_eod.py @@ -283,8 +283,10 @@ def _run(args): log.info("[CHUNK] %s~%s ok=%d empty=%d failed=%d rows=%d", chunk[0], chunk[1], cs["ok"], cs["empty"], cs["failed"], cs["db_rows"]) - if not lr and swept[0] < DAILY_LIMIT: - # 整片扫完才推进 state; 没扫完次日重拉同片(OR REPLACE 幂等续跑) + if not lr and swept[0] < DAILY_LIMIT and not args.limit: + # 整片扫完才推进 state; 没扫完次日重拉同片(OR REPLACE 幂等续跑); + # --limit 冒烟只拉 N 只 ≠ 整片完成, 同禁推进(2026-08-22 冒烟 + # 实锤多推一片跳过半年窗口) save_chunk_state({"next_end": chunk[0]}) # 每日增量照跑(回灌期也跑, 近端 7 天始终新鲜) istats, lr = _sweep(conn, stocks, inc_start, inc_end, swept, "inc") diff --git a/tests/data_platform/test_bs_5m_eod.py b/tests/data_platform/test_bs_5m_eod.py index 20f25a3..9190f49 100644 --- a/tests/data_platform/test_bs_5m_eod.py +++ b/tests/data_platform/test_bs_5m_eod.py @@ -218,6 +218,22 @@ def test_main_runs_and_exits_0(main_env): assert not (main_env / "bs_5m.lock").exists() +def test_main_limit_smoke_never_advances_state(main_env, monkeypatch): + """--limit 冒烟只拉 N 只 ≠ 整片完成: 绝不推进 chunk state。 + + 2026-08-22 09:17 独立容器冒烟(--limit 3)实锤把 state 多推一片 + ([2025-02-18,2025-08-20] 半年片被 3 只股"代表"5548 只跳过): 根因 + limit_reached 只盯 DAILY_LIMIT 配额防线, --limit 预截断后循环"正常 + 跑完" lr=False, 推进守卫畅通。""" + monkeypatch.setattr(sys, "argv", ["bs_5m_eod.py", "--limit", "1"]) + with patch.object(b5, "_process_one", return_value=48) as m_proc: + with pytest.raises(SystemExit) as e: + b5.main() + assert e.value.code == 0 + assert m_proc.call_count == 2 # 1 股 × (chunk+inc) + assert not (main_env / "bs_5m_state.json").exists() # 冒烟不落 state + + def test_main_increment_only_when_backfill_done(main_env, monkeypatch): """回灌完结盖章(next_end=None) → 只跑每日增量(单 sweep)。""" b5.save_chunk_state({"next_end": None})