| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 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,
- }
|