""" 查询告警记录列表 — 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}