adjust_logs.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from uuid import UUID
  2. from fastapi import APIRouter, Depends, Query
  3. from sqlalchemy import func, select
  4. from sqlalchemy.ext.asyncio import AsyncSession
  5. from backend.app.core.dependencies import require_permissions, get_current_user
  6. from backend.app.db.session import get_db
  7. from backend.app.models import AdjustLog, User
  8. from backend.app.schemas.adjust_log import AdjustLogResponse
  9. from backend.app.schemas.pagination import PaginatedResponse
  10. router = APIRouter(prefix="/adjust-logs", tags=["adjust-logs"])
  11. def is_limited_scope(user: User) -> bool:
  12. return user.role and user.role.name not in {"管理员", "排班员"}
  13. @router.get(
  14. "",
  15. response_model=list[AdjustLogResponse] | PaginatedResponse[AdjustLogResponse],
  16. dependencies=[Depends(require_permissions(["schedule.view"]))],
  17. )
  18. async def list_logs(
  19. db: AsyncSession = Depends(get_db),
  20. current_user: User = Depends(get_current_user),
  21. dept_id: UUID | None = Query(default=None),
  22. page: int | None = Query(default=None, ge=1),
  23. page_size: int | None = Query(default=None, ge=1, le=200, alias="pageSize"),
  24. size: int | None = Query(default=None, ge=1, le=200),
  25. ):
  26. query = select(AdjustLog)
  27. if is_limited_scope(current_user) and current_user.dept_id:
  28. query = query.where(AdjustLog.dept_id == current_user.dept_id)
  29. elif dept_id:
  30. query = query.where(AdjustLog.dept_id == dept_id)
  31. if page is None and page_size is None and size is None:
  32. result = await db.execute(query.order_by(AdjustLog.created_at.desc()))
  33. return result.scalars().all()
  34. page_value = page or 1
  35. size_value = page_size or size or 10
  36. total = await db.scalar(select(func.count()).select_from(query.subquery()))
  37. result = await db.execute(
  38. query.order_by(AdjustLog.created_at.desc())
  39. .offset((page_value - 1) * size_value)
  40. .limit(size_value)
  41. )
  42. return {
  43. "items": result.scalars().all(),
  44. "total": total or 0,
  45. "page": page_value,
  46. "pageSize": size_value,
  47. }