Files
pickling-mes/backend/app/api/dashboard.py

56 lines
1.8 KiB
Python
Raw Normal View History

from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func
from datetime import datetime, date
from app.database import get_db
from app.models.material import Coil, CoilStatus
from app.models.production import ProductionRecord
from app.models.downtime import DowntimeRecord
from app.models.equipment import Equipment, EquipmentStatus
from app.schemas.common import Response
from app.services.auth_service import get_current_user
router = APIRouter()
@router.get("/summary", response_model=Response[dict])
async def get_summary(db: AsyncSession = Depends(get_db), _ = Depends(get_current_user)):
today = datetime.combine(date.today(), datetime.min.time())
# 今日产量
prod_result = await db.execute(
select(func.count(), func.sum(ProductionRecord.process_weight))
.where(ProductionRecord.start_time >= today)
)
prod_count, prod_weight = prod_result.one()
# 在线钢卷数
online_result = await db.execute(
select(func.count()).where(Coil.status == CoilStatus.ON_LINE)
)
online_coils = online_result.scalar()
# 今日停机时长
downtime_result = await db.execute(
select(func.sum(DowntimeRecord.duration))
.where(DowntimeRecord.start_time >= today)
)
total_downtime = downtime_result.scalar() or 0
# 设备状态统计
equip_result = await db.execute(
select(Equipment.status, func.count()).group_by(Equipment.status)
)
equip_stats = {str(row[0]): row[1] for row in equip_result}
return Response.ok({
"today_production": {
"coil_count": prod_count or 0,
"weight_kg": float(prod_weight or 0),
},
"online_coils": online_coils or 0,
"today_downtime_min": float(total_downtime),
"equipment_status": equip_stats,
})