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