diff --git a/aibox_sophon_adapter/models/alarm_models.py b/aibox_sophon_adapter/models/alarm_models.py index cc46986..fe9e422 100644 --- a/aibox_sophon_adapter/models/alarm_models.py +++ b/aibox_sophon_adapter/models/alarm_models.py @@ -14,6 +14,8 @@ from pydantic import BaseModel, Field class GpsInfo(BaseModel): """GPS 位置信息""" + model_config = {"extra": "allow"} + available: bool = Field(default=False, description="是否有 GPS 功能") kSpeed: float = Field(default=0.0, description="对地速度 (km/h)") nSpeed: float = Field(default=0.0, description="对地速率 (节)") @@ -24,6 +26,8 @@ class GpsInfo(BaseModel): class MediaInfo(BaseModel): """视频通道信息""" + model_config = {"extra": "allow"} + MediaName: str = Field(default="", description="通道标识") MediaDesc: str = Field(default="", description="通道描述") MediaUrl: str = Field(default="", description="通道视频流地址") @@ -37,6 +41,8 @@ class MediaInfo(BaseModel): class ResultProperty(BaseModel): """告警 Result 中的属性项""" + model_config = {"extra": "allow"} + property: str = Field(default="", description="属性标识") desc: str = Field(default="", description="属性描述") value: Any = Field(default=None, description="属性值(String/Int/Float)") @@ -90,7 +96,7 @@ class AlarmReportRequest(BaseModel): LocalLabeledPath: str = Field(default="", description="有标注告警图在盒子中的相对路径") # 通道信息 - Media: MediaInfo = Field(default_factory=MediaInfo, description="配置的媒体通道") + Media: Optional[MediaInfo] = Field(default=None, description="配置的媒体通道") # 违规描述 Summary: str = Field(default="", description="违规类型(NoHelmet / Intrude / PeopleCross 等)") @@ -109,10 +115,10 @@ class AlarmReportRequest(BaseModel): VideoFile: str = Field(default="", description="关联的视频标识(视频上传接口返回)") # GPS - GPS: GpsInfo = Field(default_factory=GpsInfo, description="当前位置信息") + GPS: Optional[GpsInfo] = Field(default=None, description="当前位置信息") # 违规结果 - Result: AlarmResult = Field(default_factory=AlarmResult, description="违规检测结果") + Result: Optional[AlarmResult] = Field(default=None, description="违规检测结果") # 预留字段 Type: int = Field(default=0, description="预留字段") diff --git a/aibox_sophon_adapter/routes.py b/aibox_sophon_adapter/routes.py index ec90334..a86f7c8 100644 --- a/aibox_sophon_adapter/routes.py +++ b/aibox_sophon_adapter/routes.py @@ -116,8 +116,8 @@ async def alarm_report(body: AlarmReportRequest) -> AlarmReportResponse: 返回格式:{"Result": {"Code": 0, "Desc": ""}} 仅当 HTTP 200 + Code 非 0 时,盒子认为上报失败。 """ - # 获取完整报文(含 extra 字段) - full_data = body.model_dump() + # 获取完整报文(含 extra 字段,排除 None 值以生成整洁 JSON) + full_data = body.model_dump(exclude_none=True) board_id = full_data.get("BoardId", "") board_ip = full_data.get("BoardIp", "")