diff --git a/WCS.BLL/Manager/WarningManager.cs b/WCS.BLL/Manager/WarningManager.cs index 54fdcd1..50f8ccf 100644 --- a/WCS.BLL/Manager/WarningManager.cs +++ b/WCS.BLL/Manager/WarningManager.cs @@ -5,6 +5,7 @@ using System.Data.OscarClient; using System.Linq; using System.Text; using System.Threading.Tasks; +using WCS.BLL.Config; using WCS.BLL.DbModels; using WCS.BLL.HardWare; using WCS.DAL.Db; @@ -81,6 +82,21 @@ namespace WCS.BLL.Manager break; } } + else if (solveType == SolveTypeEnum.屏蔽库位) + { + switch (warningInManager.WarningType) + { + case WarningTypeEnum.出库自检未扫描上架: + DisableNoScan(warningInManager); + break; + case WarningTypeEnum.入库自检未扫描上架: + DisableNoScan(warningInManager); + break; + case WarningTypeEnum.自检未扫描上架: + DisableNoScan(warningInManager); + break; + } + } else if (solveType == SolveTypeEnum.忽略) { //不发指令了 @@ -143,9 +159,85 @@ namespace WCS.BLL.Manager #region 报警消除的处理 - public static void SolveNoScan(WebSocketMessageModel warning) + /// + /// 未扫描上架禁用库位 + /// + /// + public static void DisableNoScan(WebSocketMessageModel warning) { + #region 【后台】未扫描上架库位的处理 + try + { + //获取库位 + var storeInfo = DbHelp.db.Queryable() + .Where(t => t.ShelfId == warning.ShelfId) + .Where(t => t.Id == warning.StoreId) + .First(); + if (storeInfo != null) + { + storeInfo.CurrentMatSn = "禁用"; + DbHelp.db.Updateable(storeInfo).ExecuteCommand(); + if (LocalFile.Config.IsMx) + { + var DingDing = string.Empty; + MXBackgroundThread.SendDingDingMsg($"【智能货架】库位{storeInfo.StoreCode}被 {warning.SolvedUser} “未扫描上架弹窗”屏蔽,请及时调查或维保硬件!", new List { "104379", "103595" }, ref DingDing); + Logs.Write($"【智能货架】库位{storeInfo.StoreCode}被 {warning.SolvedUser} “未扫描上架弹窗”屏蔽,请及时调查或维保硬件!"); + #region 计算库位禁用率并发送 + Task.Run(() => + { + var disabledStore = DbHelp.db.Queryable() + .Where(t => t.CurrentMatSn == "禁用") + .ToList(); + var allStore = DbHelp.db.Queryable() + .ToList(); + var disabledCount = disabledStore.Count(); + var allCount = allStore.Count(); + + var disabledACount = disabledStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allACount = allStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCCount = disabledStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCCount = allStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + + var disabledModule = DbHelp.db.Queryable() + .Where(t => t.IsEnable == false) + .ToList(); + var allModule = DbHelp.db.Queryable() + .ToList(); + + var disabledModuleCount = disabledModule.Count(); + var allModuleCount = allModule.Count(); + + var disabledAModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allAModuleCount = allModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCModuleCount = allModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + var message = $"【智能货架】当前库位总数{allCount},禁用总数{disabledCount},禁用率{((double)disabledCount / allCount).ToString("P")}," + + $"其中A区库位总数{allACount},禁用数{disabledACount},禁用率{((double)disabledACount / allACount).ToString("P")}," + + $"C区库位总数{allCCount},禁用数{disabledCCount},禁用率{((double)disabledCCount / allCCount).ToString("P")}。\r\n" + + $"当前模组总数{allModuleCount},禁用总数{disabledModuleCount},禁用率{((double)disabledModuleCount / allModuleCount).ToString("P")}," + + $"其中A区模组总数{allAModuleCount},禁用数{disabledAModuleCount},禁用率{((double)disabledAModuleCount / allAModuleCount).ToString("P")}," + + $"C区模组总数{allCModuleCount},禁用数{disabledCModuleCount},禁用率{((double)disabledCModuleCount / allCModuleCount).ToString("P")}。"; + + Logs.Write(message); + var dd = string.Empty; + MXBackgroundThread.SendDingDingMsg(message, new List { "104379", "103595" }, ref dd); + }); + #endregion + } + + } + } + catch (Exception e) + { + DbHelp.db.RollbackTran(); + } + + #endregion } public static void SolveLoss(WebSocketMessageModel warning) @@ -244,6 +336,7 @@ namespace WCS.BLL.Manager #endregion } + public static void GoInRightMode(WebSocketMessageModel warning) { try diff --git a/WCS.BLL/Services/IService/IStoreInfoService.cs b/WCS.BLL/Services/IService/IStoreInfoService.cs index c61631f..a3f6141 100644 --- a/WCS.BLL/Services/IService/IStoreInfoService.cs +++ b/WCS.BLL/Services/IService/IStoreInfoService.cs @@ -73,5 +73,6 @@ namespace WCS.BLL.Services.IService /// public Task disableOrEnableStore(DisableOrEnableStoreRequest request); + public Task getDisablePercent(); } } diff --git a/WCS.BLL/Services/Service/StoreInfoService.cs b/WCS.BLL/Services/Service/StoreInfoService.cs index ec21070..d43389e 100644 --- a/WCS.BLL/Services/Service/StoreInfoService.cs +++ b/WCS.BLL/Services/Service/StoreInfoService.cs @@ -350,7 +350,55 @@ namespace WCS.BLL.Services.Service if (LocalFile.Config.IsMx) { var DingDing = string.Empty; - MXBackgroundThread.SendDingDingMsg($"【智能货架】模组{moduleInfo.ModuleCode}被屏蔽", new List { "104379", "103595" }, ref DingDing); + MXBackgroundThread.SendDingDingMsg($"【智能货架】模组{moduleInfo.ModuleCode}被屏蔽(模组管理),请及时调查或维保硬件!", new List { "104379", "103595" }, ref DingDing); + Logs.Write($"【智能货架】模组{moduleInfo.ModuleCode}被屏蔽(模组管理),请及时调查或维保硬件!"); + + #region 计算库位禁用率并发送 + Task.Run(() => + { + var disabledStore = DbHelp.db.Queryable() + .Where(t => t.CurrentMatSn == "禁用") + .ToList(); + var allStore = DbHelp.db.Queryable() + .ToList(); + + var disabledCount = disabledStore.Count(); + var allCount = allStore.Count(); + + var disabledACount = disabledStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allACount = allStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCCount = disabledStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCCount = allStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + + var disabledModule = DbHelp.db.Queryable() + .Where(t => t.IsEnable == false) + .ToList(); + var allModule = DbHelp.db.Queryable() + .ToList(); + + var disabledModuleCount = disabledModule.Count(); + var allModuleCount = allModule.Count(); + + var disabledAModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allAModuleCount = allModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCModuleCount = allModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + var message = $"【智能货架】当前库位总数{allCount},禁用总数{disabledCount},禁用率{((double)disabledCount / allCount).ToString("P")}," + + $"其中A区库位总数{allACount},禁用数{disabledACount},禁用率{((double)disabledACount / allACount).ToString("P")}," + + $"C区库位总数{allCCount},禁用数{disabledCCount},禁用率{((double)disabledCCount / allCCount).ToString("P")}。\r\n" + + $"当前模组总数{allModuleCount},禁用总数{disabledModuleCount},禁用率{((double)disabledModuleCount / allModuleCount).ToString("P")}," + + $"其中A区模组总数{allAModuleCount},禁用数{disabledAModuleCount},禁用率{((double)disabledAModuleCount / allAModuleCount).ToString("P")}," + + $"C区模组总数{allCModuleCount},禁用数{disabledCModuleCount},禁用率{((double)disabledCModuleCount / allCModuleCount).ToString("P")}。"; + + Logs.Write(message); + var dd = string.Empty; + MXBackgroundThread.SendDingDingMsg(message, new List { "104379", "103595" }, ref dd); + }); + #endregion } } else @@ -552,7 +600,56 @@ namespace WCS.BLL.Services.Service if (LocalFile.Config.IsMx) { var DingDing = string.Empty; - MXBackgroundThread.SendDingDingMsg($"【智能货架】库位{storeInfo.StoreCode}被屏蔽", new List { "104379", "103595" }, ref DingDing); + MXBackgroundThread.SendDingDingMsg($"【智能货架】库位{storeInfo.StoreCode}被屏蔽(库位管理),请及时调查或维保硬件!", new List { "104379", "103595" }, ref DingDing); + Logs.Write($"【智能货架】库位{storeInfo.StoreCode}被屏蔽(库位管理),请及时调查或维保硬件!"); + + #region 计算库位禁用率并发送 + Task.Run(() => + { + var disabledStore = DbHelp.db.Queryable() + .Where(t => t.CurrentMatSn == "禁用") + .ToList(); + var allStore = DbHelp.db.Queryable() + .ToList(); + + var disabledCount = disabledStore.Count(); + var allCount = allStore.Count(); + + var disabledACount = disabledStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allACount = allStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCCount = disabledStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCCount = allStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + + var disabledModule = DbHelp.db.Queryable() + .Where(t => t.IsEnable == false) + .ToList(); + var allModule = DbHelp.db.Queryable() + .ToList(); + + var disabledModuleCount = disabledModule.Count(); + var allModuleCount = allModule.Count(); + + var disabledAModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allAModuleCount = allModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCModuleCount = allModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + var message = $"【智能货架】当前库位总数{allCount},禁用总数{disabledCount},禁用率{((double)disabledCount / allCount).ToString("P")}," + + $"其中A区库位总数{allACount},禁用数{disabledACount},禁用率{((double)disabledACount / allACount).ToString("P")}," + + $"C区库位总数{allCCount},禁用数{disabledCCount},禁用率{((double)disabledCCount / allCCount).ToString("P")}。\r\n" + + $"当前模组总数{allModuleCount},禁用总数{disabledModuleCount},禁用率{((double)disabledModuleCount / allModuleCount).ToString("P")}," + + $"其中A区模组总数{allAModuleCount},禁用数{disabledAModuleCount},禁用率{((double)disabledAModuleCount / allAModuleCount).ToString("P")}," + + $"C区模组总数{allCModuleCount},禁用数{disabledCModuleCount},禁用率{((double)disabledCModuleCount / allCModuleCount).ToString("P")}。"; + + Logs.Write(message); + + var dd = string.Empty; + MXBackgroundThread.SendDingDingMsg(message, new List { "104379", "103595" }, ref dd); + }); + #endregion } //库位 @@ -618,6 +715,74 @@ namespace WCS.BLL.Services.Service } } + public async Task getDisablePercent() + { + try + { + #region 计算库位禁用率 + var disabledStore = DbHelp.db.Queryable() + .Where(t => t.CurrentMatSn == "禁用") + .ToList(); + var allStore = DbHelp.db.Queryable() + .ToList(); + + var disabledCount = disabledStore.Count(); + var allCount = allStore.Count(); + + var disabledACount = disabledStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allACount = allStore.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCCount = disabledStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCCount = allStore.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + + var disabledModule = DbHelp.db.Queryable() + .Where(t => t.IsEnable == false) + .ToList(); + var allModule = DbHelp.db.Queryable() + .ToList(); + + var disabledModuleCount = disabledModule.Count(); + var allModuleCount = allModule.Count(); + + var disabledAModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + var allAModuleCount = allModule.Where(t => t.ShelfCode.Contains("A")).ToList().Count(); + + var disabledCModuleCount = disabledModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + var allCModuleCount = allModule.Where(t => t.ShelfCode.Contains("C")).ToList().Count(); + + var message = $"【智能货架】当前库位总数{allCount},禁用总数{disabledCount},禁用率{((double)disabledCount / allCount).ToString("P")}," + + $"其中A区库位总数{allACount},禁用数{disabledACount},禁用率{((double)disabledACount / allACount).ToString("P")}," + + $"C区库位总数{allCCount},禁用数{disabledCCount},禁用率{((double)disabledCCount / allCCount).ToString("P")}。\r\n" + + $"当前模组总数{allModuleCount},禁用总数{disabledModuleCount},禁用率{((double)disabledModuleCount / allModuleCount).ToString("P")}," + + $"其中A区模组总数{allAModuleCount},禁用数{disabledAModuleCount},禁用率{((double)disabledAModuleCount / allAModuleCount).ToString("P")}," + + $"C区模组总数{allCModuleCount},禁用数{disabledCModuleCount},禁用率{((double)disabledCModuleCount / allCModuleCount).ToString("P")}。"; + #endregion + + //非盟讯公司的展示 + if (LocalFile.Config.IsMx == false) + { + message = $"【智能货架】当前库位总数{allCount},禁用总数{disabledCount},禁用率{((double)disabledCount / allCount).ToString("P")}。"; + } + + return new ResponseCommon() + { + Code = 200, + Message = $"Success", + Data = message , + }; + } + catch (Exception ex) + { + DbHelp.db.RollbackTran(); + return new ResponseCommon() + { + Code = 300, + Message = $"操作失败:异常{ex.Message}!" + }; + } + } + #endregion } } diff --git a/WCS.Model/WebSocketModel/SolveWarningRequesr.cs b/WCS.Model/WebSocketModel/SolveWarningRequesr.cs index 7b97545..988cfe2 100644 --- a/WCS.Model/WebSocketModel/SolveWarningRequesr.cs +++ b/WCS.Model/WebSocketModel/SolveWarningRequesr.cs @@ -14,5 +14,6 @@ namespace WCS.Model.WebSocketModel { 处理 = 0, 忽略 = 1, + 屏蔽库位 = 2, } } diff --git a/WCS.WebApi/Controllers/StoreInfoController.cs b/WCS.WebApi/Controllers/StoreInfoController.cs index ed41590..f4a8fa1 100644 --- a/WCS.WebApi/Controllers/StoreInfoController.cs +++ b/WCS.WebApi/Controllers/StoreInfoController.cs @@ -89,6 +89,13 @@ namespace WCS.WebApi.Controllers { return await _storeInfoService.disableOrEnableStore(request); } + + [Route("getDisablePercent")] + [HttpPost(Name = "getDisablePercent")] + public async Task getDisablePercent(DisableOrEnableStoreRequest request) + { + return await _storeInfoService.getDisablePercent(); + } #endregion } } diff --git a/货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs b/货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs index e305e49..8a105ed 100644 --- a/货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs +++ b/货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs @@ -102,7 +102,9 @@ namespace 智能仓储WCS管理系统.ViewModel } else if (Result != null && Result.Code == 200 && (Result.Data == null || Result.Data.Lists == null || Result.Data.Lists.Count == 0)) { - MessageBox.Show($"未查询到领料明细!所推荐物料在此货架上不存在,请确认是否在其他货架上!\r\n{string.Join(",\r\n", matSns)}"); + var content = $"MES/WMS系统按先进先出推荐物料条码在此货架上不存在,请确认物料是否在其他货架(B区)上!或者确认是否是物料上架后丢失(复制物料条码后在[出入记录]功能中通过物料SN查询确认是否丢失,如果确认是此货架上丢失,重新上架再次进行出库操作),具体条码如下:\r\n{string.Join(",\r\n", matSns)}"; + //MessageBox.Show($"未查询到领料明细!所推荐物料在此货架上不存在,请确认是否在其他货架上!或者是否已经丢失?(复制物料条码后在[出入记录]功能中即可查询)\r\n{string.Join(",\r\n", matSns)}"); + TipView.Show(content, "提示", true); DataGridItemSource = null; } else @@ -120,12 +122,12 @@ namespace 智能仓储WCS管理系统.ViewModel } else if (result != null && result.code == 200 && (result.data == null || result.data.Count == 0)) { - Growl.Warning("未查询到物料明细!MES推荐物料明细为空!"); + Growl.Warning("未查询到物料明细!MES推荐物料明细为空!请确认该单据是否已发或咨询MES系统相关负责人!"); DataGridItemSource = null; } else { - Growl.Warning("未查询到领料明细!请求MES接口失败!"); + Growl.Warning("未查询到领料明细!请求MES接口失败!请确认该单据是否已发或咨询MES系统相关负责人!"); DataGridItemSource = null; } }); diff --git a/货架标准上位机/ViewModels/StoreInfoViewModel.cs b/货架标准上位机/ViewModels/StoreInfoViewModel.cs index 121f2b5..0df820e 100644 --- a/货架标准上位机/ViewModels/StoreInfoViewModel.cs +++ b/货架标准上位机/ViewModels/StoreInfoViewModel.cs @@ -230,6 +230,37 @@ namespace 智能仓储WCS管理系统.ViewModel } #endregion } + + + public ICommand BtnDisablePercentCommand { get => new DelegateCommand(DisablePercent); } + public void DisablePercent() + { + #region 调用接口 获取屏蔽率 + try + { + var body = new DisableOrEnableStoreRequest() + { + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "storeInfo/getDisablePercent", body, "POST"); + if (Result != null && Result.Code == 200) + { + HandyControl.Controls.MessageBox.Show(Result.Data.ToString()); + } + else if (Result != null) + { + Growl.Warning(Result.Message); + } + else + { + Growl.Warning("操作失败:请重试!"); + } + } + catch (Exception ex) + { + Growl.Error("操作失败:" + ex.Message); + } + #endregion + } #endregion #region PageOperation 分页操作 diff --git a/货架标准上位机/Views/StoreInfoView.xaml b/货架标准上位机/Views/StoreInfoView.xaml index c1dff3c..68eb77b 100644 --- a/货架标准上位机/Views/StoreInfoView.xaml +++ b/货架标准上位机/Views/StoreInfoView.xaml @@ -67,6 +67,11 @@ Grid.Column="9" MinHeight="40" FontSize="18" Content=" 重置" FontFamily="{StaticResource IconFont}" Command="{Binding BtnResetCommand}"> + + diff --git a/货架标准上位机/Views/Windows/TipView.xaml b/货架标准上位机/Views/Windows/TipView.xaml index a41e5f4..d08fca5 100644 --- a/货架标准上位机/Views/Windows/TipView.xaml +++ b/货架标准上位机/Views/Windows/TipView.xaml @@ -32,7 +32,7 @@