feat: 修正优先级自动计算算法为分目标分组独立排序,并优化一键分组整理完成后仅触发一次网站级优先级重排
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user