Files

49 lines
2.3 KiB
Python
Raw Permalink Normal View History

from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime, ForeignKey, Text, JSON
from sqlalchemy.sql import func
from app.core.database import Base
class AlarmRule(Base):
__tablename__ = "alarm_rules"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(200), nullable=False)
device_id = Column(Integer, ForeignKey("devices.id"))
device_type = Column(String(50)) # 按设备类型的通用规则
data_type = Column(String(50), nullable=False) # 监控的数据类型
condition = Column(String(20), nullable=False) # gt, lt, eq, neq, range_out, rate_of_change
threshold = Column(Float)
threshold_high = Column(Float) # 范围上限
threshold_low = Column(Float) # 范围下限
duration = Column(Integer, default=0) # 持续时间(秒)
severity = Column(String(20), default="warning") # critical, major, warning
notify_channels = Column(JSON) # ["sms", "email", "app", "wechat"]
notify_targets = Column(JSON) # 通知对象
auto_action = Column(JSON) # 联动动作
silence_start = Column(String(10)) # 静默开始时间 HH:MM
silence_end = Column(String(10)) # 静默结束时间
is_active = Column(Boolean, default=True)
created_by = Column(Integer, ForeignKey("users.id"))
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
class AlarmEvent(Base):
__tablename__ = "alarm_events"
id = Column(Integer, primary_key=True, autoincrement=True)
rule_id = Column(Integer, ForeignKey("alarm_rules.id"))
device_id = Column(Integer, ForeignKey("devices.id"), nullable=False)
severity = Column(String(20), nullable=False)
title = Column(String(200), nullable=False)
description = Column(Text)
value = Column(Float) # 触发时的数值
threshold = Column(Float) # 阈值
status = Column(String(20), default="active") # active, acknowledged, resolved
acknowledged_by = Column(Integer, ForeignKey("users.id"))
acknowledged_at = Column(DateTime(timezone=True))
resolved_at = Column(DateTime(timezone=True))
resolve_note = Column(Text)
triggered_at = Column(DateTime(timezone=True), server_default=func.now())
created_at = Column(DateTime(timezone=True), server_default=func.now())