Files
iot-device-management-service/app/routers/wechat_callback.py

79 lines
2.3 KiB
Python
Raw Normal View History

"""
企微回调路由
处理安保人员在企微卡片上的操作确认处理/已处理完成/误报忽略
"""
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)