From a40c17e5dc72f668742ef60df22623ad368c8d93 Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Tue, 11 Jun 2024 22:25:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E4=B8=8A=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=87=BA=E5=BA=93=E8=87=AA=E6=A3=80=E9=94=99=E8=AF=AF=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WCS.BLL/HardWare/SmartShelf.cs | 173 +++++++++++++++++++++++++++ WCS.BLL/HardWare/SmartShelfModule.cs | 1 + WCS.BLL/Manager/WarningManager.cs | 23 +++- 3 files changed, 194 insertions(+), 3 deletions(-) diff --git a/WCS.BLL/HardWare/SmartShelf.cs b/WCS.BLL/HardWare/SmartShelf.cs index bf07030..9ee8b49 100644 --- a/WCS.BLL/HardWare/SmartShelf.cs +++ b/WCS.BLL/HardWare/SmartShelf.cs @@ -308,6 +308,179 @@ namespace WCS.BLL.HardWare }); } + /// + /// 由自检异常等错误导致的 手动操作处理后重新进入出库模式 + /// + /// + public void GoInOutstoreByWebSocket(int moduleId) + { + try + { + //找到对应的模组 + var module = Modules.Where(t => t.ModuleId == moduleId).First(); + if (module == null) + { + Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,未找到MouduleId为{moduleId}的模组", LogsType.Outstore); + return; + } + //判断删除后是否还有继续需要亮灯的情况 + if (module.CurrentOutSns == null || module.CurrentOutSns.Count == 0) + { + Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,模组【{module.ModuleCode}】,不存在需要继续出的物料,给其复位。", LogsType.Outstore); + //不需要这个模组继续亮灯了 + module.Reset(TcpCleint); + + //判断此货架是否还有出库模式的模块 + var isExistOuting = Modules.Where(t => t.CurrentMode == Mode.出库模式).Any(); + if (isExistOuting) + { + //还有继续出的就不管 + } + //这里的处理逻辑应与出库出了最后一盘料相同 + else + { + #region 继续出库进程 + Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,丢失删除的料刚好为货架需要出库的最后一盘料", LogsType.Outstore); + CurrentOutOrder = null; + + //退出出库模式 + var taskGoOut = Task.Run(() => + { + GoOutOutstore(); + }); + + //看是否是分批次出库的情况 分批次亮灯 + Task.Run(async () => + { + await Task.WhenAll(taskGoOut); + if (LocalFile.Config.IsSameMatCodeOut) + { + #region 触发下一批次的物料发料 + //查一下是否是当前发料单最后一个货架(在出库模式 同一个发料单下) + var isLastShelf = ShelfManager.Shelves + .Where(t => t.OrderNumber == OrderNumber) + .Where(t => t.CurrentMode == Mode.出库模式) + .Any(); + if (!isLastShelf) + { + Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料", LogsType.Outstore); + var outOrder = DbHelp.db.Queryable() + .Where(t => t.OrderNumber == OrderNumber) + .First(); + if (outOrder != null) + { + var outOrderMatDetails = DbHelp.db.Queryable() + .Where(t => t.OrderId == outOrder.Id) + .Where(t => t.IsSended == false) + .Includes(t => t.StoreInfo) + .ToList(); + + if (outOrderMatDetails != null && outOrderMatDetails.Count > 0) + { + //相邻物料亮不同颜色 这里绿色和蓝色互相切换 + LocalStatic.CurrentOutStoreColor = LocalStatic.CurrentOutStoreColor == (byte)0x02 ? (byte)0x04 : (byte)0x02; + + //存在待出库 然后之前又没亮灯的情况 => 继续分批次亮灯 + Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},还有物料未出!", LogsType.Outstore); + var outOrderDetailCount = outOrderMatDetails.GroupBy(t => t.MatCode) + .Select(o => new { count = o.Count(), bb = o }) + .Where(o => o.count >= 2) + .OrderByDescending(o => o.count) + .ToList(); + //相同物料存在盘数超过2的情况,亮下一个盘数多的物料 + if (outOrderDetailCount.Count > 0) + { + var matCode = outOrderDetailCount.First().bb.Key; + outOrderMatDetails = outOrderMatDetails.Where(t => t.MatCode == matCode) + .ToList(); + Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},本次亮灯物料{matCode}!", LogsType.Outstore); + } + //相同物料不存在盘数超过n的情况,剩余物料全部亮灯 + else + { + //剩余物料全出 + Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},剩余物料灯全亮!", LogsType.Outstore); + } + + var shelfIds = outOrderMatDetails.Select(t => t.StoreInfo.ShelfId) + .Distinct() + .ToList(); + var shelfs = ShelfManager.Shelves.Where(t => shelfIds.Contains(t.ShelfId)).ToList(); + + var otherModeShelfs = shelfs.Where(t => t.CurrentMode != HardWare.Mode.待机模式).ToList(); + if (otherModeShelfs != null && otherModeShelfs.Count > 0) + { + otherModeShelfs.ForEach(t => + { + t.Reset(); + }); + Thread.Sleep(1000); + } + //对应的货架对应位置 进入出库模式 亮灯 + shelfs.ForEach(shelf => + { + var matDetails = outOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode) + + .Distinct() + .ToList(); + shelf.GoInOutstore(matDetails, outOrder); + shelf.OrderNumber = outOrder.OrderNumber; + }); + } + else + { + Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},当前物料已发完!", LogsType.Outstore); + } + } + else + { + Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},OutOrder为null,肯定是有问题", LogsType.Outstore); + } + } + else + { + Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},非最后一个出库货架!", LogsType.Outstore); + var otherShelfs = ShelfManager.Shelves + .Where(t => t.OrderNumber == OrderNumber) + .Where(t => t.CurrentMode == Mode.出库模式) + .ToList(); + + otherShelfs.ForEach(shelf => + { + try + { + if (shelf is SmartShelf) + { + var smartShelf = (SmartShelf)shelf; + Logs.Write($"GoInOutstoreByModule货架【{smartShelf.ShelfCode}】待取物料{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore); + } + } + catch + { } + }); + } + #endregion + } + }); + #endregion + } + } + + else + { + //继续亮灯 + Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,模组【{module.ModuleCode}】,存在需要继续出的物料,继续亮灯。", LogsType.Outstore); + module.GoInOutStoreMode(TcpCleint, module.CurrentOutSns); + WarningLight.GreenLight(TcpCleint); + } + } + catch (Exception e) + { + Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】进入出库模式发生异常!", LogsType.Outstore); + GoOutOutstore(); + throw e; + } + } public void GoInOutstore(List MatDetails, OutOrder outOrder) { try diff --git a/WCS.BLL/HardWare/SmartShelfModule.cs b/WCS.BLL/HardWare/SmartShelfModule.cs index fcbd6f5..8f2e73d 100644 --- a/WCS.BLL/HardWare/SmartShelfModule.cs +++ b/WCS.BLL/HardWare/SmartShelfModule.cs @@ -197,6 +197,7 @@ namespace WCS.BLL.HardWare /// public void GoInOutStoreMode(TCPClient tcpClient, List outSns) { + Logs.Write($"模组{ModuleCode},本次亮灯物料{string.Join(",",outSns)}", LogsType.Outstore); CurrentOutSns = outSns; var storeInfos = DbHelp.db.Queryable().Where(t => t.ModuleId == ModuleId) .Where(t => t.BoardId == BoardId) diff --git a/WCS.BLL/Manager/WarningManager.cs b/WCS.BLL/Manager/WarningManager.cs index 1b32f1d..44d1d06 100644 --- a/WCS.BLL/Manager/WarningManager.cs +++ b/WCS.BLL/Manager/WarningManager.cs @@ -193,6 +193,7 @@ namespace WCS.BLL.Manager #region 如果是出库 删除正在出库缓存的数据 if (warning.WarningType == WarningTypeEnum.出库自检丢失) { + Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,用户点击【处理】,删除数据",LogsType.Outstore); //清掉需要出库的缓存 var shelf = ShelfManager.Shelves .Where(t => t.ShelfId == warning.ShelfId) @@ -202,8 +203,23 @@ namespace WCS.BLL.Manager var smartShelf = shelf as SmartShelf; if (smartShelf != null) { + //删除货架上缓存的那一条数据 smartShelf.CurrentOutStoreMatSNs.RemoveAll(t => t == inventoryDetail.MatSN); - //TODO 如何保证丢失的继续进行 + Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,已删除货架缓存,剩余物料为{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore); + + //删除模组上缓存的那一条数据 + var module = smartShelf.Modules.Where(t => t.ModuleId == warning.ModuleId).FirstOrDefault(); + if (module != null) { + module.CurrentOutSns.RemoveAll(t => t == inventoryDetail.MatSN); + Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,已删除模组缓存,剩余物料为{string.Join(",", module.CurrentOutSns)}", LogsType.Outstore); + } + //删除已丢失的出库明细数据 + var outOrderMatDetail = DbHelp.db.Queryable() + .Where(t => t.OrderId == smartShelf.CurrentOutOrder.Id) + .Where(t => t.MatSN == inventoryDetail.MatSN && t.IsSended == false) + .ToList(); + Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,删除出库物料明细数据{outOrderMatDetail.Count}条!"); + DbHelp.db.Deleteable(outOrderMatDetail).ExecuteCommand(); } } } @@ -248,8 +264,9 @@ namespace WCS.BLL.Manager smartShelf.WarningLight.BlueLight(smartShelf.TcpCleint); break; case Mode.出库模式: - module.GoInOutStoreMode(smartShelf.TcpCleint, module.CurrentOutSns); - smartShelf.WarningLight.GreenLight(smartShelf.TcpCleint); + //module.GoInOutStoreMode(smartShelf.TcpCleint, module.CurrentOutSns); + //smartShelf.WarningLight.GreenLight(smartShelf.TcpCleint); + smartShelf.GoInOutstoreByWebSocket(module.ModuleId); break; case Mode.待机模式: module.Reset(smartShelf.TcpCleint);