using Masuit.Tools;
|
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Logging;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Core.Const;
|
using WIDESEA_DTO.WMS;
|
using WIDESEA_IServices;
|
using WIDESEA_Repository;
|
using WIDESEAWCS_BasicInfoRepository;
|
using WIDESEA_Model;
|
|
namespace WIDESEA_StorageTaskServices
|
{
|
public class MyBackgroundService : IHostedService, IDisposable
|
{
|
private readonly ILogger<MyBackgroundService> _logger;
|
private readonly IStockInfoRepository _stockInfoRepository;
|
private readonly IDt_AreaInfoRepository _areaInfoRepository; //区域
|
private readonly IDt_TaskRepository _taskRepository;
|
private readonly IDt_StationManagerRepository _stationManagerRepository;
|
private readonly ISys_ConfigService _configService;
|
private readonly ILocationInfoRepository _locationRepository;
|
|
private Timer _timer;
|
public MyBackgroundService(ILogger<MyBackgroundService> logger, ILocationInfoRepository locationRepository, IStockInfoRepository stockInfoRepository, IDt_AreaInfoRepository areaInfoRepository, IDt_TaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService)
|
{
|
_logger = logger;
|
_locationRepository = locationRepository;
|
_stockInfoRepository = stockInfoRepository;
|
_areaInfoRepository = areaInfoRepository;
|
_taskRepository = taskRepository;
|
_stationManagerRepository = stationManagerRepository;
|
_configService = configService;
|
}
|
public Task StartAsync(CancellationToken cancellationToken)
|
{
|
_timer = new Timer(DoWork, null, 0, 10000);
|
return Task.CompletedTask;
|
}
|
private void DoWork(object state)
|
{
|
try
|
{
|
|
var area = _areaInfoRepository.QueryFirst(x => x.AreaCode == "GWSC1");
|
|
var stockInfo = _stockInfoRepository.Db.Queryable<DtStockInfo>()
|
.Includes(x => x.LocationInfo) // 预加载LocationInfo
|
.Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails
|
.Where(x => x.AreaCode == area.AreaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件
|
.Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID) // 过滤条件
|
.OrderBy(x => x.OutboundTime) // 排序
|
.ToList(); // 获取第一个元素
|
|
if (stockInfo.Count <= 0) return;
|
foreach (var item in stockInfo)
|
{
|
|
var hasTask = _taskRepository.QueryFirst(x => x.PalletCode == item.PalletCode);
|
if (hasTask != null)
|
{
|
Console.WriteLine("已存在出库任务");
|
continue;
|
}
|
|
string position = string.Empty;
|
if (item.LocationInfo.RoadwayNo == "GWSC1")
|
position = "1059";
|
else
|
position = "1065";
|
|
var task = CreateTask(item, position, (int)TaskOutboundTypeEnum.Outbound);
|
task.NextAddress = "002-000-002";
|
// 创建任务DTO
|
WMSTaskDTO taskDTO = CreateTaskDTO(task);
|
|
|
var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
|
var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue;
|
var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveTask)?.ConfigValue;
|
if (wmsBase == null || ipAddress == null)
|
{
|
throw new InvalidOperationException("WMS IP 未配置");
|
}
|
var wmsIpAddress = wmsBase + ipAddress;
|
|
var result = HttpHelper.PostAsync(wmsIpAddress, taskDTO.ToJsonString()).Result;
|
var content = JsonConvert.DeserializeObject<WebResponseContent>(result);
|
if (content.Status)
|
{
|
_taskRepository.AddData(task);
|
// 更新库存位置状态为不可用
|
item.LocationInfo.LocationStatus = (int)LocationEnum.InStockDisable;
|
_locationRepository.UpdateData(item.LocationInfo);
|
}
|
}
|
|
}
|
catch (Exception ex)
|
{
|
ConsoleHelper.WriteErrorLine(ex.Message);
|
}
|
ConsoleHelper.WriteSuccessLine(DateTime.Now.ToString());
|
}
|
public Task StopAsync(CancellationToken cancellationToken)
|
{
|
_logger.LogInformation("MyBackgroundService is stopping.");
|
_timer?.Change(Timeout.Infinite, 0);
|
return Task.CompletedTask;
|
}
|
public void Dispose()
|
{
|
_timer?.Dispose();
|
}
|
|
|
/// <summary>
|
/// 创建任务实例
|
/// </summary>
|
private Dt_Task CreateTask(DtStockInfo stockInfo, string position, int tag)
|
{
|
return new Dt_Task
|
{
|
Grade = 1,
|
Roadway = stockInfo.LocationInfo.RoadwayNo,
|
TargetAddress = position,
|
Dispatchertime = DateTime.Now,
|
MaterialNo = "",
|
NextAddress = position,
|
OrderNo = null,
|
PalletCode = stockInfo.PalletCode,
|
SourceAddress = stockInfo.LocationCode,
|
CurrentAddress = stockInfo.LocationCode,
|
TaskState = (int)TaskOutStatusEnum.OutNew,
|
TaskType = tag,
|
TaskNum = _taskRepository.GetTaskNo().Result,
|
Creater = "System", // 修正拼写错误
|
CreateDate = DateTime.Now,
|
TaskId = 0,
|
};
|
}
|
|
/// <summary>
|
/// 创建任务DTO
|
/// </summary>
|
private WMSTaskDTO CreateTaskDTO(Dt_Task task)
|
{
|
return new WMSTaskDTO
|
{
|
TaskNum = task.TaskNum.Value,
|
Grade = 1,
|
PalletCode = task.PalletCode,
|
RoadWay = task.Roadway,
|
SourceAddress = task.SourceAddress,
|
TargetAddress = task.TargetAddress,
|
TaskState = task.TaskState.Value,
|
Id = 0,
|
TaskType = task.TaskType,
|
};
|
}
|
}
|
}
|