Files
chongming-plugins/aibox_sophon_adapter/router/list_alarms.py
T
2026-09-04 14:51:12 +08:00

86 lines
3.0 KiB
Python

"""
查询告警记录列表 — GET /aibox/list_alarms
"""
import orjson
import logging
from chongming_worker import rpc_method
logger = logging.getLogger(__name__)
@rpc_method(
subject="aibox_sophon_adapter.list_alarms",
method="GET",
summary="查询告警记录列表",
)
async def list_alarms(
board_id: str = "",
summary: str = "",
page: int = 1,
page_size: int = 20,
worker_id: str = "",
) -> dict:
"""分页查询告警记录,支持按设备ID和告警类型筛选"""
from ..global_var import db
alarms = []
total = 0
try:
if db is None:
raise RuntimeError("Database not initialized")
async with db.get_session() as session:
from ..models.orm import AlarmRecord
from sqlalchemy import select, func, desc
# 构建查询
conditions = []
if board_id:
conditions.append(AlarmRecord.board_id == board_id) # type: ignore
if summary:
conditions.append(AlarmRecord.summary == summary) # type: ignore
# 总数
count_stmt = select(func.count()).select_from(AlarmRecord)
if conditions:
from sqlalchemy import and_
count_stmt = count_stmt.where(and_(*conditions))
count_result = await session.execute(count_stmt)
total = count_result.scalar() or 0
# 分页数据
stmt = select(AlarmRecord).order_by(desc(AlarmRecord.created_at)) # type: ignore
if conditions:
from sqlalchemy import and_
stmt = stmt.where(and_(*conditions))
stmt = stmt.offset((page - 1) * page_size).limit(page_size)
result = await session.execute(stmt)
records = result.scalars().all()
for record in records:
alarm_data = {}
try:
alarm_data = orjson.loads(record.alarm_data.encode("utf-8")) if record.alarm_data else {}
except orjson.JSONDecodeError:
pass
alarms.append({
"alarm_id": record.alarm_id,
"board_id": record.board_id,
"board_ip": record.board_ip,
"summary": record.summary,
"task_session": record.task_session,
"media_name": record.media_name,
"video_file": record.video_file,
"alarm_time": record.alarm_time,
"alarm_timestamp": record.alarm_timestamp,
"result_type": alarm_data.get("Result", {}).get("Type", ""),
"created_at": record.created_at.isoformat() if record.created_at else None,
})
except Exception as e:
logger.error(f"[list_alarms] 查询失败: {e}")
return {"alarms": [], "total": 0, "page": page, "page_size": page_size, "error": str(e)}
return {"alarms": alarms, "total": total, "page": page, "page_size": page_size}