增加backend的erp若干功能
This commit is contained in:
@@ -28,6 +28,90 @@ type ReminderSender interface {
|
||||
Send(ctx context.Context, reminder ReminderData, title, content string) (success bool, err error)
|
||||
}
|
||||
|
||||
// resolveReceiverTarget 统一解析接收目标
|
||||
// 优先级(从高到低):
|
||||
// 1. 单条提醒指定的 ReceiverTarget(创建提醒时手动填写)
|
||||
// 2. backend 用户通知配置表(yz_backend_user_notify_config)
|
||||
// 3. 用户基础信息表(backend 查 SystemTenantUser,platform 查 AdminUser)
|
||||
//
|
||||
// channel: SMS / EMAIL / BARK
|
||||
// data.Tid > 0 表示 backend 租户用户,Tid == 0 表示 platform 管理员
|
||||
func resolveReceiverTarget(channel string, data ReminderData) string {
|
||||
// 1. 单条提醒指定的目标最高优先
|
||||
if data.ReceiverTarget != nil && *data.ReceiverTarget != "" {
|
||||
return *data.ReceiverTarget
|
||||
}
|
||||
|
||||
// 2. backend 用户查用户通知配置表
|
||||
if data.Tid > 0 {
|
||||
cfg := models.GetBackendUserNotifyConfig(uint64(data.Tid), data.ReceiverUserID)
|
||||
if cfg != nil {
|
||||
switch channel {
|
||||
case "SMS":
|
||||
if cfg.Phone != nil && *cfg.Phone != "" {
|
||||
return *cfg.Phone
|
||||
}
|
||||
case "EMAIL":
|
||||
if cfg.Email != nil && *cfg.Email != "" {
|
||||
return *cfg.Email
|
||||
}
|
||||
case "BARK":
|
||||
if cfg.BarkDeviceKey != nil && *cfg.BarkDeviceKey != "" {
|
||||
return *cfg.BarkDeviceKey
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 最后 fallback 到用户基础信息表
|
||||
if data.Tid > 0 {
|
||||
// backend 租户用户
|
||||
var user models.SystemTenantUser
|
||||
if err := models.Orm.QueryTable(new(models.SystemTenantUser)).
|
||||
Filter("id", data.ReceiverUserID).One(&user); err == nil {
|
||||
switch channel {
|
||||
case "SMS":
|
||||
if user.Phone != nil && *user.Phone != "" {
|
||||
return *user.Phone
|
||||
}
|
||||
case "EMAIL":
|
||||
if user.Email != nil && *user.Email != "" {
|
||||
return *user.Email
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// platform 管理员
|
||||
var user models.AdminUser
|
||||
if err := models.Orm.QueryTable(new(models.AdminUser)).
|
||||
Filter("id", data.ReceiverUserID).One(&user); err == nil {
|
||||
switch channel {
|
||||
case "SMS":
|
||||
if user.Phone != nil && *user.Phone != "" {
|
||||
return *user.Phone
|
||||
}
|
||||
case "EMAIL":
|
||||
if user.Email != nil && *user.Email != "" {
|
||||
return *user.Email
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// resolveBarkServerURL 解析 Bark 服务端地址
|
||||
// backend 用户优先用自己配置的 server URL,否则用平台默认配置
|
||||
func resolveBarkServerURL(data ReminderData) string {
|
||||
if data.Tid > 0 {
|
||||
cfg := models.GetBackendUserNotifyConfig(uint64(data.Tid), data.ReceiverUserID)
|
||||
if cfg != nil && cfg.BarkServerURL != nil && *cfg.BarkServerURL != "" {
|
||||
return *cfg.BarkServerURL
|
||||
}
|
||||
}
|
||||
return models.GetPlatformSettingValue("bark_server_url", "https://api.day.app")
|
||||
}
|
||||
|
||||
// SMSSender 短信发送实现
|
||||
type SMSSender struct{}
|
||||
|
||||
@@ -36,17 +120,10 @@ func (s *SMSSender) Send(ctx context.Context, reminder ReminderData, title, cont
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
phone := ""
|
||||
if reminder.ReceiverTarget != nil && *reminder.ReceiverTarget != "" {
|
||||
phone = *reminder.ReceiverTarget
|
||||
} else {
|
||||
var user models.AdminUser
|
||||
if err := models.Orm.QueryTable(new(models.AdminUser)).Filter("id", reminder.ReceiverUserID).One(&user); err == nil && user.Phone != nil {
|
||||
phone = *user.Phone
|
||||
}
|
||||
}
|
||||
|
||||
phone := resolveReceiverTarget("SMS", reminder)
|
||||
if phone == "" {
|
||||
return false, fmt.Errorf("未配置手机号")
|
||||
return false, fmt.Errorf("未配置手机号(请在通知设置中配置,或在创建提醒时指定)")
|
||||
}
|
||||
|
||||
enqueueURL := strings.TrimRight(backendURL, "/") + "/api/v1/business/outbound-tasks"
|
||||
@@ -91,17 +168,9 @@ func (s *EmailSender) Send(ctx context.Context, reminder ReminderData, title, co
|
||||
return false, fmt.Errorf("未配置系统邮箱")
|
||||
}
|
||||
|
||||
toEmail := ""
|
||||
if reminder.ReceiverTarget != nil && *reminder.ReceiverTarget != "" {
|
||||
toEmail = *reminder.ReceiverTarget
|
||||
} else {
|
||||
var user models.AdminUser
|
||||
if err := models.Orm.QueryTable(new(models.AdminUser)).Filter("id", reminder.ReceiverUserID).One(&user); err == nil && user.Email != nil {
|
||||
toEmail = *user.Email
|
||||
}
|
||||
}
|
||||
toEmail := resolveReceiverTarget("EMAIL", reminder)
|
||||
if toEmail == "" {
|
||||
return false, fmt.Errorf("未配置收件邮箱")
|
||||
return false, fmt.Errorf("未配置收件邮箱(请在通知设置中配置,或在创建提醒时指定)")
|
||||
}
|
||||
|
||||
sysDomain := models.GetPlatformSettingValue("system_domain", "https://api.yunzer.cn")
|
||||
@@ -156,17 +225,12 @@ func (s *EmailSender) Send(ctx context.Context, reminder ReminderData, title, co
|
||||
type BarkSender struct{}
|
||||
|
||||
func (s *BarkSender) Send(ctx context.Context, reminder ReminderData, title, content string) (bool, error) {
|
||||
deviceKey := ""
|
||||
if reminder.ReceiverTarget != nil && *reminder.ReceiverTarget != "" {
|
||||
deviceKey = *reminder.ReceiverTarget
|
||||
} else {
|
||||
deviceKey = models.GetPlatformSettingValue("bark_device_key", "")
|
||||
}
|
||||
deviceKey := resolveReceiverTarget("BARK", reminder)
|
||||
if deviceKey == "" {
|
||||
return false, fmt.Errorf("Bark 设备 Key 未配置")
|
||||
return false, fmt.Errorf("Bark 设备 Key 未配置(请在通知设置中配置,或在创建提醒时指定)")
|
||||
}
|
||||
|
||||
serverURL := models.GetPlatformSettingValue("bark_server_url", "https://api.day.app")
|
||||
serverURL := resolveBarkServerURL(reminder)
|
||||
sysDomain := models.GetPlatformSettingValue("system_domain", "https://api.yunzer.cn")
|
||||
ackToken := ""
|
||||
if reminder.AckToken != nil {
|
||||
|
||||
Reference in New Issue
Block a user