2025-10-25 13:28:19 +08:00
|
|
|
|
package models
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2025-10-25 15:41:49 +08:00
|
|
|
|
"database/sql/driver"
|
|
|
|
|
|
"errors"
|
2025-10-25 13:28:19 +08:00
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/notify"
|
|
|
|
|
|
"go.uber.org/zap/zapcore"
|
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-25 14:15:17 +08:00
|
|
|
|
// NotificationStatus 定义了通知发送尝试的状态枚举。
|
|
|
|
|
|
type NotificationStatus string
|
|
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
|
NotificationStatusSuccess NotificationStatus = "发送成功" // 通知已成功发送
|
|
|
|
|
|
NotificationStatusFailed NotificationStatus = "发送失败" // 通知发送失败
|
|
|
|
|
|
NotificationStatusSkipped NotificationStatus = "已跳过" // 通知因某些原因被跳过(例如:用户未配置联系方式)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-25 15:41:49 +08:00
|
|
|
|
// 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
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-25 13:28:19 +08:00
|
|
|
|
// 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)
|
2025-10-25 15:41:49 +08:00
|
|
|
|
Level LogLevel `gorm:"type:varchar(10);not null" json:"level"`
|
2025-10-25 13:28:19 +08:00
|
|
|
|
// 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"`
|
2025-10-25 14:15:17 +08:00
|
|
|
|
// Status 通知发送尝试的状态 (例如:"待发送", "发送成功", "发送失败", "已跳过")
|
|
|
|
|
|
Status NotificationStatus `gorm:"type:varchar(20);not null;default:'待发送'" json:"status"`
|
2025-10-25 13:28:19 +08:00
|
|
|
|
// ErrorMessage 如果通知发送失败,此字段存储错误信息
|
|
|
|
|
|
ErrorMessage string `gorm:"type:text" json:"error_message"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TableName 指定 Notification 模型的表名。
|
|
|
|
|
|
func (Notification) TableName() string {
|
|
|
|
|
|
return "notifications"
|
|
|
|
|
|
}
|