fix: alarm_event_service 时间统一为北京时间

- 所有 datetime.now(timezone.utc) 替换为 beijing_now()
- 保持与边缘端上报时间(北京时间)一致

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-09 16:25:31 +08:00
parent b1b96a3ebc
commit 1585abf843

View File

@@ -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}")