feat: persist browser sessions and update admin workflows
This commit is contained in:
@@ -169,6 +169,28 @@ 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 映射。
|
||||
|
||||
遍历所有涉及的上游的最新快照,收集分组的倍率,按倍率升序排列后赋值 priority。
|
||||
倍率最低的 priority=1,次低的 priority=2,以此类推。相同倍率的分组共享同一 priority。
|
||||
"""
|
||||
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()}
|
||||
|
||||
|
||||
@router.get("/api/websites", response_model=List[WebsiteResponse])
|
||||
def list_websites(db: Session = Depends(get_db), _=Depends(get_current_user)):
|
||||
return [_website_response(row) for row in db.query(Website).order_by(Website.id).all()]
|
||||
@@ -496,6 +518,16 @@ def import_upstream_keys_as_accounts(
|
||||
if _u:
|
||||
upstream_base_url = _u.base_url
|
||||
|
||||
# 按倍率自动分配优先级
|
||||
rate_priority_map: dict[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:
|
||||
# 没有快照时忽略,后续 fallback 到 body.priority
|
||||
pass
|
||||
|
||||
with _client(website) as c:
|
||||
for row in rows:
|
||||
# 先确定平台(失败项也需要记录)
|
||||
@@ -512,6 +544,16 @@ def import_upstream_keys_as_accounts(
|
||||
old_account_id = row.imported_account_id
|
||||
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
|
||||
priority_msg = "已导入过,已跳过"
|
||||
if new_priority is not None:
|
||||
try:
|
||||
c.update_account(old_account_id, {"priority": new_priority})
|
||||
priority_msg = f"已导入过,优先级已更新为 {new_priority}"
|
||||
except Exception as exc:
|
||||
logger.warning("update priority failed account=%s: %s", old_account_id, exc)
|
||||
priority_msg = f"已导入过,优先级更新失败: {exc}"
|
||||
items.append(ImportAccountItem(
|
||||
upstream_key_id=row.id,
|
||||
source_group_id=row.group_id,
|
||||
@@ -522,7 +564,7 @@ def import_upstream_keys_as_accounts(
|
||||
platform=platform,
|
||||
upstream_base_url=upstream_base_url,
|
||||
status="exists",
|
||||
message="已导入过,已跳过",
|
||||
message=priority_msg,
|
||||
))
|
||||
continue
|
||||
elif exists is False:
|
||||
@@ -574,7 +616,7 @@ def import_upstream_keys_as_accounts(
|
||||
"group_ids": group_ids,
|
||||
"rate_multiplier": 1,
|
||||
"concurrency": body.concurrency,
|
||||
"priority": body.priority,
|
||||
"priority": rate_priority_map.get(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