This commit is contained in:
ddrwode
2026-03-01 23:54:55 +08:00
parent af9be21b32
commit e54ef46153
2 changed files with 76 additions and 6 deletions

View File

@@ -56,6 +56,17 @@ def _parse_limit(raw_value, default: int = 50, max_value: int = 200) -> int:
return min(value, max_value)
def _parse_positive_int(raw_value, default: int = 1) -> int:
"""解析正整数参数。"""
try:
value = int(raw_value)
except (TypeError, ValueError):
return default
if value <= 0:
return default
return value
def _parse_task_status(raw_status: Optional[str]) -> Optional[TaskStatus]:
"""解析任务状态。为空时返回 None。"""
if not raw_status:
@@ -122,7 +133,7 @@ def _is_task_log_for_account(task_log: TaskLog, account: BossAccount) -> bool:
return False
def _list_tasks_by_account(account: BossAccount, task_status: Optional[TaskStatus], limit: int) -> list:
def _list_tasks_by_account(account: BossAccount, task_status: Optional[TaskStatus], limit: Optional[int] = 50) -> list:
"""
聚合某账号的任务列表:
1) 内存任务(实时)
@@ -142,7 +153,8 @@ def _list_tasks_by_account(account: BossAccount, task_status: Optional[TaskStatu
db_qs = db_qs.filter(status=task_status.value)
# 多取一些做过滤,避免因为条件匹配损耗导致结果太少
for task_log in db_qs[: max(limit * 8, 200)]:
db_logs = db_qs if limit is None else db_qs[: max(limit * 8, 200)]
for task_log in db_logs:
if not _is_task_log_for_account(task_log, account):
continue
if task_log.task_id in items_by_task_id:
@@ -151,6 +163,8 @@ def _list_tasks_by_account(account: BossAccount, task_status: Optional[TaskStatu
merged = list(items_by_task_id.values())
merged.sort(key=lambda item: item.get("created_at") or "", reverse=True)
if limit is None:
return merged
return merged[:limit]
@@ -284,7 +298,11 @@ def task_list(request):
@api_view(["GET"])
def task_list_by_account(request, account_id: int):
"""按账号 ID 查询任务列表(不支持按 task_id 查询)。"""
"""
按账号 ID 查询任务列表(不支持按 task_id 查询)。
- 兼容模式:不传 page/page_size 时,返回数组
- 分页模式:传 page 或 page_size 时,返回 {total, page, page_size, results}
"""
account = BossAccount.objects.filter(pk=account_id).first()
if not account:
return api_error(http_status.HTTP_404_NOT_FOUND, f"账号 {account_id} 不存在")
@@ -294,5 +312,27 @@ def task_list_by_account(request, account_id: int):
if st and task_status is None:
return api_error(http_status.HTTP_400_BAD_REQUEST, f"不支持的任务状态: {st}")
limit = _parse_limit(request.query_params.get("limit", 50))
return api_success(_list_tasks_by_account(account, task_status=task_status, limit=limit))
# 旧接口兼容默认返回数组limit 控制条数
enable_paging = ("page" in request.query_params) or ("page_size" in request.query_params)
if not enable_paging:
limit = _parse_limit(request.query_params.get("limit", 50))
return api_success(_list_tasks_by_account(account, task_status=task_status, limit=limit))
page = _parse_positive_int(request.query_params.get("page"), default=1)
page_size = _parse_limit(
request.query_params.get("page_size", request.query_params.get("limit", 20)),
default=20,
max_value=200,
)
all_items = _list_tasks_by_account(account, task_status=task_status, limit=None)
total = len(all_items)
start = (page - 1) * page_size
end = start + page_size
return api_success({
"total": total,
"page": page,
"page_size": page_size,
"results": all_items[start:end],
})