创作记录-管理后台完成

This commit is contained in:
2026-06-03 12:48:44 +08:00
parent fe67fe86d3
commit 7ef0450dd1
8 changed files with 1107 additions and 56 deletions
+29 -8
View File
@@ -199,26 +199,47 @@ async def list_tasks(
description="每页返回数量,范围 1~100",
examples=[20],
),
user_id: str | None = Query(
None,
description="查询相关用户ID的对应记录[管理后台]",
examples=["0019e0a448a23114888"],
),
user_name: str | None = Query(
None,
description="查询相关用户名的对应记录[管理后台]",
examples=["demo"],
),
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
is_admin = False
if current_user.user_type == 'admin':
is_admin = True
else:
user_id = current_user.id
total, items = await list_async_generation_tasks(
db,
current_user.id,
user_id,
user_name,
gen_type,
status,
page,
page_size,
is_admin,
)
# ====================== 在这里加排序(最新在前)======================
# 按 created_at 降序(没有则用 id 降序)
items_sorted = sorted(
items,
key=lambda x: x.created_at if x.created_at is not None else x.id,
reverse=False # 降序
)
return GenerationAITaskListOut(total=total, items=[record_to_out(i) for i in items_sorted])
if not is_admin:
# 按 created_at 降序(没有则用 id 降序)
items_sorted = sorted(
items,
key=lambda x: x.created_at if x.created_at is not None else x.id,
reverse=False # 升序
)
else:
items_sorted = items
return GenerationAITaskListOut(total=total, items=[record_to_out(task=i, is_admin=is_admin) for i in items_sorted])
@router.get(
@@ -250,6 +250,8 @@ class GenerationAITaskOut(BaseModel):
"example": {
"id": "0019e0a44895b6d837d",
"source_type": "chat_task",
"user_id": None,
"user_name": None,
"project_id": None,
"gen_type": "image",
"generation_mode": "chatapi_async",
@@ -302,6 +304,14 @@ class GenerationAITaskOut(BaseModel):
"chat_task",
description="历史记录来源。ChatGenerationTask 新任务历史固定为 chat_task",
)
user_id: str | None = Field(
None,
description="用户ID,管理后台调用存在对应值,通常为 null",
)
user_name: str | None = Field(
None,
description="用户名称,管理后台调用存在对应值,通常为 null",
)
project_id: str | None = Field(
None,
description="项目ID。当前 /generation-ai 任务不绑定项目,通常为 null",
@@ -374,6 +384,8 @@ class GenerationAITaskListOut(BaseModel):
{
"id": "0019e0a44895b6d837d",
"source_type": "chat_task",
"user_id": None,
"user_name": None,
"project_id": None,
"gen_type": "image",
"generation_mode": "chatapi_async",
@@ -311,12 +311,14 @@ async def create_async_generation_task(db: AsyncSession, current_user: User, req
return task
def record_to_out(task: ChatGenerationTask) -> GenerationAITaskOut:
def record_to_out(task: ChatGenerationTask, is_admin: bool = False) -> GenerationAITaskOut:
refs = _parse_json(task.media_references)
snapshot = engine_snapshot_out(_parse_json(task.engine_snapshot_json))
return GenerationAITaskOut(
id=task.id,
# project_id=None,
user_id=task.user_id if is_admin else None,
user_name=getattr(task, "username", None) if is_admin else None,
project_id=None,
gen_type=task.gen_type,
generation_mode=task.generation_mode,
pipeline_stage=task.pipeline_stage,
@@ -376,28 +378,55 @@ def engine_snapshot_out(snapshot: dict) -> dict:
async def list_async_generation_tasks(
db: AsyncSession,
user_id: str,
user_id: str | None,
user_name: str | None,
gen_type: str | None,
status: str | None,
page: int,
page_size: int,
is_admin: bool = False,
):
query = select(ChatGenerationTask).where(
ChatGenerationTask.user_id == user_id,
if is_admin:
query = (
select(ChatGenerationTask, User.username)
.join(User, ChatGenerationTask.user_id == User.id)
)
if user_name:
query = query.where(User.username.like(f"%{user_name}%"))
else:
query = select(ChatGenerationTask)
query = query.where(
ChatGenerationTask.generation_mode == "chatapi_async",
ChatGenerationTask.deleted_at.is_(None),
)
if user_id:
query = query.where(ChatGenerationTask.user_id == user_id)
if gen_type:
query = query.where(ChatGenerationTask.gen_type == gen_type)
if status:
query = query.where(ChatGenerationTask.status == status)
count_query = select(func.count()).select_from(query.subquery())
total = (await db.execute(count_query)).scalar_one()
result = await db.execute(
query.order_by(ChatGenerationTask.created_at.desc())
.offset((page - 1) * page_size)
.limit(page_size)
)
if is_admin:
tasks = []
for task, username in result.all():
task.username = username
tasks.append(task)
return total, tasks
return total, list(result.scalars().all())
def _normalize_history_gen_type(gen_type: str | None) -> str: