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<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 readonly ISimpleCacheService _simpleCacheService; 
 | 
  
 | 
        private Timer _timer; 
 | 
  
 | 
        public MyBackgroundService(ILogger<MyBackgroundService> 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(5)); 
 | 
            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>() 
 | 
                    .Where(x => x.AreaCode == area.AreaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) 
 | 
                    .Includes(x => x.LocationInfo) 
 | 
                    .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID) // 过滤条件 
 | 
                    .Includes(x => x.StockInfoDetails) 
 | 
                    .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; 
 | 
                    switch (item.LocationInfo.RoadwayNo) 
 | 
                    { 
 | 
                        case "GWSC1": 
 | 
                            position = "3101"; 
 | 
                            break; 
 | 
                        case "GWSC2": 
 | 
                            position = "3104"; 
 | 
                            break; 
 | 
                        default: 
 | 
                            position = "3107"; 
 | 
                            break; 
 | 
                    } 
 | 
  
 | 
                    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, 
 | 
                ProductionLine = stockInfo.ProductionLine, 
 | 
                ProcessCode = stockInfo.ProcessCode, 
 | 
            }; 
 | 
        } 
 | 
  
 | 
        /// <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, 
 | 
                ProductionLine = task.ProductionLine, 
 | 
            }; 
 | 
        } 
 | 
    } 
 | 
} 
 |