From 6933a10119105bd0cb6f7d3c1c4ead630179e8b7 Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Mon, 22 Jul 2024 17:33:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WCS.BLL/DbModels/InOutRecord.cs | 2 +- WCS.BLL/DbModels/StockTakingOrder.cs | 6 + WCS.BLL/HardWare/SmartShelf.cs | 342 +++++++++--------- WCS.BLL/Manager/MXBackgroundThread.cs | 7 +- WCS.BLL/Manager/TCPClientManager.cs | 19 +- WCS.BLL/Manager/WarningManager.cs | 28 +- .../Service/InterfaceRecordService.cs | 6 +- .../Service/MatInventoryDetailService.cs | 3 +- WCS.BLL/Services/Service/OutstoreService.cs | 3 +- .../Services/Service/StockTakingService.cs | 33 +- WCS.BLL/Tool/Logs.cs | 4 + WCS.BLL/Tool/TCPClient.cs | 5 +- 货架标准上位机/App.xaml.cs | 2 +- 货架标准上位机/Fonts/iconfont.ttf | Bin 16272 -> 23308 bytes 货架标准上位机/Models/JsConfig.cs | 2 + 货架标准上位机/Resources/主页.png | Bin 1726 -> 1761 bytes 货架标准上位机/Resources/入库.png | Bin 0 -> 1485 bytes 货架标准上位机/Resources/出库.png | Bin 0 -> 1327 bytes 货架标准上位机/Resources/数据.png | Bin 1975 -> 0 bytes 货架标准上位机/Resources/权限.png | Bin 2223 -> 2398 bytes 货架标准上位机/Resources/查询.png | Bin 0 -> 1637 bytes 货架标准上位机/Resources/模式.png | Bin 610 -> 0 bytes 货架标准上位机/Resources/物料.png | Bin 0 -> 1993 bytes 货架标准上位机/Resources/盘点.png | Bin 0 -> 1629 bytes 货架标准上位机/Resources/设置.png | Bin 3196 -> 0 bytes 货架标准上位机/Resources/调试.png | Bin 0 -> 1811 bytes 货架标准上位机/Resources/货架.png | Bin 0 -> 839 bytes .../ViewModels/InOutRecordViewModel.cs | 6 +- .../ViewModels/InterfaceRecordViewModel.cs | 6 +- .../ViewModels/MXViewModel/MXPDViewModel.cs | 2 +- .../ViewModels/MatBaseInfoViewModel.cs | 6 +- 货架标准上位机/ViewModels/MatInfoViewModel.cs | 6 +- .../ViewModels/MatInventoryDetailViewModel.cs | 23 +- .../ViewModels/ModuleInfoViewModel.cs | 6 +- .../ViewModels/OutInventoryDocumentViewModel.cs | 6 +- .../ViewModels/OutInventoryViewModel.cs | 3 +- .../ViewModels/ShelfInfoViewModel.cs | 6 +- .../ViewModels/StocktakingDocumentViewModel.cs | 7 +- .../ViewModels/StocktakingViewModel.cs | 14 +- .../ViewModels/StoreInfoViewModel.cs | 6 +- 货架标准上位机/Views/HomeView.xaml | 16 +- .../Views/MXWindows/MXOutInventoryView.xaml | 2 - .../Views/MainWindows/MainWindow2.xaml | 250 ++++++++++--- .../Views/MatInventoryDetailView.xaml | 7 +- 货架标准上位机/Views/StockTakingView.xaml | 2 +- .../Views/Windows/UserLoginView.xaml.cs | 7 +- 货架标准上位机/data/jsconfig.json | 4 +- 货架标准上位机/货架标准上位机 - Backup.csproj | 141 ++++++++ 货架标准上位机/货架标准上位机.csproj | 262 +++++++------- 49 files changed, 847 insertions(+), 403 deletions(-) create mode 100644 货架标准上位机/Resources/入库.png create mode 100644 货架标准上位机/Resources/出库.png delete mode 100644 货架标准上位机/Resources/数据.png create mode 100644 货架标准上位机/Resources/查询.png delete mode 100644 货架标准上位机/Resources/模式.png create mode 100644 货架标准上位机/Resources/物料.png create mode 100644 货架标准上位机/Resources/盘点.png delete mode 100644 货架标准上位机/Resources/设置.png create mode 100644 货架标准上位机/Resources/调试.png create mode 100644 货架标准上位机/Resources/货架.png create mode 100644 货架标准上位机/货架标准上位机 - Backup.csproj diff --git a/WCS.BLL/DbModels/InOutRecord.cs b/WCS.BLL/DbModels/InOutRecord.cs index 080816f..253d1ef 100644 --- a/WCS.BLL/DbModels/InOutRecord.cs +++ b/WCS.BLL/DbModels/InOutRecord.cs @@ -140,7 +140,7 @@ namespace WCS.BLL.DbModels /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架) /// [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")] - public string GroupName { get; set; } + public string GroupName { get; set; } = string.Empty; /// /// 序号 diff --git a/WCS.BLL/DbModels/StockTakingOrder.cs b/WCS.BLL/DbModels/StockTakingOrder.cs index ccd2e36..07757b8 100644 --- a/WCS.BLL/DbModels/StockTakingOrder.cs +++ b/WCS.BLL/DbModels/StockTakingOrder.cs @@ -56,6 +56,12 @@ namespace WCS.BLL.DbModels [SugarColumn(ColumnName = "update_time", IsNullable = false, ColumnDescription = "更新时间")] public DateTime UpdateTime { get; set; } = DateTime.Now; + /// + /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架) + /// + [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = true, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")] + public string GroupName { get; set; } = string.Empty; + /// /// 序号 /// diff --git a/WCS.BLL/HardWare/SmartShelf.cs b/WCS.BLL/HardWare/SmartShelf.cs index 4c02971..73f0295 100644 --- a/WCS.BLL/HardWare/SmartShelf.cs +++ b/WCS.BLL/HardWare/SmartShelf.cs @@ -23,7 +23,6 @@ namespace WCS.BLL.HardWare ShelfCode = shelfInfo.ShelfCode; RowCounts = shelfInfo.Rowcounts; ColumnCounts = shelfInfo.Columncounts; - //CurrentMode = shelfInfo.CurrentMode; SetCurrentMode(Mode.待机模式); ClientIp = shelfInfo.ClientIp; LightId = shelfInfo.LightId; @@ -326,6 +325,7 @@ namespace WCS.BLL.HardWare { try { + Logs.Write("GoInOutstoreByWebSocket", LogsType.Outstore); //找到对应的模组 var module = Modules.Where(t => t.ModuleId == moduleId).First(); if (module == null) @@ -341,16 +341,12 @@ namespace WCS.BLL.HardWare module.Reset(TcpCleint); //判断此货架是否还有出库模式的模块 - var isExistOuting = Modules.Where(t => t.CurrentMode == Mode.出库模式).Any(); - if (isExistOuting) + #region 判断是否退出入库 是否亮下一次灯逻辑 + var isExsistOut = CurrentOutStoreMatSNs.Any(); + //本次亮灯的物料已全部取出 + if (!isExsistOut) { - //还有继续出的就不管 - } - //这里的处理逻辑应与出库出了最后一盘料相同 - else - { - #region 继续出库进程 - Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,丢失删除的料刚好为货架需要出库的最后一盘料", LogsType.Outstore); + Logs.Write($"货架【{ShelfCode}】,本次亮灯的物料已全部取出", LogsType.Outstore); CurrentOutOrder = null; //退出出库模式 @@ -373,9 +369,10 @@ namespace WCS.BLL.HardWare .Any(); if (!isLastShelf) { - Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料", LogsType.Outstore); + Logs.Write($"发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料", LogsType.Outstore); var outOrder = DbHelp.db.Queryable() .Where(t => t.OrderNumber == OrderNumber) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName) .First(); if (outOrder != null) { @@ -391,7 +388,7 @@ namespace WCS.BLL.HardWare LocalStatic.CurrentOutStoreColor = LocalStatic.CurrentOutStoreColor == (byte)0x02 ? (byte)0x04 : (byte)0x02; //存在待出库 然后之前又没亮灯的情况 => 继续分批次亮灯 - Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},还有物料未出!", LogsType.Outstore); + Logs.Write($"发料单{OrderNumber},还有物料未出!", LogsType.Outstore); var outOrderDetailCount = outOrderMatDetails.GroupBy(t => t.MatCode) .Select(o => new { count = o.Count(), bb = o }) .Where(o => o.count >= 2) @@ -403,13 +400,13 @@ namespace WCS.BLL.HardWare var matCode = outOrderDetailCount.First().bb.Key; outOrderMatDetails = outOrderMatDetails.Where(t => t.MatCode == matCode) .ToList(); - Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},本次亮灯物料{matCode}!", LogsType.Outstore); + Logs.Write($"发料单{OrderNumber},本次亮灯物料{matCode}!", LogsType.Outstore); } //相同物料不存在盘数超过n的情况,剩余物料全部亮灯 else { //剩余物料全出 - Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},剩余所有物料灯全亮(发送命令)!", LogsType.Outstore); + Logs.Write($"发料单{OrderNumber},剩余所有物料灯全亮(发送命令)!", LogsType.Outstore); } var shelfIds = outOrderMatDetails.Select(t => t.StoreInfo.ShelfId) @@ -430,7 +427,6 @@ namespace WCS.BLL.HardWare shelfs.ForEach(shelf => { var matDetails = outOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode) - .Distinct() .ToList(); shelf.GoInOutstore(matDetails, outOrder, OutOperateUser); @@ -439,17 +435,45 @@ namespace WCS.BLL.HardWare } else { - Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},当前物料已发完!", LogsType.Outstore); + #region 当前单据物料已发完 + Logs.Write($"发料单{OrderNumber},当前物料已发完!", LogsType.Outstore); + //清空发料单缓存 + var outingShelfs = ShelfManager.Shelves.Where(t => t.OrderNumber == OrderNumber).ToList(); + outingShelfs.ForEach(t => + { + t.OrderNumber = string.Empty; + }); + + Task.Run(() => + { + //判断是否是当前订单最后一个出库货架 + var isOuting = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber) + .Any(); + //WebSocket通知前台以更新左侧出库单列表的状态 + if (!isOuting) + { + #region WebSocket + var messageMode = new WebSocketMessageModel() + { + IsWarning = false, + ClientIp = WebSocketIpAddress, + WarningType = WarningTypeEnum.通知刷新出库单列表, + }; + WarningManager.SendWarning(messageMode); + #endregion + } + }); + #endregion } } else { - Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},OutOrder为null,肯定是有问题", LogsType.Outstore); + Logs.Write($"发料单{OrderNumber},OutOrder为null,肯定是有问题", LogsType.Outstore); } } else { - Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},非最后一个出库货架!", LogsType.Outstore); + Logs.Write($"发料单{OrderNumber},非最后一个出库货架!", LogsType.Outstore); var otherShelfs = ShelfManager.Shelves .Where(t => t.OrderNumber == OrderNumber) .Where(t => t.CurrentMode == Mode.出库模式) @@ -462,7 +486,7 @@ namespace WCS.BLL.HardWare if (shelf is SmartShelf) { var smartShelf = (SmartShelf)shelf; - Logs.Write($"GoInOutstoreByModule货架【{smartShelf.ShelfCode}】待取物料{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore); + Logs.Write($"货架【{smartShelf.ShelfCode}】待取物料{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore); } } catch @@ -471,17 +495,50 @@ namespace WCS.BLL.HardWare } #endregion } - }); - #endregion - } - } + else + { + #region 当前单据物料已发完 + Logs.Write($"发料单{OrderNumber},当前物料已发完!", LogsType.Outstore); + //清空发料单缓存 + var outingShelfs = ShelfManager.Shelves.Where(t => t.OrderNumber == OrderNumber).ToList(); + outingShelfs.ForEach(t => + { + t.OrderNumber = string.Empty; + }); + Task.Run(() => + { + //判断是否是当前订单最后一个出库货架 + var isOuting = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber) + .Any(); + //WebSocket通知前台以更新左侧出库单列表的状态 + if (!isOuting) + { + #region WebSocket + var messageMode = new WebSocketMessageModel() + { + IsWarning = false, + ClientIp = WebSocketIpAddress, + WarningType = WarningTypeEnum.通知刷新出库单列表, + }; + WarningManager.SendWarning(messageMode); + #endregion + } + }); + #endregion + } + }); + } + #endregion + } else { //继续亮灯 Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,模组【{module.ModuleCode}】,存在需要继续出的物料,继续亮灯。", LogsType.Outstore); module.GoInOutStoreMode(TcpCleint, module.CurrentOutSns); + Thread.Sleep(20); WarningLight.GreenLight(TcpCleint); + Logs.Write("GoInOutstoreByWebSocket", LogsType.Outstore); } } catch (Exception e) @@ -528,6 +585,7 @@ namespace WCS.BLL.HardWare .Select(mat => mat.MatSN) .ToList(); t.GoInOutStoreMode(TcpCleint, outMatSns); + Thread.Sleep(20);//出库每块板子之间增加15ms的间隔 }); //所有板子亮灯后 亮警示灯 WarningLight.GreenLight(TcpCleint); @@ -637,25 +695,25 @@ namespace WCS.BLL.HardWare SetCurrentMode(Mode.待机模式); Logs.Write($"货架【{ShelfCode}】,结束退出出库", LogsType.Outstore); - Task.Run(() => - { - //判断是否是当前订单最后一个出库货架 - var isOuting = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber) - .Any(); - //WebSocket通知前台以更新左侧出库单列表的状态 - if (!isOuting) - { - #region WebSocket - var messageMode = new WebSocketMessageModel() - { - IsWarning = false, - ClientIp = WebSocketIpAddress, - WarningType = WarningTypeEnum.通知刷新出库单列表, - }; - WarningManager.SendWarning(messageMode); - #endregion - } - }); + //Task.Run(() => + //{ + // //判断是否是当前订单最后一个出库货架 + // var isOuting = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber) + // .Any(); + // //WebSocket通知前台以更新左侧出库单列表的状态 + // if (!isOuting) + // { + // #region WebSocket + // var messageMode = new WebSocketMessageModel() + // { + // IsWarning = false, + // ClientIp = WebSocketIpAddress, + // WarningType = WarningTypeEnum.通知刷新出库单列表, + // }; + // WarningManager.SendWarning(messageMode); + // #endregion + // } + //}); } catch (Exception ex) { @@ -773,17 +831,7 @@ namespace WCS.BLL.HardWare //报警灯闪一下 WarningLight.SuccessLightGreenEnd(TcpCleint); - //通知前台刷新 - Task.Run(() => - { - var messageMode = new WebSocketMessageModel() - { - IsWarning = false, - ClientIp = WebSocketIpAddress, - WarningType = WarningTypeEnum.通知刷新盘点 - }; - WarningManager.SendWarning(messageMode); - }); + return true; } @@ -1133,48 +1181,6 @@ namespace WCS.BLL.HardWare ExceptionMessages.Add($"{storeInfo.StoreCode}物料{storeInfo.CurrentMatSn}丢失,库存数据已删除,请重新扫码后入库"); #endregion - //#region 【后台】丢失的数据处理 - //Task.Run(() => - //{ - // try - // { - // DbHelp.db.BeginTran(); - // //库位表字段清空 - // storeInfo.CurrentMatSn = string.Empty; - // DbHelp.db.Updateable(storeInfo).ExecuteCommand(); - - // //库存表记录删除、插入出入记录 - // var inventoryDetail = DbHelp.db.Queryable().Where(t => t.StoreId == storeInfo.Id).First(); - // if (inventoryDetail != null) - // { - // var inOutRecord = new MatInventoryDetailService() - // { - // StoreCode = storeInfo.StoreCode, - // StoreId = storeInfo.Id, - // StoreInfo = storeInfo, - - // MatSN = inventoryDetail.MatSN, - // MatCode = inventoryDetail.MatCode, - // MatName = inventoryDetail.MatName, - // MatBatch = inventoryDetail.MatBatch, - // MatQty = inventoryDetail.MatQty, - // MatSpec = inventoryDetail.MatSpec, - // MatCustomer = inventoryDetail.MatCustomer, - // MatSupplier = inventoryDetail.MatSupplier, - - // Direction = DirectionEnum.丢失, - // }; - // DbHelp.db.Insertable(inOutRecord).ExecuteCommand(); - // DbHelp.db.Deleteable(inventoryDetail).ExecuteCommand(); - // } - // DbHelp.db.CommitTran(); - // } - // catch (Exception e) - // { - // DbHelp.db.RollbackTran(); - // } - //}); - //#endregion #region 不处理、WebSocket通知前台 var exceptionMessage = storeInfo.StoreCode + $"进入入库自检发现物料{storeInfo.CurrentMatSn}丢失,请确认是否删除?"; var warningModel = new WebSocketMessageModel() @@ -1728,11 +1734,11 @@ namespace WCS.BLL.HardWare return; } - #region 校验项通过 处理出库逻辑 //当前库位的SN var matSN = storeInfo.CurrentMatSn; try { + #region 校验项通过 处理出库逻辑 DbHelp.db.BeginTran(); //库存明细表 删除 ; @@ -1759,6 +1765,7 @@ namespace WCS.BLL.HardWare MatSupplier = inventoryDetail.MatSupplier, OrderNumber = orderMatDetails.OrderNumber, + OperateUser = OutOperateUser, Direction = orderMatDetails.IsMXPD == false ? DirectionEnum.出库 : DirectionEnum.盘点下架, }; //库位表 修改 @@ -1793,7 +1800,7 @@ namespace WCS.BLL.HardWare //确认本次出库 module.ComfirmOutstore(TcpCleint, data[TcpCleint.PreFixLength + 3]); - //更新时间 避免被自动退出 + //更新时间 避免超时被自动退出 Task.Run(() => { var shelves = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber).ToList(); @@ -1803,14 +1810,13 @@ namespace WCS.BLL.HardWare } }); - //当前柜子是否还存在未出库的 Logs.Write($"货架【{ShelfCode}】,用户取出物料{matSN}", LogsType.Outstore); CurrentOutStoreMatSNs.RemoveAll(t => t == matSN);//删除本次已出的物料SN Logs.Write($"货架【{ShelfCode}】,当前货架剩余物料{string.Join(",", CurrentOutStoreMatSNs)}", LogsType.Outstore); + #endregion - var isExsistOut = CurrentOutStoreMatSNs.Any(); - + #region 刷新出库明细逻辑 var tempOrder = CurrentOutOrder; var isMXPD = orderMatDetails.IsMXPD == true; //通知前台刷新 @@ -1818,7 +1824,6 @@ namespace WCS.BLL.HardWare { //更新订单状态 UpdateOutOrderStatus(tempOrder); - var messageMode = new WebSocketMessageModel() { IsWarning = false, @@ -1827,7 +1832,10 @@ namespace WCS.BLL.HardWare }; WarningManager.SendWarning(messageMode); }); + #endregion + #region 判断是否退出入库 是否亮下一次灯逻辑 + var isExsistOut = CurrentOutStoreMatSNs.Any(); //本次亮灯的物料已全部取出 if (!isExsistOut) { @@ -1857,6 +1865,7 @@ namespace WCS.BLL.HardWare Logs.Write($"发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料", LogsType.Outstore); var outOrder = DbHelp.db.Queryable() .Where(t => t.OrderNumber == OrderNumber) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName) .First(); if (outOrder != null) { @@ -1911,7 +1920,6 @@ namespace WCS.BLL.HardWare shelfs.ForEach(shelf => { var matDetails = outOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode) - .Distinct() .ToList(); shelf.GoInOutstore(matDetails, outOrder, OutOperateUser); @@ -1921,6 +1929,32 @@ namespace WCS.BLL.HardWare else { Logs.Write($"发料单{OrderNumber},当前物料已发完!", LogsType.Outstore); + //清空发料单缓存 + var outingShelfs = ShelfManager.Shelves.Where(t => t.OrderNumber == OrderNumber).ToList(); + outingShelfs.ForEach(t => + { + t.OrderNumber = string.Empty; + }); + + Task.Run(() => + { + //判断是否是当前订单最后一个出库货架 + var isOuting = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber) + .Any(); + //WebSocket通知前台以更新左侧出库单列表的状态 + if (!isOuting) + { + #region WebSocket + var messageMode = new WebSocketMessageModel() + { + IsWarning = false, + ClientIp = WebSocketIpAddress, + WarningType = WarningTypeEnum.通知刷新出库单列表, + }; + WarningManager.SendWarning(messageMode); + #endregion + } + }); } } else @@ -1952,9 +1986,38 @@ namespace WCS.BLL.HardWare } #endregion } + else + { + //清空发料单缓存 + var outingShelfs = ShelfManager.Shelves.Where(t => t.OrderNumber == OrderNumber).ToList(); + outingShelfs.ForEach(t => + { + t.OrderNumber = string.Empty; + }); + + Task.Run(() => + { + //判断是否是当前订单最后一个出库货架 + var isOuting = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber) + .Any(); + //WebSocket通知前台以更新左侧出库单列表的状态 + if (!isOuting) + { + #region WebSocket + var messageMode = new WebSocketMessageModel() + { + IsWarning = false, + ClientIp = WebSocketIpAddress, + WarningType = WarningTypeEnum.通知刷新出库单列表, + }; + WarningManager.SendWarning(messageMode); + #endregion + } + }); + } }); } - + #endregion } catch (Exception ex) @@ -1963,7 +2026,6 @@ namespace WCS.BLL.HardWare //报警灯报警 WarningLight.WaringLightAlwaysRed(TcpCleint); } - #endregion } public void UpdateOutOrderStatus(OutOrder order) @@ -2047,7 +2109,7 @@ namespace WCS.BLL.HardWare .First(); if (storeInfo == null) { - //TO DO 库位未找到 + Logs.Write($"[OutstoreExceptionReturnProcess]boardId{boardId};lightNumber{lightNumber}库位未找到!", LogsType.Outstore); return; } //已放物料丢失了 物料多放了 储位恢复正常 @@ -2077,6 +2139,7 @@ namespace WCS.BLL.HardWare //自动消除本地缓存的报警 warnings.ForEach(warning => { + Logs.Write($"ClearWarning,{warning.Guid}", LogsType.Outstore); WarningManager.ClearWarning(warning, SolveTypeEnum.忽略); }); ProcessingExceptions.RemoveAll(t => t.BoardId == boardId); @@ -2090,8 +2153,6 @@ namespace WCS.BLL.HardWare WarningType = WarningTypeEnum.出库中未扫描上架, StoreId = storeInfo.Id, StoreCode = storeInfo.StoreCode, - //ModuleId = module.ModuleId, - //ModuleCode = module.ModuleCode, ShelfCode = ShelfCode, ShelfId = ShelfId, WarningMessage = exceptionMessage, @@ -2305,7 +2366,6 @@ namespace WCS.BLL.HardWare var storeInfo = storeInfos.Where(t => t.LightNumber == index + 1).First(); if (storeInfo != null) { - #region 不处理、WebSocket通知前台 var exceptionMessage = storeInfo.StoreCode + $"自检发现物料{storeInfo.CurrentMatSn}丢失,请确认是否删除?"; var warningModel = new WebSocketMessageModel() @@ -2323,58 +2383,10 @@ namespace WCS.BLL.HardWare WarningManager.SendWarning(warningModel); #endregion - //#region 【后台】丢失的数据处理 - //Task.Run(() => - //{ - // try - // { - // DbHelp.db.BeginTran(); - // //库位表字段清空 - // storeInfo.CurrentMatSN = string.Empty; - // DbHelp.db.Updateable(storeInfo).ExecuteCommand(); - // //库存表记录删除、插入出入记录 - // var inventoryDetail = DbHelp.db.Queryable().Where(t => t.StoreCode == storeInfo.StoreCode).First(); - // if (inventoryDetail != null) - // { - // var inOutRecord = new InOutRecord() - // { - // StoreCode = storeInfo.StoreCode, - // StoreId = storeInfo.Id, - // StoreInfo = storeInfo, - - // R = storeInfo.R, - // C = storeInfo.C, - // Wei = storeInfo.Wei, - // WarehouseCode = inventoryDetail.WarehouseCode, - - // MatSN = inventoryDetail.MatSN, - // MatCode = inventoryDetail.MatCode, - // MatName = inventoryDetail.MatName, - // MatBatch = inventoryDetail.MatBatch, - // MatQty = inventoryDetail.MatQty, - // MatSpec = inventoryDetail.MatSpec, - - // OrderNumber = inventoryDetail.OrderNumber, - // OrderProdNumber = inventoryDetail.OrderProdNumber, - // OrderMaterialCode = inventoryDetail.OrderMaterialCode, - // OrderMaterialName = inventoryDetail.OrderMaterialName, - // OrderMaterialSpec = inventoryDetail.OrderMaterialSpec, - - // GroupName = LocalFile.Config.GroupName, - - // Direction = DirectionEnum.丢失, - // }; - // DbHelp.db.Insertable(inOutRecord).ExecuteCommand(); - // DbHelp.db.Deleteable(inventoryDetail).ExecuteCommand(); - // } - // DbHelp.db.CommitTran(); - // } - // catch (Exception e) - // { - // DbHelp.db.RollbackTran(); - // } - //}); - //#endregion + IsWarning = true; + Logs.Write($"货架自检【{ShelfCode},库位{storeInfo.StoreCode}发现物料丢失,开始发送红灯】", LogsType.Instore); + WarningLight.WaringLightAlwaysRed(TcpCleint); + Logs.Write($"货架自检【{ShelfCode},库位{storeInfo.StoreCode}发现物料丢失,发送红灯完成】", LogsType.Instore); } //库位未配置、返回数据异常 else @@ -2403,11 +2415,11 @@ namespace WCS.BLL.HardWare }; WarningManager.SendWarning(warningModel); #endregion - //#region 【记录缓存异常信息】 - //var shelfStatus = LocalStatic.ShelfStatuses.Where(t => t.ShelfCode == storeInfo.ShelfCode).First(); - //LocalStatic.CheckErr.Add($"库位{storeInfo.StoreCode}:存在物料未扫描上架,请取出后重新扫描上架!"); - //#endregion - //WaringLightAlwaysRed(shelfStatus.ClientIp, shelfStatus.LightId); + + IsWarning = true; + Logs.Write($"货架自检【{ShelfCode},库位{storeInfo.StoreCode}存在物料未扫描上架,开始发送红灯】", LogsType.Instore); + WarningLight.WaringLightAlwaysRed(TcpCleint); + Logs.Write($"货架自检【{ShelfCode},库位{storeInfo.StoreCode}存在物料未扫描上架,发送红灯完成】", LogsType.Instore); } else { diff --git a/WCS.BLL/Manager/MXBackgroundThread.cs b/WCS.BLL/Manager/MXBackgroundThread.cs index bab8644..e7877e3 100644 --- a/WCS.BLL/Manager/MXBackgroundThread.cs +++ b/WCS.BLL/Manager/MXBackgroundThread.cs @@ -282,8 +282,11 @@ namespace WCS.BLL.Manager if (shelf is SmartShelf) { var smartShelf = (SmartShelf)shelf; - smartShelf?.WarningLight.CloseLight(smartShelf.TcpCleint); - Logs.Write($"【定时任务】:监测警示灯关灯机制,关【{shelf.ShelfCode}】灯发送指令成功!"); + if(smartShelf.IsWarning == false) + { + smartShelf?.WarningLight.CloseLight(smartShelf.TcpCleint); + Logs.Write($"【定时任务】:监测警示灯关灯机制,关【{shelf.ShelfCode}】灯发送指令成功!"); + } } } catch (Exception ex) diff --git a/WCS.BLL/Manager/TCPClientManager.cs b/WCS.BLL/Manager/TCPClientManager.cs index f20200f..b099252 100644 --- a/WCS.BLL/Manager/TCPClientManager.cs +++ b/WCS.BLL/Manager/TCPClientManager.cs @@ -53,23 +53,28 @@ namespace WCS.BLL.Manager } var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray(); - Logs.Write($"【接收】{BitConverter.ToString(data)}", LogsType.Instructions); + + Task.Run(() => + { + Logs.Write($"【接收{clientIpHost}】{BitConverter.ToString(data)}", LogsType.Instructions); + }); + e.ByteBlock.Clear(); var len = data.Length; if (tcpCleint.ShelfTypeName == "信息化货架") { - Logs.Write($"【信息化货架开始处理接收数据】{BitConverter.ToString(data)}", LogsType.Instructions); + Logs.Write($"【信息化货架开始处理接收数据】{BitConverter.ToString(data)}", LogsType.InstructionsProcess); Helper.ReturnDataProcess(TcpCleint, data); - Logs.Write($"【信息化货架完成处理接收数据】{BitConverter.ToString(data)}", LogsType.Instructions); + Logs.Write($"【信息化货架完成处理接收数据】{BitConverter.ToString(data)}", LogsType.InstructionsProcess); return EasyTask.CompletedTask; } if (tcpCleint.ShelfTypeName == "液晶货架") { - Logs.Write($"【液晶货架开始处理接收数据】{BitConverter.ToString(data)}", LogsType.Instructions); + Logs.Write($"【液晶货架开始处理接收数据】{BitConverter.ToString(data)}", LogsType.InstructionsProcess); //Helper.ReturnDataProcess(TcpCleint, data); - Logs.Write($"【液晶货架完成处理接收数据】{BitConverter.ToString(data)}", LogsType.Instructions); + Logs.Write($"【液晶货架完成处理接收数据】{BitConverter.ToString(data)}", LogsType.InstructionsProcess); return EasyTask.CompletedTask; } @@ -85,7 +90,7 @@ namespace WCS.BLL.Manager { continue; } - Logs.Write($"【处理单条指令 开始】{BitConverter.ToString(dataTemp)}", LogsType.Instructions); + Logs.Write($"【处理单条指令 开始】{BitConverter.ToString(dataTemp)}", LogsType.InstructionsProcess); index += (TcpCleint.PreFixLength + TcpCleint.DataLength - 1);//每次循环index会+1 所以这里-1 //获取板子ID var boardId = (dataTemp[TcpCleint.PreFixLength + 0] << 8) + dataTemp[TcpCleint.PreFixLength + 1]; @@ -109,7 +114,7 @@ namespace WCS.BLL.Manager var smartShelf = shelf as SmartShelf; smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber); } - Logs.Write($"【处理单条指令 结束】{BitConverter.ToString(dataTemp)}", LogsType.Instructions); + Logs.Write($"【处理单条指令 结束】{BitConverter.ToString(dataTemp)}", LogsType.InstructionsProcess); } } return EasyTask.CompletedTask; diff --git a/WCS.BLL/Manager/WarningManager.cs b/WCS.BLL/Manager/WarningManager.cs index e364b98..54fdcd1 100644 --- a/WCS.BLL/Manager/WarningManager.cs +++ b/WCS.BLL/Manager/WarningManager.cs @@ -51,7 +51,7 @@ namespace WCS.BLL.Manager { Warnings.Add(warning); //发送WebSocket记录 - Logs.Write(JsonConvert.SerializeObject(warning),LogsType.WebSocket); + Logs.Write(JsonConvert.SerializeObject(warning), LogsType.WebSocket); WebSoceketManager.TrySendMessage(warning.ClientIp, JsonConvert.SerializeObject(warning)); warning.LastSendTime = DateTime.Now; @@ -95,16 +95,20 @@ namespace WCS.BLL.Manager //货架是否还存在报警信息 shelfIsWarning = Warnings.Where(t => t.ShelfId == warning.ShelfId) + .Where(t => t.IsWarning) .Any(); //对应货架如果不存在报警信息了 指示灯回到对应的状态 + Logs.Write($"shelfIsWarning{shelfIsWarning}", LogsType.WebSocket); if (!shelfIsWarning) { + Logs.Write("货架不存在报警信息", LogsType.WebSocket); var shelf = ShelfManager.Shelves.Where(t => t.ShelfId == warning.ShelfId) .FirstOrDefault(); if (shelf != null) { try { + Logs.Write("smartShelf?.ClearWarning();", LogsType.WebSocket); var smartShelf = shelf as SmartShelf; smartShelf?.ClearWarning(); smartShelf.IsWarning = false; @@ -117,6 +121,7 @@ namespace WCS.BLL.Manager } #region 重新发指令进入对应模式 + Logs.Write($"GoInRightMode", LogsType.WebSocket); GoInRightMode(warning); #endregion @@ -194,7 +199,7 @@ namespace WCS.BLL.Manager #region 如果是出库 删除正在出库缓存的数据 if (warning.WarningType == WarningTypeEnum.出库自检丢失) { - Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,用户点击【处理】,删除数据",LogsType.Outstore); + Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,用户点击【处理】,删除数据", LogsType.Outstore); //清掉需要出库的缓存 var shelf = ShelfManager.Shelves .Where(t => t.ShelfId == warning.ShelfId) @@ -207,10 +212,11 @@ namespace WCS.BLL.Manager //删除货架上缓存的那一条数据 smartShelf.CurrentOutStoreMatSNs.RemoveAll(t => t == inventoryDetail.MatSN); Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,已删除货架缓存,剩余物料为{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore); - + //删除模组上缓存的那一条数据 var module = smartShelf.Modules.Where(t => t.ModuleId == warning.ModuleId).FirstOrDefault(); - if (module != null) { + if (module != null) + { module.CurrentOutSns.RemoveAll(t => t == inventoryDetail.MatSN); Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,已删除模组缓存,剩余物料为{string.Join(",", module.CurrentOutSns)}", LogsType.Outstore); } @@ -246,6 +252,8 @@ namespace WCS.BLL.Manager var moduleOtherError = WarningManager.Warnings.Where(t => t.ShelfId == warning.ShelfId && t.ModuleId == warning.ModuleId).Any(); if (moduleOtherError) { + var guids = WarningManager.Warnings.Where(t => t.ShelfId == warning.ShelfId && t.ModuleId == warning.ModuleId).Select(t => t.Guid.ToString()).ToList(); + Logs.Write($"模组还存在其他异常 暂时不进入对应模式.{string.Join("''", guids)}", LogsType.WebSocket); return; } @@ -253,6 +261,7 @@ namespace WCS.BLL.Manager .FirstOrDefault(); if (shelf != null) { + Logs.Write($"shelf != null", LogsType.WebSocket); var smartShelf = shelf as SmartShelf; if (smartShelf != null) { @@ -266,8 +275,7 @@ namespace WCS.BLL.Manager smartShelf.WarningLight.BlueLight(smartShelf.TcpCleint); break; case Mode.出库模式: - //module.GoInOutStoreMode(smartShelf.TcpCleint, module.CurrentOutSns); - //smartShelf.WarningLight.GreenLight(smartShelf.TcpCleint); + Logs.Write("smartShelf.GoInOutstoreByWebSocket", LogsType.WebSocket); smartShelf.GoInOutstoreByWebSocket(module.ModuleId); break; case Mode.待机模式: @@ -278,6 +286,14 @@ namespace WCS.BLL.Manager } } } + else + { + Logs.Write($"smartShelf != null", LogsType.WebSocket); + } + } + else + { + Logs.Write($"shelf == null", LogsType.WebSocket); } } catch (Exception e) diff --git a/WCS.BLL/Services/Service/InterfaceRecordService.cs b/WCS.BLL/Services/Service/InterfaceRecordService.cs index 0251674..b336d6a 100644 --- a/WCS.BLL/Services/Service/InterfaceRecordService.cs +++ b/WCS.BLL/Services/Service/InterfaceRecordService.cs @@ -40,7 +40,7 @@ namespace WCS.BLL.Services.Service } var totalCount = await recordsQueryable.CountAsync(); var records = await recordsQueryable - .OrderByDescending(t => t.Id) + //.OrderByDescending(t => t.Id) .Skip((request.PageNumber - 1) * request.PageSize).Take(request.PageSize) .ToListAsync(); //生成序号 @@ -48,10 +48,6 @@ namespace WCS.BLL.Services.Service { records[i].RowNumber = (request.PageNumber - 1) * request.PageSize + i + 1; } - //Task.WaitAll(new Task[] { recordsTask, totalCountTask }); - - //var records = recordsTask.Result; - //var totalCount = totalCountTask.Result; return new PageQueryResponse() { diff --git a/WCS.BLL/Services/Service/MatInventoryDetailService.cs b/WCS.BLL/Services/Service/MatInventoryDetailService.cs index 31c0c4c..4fd67a4 100644 --- a/WCS.BLL/Services/Service/MatInventoryDetailService.cs +++ b/WCS.BLL/Services/Service/MatInventoryDetailService.cs @@ -41,6 +41,7 @@ namespace WCS.BLL.Services.Service ; var totalCount = await recordsQueryable.CountAsync(); + var totalQty = await recordsQueryable.SumAsync((id, si) => id.MatQty); var records = await recordsQueryable .OrderByDescending((id, si) => id.Id) .Skip((request.PageNumber - 1) * request.PageSize).Take(request.PageSize) @@ -55,7 +56,7 @@ namespace WCS.BLL.Services.Service return new PageQueryResponse() { Code = 200, - Message = $"success", + Message = $"{totalQty}", Data = new PageQueryResponseData() { TotalCount = totalCount, diff --git a/WCS.BLL/Services/Service/OutstoreService.cs b/WCS.BLL/Services/Service/OutstoreService.cs index 476a8ab..8883af8 100644 --- a/WCS.BLL/Services/Service/OutstoreService.cs +++ b/WCS.BLL/Services/Service/OutstoreService.cs @@ -487,7 +487,8 @@ namespace WCS.BLL.Services.Service //获取后台当前正在进行出库的订单 将出库状态反馈给前端 var outingOrderNumbers = ShelfManager.Shelves - .Where(t => t.CurrentMode == HardWare.Mode.出库模式).Select(t => t.OrderNumber) + .Where(t => t.CurrentMode == HardWare.Mode.出库模式) + .Select(t => t.OrderNumber) .ToList(); foreach (var record in records) { diff --git a/WCS.BLL/Services/Service/StockTakingService.cs b/WCS.BLL/Services/Service/StockTakingService.cs index 74e71a9..06f6337 100644 --- a/WCS.BLL/Services/Service/StockTakingService.cs +++ b/WCS.BLL/Services/Service/StockTakingService.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using WCS.BLL.Config; using WCS.BLL.DbModels; using WCS.BLL.Manager; using WCS.BLL.Services.IService; @@ -12,6 +13,7 @@ using WCS.DAL.DbModels; using WCS.Model; using WCS.Model.ApiModel.InOutRecord; using WCS.Model.ApiModel.Stocktaking; +using WCS.Model.WebSocketModel; namespace WCS.BLL.Services.Service { @@ -100,7 +102,8 @@ namespace WCS.BLL.Services.Service { StocktakingOrderNumber = request.StocktakingOrderNumber, StocktakingOrderSource = request.StocktakingOrderSource, - CreateUser = request.UserName + CreateUser = request.UserName, + GroupName = LocalFile.Config.GroupName, }; var stockTakingOrderId = await DbHelp.db.Insertable(stockTakingOrder).ExecuteReturnIdentityAsync(); stockTakingOrder.Id = stockTakingOrderId; @@ -180,6 +183,7 @@ namespace WCS.BLL.Services.Service { StocktakingOrderNumber = request.StocktakingOrderNumber, StocktakingOrderSource = request.StocktakingOrderSource, + GroupName = LocalFile.Config.GroupName, CreateUser = request.UserName }; var stockTakingOrderId = await DbHelp.db.Insertable(stockTakingOrder).ExecuteReturnIdentityAsync(); @@ -242,6 +246,7 @@ namespace WCS.BLL.Services.Service //获取库存数据 生成盘点单据 var inventoryDetails = await DbHelp.db.Queryable() .Where(t => request.List.Contains(t.MatSN)) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName) .ToListAsync(); if (inventoryDetails == null || inventoryDetails.Count == 0) { @@ -260,6 +265,7 @@ namespace WCS.BLL.Services.Service { StocktakingOrderNumber = request.StocktakingOrderNumber, StocktakingOrderSource = request.StocktakingOrderSource, + GroupName = LocalFile.Config.GroupName, CreateUser = request.UserName }; var stockTakingOrderId = await DbHelp.db.Insertable(stockTakingOrder).ExecuteReturnIdentityAsync(); @@ -317,7 +323,8 @@ namespace WCS.BLL.Services.Service var recordsQueryable = DbHelp.db.Queryable() .WhereIF(!string.IsNullOrEmpty(request.StocktakingOrderNumber), t => t.StocktakingOrderNumber.Contains(request.StocktakingOrderNumber)) - .WhereIF(!string.IsNullOrEmpty(request.StocktakingOrderSource), t => t.StocktakingOrderSource != null && t.StocktakingOrderSource.Contains(request.StocktakingOrderSource)); + .WhereIF(!string.IsNullOrEmpty(request.StocktakingOrderSource), t => t.StocktakingOrderSource != null && t.StocktakingOrderSource.Contains(request.StocktakingOrderSource)) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName); switch (request.StocktakingOrderStatus) { @@ -396,6 +403,7 @@ namespace WCS.BLL.Services.Service var records = await recordsQueryable .Where(t => t.StocktakingOrderStatus != StocktakingOrderStatus.已提交) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName) .OrderByDescending(t => t.UpdateTime) .Take(40) .ToListAsync(); @@ -493,6 +501,14 @@ namespace WCS.BLL.Services.Service Message = $"操作失败:不存在Id为{request.StockTakingOrderId}的盘点单!", }; } + if (order.StocktakingOrderStatus == StocktakingOrderStatus.已提交) + { + return new ResponseCommon() + { + Code = 201, + Message = $"操作失败:盘点单据:{request.StockTakingOrderNumber}已提交!", + }; + } } else if (!string.IsNullOrEmpty(request.StockTakingOrderNumber)) { @@ -794,6 +810,19 @@ namespace WCS.BLL.Services.Service #endregion DbHelp.db.CommitTran(); + + //通知前台刷新 + Task.Run(() => + { + var messageMode = new WebSocketMessageModel() + { + IsWarning = false, + ClientIp = shelf.WebSocketIpAddress, + WarningType = WarningTypeEnum.通知刷新盘点 + }; + WarningManager.SendWarning(messageMode); + }); + //更新时间 避免被自动退出 Task.Run(() => { diff --git a/WCS.BLL/Tool/Logs.cs b/WCS.BLL/Tool/Logs.cs index 0973352..6950125 100644 --- a/WCS.BLL/Tool/Logs.cs +++ b/WCS.BLL/Tool/Logs.cs @@ -46,6 +46,10 @@ namespace WCS.BLL /// Instore, WebSocket, + /// + /// 指令发送接收 + /// + InstructionsProcess, } /// diff --git a/WCS.BLL/Tool/TCPClient.cs b/WCS.BLL/Tool/TCPClient.cs index 8d9c66b..21dd0b0 100644 --- a/WCS.BLL/Tool/TCPClient.cs +++ b/WCS.BLL/Tool/TCPClient.cs @@ -252,10 +252,11 @@ namespace WCS.BLL tcpClient.Send(message); Task.Run(() => { - Logs.Write($"【发送】{BitConverter.ToString(message)}", LogsType.Instructions); + var clientIpHost = tcpClient.IP + ":" + tcpClient.Port; + Logs.Write($"【发送{clientIpHost}】{BitConverter.ToString(message)}", LogsType.Instructions); }); //发送自带15ms间隔 - Thread.Sleep(15); + Thread.Sleep(18); } } catch (Exception ex) diff --git a/货架标准上位机/App.xaml.cs b/货架标准上位机/App.xaml.cs index 02490c8..c41b9c6 100644 --- a/货架标准上位机/App.xaml.cs +++ b/货架标准上位机/App.xaml.cs @@ -25,7 +25,7 @@ namespace 货架标准上位机 } else { - MainWindow = new MainWindow1(); + MainWindow = new MainWindow2(); } MainWindow.ShowDialog(); diff --git a/货架标准上位机/Fonts/iconfont.ttf b/货架标准上位机/Fonts/iconfont.ttf index 02b62ec934bf8a3508423e58b976251ea4d1ab26..5878b6afdea051cadc0b97c0020fd1dfdd85f079 100644 GIT binary patch delta 8308 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 X-YP<4@`h26@K7J$H|u?h`{(}w2KiQm delta 1283 zcmZ{iU1(Eh7{~u_&PmcVw&_=zM5j$#w`r|KluamE^lQfQg`kYbytX&F7X;0G$$ z(}KIx5qiLZ)T`~v3lWQ@LLEv+@j{T@3WHJDW5nESbDMZ!{GUAW!i$}k-+8~zdEV#w z|KBT1rr;Jj-93Q00$}X8lbsIzcHlY?_zAEdjZa?4|NV5l0E8a{yGs)%vnRI2f1c;J zzmrcVxDbAAaStnG>x6UW{PM2ye~ee+e0g%}c(%*g%vj+`&W}0S^V8;l>EwQr^Yp2# zbF$$_H**{4UFMpn#Pi2Lxdo$bT zMq`#xce#n7mgThmZLZ9>}DIgJ8TCkG12&-v4J>dYRf)2o8hng87P<|a@ga5~f<|mXH`>vH z4%p~K5?yI*MF?TU5T`0_*ohDD5n7Qz3frk`$otiP<2^7z?@2J|2D+VLHItMIfI?jG#db~SdjTkJZzWLL< E1qIhQMgRZ+ diff --git a/货架标准上位机/Models/JsConfig.cs b/货架标准上位机/Models/JsConfig.cs index ba7c8d9..ad72217 100644 --- a/货架标准上位机/Models/JsConfig.cs +++ b/货架标准上位机/Models/JsConfig.cs @@ -95,6 +95,8 @@ namespace 货架标准上位机 /// 登录历史 /// public List SaveLogin { get; set; } + + public string LastSaveLoginPassword { get; set; } /// /// 登录历史数量 /// diff --git a/货架标准上位机/Resources/主页.png b/货架标准上位机/Resources/主页.png index e5b75de16e4450436c4097a3d6a68e0b38ddff89..e68e6e6478652e4442a74036443ace4169132daa 100644 GIT binary patch delta 1732 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 diff --git a/货架标准上位机/Resources/入库.png b/货架标准上位机/Resources/入库.png new file mode 100644 index 0000000000000000000000000000000000000000..324017d47c52223d0f732b8732938e21759a6503 GIT binary patch literal 1485 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 Z{{%>CZV*y~#n1o%002ovPDHLkV1mqaKNSD~ diff --git a/货架标准上位机/Resources/查询.png b/货架标准上位机/Resources/查询.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0f5f8534e1c36a875607497a4eff5b9c697b7e GIT binary patch literal 1637 zcmV-r2AcVaP)Px*A4x<(RCr$PTV0G3RTTct6x1MpJH-c0il80*!I&sSOw<5E6irkN@d+^alfX{t z`eNb(M#1QV55DZuDVz91ba^sHkjSz|1QZjAh$dpxohryC`a-9>3lfy=9J%dux7(fR z{Is*QmU-IjJ@=e*zs|k){Cq>0glBe_zAQ2YF_=7;A;lme2Ijc{VwU*<5S@mJ0fIRI ziB9K7Fff=@4u$O=g<(KWWnxUcRAOGmM2`WO8PLu!G4C~r_7l@#BM~16sK;?y-2j;R z_JBO);)NtLmJ+bM-i``=3>+jjzZ|)GTIcZdF{2(f>HuZUT1hB--P)OrPnb4JMS9S%}9|(Z9bml%{-U8r}poZ%_ua}A5 z$hF76_N&)70MS%tGZWqfc$!~h;mXr_V!V`1#JBsg;|l;erN0BhvwjRrx-8>eBcVL! z)vjj%qMCl3fxEmazMOIde4ka7yS@0}2>@Bs*^9D9lQC4qb$zY^QBD7Z0TIkJ-9y0M ztg1X-&GD)LM791TgF2gT9TSmA9?y{tBp z9ww}-44Wss0kWol<0rOf;1IES*nXkXbPzTHxOQwmVlT6K+*Y2X+W|ZkB4|eqRk^oZ z|2P0dR>xp}r#_q8jKnQlot$pd^n(N}D~(H$sW+V2IPWhz`8nOEt~c`+{|pfT5U8U( ziyQ?&fgdduQ#HDVf#ePFO!_g>;Un`8jSUs zG_q;1{kBt;I;`!rXIyKnO5ijx7-PfC(;B-&b9VaYc@j?%H&^h|JX1Hx>CC5Ko{%Pb z1|-BtP$XJ8RdH;y1&&@zizC`cvZntC;116Vt`ux$0Duz$fWew7Kg|um&=ml#Y=M?P z1Z%$rKa?UF`huOs=z+_Thv*YVFw><+T9oe}fGCU>kTb7LGeFio__PTcqm~9!vL( zfI-}_p(?Wq^?+!qzlVv|22w<{(`b)B<1|;+^b_SZ0SUC&?obo+#i40}%iC8!8LHwK zrON5ddtlxW#BXBWl}#*ISF8wWy7=RRAd0G;>Xz=e{)gxiws`8v1jhaI!h&VP!OGfM39+x6Ff_V*q^1HeZY>F1V&BZR= zQ&HkN3!;x;=Kru0XOaXld$jZH;SjIh9xq&5MgDK=5+tn1uyrXi#kW9^q48Pc@qsXZb-S1r@c^Rn}#G^iG>%^ zv?~DCq1d`)=@P2VM4I+Ok}j>w(;F}bLgSOC-N?~4+r;e@89#23sCU-XP4Z{btMm|o zHaL-@os{@`14>FPGWBaUb!NRT%bQ%UBuTH>k)hqD2Lhm^v}He=t3jPnsNA85EwXDfXd#7l`Ht3Y^|2rFt}pq*pJ0WkVZ&hHn*Mo&2T j5US}6@M@=#KcD{(q;Y8E_{{}U00000NkvXXu0mjfAY}_R literal 0 HcmV?d00001 diff --git a/货架标准上位机/Resources/模式.png b/货架标准上位机/Resources/模式.png deleted file mode 100644 index 27b51ceeaff5cc78e7617fc68122fe0a6a2b5038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmV-o0-gPdP)Px%97#k$RCr!vWEkOqafJJyVKe|nQ@{uhfzd30D*>$Da$x_*&)-a+ym-w`k3=FR zCiFp&pZ7wjkAovU?1R~XGX+eTxAx12k6-BGd6;8_1bBbuB?fT}iU4TnU-%#7kotl+ zy11ut!XmIe4TbS2k)ponKG+>Fa5GL3t30|mv5v->0!9O1kfZ=YF$qf{!!`ws1^}TD zpiq9$mjM*|kD&I^0KgSQgQXTA7=;un81gA#v=)Filt!yTv=$<nj2418LSVEO zAhR#9e)|E2Q|GTRJbm$+*lb8sb&9f5AH+n3F61PJVI60ndKu6*X+Fb^I}d2;DN+p= z7Zv*1Q&)g>oPp{A5SLdEcHg2&jikDhChB4CSv~W{ z9X0_#ZibA_tpktY4f!%)Gyup9fzcE&+_M0ziHs|O4EsWG#0LPOqG4E-0ptufjRwGQ zDg;MU02u?0!zv39D)6w$j|RYSDg#DS02v`Ltg-;H%Tr+C1e%>04S>-yV01uabVO)$ zNNjXWa0CyE)^*KzfB*3_0Wz8pG}A)X)EK$0nKFOX{s)hrS-yPzj-6aHsHu;_hEQwR<5lU0YfRzCwJ^(0Px+gGod|RCr$Pn`>+vRTjtpXG~g(cAI+K@~QwqGH#*bA%s>S*e5Hri*|)5QWvcj zq|#Q6$DyHt(xlLh(^7TAwq4r9cG3q(g?)5c!J=J2@CA@Syjws}NX7=lLkKpWX$q83 z>^YkWb?PS9_PlJTkoo92kN^42y?5^1drhd}CC9a^Ki!hWLmFB8~^Ca*M?KY00jHe^-|94Vc-uo zbd)jSk68+=GMXCx?mgDA5h?;86d$;QiPi(~H9iARG2zw&5oMoWAbb@Vil-Mc%#9#~ z{SqjS!`o-hsB3wD@!7*(^Y{Wl?$ypC6I~4a#;YI){$GG7rbik#JMfuc>J0!h$%)iv z5LS8-;l-DLeI|IVp@tuI6UQ}xU?SZ_Y{o!1#ZBT0`0UALamUaKCG8}(V*sI^^p#Ax z7>KTLlBjyNe3!0<*V@fz8$c-e;aoO{*MV@8-QYE}dzT2YOhmcAoCaF}f^n^l2ps@U zEEjN+-G5?4PfS;p7mDdB3E;?U&FbgpPqM-s$zf1;*8HaP^X79i;~h%_=;^SD0mKHED|=mafkLPH#2Y~g zGu9Ijo%|5!O)z)rQRQFdvIak0`6tt_qwVaQ*%)O1pMqspgjRTy!3z31z(5?4JEX8038fWuMG%(Qi8N*P;Gow ztZ(2>#^{&n=;a1L-glj@D%Kle!Xju^HgI!E|K>LF9(yi5u2+r(RsT?Vyt(tB#{N;Cw9a# zq1}ime-hc&cfWIXAP|TH__du_z72v_Q3hU8fV{X+BK=E-c`JZlm1%|@x~i-b*___@ z%1Ohy`mMy$%9Z`vxE%Tux|9N9G5u0M0ET@IwZ-8EW`% zc8i$ZxBoQG)orq-uXcUx*!d3ND2UX0fUOoWqnHqDV?!ddEfbmdQYo==LbJBQI_(tX z)TUwpEFrVIKR7)X_;d^A&Bo0fPAmOzroUGBiit+^^0u)$JrogXP~-g^h^+VWwG7k@5mTnhlSW?3P8aM zZKn?jpYV?>p$XdNU*^imLB#u1Az65V2Doo&e;N$#HEH2-co}qsuD*Yp;?_H0#aETaFSJ82bXi ziZ>_z-l*I4q&WXBvZ?nxtmIy9&-p_&q>24F8-+XjIZ1j>UkdEHfgEx!6ty$CD4*$$Kc%R z%KKHU1r!Q9C7C)o%e<3;qkokx|2aHNz_QG^Wp=LxkN2+%fU(zRJbeYh+?D@VS+N#i z?JF9p;_IxlW?ev(SdME;K-f7R07JUSq-l$X)UzfWYxn!fSG5b+5g+V+=W^rb`On$0 b_0#762-8Mxhtk&n00000NkvXXu0mjfe+j+L literal 0 HcmV?d00001 diff --git a/货架标准上位机/Resources/盘点.png b/货架标准上位机/Resources/盘点.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7f84505566bcdb87de84ff5aad0f4383261fec GIT binary patch literal 1629 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�q*u4cX;Z8XvRut3&o1||?;O-RO@5CS9&3W05NfT9Y}b+ zVkQU|O+~)DVtNN*-FAJt5W!LBTq}!5E-#h8>dAVgb3{$&qGxQaH{)a0c>++kANXX+L4aq|plIA$b~NTAPkb8^Q{}6##d3Gfx{$Ra)%}fR;K5(4=kv za3~#@XNMJlUjW=!5C*g(txAf&2I#+mF*Z-bgr~|^RxnJVw);`A8G({ASCrxFbb}%5`h@BIHO9tDxr1K1Wp6;%!x^37nm1T zBoN_IQ<1-{h_-|%umIS6#*)SyfHyK@w5xE;pJy$r@ygP%XL}-iAZ|zn_&cFNj<>~)z5nnK}#!gyr&+fE3~h!D*Rsn5Yu#n;SpSw zFhD?aT9u`qf)F?j5R>}1U`(k>Ai{A|ksqpRP8V^Y01%VLN-%FK7lc|s=xl_r-NoS% zWi&*qOhvLY)v88d0ElVLGZ@xk7w$hcRry)xb5YZ6qxeiIZM7BWK-qw3Qdfwf6$$0j zrgAg9Oi(k5TwJmG7kvnf28aoL6A0Z+RK^7}E)VzPUrgxdLAa+t!`N)b#xwqBTma#CS0FT{$ntmn?w;laf$;)) zwXG%($j|9bJ`gwna%x#kKG2IiAaGltDBShT3mjBEjQ>l*>R`A*H_QFME{Nm-sr3bd zc23Y$Rcn2LT3?{-=xnVq5`xA^tSR*%3uK>oaU_)1`i}m$ZF4&??OEr)8D;UC=>-O9 z#srJ_Eik5fBu?kSyxEM`zwLZ~O8^knj70?ASy9GVa;7Qt0C=5s_6LJfrYeoGX+jOa z!0o3-Mk0|jF2Y^|p#_Y~0PJ#m`Mm}UFPV+gVn0f=hGK>|PN5cY(r%DxTQSWPJkrh)a>MuBUsN+519%$&Kf=Nmvr+DBW!-==IAKUx;%)X)5vFCA;*!zZW$U(` z9vA6L(=4V*M3@N1uz&7E9tT?|APDxMtFrqIe*^5Obqzph28sXx002ovPDHLkV1lGn BE~Wqg literal 0 HcmV?d00001 diff --git a/货架标准上位机/Resources/货架.png b/货架标准上位机/Resources/货架.png new file mode 100644 index 0000000000000000000000000000000000000000..3cddab5b0e64ecf5a45b536aa5795ebdbbe181ad GIT binary patch literal 839 zcmV-N1GxN&P)Px&0ZBwbRCr$PTTN&aK@|Sp#;OM^cGH|hv64*@k1dFx5J3bA48W~)$hz0gS<(}=hXI@d=wW8j8gI1KrgpuI+_amA7}rWk;D-YKhp6- z%qJJZfjgyaUC96jDsF)U1a*J|_{hMgtStds0c_XvLrDfF%h?v-)7b{~K((lq1VDob zwdlLlgQb%JLWSilAcrA24a#v??gQjPL~exim`8K1TsaI05fUOKL`aB`5FsH#LWG0} zHJ8%p^)5t6ilb5;mh!mh14JMp3X#T0WXza-07_NV2M{P(u9BPI>AjKo2(P9OFpRgA zbOCu^4dDUHlA0j^JFBBBlmut)7K@e4m^}`rkt)Oy`EF*xYO>gm6GLMH5KH_7^ZM!r z|G(9eNBI`d^v`FX?yIQaX?TBuuKl~v3%veLm z!F;-2Kc(#J-UhWmwW^U$b+}c>qJ>KWpdpZ0O(UfBCK_l|w?;_n0#X-{x`5OLq%I(J z0jUc}U7&&7#kH9)0e*sy2fNm8` R&W->8002ovPDHLkV1mvBd~5&! literal 0 HcmV?d00001 diff --git a/货架标准上位机/ViewModels/InOutRecordViewModel.cs b/货架标准上位机/ViewModels/InOutRecordViewModel.cs index e39ab3e..3a13a23 100644 --- a/货架标准上位机/ViewModels/InOutRecordViewModel.cs +++ b/货架标准上位机/ViewModels/InOutRecordViewModel.cs @@ -381,7 +381,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/InterfaceRecordViewModel.cs b/货架标准上位机/ViewModels/InterfaceRecordViewModel.cs index afd9379..c5252ce 100644 --- a/货架标准上位机/ViewModels/InterfaceRecordViewModel.cs +++ b/货架标准上位机/ViewModels/InterfaceRecordViewModel.cs @@ -255,7 +255,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/MXViewModel/MXPDViewModel.cs b/货架标准上位机/ViewModels/MXViewModel/MXPDViewModel.cs index c98af57..5638b66 100644 --- a/货架标准上位机/ViewModels/MXViewModel/MXPDViewModel.cs +++ b/货架标准上位机/ViewModels/MXViewModel/MXPDViewModel.cs @@ -185,7 +185,7 @@ namespace 货架标准上位机.ViewModel var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outStore/goInOutstore", body, "POST"); if (Result != null && Result.Code == 200) { - Growl.Warning("已成功开始出库!"); + Growl.Warning("已成功开始盘点!"); RefreshDataGridItemSource(); } else if (Result != null) diff --git a/货架标准上位机/ViewModels/MatBaseInfoViewModel.cs b/货架标准上位机/ViewModels/MatBaseInfoViewModel.cs index 9439e36..abebc98 100644 --- a/货架标准上位机/ViewModels/MatBaseInfoViewModel.cs +++ b/货架标准上位机/ViewModels/MatBaseInfoViewModel.cs @@ -439,7 +439,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/MatInfoViewModel.cs b/货架标准上位机/ViewModels/MatInfoViewModel.cs index 810ebac..5c259ba 100644 --- a/货架标准上位机/ViewModels/MatInfoViewModel.cs +++ b/货架标准上位机/ViewModels/MatInfoViewModel.cs @@ -372,7 +372,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/MatInventoryDetailViewModel.cs b/货架标准上位机/ViewModels/MatInventoryDetailViewModel.cs index f8954cf..9f93da9 100644 --- a/货架标准上位机/ViewModels/MatInventoryDetailViewModel.cs +++ b/货架标准上位机/ViewModels/MatInventoryDetailViewModel.cs @@ -78,6 +78,10 @@ namespace 货架标准上位机.ViewModel set { SetProperty(ref shelfCode, value); } } + private string totalQtyStr; + + public string TotalQtyStr { get => totalQtyStr; set { SetProperty(ref totalQtyStr, value); } } + /// /// 物料编码 @@ -220,6 +224,8 @@ namespace 货架标准上位机.ViewModel MatName = string.Empty; MatSN = string.Empty; StoreCode = string.Empty; + ShelfCode = string.Empty; + MatBatch = string.Empty; } public ICommand BtnSearchCommand { get => new DelegateCommand(BtnSearchReset); } @@ -261,6 +267,11 @@ namespace 货架标准上位机.ViewModel DataGridItemSource = Result.Data.Lists; MaxPage = Result.Data.MaxPage; TotalCount = Result.Data.TotalCount; + TotalQtyStr = "物料总数量" + Result.Message; + } + else + { + TotalQtyStr = string.Empty; } } catch (Exception ex) @@ -331,6 +342,9 @@ namespace 货架标准上位机.ViewModel MatCode = MatCode, StoreCode = StoreCode, + ShelfTypeId = SelectedShelfTypeItem == null ? 0 : SelectedShelfTypeItem.Id, + ShelfCode = ShelfCode, + UserName = LocalStatic.CurrentUser, DeviceType = LocalFile.Config.DeviceType, PageNumber = 1, @@ -429,6 +443,9 @@ namespace 货架标准上位机.ViewModel MatCode = MatCode, StoreCode = StoreCode, + ShelfTypeId = SelectedShelfTypeItem == null ? 0 : SelectedShelfTypeItem.Id, + ShelfCode = ShelfCode, + UserName = LocalStatic.CurrentUser, DeviceType = LocalFile.Config.DeviceType, PageNumber = CurrentPage, @@ -543,7 +560,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/ModuleInfoViewModel.cs b/货架标准上位机/ViewModels/ModuleInfoViewModel.cs index b5fde19..0b91e51 100644 --- a/货架标准上位机/ViewModels/ModuleInfoViewModel.cs +++ b/货架标准上位机/ViewModels/ModuleInfoViewModel.cs @@ -279,7 +279,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs b/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs index dd9c295..6ae3c98 100644 --- a/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs +++ b/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs @@ -468,7 +468,11 @@ namespace 货架标准上位机.ViewModels public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/OutInventoryViewModel.cs b/货架标准上位机/ViewModels/OutInventoryViewModel.cs index b3c44fc..e9a2e3f 100644 --- a/货架标准上位机/ViewModels/OutInventoryViewModel.cs +++ b/货架标准上位机/ViewModels/OutInventoryViewModel.cs @@ -277,7 +277,8 @@ namespace 货架标准上位机.ViewModel { if (Result.Data.Count > 0) { - DataGridItemSource = new ObservableCollection(Result.Data); + var list = Result.Data.OrderBy(t => t.IsSended).ToList(); + DataGridItemSource = new ObservableCollection(list); OrderStatus = Result.Message; } else diff --git a/货架标准上位机/ViewModels/ShelfInfoViewModel.cs b/货架标准上位机/ViewModels/ShelfInfoViewModel.cs index 71347d9..167566a 100644 --- a/货架标准上位机/ViewModels/ShelfInfoViewModel.cs +++ b/货架标准上位机/ViewModels/ShelfInfoViewModel.cs @@ -254,7 +254,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs b/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs index 3e10719..03f3fc0 100644 --- a/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs +++ b/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs @@ -292,6 +292,7 @@ namespace 货架标准上位机.ViewModels { //成功后直接跳转 MainWindow1.viewModel.GoToStockTakingView = true; + MainWindow2.viewModel.SelectedValue = "物料盘点"; Growl.Success("已跳转到物料盘点页面!"); } else if (Result != null) @@ -452,7 +453,11 @@ namespace 货架标准上位机.ViewModels public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/ViewModels/StocktakingViewModel.cs b/货架标准上位机/ViewModels/StocktakingViewModel.cs index cc5bb3d..9d9d470 100644 --- a/货架标准上位机/ViewModels/StocktakingViewModel.cs +++ b/货架标准上位机/ViewModels/StocktakingViewModel.cs @@ -254,6 +254,7 @@ namespace 货架标准上位机.ViewModel if (SelectedOutOrder == null) { //选择的单据为空无法进行查询 + Logs.Write("选择的单据为空无法进行查询!"); return; } #region 调用接口获取盘点单物料明细 @@ -261,21 +262,26 @@ namespace 货架标准上位机.ViewModel { var body = new GetStockTakingOrderMatDetailRequest() { - StockTakingOrderId = selectedOutOrder.Id, - StockTakingOrderNumber = selectedOutOrder.StocktakingOrderNumber, + StockTakingOrderId = SelectedOutOrder.Id, + StockTakingOrderNumber = SelectedOutOrder.StocktakingOrderNumber, UserName = LocalStatic.CurrentUser, DeviceType = LocalFile.Config.DeviceType, }; + Logs.Write("[刷新盘点明细1]!"); var Result = ApiHelp.GetDataFromHttp>>(LocalFile.Config.ApiIpHost + "stockTaking/getStockTakingOrderMatDetail", body, "POST"); if (Result != null && Result.Code == 200) { + Logs.Write("[刷新盘点明细]Result != null && Result.Code == 200!"); if (Result.Data.Count > 0) { - DataGridItemSource = new ObservableCollection(Result.Data); + Logs.Write("[刷新盘点明细2]Result.Data.Count>0"); + var list = Result.Data.OrderBy(t => t.IsStocktaking).ToList(); + DataGridItemSource = new ObservableCollection(list); } else { + Logs.Write("[刷新盘点明细2]Result.Data.Count<=0,该单据未查询到盘点明细"); App.Current.Dispatcher.Invoke(() => { DataGridItemSource?.Clear(); @@ -286,10 +292,12 @@ namespace 货架标准上位机.ViewModel } else if (Result != null) { + Logs.Write("[刷新盘点明细2]Result != null"); Growl.Warning(Result.Message); } else { + Logs.Write("[刷新盘点明细2]调用接口失败"); Growl.Warning("调用接口失败!"); } }); diff --git a/货架标准上位机/ViewModels/StoreInfoViewModel.cs b/货架标准上位机/ViewModels/StoreInfoViewModel.cs index fc5302a..357a28f 100644 --- a/货架标准上位机/ViewModels/StoreInfoViewModel.cs +++ b/货架标准上位机/ViewModels/StoreInfoViewModel.cs @@ -263,7 +263,11 @@ namespace 货架标准上位机.ViewModel public int PageSize { get => pageSize; - set { SetProperty(ref pageSize, value); } + set + { + SetProperty(ref pageSize, value); + BtnSearch(true); + } } diff --git a/货架标准上位机/Views/HomeView.xaml b/货架标准上位机/Views/HomeView.xaml index c12de53..7582b93 100644 --- a/货架标准上位机/Views/HomeView.xaml +++ b/货架标准上位机/Views/HomeView.xaml @@ -10,10 +10,10 @@ xmlns:pi="https://github.com/ping9719/wpfex" d:DesignHeight="737" d:DesignWidth="1192" LoadedVisibleFirst="loadFir" IsVisibleChanged="vis"> - + - - + + @@ -27,12 +27,12 @@ - - + + + --> diff --git a/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml b/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml index 1268104..7f66b5a 100644 --- a/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml +++ b/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml @@ -112,11 +112,9 @@ - - diff --git a/货架标准上位机/Views/MainWindows/MainWindow2.xaml b/货架标准上位机/Views/MainWindows/MainWindow2.xaml index 7a4de24..46587b9 100644 --- a/货架标准上位机/Views/MainWindows/MainWindow2.xaml +++ b/货架标准上位机/Views/MainWindows/MainWindow2.xaml @@ -97,107 +97,260 @@ - - - - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + - + + - + - + + - + - + + - + + + + + + + + + + + + + + + + + - + - + + - + - + + - + - + - + - + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + @@ -206,11 +359,6 @@ - - - - - diff --git a/货架标准上位机/Views/MatInventoryDetailView.xaml b/货架标准上位机/Views/MatInventoryDetailView.xaml index 1ea47be..c11a0f4 100644 --- a/货架标准上位机/Views/MatInventoryDetailView.xaml +++ b/货架标准上位机/Views/MatInventoryDetailView.xaml @@ -58,7 +58,7 @@ ItemsSource="{Binding Items}" Text="{Binding MatCode}" DisplayMemberPath="MatCode"/> - + @@ -126,7 +126,7 @@ - + + + + diff --git a/货架标准上位机/Views/StockTakingView.xaml b/货架标准上位机/Views/StockTakingView.xaml index 914cc5d..7592afe 100644 --- a/货架标准上位机/Views/StockTakingView.xaml +++ b/货架标准上位机/Views/StockTakingView.xaml @@ -126,7 +126,7 @@ - + diff --git a/货架标准上位机/Views/Windows/UserLoginView.xaml.cs b/货架标准上位机/Views/Windows/UserLoginView.xaml.cs index 248a92c..7192f8b 100644 --- a/货架标准上位机/Views/Windows/UserLoginView.xaml.cs +++ b/货架标准上位机/Views/Windows/UserLoginView.xaml.cs @@ -42,6 +42,8 @@ namespace 货架标准上位机 { ComboBoxId.ItemsSource = LocalFile.Config.Sys.SaveLogin; ComboBoxId.SelectedIndex = 0; + + PasswordBoxPass.Password = LocalFile.Config.Sys.LastSaveLoginPassword; } } @@ -74,8 +76,8 @@ namespace 货架标准上位机 PassWord = pass, IsNoLogin = false, }; - if (LocalFile.Config.IsMx) - body.IsNoLogin = true; + //if (LocalFile.Config.IsMx) + // body.IsNoLogin = true; var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "user/userLogin", body, "POST"); if (Result != null && Result.Code != 200) @@ -99,6 +101,7 @@ namespace 货架标准上位机 { LocalFile.Config.Sys.SaveLogin.RemoveAll(t => t == loginName); LocalFile.Config.Sys.SaveLogin.Insert(0, loginName); + LocalFile.Config.Sys.LastSaveLoginPassword = pass; LocalFile.Config.Sys.SaveLogin = LocalFile.Config.Sys.SaveLogin.Take(LocalFile.Config.Sys.SaveLoginCount).ToList(); LocalFile.SaveConfig(); } diff --git a/货架标准上位机/data/jsconfig.json b/货架标准上位机/data/jsconfig.json index 93d951d..8500eee 100644 --- a/货架标准上位机/data/jsconfig.json +++ b/货架标准上位机/data/jsconfig.json @@ -2,9 +2,9 @@ //连接不上加:SslMode=none; "MySql": "server=localhost;Database=db1;Uid=root;Pwd=123456;Convert Zero Datetime=True", //货架服务器的IP和端口号 - "ApiIpHost": "http://192.168.9.21:8888/", + "ApiIpHost": "http://127.0.0.1:8888/", //WebSocket的地址 - "WebSocketUrl": "ws://192.168.9.21:7789/ws", + "WebSocketUrl": "ws://127.0.0.1:7789/ws", //货架分区 "GroupName": [ "A0-2" ], //设备类型 可以配置为每个电脑不一样 diff --git a/货架标准上位机/货架标准上位机 - Backup.csproj b/货架标准上位机/货架标准上位机 - Backup.csproj new file mode 100644 index 0000000..c0bb730 --- /dev/null +++ b/货架标准上位机/货架标准上位机 - Backup.csproj @@ -0,0 +1,141 @@ + + + + WinExe + net472 + enable + true + latest + 重庆盟讯电子科技有限公司 + Copyright © 2024 + 1.0.0 + 1.0.0 + Resources\Logo.ico + 重庆盟讯电子科技有限公司 + 货架标准上位机 + 货架标准上位机 + + + + 1701;1702;8601;8618;8625 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\..\..\..\..\Windows\assembly\GAC_MSIL\Interop.BarTender\10.1.4.1__109ff779a1b4cbc7\Interop.BarTender.dll + True + + + + + + + + PreserveNewest + + + + PreserveNewest + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Never + + + + + + + + + + + + + + PreserveNewest + + + Code + + + Code + + + Code + + + + + + Designer + + + Designer + + + + diff --git a/货架标准上位机/货架标准上位机.csproj b/货架标准上位机/货架标准上位机.csproj index dad7ff1..aad4143 100644 --- a/货架标准上位机/货架标准上位机.csproj +++ b/货架标准上位机/货架标准上位机.csproj @@ -1,142 +1,150 @@  - - WinExe - net472 - enable - true - latest - 重庆盟讯电子科技有限公司 - Copyright © 2024 - 1.0.0 - 1.0.0 - Resources\Logo.ico - 重庆盟讯电子科技有限公司 - 货架标准上位机 - 货架标准上位机 - + + WinExe + net472 + enable + true + latest + 重庆盟讯电子科技有限公司 + Copyright © 2024 + 1.0.0 + 1.0.0 + Resources\Logo.ico + 重庆盟讯电子科技有限公司 + 货架标准上位机 + 货架标准上位机 + - - 1701;1702;8601;8618;8625 - + + 1701;1702;8601;8618;8625 + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - ..\..\..\..\..\Windows\assembly\GAC_MSIL\Interop.BarTender\10.1.4.1__109ff779a1b4cbc7\Interop.BarTender.dll - True - - - - + + + ..\..\..\..\..\Windows\assembly\GAC_MSIL\Interop.BarTender\10.1.4.1__109ff779a1b4cbc7\Interop.BarTender.dll + True + + + + - - - PreserveNewest - - - - PreserveNewest - - - - - - - - - + + + PreserveNewest + + + + PreserveNewest + + + + + + + + + + + + + - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - Never - - + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Never + + - - - + + + - - - + + + - - - PreserveNewest - - - Code - - - Code - - - Code - - + + + PreserveNewest + + + Code + + + Code + + + Code + + - - - Designer - - - Designer - - + + + Designer + + + Designer + +