package entities import ( "time" "github.com/google/uuid" "gorm.io/gorm" ) // NotificationRecord 通知记录实体 // 记录系统发送的所有通知信息,包括短信、企业微信、邮件等多种通知渠道 // 支持通知状态跟踪、重试机制、模板化消息等功能,确保通知的可靠送达 type NotificationRecord struct { // 基础标识 ID string `gorm:"primaryKey;type:varchar(36)" json:"id" comment:"通知记录唯一标识"` CertificationID *string `gorm:"type:varchar(36);index" json:"certification_id,omitempty" comment:"关联的认证申请ID(可为空)"` UserID *string `gorm:"type:varchar(36);index" json:"user_id,omitempty" comment:"接收用户ID(可为空)"` // 通知类型和渠道 - 定义通知的发送方式和业务场景 NotificationType string `gorm:"type:varchar(50);not null;index" json:"notification_type" comment:"通知类型(SMS/WECHAT_WORK/EMAIL)"` NotificationScene string `gorm:"type:varchar(50);not null;index" json:"notification_scene" comment:"通知场景(ADMIN_NEW_APPLICATION/USER_CONTRACT_READY等)"` // 接收方信息 - 通知的目标接收者 Recipient string `gorm:"type:varchar(255);not null" json:"recipient" comment:"接收方标识(手机号/邮箱/用户ID)"` // 消息内容 - 通知的具体内容信息 Title string `gorm:"type:varchar(255)" json:"title,omitempty" comment:"通知标题"` Content string `gorm:"type:text;not null" json:"content" comment:"通知内容"` TemplateID string `gorm:"type:varchar(100)" json:"template_id,omitempty" comment:"消息模板ID"` TemplateParams string `gorm:"type:text" json:"template_params,omitempty" comment:"模板参数(JSON格式)"` // 发送状态 - 记录通知的发送过程和结果 Status string `gorm:"type:varchar(50);not null;index" json:"status" comment:"发送状态(PENDING/SENT/FAILED)"` ErrorMessage string `gorm:"type:varchar(500)" json:"error_message,omitempty" comment:"发送失败的错误信息"` SentAt *time.Time `json:"sent_at,omitempty" comment:"发送成功时间"` RetryCount int `gorm:"default:0" json:"retry_count" comment:"当前重试次数"` MaxRetryCount int `gorm:"default:3" json:"max_retry_count" comment:"最大重试次数"` // 时间戳字段 CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at" comment:"创建时间"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at" comment:"更新时间"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-" comment:"软删除时间"` // 关联关系 Certification *Certification `gorm:"foreignKey:CertificationID" json:"certification,omitempty" comment:"关联的认证申请"` } // TableName 指定数据库表名 func (NotificationRecord) TableName() string { return "notification_records" } // BeforeCreate GORM钩子:创建前自动生成UUID func (n *NotificationRecord) BeforeCreate(tx *gorm.DB) error { if n.ID == "" { n.ID = uuid.New().String() } return nil } // IsPending 检查通知是否待发送 // 判断通知是否处于等待发送的状态 func (n *NotificationRecord) IsPending() bool { return n.Status == "PENDING" } // IsSent 检查通知是否已发送 // 判断通知是否已成功发送到接收方 func (n *NotificationRecord) IsSent() bool { return n.Status == "SENT" } // IsFailed 检查通知是否发送失败 // 判断通知是否发送失败,包括网络错误、接收方无效等情况 func (n *NotificationRecord) IsFailed() bool { return n.Status == "FAILED" } // CanRetry 检查是否可以重试 // 判断失败的通知是否还可以进行重试发送 func (n *NotificationRecord) CanRetry() bool { return n.IsFailed() && n.RetryCount < n.MaxRetryCount } // IncrementRetryCount 增加重试次数 // 在重试发送时增加重试计数器 func (n *NotificationRecord) IncrementRetryCount() { n.RetryCount++ } // GetStatusName 获取状态的中文名称 // 将英文状态码转换为中文显示名称,用于前端展示 func (n *NotificationRecord) GetStatusName() string { statusNames := map[string]string{ "PENDING": "待发送", "SENT": "已发送", "FAILED": "发送失败", } if name, exists := statusNames[n.Status]; exists { return name } return n.Status } // GetNotificationTypeName 获取通知类型的中文名称 // 将通知类型转换为中文显示名称,便于用户理解 func (n *NotificationRecord) GetNotificationTypeName() string { typeNames := map[string]string{ "SMS": "短信", "WECHAT_WORK": "企业微信", "EMAIL": "邮件", } if name, exists := typeNames[n.NotificationType]; exists { return name } return n.NotificationType } // GetNotificationSceneName 获取通知场景的中文名称 // 将通知场景转换为中文显示名称,便于业务人员理解通知的触发原因 func (n *NotificationRecord) GetNotificationSceneName() string { sceneNames := map[string]string{ "ADMIN_NEW_APPLICATION": "管理员新申请通知", "USER_CONTRACT_READY": "用户合同就绪通知", "USER_CERTIFICATION_COMPLETED": "用户认证完成通知", "USER_FACE_VERIFY_FAILED": "用户人脸识别失败通知", "USER_CONTRACT_REJECTED": "用户合同被拒绝通知", } if name, exists := sceneNames[n.NotificationScene]; exists { return name } return n.NotificationScene }