using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Threading;
using System.Threading.Tasks;
using WIDESEA_Core.Core;
using WIDESEA_ITaskInfoService;
namespace WIDESEA_WMSServer.BackgroundServices
{
///
/// 自动出库任务后台服务
/// 定期检查到期库存并创建出库任务
///
public class AutoOutboundTaskBackgroundService : BackgroundService
{
private readonly ILogger _logger;
private readonly ITaskService _taskService;
private readonly AutoOutboundTaskOptions _options;
public AutoOutboundTaskBackgroundService(
ILogger logger,
ITaskService taskService,
IOptions options)
{
_logger = logger;
_taskService = taskService;
_options = options.Value;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("自动出库任务后台服务已启动");
if (!_options.Enable)
{
_logger.LogInformation("自动出库任务功能已禁用,服务退出");
return;
}
_logger.LogInformation("自动出库任务检查间隔: {Seconds} 秒", _options.CheckIntervalSeconds);
int index = 0;
while (!stoppingToken.IsCancellationRequested)
{
try
{
_logger.LogInformation("开始检查到期库存...");
if (index == 0)
{
await Task.Delay(5000, stoppingToken);
index++;
}
var result = await _taskService.CreateAutoOutboundTasksAsync();
if (result.Status)
{
_logger.LogInformation("到期库存检查完成: {Message}", result.Message);
}
else
{
_logger.LogWarning("到期库存检查失败: {Message}", result.Message);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "自动出库任务创建过程中发生异常");
}
var delay = TimeSpan.FromSeconds(_options.CheckIntervalSeconds);
_logger.LogDebug("等待 {Seconds} 秒后进行下次检查", delay.TotalSeconds);
await Task.Delay(delay, stoppingToken);
}
_logger.LogInformation("自动出库任务后台服务已停止");
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("正在停止自动出库任务后台服务...");
await base.StopAsync(cancellationToken);
}
}
}