From 7ae9ad929201c2731f00a1ed174b585cc6c908c6 Mon Sep 17 00:00:00 2001 From: liumangmang Date: Wed, 1 Jul 2026 20:26:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=20routers/websites=20?= =?UTF-8?q?=E4=B8=AD=E6=AE=8B=E7=95=99=E7=9A=84=E6=AD=BB=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=87=BD=E6=95=B0=20=5Fbuild=5Frate=5Fpriority=5Fmap=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=B8=BA=20build=5Ftarget=5Fgroup=5Fpriority=5Fmap=20?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E4=B8=A5=E6=A0=BC=E7=9A=84=E5=88=86=E7=BB=84?= =?UTF-8?q?=E5=80=8D=E7=8E=87=E8=A7=A3=E6=9E=90=EF=BC=8C=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E9=9D=9E=E6=B3=95/=E7=BC=BA=E5=A4=B1=E5=80=8D=E7=8E=87?= =?UTF-8?q?=E7=9A=84=E5=88=86=E7=BB=84=E4=BB=A5=201.0=20=E7=9A=84=E9=99=8D?= =?UTF-8?q?=E7=BA=A7=E5=80=BC=E5=8F=82=E4=B8=8E=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/routers/websites.py | 6 ------ backend/app/services/website_sync.py | 16 ++++++++++++++-- backend/test_priority_algorithm_correction.py | 5 +++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/backend/app/routers/websites.py b/backend/app/routers/websites.py index 9a3fabb..64913ce 100644 --- a/backend/app/routers/websites.py +++ b/backend/app/routers/websites.py @@ -189,12 +189,6 @@ def _numeric_group_id(value: str | None) -> int | None: return None -def _build_rate_priority_map(db: Session, upstream_ids: set[int]) -> dict[str, int]: - """根据上游分组倍率构建 group_id → priority 映射。 - - 委托给 website_sync.build_rate_priority_map 避免逻辑重复。 - """ - return build_rate_priority_map(db, upstream_ids) @router.get("/api/websites", response_model=List[WebsiteResponse]) diff --git a/backend/app/services/website_sync.py b/backend/app/services/website_sync.py index a066c4a..fef13de 100644 --- a/backend/app/services/website_sync.py +++ b/backend/app/services/website_sync.py @@ -220,6 +220,17 @@ def _snapshot_group_rate(group: dict) -> float: return 1.0 +def _strict_snapshot_group_rate(group: dict) -> float | None: + """从快照分组数据中严格提取倍率,若缺失或非数值则返回 None。""" + raw = group.get("rate") or group.get("default_rate") or group.get("rate_multiplier") + if raw is None or raw == "": + return None + try: + return float(raw) + except (TypeError, ValueError): + return None + + def build_rate_priority_map(db: Session, upstream_ids: set[int]) -> dict[str, int]: """根据上游分组倍率构建 f"{upstream_id}:{group_id}" → priority 映射。 @@ -465,8 +476,9 @@ def build_target_group_priority_map( groups = rate_maps.get(upstream_id) or {} g = groups.get(group_id) if isinstance(g, dict): - rate = _snapshot_group_rate(g) - rated_sources.append(((upstream_id, group_id), rate)) + rate = _strict_snapshot_group_rate(g) + if rate is not None: + rated_sources.append(((upstream_id, group_id), rate)) if not rated_sources: continue diff --git a/backend/test_priority_algorithm_correction.py b/backend/test_priority_algorithm_correction.py index 0006857..e2076d0 100644 --- a/backend/test_priority_algorithm_correction.py +++ b/backend/test_priority_algorithm_correction.py @@ -62,6 +62,7 @@ def test_target_group_priority_calculation(db_session): "G3": 0.07, "G4": 0.08, "G5": 0.05, # identical rate as G1 + "G6": "invalid_rate", # invalid rate }) target_group_sources = { @@ -71,6 +72,8 @@ def test_target_group_priority_calculation(db_session): (u1.id, "G3"), (u1.id, "G4"), (u1.id, "G5"), + (u1.id, "G6"), + (u1.id, "G7"), # non-existent G7 ], "TG2": [ (u1.id, "G2"), # rates 0.065 -> priority 1 @@ -90,6 +93,8 @@ def test_target_group_priority_calculation(db_session): assert priority_map[("TG1", u1.id, "G2")] == 11 assert priority_map[("TG1", u1.id, "G3")] == 21 assert priority_map[("TG1", u1.id, "G4")] == 31 + assert ("TG1", u1.id, "G6") not in priority_map + assert ("TG1", u1.id, "G7") not in priority_map # Assert priority values in TG2 (starts from 1 independently) # 0.065 -> rank 0 -> priority 1