diff --git a/app/services/alarm_event_service.py b/app/services/alarm_event_service.py index f5674dc..0674ac1 100644 --- a/app/services/alarm_event_service.py +++ b/app/services/alarm_event_service.py @@ -415,8 +415,22 @@ class AlarmEventService: alarm.handle_remark = remark if handler: alarm.handler = handler - alarm.handled_at = beijing_now() - alarm.updated_at = beijing_now() + + now = beijing_now() + alarm.handled_at = now + alarm.updated_at = now + + # 如果没有 duration_ms 且有 event_time,计算告警时长 + if alarm.duration_ms is None and alarm.event_time: + try: + delta = now - alarm.event_time + alarm.duration_ms = int(delta.total_seconds() * 1000) + except Exception: + pass + + # 如果没有 last_frame_time,设置为当前处理时间 + if alarm.last_frame_time is None: + alarm.last_frame_time = now db.commit() db.refresh(alarm) diff --git a/app/services/device_service.py b/app/services/device_service.py index f70e7af..4a7f7b5 100644 --- a/app/services/device_service.py +++ b/app/services/device_service.py @@ -7,6 +7,7 @@ from typing import Dict, Any, List, Optional from app.models import EdgeDevice, DeviceStatus, get_session from app.utils.logger import logger +from app.utils.timezone import beijing_now class DeviceService: @@ -32,7 +33,7 @@ class DeviceService: """检查离线设备""" db = get_session() try: - threshold = datetime.now(timezone.utc) - timedelta(seconds=self.OFFLINE_TIMEOUT) + threshold = beijing_now() - timedelta(seconds=self.OFFLINE_TIMEOUT) # 查找需要标记为离线的设备 devices = db.query(EdgeDevice).filter( @@ -43,7 +44,7 @@ class DeviceService: offline_devices = [] for device in devices: device.status = DeviceStatus.OFFLINE - device.updated_at = datetime.now(timezone.utc) + device.updated_at = beijing_now() offline_devices.append(device) logger.info(f"设备离线: {device.device_id}") diff --git a/app/services/notification_service.py b/app/services/notification_service.py index c5e2ce3..f527fee 100644 --- a/app/services/notification_service.py +++ b/app/services/notification_service.py @@ -9,6 +9,7 @@ from typing import Dict, Any, List, Set from fastapi import WebSocket from app.utils.logger import logger +from app.utils.timezone import beijing_now class ConnectionManager: @@ -80,7 +81,7 @@ class NotificationService: message = { "event": "new_alert", "data": alert_data, - "timestamp": datetime.utcnow().isoformat(), + "timestamp": beijing_now().isoformat(), } await self._manager.broadcast(message) logger.debug(f"已广播新告警通知: {alert_data.get('alert_no', 'N/A')}") @@ -90,7 +91,7 @@ class NotificationService: message = { "event": "alert_updated", "data": alert_data, - "timestamp": datetime.utcnow().isoformat(), + "timestamp": beijing_now().isoformat(), } await self._manager.broadcast(message) @@ -99,7 +100,7 @@ class NotificationService: message = { "event": "device_status", "data": device_data, - "timestamp": datetime.utcnow().isoformat(), + "timestamp": beijing_now().isoformat(), } await self._manager.broadcast(message) @@ -108,7 +109,7 @@ class NotificationService: message = { "event": f"work_order_{event_type}", "data": order_data, - "timestamp": datetime.utcnow().isoformat(), + "timestamp": beijing_now().isoformat(), } await self._manager.broadcast(message) @@ -121,7 +122,7 @@ class NotificationService: message = { "event": event, "data": data, - "timestamp": datetime.utcnow().isoformat(), + "timestamp": beijing_now().isoformat(), } async def _broadcast(): diff --git a/app/services/notify_dispatch.py b/app/services/notify_dispatch.py index 53d0c8a..5c7c36f 100644 --- a/app/services/notify_dispatch.py +++ b/app/services/notify_dispatch.py @@ -22,6 +22,7 @@ from app.config import settings from app.services.vlm_service import get_vlm_service from app.services.wechat_service import get_wechat_service from app.utils.logger import logger +from app.utils.timezone import beijing_now async def process_alarm_notification(alarm_data: Dict): @@ -151,10 +152,20 @@ def _mark_false_alarm(alarm_id: str): try: alarm = db.query(AlarmEvent).filter(AlarmEvent.alarm_id == alarm_id).first() if alarm: + now = beijing_now() alarm.alarm_status = "FALSE" alarm.handle_status = "DONE" alarm.handle_remark = "VLM复核判定误报" - alarm.handled_at = datetime.now() + alarm.handled_at = now + # 计算告警时长(VLM复核时间 - 事件时间) + if alarm.duration_ms is None and alarm.event_time: + try: + delta = now - alarm.event_time + alarm.duration_ms = int(delta.total_seconds() * 1000) + except Exception: + pass + if alarm.last_frame_time is None: + alarm.last_frame_time = now db.commit() logger.info(f"告警已标记误报: {alarm_id}") except Exception as e: