| using Masuit.Tools; | 
| using Microsoft.Extensions.Hosting; | 
| using Microsoft.Extensions.Logging; | 
| 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<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"); | 
|   | 
|                 if (area == null) { return; } | 
|                 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, | 
|             }; | 
|         } | 
|     } | 
| } |