From 83e099051f2c5b4f66a0eb4a774de439928ff1e8 Mon Sep 17 00:00:00 2001 From: haotian <2421912570@qq.com> Date: Mon, 9 Jun 2025 10:51:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0--=E6=B7=BB=E5=8A=A0=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E5=85=A8=E9=83=A8=E5=91=8A=E8=AD=A6=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/v1/endpoints/events.py | 40 ++++++++++++++++++++--- app/crud/event.py | 58 ++++++++++++++++++++++++++++++++-- app/schemas/event.py | 15 +++++++-- change_log.md | 8 +++++ 4 files changed, 112 insertions(+), 9 deletions(-) diff --git a/app/api/v1/endpoints/events.py b/app/api/v1/endpoints/events.py index 0259b6a..3cf6145 100644 --- a/app/api/v1/endpoints/events.py +++ b/app/api/v1/endpoints/events.py @@ -6,7 +6,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.crud.event import event from app.models.models import Robot, Message, RobotInfo,Group, GroupRobot, Event -from app.schemas.event import EventList, EventDetail, EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto, OcrAlertMessage, OcrAlertMessageDto, GetRobotDto, CommonAlertMessage +from app.schemas.event import EventList, EventDetail, EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto, OcrAlertMessage, OcrAlertMessageDto, GetRobotDto, CommonAlertMessage, GetAllMessageDto from app.util.httpResponse import BaseResponse from app.util.status import EventType from sqlalchemy import select @@ -334,17 +334,37 @@ async def get_alert_front_detail( return BaseResponse(code=200, msg="success", data=alert_message[0]) +# 查看全部告警事件详情--属于该机器人的 +@router.get("/events/getAllAlertMessage/{number}") +async def get_all_alert_message( + number: str, + db: AsyncSession = Depends(get_db), + skip: int = Query(0, ge=0), + limit: int = Query(100, ge=1, le=1000) +): + data = await event.get_all_alert_message(db, number, skip, limit) + return BaseResponse( + code = 200, + msg = "success", + data = data + ) + # 获取未处理告警消息数量 @router.get("/events/alertCount", response_model=BaseResponse) async def get_alert_count( number: Optional[str] = None, db: AsyncSession = Depends(get_db) ): + # 未处理告警数量 alert_count = await event.get_alert_count(db, handle="0", number=number) + # 已处理告警数量 processed_count = await event.get_alert_count(db, handle="1", number=number) + # 所有告警数量 + all_count = alert_count + processed_count return BaseResponse(code=200, msg="success", data={ "alert_count": alert_count, - "processed_count": processed_count + "processed_count": processed_count, + "all_count": all_count }) # 获取厂区及机器人实时监控 @router.get("/events/getMonitor") @@ -369,12 +389,14 @@ async def get_monitor(): "视角2": "https://play.livejinan.cn/21ZoxrLa/45ee42a7b9d64400963d6bacc9a75867.m3u8?auth_key=1893340800-0-0-3522915cd5471437682295596e73cac2" }, "室外机器人监控":{ - "视角1": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8", - "视角2": "https://play.livejinan.cn/21ZoxrLa/45ee42a7b9d64400963d6bacc9a75867.m3u8?auth_key=1893340800-0-0-3522915cd5471437682295596e73cac2" + "热成像": "webrtc://qvs-live.thirdmonitor.concoai.com:447/2xenzwqy2ppcl/31011500991180041301_34020000001320000001", + "主监控": "webrtc://qvs-live.thirdmonitor.concoai.com:447/2xenzwqy2ppcl/31011500991180041302_34020000001320000002", + "前置摄像头":"webrtc://qvs-live.thirdmonitor.concoai.com:447/2xenzwqy2ppcl/31011500991180041302_34020000001320000001" } } ) + # 获取机器人统计信息 @router.get("/events/robotST", response_model=BaseResponse[dict]) async def get_robot_st( @@ -397,6 +419,16 @@ async def get_robot_st( "disable_count": disable_count }) +# 获取机器人任务列表 +@router.get("/events/robotTask") +async def get_robot_task( + db: AsyncSession=Depends(get_db), + robotId: Optional[str]=None +): + # print("robotId: ", robotId) + task_list = await event.get_robot_task(db, robotId) + return BaseResponse(code="200", msg="success", data = task_list) + async def get_message_by_event_type( db:AsyncSession , handle: str , diff --git a/app/crud/event.py b/app/crud/event.py index f2dddde..9f1559b 100644 --- a/app/crud/event.py +++ b/app/crud/event.py @@ -1,10 +1,11 @@ + from typing import List, Optional, Dict, Any from sqlalchemy import select, and_, or_, update, bindparam, func from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from app.crud.base import CRUDBase -from app.models.models import Event, Image, RobotInfo, Temperature, Message, Robot -from app.schemas.event import EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto, OcrAlertMessage, OcrAlertMessageDto, GetRobotDto, CommonAlertMessage +from app.models.models import Event, Image, RobotInfo, Temperature, Message, Robot, Task +from app.schemas.event import AllMessageDto, EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto, OcrAlertMessage, OcrAlertMessageDto, GetRobotDto, CommonAlertMessage, GetAllMessageDto from pydantic import VERSION as PYDANTIC_VERSION from datetime import datetime, timedelta, timezone @@ -282,7 +283,43 @@ class CRUDEvent(CRUDBase[Event, EventUpdate, EventUpdate]): back.append(commonAlertMessage) return back - + async def get_all_alert_message( + self, + db: AsyncSession, + number: str, + offset: int, + limit: int + ): + """ + 获取机器人所有的告警 + """ + query_stmt = ( + select(Message.messageId, Message.handle, Message.remark, Message.eventId,Event.number, Event.name, Event.etypeName) + .select_from(Message) + .outerjoin(Event, Message.eventId==Event.eventId) + .where(Event.number == number) + .offset(offset) + .limit(limit) + ) + results = await db.execute(query_stmt) + results = results.mappings().all() + + data = list() + for result in results: + t = AllMessageDto(**result) + + query_image_stmt = ( + select(Image.imageUrl) + .where(Image.eventId == result.eventId) + ) + image_list = await db.execute(query_image_stmt) + t.imageList = image_list.scalars().all() + + data.append(t) + return data + + + async def handle_ocr_alerts( self, db:AsyncSession, @@ -481,6 +518,21 @@ class CRUDEvent(CRUDBase[Event, EventUpdate, EventUpdate]): except Exception as e: print(f"{e}") + async def get_robot_task( + self, + db: AsyncSession, + robotId: Optional[str] = None + ): + try: + query_stmt = ( + select(Task).where(Task.robotId == robotId) + ) + result = await db.execute(query_stmt) + result = result.mappings().all() + # print(result) + return [Task(**t) for t in result] + except Exception as e: + print(f"{e}") async def get_messages_st( self, db: AsyncSession, diff --git a/app/schemas/event.py b/app/schemas/event.py index 14a7b2d..51d9bf8 100644 --- a/app/schemas/event.py +++ b/app/schemas/event.py @@ -1,4 +1,5 @@ from datetime import datetime +from token import OP from typing import List, Optional from pydantic import BaseModel, ConfigDict @@ -201,7 +202,17 @@ class OcrAlertMessageDto(BaseModel): number: Optional[str] = None +class GetAllMessageDto(BaseModel): + number: str + etypeName: Optional[str] = None - - +class AllMessageDto(BaseModel): + messageId : int + eventId: str + imageList : Optional[list] = None + number: Optional[str] + name: Optional[str] + etypeName: Optional[str] + handle: Optional[str] + remark: Optional[str] \ No newline at end of file diff --git a/change_log.md b/change_log.md index 86676b7..ff2ce99 100644 --- a/change_log.md +++ b/change_log.md @@ -1,6 +1,8 @@ # target - 实现机器人页告警列表接口 +- 实现获取机器人任务页接口 +- 实现获取机器人下拉框接口 # 20250606 @@ -13,3 +15,9 @@ - 修改/events/handleOcrAlert接口, 添加json参数number指定机器人. - 修改查看告警消息详情, 添加返回参数Temperature. - 添加同步机器人任务方法 +- + +# 20250609 + +- 修改/events/alertCount 接口, 添加总告警消息数量字段 +- 添加 /events/getAllAlertMessage/{number} 接口, 查看全部--获取所有输入该机器人的所有告警消息.