feat: 修正优先级自动计算算法为分目标分组独立排序,并优化一键分组整理完成后仅触发一次网站级优先级重排

This commit is contained in:
liumangmang
2026-07-01 20:19:54 +08:00
parent fd46492012
commit dd3649a6ad
4 changed files with 536 additions and 280 deletions
+28 -10
View File
@@ -44,7 +44,8 @@ from app.services.website_client import Sub2ApiWebsiteClient, _extract_id
from app.services.website_sync import (
binding_sources,
sync_binding,
build_rate_priority_map,
build_target_group_priority_map,
sync_account_priorities_for_website,
reconcile_upstream_keys_full,
sync_account_priorities_for_upstream,
latest_rate_map,
@@ -646,12 +647,16 @@ def import_upstream_keys_as_accounts(
upstream_base_url = _u.base_url
# 按倍率自动分配优先级
rate_priority_map: dict[str, int] = {}
rate_priority_map: dict[tuple[str, int, str], int] = {}
if body.auto_priority_by_rate:
upstream_ids = {row.upstream_id for row in rows}
try:
rate_priority_map = _build_rate_priority_map(db, upstream_ids)
except HTTPException:
target_group_sources = {}
for row in rows:
target_group_id = body.target_group_map.get(row.group_id)
if target_group_id:
target_group_sources.setdefault(str(target_group_id), []).append((row.upstream_id, row.group_id))
rate_priority_map = build_target_group_priority_map(db, target_group_sources)
except Exception:
# 没有快照时忽略,后续 fallback 到 body.priority
pass
@@ -763,7 +768,7 @@ def import_upstream_keys_as_accounts(
"group_ids": group_ids,
"rate_multiplier": 1,
"concurrency": body.concurrency,
"priority": rate_priority_map.get(f"{row.upstream_id}:{row.group_id}", body.priority) if body.auto_priority_by_rate else body.priority,
"priority": rate_priority_map.get((str(target_group_id), 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:
@@ -863,10 +868,17 @@ def organize_website_groups(
except Exception as exc:
logger.warning("organize reconcile failed for upstream %s: %s", uid, exc)
# 3. 按倍率自动分配优先级
rate_priority_map: dict[str, int] = {}
# 3. 按倍率自动分配优先级 (分目标分组进行优先级计算)
rate_priority_map: dict[tuple[str, int, str], int] = {}
try:
rate_priority_map = _build_rate_priority_map(db, upstream_ids)
target_group_sources = {}
for b in bindings:
for src in binding_sources(b):
uid = src.get("upstream_id")
gid = src.get("group_id")
if uid and gid:
target_group_sources.setdefault(str(b.target_group_id), []).append((int(uid), str(gid)))
rate_priority_map = build_target_group_priority_map(db, target_group_sources)
except Exception:
pass
@@ -1110,7 +1122,7 @@ def organize_website_groups(
group_ids.append(target_group_id)
account_name = f"SmartUp-{row.group_name or row.group_id}-{row.id}"
priority_val = rate_priority_map.get(f"{row.upstream_id}:{row.group_id}", 1)
priority_val = rate_priority_map.get((str(target_group_id), row.upstream_id, row.group_id), 1)
account_body = {
"name": account_name,
"platform": platform,
@@ -1190,6 +1202,12 @@ def organize_website_groups(
if failed_count:
parts.append(f"失败 {failed_count}")
# 整理完成后,调用一次网站级 priority 重排以修正历史和当前账号优先级
try:
sync_account_priorities_for_website(db, wid)
except Exception as exc:
logger.warning("failed to sync priorities after organize for website %s: %s", wid, exc)
message = "整理完成:" + " / ".join(parts) if parts else "整理完成:无任何绑定或数据"
return OrganizeGroupsResponse(
success=failed_count == 0,