添加--添加前端获取告警消息详情接口

This commit is contained in:
haotian 2025-06-06 14:29:11 +08:00
parent ae79cb432a
commit bdd8d9a427
5 changed files with 108 additions and 23 deletions

View File

@ -5,8 +5,8 @@ from paddle import normal
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
from app.schemas.event import EventList, EventDetail, EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto, OcrAlertMessage, OcrAlertMessageDto, GetRobotDto
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.util.httpResponse import BaseResponse
from app.util.status import EventType
from sqlalchemy import select
@ -222,6 +222,7 @@ async def refresh_robot_list(
# response_model=BaseResponse[dict]
)
async def get_messages_unhandle(
number: Optional[str]=None,
db: AsyncSession = Depends(get_db),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=1000)
@ -230,21 +231,24 @@ async def get_messages_unhandle(
获取告警消息列表
"""
data = await get_message_by_event_type(db, "0", skip, limit)
data = await get_message_by_event_type(db, "0", skip, limit, number)
return BaseResponse(code=200, msg="success", data=data)
# 获取已处理告警消息列表
@router.get("/events/messagesHandled",
# response_model=BaseResponse[dict]
)
async def get_messages_handle(
async def get_messages_handle_robot(
number: Optional[str]=None,
db: AsyncSession = Depends(get_db),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=1000)
):
data = await get_message_by_event_type(db, "1", skip, limit)
data = await get_message_by_event_type(db, "1", skip, limit, number)
return BaseResponse(code=200, msg="success", data=data)
# 批量处理告警数据--传递messageId List
@router.post("/events/handleOcrAlerts", response_model=BaseResponse)
@ -315,13 +319,26 @@ async def get_alert_detail(
return BaseResponse(code=200, msg="success", data=alert_message[0])
# 前端查看告警详情
@router.get("/events/alertFront/{messageId}", response_model=BaseResponse[CommonAlertMessage])
async def get_alert_front_detail(
messageId:int,
db: AsyncSession = Depends(get_db),
):
# alert_message = await event.get_alert_detail(db, messageId=messageId)
alert_message = await event.get_messages_front(db, skip=0, limit=1, condition=[Message.messageId==messageId])
return BaseResponse(code=200, msg="success", data=alert_message[0])
# 获取未处理告警消息数量
@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")
processed_count = await event.get_alert_count(db, handle="1")
alert_count = await event.get_alert_count(db, handle="0", number=number)
processed_count = await event.get_alert_count(db, handle="1", number=number)
return BaseResponse(code=200, msg="success", data={
"alert_count": alert_count,
"processed_count": processed_count
@ -329,24 +346,28 @@ async def get_alert_count(
# 获取厂区及机器人实时监控
@router.get("/events/getMonitor")
async def get_monitor():
return BaseResponse(code=200, msg="success"
,data={
"A区厂区监控":{
"视角1": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8",
"视角2": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"
"视角2": "https://play.livejinan.cn/21ZoxrLa/45ee42a7b9d64400963d6bacc9a75867.m3u8?auth_key=1893340800-0-0-3522915cd5471437682295596e73cac2"
},
"B区厂区监控":{
"视角1": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8",
"视角2": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"
"视角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://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"
"视角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://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"
"视角2": "https://play.livejinan.cn/21ZoxrLa/45ee42a7b9d64400963d6bacc9a75867.m3u8?auth_key=1893340800-0-0-3522915cd5471437682295596e73cac2"
}
}
@ -377,38 +398,43 @@ async def get_message_by_event_type(
db:AsyncSession ,
handle: str ,
skip: int ,
limit: int
limit: int,
number: Optional[str]=None
):
condition_robotId = []
if number and len(number) > 0:
condition_robotId.append( Event.number== number)
# 高温报警消息
high_temperature_message = await event.get_messages(db,
skip=skip,
limit=limit,
condition=[Message.handle==handle, Message.eventType==EventType.HightTemperature.value])
condition=[Message.handle==handle, Message.eventType==EventType.HightTemperature.value] + condition_robotId)
smoke_message = await event.get_messages(db,
skip=skip,
limit=limit,
condition=[Message.handle==handle, Message.eventType==EventType.SMOKE.value])
condition=[Message.handle==handle, Message.eventType==EventType.SMOKE.value]+ condition_robotId)
long_stay_message = await event.get_messages(db,
skip=skip,
limit=limit,
condition=[Message.handle==handle, Message.eventType==EventType.LONGSTAY.value])
condition=[Message.handle==handle, Message.eventType==EventType.LONGSTAY.value]+ condition_robotId)
air_quality_message = await event.get_messages(db,
skip=skip,
limit=limit,
condition=[Message.handle==handle, Message.eventType==EventType.AIRQUALITY.value])
condition=[Message.handle==handle, Message.eventType==EventType.AIRQUALITY.value]+ condition_robotId)
stop_emergency_message = await event.get_messages(db,
skip=skip,
limit=limit,
condition=[Message.handle==handle, Message.eventType==EventType.STOPEMERGENCY.value])
condition=[Message.handle==handle, Message.eventType==EventType.STOPEMERGENCY.value]+ condition_robotId)
voice_connect_message = await event.get_messages(db,
skip=skip,
limit=limit,
condition=[Message.handle==handle, Message.eventType==EventType.VOICENOTCONNECT.value])
condition=[Message.handle==handle, Message.eventType==EventType.VOICENOTCONNECT.value]+ condition_robotId)
daily_inspect_message = await event.get_messages(db,
skip=skip,
limit=limit,
condition=[Message.handle==handle, Message.eventType==EventType.DAILYINSPECT.value])
condition=[Message.handle==handle, Message.eventType==EventType.DAILYINSPECT.value]+ condition_robotId)
return {
"high_temperature_message": high_temperature_message,

View File

@ -3,8 +3,8 @@ 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, Temperature, Message, Robot
from app.schemas.event import EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto, OcrAlertMessage, OcrAlertMessageDto, GetRobotDto
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 pydantic import VERSION as PYDANTIC_VERSION
from datetime import datetime, timedelta, timezone
@ -235,6 +235,52 @@ class CRUDEvent(CRUDBase[Event, EventUpdate, EventUpdate]):
return back
async def get_messages_front(
self,
db: AsyncSession,
skip:int,
limit:int,
condition: list = []
) -> Optional[List[CommonAlertMessage]]:
query_stmt = (
select(Message.messageId,Message.eventId ,Message.messageType, Message.eventType, Message.handle, Message.remark, Message.createTime,
Event.number,Event.name,
# Image.imageUrl, Image.localPath,
RobotInfo.flvPtz, RobotInfo.flvTherm, RobotInfo.flvThermLight)
.select_from(Message)
.outerjoin(Event, Message.eventId == Event.eventId)
# .outerjoin(Image, Message.eventId == Image.eventId)
.outerjoin(RobotInfo, RobotInfo.number == Event.number)
.where(*condition)
.order_by(Message.createTime.desc())
.offset(skip)
.limit(limit)
)
messages = await db.execute(query_stmt)
messages = messages.mappings().all()
back = list()
for message in messages:
# 获取图片URL列表
query_image_stmt = (
select(Image.imageUrl)
.where(Image.eventId == message.get("eventId"))
)
images = await db.execute(query_image_stmt)
images = images.mappings().all()
# 将RowMapping转换为字典
message_dict = dict(message)
# 将图片URL列表转换为普通列表
image_urls = [dict(img)["imageUrl"] for img in images]
message_dict["imageUrl"] = image_urls
commonAlertMessage = CommonAlertMessage(**message_dict)
back.append(commonAlertMessage)
return back
async def handle_ocr_alerts(
self,
db:AsyncSession,
@ -372,12 +418,15 @@ class CRUDEvent(CRUDBase[Event, EventUpdate, EventUpdate]):
async def get_alert_count(
self,
db: AsyncSession,
handle: str
handle: str,
number: Optional[str] = None
):
try:
query_stmt = (
select(func.count(Message.messageId))
.where(Message.handle == handle)
.select_from(Message)
.outerjoin(Event, Message.eventId == Event.eventId)
.where(and_(Message.handle == handle, (Event.number==number) if number else True))
)
result = await db.execute(query_stmt)

View File

@ -166,6 +166,7 @@ class RobotInfo(Base):
robotInfoId = Column(BigInteger, primary_key=True, autoincrement=True, comment='机器人信息ID')
robotId = Column(String(100), ForeignKey('robot.robotId', ondelete="CASCADE"), nullable=False, comment='关联机器人ID')
number = Column(String(50), comment="机器人名")
hkStstusName = Column(String(20), comment='香港状态名称')
code = Column(String(5), comment='状态码')
errorType = Column(String(5), comment='错误类型')
@ -209,6 +210,11 @@ class RobotInfo(Base):
vehicleid = Column(String(100), comment='车辆ID')
device = Column(String(100), comment='设备')
status = Column(String(5), comment='状态')
flvPtz = Column(String(500), comment="")
flvTherm = Column(String(500), comment="")
flvThermLight = Column(String(500), comment="")
createTime = Column(DateTime, default=datetime.now, nullable=False, comment='创建时间')
updateTime = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

View File

@ -169,6 +169,9 @@ class CommonAlertMessage(BaseModel):
number: Optional[str] = None
name: Optional[str] = None
imageUrl : Optional[List[str]] = None
flvPtz: Optional[str] = None
flvTherm: Optional[str] = None
flvThermLight: Optional[str] = None
# localPath: Optional[List[str]] = None
# temperature : Optional[str] = None

View File

@ -38,6 +38,7 @@ class RobotSyncService:
await self._update_robot_info(db, robot_data, group.groupingId)
await db.commit()
print(f"{datetime.now()} 同步数据库成功")
return True
except Exception as e: