64 lines
1.5 KiB
Python
64 lines
1.5 KiB
Python
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,
|
|
}
|