using Masuit.Tools; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using WIDESEA_Cache; using WIDESEA_Core.Const; using WIDESEA_DTO.WMS; using WIDESEA_IServices; using WIDESEAWCS_BasicInfoRepository; namespace WIDESEA_StorageTaskServices { public class MyBackgroundService : IHostedService, IDisposable { private readonly ILogger _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 readonly ISimpleCacheService _simpleCacheService; private Timer _timer; public MyBackgroundService(ILogger logger, ILocationInfoRepository locationRepository, IStockInfoRepository stockInfoRepository, IDt_AreaInfoRepository areaInfoRepository, IDt_TaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService, ISimpleCacheService simpleCacheService) { _logger = logger; _locationRepository = locationRepository; _stockInfoRepository = stockInfoRepository; _areaInfoRepository = areaInfoRepository; _taskRepository = taskRepository; _stationManagerRepository = stationManagerRepository; _configService = configService; _simpleCacheService = simpleCacheService; } public Task StartAsync(CancellationToken cancellationToken) { _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(20)); return Task.CompletedTask; } private void DoWork(object state) { try { var area = _areaInfoRepository.QueryFirst(x => x.AreaCode == "GWSC1"); if (area == null) { return; } IDictionary? stockInfos = _simpleCacheService.HashGetAll(WIDESEA_Cache.CacheConst.Cache_DtStockInfo); List stockInfoList = stockInfos.Values.ToList(); var stockInfo = stockInfoList.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(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(); } /// /// 创建任务实例 /// 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, ProductionLine= stockInfo.ProductionLine, ProcessCode = stockInfo.ProcessCode, }; } /// /// 创建任务DTO /// 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, ProductionLine = task.ProductionLine, }; } } }