添加--添加前端获取告警消息详情接口
This commit is contained in:
parent
ae79cb432a
commit
bdd8d9a427
@ -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,
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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='更新时间')
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user