79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
|
|
"""
|
|||
|
|
企微回调路由
|
|||
|
|
|
|||
|
|
处理安保人员在企微卡片上的操作(确认处理/已处理完成/误报忽略)。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from datetime import datetime
|
|||
|
|
from fastapi import APIRouter, Depends
|
|||
|
|
from pydantic import BaseModel
|
|||
|
|
from typing import Optional
|
|||
|
|
|
|||
|
|
from app.yudao_compat import YudaoResponse
|
|||
|
|
from app.services.alarm_event_service import get_alarm_event_service, AlarmEventService
|
|||
|
|
from app.utils.logger import logger
|
|||
|
|
|
|||
|
|
router = APIRouter(prefix="/api/wechat", tags=["企微回调"])
|
|||
|
|
|
|||
|
|
|
|||
|
|
class AlarmActionRequest(BaseModel):
|
|||
|
|
"""企微卡片操作请求"""
|
|||
|
|
alarm_id: str
|
|||
|
|
action: str # confirm / complete / ignore
|
|||
|
|
operator_uid: str # 企微 userid
|
|||
|
|
remark: Optional[str] = None
|
|||
|
|
|
|||
|
|
|
|||
|
|
@router.post("/callback/alarm_action")
|
|||
|
|
async def alarm_action_callback(
|
|||
|
|
req: AlarmActionRequest,
|
|||
|
|
service: AlarmEventService = Depends(get_alarm_event_service),
|
|||
|
|
):
|
|||
|
|
"""
|
|||
|
|
企微告警操作回调(无认证,由企微服务端调用)
|
|||
|
|
|
|||
|
|
action:
|
|||
|
|
- confirm: 确认处理 → handle_status=HANDLING
|
|||
|
|
- complete: 已处理完成 → handle_status=DONE, alarm_status=CLOSED
|
|||
|
|
- ignore: 误报忽略 → alarm_status=FALSE, handle_status=DONE
|
|||
|
|
"""
|
|||
|
|
action_map = {
|
|||
|
|
"confirm": {
|
|||
|
|
"alarm_status": "CONFIRMED",
|
|||
|
|
"handle_status": "HANDLING",
|
|||
|
|
"remark": "企微确认处理",
|
|||
|
|
},
|
|||
|
|
"complete": {
|
|||
|
|
"alarm_status": "CLOSED",
|
|||
|
|
"handle_status": "DONE",
|
|||
|
|
"remark": "企微手动结单",
|
|||
|
|
},
|
|||
|
|
"ignore": {
|
|||
|
|
"alarm_status": "FALSE",
|
|||
|
|
"handle_status": "DONE",
|
|||
|
|
"remark": "企微标记误报",
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
action_cfg = action_map.get(req.action)
|
|||
|
|
if not action_cfg:
|
|||
|
|
return YudaoResponse.error(400, f"无效操作: {req.action}")
|
|||
|
|
|
|||
|
|
result = service.handle_alarm(
|
|||
|
|
alarm_id=req.alarm_id,
|
|||
|
|
alarm_status=action_cfg["alarm_status"],
|
|||
|
|
handle_status=action_cfg["handle_status"],
|
|||
|
|
handler=req.operator_uid,
|
|||
|
|
remark=req.remark or action_cfg["remark"],
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if not result:
|
|||
|
|
return YudaoResponse.error(404, "告警不存在")
|
|||
|
|
|
|||
|
|
logger.info(
|
|||
|
|
f"企微操作: alarm={req.alarm_id}, action={req.action}, "
|
|||
|
|
f"operator={req.operator_uid}"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
return YudaoResponse.success(True)
|