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.models import AlarmEvent, AlarmEventExt, AlarmLlmAnalysis, get_session
from app.services.oss_storage import get_oss_storage from app.services.oss_storage import get_oss_storage
from app.utils.logger import logger from app.utils.logger import logger
from app.utils.timezone import beijing_now
def generate_alarm_id() -> str: def generate_alarm_id() -> str:
"""生成告警ID: ALM + YYYYMMDDHHmmss + 8位uuid""" """生成告警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() unique_id = uuid.uuid4().hex[:8].upper()
return f"ALM{timestamp}{unique_id}" return f"ALM{timestamp}{unique_id}"
@@ -64,9 +65,9 @@ class AlarmEventService:
try: try:
event_time = datetime.fromisoformat(timestamp_str.replace("Z", "+00:00")) event_time = datetime.fromisoformat(timestamp_str.replace("Z", "+00:00"))
except ValueError: except ValueError:
event_time = datetime.now(timezone.utc) event_time = beijing_now()
else: else:
event_time = datetime.now(timezone.utc) event_time = beijing_now()
# 解析 first_frame_time告警首次触发时间 # 解析 first_frame_time告警首次触发时间
first_frame_str = mqtt_data.get("first_frame_time") first_frame_str = mqtt_data.get("first_frame_time")
@@ -169,9 +170,9 @@ class AlarmEventService:
try: try:
event_time = datetime.fromisoformat(event_time_str.replace("Z", "+00:00")) event_time = datetime.fromisoformat(event_time_str.replace("Z", "+00:00"))
except ValueError: except ValueError:
event_time = datetime.now(timezone.utc) event_time = beijing_now()
else: else:
event_time = datetime.now(timezone.utc) event_time = beijing_now()
# 置信度 # 置信度
confidence = data.get("confidence_score") confidence = data.get("confidence_score")
@@ -251,11 +252,11 @@ class AlarmEventService:
try: try:
event_time = datetime.fromisoformat(trigger_time.replace("Z", "+00:00")) event_time = datetime.fromisoformat(trigger_time.replace("Z", "+00:00"))
except ValueError: except ValueError:
event_time = datetime.now(timezone.utc) event_time = beijing_now()
elif isinstance(trigger_time, datetime): elif isinstance(trigger_time, datetime):
event_time = trigger_time event_time = trigger_time
else: else:
event_time = datetime.now(timezone.utc) event_time = beijing_now()
confidence = data.get("confidence") confidence = data.get("confidence")
if confidence is not None: if confidence is not None:
@@ -414,8 +415,8 @@ class AlarmEventService:
alarm.handle_remark = remark alarm.handle_remark = remark
if handler: if handler:
alarm.handler = handler alarm.handler = handler
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() db.commit()
db.refresh(alarm) db.refresh(alarm)
@@ -557,26 +558,26 @@ class AlarmEventService:
parsed_time = datetime.fromisoformat(last_frame_time.replace("Z", "+00:00")) parsed_time = datetime.fromisoformat(last_frame_time.replace("Z", "+00:00"))
alarm.last_frame_time = parsed_time.replace(microsecond=0) alarm.last_frame_time = parsed_time.replace(microsecond=0)
except Exception: 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": if resolve_type == "person_returned":
alarm.alarm_status = "CLOSED" alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE" alarm.handle_status = "DONE"
alarm.handle_remark = "人员回岗自动关闭" alarm.handle_remark = "人员回岗自动关闭"
alarm.handled_at = datetime.now(timezone.utc) alarm.handled_at = beijing_now()
elif resolve_type == "non_work_time": elif resolve_type == "non_work_time":
alarm.alarm_status = "CLOSED" alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE" alarm.handle_status = "DONE"
alarm.handle_remark = "非工作时间自动关闭" alarm.handle_remark = "非工作时间自动关闭"
alarm.handled_at = datetime.now(timezone.utc) alarm.handled_at = beijing_now()
elif resolve_type == "intrusion_cleared": elif resolve_type == "intrusion_cleared":
alarm.alarm_status = "CLOSED" alarm.alarm_status = "CLOSED"
alarm.handle_status = "DONE" alarm.handle_status = "DONE"
alarm.handle_remark = "入侵消失自动关闭持续无人180秒" 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() db.commit()
logger.info(f"告警已更新结束信息: {alarm_id}, duration={duration_ms}ms, type={resolve_type}") logger.info(f"告警已更新结束信息: {alarm_id}, duration={duration_ms}ms, type={resolve_type}")