from datetime import datetime from typing import Optional from pydantic import BaseModel class DeviceStatusSummary(BaseModel): total: int online: int offline: int checking: int unknown: int online_rate: float class DeviceStatsItem(BaseModel): device_id: int device_name: str device_ip: str device_type: str location: str project_name: str total_pings: int alive_pings: int packet_loss_rate: float avg_response_time: Optional[float] = None offline_count: int total_offline_duration: int # 分钟 max_offline_duration: int class TimeSeriesPoint(BaseModel): time: datetime value: float class DashboardStats(BaseModel): summary: DeviceStatusSummary recent_offline: list # list[AlertEventOut] offline_trend: list[TimeSeriesPoint] packet_loss_top: list[DeviceStatsItem]