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:
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user