225 lines
7.3 KiB
Python
225 lines
7.3 KiB
Python
from typing import List, Optional
|
|
from fastapi import APIRouter, Depends, HTTPException, Query, Body
|
|
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
|
|
from app.schemas.event import EventList, EventDetail, EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto, OcrAlertMessage, OcrAlertMessageDto
|
|
from app.util.httpResponse import BaseResponse
|
|
|
|
# import datetime
|
|
|
|
router = APIRouter()
|
|
|
|
# @router.get("/events", response_model=List[EventList])
|
|
# async def get_events(
|
|
# db: AsyncSession = Depends(get_db),
|
|
# start_time: Optional[str] = None,
|
|
# end_time: Optional[str] = None,
|
|
# etypeName: Optional[str] = None,
|
|
# area: Optional[str] = None,
|
|
# skip: int = Query(0, ge=0),
|
|
# limit: int = Query(100, ge=1, le=1000)
|
|
# ):
|
|
# """
|
|
# 获取事件列表
|
|
# - 支持时间范围查询
|
|
# - 支持事件类型和区域筛选
|
|
# - 支持分页
|
|
# """
|
|
# query = EventQuery(
|
|
# start_time=start_time,
|
|
# end_time=end_time,
|
|
# etypeName=etypeName,
|
|
# area=area,
|
|
# skip=skip,
|
|
# limit=limit
|
|
# )
|
|
# events = await event.get_multi_with_query(db, query=query)
|
|
# return [EventList.model_validate(event) for event in events]
|
|
|
|
# 后台获取事件列表
|
|
# @router.post("/backstageEventlist", response_model=List[BackStageEvent])
|
|
@router.post("/backstageEventlist", response_model=BaseResponse[List[BackStageEvent]])
|
|
async def get_events_backstage(
|
|
db: AsyncSession = Depends(get_db),
|
|
query: BackStageEventDto = Body(...)
|
|
|
|
):
|
|
|
|
events = await event.get_multi_backstage_events(db, query=query)
|
|
return BaseResponse(code=200, msg="success", data=events)
|
|
|
|
# 后台获取事件详情
|
|
@router.get("/backstageEventDetail/{eventId}", response_model=BaseResponse[BackStageEventDetail])
|
|
async def get_event_detail(
|
|
eventId: str,
|
|
db: AsyncSession = Depends(get_db)
|
|
):
|
|
back = await event.get_event_detail(db=db, eventId=eventId)
|
|
return BaseResponse(code = 200, msg="success", data=back)
|
|
|
|
|
|
|
|
# @router.get("/events/{event_id}", response_model=EventDetail)
|
|
# async def get_event(
|
|
# event_id: str,
|
|
# db: AsyncSession = Depends(get_db)
|
|
# ):
|
|
# """
|
|
# 获取事件详情
|
|
# """
|
|
# event_obj = await event.get_by_id(db, event_id=event_id)
|
|
# if not event_obj:
|
|
# raise HTTPException(status_code=404, detail="事件不存在")
|
|
# return EventDetail.model_validate(event_obj)
|
|
|
|
@router.put("/events/{event_id}", response_model=BaseResponse)
|
|
async def update_event(
|
|
event_id: str,
|
|
event_in: EditTemperatureDto,
|
|
db: AsyncSession = Depends(get_db)
|
|
):
|
|
"""
|
|
更新事件信息
|
|
"""
|
|
event_obj = await event.update_event(
|
|
db,
|
|
event_id=event_id,
|
|
obj_in=event_in
|
|
)
|
|
if not event_obj:
|
|
raise BaseResponse(code=404, msg="事件不存在")
|
|
return BaseResponse(code=200, msg="success")
|
|
|
|
@router.delete("/events/{event_id}", response_model=BaseResponse[EventDetail])
|
|
async def delete_event(
|
|
event_id: str,
|
|
db: AsyncSession = Depends(get_db)
|
|
):
|
|
"""
|
|
删除事件
|
|
"""
|
|
event_obj = await event.delete_event(db, event_id=event_id)
|
|
if not event_obj:
|
|
return BaseResponse(code=404,msg="事件不存在")
|
|
return BaseResponse(code=200, msg="success", data=EventDetail.model_validate(event_obj))
|
|
|
|
# 获取未处理告警消息列表
|
|
@router.get("/events/messagesUnhandled", response_model=BaseResponse[List[OcrAlertMessage]])
|
|
async def get_messages_unhandle(
|
|
db: AsyncSession = Depends(get_db),
|
|
skip: int = Query(0, ge=0),
|
|
limit: int = Query(100, ge=1, le=1000)
|
|
):
|
|
"""_summary_
|
|
获取告警消息列表
|
|
"""
|
|
message = await event.get_messages(db, skip=skip, limit=limit, condition=[Message.handle=="0"])
|
|
return BaseResponse(code=200, msg="success", data=message)
|
|
|
|
# 获取已处理告警消息列表
|
|
@router.get("/events/messagesHandled", response_model=BaseResponse[List[OcrAlertMessage]])
|
|
async def get_messages_handle(
|
|
db: AsyncSession = Depends(get_db),
|
|
skip: int = Query(0, ge=0),
|
|
limit: int = Query(100, ge=1, le=1000)
|
|
):
|
|
message = await event.get_messages(db, skip=skip, limit=limit, condition=[Message.handle=="1"])
|
|
return BaseResponse(code=200, msg="success", data=message)
|
|
|
|
# 批量处理告警数据--传递messageId List
|
|
@router.post("/events/handleOcrAlerts", response_model=BaseResponse)
|
|
async def handle_ocr_alerts(
|
|
db: AsyncSession = Depends(get_db),
|
|
messageIdList: List[int] = Body(...)
|
|
):
|
|
"""_summary_
|
|
一建处理告警
|
|
"""
|
|
|
|
flag = await event.handle_ocr_alerts(db, messageIdList=messageIdList)
|
|
if flag:
|
|
return BaseResponse(code=200, msg="success")
|
|
return BaseResponse(code=500, msg="fail to update data")
|
|
|
|
# 批量处理告警数据--直接将 handle=0的置为1
|
|
@router.get("/events/handleOcrAlerts", response_model=BaseResponse)
|
|
async def handle_ocr_alerts_get(
|
|
db: AsyncSession = Depends(get_db)
|
|
):
|
|
"""_summary_
|
|
一键处理告警
|
|
Args:
|
|
db (AsyncSession, optional): _description_. Defaults to Depends(get_db).
|
|
|
|
Returns:
|
|
_type_: _description_
|
|
"""
|
|
flag = await event.handle_ocr_alerts_get(db)
|
|
if flag:
|
|
return BaseResponse(code=200, msg="success")
|
|
return BaseResponse(code=500, msg="fail to update data")
|
|
|
|
# 处理单个告警数据
|
|
@router.post("/events/handleOcrAlert", response_model=BaseResponse)
|
|
async def handle_ocr_alert(
|
|
db: AsyncSession = Depends(get_db),
|
|
ocrAlertMessageDto: OcrAlertMessageDto = Body(...)
|
|
):
|
|
"""
|
|
处理单个警告
|
|
"""
|
|
flag = await event.handle_ocr_alert(db, ocrAlertMessageDto=ocrAlertMessageDto)
|
|
if flag:
|
|
return BaseResponse(code=200, msg="success")
|
|
return BaseResponse(code=500, msg="fail to update data")
|
|
|
|
|
|
# 查看告警详情
|
|
@router.get("/events/alert/{messageId}", response_model=BaseResponse[OcrAlertMessage])
|
|
async def get_alert_detail(
|
|
messageId:int,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
|
|
alert_message = await event.get_alert_detail(db, messageId=messageId)
|
|
|
|
return BaseResponse(code=200, msg="success", data=alert_message)
|
|
|
|
# 获取未处理告警消息数量
|
|
@router.get("/events/alertCount", response_model=BaseResponse)
|
|
async def get_alert_count(
|
|
db: AsyncSession = Depends(get_db)
|
|
):
|
|
alert_count = await event.get_alert_count(db)
|
|
return BaseResponse(code=200, msg="success", data=alert_count)
|
|
|
|
|
|
@router.get("/events/robotST", response_model=BaseResponse[dict])
|
|
async def get_robot_st(
|
|
db: AsyncSession = Depends(get_db)
|
|
):
|
|
# 机器人总数
|
|
t_count = await event.get_robot_count(db, status=[])
|
|
# 在线总数
|
|
online_count = await event.get_robot_count(db, status=[Robot.onlineStatus=="1", Robot.status=="0"])
|
|
# 离线总数
|
|
offline_count = await event.get_robot_count(db, status=[Robot.onlineStatus=="2", Robot.status=="0"])
|
|
# 故障总数
|
|
disable_count = await event.get_robot_count(db, status=[Robot.status=="1"])
|
|
|
|
return BaseResponse(code=200, msg="success",
|
|
data = {
|
|
"t_count": t_count,
|
|
"online_count": online_count,
|
|
"offline_count": offline_count,
|
|
"disable_count": disable_count
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|