using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Options;
using SJZY.Expand.ABP.Core;
using SJZY.Expand.ABP.Core.Logger;
using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Application.Track2InterfaceRelay;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
namespace SJZY.Track.Application.Services.TimerTaskss;
///
/// 轨迹运输时效预警定时任务
///
[ApiExplorerSettings(GroupName = "定时任务")]
public class TrackWarningTask : ApplicationService
{
private readonly IOptionsSnapshot _options;
private readonly IOrderRepository _orderRepository;
public TrackWarningTask(IOrderRepository orderRepository, IOptionsSnapshot options)
{
_orderRepository = orderRepository;
_options = options;
}
///
/// 轨迹运输时效预警通知
///
///
[AllowAnonymous]
[HttpPost("/TimerTask/SendWarning")]
public async Task SendWarningForTaskAsync()
{
var configs = _options.Value;
if (configs == null || configs.Keys.Count == 0)
{
throw new BusinessException("未配置子系统");
}
var subSystemIds = await _orderRepository.GetSubSystemListByCodesAsync(configs.Keys.ToList());
foreach (var item in subSystemIds)
{
var ttl = configs[item.code].WarningNotifyInterval * 60;
await TrackWarningBySubSystemAsync(item.id, ttl);
}
return true;
}
private async Task TrackWarningBySubSystemAsync(int subSystemId, int ttl)
{
// 如果已经发送过通知,不再发送
var redisKey = $"{GlobalConst.ForewarningNotifyCheckKey}:{subSystemId}";
if (await RedisHelper.Client.ExistsAsync(redisKey))
{
return;
}
await RedisHelper.Client.SetExAsync(redisKey, ttl, 1);
// todo:改mq分流?
_ = Task.Run(async () =>
{
try
{
using var serviceScope = LazyServiceProvider.CreateScope();
var forewarningNotifyService =
serviceScope.ServiceProvider.GetRequiredService();
var cnt = await forewarningNotifyService.SendNotificationAsync(subSystemId);
LogHelper.Info($"预警通知发送成功,新增预警记录{cnt}条");
}
catch (Exception e)
{
await RedisHelper.Client.DelAsync(redisKey);
LogHelper.Error(e.ToString());
}
});
}
}