feat: sync account priorities after rate changes

This commit is contained in:
liumangmang
2026-05-29 17:51:12 +08:00
parent c5778bb3e7
commit 5c20ddc8e6
21 changed files with 1510 additions and 26 deletions
+6 -20
View File
@@ -32,7 +32,7 @@ from app.schemas.website import (
WebsiteUpdate,
)
from app.services.website_client import Sub2ApiWebsiteClient
from app.services.website_sync import binding_sources, sync_binding
from app.services.website_sync import binding_sources, sync_binding, build_rate_priority_map
from app.utils.auth import get_current_user
router = APIRouter(tags=["websites"])
@@ -171,24 +171,10 @@ def _numeric_group_id(value: str | None) -> int | None:
def _build_rate_priority_map(db: Session, upstream_ids: set[int]) -> dict[str, int]:
"""根据上游分组倍率构建 group_id → priority 映射。
遍历所有涉及的上游的最新快照,收集分组的倍率,按倍率升序排列后赋值 priority
倍率最低的 priority=1,次低的 priority=2,以此类推。相同倍率的分组共享同一 priority。
委托给 website_sync.build_rate_priority_map 避免逻辑重复
"""
group_rates: dict[str, float] = {}
for uid in upstream_ids:
groups = _latest_upstream_groups(db, uid)
for g in groups:
gid = _source_group_id(g)
rate = _source_group_rate(g)
if gid:
# 同一 group_id 在同个 upstream 内是唯一的;跨 upstream 的相同 group_id
# 如果倍率不同则以最后遇到的为准(实际很少冲突)
group_rates[gid] = rate
# 按倍率排序分配 priority
unique_rates = sorted(set(group_rates.values()))
rate_to_priority = {rate: idx + 1 for idx, rate in enumerate(unique_rates)}
return {gid: rate_to_priority[rate] for gid, rate in group_rates.items()}
return build_rate_priority_map(db, upstream_ids)
@router.get("/api/websites", response_model=List[WebsiteResponse])
@@ -545,7 +531,7 @@ def import_upstream_keys_as_accounts(
exists = c.account_exists(row.imported_account_id)
if exists is True:
# 自动更新已有账号的 priority(分步导入时全局倍率排序可能已变)
new_priority = rate_priority_map.get(row.group_id) if body.auto_priority_by_rate else None
new_priority = rate_priority_map.get(f"{row.upstream_id}:{row.group_id}") if body.auto_priority_by_rate else None
priority_msg = "已导入过,已跳过"
if new_priority is not None:
try:
@@ -616,7 +602,7 @@ def import_upstream_keys_as_accounts(
"group_ids": group_ids,
"rate_multiplier": 1,
"concurrency": body.concurrency,
"priority": rate_priority_map.get(row.group_id, body.priority) if body.auto_priority_by_rate else body.priority,
"priority": rate_priority_map.get(f"{row.upstream_id}:{row.group_id}", body.priority) if body.auto_priority_by_rate else body.priority,
"notes": f"Imported by SmartUp from upstream key #{row.id}",
}
try: