重构(alarm_event_service): 状态字符串改用 AlarmStatus/HandleStatus 枚举

This commit is contained in:
2026-04-07 13:06:45 +08:00
parent 8446bab921
commit 3974820ada

View File

@@ -8,7 +8,7 @@ from typing import Optional, List, Dict, Any, Tuple
from sqlalchemy import func, cast, Date, Integer, extract, text
from app.constants import ALARM_TYPE_DEFAULT_LEVEL
from app.constants import ALARM_TYPE_DEFAULT_LEVEL, AlarmStatus, HandleStatus
from app.models import AlarmEvent, AlarmEventExt, AlarmLlmAnalysis, get_session
from app.services.oss_storage import get_oss_storage
from app.utils.logger import logger
@@ -119,8 +119,8 @@ class AlarmEventService:
last_frame_time=None,
alarm_level=alarm_level,
confidence_score=confidence,
alarm_status="NEW",
handle_status="UNHANDLED",
alarm_status=AlarmStatus.NEW,
handle_status=HandleStatus.UNHANDLED,
edge_node_id=mqtt_data.get("device_id"),
)
@@ -231,8 +231,8 @@ class AlarmEventService:
duration_ms=ext_data.get("duration_ms"),
alarm_level=alarm_level,
confidence_score=confidence,
alarm_status="NEW",
handle_status="UNHANDLED",
alarm_status=AlarmStatus.NEW,
handle_status=HandleStatus.UNHANDLED,
snapshot_url=data.get("snapshot_url"),
edge_node_id=ext_data.get("edge_node_id"),
area_id=data.get("area_id") or ext_data.get("area_id"),
@@ -309,8 +309,8 @@ class AlarmEventService:
duration_ms=duration_ms,
alarm_level=alarm_level,
confidence_score=confidence,
alarm_status="NEW",
handle_status="UNHANDLED",
alarm_status=AlarmStatus.NEW,
handle_status=HandleStatus.UNHANDLED,
snapshot_url=snapshot_url,
edge_node_id=data.get("device_id"),
)
@@ -509,12 +509,12 @@ class AlarmEventService:
# 待处理数
pending_count = db.query(AlarmEvent).filter(
AlarmEvent.handle_status == "UNHANDLED"
AlarmEvent.handle_status == HandleStatus.UNHANDLED
).count()
# 已处理数
handled_count = db.query(AlarmEvent).filter(
AlarmEvent.handle_status.in_(["DONE", "IGNORED"])
AlarmEvent.handle_status.in_([HandleStatus.DONE, HandleStatus.IGNORED])
).count()
# 平均响应时间只算近7天已处理的排除>6h的异常值
@@ -670,8 +670,8 @@ class AlarmEventService:
yesterday_count = db.query(AlarmEvent).filter(
AlarmEvent.event_time >= yesterday_start, AlarmEvent.event_time < today_start
).count()
pending_count = db.query(AlarmEvent).filter(AlarmEvent.handle_status == "UNHANDLED").count()
handled_count = db.query(AlarmEvent).filter(AlarmEvent.handle_status.in_(["DONE", "IGNORED"])).count()
pending_count = db.query(AlarmEvent).filter(AlarmEvent.handle_status == HandleStatus.UNHANDLED).count()
handled_count = db.query(AlarmEvent).filter(AlarmEvent.handle_status.in_([HandleStatus.DONE, HandleStatus.IGNORED])).count()
from sqlalchemy.sql.expression import literal_column
stats_since = today_start - timedelta(days=7)
@@ -785,7 +785,7 @@ class AlarmEventService:
unhandled_count = (
db.query(AlarmEvent)
.filter(AlarmEvent.device_id == row.device_id)
.filter(AlarmEvent.handle_status == "UNHANDLED")
.filter(AlarmEvent.handle_status == HandleStatus.UNHANDLED)
.count()
)
@@ -845,34 +845,34 @@ class AlarmEventService:
alarm.last_frame_time = beijing_now().replace(microsecond=0)
# 先到先得:已被人工处理到终态的不覆盖
terminal_statuses = ("CLOSED", "FALSE")
terminal_handle = ("DONE", "IGNORED")
terminal_statuses = (AlarmStatus.CLOSED, AlarmStatus.FALSE)
terminal_handle = (HandleStatus.DONE, HandleStatus.IGNORED)
if alarm.alarm_status in terminal_statuses or alarm.handle_status in terminal_handle:
logger.info(f"告警已为终态({alarm.alarm_status}/{alarm.handle_status}),仅更新时长: {alarm_id}")
elif resolve_type == "person_returned":
alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE"
alarm.alarm_status = AlarmStatus.CLOSED
alarm.handle_status = HandleStatus.DONE
alarm.handle_remark = "人员回岗自动关闭"
alarm.handled_at = beijing_now()
elif resolve_type == "non_work_time":
alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE"
alarm.alarm_status = AlarmStatus.CLOSED
alarm.handle_status = HandleStatus.DONE
alarm.handle_remark = "非工作时间自动关闭"
alarm.handled_at = beijing_now()
elif resolve_type == "intrusion_cleared":
alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE"
alarm.alarm_status = AlarmStatus.CLOSED
alarm.handle_status = HandleStatus.DONE
alarm.handle_remark = "入侵消失自动关闭持续无人180秒"
alarm.handled_at = beijing_now()
elif resolve_type == "vehicle_left":
alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE"
alarm.alarm_status = AlarmStatus.CLOSED
alarm.handle_status = HandleStatus.DONE
alarm.handle_remark = "车辆离开自动关闭"
alarm.handled_at = beijing_now()
elif resolve_type == "congestion_cleared":
alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE"
alarm.alarm_status = AlarmStatus.CLOSED
alarm.handle_status = HandleStatus.DONE
alarm.handle_remark = "拥堵消散自动关闭"
alarm.handled_at = beijing_now()
@@ -895,7 +895,7 @@ class AlarmEventService:
alarm = db.query(AlarmEvent).filter(AlarmEvent.alarm_id == alarm_id).first()
if not alarm:
return False
return alarm.alarm_status in ("CLOSED", "FALSE") or alarm.handle_status in ("DONE", "IGNORED")
return alarm.alarm_status in (AlarmStatus.CLOSED, AlarmStatus.FALSE) or alarm.handle_status in (HandleStatus.DONE, HandleStatus.IGNORED)
except Exception:
return False
finally: