86 lines
3.0 KiB
Python
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))
|
|
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}
|