from uuid import UUID from fastapi import APIRouter, Depends, Query from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from backend.app.core.dependencies import require_permissions, get_current_user from backend.app.db.session import get_db from backend.app.models import AdjustLog, User from backend.app.schemas.adjust_log import AdjustLogResponse from backend.app.schemas.pagination import PaginatedResponse router = APIRouter(prefix="/adjust-logs", tags=["adjust-logs"]) def is_limited_scope(user: User) -> bool: return user.role and user.role.name not in {"管理员", "排班员"} @router.get( "", response_model=list[AdjustLogResponse] | PaginatedResponse[AdjustLogResponse], dependencies=[Depends(require_permissions(["schedule.view"]))], ) async def list_logs( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), dept_id: UUID | None = Query(default=None), page: int | None = Query(default=None, ge=1), page_size: int | None = Query(default=None, ge=1, le=200, alias="pageSize"), size: int | None = Query(default=None, ge=1, le=200), ): query = select(AdjustLog) if is_limited_scope(current_user) and current_user.dept_id: query = query.where(AdjustLog.dept_id == current_user.dept_id) elif dept_id: query = query.where(AdjustLog.dept_id == dept_id) if page is None and page_size is None and size is None: result = await db.execute(query.order_by(AdjustLog.created_at.desc())) return result.scalars().all() page_value = page or 1 size_value = page_size or size or 10 total = await db.scalar(select(func.count()).select_from(query.subquery())) result = await db.execute( query.order_by(AdjustLog.created_at.desc()) .offset((page_value - 1) * size_value) .limit(size_value) ) return { "items": result.scalars().all(), "total": total or 0, "page": page_value, "pageSize": size_value, }