using Admin.NET.Core.Service;
namespace Admin.NET.Plugin.ApprovalFlow.Service;
///
/// 短信推送(P4-16)
/// 由于 Admin.NET 内置的 SysSmsService.SendSms 依赖运营商预注册模板(阿里云/腾讯云/自定义),
/// 动态内容不可塞入;本渠道作用限于通知触达(类似"您有新审批待办,请登录系统处理"),
/// 依赖 NotifyChannelConfig.SmsTemplateId 对应的模板在运营商侧已发布。
/// 未配置 SmsTemplateId / 用户无手机号时静默跳过。
///
public class SmsNotifyPusher : INotifyPusher, ITransient
{
public string Channel => "Sms";
private readonly SysSmsService _smsService;
private readonly SqlSugarRepository _userRep;
public SmsNotifyPusher(SysSmsService smsService, SqlSugarRepository userRep)
{
_smsService = smsService;
_userRep = userRep;
}
public bool IsEnabled(NotifyChannelConfig cfg) => cfg?.Sms == true && !string.IsNullOrWhiteSpace(cfg.SmsTemplateId);
public async Task PushAsync(List userIds, FlowNotification notification)
{
if (userIds.Count == 0) return FlowNotifyPushResult.Ok(0);
var cfg = App.GetConfig("ApprovalFlow:Notify");
var tplId = cfg?.SmsTemplateId;
if (string.IsNullOrWhiteSpace(tplId)) return FlowNotifyPushResult.Ok(0);
var users = await _userRep.AsQueryable()
.Where(u => userIds.Contains(u.Id) && !string.IsNullOrEmpty(u.Phone))
.Select(u => new { u.Id, u.Phone })
.ToListAsync();
if (users.Count == 0) return FlowNotifyPushResult.Ok(0);
var errors = new List();
var successCount = 0;
foreach (var user in users)
{
try
{
await _smsService.SendSms(user.Phone, tplId);
successCount++;
}
catch (Exception ex)
{
errors.Add($"[{user.Id}]{ex.Message}");
}
}
if (successCount > 0 && errors.Count == 0)
return FlowNotifyPushResult.Ok(successCount);
if (successCount > 0)
return new FlowNotifyPushResult
{
Success = true,
ActualTargetCount = successCount,
ErrorMessage = $"部分失败: {string.Join("; ", errors)}"
};
return FlowNotifyPushResult.Fail(string.Join("; ", errors));
}
}