Files
pig-farm-controller/internal/infra/models/alarm.go
2025-11-07 22:19:55 +08:00

73 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package models
import (
"time"
"gorm.io/gorm"
)
// AlarmSourceType 定义了告警的来源类型
type AlarmSourceType string
const (
AlarmSourceTypeDevice AlarmSourceType = "普通设备"
AlarmSourceTypeAreaController AlarmSourceType = "区域主控"
AlarmSourceTypeSystem AlarmSourceType = "系统"
)
// ActiveAlarm 活跃告警
// 活跃告警会被更新(如忽略状态),因此保留 gorm.Model 以包含所有标准字段。
type ActiveAlarm struct {
gorm.Model
SourceType AlarmSourceType `gorm:"type:varchar(50);not null;index;comment:告警来源类型" json:"source_type"`
// SourceID 告警来源ID其具体含义取决于 SourceType 字段 (例如设备ID, 区域主控ID, 猪栏ID)。
SourceID uint `gorm:"not null;index;comment:告警来源ID" json:"source_id"`
AlarmSummary string `gorm:"comment:告警简述" json:"alarm_summary"`
Level SeverityLevel `gorm:"type:varchar(10);not null;comment:严重性等级" json:"level"`
AlarmDetails string `gorm:"comment:告警详细内容" json:"alarm_details"`
TriggerTime time.Time `gorm:"not null;comment:告警触发时间" json:"trigger_time"`
// IsIgnored 是否被手动忽略 (Snooze)
IsIgnored bool `gorm:"default:false;comment:是否被手动忽略" json:"is_ignored"`
// IgnoredUntil 忽略截止时间。在此时间之前,即使告警持续,也不会发送通知。
// 使用指针类型 *time.Time 来表示可为空的时间。
IgnoredUntil *time.Time `gorm:"comment:忽略截止时间" json:"ignored_until"`
// LastNotifiedAt 上次发送通知的时间。用于控制重复通知的频率。
LastNotifiedAt *time.Time `gorm:"comment:上次发送通知时间" json:"last_notified_at"`
}
// TableName 指定 ActiveAlarm 结构体对应的数据库表名
func (ActiveAlarm) TableName() string {
return "active_alarms"
}
// HistoricalAlarm 历史告警
// 历史告警是不可变归档数据,我们移除 gorm.Model并手动定义字段。
// ID 和 TriggerTime 共同构成联合主键,以满足 TimescaleDB 超表的要求。
type HistoricalAlarm struct {
// 手动定义主键ID 仍然自增
ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"`
SourceType AlarmSourceType `gorm:"type:varchar(50);not null;index;comment:告警来源类型" json:"source_type"`
// SourceID 告警来源ID其具体含义取决于 SourceType 字段 (例如设备ID, 区域主控ID, 猪栏ID)。
SourceID uint `gorm:"not null;index;comment:告警来源ID" json:"source_id"`
AlarmSummary string `gorm:"comment:告警简述" json:"alarm_summary"`
Level SeverityLevel `gorm:"type:varchar(10);not null;comment:严重性等级" json:"level"`
AlarmDetails string `gorm:"comment:告警详细内容" json:"alarm_details"`
TriggerTime time.Time `gorm:"primaryKey;not null;comment:告警触发时间" json:"trigger_time"`
ResolveTime time.Time `gorm:"not null;comment:告警解决时间" json:"resolve_time"`
ResolveMethod string `gorm:"comment:告警解决方式" json:"resolve_method"`
// ResolvedBy 使用指针类型 *uint 来表示可为空解决人, 当字段为空时表示系统自动解决的
ResolvedBy *uint `gorm:"comment:告警解决人" json:"resolved_by"`
}
// TableName 指定 HistoricalAlarm 结构体对应的数据库表名
func (HistoricalAlarm) TableName() string {
return "historical_alarms"
}