feat: 增强 Schema 定义

- AlertCreate/Response: 新增 bind_id/device_id/bbox/level
- 新增 DeviceResponse/DeviceListResponse
- 新增 DeviceStatisticsResponse
- HealthResponse: 新增 mqtt/websocket_connections

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-05 13:57:15 +08:00
parent a5ecec7610
commit cd21d65b85

View File

@@ -1,18 +1,21 @@
import os import os
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing import Optional, List from typing import Optional, List, Dict, Any
from datetime import datetime from datetime import datetime
class AlertCreate(BaseModel): class AlertCreate(BaseModel):
camera_id: str = Field(..., description="摄像头标识") camera_id: str = Field(..., description="摄像头标识")
roi_id: Optional[str] = Field(None, description="ROI区域标识") roi_id: Optional[str] = Field(None, description="ROI区域标识")
bind_id: Optional[str] = Field(None, description="绑定ID")
device_id: Optional[str] = Field(None, description="边缘设备ID")
alert_type: str = Field(..., description="告警类型") alert_type: str = Field(..., description="告警类型")
algorithm: Optional[str] = Field(None, description="算法名称") algorithm: Optional[str] = Field(None, description="算法名称")
confidence: Optional[int] = Field(None, ge=0, le=100, description="置信度") confidence: Optional[int] = Field(None, ge=0, le=100, description="置信度")
duration_minutes: Optional[int] = Field(None, ge=0, description="离岗时长(分钟)") duration_minutes: Optional[int] = Field(None, ge=0, description="离岗时长(分钟)")
trigger_time: datetime = Field(..., description="触发时间") trigger_time: datetime = Field(..., description="触发时间")
message: Optional[str] = Field(None, description="告警消息") message: Optional[str] = Field(None, description="告警消息")
bbox: Optional[str] = Field(None, description="检测框坐标")
class AlertResponse(BaseModel): class AlertResponse(BaseModel):
@@ -20,6 +23,8 @@ class AlertResponse(BaseModel):
alert_no: str alert_no: str
camera_id: str camera_id: str
roi_id: Optional[str] roi_id: Optional[str]
bind_id: Optional[str]
device_id: Optional[str]
alert_type: str alert_type: str
algorithm: Optional[str] algorithm: Optional[str]
confidence: Optional[int] confidence: Optional[int]
@@ -27,10 +32,13 @@ class AlertResponse(BaseModel):
trigger_time: Optional[str] trigger_time: Optional[str]
message: Optional[str] message: Optional[str]
snapshot_url: Optional[str] snapshot_url: Optional[str]
bbox: Optional[Any] = None
status: str status: str
level: Optional[str]
handle_remark: Optional[str] handle_remark: Optional[str]
handled_by: Optional[str] handled_by: Optional[str]
handled_at: Optional[str] handled_at: Optional[str]
work_order_id: Optional[int]
ai_analysis: Optional[dict] ai_analysis: Optional[dict]
created_at: Optional[str] created_at: Optional[str]
updated_at: Optional[str] updated_at: Optional[str]
@@ -57,10 +65,48 @@ class AlertStatisticsResponse(BaseModel):
confirmed: int confirmed: int
ignored: int ignored: int
resolved: int resolved: int
dispatched: int = 0
by_type: dict by_type: dict
by_level: dict by_level: Optional[dict] = None
# ==================== 设备相关 ====================
class DeviceResponse(BaseModel):
id: int
device_id: str
device_name: Optional[str]
status: str
last_heartbeat: Optional[str]
uptime_seconds: Optional[int]
frames_processed: Optional[int]
alerts_generated: Optional[int]
extra_info: Optional[Dict[str, Any]]
created_at: Optional[str]
updated_at: Optional[str]
class Config:
from_attributes = True
class DeviceListResponse(BaseModel):
devices: List[DeviceResponse]
total: int
page: int
page_size: int
class DeviceStatisticsResponse(BaseModel):
total: int
online: int
offline: int
error: int
# ==================== 健康检查 ====================
class HealthResponse(BaseModel): class HealthResponse(BaseModel):
status: str status: str
database: str database: str
mqtt: Optional[str] = None
websocket_connections: Optional[int] = None