using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System.Threading.Tasks; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.Const; using WIDESEA_DTO.WMS; using WIDESEA_IServices; using WIDESEA_StorageBasicRepository; using WIDESEAWCS_BasicInfoRepository; using WIDESEAWCS_Model.Models; namespace WIDESEA_StorageTaskServices { public class MyBackgroundService : IHostedService, IDisposable { private ILogger _logger; private IDt_PalletStockInfoRepository _palletStockInfoRepository; private IDt_AreaInfoRepository _areaInfoRepository; //区域 private IDt_TaskRepository _taskRepository; private IDt_StationManagerRepository _stationManagerRepository; private ISys_ConfigService _configService; private ILocationInfoRepository _locationRepository; private IVV_StockInfoRepository _VVStockInfoRepository; private IUnitOfWorkManage _unitOfWorkManage; private IDt_MESLockInfoRepository _MESLockInfoRepository; private Timer _timer; public MyBackgroundService(/*ILogger logger, ILocationInfoRepository locationRepository, IDt_AreaInfoRepository areaInfoRepository, IDt_TaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService, IDt_PalletStockInfoRepository palletStockInfoRepository, IVV_StockInfoRepository VV_StockInfoRepository, IUnitOfWorkManage unitOfWorkManage, IDt_MESLockInfoRepository MESLockInfoRepository*/) { } public Task StartAsync(CancellationToken cancellationToken) { //_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(15)); return Task.CompletedTask; } private void DoWork(object state) { try { IServiceScope scope = App.RootServices.CreateScope(); _logger = scope.ServiceProvider.GetService>(); _locationRepository = scope.ServiceProvider.GetService(); _areaInfoRepository = scope.ServiceProvider.GetService(); _taskRepository = scope.ServiceProvider.GetService(); _stationManagerRepository = scope.ServiceProvider.GetService(); _configService = scope.ServiceProvider.GetService(); _palletStockInfoRepository = scope.ServiceProvider.GetService(); _VVStockInfoRepository = scope.ServiceProvider.GetService(); _unitOfWorkManage = scope.ServiceProvider.GetService(); _MESLockInfoRepository = scope.ServiceProvider.GetService(); //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 != null && x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID) // 过滤条件 // .OrderBy(x => x.OutboundTime) // 排序 // .ToList(); // 获取第一个元素 var lockInfo = _palletStockInfoRepository.Db.Queryable() //.Where(x => x.LockStatue == 0) .Includes(x => x.CarBodyInfo) .OrderBy(x => x.sequenceNo) // 排序 .ToList(); // 获取第一个元素 if (lockInfo.Where(x => x.LockStatue == 1).Count() > 10) return; if (lockInfo.Count == 0) return; var lockCar = lockInfo.Where(x => x.LockStatue == 0).FirstOrDefault(); if (lockCar == null) return; var hasTask = _taskRepository.QueryFirst(x => x.PalletCode == lockCar.CarBodyInfo.PalletCode); if (hasTask != null) { Console.WriteLine("已存在出库任务"); return; } List stationLists = null; if (lockCar.CarBodyInfo.CarType == 1) { stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == lockCar.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "3"); } else if (lockCar.CarBodyInfo.CarType == 2) { stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == lockCar.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "4"); } //else if (item.CarBodyInfo.CarType == 3) //{ // stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 7 && x.stationStatus == "1" && x.stationArea == "3"); //} var stock = _VVStockInfoRepository.QueryFirst(x => x.carBodyID == lockCar.carBodyID); var lockStock = _palletStockInfoRepository.QueryFirst(x => x.carBodyID == lockCar.carBodyID); var location = _locationRepository.QueryFirst(x => x.LocationCode == stock.LocationCode); location.LocationStatus = (int)LocationEnum.InStockDisable; lockCar.LockStatue = 1; lockStock.TaskStatus = 1; if (stationLists == null || stationLists.Count == 0) throw new Exception("出库站台未配置或未启用"); Dt_StationManager Outstation = null; //if (stationLists.Count > 1) //{ // var Outtask = BaseDal.QueryData(x => x.Roadway == stationLists.FirstOrDefault().Roadway && x.TaskType == (int)TaskTypeEnum.Outbound).OrderByDescending(x => x.CreateDate).FirstOrDefault(); // if (Outtask != null) Outstation = stationLists.Where(x => x.stationChildCode != task.NextAddress && x.stationChildCode != Outtask.CurrentAddress).FirstOrDefault(); // else Outstation = stationLists.FirstOrDefault(); //} //else //{ Outstation = stationLists.FirstOrDefault(); //} //var stationInfo = stationInfos.FirstOrDefault(); // 创建并添加任务到数据库 hasTask = new Dt_Task { Grade = 1, Roadway = Outstation.Roadway, TargetAddress = "RB043", Dispatchertime = DateTime.Now, NextAddress = Outstation.stationChildCode, OrderNo = null, PalletCode = stock.PalletCode, PVI = stock.PVI, SourceAddress = stock.LocationCode, CurrentAddress = stock.LocationCode, TaskState = (int)TaskOutStatusEnum.OutNew, TaskType = (int)TaskOutboundTypeEnum.Outbound, TaskNum = _taskRepository.GetTaskNo().Result, Creater = "System", CreateDate = DateTime.Now, TaskId = 0, }; // 创建任务传输用的DTO对象 var taskDTO = CreateTaskDTO(hasTask); // 获取WMS IP地址用于发送任务请求 var wmsIpAddress = GetWCSIpReceiveTask(); if (wmsIpAddress == null) { throw new InvalidOperationException("WMS IP 未配置"); } var tasks = new List() { taskDTO }; // 发送任务请求到WMS var result = HttpHelper.PostAsync(wmsIpAddress, tasks.ToJsonString()).Result; WebResponseContent content = JsonConvert.DeserializeObject(result); if (content.Status) { _unitOfWorkManage.BeginTran(); // 添加任务到数据库 _taskRepository.AddData(hasTask); // 更新库位位置状态为不可用 _locationRepository.UpdateData(location); _MESLockInfoRepository.UpdateData(lockCar); _palletStockInfoRepository.UpdateData(lockStock); _unitOfWorkManage.CommitTran(); } //foreach (var item in lockInfo) //{ // var hasTask = _taskRepository.QueryFirst(x => x.PalletCode == item.CarBodyInfo.PalletCode); // if (hasTask != null) // { // Console.WriteLine("已存在出库任务"); // continue; // } // List stationLists = null; // if (item.CarBodyInfo.CarType == 1) // { // stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "3"); // } // else if (item.CarBodyInfo.CarType == 2) // { // stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "4"); // } // //else if (item.CarBodyInfo.CarType == 3) // //{ // // stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 7 && x.stationStatus == "1" && x.stationArea == "3"); // //} // var stock = _VVStockInfoRepository.QueryFirst(x => x.carBodyID == item.carBodyID); // var lockStock = _palletStockInfoRepository.QueryFirst(x => x.carBodyID == item.carBodyID); // var location = _locationRepository.QueryFirst(x => x.LocationCode == stock.LocationCode); // location.LocationStatus = (int)LocationEnum.InStockDisable; // item.LockStatue = 1; // lockStock.TaskStatus = 1; // if (stationLists == null || stationLists.Count == 0) throw new Exception("出库站台未配置或未启用"); // Dt_StationManager Outstation = null; // //if (stationLists.Count > 1) // //{ // // var Outtask = BaseDal.QueryData(x => x.Roadway == stationLists.FirstOrDefault().Roadway && x.TaskType == (int)TaskTypeEnum.Outbound).OrderByDescending(x => x.CreateDate).FirstOrDefault(); // // if (Outtask != null) Outstation = stationLists.Where(x => x.stationChildCode != task.NextAddress && x.stationChildCode != Outtask.CurrentAddress).FirstOrDefault(); // // else Outstation = stationLists.FirstOrDefault(); // //} // //else // //{ // Outstation = stationLists.FirstOrDefault(); // //} // //var stationInfo = stationInfos.FirstOrDefault(); // // 创建并添加任务到数据库 // hasTask = new Dt_Task // { // Grade = 1, // Roadway = Outstation.Roadway, // TargetAddress = "RB043", // Dispatchertime = DateTime.Now, // NextAddress = Outstation.stationChildCode, // OrderNo = null, // PalletCode = stock.PalletCode, // PVI = stock.PVI, // SourceAddress = stock.LocationCode, // CurrentAddress = stock.LocationCode, // TaskState = (int)TaskOutStatusEnum.OutNew, // TaskType = (int)TaskOutboundTypeEnum.Outbound, // TaskNum = _taskRepository.GetTaskNo().Result, // Creater = "System", // CreateDate = DateTime.Now, // TaskId = 0, // }; // // 创建任务传输用的DTO对象 // var taskDTO = CreateTaskDTO(hasTask); // // 获取WMS IP地址用于发送任务请求 // var wmsIpAddress = GetWCSIpReceiveTask(); // if (wmsIpAddress == null) // { // throw new InvalidOperationException("WMS IP 未配置"); // } // var tasks = new List() { taskDTO }; // // 发送任务请求到WMS // var result = HttpHelper.PostAsync(wmsIpAddress, tasks.ToJsonString()).Result; // WebResponseContent content = JsonConvert.DeserializeObject(result); // if (content.Status) // { // _unitOfWorkManage.BeginTran(); // // 添加任务到数据库 // _taskRepository.AddData(hasTask); // // 更新库位位置状态为不可用 // _locationRepository.UpdateData(location); // _MESLockInfoRepository.UpdateData(item); // _palletStockInfoRepository.UpdateData(lockStock); // _unitOfWorkManage.CommitTran(); // } //} } 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, 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, }; } /// /// 创建任务DTO /// private WMSTaskDTO CreateTaskDTO(Dt_Task task) { return new WMSTaskDTO { TaskNum = task.TaskNum.Value, Grade = task.Grade.Value, PalletCode = task.PalletCode, RoadWay = task.Roadway, SourceAddress = task.SourceAddress, TargetAddress = task.TargetAddress, TaskState = task.TaskState.Value, Id = 0, TaskType = task.TaskType, pvi = task.PVI, NextAddress = task.NextAddress }; } private string GetWCSIpReceiveTask() { 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) { return null; } return wmsBase + ipAddress; } } }