diff --git a/aibox_sophon_adapter/models/alarm_models.py b/aibox_sophon_adapter/models/alarm_models.py index fe9e422..35413c1 100644 --- a/aibox_sophon_adapter/models/alarm_models.py +++ b/aibox_sophon_adapter/models/alarm_models.py @@ -5,7 +5,7 @@ 未声明的额外字段通过 model_config extra=allow 保留。 """ from typing import Any, Optional -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, field_validator # ============================================================ @@ -23,6 +23,14 @@ class GpsInfo(BaseModel): longitude: float = Field(default=0.0, description="经度") angleCourse: float = Field(default=0.0, description="GPS 角度") + @field_validator('kSpeed', 'nSpeed', 'latitude', 'longitude', 'angleCourse', mode='before') + @classmethod + def _empty_str_to_zero(cls, v: Any) -> Any: + """设备可能上报空字符串,转为 0.0""" + if v == '' or v is None: + return 0.0 + return v + class MediaInfo(BaseModel): """视频通道信息""" @@ -38,6 +46,14 @@ class MediaInfo(BaseModel): RtspTransport: bool = Field(default=False, description="是否开启 RTSP 转发") Params: Optional[dict] = Field(default=None, description="预留其他参数") + @field_validator('MediaWidth', 'MediaHeight', mode='before') + @classmethod + def _empty_str_to_zero(cls, v: Any) -> Any: + """设备可能上报空字符串,转为 0""" + if v == '' or v is None: + return 0 + return v + class ResultProperty(BaseModel): """告警 Result 中的属性项""" @@ -125,6 +141,14 @@ class AlarmReportRequest(BaseModel): DataId: int = Field(default=0, description="数据 ID") Id: int = Field(default=0, description="记录 ID") + @field_validator('DataId', 'Id', 'TimeStamp', 'Type', mode='before') + @classmethod + def _empty_str_to_zero(cls, v: Any) -> Any: + """设备可能上报空字符串,转为 0""" + if v == '' or v is None: + return 0 + return v + # ============================================================ # 告警上报响应体