|
|
|
@ -1,6 +1,8 @@ |
|
|
|
using Cronos; |
|
|
|
using Microsoft.Extensions.Configuration; |
|
|
|
using Microsoft.Extensions.Logging; |
|
|
|
using Shentun.Sms.Enums; |
|
|
|
using Shentun.Sms.Service.Sms; |
|
|
|
using Shentun.Sms.SmsApps; |
|
|
|
using Shentun.Sms.SmsSends; |
|
|
|
using Shentun.Sms.SmsTasks; |
|
|
|
@ -9,8 +11,10 @@ using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using TencentCloud.Ic.V20190307.Models; |
|
|
|
using Volo.Abp; |
|
|
|
using Volo.Abp.Application.Services; |
|
|
|
using Volo.Abp.Caching; |
|
|
|
using Volo.Abp.Domain.Repositories; |
|
|
|
using Volo.Abp.Identity; |
|
|
|
|
|
|
|
@ -21,53 +25,72 @@ namespace Shentun.Sms.Jobs |
|
|
|
/// </summary>
|
|
|
|
public class SmsTaskJob : ApplicationService, ISmsTaskJob |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
private readonly IRepository<SmsTask, Guid> _smsTaskRepository; |
|
|
|
private readonly IRepository<SmsSend, Guid> _smsSendRepository; |
|
|
|
|
|
|
|
private readonly SmsSendManager _smsSendManager; |
|
|
|
private readonly IConfiguration _configuration; |
|
|
|
|
|
|
|
private readonly ILogger<SmsTaskJob> _logger; |
|
|
|
|
|
|
|
private readonly SmsFactory _smsFactory; |
|
|
|
public SmsTaskJob( |
|
|
|
IRepository<SmsTask, Guid> smsTaskRepository, |
|
|
|
SmsSendManager smsSendManager, |
|
|
|
IConfiguration configuration, |
|
|
|
IRepository<SmsSend, Guid> smsSendRepository |
|
|
|
) |
|
|
|
IRepository<SmsSend, Guid> smsSendRepository, |
|
|
|
SmsFactory smsFactory, |
|
|
|
ILogger<SmsTaskJob> logger) |
|
|
|
{ |
|
|
|
_smsTaskRepository = smsTaskRepository; |
|
|
|
_smsSendManager = smsSendManager; |
|
|
|
_configuration = configuration; |
|
|
|
_smsSendRepository = smsSendRepository; |
|
|
|
_smsFactory = smsFactory; |
|
|
|
_logger = logger; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[RemoteService(false)] |
|
|
|
//[RemoteService(false)]
|
|
|
|
public async Task DoWork() |
|
|
|
{ |
|
|
|
var smsTaskList = (from a in await _smsTaskRepository.GetQueryableAsync() |
|
|
|
join b in await _smsSendRepository.GetQueryableAsync() on a.Id equals b.SmsTaskId into bb |
|
|
|
from ab in bb.DefaultIfEmpty() |
|
|
|
where a.IsActive == 'Y' && ab == null |
|
|
|
select a).ToList(); |
|
|
|
try |
|
|
|
{ |
|
|
|
_logger.LogInformation("测试"); |
|
|
|
var smsTaskList = (from a in await _smsTaskRepository.GetQueryableAsync() |
|
|
|
join b in await _smsSendRepository.GetQueryableAsync() on a.Id equals b.SmsTaskId into bb |
|
|
|
from ab in bb.DefaultIfEmpty() |
|
|
|
where a.IsActive == 'Y' && ab == null |
|
|
|
select a).ToList(); |
|
|
|
|
|
|
|
List<SmsSend> smsSendList = new List<SmsSend>(); |
|
|
|
List<SmsSend> smsSendList = new List<SmsSend>(); |
|
|
|
|
|
|
|
foreach (var smsTask in smsTaskList) |
|
|
|
{ |
|
|
|
CreateSmsSendAsync(smsTask, smsSendList); |
|
|
|
} |
|
|
|
foreach (var smsTask in smsTaskList) |
|
|
|
{ |
|
|
|
CreateSmsSendAsync(smsTask, smsSendList); |
|
|
|
} |
|
|
|
|
|
|
|
if (smsSendList.Any()) |
|
|
|
{ |
|
|
|
await _smsSendRepository.InsertManyAsync(smsSendList); |
|
|
|
} |
|
|
|
if (smsSendList.Any()) |
|
|
|
{ |
|
|
|
await _smsSendRepository.InsertManyAsync(smsSendList); |
|
|
|
} |
|
|
|
|
|
|
|
if (smsTaskList.Any()) |
|
|
|
if (smsTaskList.Any()) |
|
|
|
{ |
|
|
|
await _smsTaskRepository.UpdateManyAsync(smsTaskList); |
|
|
|
} |
|
|
|
|
|
|
|
_logger.LogInformation($"------扫描处理了【{smsTaskList.Count}】条SmsTask记录,生成了【{smsSendList.Count}】条短信记录------当前时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
await _smsTaskRepository.UpdateManyAsync(smsTaskList); |
|
|
|
_logger.LogInformation(ex.ToString()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -80,17 +103,13 @@ namespace Shentun.Sms.Jobs |
|
|
|
public void CreateSmsSendAsync(SmsTask smsTask, List<SmsSend> smsSendList) |
|
|
|
{ |
|
|
|
string SmsInterfaceId = _configuration.GetValue<string>("Sms:SmsInterfaceId"); |
|
|
|
if (string.IsNullOrEmpty(SmsInterfaceId)) |
|
|
|
{ |
|
|
|
SmsInterfaceId = "001"; |
|
|
|
} |
|
|
|
if (smsTask.TaskCycleType == TaskCycleTypeFlag.TimelySend) |
|
|
|
{ |
|
|
|
var smsSendEntity = new SmsSend(GuidGenerator.Create()) |
|
|
|
{ |
|
|
|
Content = smsTask.Content, |
|
|
|
IsActive = 'Y', |
|
|
|
IsComplete = 'N', |
|
|
|
IsActive = 'N', |
|
|
|
IsComplete = 'Y', |
|
|
|
SmsInterfaceId = SmsInterfaceId, |
|
|
|
SmsTaskId = smsTask.Id, |
|
|
|
PlanSendTime = DateTime.Now |
|
|
|
@ -98,6 +117,17 @@ namespace Shentun.Sms.Jobs |
|
|
|
|
|
|
|
_smsSendManager.CreateAsync(smsSendEntity); |
|
|
|
|
|
|
|
//发送短信
|
|
|
|
// SmsFactory smsFactory = new SmsFactory(_configuration);
|
|
|
|
|
|
|
|
SmsBase smsBase = _smsFactory.CreateSms(); |
|
|
|
|
|
|
|
string[] phoneNumber = { $"+{smsTask.CountryCode}{smsTask.MobileTelephone}" }; |
|
|
|
string[] templateParam = smsTask.Content.Trim('|').Split("|", StringSplitOptions.RemoveEmptyEntries); |
|
|
|
|
|
|
|
|
|
|
|
smsBase.Send(phoneNumber, templateParam); |
|
|
|
|
|
|
|
smsSendList.Add(smsSendEntity); |
|
|
|
|
|
|
|
} |
|
|
|
@ -109,24 +139,40 @@ namespace Shentun.Sms.Jobs |
|
|
|
#region 解析Cron表达式
|
|
|
|
|
|
|
|
|
|
|
|
var schedule = CronExpression.Parse(taskCorn, CronFormat.IncludeSeconds); |
|
|
|
var occurrences = schedule.GetOccurrences(DateTime.UtcNow, smsTask.StopTime.Value.ToUniversalTime()); //获取截止时间前所有的计划时间
|
|
|
|
foreach (var occurrence in occurrences) |
|
|
|
try |
|
|
|
{ |
|
|
|
var smsSendEntity = new SmsSend(GuidGenerator.Create()) |
|
|
|
var schedule = CronExpression.Parse(taskCorn, CronFormat.IncludeSeconds); |
|
|
|
var occurrences = schedule.GetOccurrences(DateTime.UtcNow, smsTask.StopTime.Value.ToUniversalTime()); //获取截止时间前所有的计划时间
|
|
|
|
|
|
|
|
if (occurrences.Count() < 10) |
|
|
|
{ |
|
|
|
Content = smsTask.Content, |
|
|
|
IsActive = 'Y', |
|
|
|
IsComplete = 'N', |
|
|
|
SmsInterfaceId = SmsInterfaceId, |
|
|
|
SmsTaskId = smsTask.Id, |
|
|
|
MobileTelephone = smsTask.MobileTelephone, |
|
|
|
PlanSendTime = occurrence |
|
|
|
}; |
|
|
|
|
|
|
|
_smsSendManager.CreateAsync(smsSendEntity); |
|
|
|
|
|
|
|
smsSendList.Add(smsSendEntity); |
|
|
|
foreach (var occurrence in occurrences) |
|
|
|
{ |
|
|
|
var smsSendEntity = new SmsSend(GuidGenerator.Create()) |
|
|
|
{ |
|
|
|
Content = smsTask.Content, |
|
|
|
IsActive = 'Y', |
|
|
|
IsComplete = 'N', |
|
|
|
SmsInterfaceId = SmsInterfaceId, |
|
|
|
SmsTaskId = smsTask.Id, |
|
|
|
MobileTelephone = smsTask.MobileTelephone, |
|
|
|
PlanSendTime = occurrence |
|
|
|
}; |
|
|
|
|
|
|
|
_smsSendManager.CreateAsync(smsSendEntity); |
|
|
|
|
|
|
|
smsSendList.Add(smsSendEntity); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_logger.LogInformation($"------Id为【{smsTask.Id}】的SmsTask记录,Corn表达式记录超出10条,已跳过------当前时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogInformation($"------处理Corn表达式异常------,{ex.ToString()}"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|