From c51aaf0a95836b83bb4c209556cfddaf42ea3314 Mon Sep 17 00:00:00 2001 From: xxyy <cathay_xy@163.com> Date: 星期四, 06 三月 2025 10:09:49 +0800 Subject: [PATCH] 优化缓存使用和定时器设置 --- Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs | 475 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 341 insertions(+), 134 deletions(-) diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs index 78d25a5..9c82d44 100644 --- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs +++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs @@ -1,6 +1,9 @@ 锘縰sing Mapster; using Masuit.Tools; +using NewLife.Caching; +using SqlSugar; using System.Text.RegularExpressions; +using WIDESEA_Cache; using WIDESEA_Core.Const; using WIDESEA_DTO.MOM; using WIDESEA_DTO.WMS; @@ -8,7 +11,6 @@ using WIDESEA_IStoragIntegrationServices; using WIDESEAWCS_BasicInfoRepository; using WIDESEAWCS_QuartzJob.Models; - namespace WIDESEA_StorageTaskServices; @@ -30,6 +32,7 @@ private readonly IAgingInOrOutInputService _agingInOrOutInputService; //闈欑疆\闄堝寲 private readonly IDt_StationManagerRepository _stationManagerRepository; private readonly ISys_ConfigService _configService; + private readonly ISimpleCacheService _simpleCacheService; public Dt_TaskService(IDt_TaskRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, @@ -47,7 +50,8 @@ IAgingInOrOutInputService agingInOrOutInputService, IStockInfoDetailRepository stockInfoDetailRepository, IDt_StationManagerRepository stationManagerRepository, - ISys_ConfigService configService) : base(BaseDal) + ISys_ConfigService configService, + ISimpleCacheService simpleCacheService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _stockInfoRepository = stockInfoRepository; @@ -64,6 +68,7 @@ _stockInfoDetailRepository = stockInfoDetailRepository; _stationManagerRepository = stationManagerRepository; _configService = configService; + _simpleCacheService = simpleCacheService; } #region 澶栭儴鎺ュ彛鏂规硶 @@ -167,7 +172,6 @@ if (content.Status) { var result = JsonConvert.DeserializeObject<BasicResult>(content.Data.ToString()); - task.Remark = result.Success ? null : "NG"; if (!result.Success && result.MessageCode == "E10001") { @@ -177,15 +181,24 @@ else { task.Remark = "NG"; + ConsoleHelper.WriteErrorLine("MOM閫氭姤鐐硅姱NG"); + return content.Error("MOM閫氭姤鐐硅姱NG"); } } } + } + + if (task.Remark == "NG") + { + ConsoleHelper.WriteErrorLine("MOM閫氭姤鐐硅姱NG"); + return content.Error("MOM閫氭姤鐐硅姱NG"); } // 鏇存柊搴撳瓨鐘舵�佸拰浠诲姟鐘舵�� (var loc, var tas) = UpdateStockAndTaskStatus(stock, task); var taskHty = task.Adapt<Dt_Task_Hty>(); taskHty.FinishTime = DateTime.Now; + taskHty.OperateType = (int)OperateTypeEnum.鑷姩瀹屾垚; DtStockInfo_Hty stockInfo_Hty = stock.Adapt<DtStockInfo_Hty>(); stockInfo_Hty.ModifyDate = DateTime.Now; @@ -258,7 +271,7 @@ ParameterDesc = parameterInfo.Description, ParameterResult = "OK", //isNG.ToString(), TargetValue = parameterInfo.TargetValue, - LowerLomit = parameterInfo.LowerSpecificationsLimit, + LowerLimit = parameterInfo.LowerSpecificationsLimit, UpperLimit = parameterInfo.UpperSpecificationsLimit, DefectCode = defectCode, UOMCode = parameterInfo.UOMCode, @@ -437,6 +450,9 @@ if (isResult) { _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(locationInf, lastStatus, (int)StatusChangeTypeEnum.AutomaticStorage, task.TaskNum); + + _simpleCacheService.HashAdd(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, stock.PalletCode, stock); + content.OK("鍏ュ簱浠诲姟瀹屾垚鎴愬姛"); } else @@ -470,6 +486,7 @@ IsFull = false, AreaCode = area.AreaCode ?? "", LocationId = loation.Id, + ProductionLine = task.ProductionLine, StockInfoDetails = new List<DtStockInfoDetail>() { new DtStockInfoDetail() @@ -737,7 +754,7 @@ return content.Error(result.MOMMessage); // 鑾峰彇寮傚父鐢佃姱 - List<SerialNoDto>? serialNosError = result.SerialNos.Where(x => x.SerialNoStatus != 1).ToList(); + List<SerialNoDto>? serialNosError = result.SerialNos.Where(x => x.SerialNoStatus != 1 && x.SerialNoStatus != 4).ToList(); if (serialNosError.Count > 0) { // TODO 鍒涘缓浠诲姟閫佽嚦NG鎺掑嚭鍙� @@ -752,7 +769,7 @@ { NGStation = efg.Select(x => x.stationNGChildCode).ToList(); } - content = await CreateNewTask(input, NGStation, 2); + content = await CreateNewTask(input, result.ProductionLine, result.ProcessCode, NGStation, 2); return content.Error("瀛樺湪寮傚父鐢佃姱"); } @@ -789,7 +806,7 @@ { // TODO 閫佽嚦鍖呰 List<string> strings = stationManagers.Where(x => x.stationType == 0).Select(x => x.Roadway).ToList(); - content = await CreateNewTask(input, strings, 3); + content = await CreateNewTask(input, result.ProductionLine, result.ProcessCode, strings, 3); return content; } else @@ -797,7 +814,7 @@ var config = _configService.GetByConfigKey("SYS_InStacker", "CW3InStacker"); var strings = config.ConfigValue.Split(',').ToList(); // TODO 鍏ュ簱 - content = await CreateNewTask(input, strings); + content = await CreateNewTask(input, result.ProductionLine, result.ProcessCode, strings); if (content.Status) await _boxingInfoRepository.AddDataNavAsync(boxing); } @@ -886,7 +903,7 @@ List<string> strings = stationManagers.Roadway.Split(',').ToList(); Console.WriteLine(strings.ToJsonString() + "b-----------------------"); //// 璋冪敤CreateNewTask鏂规硶锛屽垱寤烘柊浠诲姟 - content = await CreateNewTask(input, strings); + content = await CreateNewTask(input, result.ProductionLine, result.ProcessCode, strings); if (content.Status) { var isBox = await _boxingInfoRepository.AddDataNavAsync(boxing); @@ -942,6 +959,8 @@ Creater = "System", // 淇鎷煎啓閿欒 CreateDate = DateTime.Now, TaskId = 0, + ProductionLine = stock.ProductionLine, + ProcessCode = stock.ProcessCode, }; var taskDTO = CreateTaskDTO(taskNew); @@ -989,15 +1008,21 @@ return content.Error(result.MOMMessage); } - if (result.SerialNos.Count <= 0) { - return await RequestTrayInTaskAsync(input); + var config = _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_InStacker, SysConfigConst.InboundIsEmpty); + var strings = config.ConfigValue.Split(',').ToList(); + if (strings.Contains(input.Position)) + { + // todo閫佽嚦NG鍙� + ConsoleHelper.WriteErrorLine($"褰撳墠浣嶇疆涓嶈兘鍏ョ┖鎵樼洏"); + return content.Error("褰撳墠浣嶇疆涓嶈兘鍏ョ┖鎵樼洏"); + } + else + return await RequestTrayInTaskAsync(input); } else { - - // 澶勭悊寮傚父鐢佃姱鎯呭喌 var serialNosError = result.SerialNos.Where(x => x.SerialNoStatus != 1 && x.SerialNoStatus != 4).ToList(); if (serialNosError.Count > 0) @@ -1008,6 +1033,7 @@ var boxing = CreateBoxingInfo(result, input.PalletCode); if (boxing == null) return content.Error("缁勭洏澶辫触"); + input.ProductionLine = result.ProductionLine; return await ProcessBasedOnProcessCode(boxing, area, input, result); } } @@ -1058,19 +1084,44 @@ if (task != null && task.TaskState == (int)TaskInStatusEnum.InNew) { // 鍒涘缓WMS浠诲姟 - WMSTaskDTO taskDTO = new WMSTaskDTO() - { - TaskNum = task.TaskNum.Value, - Grade = 1, - PalletCode = task.PalletCode, - RoadWay = task.Roadway, - SourceAddress = task.SourceAddress, - TargetAddress = task.Roadway, - TaskState = task.TaskState.Value, - Id = 0, - TaskType = task.TaskType, - }; + WMSTaskDTO taskDTO = CreateTaskDTO(task); + //WMSTaskDTO taskDTO = new WMSTaskDTO() + //{ + // TaskNum = task.TaskNum.Value, + // Grade = 1, + // PalletCode = task.PalletCode, + // RoadWay = task.Roadway, + // SourceAddress = task.SourceAddress, + // TargetAddress = task.Roadway, + // TaskState = task.TaskState.Value, + // Id = 0, + // TaskType = task.TaskType, + //}; return content.OK(data: task); + } + + // 鏍规嵁浣嶇疆鏌ヨ鍖哄煙淇℃伅 + var areaCode = Regex.Replace(input.Position, @"-(\d+)", ""); + var area = await QueryAreaInfoByPosition(areaCode); + if (area == null) + { + return content.Error("璇ョ偣浣嶄笉鍦ㄥ尯鍩熷垪琛ㄤ腑瀛樺湪"); + } + + // 鑾峰彇鏁寸洏鐢佃姱灞炴�х姸鎬� + TrayCellsStatusDto trayCells = CreateTrayCellsStatusDto(area, input.PalletCode); + content = await GetTrayCellStatusAsync(trayCells); + if (!content.Status) + { + ConsoleHelper.WriteErrorLine($"鑾峰彇鐢佃姱鐘舵�佸け璐�:{content.Message}"); + return content; + } + + var result = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(content.Data.ToString()); + if (result.ProductionLine.IsNullOrEmpty()) + { + ConsoleHelper.WriteErrorLine($"褰撳墠鎵樼洏鏃犱骇绾�,鑱旂郴MOM娣诲姞浜х嚎"); + return content.Error("褰撳墠鎵樼洏鏃犱骇绾�,鑱旂郴MOM娣诲姞浜х嚎"); } var stationManagers = _stationManagerRepository.QueryData(x => x.stationType == 6 && x.stationChildCode == input.Position).FirstOrDefault(); @@ -1081,9 +1132,8 @@ throw new Exception("鏈壘鍒扮┖鎵樼洏鍏ュ簱绔欏彴鍜屽叆搴撶珯鍙伴厤缃�"); } List<string> strings = stationManagers.Roadway.Split(',').ToList(); - Console.WriteLine(strings.ToJsonString() + "b-----------------------"); - return await CreateNewTask(input, strings, 1); + return await CreateNewTask(input, result.ProductionLine, result.ProcessCode, strings, 1); } catch (Exception) { @@ -1152,12 +1202,14 @@ // 鏍规嵁鎵樼洏绫诲瀷鏌ヨ搴撳瓨淇℃伅 DtStockInfo stockInfo = tag == (int)TaskOutboundTypeEnum.Outbound ? areaCode != "CWSC1" ? await QueryStockInfoForRealTrayAsync(areaCode, areaCodes, productionLine) : await QueryStockInfoForRealTrayCWAsync(areaCodes, productionLine) - : await QueryStockInfoForEmptyTrayAsync(areaCode); + : await QueryStockInfoForEmptyTrayAsync(areaCode, position); if (stockInfo == null) { return content.Error("搴撳瓨淇℃伅涓嶅瓨鍦�"); } + + //ConsoleHelper.WriteColorLine(JsonConvert.SerializeObject(stockInfo), ConsoleColor.DarkMagenta); // 鏂板閲嶅浠诲姟鏍¢獙 var hasTask = BaseDal.QueryFirst(x => x.PalletCode == stockInfo.PalletCode); @@ -1192,6 +1244,7 @@ { // 璁板綍寮傚父淇℃伅骞舵姏鍑� LogFactory.GetLog("璇锋眰鎵樼洏浠诲姟").Error(true, ex); + ConsoleHelper.WriteErrorLine("璇锋眰绌�/瀹炴墭鐩樹换鍔�" + ex.Message); return content.Error(ex.Message); } } @@ -1202,20 +1255,98 @@ private async Task<DtStockInfo> QueryStockInfoForRealTrayAsync(string areaCode, List<string> devices, string productionLine) { var area = await _areaInfoRepository.QueryFirstAsync(x => x.AreaCode == areaCode); + if (area == null) + { + ConsoleHelper.WriteErrorLine($"鏌ヨ瀹炵洏搴撳瓨淇℃伅鏃�,鏈壘鍒板尯鍩熶唬鐮佷负{areaCode}鐨勬暟鎹�"); + return null; + } - var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>() - .Includes(x => x.LocationInfo) // 棰勫姞杞絃ocationInfo - .Includes(x => x.StockInfoDetails) // 棰勫姞杞絊tockInfoDetails - .Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 杩囨护鏉′欢 - .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine) - .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢 - .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo)) - .OrderBy(x => x.OutboundTime) // 鎺掑簭 - .FirstAsync(); // 鑾峰彇绗竴涓厓绱� + var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel"); + List<string>? materielCodes = outBoundMateriel.Count != 0 + ? outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == area.AreaCode) + .Select(x => x.MaterielCode) + .ToList() + : null; - //var firstOrDefault = result.FirstOrDefault(x => roadways.Contains(x.LocationInfo.RoadwayNo)); // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌 - //var firstOrDefault = result[0]; // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌 - //return firstOrDefault; + IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo); + List<DtStockInfo> stockInfoList = stockInfos.Values.ToList(); + var result = new DtStockInfo(); + + //if (stockInfoList.IsNullOrEmpty()) + //{ + // stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>() + // .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock).IncludesAllFirstLayer().ToListAsync(); + //} + + result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull) + .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine) + .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) + .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo)) + .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode))) + .OrderBy(x => x.OutboundTime) + .FirstOrDefault(); + + if (result != null) + { + stockInfoList = stockInfoList.Where(x => x != result).ToList(); + _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode }); + } + + return result; + + if (stockInfoList.IsNullOrEmpty()) + { + stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>().IncludesAllFirstLayer().ToListAsync(); + + result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) + .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine) + .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢 + .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo)) + .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode))) + .OrderBy(x => x.OutboundTime) // 鎺掑簭 + .FirstOrDefault(); // 鑾峰彇绗竴涓厓绱� + + if (result != null) + { + // 鎺掗櫎 result 涓殑鍏冪礌 + stockInfoList = stockInfoList.Where(x => x != result).ToList(); + } + foreach (var item in stockInfoList) + { + _simpleCacheService.HashAdd(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, item.PalletCode, item); + } + } + else + { + result = stockInfoList.Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) + .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine) + .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢 + .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo)) + .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode))) + .OrderBy(x => x.OutboundTime) // 鎺掑簭 + .FirstOrDefault(); // 鑾峰彇绗竴涓厓绱� + if (result != null) + { + // 鎺掗櫎 result 涓殑鍏冪礌 + stockInfoList = stockInfoList.Where(x => x != result).ToList(); + } + string[] xfasd = new string[] { result.PalletCode }; + _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode }); + } + + #region + //var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>() + // .Includes(x => x.LocationInfo) // 棰勫姞杞絃ocationInfo + // .Includes(x => x.StockInfoDetails) // 棰勫姞杞絊tockInfoDetails + // .Where(x => x.AreaCode == areaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 杩囨护鏉′欢 + // .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine) + // .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢 + // .WhereIF(!devices.IsNullOrEmpty(), x => devices.Contains(x.LocationInfo.RoadwayNo)) + // .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode))) + // .OrderBy(x => x.OutboundTime) // 鎺掑簭 + // .FirstAsync(); // 鑾峰彇绗竴涓厓绱� + #endregion 璇锋眰鍑哄簱锛堝疄鐩�&绌虹洏锛� + return result; } @@ -1231,39 +1362,81 @@ return null; } - var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>() - .Includes(x => x.LocationInfo) // 棰勫姞杞絃ocationInfo - .Includes(x => x.StockInfoDetails) // 棰勫姞杞絊tockInfoDetails - .Where(x => areaCodes.Contains(x.AreaCode) && x.OutboundTime < DateTime.Now && x.IsFull == true) // 杩囨护鏉′欢 + //var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel"); + //List<string> materielCodes = null; + //if (outBoundMateriel.Count != 0) + //{ + // materielCodes = outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == areaCodes[0]).Select(x => x.MaterielCode).ToList(); + //} + + var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel"); + List<string>? materielCodes = outBoundMateriel.Count != 0 + ? outBoundMateriel.Where(x => x.ProductionLine == productionLine && x.ProcessCode == areaCodes[0]) + .Select(x => x.MaterielCode) + .ToList() + : null; + + var deviceCode = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>() + .Where(x => x.DeviceStatus == "1") + .Where(x => x.DeviceCode.Contains("CWSC")) + .ToList().Select(x => x.DeviceCode).ToList(); + //var deviceCode = devices.Select(x => x.DeviceCode).ToList(); + + IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo); + List<DtStockInfo> stockInfoList = stockInfos.Values.ToList(); + + var result = stockInfoList.Where(x => areaCodes.Contains(x.AreaCode) && x.OutboundTime < DateTime.Now && x.IsFull == true) // 杩囨护鏉′欢 .WhereIF(!productionLine.IsNullOrEmpty(), x => x.ProductionLine == productionLine) .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && areaId.Contains(x.LocationInfo.AreaId) && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢 + .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo)) + .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode))) .OrderBy(x => x.OutboundTime) // 鎺掑簭 - .FirstAsync(); // 鑾峰彇绗竴涓厓绱� + .FirstOrDefault(); // 鑾峰彇绗竴涓厓绱� - //var firstOrDefault = result.FirstOrDefault(x => roadways.Contains(x.LocationInfo.RoadwayNo)); // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌 - //var firstOrDefault = result[0]; // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌 - //return firstOrDefault; + if (result != null) + { + stockInfoList = stockInfoList.Where(x => x != result).ToList(); + _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode }); + } + return result; } /// <summary> /// 鏌ヨ绌虹洏搴撳瓨淇℃伅 /// </summary> - private async Task<DtStockInfo> QueryStockInfoForEmptyTrayAsync(string areaCode) + private async Task<DtStockInfo> QueryStockInfoForEmptyTrayAsync(string areaCode, string position) { var area = await _areaInfoRepository.QueryFirstAsync(x => x.AreaCode == areaCode); - var result = await _stockInfoRepository.Db.Queryable<DtStockInfo>() - .Includes(x => x.LocationInfo) // 棰勫姞杞絃ocationInfo - .Includes(x => x.StockInfoDetails) // 棰勫姞杞絊tockInfoDetails + ConsoleHelper.WriteColorLine(position + "..." + areaCode, ConsoleColor.Magenta); + var station = await _stationManagerRepository.QueryFirstAsync(x => x.stationChildCode == position && x.stationType == 17); + + ConsoleHelper.WriteColorLine(station.Roadway, ConsoleColor.Magenta); + var stackers = station.Roadway.Split(',').ToList(); + + var deviceCode = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>() + .Where(x => x.DeviceStatus == "1") + .Where(x => stackers.Contains(x.DeviceCode)) + .ToList().Select(x => x.DeviceCode).ToList(); + + IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo); + List<DtStockInfo> stockInfoList = stockInfos.Values.ToList(); + + var result = stockInfoList.Where(x => x.ProductionLine == station.productLine) .Where(x => x.AreaCode == areaCode && x.IsFull == false) .Where(x => x.StockInfoDetails.Any(y => y.MaterielCode == "绌烘墭鐩�")) .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) // 杩囨护鏉′欢 + .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo)) .OrderBy(x => x.CreateDate) // 鎺掑簭 - .FirstAsync(); // 杞崲涓哄垪琛� + .FirstOrDefault(); // 杞崲涓哄垪琛� - //var firstOrDefault = result[0]; // 鏌ユ壘绗竴涓尮閰嶇殑鍏冪礌 - //return firstOrDefault; + if (result != null) + { + stockInfoList = stockInfoList.Where(x => x != result).ToList(); + _simpleCacheService.HashDel<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo, new string[] { result.PalletCode }); + } + return result; } @@ -1274,7 +1447,7 @@ { return new Dt_Task { - Grade = tag == 104 ? 2 : 1, + Grade = tag == 104 ? (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC") ? 1 : 2) : (stockInfo.LocationInfo.RoadwayNo.Contains("CWSC") ? 2 : 1), Roadway = stockInfo.LocationInfo.RoadwayNo, TargetAddress = position, Dispatchertime = DateTime.Now, @@ -1290,6 +1463,8 @@ Creater = "System", // 淇鎷煎啓閿欒 CreateDate = DateTime.Now, TaskId = 0, + ProductionLine = stockInfo.ProductionLine, + ProcessCode = stockInfo.ProcessCode, }; } @@ -1309,6 +1484,7 @@ TaskState = task.TaskState.Value, Id = 0, TaskType = task.TaskType, + ProductionLine = task.ProductionLine, }; } @@ -1587,7 +1763,7 @@ // content.Error(ex.Message); //} //return content; - #endregion + #endregion 闈欑疆寮傚父鍙e叆搴� WebResponseContent content = new WebResponseContent(); try { @@ -1657,7 +1833,9 @@ TaskState = (int)TaskInStatusEnum.Line_InFinish, TaskType = (int)TaskInboundTypeEnum.Inbound, TaskNum = await BaseDal.GetTaskNo(), - Creater = "Systeam" + Creater = "Systeam", + ProductionLine = result.ProductionLine, + ProcessCode = result.ProcessCode, }; // 鍒涘缓WMS浠诲姟 @@ -1693,7 +1871,9 @@ TaskState = (int)TaskInStatusEnum.Line_InFinish, TaskType = (int)TaskInboundTypeEnum.InTray, TaskNum = await BaseDal.GetTaskNo(), - Creater = "Systeam" + Creater = "Systeam", + ProductionLine = result.ProductionLine, + ProcessCode = result.ProcessCode, }; // 鍒涘缓WMS浠诲姟 WMSTaskDTO taskDTO = CreateWMSTaskDTO(task); @@ -1725,7 +1905,6 @@ return content; } - private WMSTaskDTO CreateWMSTaskDTO(object source) { if (source is Dt_Task taskOld) @@ -1741,6 +1920,7 @@ TaskState = taskOld.TaskState.Value, Id = 0, TaskType = taskOld.TaskType, + ProductionLine = taskOld.ProductionLine }; } else if (source is Dt_Task task) @@ -1756,6 +1936,7 @@ TaskState = task.TaskState.Value, Id = 0, TaskType = task.TaskType, + ProductionLine = task.ProductionLine }; } else @@ -1767,8 +1948,6 @@ #endregion 闈欑疆寮傚父鍙e叆搴� #endregion 澶栭儴鎺ュ彛鏂规硶 - - #region 鍐呴儴璋冪敤鏂规硶 @@ -1953,7 +2132,7 @@ private Dt_Task_Hty CreateHistoricalTask(Dt_Task task, bool isHand = false) { // 鏇存柊浠诲姟鐘舵�� - task.TaskState = TaskOutStatusEnum.OutFinish.ObjToInt(); + task.TaskState = task.TaskType > 199 ? (int)TaskInStatusEnum.InFinish : (int)TaskOutStatusEnum.OutFinish; task.CurrentAddress = task.NextAddress; // 鍒涘缓鍘嗗彶浠诲姟 @@ -1966,7 +2145,7 @@ { taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; } - taskHty.TaskState = TaskOutStatusEnum.OutFinish.ObjToInt(); + taskHty.TaskState = task.TaskType > 199 ? (int)TaskInStatusEnum.InFinish : (int)TaskOutStatusEnum.OutFinish; return taskHty; } @@ -2022,16 +2201,31 @@ } } - var stocks = _stockInfoRepository.QueryData(x => x.AreaCode == stock.AreaCode && x.ProductionLine == stock.ProductionLine && x.SpecialParameterDuration != stock.SpecialParameterDuration); - if (stocks != null && stocks.Count > 0) + if (stock.IsFull) { - foreach (var item in stocks) + // 鏌ヨ绗﹀悎鏉′欢鐨勫簱瀛樹俊鎭� + var stocks = _stockInfoRepository.QueryData(x => x.AreaCode == stock.AreaCode && x.ProductionLine == stock.ProductionLine && x.SpecialParameterDuration != stock.SpecialParameterDuration); + + // 鏌ヨ浠诲姟淇℃伅 + var tasks = BaseDal.QueryData(x => x.PalletCode != stock.PalletCode && x.ProductionLine == stock.ProductionLine).Select(x => x.PalletCode).ToList(); + + if (stocks != null && stocks.Count > 0) { - item.SpecialParameterDuration = stock.SpecialParameterDuration; - item.ParameterInfos = stock.ParameterInfos; - item.OutboundTime = Convert.ToDateTime(item.LinedProcessFeedbackTime == null ? item.CreateDate : item.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(stock.SpecialParameterDuration)); + // 杩囨护鍑洪渶瑕佹洿鏂扮殑搴撳瓨淇℃伅 + var stocksToUpdate = stocks.Where(item => !tasks.Contains(item.PalletCode)).ToList(); + foreach (var item in stocksToUpdate) + { + // 鏇存柊搴撳瓨淇℃伅鐨勭壒瀹氬弬鏁� + item.SpecialParameterDuration = stock.SpecialParameterDuration; + item.ParameterInfos = stock.ParameterInfos; + item.OutboundTime = Convert.ToDateTime(item.LinedProcessFeedbackTime == null ? item.CreateDate : item.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(stock.SpecialParameterDuration)); + } + if (stocksToUpdate.Count > 0) + { + // 寮傛鏇存柊搴撳瓨淇℃伅 + var isUpdates = await _stockInfoRepository.UpdateDataAsync(stocksToUpdate); + } } - var isUpdates = await _stockInfoRepository.UpdateDataAsync(stocks); } // 娣诲姞鍘嗗彶浠诲姟 @@ -2067,85 +2261,95 @@ #region 浠诲姟璇锋眰鏂规硶 + private static readonly SemaphoreSlim _semaphoreUpdate = new SemaphoreSlim(1, 1); // 鏇存柊浠诲姟璐т綅 private async Task<WebResponseContent> UpdateExistingTask(RequestTaskDto input, Dt_Task task) { - if (task == null) - { - return new WebResponseContent().Error("浠诲姟瀵硅薄涓虹┖"); - } - + await _semaphoreUpdate.WaitAsync(); try { - // 鍒涘缓WebResponseContent瀵硅薄 - var content = new WebResponseContent(); - - // 鑾峰彇鐩爣鍦板潃鍜屾洿鏂颁换鍔$姸鎬� - - input.Position = Regex.Replace(input.Position, @"-(\d+)", ""); - if (Convert.ToInt32(input.Position) > 1999) + if (task == null) { - input.Position = (Convert.ToInt32(input.Position) - 1000).ToString(); + return new WebResponseContent().Error("浠诲姟瀵硅薄涓虹┖"); } - if (task.TaskType == (int)TaskInboundTypeEnum.InNG) + try { - // TODO 鏍规嵁宸烽亾鏌ユ壘瀵瑰簲NG鍙o紝鐜板湪榛樿鍘婚潤缃爢鍨涙満鐨勫紓甯稿彛璐т綅鍙� - task.CurrentAddress = input.Position; - task.TargetAddress = "002-021-000"; - task.NextAddress = "002-021-000"; - task.TaskState = (int)TaskInStatusEnum.Line_InFinish; - bool isResult = await BaseDal.UpdateDataAsync(task); - return content.OK(data: task); - } - else if (task.TaskType == (int)TaskInboundTypeEnum.InQuality) - { - var stockInfo = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == input.PalletCode); - task.CurrentAddress = input.Position; - task.TargetAddress = stockInfo.LocationInfo.LocationCode; - task.NextAddress = stockInfo.LocationInfo.LocationCode; - task.TaskState = (int)TaskInStatusEnum.Line_InFinish; - bool isResult = await BaseDal.UpdateDataAsync(task); - return content.OK(data: task); - } - else - { - var location = await GetLocationDistributeAsync(task.Roadway); - if (location == null) + // 鍒涘缓WebResponseContent瀵硅薄 + var content = new WebResponseContent(); + + // 鑾峰彇鐩爣鍦板潃鍜屾洿鏂颁换鍔$姸鎬� + + input.Position = Regex.Replace(input.Position, @"-(\d+)", ""); + if (Convert.ToInt32(input.Position) > 1999) { - return content.Error("鏃犳硶鑾峰彇璐т綅淇℃伅"); + input.Position = (Convert.ToInt32(input.Position) - 1000).ToString(); } - string toAddress = location.LocationCode; - int taskState = (int)TaskInStatusEnum.Line_InFinish; - int beforeStatus = location.LocationStatus; - // 鏇存柊璐т綅淇℃伅 - location.LocationStatus = (int)LocationEnum.Lock; - - // 鏇存柊浠诲姟淇℃伅 - MapTaskProperties(task, input, toAddress, taskState); - - // 寮�濮嬩簨鍔� - var isResult = await UpdateTaskAsync(task, location, beforeStatus); - if (!isResult) + if (task.TaskType == (int)TaskInboundTypeEnum.InNG) { - _unitOfWorkManage.RollbackTran(); - return content.Error("鏇存柊浠诲姟澶辫触"); + // TODO 鏍规嵁宸烽亾鏌ユ壘瀵瑰簲NG鍙o紝鐜板湪榛樿鍘婚潤缃爢鍨涙満鐨勫紓甯稿彛璐т綅鍙� + task.CurrentAddress = input.Position; + task.TargetAddress = "002-021-000"; + task.NextAddress = "002-021-000"; + task.TaskState = (int)TaskInStatusEnum.Line_InFinish; + bool isResult = await BaseDal.UpdateDataAsync(task); + return content.OK(data: task); } + else if (task.TaskType == (int)TaskInboundTypeEnum.InQuality) + { + var stockInfo = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == input.PalletCode); + task.CurrentAddress = input.Position; + task.TargetAddress = stockInfo.LocationInfo.LocationCode; + task.NextAddress = stockInfo.LocationInfo.LocationCode; + task.TaskState = (int)TaskInStatusEnum.Line_InFinish; + bool isResult = await BaseDal.UpdateDataAsync(task); + return content.OK(data: task); + } + else + { + var location = await GetLocationDistributeAsync(task.Roadway); + if (location == null) + { + return content.Error("鏃犳硶鑾峰彇璐т綅淇℃伅"); + } - // 鎻愪氦浜嬪姟 - _unitOfWorkManage.CommitTran(); - return content.OK(data: task); + string toAddress = location.LocationCode; + int taskState = (int)TaskInStatusEnum.Line_InFinish; + int beforeStatus = location.LocationStatus; + // 鏇存柊璐т綅淇℃伅 + location.LocationStatus = (int)LocationEnum.Lock; + + // 鏇存柊浠诲姟淇℃伅 + MapTaskProperties(task, input, toAddress, taskState); + + // 寮�濮嬩簨鍔� + var isResult = await UpdateTaskAsync(task, location, beforeStatus); + if (!isResult) + { + _unitOfWorkManage.RollbackTran(); + return content.Error("鏇存柊浠诲姟澶辫触"); + } + + // 鎻愪氦浜嬪姟 + _unitOfWorkManage.CommitTran(); + return content.OK(data: task); + } + } + catch (Exception ex) + { + // 鍥炴粴浜嬪姟 + _unitOfWorkManage.RollbackTran(); + // 杩欓噷鍙互娣诲姞鏃ュ織璁板綍 + return new WebResponseContent().Error($"鏇存柊浠诲姟鏃跺彂鐢熼敊璇�: {ex.Message}"); } } - catch (Exception ex) + catch (Exception) { - // 鍥炴粴浜嬪姟 - _unitOfWorkManage.RollbackTran(); - // 杩欓噷鍙互娣诲姞鏃ュ織璁板綍 - return new WebResponseContent().Error($"鏇存柊浠诲姟鏃跺彂鐢熼敊璇�: {ex.Message}"); + throw; } + finally { _semaphoreUpdate.Release(); } } private void MapTaskProperties(Dt_Task task, RequestTaskDto input, string toAddress, int taskState) @@ -2185,7 +2389,7 @@ /// <param name="process">宸烽亾</param> /// <param name="flag">鏍囪瘑锛�0-鍏ュ簱锛�1-绌烘墭鐩樺叆搴擄紝2-NG鍏ュ簱锛�3-鍑哄簱锛�</param> /// <returns></returns> - private async Task<WebResponseContent> CreateNewTask(RequestTaskDto input, List<string> process = null, int flag = 0) + private async Task<WebResponseContent> CreateNewTask(RequestTaskDto input, string productionLine, string processCode, List<string> process = null, int flag = 0) { WebResponseContent content = new WebResponseContent(); @@ -2213,7 +2417,9 @@ TaskState = flag == 3 ? (int)TaskOutStatusEnum.OutNew : (int)TaskInStatusEnum.InNew, TaskType = flag == 0 ? (int)TaskInboundTypeEnum.Inbound : flag == 1 ? (int)TaskInboundTypeEnum.InTray : flag == 2 ? (int)TaskInboundTypeEnum.InNG : (int)TaskOutboundTypeEnum.Outbound, TaskNum = await BaseDal.GetTaskNo(), - Creater = "Systeam" + Creater = "Systeam", + ProductionLine = productionLine, + ProcessCode = processCode }; // 灏濊瘯娣诲姞鏂颁换鍔� @@ -2242,6 +2448,7 @@ TaskState = task.TaskState.Value, Id = 0, TaskType = task.TaskType, + ProductionLine = task.ProductionLine }; content.OK(data: taskDTO); } @@ -2253,8 +2460,8 @@ return content; } - private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); + /// <summary> /// 鏌ユ壘璐т綅 /// </summary> @@ -2417,7 +2624,7 @@ ParameterDesc = parameterInfo.Description, ParameterResult = "OK", TargetValue = parameterInfo.TargetValue, - LowerLomit = parameterInfo.LowerSpecificationsLimit, + LowerLimit = parameterInfo.LowerSpecificationsLimit, UpperLimit = parameterInfo.UpperSpecificationsLimit, DefectCode = defectCode, } -- Gitblit v1.9.3