temp
This commit is contained in:
127
internal/domains/certification/entities/notification_record.go
Normal file
127
internal/domains/certification/entities/notification_record.go
Normal file
@@ -0,0 +1,127 @@
|
||||
package entities
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"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"
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
Reference in New Issue
Block a user