from decimal import Decimal from math import ceil from typing import Any from sqlalchemy import Select, func, select from sqlalchemy.orm import Session ROLE_NAMES = { "worker": "冲压工人", "admin": "管理员", "manager": "经理", } REPORT_STATUS_NAMES = { "pending": "待审核", "approved": "已通过", "rejected": "已驳回", } def normalize_device_no(value: str | None) -> str: return str(value or "").strip() def as_float(value: Any) -> float: if isinstance(value, Decimal): return float(value) if value is None: return 0.0 try: return float(value) except (TypeError, ValueError): return 0.0 def round1(value: Any) -> float: return round(as_float(value), 1) def round2(value: Any) -> float: return round(as_float(value), 2) def round3(value: Any) -> float: return round(as_float(value), 3) def paginate(db: Session, query: Select, page: int, page_size: int) -> dict[str, Any]: safe_page = max(1, int(page or 1)) safe_page_size = min(100, max(1, int(page_size or 10))) count_query = select(func.count()).select_from(query.order_by(None).subquery()) total = db.scalar(count_query) or 0 total_pages = max(1, ceil(total / safe_page_size)) safe_page = min(safe_page, total_pages) rows = db.scalars(query.limit(safe_page_size).offset((safe_page - 1) * safe_page_size)).all() return { "page": safe_page, "page_size": safe_page_size, "total": total, "total_pages": total_pages, "rows": rows, }