package models import ( "database/sql/driver" "errors" "time" "git.huangwc.com/pig/pig-farm-controller/internal/infra/notify" "go.uber.org/zap/zapcore" "gorm.io/gorm" ) // NotificationStatus 定义了通知发送尝试的状态枚举。 type NotificationStatus string const ( NotificationStatusSuccess NotificationStatus = "发送成功" // 通知已成功发送 NotificationStatusFailed NotificationStatus = "发送失败" // 通知发送失败 NotificationStatusSkipped NotificationStatus = "已跳过" // 通知因某些原因被跳过(例如:用户未配置联系方式) ) // LogLevel is a custom type for zapcore.Level to handle database scanning and valuing. type LogLevel zapcore.Level // Scan implements the sql.Scanner interface. func (l *LogLevel) Scan(value interface{}) error { var s string switch v := value.(type) { case []byte: s = string(v) case string: s = v default: return errors.New("LogLevel的类型无效") } var zl zapcore.Level if err := zl.UnmarshalText([]byte(s)); err != nil { return err } *l = LogLevel(zl) return nil } // Value implements the driver.Valuer interface. func (l LogLevel) Value() (driver.Value, error) { return (zapcore.Level)(l).String(), nil } // Notification 表示已发送或尝试发送的通知记录。 type Notification struct { gorm.Model // NotifierType 通知器类型 (例如:"邮件", "企业微信", "飞书", "日志") NotifierType notify.NotifierType `gorm:"type:varchar(20);not null;index" json:"notifier_type"` // UserID 接收通知的用户ID,用于追溯通知记录到特定用户 UserID uint `gorm:"index" json:"user_id"` // 增加 UserID 字段,并添加索引 // Title 通知标题 Title string `gorm:"type:varchar(255);not null" json:"title"` // Message 通知内容 Message string `gorm:"type:text;not null" json:"message"` // Level 通知级别 (例如:INFO, WARN, ERROR) Level LogLevel `gorm:"type:varchar(10);not null" json:"level"` // AlarmTimestamp 通知内容生成时的时间戳,与 ID 构成复合主键 AlarmTimestamp time.Time `gorm:"primaryKey;not null" json:"alarm_timestamp"` // ToAddress 接收地址 (例如:邮箱地址, 企业微信ID, 日志标识符) ToAddress string `gorm:"type:varchar(255);not null" json:"to_address"` // Status 通知发送尝试的状态 (例如:"待发送", "发送成功", "发送失败", "已跳过") Status NotificationStatus `gorm:"type:varchar(20);not null;default:'待发送'" json:"status"` // ErrorMessage 如果通知发送失败,此字段存储错误信息 ErrorMessage string `gorm:"type:text" json:"error_message"` } // TableName 指定 Notification 模型的表名。 func (Notification) TableName() string { return "notifications" }