增加backend的erp若干功能

This commit is contained in:
2026-09-03 14:25:53 +08:00
parent f644c278c9
commit 44a03186da
40 changed files with 8166 additions and 286 deletions
+92 -28
View File
@@ -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 {