feat: sync account priorities after rate changes
This commit is contained in:
@@ -512,13 +512,14 @@ def check_now(uid: int, db: Session = Depends(get_db), _=Depends(get_current_use
|
||||
|
||||
if was_unhealthy:
|
||||
webhook_service.send_status_event(db, u.id, u.name, u.base_url, "upstream_recovered")
|
||||
# 先同步 Key 状态(标记 orphaned),再执行优先级同步(避免未标记的 key 参与计算)
|
||||
from app.services.scheduler import _sync_upstream_keys as _synck
|
||||
_synck(uid, snapshot, new_row.captured_at)
|
||||
|
||||
if changes:
|
||||
webhook_service.send_rate_changed(db, u.id, u.name, u.base_url, changes)
|
||||
website_sync.sync_affected_bindings(db, u.id, changes)
|
||||
|
||||
# 同步 SmartUp Key 状态(使用实际快照入库时间,与定时任务一致)
|
||||
from app.services.scheduler import _sync_upstream_keys as _synck
|
||||
_synck(uid, snapshot, new_row.captured_at)
|
||||
website_sync.sync_account_priorities_for_upstream(db, u.id)
|
||||
|
||||
msg = f"检测成功,{len(groups)} 个分组"
|
||||
if changes:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user