From 1585abf843b0c8ae2ec09fff5977bfcd3f0f0d26 Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Mon, 9 Mar 2026 16:25:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20alarm=5Fevent=5Fservice=20=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=BB=9F=E4=B8=80=E4=B8=BA=E5=8C=97=E4=BA=AC=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 所有 datetime.now(timezone.utc) 替换为 beijing_now() - 保持与边缘端上报时间(北京时间)一致 Co-Authored-By: Claude Opus 4.6 --- app/services/alarm_event_service.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/app/services/alarm_event_service.py b/app/services/alarm_event_service.py index 2d32710..f5674dc 100644 --- a/app/services/alarm_event_service.py +++ b/app/services/alarm_event_service.py @@ -11,11 +11,12 @@ from sqlalchemy import func from app.models import AlarmEvent, AlarmEventExt, AlarmLlmAnalysis, get_session from app.services.oss_storage import get_oss_storage from app.utils.logger import logger +from app.utils.timezone import beijing_now def generate_alarm_id() -> str: """生成告警ID: ALM + YYYYMMDDHHmmss + 8位uuid""" - timestamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S") + timestamp = beijing_now().strftime("%Y%m%d%H%M%S") unique_id = uuid.uuid4().hex[:8].upper() return f"ALM{timestamp}{unique_id}" @@ -64,9 +65,9 @@ class AlarmEventService: try: event_time = datetime.fromisoformat(timestamp_str.replace("Z", "+00:00")) except ValueError: - event_time = datetime.now(timezone.utc) + event_time = beijing_now() else: - event_time = datetime.now(timezone.utc) + event_time = beijing_now() # 解析 first_frame_time(告警首次触发时间) first_frame_str = mqtt_data.get("first_frame_time") @@ -169,9 +170,9 @@ class AlarmEventService: try: event_time = datetime.fromisoformat(event_time_str.replace("Z", "+00:00")) except ValueError: - event_time = datetime.now(timezone.utc) + event_time = beijing_now() else: - event_time = datetime.now(timezone.utc) + event_time = beijing_now() # 置信度 confidence = data.get("confidence_score") @@ -251,11 +252,11 @@ class AlarmEventService: try: event_time = datetime.fromisoformat(trigger_time.replace("Z", "+00:00")) except ValueError: - event_time = datetime.now(timezone.utc) + event_time = beijing_now() elif isinstance(trigger_time, datetime): event_time = trigger_time else: - event_time = datetime.now(timezone.utc) + event_time = beijing_now() confidence = data.get("confidence") if confidence is not None: @@ -414,8 +415,8 @@ class AlarmEventService: alarm.handle_remark = remark if handler: alarm.handler = handler - alarm.handled_at = datetime.now(timezone.utc) - alarm.updated_at = datetime.now(timezone.utc) + alarm.handled_at = beijing_now() + alarm.updated_at = beijing_now() db.commit() db.refresh(alarm) @@ -557,26 +558,26 @@ class AlarmEventService: parsed_time = datetime.fromisoformat(last_frame_time.replace("Z", "+00:00")) alarm.last_frame_time = parsed_time.replace(microsecond=0) except Exception: - alarm.last_frame_time = datetime.now(timezone.utc).replace(microsecond=0) + alarm.last_frame_time = beijing_now().replace(microsecond=0) # 如果是人员回岗,标记为自动关闭 if resolve_type == "person_returned": alarm.alarm_status = "CLOSED" alarm.handle_status = "DONE" alarm.handle_remark = "人员回岗自动关闭" - alarm.handled_at = datetime.now(timezone.utc) + alarm.handled_at = beijing_now() elif resolve_type == "non_work_time": alarm.alarm_status = "CLOSED" alarm.handle_status = "DONE" alarm.handle_remark = "非工作时间自动关闭" - alarm.handled_at = datetime.now(timezone.utc) + alarm.handled_at = beijing_now() elif resolve_type == "intrusion_cleared": alarm.alarm_status = "CLOSED" alarm.handle_status = "DONE" alarm.handle_remark = "入侵消失自动关闭(持续无人180秒)" - alarm.handled_at = datetime.now(timezone.utc) + alarm.handled_at = beijing_now() - alarm.updated_at = datetime.now(timezone.utc) + alarm.updated_at = beijing_now() db.commit() logger.info(f"告警已更新结束信息: {alarm_id}, duration={duration_ms}ms, type={resolve_type}")