JhHardwareWRS_BackPoint/app/services/common.py
2026-06-24 15:19:14 +08:00

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