From cb6090bf0b92b16da1b61619cfdbaa6810b64c45 Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Thu, 9 May 2024 09:43:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=98=E7=82=B9=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WCS.BLL/DbModels/InOutRecord.cs | 19 +- ...Detail.cs => StockTakingOrderMatDetail.cs} | 13 +- WCS.BLL/HardWare/IShelfBase.cs | 8 +- WCS.BLL/HardWare/SingleLightShelf.cs | 10 + WCS.BLL/HardWare/SmartShelf.cs | 755 +++++++++++++----- WCS.BLL/HardWare/SmartShelfModule.cs | 153 +++- WCS.BLL/Manager/WarningManager.cs | 5 +- WCS.BLL/Services/IService/IGenerateService.cs | 2 + .../Services/IService/IInOutRecordService.cs | 19 + .../Services/IService/IStockTakingService.cs | 2 + WCS.BLL/Services/Service/GenerateService.cs | 9 + .../Services/Service/InOutRecordService.cs | 126 +++ WCS.BLL/Services/Service/InstoreService.cs | 10 +- WCS.BLL/Services/Service/OutstoreService.cs | 86 +- .../Services/Service/StockTakingService.cs | 345 ++++++-- .../InOutRecord/GetInOutRecordRequest.cs | 33 + .../ApiModel/InOutRecord/InOutRecordModel.cs | 44 + .../OutStore/GetOutOrderDetailRequest.cs | 3 +- .../GetStockTakingOrderMatDetailRequest.cs | 2 +- .../StockTakingOrderMatDetailModel.cs | 42 + .../WebSocketModel/WebSocketMessageModel.cs | 7 + .../Controllers/InOutRecordController.cs | 66 ++ WCS.WebApi/Controllers/OutstoreController.cs | 12 +- .../Controllers/StockTakingController.cs | 7 + WCS.WebApi/Program.cs | 2 + .../ViewModels/InOutRecordViewModel.cs | 329 ++++++++ .../ViewModels/OutInventoryAddDucumentViewModel.cs | 72 +- .../ViewModels/OutInventoryDocumentViewModel.cs | 54 ++ .../ViewModels/OutInventoryViewModel.cs | 9 +- .../ViewModels/StocktakingDocumentViewModel.cs | 168 ++-- .../ViewModels/StocktakingViewModel.cs | 296 +++++++ 货架标准上位机/Views/InOutRecordView.xaml | 196 +++++ 货架标准上位机/Views/InOutRecordView.xaml.cs | 39 + .../Views/MainWindows/MainWindow.xaml | 20 - .../Views/MainWindows/MainWindow1.xaml | 11 +- .../Views/OutInventoryDocumentView.xaml | 1 + 货架标准上位机/Views/OutInventoryView.xaml | 4 +- 货架标准上位机/Views/StockTakingView.xaml | 177 ++++ 货架标准上位机/Views/StockTakingView.xaml.cs | 69 ++ .../Views/StocktakingDocumentDetailView.xaml | 52 ++ .../Views/StocktakingDocumentDetailView.xaml.cs | 47 ++ .../Views/StocktakingDocumentView.xaml | 4 +- 货架标准上位机/WebSocket.cs | 4 + 43 files changed, 2909 insertions(+), 423 deletions(-) rename WCS.BLL/DbModels/{StockTakingOrderDetail.cs => StockTakingOrderMatDetail.cs} (92%) create mode 100644 WCS.BLL/Services/IService/IInOutRecordService.cs create mode 100644 WCS.BLL/Services/Service/InOutRecordService.cs create mode 100644 WCS.Model/ApiModel/InOutRecord/GetInOutRecordRequest.cs create mode 100644 WCS.Model/ApiModel/InOutRecord/InOutRecordModel.cs create mode 100644 WCS.Model/ApiModel/Stocktaking/StockTakingOrderMatDetailModel.cs create mode 100644 WCS.WebApi/Controllers/InOutRecordController.cs create mode 100644 货架标准上位机/ViewModels/InOutRecordViewModel.cs create mode 100644 货架标准上位机/ViewModels/StocktakingViewModel.cs create mode 100644 货架标准上位机/Views/InOutRecordView.xaml create mode 100644 货架标准上位机/Views/InOutRecordView.xaml.cs create mode 100644 货架标准上位机/Views/StockTakingView.xaml create mode 100644 货架标准上位机/Views/StockTakingView.xaml.cs create mode 100644 货架标准上位机/Views/StocktakingDocumentDetailView.xaml create mode 100644 货架标准上位机/Views/StocktakingDocumentDetailView.xaml.cs diff --git a/WCS.BLL/DbModels/InOutRecord.cs b/WCS.BLL/DbModels/InOutRecord.cs index 48e5e2d..08014b8 100644 --- a/WCS.BLL/DbModels/InOutRecord.cs +++ b/WCS.BLL/DbModels/InOutRecord.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using WCS.DAL.DbModels; +using WCS.Model.ApiModel.InOutRecord; namespace WCS.BLL.DbModels { @@ -113,13 +114,17 @@ namespace WCS.BLL.DbModels /// [SugarColumn(ColumnName = "operate_user", Length = 100, IsNullable = true, ColumnDescription = "创建人")] public string OperateUser { get; set; } + + /// + /// 序号 + /// + [SugarColumn(IsIgnore = true)] + public int RowNumber { get; set; } + /// + /// 是否已经选择 + /// + [SugarColumn(IsIgnore = true)] + public bool IsSelected { get; set; } } - public enum DirectionEnum - { - 入库 = 0, - 出库 = 1, - 丢失 = 2, - 盘点 = 3, - } } diff --git a/WCS.BLL/DbModels/StockTakingOrderDetail.cs b/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs similarity index 92% rename from WCS.BLL/DbModels/StockTakingOrderDetail.cs rename to WCS.BLL/DbModels/StockTakingOrderMatDetail.cs index 31f9b19..203ebb3 100644 --- a/WCS.BLL/DbModels/StockTakingOrderDetail.cs +++ b/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs @@ -47,7 +47,12 @@ namespace WCS.BLL.DbModels public StoreInfo StoreInfo { get; set; } #endregion - #region 物料属性 + #region 库存属性 + /// + /// 库存数据的ID + /// + [SugarColumn(ColumnName = "inventory_detail_id", IsNullable = true)] + public int InventoryDetailId { get; set; } /// /// 物料编码(SN) /// @@ -116,5 +121,11 @@ namespace WCS.BLL.DbModels /// [SugarColumn(ColumnName = "create_user", Length = 100, IsNullable = true, ColumnDescription = "最后更新人")] public string UpdateUser { get; set; } + + /// + /// 用于绑定中显示序号 + /// + [SugarColumn(IsIgnore = true)] + public int RowNumber { get; set; } } } diff --git a/WCS.BLL/HardWare/IShelfBase.cs b/WCS.BLL/HardWare/IShelfBase.cs index b24d048..c346d22 100644 --- a/WCS.BLL/HardWare/IShelfBase.cs +++ b/WCS.BLL/HardWare/IShelfBase.cs @@ -90,7 +90,13 @@ namespace WCS.BLL.HardWare /// /// 货架进入盘点模式 /// - public void GoInStocktaking(); + public void GoInStocktaking(List MatDetails, StockTakingOrder outOrder); + + + /// + /// 货架单个确认盘点 + /// + public bool ConfirmStocktakingSingle(int BoardId,int LightNumber); /// /// 货架退出盘点模式 diff --git a/WCS.BLL/HardWare/SingleLightShelf.cs b/WCS.BLL/HardWare/SingleLightShelf.cs index bc3ddf8..3cebed2 100644 --- a/WCS.BLL/HardWare/SingleLightShelf.cs +++ b/WCS.BLL/HardWare/SingleLightShelf.cs @@ -26,6 +26,11 @@ namespace WCS.BLL.HardWare public List ExceptionMessages { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public bool IsWarning { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public bool ConfirmStocktakingSingle(int BoardId, int LightNumber) + { + throw new NotImplementedException(); + } + public void GoInInstore(string IPAdress) { throw new NotImplementedException(); @@ -41,6 +46,11 @@ namespace WCS.BLL.HardWare throw new NotImplementedException(); } + public void GoInStocktaking(List MatDetails, StockTakingOrder outOrder) + { + throw new NotImplementedException(); + } + public void GoOutInstore() { throw new NotImplementedException(); diff --git a/WCS.BLL/HardWare/SmartShelf.cs b/WCS.BLL/HardWare/SmartShelf.cs index 7a69ff3..9855f92 100644 --- a/WCS.BLL/HardWare/SmartShelf.cs +++ b/WCS.BLL/HardWare/SmartShelf.cs @@ -1,20 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using TouchSocket.Core; -using TouchSocket.Sockets; -using WCS.BLL.Config; +using WCS.BLL.Config; using WCS.BLL.DbModels; using WCS.BLL.Manager; -using WCS.DAL; using WCS.DAL.Db; using WCS.DAL.DbModels; using WCS.Model; +using WCS.Model.ApiModel.InOutRecord; +using WCS.Model.ApiModel.OutStore; using WCS.Model.WebSocketModel; -using static System.Formats.Asn1.AsnWriter; namespace WCS.BLL.HardWare { @@ -150,6 +142,7 @@ namespace WCS.BLL.HardWare public string OrderNumber { get; set; } + public StockTakingOrder CurrentStockTakingOrder { get; set; } public List ModuleIds { get; set; } public string ClientIp { get; set; } @@ -224,13 +217,28 @@ namespace WCS.BLL.HardWare ExceptionMessages.Add($"模组{item.ModuleCode}未进入入库模式!"); } //通信校验 + var messages = notInstoreList.Select(t => $"模组{t.ModuleCode}未进入入库模式!").ToList(); + messages.Add("请及时联系技术人员处理!"); + var exceptionMessage = string.Join("\r\n", messages); + var warningModel = new WebSocketMessageModel() + { + IsWarning = true, + WarningType = WarningTypeEnum.进入入库未响应, + StoreId = 0, + StoreCode = "", + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1", + }; + WarningManager.SendWarning(warningModel); IsWarning = true; WarningLight.WaringLightAlwaysRed(TcpCleint); } //没有报警才亮蓝灯 - if(!IsWarning) + if (!IsWarning) WarningLight.BlueLight(TcpCleint); //绑定当前进入入库PDA/WCS前端的IP CurrentCom = IPAddress; @@ -295,6 +303,22 @@ namespace WCS.BLL.HardWare { ExceptionMessages.Add($"模组{item.ModuleCode}未成功退出入库模式!"); } + + var messages = list.Select(t => $"模组{t.ModuleCode}未成功退出入库模式!").ToList(); + messages.Add("请及时联系技术人员处理!"); + var exceptionMessage = string.Join("\r\n", messages); + var warningModel = new WebSocketMessageModel() + { + IsWarning = true, + WarningType = WarningTypeEnum.进入入库未响应, + StoreId = 0, + StoreCode = "", + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1", + }; + WarningManager.SendWarning(warningModel); } //报警灯熄灭 WarningLight.CloseLight(TcpCleint); @@ -302,43 +326,89 @@ namespace WCS.BLL.HardWare public void GoInOutstore(List MatDetails, OutOrder outOrder) { - //第一步:设置货架当前模式 - if (CurrentMode != Mode.待机模式) + try { - Modules.ForEach(t => { t.Reset(TcpCleint); }); + //第一步:设置货架当前模式 + if (CurrentMode != Mode.待机模式) + { + Modules.ForEach(t => { t.Reset(TcpCleint); }); + //复位需要点时间间隔才能响应指令 + Thread.Sleep(1500); + } + CurrentMode = Mode.出库模式; + + //第二步:货架添加需要出的SN 出库的领料单号 + //移除货架所有现有待出库的MatSN + CurrentOutStoreMatSNs.Clear(); + ////添加属于当前货架的物料 + CurrentOutStoreMatSNs.AddRange(MatDetails.Select(t => t.MatSN).ToList()); + ////记录当前出库的发料单 + CurrentOutOrder = outOrder; + + ////第三步:对应的模组进入出库模式 + var boardIds = MatDetails.Select(t => t.StoreInfo.BoardId) + .Distinct() + .OrderBy(t => t) + .ToList(); + var outModules = Modules.Where(t => boardIds.Contains(t.BoardId)).ToList(); + outModules.ForEach(t => + { + var outMatSns = MatDetails.Where(mat => mat.StoreInfo.BoardId == t.BoardId) + .Select(mat => mat.MatSN) + .ToList(); + t.GoInOutStoreMode(TcpCleint, outMatSns); + }); + //所有板子亮灯后 亮警示灯 + WarningLight.GreenLight(TcpCleint); + + Task.Run(() => + { + //通信校验 + var timeOut = 3000; + var timeSpan = TimeSpan.FromMilliseconds(0); + var beginTime = DateTime.Now; + while (timeSpan <= TimeSpan.FromMilliseconds(timeOut)) + { + timeSpan = DateTime.Now - beginTime; + + //所有板子成功进入出库模式 表示进入出库模式成功,跳出循环 + var isExistsNotInstore = outModules.Where(t => t.CurrentMode != Mode.出库模式) + .Where(t => t.IsEnable) + .Any(); + if (!isExistsNotInstore) + { + break; + } + //循环延时处理 + Thread.Sleep(50); + } + var list = outModules.Where(t => t.IsEnable && t.CurrentMode != Mode.出库模式).ToList(); + if (list != null && list.Count > 0) + { + var messages = list.Select(t => $"模组{t.ModuleCode}未进入出库模式!").ToList(); + messages.Add("请及时联系技术人员处理!"); + var exceptionMessage = string.Join("\r\n", messages); + var warningModel = new WebSocketMessageModel() + { + IsWarning = true, + WarningType = WarningTypeEnum.进入入库未响应, + StoreId = 0, + StoreCode = "", + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1", + }; + WarningManager.SendWarning(warningModel); + } + }); } - CurrentMode = Mode.出库模式; - - //第二步:货架添加需要出的SN 出库的领料单号 - //移除货架所有现有待出库的MatSN - CurrentOutStoreMatSNs.Clear(); - ////添加属于当前货架的物料 - CurrentOutStoreMatSNs.AddRange(MatDetails.Select(t => t.MatSN).ToList()); - ////记录当前出库的发料单 - CurrentOutOrder = outOrder; - - ////第三步:对应的模组进入出库模式 - var boardIds = MatDetails.Select(t => t.StoreInfo.BoardId) - .Distinct() - .OrderBy(t => t) - .ToList(); - var outModules = Modules.Where(t => boardIds.Contains(t.BoardId)).ToList(); - outModules.ForEach(t => + catch (Exception e) { - var outMatSns = MatDetails.Where(mat => mat.StoreInfo.BoardId == t.BoardId) - .Select(mat => mat.MatSN) - .ToList(); - t.GoInOutStoreMode(TcpCleint, outMatSns); - }); - //所有板子亮灯后 亮警示灯 - WarningLight.GreenLight(TcpCleint); + GoOutOutstore(); + throw e; + } } - - public void GoInStocktaking() - { - this.CurrentMode = Mode.盘点模式; - } - public void GoOutOutstore() { //找到在出库中的模组 @@ -348,13 +418,228 @@ namespace WCS.BLL.HardWare { module.GoOutOutStoreMode(TcpCleint); } + //Task.Run(() => + //{ + //通信校验 + var timeOut = 3000; + var timeSpan = TimeSpan.FromMilliseconds(0); + var beginTime = DateTime.Now; + while (timeSpan <= TimeSpan.FromMilliseconds(timeOut)) + { + timeSpan = DateTime.Now - beginTime; + + //所有板子成功退出出库模式 表示退出出库模式成功,跳出循环 + var isExistsOutstore = outingModules.Where(t => t.CurrentMode == Mode.出库模式) + .Where(t => t.IsEnable) + .Any(); + if (!isExistsOutstore) + { + break; + } + //循环延时处理 + Thread.Sleep(50); + } + var list = outingModules.Where(t => t.IsEnable && t.CurrentMode == Mode.出库模式).ToList(); + if (list != null && list.Count > 0) + { + var messages = list.Select(t => $"模组{t.ModuleCode}未退出出库模式!").ToList(); + messages.Add("请及时联系技术人员处理!"); + var exceptionMessage = string.Join("\r\n", messages); + var warningModel = new WebSocketMessageModel() + { + IsWarning = true, + WarningType = WarningTypeEnum.退出入库未响应, + StoreId = 0, + StoreCode = "", + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1", + }; + WarningManager.SendWarning(warningModel); + } + //}); CurrentOutStoreMatSNs.Clear(); WarningLight.CloseLight(TcpCleint); this.CurrentMode = Mode.待机模式; } + public void GoInStocktaking(List MatDetails, StockTakingOrder stockTakingOrder) + { + try + { + //第一步:设置货架当前模式 + if (CurrentMode != Mode.待机模式) + { + Modules.ForEach(t => + { + if (CurrentMode != Mode.待机模式) + t.Reset(TcpCleint); + }); + //复位需要点时间间隔才能响应指令 + Thread.Sleep(1500); + } + + CurrentMode = Mode.盘点模式; + + //第二步:货架添加 盘点单号 记录当前盘点的发料单 + CurrentStockTakingOrder = stockTakingOrder; + + //第三步:对应的模组进入盘点模式 + var boardIds = MatDetails.Select(t => t.StoreInfo.BoardId) + .Distinct() + .OrderBy(t => t) + .ToList(); + + var outModules = Modules.Where(t => boardIds.Contains(t.BoardId)).ToList(); + outModules.ForEach(t => + { + var noStockTakings = MatDetails.Where(mat => mat.StoreInfo.BoardId == t.BoardId) + .Where(t => t.IsStocktaking == false) + .Select(mat => mat.MatSN) + .ToList(); + t.GoInStockTakingMode(TcpCleint, noStockTakings); + + var stockTakings = MatDetails.Where(mat => mat.StoreInfo.BoardId == t.BoardId) + .Where(t => t.IsStocktaking) + .Select(mat => mat.MatSN) + .ToList(); + t.ConfirmStockTaking(TcpCleint, stockTakings); + }); + + //所有板子亮灯后 亮警示灯 + WarningLight.GreenLight(TcpCleint); + + Task.Run(() => + { + //通信校验 + var timeOut = 3000; + var timeSpan = TimeSpan.FromMilliseconds(0); + var beginTime = DateTime.Now; + while (timeSpan <= TimeSpan.FromMilliseconds(timeOut)) + { + timeSpan = DateTime.Now - beginTime; + + //所有板子成功进入盘点模式 表示进入盘点模式成功,跳出循环 + var isExistsNotInstore = outModules.Where(t => t.CurrentMode != Mode.盘点模式) + .Where(t => t.IsEnable) + .Any(); + if (!isExistsNotInstore) + { + break; + } + //循环延时处理 + Thread.Sleep(50); + } + var list = outModules.Where(t => t.IsEnable && t.CurrentMode != Mode.盘点模式).ToList(); + if (list != null && list.Count > 0) + { + var messages = list.Select(t => $"模组{t.ModuleCode}未进入盘点模式!").ToList(); + messages.Add("请及时联系技术人员处理!"); + var exceptionMessage = string.Join("\r\n", messages); + var warningModel = new WebSocketMessageModel() + { + IsWarning = true, + WarningType = WarningTypeEnum.进入盘点未响应, + StoreId = 0, + StoreCode = "", + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1", + }; + WarningManager.SendWarning(warningModel); + } + }); + } + catch (Exception e) + { + GoOutStocktaking(); + throw e; + } + } + /// + /// 确认盘点 Pda进行触发 + /// + public bool ConfirmStocktakingSingle(int BoardId, int LightNumber) + { + //寻找对应模组 + var module = Modules.Where(t => t.BoardId == BoardId).FirstOrDefault(); ; + if (module == null) + return false; + else + { + module.ConfirmStockTakingSingle(TcpCleint, LightNumber); + //报警灯闪一下 + WarningLight.SuccessLightGreenEnd(TcpCleint); + + //通知前台刷新 + Task.Run(() => + { + var messageMode = new WebSocketMessageModel() + { + IsWarning = false, + ClientIp = "127.0.0.1", + WarningType = WarningTypeEnum.通知刷新盘点 + }; + WarningManager.SendWarning(messageMode); + }); + + return true; + } + } public void GoOutStocktaking() { + //找到在盘点中的模组 + var stockTakingModules = Modules.Where(t => t.CurrentMode == Mode.盘点模式) + .ToList(); + foreach (var module in stockTakingModules) + { + module.GoOutStockTakingMode(TcpCleint); + } + Task.Run(() => + { + //通信校验 + var timeOut = 3000; + var timeSpan = TimeSpan.FromMilliseconds(0); + var beginTime = DateTime.Now; + while (timeSpan <= TimeSpan.FromMilliseconds(timeOut)) + { + timeSpan = DateTime.Now - beginTime; + + //所有板子成功退出盘点模式 表示退出盘点模式成功,跳出循环 + var isExistsNotInstore = stockTakingModules.Where(t => t.CurrentMode == Mode.盘点模式) + .Where(t => t.IsEnable) + .Any(); + if (!isExistsNotInstore) + { + break; + } + //循环延时处理 + Thread.Sleep(50); + } + var list = stockTakingModules.Where(t => t.IsEnable && t.CurrentMode == Mode.盘点模式).ToList(); + if (list != null && list.Count > 0) + { + var messages = list.Select(t => $"模组{t.ModuleCode}未退出盘点模式!").ToList(); + messages.Add("请及时联系技术人员处理!"); + var exceptionMessage = string.Join("\r\n", messages); + var warningModel = new WebSocketMessageModel() + { + IsWarning = true, + WarningType = WarningTypeEnum.退出盘点未响应, + StoreId = 0, + StoreCode = "", + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1", + }; + WarningManager.SendWarning(warningModel); + } + }); + CurrentOutStoreMatSNs.Clear(); + WarningLight.CloseLight(TcpCleint); this.CurrentMode = Mode.待机模式; } @@ -413,6 +698,12 @@ namespace WCS.BLL.HardWare case 0x08://出库模式中异常信号 OutstoreExceptionReturnProcess(data, boardId, lightNumber); break; + case 0x09://进入盘点模式返回信号 + GoInStockTakingReturnProcess(data, boardId, lightNumber); + break; + case 0x0A://退出盘点模式返回信号 + GoOutStockTakingReturnProcess(data, boardId, lightNumber); + break; case 0x13://复位的返回信号 ResetReturnProcess(data, boardId, lightNumber); break; @@ -508,7 +799,7 @@ namespace WCS.BLL.HardWare // var inventoryDetail = DbHelp.db.Queryable().Where(t => t.StoreId == storeInfo.Id).First(); // if (inventoryDetail != null) // { - // var inOutRecord = new InOutRecord() + // var inOutRecord = new MatInventoryDetailService() // { // StoreCode = storeInfo.StoreCode, // StoreId = storeInfo.Id, @@ -622,18 +913,17 @@ namespace WCS.BLL.HardWare /// public void InStoreReturnProcess(byte[] data) { - Logs.Write("协议处理5.1"); var boardId = (data[TcpCleint.PreFixLength + 0] << 8) + data[TcpCleint.PreFixLength + 1]; var number = Convert.ToInt32(data[TcpCleint.PreFixLength + 3]); var storeInfo = DbHelp.db.Queryable().Where(t => t.BoardId == boardId && t.LightNumber == number).First(); - Logs.Write("协议处理5.2"); + if (storeInfo == null) { //TODO 报错 return; } - Logs.Write("协议处理5.3"); + var module = this.Modules.Where(t => t.BoardId == boardId) .FirstOrDefault(); if (module == null) @@ -641,7 +931,7 @@ namespace WCS.BLL.HardWare //TODO 报错 return; } - Logs.Write("协议处理5.4"); + #region 判断是否扫码获取物料信息 //物料未扫码 if (this.InStoreData == null) @@ -655,7 +945,6 @@ namespace WCS.BLL.HardWare } else { - Logs.Write("协议处理5.5"); var exceptionMessage = storeInfo.StoreCode + "入库过程中存在物料未扫描上架!"; var warningModel = new WebSocketMessageModel() { @@ -671,7 +960,6 @@ namespace WCS.BLL.HardWare }; WarningManager.SendWarning(warningModel); - Logs.Write("协议处理5.4"); module.ComfirmErrInstore(TcpCleint); WarningLight.WaringLightAlwaysRed(TcpCleint); return; @@ -750,7 +1038,6 @@ namespace WCS.BLL.HardWare module.ComfirmInstore(TcpCleint); //报警灯亮绿灯 鸣叫一次提示 WarningLight.SuccessLightBlueEnd(TcpCleint); - //SuccessLightBlueEnd(shelfStatus.ClientIp, shelfStatus.LightId); }); } catch (Exception ex) @@ -759,7 +1046,6 @@ namespace WCS.BLL.HardWare Logs.Write($"入库保存数据异常,异常信息为{ex.Message}"); //报警灯报警 WarningLight.WaringLightBlueEnd(TcpCleint); - //WaringLightBlueEnd(shelfStatus.ClientIp, shelfStatus.LightId); } } #endregion @@ -822,7 +1108,6 @@ namespace WCS.BLL.HardWare { Logs.Write("协议处理5.4"); var exceptionMessage = storeInfo.StoreCode + "入库过程中存在物料未扫描上架!"; - //WebSoceketManager.TrySendMessage("127.0.0.1", exceptionMessage); var warningModel = new WebSocketMessageModel() { WarningType = WarningTypeEnum.入库中未扫描上架, @@ -954,47 +1239,21 @@ namespace WCS.BLL.HardWare ExceptionMessages.Add($"{storeInfo.StoreCode}物料{storeInfo.CurrentMatSn}丢失,库存数据已删除,请重新扫码后入库"); #endregion - #region 【后台】丢失的数据处理 - Task.Run(() => + #region 不处理、WebSocket通知前台 + var exceptionMessage = storeInfo.StoreCode + $"进入出库自检发现物料{storeInfo.CurrentMatSn}丢失,请确认是否删除?"; + var warningModel = new WebSocketMessageModel() { - 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 InOutRecord() - { - 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(); - } - }); + WarningType = WarningTypeEnum.出库自检丢失, + StoreId = storeInfo.Id, + StoreCode = storeInfo.StoreCode, + ModuleId = module.ModuleId, + ModuleCode = module.ModuleCode, + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1" + }; + WarningManager.SendWarning(warningModel); #endregion WarningLight.WaringLightAlwaysRed(TcpCleint); @@ -1013,6 +1272,23 @@ namespace WCS.BLL.HardWare #region 缓存记录异常信息 ExceptionMessages.Add($"库位{storeInfo.StoreCode}:存在物料未扫描上架"); #endregion + + #region 不处理、WebSocket通知前台 + var exceptionMessage = $"进入出库自检发现库位{storeInfo.StoreCode}存在物料未扫描上架,请拿下后点击【确认】消除报警"; + var warningModel = new WebSocketMessageModel() + { + WarningType = WarningTypeEnum.出库自检未扫描上架, + StoreId = storeInfo.Id, + StoreCode = storeInfo.StoreCode, + ModuleId = module.ModuleId, + ModuleCode = module.ModuleCode, + ShelfCode = ShelfCode, + ShelfId = ShelfId, + WarningMessage = exceptionMessage, + ClientIp = "127.0.0.1" + }; + WarningManager.SendWarning(warningModel); + #endregion WarningLight.WaringLightAlwaysRed(TcpCleint); } else @@ -1029,7 +1305,6 @@ namespace WCS.BLL.HardWare { if (CurrentMode != Mode.出库模式) { - //TO DO 未在出库模式 要报错 Logs.Write($"出库错误:{ShelfCode}该货架模式不是出库模式或盘点模式!"); return; } @@ -1039,14 +1314,12 @@ namespace WCS.BLL.HardWare .First(); if (storeInfo == null) { - //TO DO 报错 return; } var module = this.Modules.Where(t => t.BoardId == boardId) .FirstOrDefault(); if (module == null) { - //TO DO 报错 return; } //当前库位未记录MatSn @@ -1076,12 +1349,14 @@ namespace WCS.BLL.HardWare WarningLight.WaringLightAlwaysRed(TcpCleint); return; } - //获取对应的出库单明细 - var orderOrderDetails = DbHelp.db.Queryable() + + //获取对应的出库单物料明细 + var orderMatDetails = DbHelp.db.Queryable() .Where(t => t.OrderId == CurrentOutOrder.Id) .Where(t => t.MatSN == inventoryDetail.MatSN) - .ToList(); - if (orderOrderDetails == null || orderOrderDetails.Count == 0) + .First(); + + if (orderMatDetails == null) { Logs.Write($"{storeInfo.CurrentMatSn},OrderDetail出库明细信息不存在"); //报警灯报警 @@ -1118,18 +1393,28 @@ namespace WCS.BLL.HardWare //库位表 修改 storeInfo.CurrentMatSn = string.Empty; - //发料单明细表 更新为已出库 - orderOrderDetails.ForEach(x => + //发料单物料明细表 更新为已出库 + orderMatDetails.IsSended = true; + + //发料需求表增加数量 + if (CurrentOutOrder.SyncType == SyncTypeEnum.ByMatCode) { - x.IsSended = true; - }); - //TO DO 发料需求表增加数量 + //同步更新发料需求表已发数量 + var outOrderDetail = DbHelp.db.Queryable() + .Where(t => t.Id == orderMatDetails.OutOrderDetailId) + .First(); + if (outOrderDetail != null) + { + outOrderDetail.OutQty += orderMatDetails.MatQty; + DbHelp.db.Updateable(outOrderDetail).ExecuteCommand(); + } + } //保存数据 DbHelp.db.Deleteable(inventoryDetail).ExecuteCommand(); DbHelp.db.Insertable(inOutRecord).ExecuteCommand(); DbHelp.db.Updateable(storeInfo).ExecuteCommand(); - DbHelp.db.Updateable(orderOrderDetails).ExecuteCommand(); + DbHelp.db.Updateable(orderMatDetails).ExecuteCommand(); DbHelp.db.CommitTran(); //报警灯同时亮绿灯并鸣叫一次提示。 @@ -1154,104 +1439,115 @@ namespace WCS.BLL.HardWare CurrentOutStoreMatSNs.RemoveAll(t => t == matSN);//删除本次已出的物料SN var isExsistOut = CurrentOutStoreMatSNs.Any(); - //本批次出库已完成 + //本次亮灯的物料已全部取出 if (!isExsistOut) { - //退出出库模式 - GoOutOutstore(); - WarningLight.CloseLight(TcpCleint); - var currentPickBillNumber = CurrentOutOrder.OrderNumber; - //OrderNumber = string.Empty; + + + //更新订单状态 + UpdateOutOrderStatus(CurrentOutOrder); + CurrentOutOrder = null; - } - //看是否是分批次出库的情况 分批次亮灯 - if (LocalFile.Config.IsSameMatCodeOut) - { - #region 触发下一批次的精准发料 - //查一下是否是当前发料单最后一个货架(在出库模式 同一个发料单下) - var isLastShelf = ShelfManager.Shelves - .Where(t => t.OrderNumber == OrderNumber) - .Where(t => t.CurrentMode == Mode.出库模式) - .Any(); - if (!isLastShelf) + //退出出库模式 + var taskGoOut = Task.Run(() => { - Logs.Write($"发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料"); - var outOrder = DbHelp.db.Queryable() - .Where(t => t.OrderNumber == OrderNumber) - .First(); - if (outOrder != null) + GoOutOutstore(); + }); + //看是否是分批次出库的情况 分批次亮灯 + Task.Run(async () => + { + await Task.WhenAll(taskGoOut); + if (LocalFile.Config.IsSameMatCodeOut) { - 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) + #region 触发下一批次的物料发料 + //查一下是否是当前发料单最后一个货架(在出库模式 同一个发料单下) + var isLastShelf = ShelfManager.Shelves + .Where(t => t.OrderNumber == OrderNumber) + .Where(t => t.CurrentMode == Mode.出库模式) + .Any(); + if (!isLastShelf) { - //存在待出库 然后之前又没亮灯的情况 => 精准发料分批次亮灯 - Logs.Write($"发料单{OrderNumber},还有物料未出!"); - 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) + Logs.Write($"发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料"); + var outOrder = DbHelp.db.Queryable() + .Where(t => t.OrderNumber == OrderNumber) + .First(); + if (outOrder != null) { - var matCode = outOrderDetailCount.First().bb.Key; - outOrderMatDetails = outOrderMatDetails.Where(t => t.MatCode == matCode) - .ToList(); - Logs.Write($"发料单{OrderNumber},本次亮灯物料{matCode}!"); + 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) + { + //存在待出库 然后之前又没亮灯的情况 => 继续分批次亮灯 + Logs.Write($"发料单{OrderNumber},还有物料未出!"); + 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($"发料单{OrderNumber},本次亮灯物料{matCode}!"); + } + //相同物料不存在盘数超过n的情况,剩余物料全部亮灯 + else + { + //剩余物料全出 + Logs.Write($"发料单{OrderNumber},剩余物料灯全亮!"); + } + + 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($"发料单{OrderNumber},当前物料已发完!"); + } } - //相同物料不存在盘数超过n的情况,剩余物料全部亮灯 else { - //剩余物料全出 - Logs.Write($"发料单{OrderNumber},剩余物料灯全亮!"); + Logs.Write($"发料单{OrderNumber},OutOrder为null,肯定是有问题"); } - 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($"发料单{OrderNumber},当前物料已发完!"); } + #endregion } - else - { - Logs.Write($"发料单{OrderNumber},OutOrder为null,肯定是有问题"); - } - - } - #endregion + }); } + + } catch (Exception ex) { @@ -1262,6 +1558,55 @@ namespace WCS.BLL.HardWare #endregion } + public void UpdateOutOrderStatus(OutOrder order) + { + //再去获取一遍Order + order = DbHelp.db.Queryable() + .Where(t => t.Id == order.Id) + .First(); + if (order != null) + { + #region 物料明细表是否已发完 + var orderMatDetails = DbHelp.db.Queryable() + .Where(t => t.OrderId == order.Id) + .ToList(); + var isExistNoSendMat = orderMatDetails.Where(t => t.IsSended == false) + .Any(); + if (isExistNoSendMat) + { + order.OrderStatus = OutOrderStatus.部分发料; + } + else + { + order.OrderStatus = OutOrderStatus.全部发料; + order.OutOrderExeStatus = OutOrderExeStatus.发料完成; + } + #endregion + + #region 单据明细是否已满足发料需求 + if (order.OrderStatus == OutOrderStatus.全部发料 && + order.SyncType == SyncTypeEnum.ByMatCode) + { + var orderDetails = DbHelp.db.Queryable() + .Where(t => t.OrderId == order.Id) + .ToList(); + var isExistNoSend = orderDetails.Where(t => t.ReqQty > t.OutQty).Any(); + if (isExistNoSend) + { + order.OrderStatus = OutOrderStatus.部分发料; + + } + else + { + order.OrderStatus = OutOrderStatus.全部发料; + } + } + #endregion + + DbHelp.db.Updateable(order).ExecuteCommand(); + } + } + /// /// 退出出库模式返回信号处理 /// @@ -1385,6 +1730,37 @@ namespace WCS.BLL.HardWare } } + /// + /// 进入盘点模式返回信号 + /// + /// + /// + /// + public void GoInStockTakingReturnProcess(byte[] data, int boardId, int lightNumber) + { + var module = this.Modules.Where(t => t.BoardId == boardId).FirstOrDefault(); + if (module == null) + { + return; + } + else + { + module.CurrentMode = Mode.盘点模式; + } + } + + public void GoOutStockTakingReturnProcess(byte[] data, int boardId, int lightNumber) + { + var module = this.Modules.Where(t => t.BoardId == boardId && t.CurrentMode == Mode.盘点模式).FirstOrDefault(); + if (module == null) + { + return; + } + else + { + module.CurrentMode = Mode.待机模式; + } + } public void ResetReturnProcess(byte[] data, int boardId, int lightNumber) { @@ -1398,7 +1774,6 @@ namespace WCS.BLL.HardWare module.CurrentMode = Mode.待机模式; } } - #endregion } diff --git a/WCS.BLL/HardWare/SmartShelfModule.cs b/WCS.BLL/HardWare/SmartShelfModule.cs index b864abd..bcbd796 100644 --- a/WCS.BLL/HardWare/SmartShelfModule.cs +++ b/WCS.BLL/HardWare/SmartShelfModule.cs @@ -40,12 +40,32 @@ namespace WCS.BLL.HardWare /// public byte[] GoInOutstoreModeData = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 }; + /// + /// 确认出库信号 + /// public byte[] ComfirmOutstoreData = { 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /// /// 退出出库模式 /// public byte[] GoOutOutstoreModeData = { 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + /// + /// 进入盘点模式 + /// 04代表颜色为蓝色色 + /// + public byte[] GoInStockTakingModeData = { 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 }; + /// + /// 确认盘点 + /// 03代表颜色为黄色 + /// + public byte[] ConfirmStockTakingData = { 0x09, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }; + + /// + /// 退出盘点模式 + /// + public byte[] GoOutStockTakingModeData = { 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /// /// 复位命令 /// @@ -58,6 +78,7 @@ namespace WCS.BLL.HardWare public Mode CurrentMode { get; set; } public List CurrentOutSns { get; set; } + public List CurrentStockTakingSns { get; set; } public void SetCurrentMode() { @@ -204,13 +225,11 @@ namespace WCS.BLL.HardWare } tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoInOutstoreModeData)); } - public void ComfirmOutstore(TCPClient tcpClient, byte lightNumber) { ComfirmOutstoreData[1] = lightNumber; tcpClient.Send(tcpClient.GenerateMessage(BoardId, ComfirmOutstoreData)); } - /// /// 退出出库模式 /// @@ -219,5 +238,135 @@ namespace WCS.BLL.HardWare { tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoOutOutstoreModeData)); } + + /// + /// 未盘点的物料进入盘点模式、亮灯 + /// + /// + public void GoInStockTakingMode(TCPClient tcpClient, List stockTakingSns) + { + CurrentStockTakingSns = stockTakingSns; + + var storeInfos = DbHelp.db.Queryable() + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + //计算物料在库的库位 + char[] data = "0000000000000000".ToCharArray(); + var storeNumber = storeInfos.Count(); + + char[] outData = "0000000000000000".ToCharArray(); + //盘点位置亮灯 + if (stockTakingSns != null && stockTakingSns.Count > 0) + { + var outStoreInfos = storeInfos.Where(t => stockTakingSns.Contains(t.CurrentMatSn)) + .ToList(); + foreach (var storeInfo in outStoreInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + outData[storeInfo.LightNumber - 1] = '1'; + } + } + } + var outDataStr = string.Join("", outData.Reverse()); + var data3 = outDataStr.Substring(8, 8); + var data4 = outDataStr.Substring(0, 8); + GoInStockTakingModeData[2] = Convert.ToByte(data3, 2); + GoInStockTakingModeData[3] = Convert.ToByte(data4, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoInStockTakingModeData)); + } + + /// + /// 已确认过的物料 + /// + /// + public void ConfirmStockTaking(TCPClient tcpClient, List stockTakingSns) + { + CurrentStockTakingSns = stockTakingSns; + + var storeInfos = DbHelp.db.Queryable() + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + //计算物料在库的库位 + char[] data = "0000000000000000".ToCharArray(); + var storeNumber = storeInfos.Count(); + + char[] outData = "0000000000000000".ToCharArray(); + //盘点位置亮灯 + if (stockTakingSns != null && stockTakingSns.Count > 0) + { + var outStoreInfos = storeInfos.Where(t => stockTakingSns.Contains(t.CurrentMatSn)) + .ToList(); + foreach (var storeInfo in outStoreInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + outData[storeInfo.LightNumber - 1] = '1'; + } + } + } + + var outDataStr = string.Join("", outData.Reverse()); + var data3 = outDataStr.Substring(8, 8); + var data4 = outDataStr.Substring(0, 8); + ConfirmStockTakingData[2] = Convert.ToByte(data3, 2); + ConfirmStockTakingData[3] = Convert.ToByte(data4, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ConfirmStockTakingData)); + } + + /// + /// 单个确认物料 + /// + /// + public void ConfirmStockTakingSingle(TCPClient tcpClient, int lightNumber) + { + var storeInfos = DbHelp.db.Queryable() + .Where(t => t.BoardId == BoardId) + .OrderBy(t => t.LightNumber) + .ToList(); + //计算物料在库的库位 + char[] data = "0000000000000000".ToCharArray(); + var storeNumber = storeInfos.Count(); + + //盘点位置亮灯 + var outStoreInfos = storeInfos.Where(t => t.LightNumber == lightNumber) + .ToList(); + char[] outData = "0000000000000000".ToCharArray(); + foreach (var storeInfo in outStoreInfos) + { + if (!string.IsNullOrEmpty(storeInfo.CurrentMatSn) && storeInfo.LightNumber > 0 && storeInfo.LightNumber <= storeNumber) + { + outData[storeInfo.LightNumber - 1] = '1'; + } + } + var outDataStr = string.Join("", outData.Reverse()); + var data3 = outDataStr.Substring(8, 8); + var data4 = outDataStr.Substring(0, 8); + ConfirmStockTakingData[2] = Convert.ToByte(data3, 2); + ConfirmStockTakingData[3] = Convert.ToByte(data4, 2); + + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ConfirmStockTakingData)); + } + + + /// + /// 退出盘点模式 + /// + /// + public void GoOutStockTakingMode(TCPClient tcpClient) + { + tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoOutStockTakingModeData)); + } + + public void ComfirmStockTaking(TCPClient tcpClient, byte lightNumber) + { + ComfirmOutstoreData[1] = lightNumber; + tcpClient.Send(tcpClient.GenerateMessage(BoardId, ComfirmOutstoreData)); + } + } } diff --git a/WCS.BLL/Manager/WarningManager.cs b/WCS.BLL/Manager/WarningManager.cs index 4ce40a6..0d9f4af 100644 --- a/WCS.BLL/Manager/WarningManager.cs +++ b/WCS.BLL/Manager/WarningManager.cs @@ -9,6 +9,7 @@ using WCS.BLL.DbModels; using WCS.BLL.HardWare; using WCS.DAL.Db; using WCS.DAL.DbModels; +using WCS.Model.ApiModel.InOutRecord; using WCS.Model.WebSocketModel; namespace WCS.BLL.Manager @@ -71,8 +72,8 @@ namespace WCS.BLL.Manager case WarningTypeEnum.入库自检丢失: SolveLoss(warningInManager); break; - case WarningTypeEnum.入库自检未扫描上架: - SolveNoScan(warningInManager); + case WarningTypeEnum.出库自检丢失: + SolveLoss(warningInManager); break; } } diff --git a/WCS.BLL/Services/IService/IGenerateService.cs b/WCS.BLL/Services/IService/IGenerateService.cs index e73a90a..e9051a1 100644 --- a/WCS.BLL/Services/IService/IGenerateService.cs +++ b/WCS.BLL/Services/IService/IGenerateService.cs @@ -13,5 +13,7 @@ namespace WCS.BLL.Services.IService public Task>> generateMatInfo(GenerateMatInfoRequest request); public Task generateStockTakingNumber(); + + public Task generateOutOrderNumber(); } } diff --git a/WCS.BLL/Services/IService/IInOutRecordService.cs b/WCS.BLL/Services/IService/IInOutRecordService.cs new file mode 100644 index 0000000..0621ac8 --- /dev/null +++ b/WCS.BLL/Services/IService/IInOutRecordService.cs @@ -0,0 +1,19 @@ + +using WCS.BLL.DbModels; +using WCS.Model; +using WCS.Model.ApiModel; +using WCS.Model.ApiModel.InOutRecord; +using WCS.Model.ApiModel.MatInventoryDetail; +using WCS.Model.ApiModel.User; + +namespace WCS.BLL.Services.IService +{ + + public interface IInOutRecordService + { + public Task> getInOutRecord(GetInOutRecordRequest request); + + public Task> exportInOutRecord(GetInOutRecordRequest request); + } + +} diff --git a/WCS.BLL/Services/IService/IStockTakingService.cs b/WCS.BLL/Services/IService/IStockTakingService.cs index 5dcb24c..06522e5 100644 --- a/WCS.BLL/Services/IService/IStockTakingService.cs +++ b/WCS.BLL/Services/IService/IStockTakingService.cs @@ -18,6 +18,8 @@ namespace WCS.BLL.Services.IService public Task> getStockTakingOrders(GetStockTakingOrdersRequest request); + public Task> getStockTakingOrdersByStatus(GetStockTakingOrdersRequest request); + public Task getStockTakingOrderMatDetail(GetStockTakingOrderMatDetailRequest request); public Task startStockTakingOrder(GetStockTakingOrderMatDetailRequest request); diff --git a/WCS.BLL/Services/Service/GenerateService.cs b/WCS.BLL/Services/Service/GenerateService.cs index d20624f..2dc388b 100644 --- a/WCS.BLL/Services/Service/GenerateService.cs +++ b/WCS.BLL/Services/Service/GenerateService.cs @@ -124,5 +124,14 @@ namespace WCS.BLL.Services.Service return "PD" + DateTime.Now.ToString("yyMMddHHmmssfff"); } } + + public async Task generateOutOrderNumber() + { + lock (stockTakingFlag) + { + Thread.Sleep(1); + return "CK" + DateTime.Now.ToString("yyMMddHHmmssfff"); + } + } } } diff --git a/WCS.BLL/Services/Service/InOutRecordService.cs b/WCS.BLL/Services/Service/InOutRecordService.cs new file mode 100644 index 0000000..cc6c217 --- /dev/null +++ b/WCS.BLL/Services/Service/InOutRecordService.cs @@ -0,0 +1,126 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using TouchSocket.Core; +using WCS.BLL.DbModels; +using WCS.BLL.Services.IService; +using WCS.DAL.Db; +using WCS.Model; +using WCS.BLL.DbModels; +using WCS.Model.ApiModel; +using WCS.Model.ApiModel.InOutRecord; +using WCS.Model.ApiModel.MatInventoryDetail; +using WCS.Model.ApiModel.User; +using WCS.DAL.DbModels; + +namespace WCS.BLL.Services.Service +{ + public class InOutRecordService : IInOutRecordService + { + public async Task> getInOutRecord(GetInOutRecordRequest request) + { + try + { + var recordsQueryable = DbHelp.db.Queryable() + .LeftJoin((id, si) => id.StoreId == si.Id) + .WhereIF(!string.IsNullOrEmpty(request.MatSN), (id, si) => id.MatSN.Contains(request.MatSN)) + .WhereIF(!string.IsNullOrEmpty(request.MatCode), (id, si) => id.MatCode.Contains(request.MatCode)) + .WhereIF(!string.IsNullOrEmpty(request.MatName), (id, si) => id.MatName.Contains(request.MatName)) + .WhereIF(!string.IsNullOrEmpty(request.MatBatch), (id, si) => id.MatBatch.Contains(request.MatBatch)) + .WhereIF(!string.IsNullOrEmpty(request.MatSpec), (id, si) => id.MatSpec.Contains(request.MatSpec)) + .WhereIF(!string.IsNullOrEmpty(request.MatSupplier), (id, si) => id.MatSpec.Contains(request.MatSupplier)) + .WhereIF(!string.IsNullOrEmpty(request.MatCustomer), (id, si) => id.MatSpec.Contains(request.MatCustomer)) + + + .WhereIF(request.StoreId != 0, (id, si) => id.StoreId == request.StoreId) + .WhereIF(!string.IsNullOrEmpty(request.StoreCode), (id, si) => id.StoreCode.Contains(request.StoreCode)) + ; + + var totalCount = await recordsQueryable.CountAsync(); + var records = await recordsQueryable + .Skip((request.PageNumber - 1) * request.PageSize).Take(request.PageSize) + .Select() + .ToListAsync(); + //生成序号 + for (int i = 0; i < records.Count; i++) + { + records[i].RowNumber = (request.PageNumber - 1) * 10 + i + 1; + } + + return new PageQueryResponse() + { + Code = 200, + Message = $"success", + Data = new PageQueryResponseData() + { + TotalCount = totalCount, + MaxPage = request.PageSize == 0 ? 0 : (int)Math.Ceiling((decimal)totalCount / request.PageSize), + Count = records.Count, + Lists = records.ToList() + } + }; + + } + catch (Exception ex) + { + return new PageQueryResponse() + { + Code = 300, + Message = $"操作失败:{ex.Message}", + }; + } + } + + public async Task> exportInOutRecord(GetInOutRecordRequest request) + { + try + { + var recordsQueryable = DbHelp.db.Queryable() + .LeftJoin((id, si) => id.StoreId == si.Id) + .WhereIF(!string.IsNullOrEmpty(request.MatSN), (id, si) => id.MatSN.Contains(request.MatSN)) + .WhereIF(!string.IsNullOrEmpty(request.MatCode), (id, si) => id.MatCode.Contains(request.MatCode)) + .WhereIF(!string.IsNullOrEmpty(request.MatName), (id, si) => id.MatName.Contains(request.MatName)) + .WhereIF(!string.IsNullOrEmpty(request.MatBatch), (id, si) => id.MatBatch.Contains(request.MatBatch)) + .WhereIF(!string.IsNullOrEmpty(request.MatSpec), (id, si) => id.MatSpec.Contains(request.MatSpec)) + .WhereIF(!string.IsNullOrEmpty(request.MatSupplier), (id, si) => id.MatSpec.Contains(request.MatSupplier)) + .WhereIF(!string.IsNullOrEmpty(request.MatCustomer), (id, si) => id.MatSpec.Contains(request.MatCustomer)) + + + .WhereIF(request.StoreId != 0, (id, si) => id.StoreId == request.StoreId) + .WhereIF(!string.IsNullOrEmpty(request.StoreCode), (id, si) => id.StoreCode.Contains(request.StoreCode)) + ; + var records = await recordsQueryable + .Skip((request.PageNumber - 1) * request.PageSize).Take(request.PageSize) + .Select() + .ToListAsync(); + //生成序号 + var index = 1; + records.ForEach(r => + { + r.RowNumber = index++; + }); + return new PageQueryResponse() + { + Code = 200, + Message = $"success", + Data = new PageQueryResponseData() + { + Lists = records + } + }; + } + catch (Exception ex) + { + return new PageQueryResponse() + { + Code = 300, + Message = $"操作失败:{ex.Message}", + }; + } + } + } +} diff --git a/WCS.BLL/Services/Service/InstoreService.cs b/WCS.BLL/Services/Service/InstoreService.cs index 5e87a5c..a53b5a6 100644 --- a/WCS.BLL/Services/Service/InstoreService.cs +++ b/WCS.BLL/Services/Service/InstoreService.cs @@ -153,7 +153,7 @@ namespace WCS.BLL.Services.Service } #region 获取物料数据 //调用接口或者直接查询数据库 //TODO做成配置 调用接口 - if (1 == 1) + if (1 != 1) { #region 调用Mes接口获取物料信息 try @@ -169,10 +169,10 @@ namespace WCS.BLL.Services.Service Data = new List() {new queryByBarResponse() { materialBar = request.MatSn, - materialCode = "111222", + materialCode = "100200300", materialName = "电阻", materialQty = 1000, - } + } } }; //查询到物料信息 @@ -341,6 +341,10 @@ namespace WCS.BLL.Services.Service { Code = 201, Message = $"超时未入库!请重新扫码后入库!", + Data = new + { + StoreCode = string.Empty, + } }; } } diff --git a/WCS.BLL/Services/Service/OutstoreService.cs b/WCS.BLL/Services/Service/OutstoreService.cs index 3e0902b..1b4dccb 100644 --- a/WCS.BLL/Services/Service/OutstoreService.cs +++ b/WCS.BLL/Services/Service/OutstoreService.cs @@ -33,12 +33,6 @@ namespace WCS.BLL.Services.Service Message = "单据同步失败:缺少需要出库的物料类型!" }; } - //判断是否有单据号 没有单据号系统自动生成一个 - if (string.IsNullOrEmpty(request.OrderNumber)) - { - request.OrderNumber = GenerateOrderNumber(); - } - Console.WriteLine(DateTime.Now); //保存数据 await DbHelp.db.BeginTranAsync(); try @@ -132,12 +126,6 @@ namespace WCS.BLL.Services.Service }; } - //判断是否有单据号 没有单据号系统自动生成一个 - if (string.IsNullOrEmpty(request.OrderNumber)) - { - request.OrderNumber = GenerateOrderNumber(); - } - #region 保存数据 //锁库存 @@ -205,7 +193,6 @@ namespace WCS.BLL.Services.Service } - public async Task GetOutOrderList(GetOutOrderListRequest request) { //直接查询 @@ -254,7 +241,7 @@ namespace WCS.BLL.Services.Service }; } //直接查询 - var recordsQueryable = DbHelp.db.Queryable(); + var recordsQueryable = DbHelp.db.Queryable().Where(t => request.OrderExeStatus.Contains(t.OutOrderExeStatus)); var totalCount = await recordsQueryable.CountAsync(); var records = await recordsQueryable @@ -396,12 +383,6 @@ namespace WCS.BLL.Services.Service }; } - private string GenerateOrderNumber() - { - var orderNumber = "PD" + DateTime.Now.ToString("yyyyMMddHHmmss"); - return orderNumber; - } - public async Task GoInOutstore(GetOutOrderDetailRequest request) { try @@ -421,6 +402,7 @@ namespace WCS.BLL.Services.Service }; } + //如果是按物料编码出库 需要计算物料明细、并进行物料锁定 if (order.SyncType == SyncTypeEnum.ByMatCode) { @@ -442,10 +424,17 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"出库单据{request.OrderNumber}物料已全部出库!", + Message = $"出库单据{request.OrderNumber}物料已全部完成出库!", Data = null }; } + + if (request.IsStart)//&& order.OutOrderExeStatus != OutOrderExeStatus.发料完成 + { + order.OutOrderExeStatus = OutOrderExeStatus.开始发料; + DbHelp.db.Updateable(order).ExecuteCommand(); + } + //按货架分组 按物料找到对应的货架 var shelfIds = outOrderMatDetails.Select(t => t.StoreInfo.ShelfId) .Distinct() @@ -488,14 +477,13 @@ namespace WCS.BLL.Services.Service //对应的货架对应位置 进入出库模式 亮灯 shelfs.ForEach(shelf => - { - var matDetails = outOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode) - - .Distinct() - .ToList(); - shelf.GoInOutstore(matDetails, order); - shelf.OrderNumber = order.OrderNumber; - }); + { + var matDetails = outOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode) + .Distinct() + .ToList(); + shelf.GoInOutstore(matDetails, order); + shelf.OrderNumber = order.OrderNumber; + }); //返回 return new ResponseCommon() @@ -507,11 +495,11 @@ namespace WCS.BLL.Services.Service } catch (Exception ex) { - await GoInOutstore(request); + await GoOutOutstore(request); throw ex; } } - + //计算、加锁 private ResponseBase CaculateOutOrderMatDetails(OutOrder order) { try @@ -546,7 +534,7 @@ namespace WCS.BLL.Services.Service List outOrderMatDetails = new List(); foreach (var outOrderDetail in outOrderDetails) { - //2.1筛选 满足 图号 批次的库存 + //2.1筛选 满足 物料编码、批次的库存 var matInventoryDetails = DbHelp.db.Queryable() .Where(t => t.MatCode == outOrderDetail.MatCode) .WhereIF(!string.IsNullOrEmpty(outOrderDetail.MatBatch), t => t.MatBatch == outOrderDetail.MatBatch) @@ -561,8 +549,8 @@ namespace WCS.BLL.Services.Service { outOrderMatDetails.Add(new OutOrderMatDetail() { - OrderId = outOrderDetail.Id, - OrderNumber = outOrderDetail.OrderNumber, + OrderId = order.Id, + OrderNumber = order.OrderNumber, OutOrderDetailId = outOrderDetail.Id, InventoryDetailId = matInventoryDetails[i].Id, StoreId = matInventoryDetails[i].StoreId, @@ -589,8 +577,8 @@ namespace WCS.BLL.Services.Service outOrderMatDetails.Add(new OutOrderMatDetail() { - OrderId = outOrderDetail.Id, - OrderNumber = outOrderDetail.OrderNumber, + OrderId = order.Id, + OrderNumber = order.OrderNumber, OutOrderDetailId = outOrderDetail.Id, InventoryDetailId = matInventoryDetails[i].Id, StoreId = matInventoryDetails[i].StoreId, @@ -631,6 +619,7 @@ namespace WCS.BLL.Services.Service } } + //解锁 private ResponseBase CancelOutOrderMatDetails(OutOrder order) { try @@ -638,7 +627,9 @@ namespace WCS.BLL.Services.Service DbHelp.db.BeginTran(); var outOrderMatDetails = DbHelp.db.Queryable() .Where(t => t.OrderId == order.Id) + .Where(t => t.IsSended == false) .ToList(); + var inventoryIds = outOrderMatDetails.Select(t => t.Id).ToList(); var inventoryDetails = DbHelp.db.Queryable() .Where(t => inventoryIds.Contains(t.Id)) @@ -646,6 +637,7 @@ namespace WCS.BLL.Services.Service inventoryDetails.ForEach(t => { t.IsLocked = false; }); DbHelp.db.Deleteable(outOrderMatDetails).ExecuteCommand(); DbHelp.db.Updateable(inventoryDetails).ExecuteCommand(); + DbHelp.db.CommitTran(); return new ResponseCommon() { @@ -666,6 +658,7 @@ namespace WCS.BLL.Services.Service public async Task GoOutOutstore(GetOutOrderDetailRequest request) { + //获取出库单 var order = await DbHelp.db.Queryable() .WhereIF(request.OrderId != 0, t => t.Id == request.OrderId) @@ -681,10 +674,28 @@ namespace WCS.BLL.Services.Service }; } + //执行状态改为暂停 + if (request.IsPause && order.OutOrderExeStatus != OutOrderExeStatus.发料完成) + { + order.OutOrderExeStatus = OutOrderExeStatus.暂停发料; + DbHelp.db.Updateable(order).ExecuteCommand(); + } + //找到正在出对应出库单的货架 var shelves = ShelfManager.Shelves.Where(t => t.OrderNumber == request.OrderNumber) + .Where(t => t.CurrentMode == HardWare.Mode.出库模式) .ToList(); + if (shelves == null || shelves.Count == 0) + { + return new ResponseCommon() + { + Code = 201, + Message = $"单据【{request.OrderNumber}】不在出库中!", + Data = null + }; + } + //退出出库模式 shelves.ForEach(t => { @@ -695,12 +706,15 @@ namespace WCS.BLL.Services.Service if (order.SyncType == SyncTypeEnum.ByMatCode) CancelOutOrderMatDetails(order); + + return new ResponseCommon() { Code = 200, Message = "Success", Data = null }; + } } } diff --git a/WCS.BLL/Services/Service/StockTakingService.cs b/WCS.BLL/Services/Service/StockTakingService.cs index 69163eb..ec976d6 100644 --- a/WCS.BLL/Services/Service/StockTakingService.cs +++ b/WCS.BLL/Services/Service/StockTakingService.cs @@ -10,6 +10,7 @@ using WCS.BLL.Services.IService; using WCS.DAL.Db; using WCS.DAL.DbModels; using WCS.Model; +using WCS.Model.ApiModel.InOutRecord; using WCS.Model.ApiModel.Stocktaking; namespace WCS.BLL.Services.Service @@ -114,6 +115,7 @@ namespace WCS.BLL.Services.Service StoreId = inventoryDetail.StoreId, StoreCode = inventoryDetail.StoreCode, + InventoryDetailId = inventoryDetail.Id, MatSN = inventoryDetail.MatSN, MatCode = inventoryDetail.MatCode, MatName = inventoryDetail.MatName, @@ -193,6 +195,7 @@ namespace WCS.BLL.Services.Service StoreId = inventoryDetail.StoreId, StoreCode = inventoryDetail.StoreCode, + InventoryDetailId = inventoryDetail.Id, MatSN = inventoryDetail.MatSN, MatCode = inventoryDetail.MatCode, MatName = inventoryDetail.MatName, @@ -272,6 +275,7 @@ namespace WCS.BLL.Services.Service StoreId = inventoryDetail.StoreId, StoreCode = inventoryDetail.StoreCode, + InventoryDetailId = inventoryDetail.Id, MatSN = inventoryDetail.MatSN, MatCode = inventoryDetail.MatCode, MatName = inventoryDetail.MatName, @@ -313,7 +317,7 @@ 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)); switch (request.StocktakingOrderStatus) { @@ -368,6 +372,55 @@ namespace WCS.BLL.Services.Service } } + public async Task> getStockTakingOrdersByStatus(GetStockTakingOrdersRequest request) + { + try + { + var recordsQueryable = DbHelp.db.Queryable(); + + switch (request.StocktakingOrderStatus) + { + case Model.ApiModel.Stocktaking.StocktakingOrderStatus.未盘点: + recordsQueryable = recordsQueryable.Where(t => t.StocktakingOrderStatus == StocktakingOrderStatus.未盘点); + break; + case Model.ApiModel.Stocktaking.StocktakingOrderStatus.部分盘点: + recordsQueryable = recordsQueryable.Where(t => t.StocktakingOrderStatus == StocktakingOrderStatus.部分盘点); + break; + case Model.ApiModel.Stocktaking.StocktakingOrderStatus.已提交: + recordsQueryable = recordsQueryable.Where(t => t.StocktakingOrderStatus == StocktakingOrderStatus.已提交); + break; + case Model.ApiModel.Stocktaking.StocktakingOrderStatus.盘点完成: + recordsQueryable = recordsQueryable.Where(t => t.StocktakingOrderStatus == StocktakingOrderStatus.盘点完成); + break; + default: + break; + } + + var records = await recordsQueryable + .OrderByDescending(t => t.CreateTime) + .Take(40) + .ToListAsync(); + + return new PageQueryResponse() + { + Code = 200, + Message = $"success", + Data = new PageQueryResponseData() + { + Lists = records.ToList() + } + }; + } + catch (Exception ex) + { + return new PageQueryResponse() + { + Code = 300, + Message = $"操作失败:{ex.Message}", + }; + } + } + public async Task getStockTakingOrderMatDetail(GetStockTakingOrderMatDetailRequest request) { #region 查询盘点单 @@ -380,7 +433,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"查询失败:不存在Id为{request.StockTakingOrderId}的出库单!", + Message = $"查询失败:不存在Id为{request.StockTakingOrderId}的盘点单!", }; } } @@ -393,7 +446,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"查询失败:不存在单据号为{request.StockTakingOrderNumber}的出库单!", + Message = $"查询失败:不存在单据号为{request.StockTakingOrderNumber}的盘点单!", }; } } @@ -411,7 +464,11 @@ namespace WCS.BLL.Services.Service var stockTakingOrderMatDetail = await DbHelp.db.Queryable() .Where(t => t.StocktakingOrderId == order.Id) .ToListAsync(); - + //生成序号 + for (int i = 0; i < stockTakingOrderMatDetail.Count; i++) + { + stockTakingOrderMatDetail[i].RowNumber = i + 1; + } return new ResponseCommon>() { Code = 200, @@ -434,7 +491,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"操作失败:不存在Id为{request.StockTakingOrderId}的出库单!", + Message = $"操作失败:不存在Id为{request.StockTakingOrderId}的盘点单!", }; } } @@ -447,7 +504,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"操作失败:不存在单据号为{request.StockTakingOrderNumber}的出库单!", + Message = $"操作失败:不存在单据号为{request.StockTakingOrderNumber}的盘点单!", }; } } @@ -461,26 +518,62 @@ namespace WCS.BLL.Services.Service } #endregion - #region 查询物料明细 + #region 查询需要盘点的物料明细 //查询物料明细 - var stockTakingOrderMatDetail = await DbHelp.db.Queryable() + var stockTakingOrderMatDetails = await DbHelp.db.Queryable() .Where(t => t.StocktakingOrderId == order.Id) + //.Where(t => t.IsStocktaking == false) + .Includes(t => t.StoreInfo) .ToListAsync(); - //TO DO 货架按物料进入盘点模式 - var shelf = ShelfManager.Shelves.First(); - shelf.GoInStocktaking(); - shelf.OrderNumber = order.StocktakingOrderNumber; + if (stockTakingOrderMatDetails == null || stockTakingOrderMatDetails.Count == 0) + { + return new ResponseCommon() + { + Code = 201, + Message = $"盘点单据{order.StocktakingOrderNumber}物料已全部盘点!", + Data = null + }; + } + #endregion + #region 按货架进入盘点模式 + var shelfIds = stockTakingOrderMatDetails.Select(t => t.StoreInfo.ShelfId) + .Distinct() + .ToList(); + var shelfs = ShelfManager.Shelves.Where(t => shelfIds.Contains(t.ShelfId)).ToList(); ; + + var outherModeShelfs = shelfs.Where(t => t.CurrentMode != HardWare.Mode.待机模式).Select(t => t.ShelfCode).ToList(); + if (outherModeShelfs != null && outherModeShelfs.Count > 0) + { + return new ResponseCommon() + { + Code = 201, + Message = $"进入盘点模式失败:货架{string.Join("", outherModeShelfs)}不在待机模式", + Data = null + }; + } + //对应的货架对应位置 进入盘点模式 亮灯 + shelfs.ForEach(shelf => + { + var matDetails = stockTakingOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode) + .Distinct() + .ToList(); + shelf.GoInStocktaking(matDetails, order); + shelf.OrderNumber = order.StocktakingOrderNumber; + }); + //返回 return new ResponseCommon() { Code = 200, - Message = $"success", - Data = shelf.ShelfCode + Message = "Success", + Data = null }; + #endregion } catch (Exception ex) { + await endStockTakingOrder(request); return new ResponseCommon() { Code = 300, @@ -503,7 +596,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"操作失败:不存在Id为{request.StockTakingOrderId}的出库单!", + Message = $"操作失败:不存在Id为{request.StockTakingOrderId}的盘点单!", }; } } @@ -516,7 +609,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"操作失败:不存在单据号为{request.StockTakingOrderNumber}的出库单!", + Message = $"操作失败:不存在单据号为{request.StockTakingOrderNumber}的盘点单!", }; } } @@ -530,7 +623,7 @@ namespace WCS.BLL.Services.Service } #endregion - #region 查询当前盘点盘已启动的货架 + #region 查询当前盘点单 已启动的货架 var shelfs = ShelfManager.Shelves.Where(t => t.CurrentMode == HardWare.Mode.盘点模式 && t.OrderNumber == order.StocktakingOrderNumber).ToList(); shelfs.ForEach(t => { @@ -556,32 +649,43 @@ namespace WCS.BLL.Services.Service } public async Task queryMatInfoInStocktakingOrder(QueryMatInfoInStocktakingOrderRequest request) - { - //判断是否有这个物料 - var storeInfo = await DbHelp.db.Queryable() - .LeftJoin((id,si)=>id.StoreId == si.Id) + { + //判断库存中是否有这个物料 + var inventoryDetail = await DbHelp.db.Queryable() + .LeftJoin((id, si) => id.StoreId == si.Id) .Where((id, si) => id.MatSN == request.MatSN) .Select((id, si) => si) .FirstAsync(); - if (storeInfo == null) + if (inventoryDetail == null) { return new ResponseCommon() { Code = 201, - Message = $"不存在物料[{request.MatSN}]", + Message = $"库存中不存在物料[{request.MatSN}]", }; } - //判断货架是否进入入库模式 - var shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == storeInfo.ShelfCode).FirstOrDefault(); + + //判断货架是否已进入盘点模式 + var shelf = ShelfManager.Shelves + .Where(t => t.ShelfCode == inventoryDetail.ShelfCode) + .FirstOrDefault(); ; if (shelf == null) { return new ResponseCommon() { Code = 201, - Message = $"物料[{request.MatSN}不是本次需要盘点的物料!!!]", + Message = $"货架{inventoryDetail.ShelfCode}不存在!", }; } - //进入入库模式的那个单据是否有对应的单据明细 + else if (shelf.CurrentMode != HardWare.Mode.盘点模式) + { + return new ResponseCommon() + { + Code = 201, + Message = $"货架{inventoryDetail.ShelfCode}不在盘点模式!", + }; + } + var stockTakingOrder = await DbHelp.db.Queryable() .Where(t => t.StocktakingOrderNumber == shelf.OrderNumber) .FirstAsync(); @@ -599,38 +703,89 @@ namespace WCS.BLL.Services.Service .Where(t => t.MatSN == request.MatSN) .FirstAsync(); return new ResponseCommon() - { + { Code = 200, Message = "success", Data = stockTakinbgOrder }; - } public async Task confirmStocktakingOrder(ConfirmStocktakingOrderRequest request) { - //获取盘点物料明细 - var stockTakingMatDetail =await DbHelp.db.Queryable() - .Where(t => t.Id == request.Id) - .FirstAsync(); - if (stockTakingMatDetail == null) + try { + //获取盘点物料明细 + var stockTakingMatDetail = await DbHelp.db.Queryable() + .Where(t => t.Id == request.Id) + .Includes(t => t.StoreInfo) + .FirstAsync(); + + if (stockTakingMatDetail == null) + { + return new ResponseCommon() + { + Code = 201, + Message = $"不存在的盘点明细", + }; + } + + DbHelp.db.BeginTran(); + //修改盘点物料明细的数量 + stockTakingMatDetail.StocktakingQty = request.Qty; + stockTakingMatDetail.IsStocktaking = true; + DbHelp.db.Updateable(stockTakingMatDetail) + .ExecuteCommand(); + + #region 发送指令 对应货架对应模组确认盘点 + //判断货架是否已进入盘点模式 + var shelf = ShelfManager.Shelves + .Where(t => t.ShelfCode == stockTakingMatDetail.StoreInfo.ShelfCode) + .FirstOrDefault(); ; + if (shelf == null) + { + DbHelp.db.RollbackTran(); + return new ResponseCommon() + { + Code = 201, + Message = $"货架{stockTakingMatDetail.StoreInfo.ShelfCode}不存在!", + }; + } + else if (shelf.CurrentMode != HardWare.Mode.盘点模式) + { + DbHelp.db.RollbackTran(); + return new ResponseCommon() + { + Code = 201, + Message = $"货架{stockTakingMatDetail.StoreInfo.ShelfCode}不在盘点模式!", + }; + } + if (shelf.OrderNumber != request.StocktakingOrderNumber) + { + return new ResponseCommon() + { + Code = 201, + Message = $"盘点单据{request.StocktakingOrderNumber}不在盘点模式!", + }; + } + shelf.ConfirmStocktakingSingle(stockTakingMatDetail.StoreInfo.BoardId, stockTakingMatDetail.StoreInfo.LightNumber); + #endregion + + DbHelp.db.CommitTran(); + return new ResponseCommon() + { + Code = 200, + Message = $"success", + }; + } + catch (Exception ex) + { + DbHelp.db.RollbackTran(); return new ResponseCommon() { Code = 201, - Message = $"不存在的盘点明细", + Message = $"确认盘点失败:{ex.Message}", }; } - - //修改盘点吗明细数量 - stockTakingMatDetail.StocktakingQty = request.Qty; - stockTakingMatDetail.IsStocktaking = true; - await DbHelp.db.Updateable(stockTakingMatDetail).ExecuteCommandAsync(); - return new ResponseCommon() - { - Code = 200, - Message = $"success", - }; } public async Task commitStockTakingOrder(GetStockTakingOrderMatDetailRequest request) @@ -647,7 +802,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"操作失败:不存在Id为{request.StockTakingOrderId}的出库单!", + Message = $"操作失败:不存在Id为{request.StockTakingOrderId}的盘点单!", }; } } @@ -660,7 +815,7 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"操作失败:不存在单据号为{request.StockTakingOrderNumber}的出库单!", + Message = $"操作失败:不存在单据号为{request.StockTakingOrderNumber}的盘点单!", }; } } @@ -675,7 +830,7 @@ namespace WCS.BLL.Services.Service #endregion #region 判断单据状态 - if (order.StocktakingOrderStatus != StocktakingOrderStatus.已提交) + if (order.StocktakingOrderStatus == StocktakingOrderStatus.已提交) { return new ResponseCommon() { @@ -683,16 +838,102 @@ namespace WCS.BLL.Services.Service Message = $"单据已提交,请勿重复提交!", }; } - else if (order.StocktakingOrderStatus != StocktakingOrderStatus.盘点完成) + //else if (order.StocktakingOrderStatus != StocktakingOrderStatus.盘点完成) + //{ + // return new ResponseCommon() + // { + // Code = 201, + // Message = $"单据未盘点完成!!!", + // }; + //} + #endregion + + #region 查询盘点明细 + var stockTakingOrderMatDetails = await DbHelp.db.Queryable() + .Where(t => t.StocktakingOrderId == order.Id && t.IsStocktaking) + .ToListAsync(); + if (stockTakingOrderMatDetails == null || stockTakingOrderMatDetails.Count == 0) { return new ResponseCommon() { Code = 201, - Message = $"单据未盘点完成!!!", + Message = $"不存在已盘点的物料!", + }; + } + #endregion + + #region 提交盘点 修改数量 生成记录 + try + { + DbHelp.db.BeginTran(); + + var inventoryDetailIds = stockTakingOrderMatDetails.Select(t => t.InventoryDetailId) + .ToList(); + //查询对应的库存数据 + var inventoryDetails = DbHelp.db.Queryable() + .Where(t => inventoryDetailIds.Contains(t.Id)) + .ToList(); + inventoryDetails.ForEach(inventoryDetail => + { + //对应的盘点明细 + var stockTakingOrderMatDetail = stockTakingOrderMatDetails.Where(t => t.InventoryDetailId == inventoryDetail.Id).FirstOrDefault(); + if (stockTakingOrderMatDetail == null) + { + //这个分支应该是不用管的哦 + } + else + { + //比对数量变化 + var changedQty = stockTakingOrderMatDetail.StocktakingQty - inventoryDetail.MatQty; + if (changedQty != 0) + { + //库存表修改数量 + inventoryDetail.MatQty = stockTakingOrderMatDetail.StocktakingQty; + //出入库记录表生成记录 + var inOutRecord = new InOutRecord() + { + StoreCode = inventoryDetail.StoreCode, + StoreId = inventoryDetail.StoreId, + + MatSN = inventoryDetail.MatSN, + MatCode = inventoryDetail.MatCode, + MatName = inventoryDetail.MatName, + MatBatch = inventoryDetail.MatBatch, + MatQty = changedQty, + MatSpec = inventoryDetail.MatSpec, + MatCustomer = inventoryDetail.MatCustomer, + MatSupplier = inventoryDetail.MatSupplier, + + Direction = DirectionEnum.盘点, + OperateUser = request.UserName + }; + DbHelp.db.Updateable(inventoryDetail).ExecuteCommand(); + DbHelp.db.Insertable(inOutRecord).ExecuteCommand(); + + } + //数量相等的情况 暂时不用管 不动库存数据也不生成记录 + else + { + + } + } + }); + + order.StocktakingOrderStatus = StocktakingOrderStatus.已提交; + DbHelp.db.Updateable(order).ExecuteCommand(); + + DbHelp.db.CommitTran(); + } + catch (Exception ex) + { + DbHelp.db.RollbackTran(); + return new ResponseCommon() + { + Code = 300, + Message = $"操作失败,{ex.Message}", }; } #endregion - //To do 进行提交! return new ResponseCommon() { @@ -709,5 +950,7 @@ namespace WCS.BLL.Services.Service }; } } + + } } diff --git a/WCS.Model/ApiModel/InOutRecord/GetInOutRecordRequest.cs b/WCS.Model/ApiModel/InOutRecord/GetInOutRecordRequest.cs new file mode 100644 index 0000000..ac5ff53 --- /dev/null +++ b/WCS.Model/ApiModel/InOutRecord/GetInOutRecordRequest.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.InOutRecord +{ + public class GetInOutRecordRequest : PageQueryRequestBase + { + #region 物料属性 + public string MatSN { get; set; } + + public string MatCode { get; set; } + + public string MatName { get; set; } + + public string MatSpec { get; set; } + + public string MatBatch { get; set; } + + public string MatSupplier { get; set; } + + public string MatCustomer { get; set; } + #endregion + + #region 库位属性 + public List ShelfTypeId { get; set; } + public List ShelfId { get; set; } + public int StoreId { get; set; } + public string StoreCode { get; set; } + #endregion + + } +} diff --git a/WCS.Model/ApiModel/InOutRecord/InOutRecordModel.cs b/WCS.Model/ApiModel/InOutRecord/InOutRecordModel.cs new file mode 100644 index 0000000..510cc79 --- /dev/null +++ b/WCS.Model/ApiModel/InOutRecord/InOutRecordModel.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.InOutRecord +{ + public class InOutRecordModel + { + public int Id { get; set; } + + #region 库位属性 + public int StoreId { get; set; } + public string StoreCode { get; set; } + #endregion + + #region 物料属性 + public string MatSN { get; set; } + public string MatCode { get; set; } + public string MatName { get; set; } + public string MatSpec { get; set; } + public string MatBatch { get; set; } + public int MatQty { get; set; } + public string? MatSupplier { get; set; } + public string? MatCustomer { get; set; } + #endregion + + public string? OrderNumber { get; set; } + public DirectionEnum Direction { get; set; } + public bool IsUpload { get; set; } = false; + public DateTime OperateTime { get; set; } + public string OperateUser { get; set; } + + public int RowNumber { get; set; } + public bool IsSelected { get; set; } + } + + public enum DirectionEnum + { + 入库 = 0, + 出库 = 1, + 丢失 = 2, + 盘点 = 3, + } +} diff --git a/WCS.Model/ApiModel/OutStore/GetOutOrderDetailRequest.cs b/WCS.Model/ApiModel/OutStore/GetOutOrderDetailRequest.cs index 3ed25e2..bab1dd6 100644 --- a/WCS.Model/ApiModel/OutStore/GetOutOrderDetailRequest.cs +++ b/WCS.Model/ApiModel/OutStore/GetOutOrderDetailRequest.cs @@ -10,6 +10,7 @@ namespace WCS.Model { public int OrderId { get; set; } public string OrderNumber { get; set; } - + public bool IsStart { get; set; } = false; + public bool IsPause { get; set; } = false; } } diff --git a/WCS.Model/ApiModel/Stocktaking/GetStockTakingOrderMatDetailRequest.cs b/WCS.Model/ApiModel/Stocktaking/GetStockTakingOrderMatDetailRequest.cs index 18eeea9..17d30c8 100644 --- a/WCS.Model/ApiModel/Stocktaking/GetStockTakingOrderMatDetailRequest.cs +++ b/WCS.Model/ApiModel/Stocktaking/GetStockTakingOrderMatDetailRequest.cs @@ -4,7 +4,7 @@ using System.Text; namespace WCS.Model.ApiModel.Stocktaking { - public class GetStockTakingOrderMatDetailRequest + public class GetStockTakingOrderMatDetailRequest:RequestBase { public int StockTakingOrderId { get; set; } public string StockTakingOrderNumber { get; set; } diff --git a/WCS.Model/ApiModel/Stocktaking/StockTakingOrderMatDetailModel.cs b/WCS.Model/ApiModel/Stocktaking/StockTakingOrderMatDetailModel.cs new file mode 100644 index 0000000..92f7995 --- /dev/null +++ b/WCS.Model/ApiModel/Stocktaking/StockTakingOrderMatDetailModel.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.Stocktaking +{ + public class StockTakingOrderMatDetailModel + { + public int Id { get; set; } + public int StocktakingOrderId { get; set; } + public string StocktakingOrderNumber { get; set; } + public int StoreId { get; set; } + public string StoreCode { get; set; } + + #region 库存属性 + public int InventoryDetailId { get; set; } + public string MatSN { get; set; } + public string MatCode { get; set; } + public string MatName { get; set; } + public string MatSpec { get; set; } + public string MatBatch { get; set; } + public int MatQty { get; set; } + public string? MatSupplier { get; set; } + public string? MatCustomer { get; set; } + #endregion + + public bool IsStocktaking { get; set; } + public string IsStocktakingStr + { + get + { + return + IsStocktaking ? "是" : "否"; + } + } + public int StocktakingQty { get; set; } + public DateTime UpdateTime { get; set; } + public string UpdateUser { get; set; } + + public int RowNumber { get; set; } + } +} diff --git a/WCS.Model/WebSocketModel/WebSocketMessageModel.cs b/WCS.Model/WebSocketModel/WebSocketMessageModel.cs index 3c88dd6..40e4f7f 100644 --- a/WCS.Model/WebSocketModel/WebSocketMessageModel.cs +++ b/WCS.Model/WebSocketModel/WebSocketMessageModel.cs @@ -35,13 +35,20 @@ namespace WCS.Model.WebSocketModel 入库中异常取出 = 3, 入库中未扫描上架 = 4, 退出入库未响应 = 5, + 进入出库未响应 = 6, 出库自检丢失 = 7, 出库自检未扫描上架 = 8, 出库中丢失 = 9, 出库中未扫描上架 = 10, 退出出库未响应 = 11, + + 进入盘点未响应 = 12, + 确认盘点未响应 = 13, + 退出盘点未响应 = 14, + //通知类 恢复正常 = 50, 通知刷新出库 = 51, + 通知刷新盘点 = 52, } } diff --git a/WCS.WebApi/Controllers/InOutRecordController.cs b/WCS.WebApi/Controllers/InOutRecordController.cs new file mode 100644 index 0000000..7518e58 --- /dev/null +++ b/WCS.WebApi/Controllers/InOutRecordController.cs @@ -0,0 +1,66 @@ +using Microsoft.AspNetCore.Mvc; +using MiniExcelLibs; +using NPOI.SS.UserModel; +using SqlSugar; +using System.Xml.Linq; +using WCS.BLL.DbModels; +using WCS.BLL.Manager; +using WCS.BLL.Services.IService; +using WCS.BLL.Services.Service; +using WCS.DAL.Db; +using WCS.Model; +using WCS.Model.ApiModel; +using WCS.Model.ApiModel.InOutRecord; +using WCS.Model.ApiModel.MatInventoryDetail; +using WCS.WebApi.Helper; + +namespace WCS.WebApi.Controllers +{ + /// + /// 接口记录 + /// + [ApiController] + [Route("[controller]")] + public class InOutRecordController : ControllerBase + { + public IInOutRecordService _inOutRecordService { get; set; } + + public InOutRecordController(IInOutRecordService inOutRecordService) + { + _inOutRecordService = inOutRecordService; + } + + [Route("getInOutRecord")] + [HttpPost(Name = "getInOutRecord")] + public async Task getInOutRecord(GetInOutRecordRequest request) + { + return await _inOutRecordService.getInOutRecord(request); + } + + [HttpPost("exportInOutRecord")] + public async Task exportInOutRecord([FromBody] GetInOutRecordRequest request) + { + var result = await _inOutRecordService.exportInOutRecord(request); + var data = result.Data?.Lists; + var columns = new[] + { + new ExportableColumn("序号","RowNumber"), + new ExportableColumn("物料编码","MatCode"), + new ExportableColumn("物料名称","MatName"), + new ExportableColumn("规格","MatSpec"), + new ExportableColumn("批次","MatBatch"), + new ExportableColumn("数量","MatQty"), + new ExportableColumn("库位","StoreCode"), + new ExportableColumn("入库时间","InstoreTime"), + new ExportableColumn("物料SN", "MatSN"), + }; + if (data == null) + { + return NotFound(); + } + else + return ExportExcelHelper.Export("导出数据", columns, data); + } + + } +} diff --git a/WCS.WebApi/Controllers/OutstoreController.cs b/WCS.WebApi/Controllers/OutstoreController.cs index 3b7064d..e1fdbe2 100644 --- a/WCS.WebApi/Controllers/OutstoreController.cs +++ b/WCS.WebApi/Controllers/OutstoreController.cs @@ -13,10 +13,12 @@ namespace WebApi.Controllers public class OutstoreController : ControllerBase { private readonly IOutstoreService _outstoreService; + private readonly IGenerateService _generateService; - public OutstoreController(IOutstoreService outstoreService) + public OutstoreController(IOutstoreService outstoreService,IGenerateService generateService) { _outstoreService = outstoreService; + _generateService = generateService; } /// @@ -30,6 +32,10 @@ namespace WebApi.Controllers { try { + if (string.IsNullOrEmpty(request.OrderNumber)) + { + request.OrderNumber = await _generateService.generateOutOrderNumber(); + } return await _outstoreService.SysOutOrderByMatCode(request); } catch (Exception ex) @@ -54,6 +60,10 @@ namespace WebApi.Controllers { try { + if (string.IsNullOrEmpty(request.OrderNumber)) + { + request.OrderNumber = await _generateService.generateOutOrderNumber(); + } return await _outstoreService.SysOutOrderByMatSn(request); } catch (Exception ex) diff --git a/WCS.WebApi/Controllers/StockTakingController.cs b/WCS.WebApi/Controllers/StockTakingController.cs index 7364088..e947bea 100644 --- a/WCS.WebApi/Controllers/StockTakingController.cs +++ b/WCS.WebApi/Controllers/StockTakingController.cs @@ -42,6 +42,13 @@ namespace WCS.WebApi.Controllers return await _stockTakingService.getStockTakingOrders(request); } + [Route("getStockTakingOrdersByStatus")] + [HttpPost(Name = "getStockTakingOrdersByStatus")] + public async Task getStockTakingOrdersByStatus(GetStockTakingOrdersRequest request) + { + return await _stockTakingService.getStockTakingOrdersByStatus(request); + } + [Route("getStockTakingOrderMatDetail")] [HttpPost(Name = "getStockTakingOrderMatDetail")] public async Task getStockTakingOrderMatDetail(GetStockTakingOrderMatDetailRequest request) diff --git a/WCS.WebApi/Program.cs b/WCS.WebApi/Program.cs index 284c239..0a79839 100644 --- a/WCS.WebApi/Program.cs +++ b/WCS.WebApi/Program.cs @@ -7,6 +7,7 @@ using System.Net.Http; using System.Net.Sockets; using System.Text; using WCS.BLL.Config; +using WCS.BLL.DbModels; using WCS.BLL.Manager; using WCS.BLL.Services.IService; using WCS.BLL.Services.Service; @@ -54,6 +55,7 @@ namespace WebApi builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); //롢ɵõģʽ builder.Services.AddSingleton(); diff --git a/货架标准上位机/ViewModels/InOutRecordViewModel.cs b/货架标准上位机/ViewModels/InOutRecordViewModel.cs new file mode 100644 index 0000000..3315160 --- /dev/null +++ b/货架标准上位机/ViewModels/InOutRecordViewModel.cs @@ -0,0 +1,329 @@ +using HandyControl.Controls; +using MiniExcelLibs; +using Ping9719.WpfEx.Mvvm; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Input; +using System.Windows.Media; +using SqlSugar; +using HandyControl.Data; +using System.Windows; +using Newtonsoft.Json.Linq; +using 货架标准上位机.Views.Controls; +using WCS.Model.ApiModel.User; +using 货架标准上位机.Api; +using WCS.Model; +using WCS.Model.ApiModel; +using System.Windows.Controls; +using WCS.Model.ApiModel.InterfaceRecord; +using HandyControl.Collections; +using WCS.Model.ApiModel.MatBaseInfo; +using WCS.Model.ApiModel.MatInventoryDetail; +using HandyControl.Tools.Extension; +using WCS.Model.ApiModel.Stocktaking; +using WCS.Model.ApiModel.InOutRecord; + +namespace 货架标准上位机.ViewModel +{ + public class InOutRecordViewModel : BindableBase + { + public InOutRecordViewModel() + { + + } + + public void InitMatCode() + { + //调用接口更新! + Task.Run(() => + { + var body = new GetMatCodeListRequest() + { + IsFromBaseData = false, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + + var Result = ApiHelp.GetDataFromHttp>>(LocalFile.Config.ApiIpHost + "matBaseInfo/getMatCodeList", body, "POST"); + if (Result != null && Result.Data != null && Result.Data.Count() > 0) + { + matCodes = Result.Data.Select(t => new DataModel() + { + MatCode = t + }).ToList(); + } + }); + } + + #region Property + private List dataGridItemSource; + public List DataGridItemSource + { + get { return dataGridItemSource; } + set + { + SetProperty(ref dataGridItemSource, value); + } + } + + /// + /// 物料编码 + /// + private string matCode; + public string MatCode + { + get { return matCode; } + set + { + SetProperty(ref matCode, value); + FilterItems(value); + } + } + public ManualObservableCollection Items { get; set; } = new(); + private List matCodes = new List(); + private void FilterItems(string key) + { + //至少输入三个字符 避免删除或输入时界面变卡 + if (string.IsNullOrEmpty(key) || key.Length < 3) + { + Items.Clear(); + return; + } + key = key.ToUpper(); + Items.CanNotify = false; + Items.Clear(); + foreach (var matCode in matCodes) + { + if (matCode.MatCode.ToUpper().Contains(key)) + { + Items.Add(matCode); + } + } + Items.CanNotify = true; + } + public class DataModel() + { + public string MatCode { get; set; } + } + + /// + /// 物料名称 + /// + private string matName; + public string MatName + { + get { return matName; } + set + { + SetProperty(ref matName, value); + } + } + + /// + /// 物料批次 + /// + private string matBatch; + public string MatBatch + { + get { return matBatch; } + set + { + SetProperty(ref matBatch, value); + } + } + + /// + /// 库位 + /// + private string storeCode; + public string StoreCode + { + get { return storeCode; } + set + { + SetProperty(ref storeCode, value); + } + } + + /// + /// 物料条码 物料SN + /// + private string matSN; + public string MatSN + { + get { return matSN; } + set + { + SetProperty(ref matSN, value); + } + } + #endregion + + #region Command + public ICommand BtnResetCommand { get => new DelegateCommand(BtnReset); } + public void BtnReset() + { + MatCode = string.Empty; + MatName = string.Empty; + MatSN = string.Empty; + StoreCode = string.Empty; + } + + public ICommand BtnSearchCommand { get => new DelegateCommand(BtnSearchReset); } + public void BtnSearchReset() + { + BtnSearch(true); + } + public void BtnSearch(bool IsPageReset = true) + { + if (CurrentPage == 0 || IsPageReset) + { + CurrentPage = 1; + return; + } + #region 调用接口获取数据 + var dia = Dialog.Show(new TextDialog()); + try + { + var body = new GetInOutRecordRequest() + { + MatName = MatName, + MatSN = MatSN, + MatBatch = MatBatch, + MatCode = MatCode, + StoreCode = StoreCode, + + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + PageNumber = CurrentPage, + PageSize = 10, + }; + var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "inOutRecord/getInOutRecord", body, "POST"); + if (Result != null && Result.Data != null && Result.Data.Lists != null) + { + DataGridItemSource = Result.Data.Lists; + MaxPage = Result.Data.MaxPage; + TotalCount = Result.Data.TotalCount; + } + } + catch (Exception ex) + { + Growl.Error("加载数据失败:" + ex.Message); + } + finally + { + dia.Close(); + } + #endregion + } + + public ICommand BtnExportCommand { get => new DelegateCommand(BtnExport); } + public async void BtnExport() + { + try + { + #region 选择文件保存路径 + Microsoft.Win32.SaveFileDialog sfd = new Microsoft.Win32.SaveFileDialog(); + sfd.Filter = ".xlsx文件(*.xlsx)|*.xlsx"; + sfd.FileName = "出入库记录" + DateTime.Now.ToString("yyyyMMddhhmmss"); + sfd.OverwritePrompt = true; + if (sfd.ShowDialog() != true) + { + return; + } + string path = sfd.FileName; + #endregion + + #region 调用接口导出数据 + var body = new GetInOutRecordRequest() + { + MatName = MatName, + MatSN = MatSN, + MatBatch = MatBatch, + MatCode = MatCode, + StoreCode = StoreCode, + + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + PageNumber = CurrentPage, + PageSize = 10, + }; + await ApiHelp.PostDownloadFileAsync(path, System.Net.Http.HttpMethod.Post, LocalFile.Config.ApiIpHost + "inOutRecord/exportInOutRecord", body); + Growl.Success("导出成功!"); + #endregion + } + catch (Exception ex) + { + Growl.Error("导出失败:" + ex.Message); + } + } + + #endregion + + #region PageOperation 分页操作 + private int currentPage; + public int CurrentPage + { + get { return currentPage; } + set + { + SetProperty(ref currentPage, value); + BtnSearch(false); + } + } + + private int maxPage; + public int MaxPage + { + get { return maxPage; } + set { SetProperty(ref maxPage, value); } + } + + //总数量 + private int totalCount; + public int TotalCount + { + get { return totalCount; } + set { SetProperty(ref totalCount, value); } + } + + public ICommand BtnFirstPageCommand { get => new DelegateCommand(BtnFirstPage); } + public void BtnFirstPage() + { + CurrentPage = 1; + } + + public ICommand BtnPrePageCommand { get => new DelegateCommand(BtnPrePage); } + public void BtnPrePage() + { + if (CurrentPage > 1) + { + CurrentPage--; + } + } + + public ICommand BtnNextPageCommand { get => new DelegateCommand(BtnNextPage); } + public void BtnNextPage() + { + if (CurrentPage < MaxPage) + { + CurrentPage++; + } + } + + public ICommand BtnLastPageCommand { get => new DelegateCommand(BtnLastPage); } + public void BtnLastPage() + { + if (CurrentPage != MaxPage) + { + CurrentPage = MaxPage; + } + } + #endregion + } +} diff --git a/货架标准上位机/ViewModels/OutInventoryAddDucumentViewModel.cs b/货架标准上位机/ViewModels/OutInventoryAddDucumentViewModel.cs index c77150a..90bcbcd 100644 --- a/货架标准上位机/ViewModels/OutInventoryAddDucumentViewModel.cs +++ b/货架标准上位机/ViewModels/OutInventoryAddDucumentViewModel.cs @@ -106,43 +106,43 @@ namespace 货架标准上位机.ViewModels // SelectedItemSource = itemSource; // return; //} - #region 调用接口生成出库单据 - try - { - var body = new SysOutOrderByMatCodeRequest() - { - OrderType = "出库", - OrderSource = "WCS前端", - ItemList = DataGridItemSource.Select(t => new MatCodeItemList() - { - MatCode = t.MatCode, - MatName = t.MatName, - MatBatch = t.MatBatch, - ReqQty = t.NeedQty, - }).ToList(), - DeviceType = LocalFile.Config.DeviceType, - UserName = LocalStatic.CurrentUser - }; - var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outstore/sysOutOrderByMatCode", body, "POST"); - if (Result != null && Result.Code == 200) - { - Growl.Success(Result.Message); - OnRequestClose(); - } - else if (Result != null) - { - Growl.Warning(Result.Message); - } - } - catch (Exception ex) - { - Growl.Error("加载数据失败:" + ex.Message); - } - finally - { - } - #endregion } + #region 调用接口生成出库单据 + try + { + var body = new SysOutOrderByMatCodeRequest() + { + OrderType = "出库", + OrderSource = "WCS前端", + ItemList = DataGridItemSource.Select(t => new MatCodeItemList() + { + MatCode = t.MatCode, + MatName = t.MatName, + MatBatch = t.MatBatch, + ReqQty = t.NeedQty, + }).ToList(), + DeviceType = LocalFile.Config.DeviceType, + UserName = LocalStatic.CurrentUser + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outstore/sysOutOrderByMatCode", body, "POST"); + if (Result != null && Result.Code == 200) + { + Growl.Success(Result.Message); + OnRequestClose(); + } + else if (Result != null) + { + Growl.Warning(Result.Message); + } + } + catch (Exception ex) + { + Growl.Error("加载数据失败:" + ex.Message); + } + finally + { + } + #endregion } #endregion } diff --git a/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs b/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs index 2a904f6..82c6f6e 100644 --- a/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs +++ b/货架标准上位机/ViewModels/OutInventoryDocumentViewModel.cs @@ -142,6 +142,7 @@ namespace 货架标准上位机.ViewModels if (DataGridItemSource == null) { Growl.Warning("未勾选数据!"); + return; } //判断是否勾选数据 @@ -150,6 +151,7 @@ namespace 货架标准上位机.ViewModels if (selectedOutOrder == null) { Growl.Warning("未勾选数据!"); + return; } #region 调用接口获取数据 @@ -205,6 +207,7 @@ namespace 货架标准上位机.ViewModels if (DataGridItemSource == null) { Growl.Warning("未勾选数据!"); + return; } //判断是否勾选数据 @@ -213,6 +216,7 @@ namespace 货架标准上位机.ViewModels if (selectedOutOrder == null) { Growl.Warning("未勾选数据!"); + return; } #region 调用接口获取数据 var body = new GetOutOrderDetailRequest() @@ -282,6 +286,7 @@ namespace 货架标准上位机.ViewModels { OrderId = selectedOutOrder.Id, OrderNumber = selectedOutOrder.OrderNumber, + IsStart = true, UserName = LocalStatic.CurrentUser, DeviceType = LocalFile.Config.DeviceType, }; @@ -317,7 +322,56 @@ namespace 货架标准上位机.ViewModels public ICommand BtnPauseCommand { get => new DelegateCommand(BtnPause); } public void BtnPause() { + try + { + if (DataGridItemSource == null) + { + Growl.Warning("未勾选数据!"); + return; + } + //判断是否勾选数据 + var selectedOutOrder = DataGridItemSource.Where(t => t.IsSelected) + .FirstOrDefault(); + if (selectedOutOrder == null) + { + Growl.Warning("未勾选数据!"); + return; + } + #region 调用接口结束出库 + var body = new GetOutOrderDetailRequest() + { + OrderId = selectedOutOrder.Id, + OrderNumber = selectedOutOrder.OrderNumber, + IsPause = true, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outStore/goOutOutstore", body, "POST"); + if (Result != null && Result.Code == 200) + { + //刷新出库单列表 + OutVentoryView.viewModel.RefreshOutOrderList(selectedOutOrder.OrderNumber); + Growl.Success("已暂停出库!"); + } + else if (Result != null) + { + OutVentoryView.viewModel.RefreshOutOrderList(OutVentoryView.viewModel.SelectedOutOrder?.OrderNumber); + Growl.Warning(Result.Message); + } + else + { + Growl.Warning("调用接口失败!"); + } + #endregion + } + catch (Exception ex) + { + Growl.Error("出现异常:" + ex.Message); + } + finally + { + } } #endregion diff --git a/货架标准上位机/ViewModels/OutInventoryViewModel.cs b/货架标准上位机/ViewModels/OutInventoryViewModel.cs index be92593..1ace054 100644 --- a/货架标准上位机/ViewModels/OutInventoryViewModel.cs +++ b/货架标准上位机/ViewModels/OutInventoryViewModel.cs @@ -144,6 +144,7 @@ namespace 货架标准上位机.ViewModel if (SelectedOutOrder == null) { Growl.Warning("未选择单据!"); + return; } #region 调用接口开始出库 @@ -157,7 +158,8 @@ 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) { @@ -187,8 +189,8 @@ namespace 货架标准上位机.ViewModel if (SelectedOutOrder == null) { Growl.Warning("未选择单据!"); + return; } - #region 调用接口结束出库 var body = new GetOutOrderDetailRequest() { @@ -200,7 +202,8 @@ namespace 货架标准上位机.ViewModel var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outStore/goOutOutstore", body, "POST"); if (Result != null && Result.Code == 200) { - Growl.Warning("已成功结束入库!"); + Growl.Warning("已成功结束出库!"); + RefreshDataGridItemSource(); } else if (Result != null) { diff --git a/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs b/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs index e79dbeb..02a291f 100644 --- a/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs +++ b/货架标准上位机/ViewModels/StocktakingDocumentViewModel.cs @@ -129,11 +129,7 @@ namespace 货架标准上位机.ViewModels OrderSource = string.Empty; } - //public ICommand BtnDeleteCommand { get => new DelegateCommand(BtnDelete); } - //public void BtnDelete() - //{ - //} public ICommand BtnOrderDetailCommand { get => new DelegateCommand(BtnOrderDetail); } public void BtnOrderDetail() @@ -143,39 +139,41 @@ namespace 货架标准上位机.ViewModels if (DataGridItemSource == null) { Growl.Warning("未勾选数据!"); + return; } //判断是否勾选数据 - var selectedOutOrder = DataGridItemSource.Where(t => t.IsSelected) + var selectetOrder = DataGridItemSource.Where(t => t.IsSelected) .FirstOrDefault(); - if (selectedOutOrder == null) + if (selectetOrder == null) { Growl.Warning("未勾选数据!"); + return; } #region 调用接口获取数据 - var body = new GetOutOrderDetailRequest() + var body = new GetStockTakingOrderMatDetailRequest() { - OrderId = selectedOutOrder.Id, - OrderNumber = selectedOutOrder.StocktakingOrderNumber, + StockTakingOrderId = selectetOrder.Id, + StockTakingOrderNumber = selectetOrder.StocktakingOrderNumber, UserName = LocalStatic.CurrentUser, DeviceType = LocalFile.Config.DeviceType, }; - var Result = ApiHelp.GetDataFromHttp>>(LocalFile.Config.ApiIpHost + "outStore/getOutOrderDetail", body, "POST"); + var Result = ApiHelp.GetDataFromHttp>>(LocalFile.Config.ApiIpHost + "stockTaking/getStockTakingOrderMatDetail", body, "POST"); if (Result != null && Result.Code == 200) { if (Result.Data.Count > 0) { //打开窗体 - var window = new OutInventoryDocumentDetailView(Result.Data); + var window = new StocktakingDocumentDetailView(Result.Data); window.Owner = Application.Current.MainWindow; window.ShowDialog(); } else { - Growl.Warning("该单据没有单据明细!"); + Growl.Warning("该盘点单据不存在单据明细!"); } } else if (Result != null) @@ -206,6 +204,7 @@ namespace 货架标准上位机.ViewModels if (DataGridItemSource == null) { Growl.Warning("未勾选数据!"); + return; } //判断是否勾选数据 @@ -214,6 +213,7 @@ namespace 货架标准上位机.ViewModels if (selectedOutOrder == null) { Growl.Warning("未勾选数据!"); + return; } #region 调用接口获取数据 var body = new GetOutOrderDetailRequest() @@ -262,61 +262,107 @@ namespace 货架标准上位机.ViewModels public ICommand BtnStartCommand { get => new DelegateCommand(BtnStart); } public void BtnStart() { - WarningManager.AddWarning(new WCS.Model.WebSocketModel.WebSocketMessageModel()); - //try - //{ - // if (DataGridItemSource == null) - // { - // Growl.Warning("未勾选数据!"); - // return; - // } - // //判断是否勾选数据 - // var selectedOutOrder = DataGridItemSource.Where(t => t.IsSelected) - // .FirstOrDefault(); - // if (selectedOutOrder == null) - // { - // Growl.Warning("未勾选数据!"); - // return; - // } + try + { + //是否已搜索 + if (DataGridItemSource == null) + { + Growl.Warning("未勾选数据!"); + return; + } + //判断是否已勾选数据 + var selectetOrder = DataGridItemSource.Where(t => t.IsSelected) + .FirstOrDefault(); + if (selectetOrder == null) + { + Growl.Warning("未勾选数据!"); + return; + } - // #region 调用接口开始盘点 - // var body = new GetOutOrderDetailRequest() - // { - // OrderId = selectedOutOrder.Id, - // OrderNumber = selectedOutOrder.StocktakingOrderNumber, - // UserName = LocalStatic.CurrentUser, - // DeviceType = LocalFile.Config.DeviceType, - // }; - // var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outStore/goInOutstore", body, "POST"); - // if (Result != null && Result.Code == 200) - // { - // //成功后直接跳转 - // MainWindow1.viewModel.GoToOutVentoryView = true; - // Growl.Success("已跳转到物料出库页面!"); - // } - // else if (Result != null) - // { - // Growl.Warning(Result.Message); - // } - // else - // { - // Growl.Warning("调用接口失败!"); - // } - // #endregion - //} - //catch (Exception ex) - //{ - // Growl.Error("出现异常:" + ex.Message); - //} - //finally - //{ - //} + #region 调用接口开始盘点 + var body = new GetStockTakingOrderMatDetailRequest() + { + StockTakingOrderId = selectetOrder.Id, + StockTakingOrderNumber = selectetOrder.StocktakingOrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "stockTaking/startStockTakingOrder", body, "POST"); + if (Result != null && Result.Code == 200) + { + //成功后直接跳转 + MainWindow1.viewModel.GoToStockTakingView = true; + Growl.Success("已跳转到物料盘点页面!"); + } + else if (Result != null) + { + Growl.Warning(Result.Message); + } + else + { + Growl.Warning("调用接口失败!"); + } + #endregion + } + catch (Exception ex) + { + Growl.Error("出现异常:" + ex.Message); + } + finally + { + } } public ICommand BtnPauseCommand { get => new DelegateCommand(BtnPause); } public void BtnPause() { - WarningManager.RemoveWarning(Guid.NewGuid()); + try + { + //是否已搜索 + if (DataGridItemSource == null) + { + Growl.Warning("未勾选数据!"); + return; + } + //判断是否已勾选数据 + var selectetOrder = DataGridItemSource.Where(t => t.IsSelected) + .FirstOrDefault(); + if (selectetOrder == null) + { + Growl.Warning("未勾选数据!"); + return; + } + + #region 调用接口结束盘点 + var body = new GetStockTakingOrderMatDetailRequest() + { + StockTakingOrderId = selectetOrder.Id, + StockTakingOrderNumber = selectetOrder.StocktakingOrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "stockTaking/endStockTakingOrder", body, "POST"); + if (Result != null && Result.Code == 200) + { + Growl.Success("暂停盘点成功!"); + } + else if (Result != null) + { + Growl.Warning(Result.Message); + } + else + { + Growl.Warning("暂停失败:调用接口失败!"); + } + #endregion + } + catch (Exception ex) + { + Growl.Error("出现异常:" + ex.Message); + } + finally + { + } } #endregion diff --git a/货架标准上位机/ViewModels/StocktakingViewModel.cs b/货架标准上位机/ViewModels/StocktakingViewModel.cs new file mode 100644 index 0000000..237626b --- /dev/null +++ b/货架标准上位机/ViewModels/StocktakingViewModel.cs @@ -0,0 +1,296 @@ +using HandyControl.Controls; +using HandyControl.Data; +using MiniExcelLibs; +using Ping9719.WpfEx.Mvvm; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Web.UI.WebControls; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using TouchSocket.Core; +using WCS.Model; +using WCS.Model.ApiModel.OutStore; +using WCS.Model.ApiModel.Stocktaking; +using 货架标准上位机.Api; +using 货架标准上位机.ViewModel; + +namespace 货架标准上位机.ViewModel +{ + public class StocktakingViewModel : BindableBase + { + public StocktakingViewModel() + { + RefreshStockTakingOrderList(); + } + + #region Property + private StockTakingOrderModel selectedOutOrder; + public StockTakingOrderModel SelectedOutOrder + { + get { return selectedOutOrder; } + set + { + SetProperty(ref selectedOutOrder, value); + if (selectedOutOrder != null) + { + SelectedOutOrderNumber = selectedOutOrder.StocktakingOrderNumber; + RefreshDataGridItemSource(); + } + else + { + DataGridItemSource?.Clear(); + } + } + } + + private string selectedOutOrderNumber; + public string SelectedOutOrderNumber + { + get => selectedOutOrderNumber; + set + { + SetProperty(ref selectedOutOrderNumber, value); + } + } + + + private ObservableCollection outOrderList; + public ObservableCollection OutOrderList + { + get => outOrderList; + set + { + SetProperty(ref outOrderList, value); + } + } + + private ObservableCollection dataGridItemSource; + public ObservableCollection DataGridItemSource + { + get { return dataGridItemSource; } + set + { + SetProperty(ref dataGridItemSource, value); + RefreshCount(); + } + } + + //单据总盘数 + private int totalPan; + public int TotalPan + { + get => totalPan; set + { + SetProperty(ref totalPan, value); + } + } + + private int sendedPan; + public int SendedPan + { + get => sendedPan; set + { + SetProperty(ref sendedPan, value); + } + } + + private string orderStatus; + public string OrderStatus + { + get { return orderStatus; } + set + { + SetProperty(ref orderStatus, value); + } + } + + public void RefreshCount() + { + Task.Run(() => + { + SendedPan = dataGridItemSource.Where(t => t.IsStocktaking).Count(); + TotalPan = dataGridItemSource.Count(); + }); + } + #endregion + + #region Command + public ICommand BtnStartCommand { get => new DelegateCommand(BtnStart); } + public void BtnStart() + { + try + { + //判断是否选择单据 + if (SelectedOutOrder == null) + { + Growl.Warning("未选择单据!"); + return; + } + + #region 调用接口开始盘点 + var body = new GetStockTakingOrderMatDetailRequest() + { + StockTakingOrderId = selectedOutOrder.Id, + StockTakingOrderNumber = selectedOutOrder.StocktakingOrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "stockTaking/startStockTakingOrder", body, "POST"); + if (Result != null && Result.Code == 200) + { + Growl.Warning("已成功开始盘点!"); + RefreshDataGridItemSource(); + } + else if (Result != null) + { + Growl.Warning(Result.Message); + } + else + { + Growl.Warning("调用接口失败!"); + } + #endregion + } + catch (Exception ex) + { + Growl.Error("出现异常:" + ex.Message); + } + finally + { + } + } + + public ICommand BtnPauseCommand { get => new DelegateCommand(BtnPause); } + public void BtnPause() + { + try + { + //判断是否选择单据 + if (SelectedOutOrder == null) + { + Growl.Warning("未选择单据!"); + return; + } + #region 调用接口结束盘点 + var body = new GetStockTakingOrderMatDetailRequest() + { + StockTakingOrderId = selectedOutOrder.Id, + StockTakingOrderNumber = selectedOutOrder.StocktakingOrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "stockTaking/endStockTakingOrder", body, "POST"); + if (Result != null && Result.Code == 200) + { + Growl.Warning("已成功结束盘点!"); + RefreshDataGridItemSource(); + } + else if (Result != null) + { + Growl.Warning(Result.Message); + } + else + { + Growl.Warning("调用接口失败!"); + } + #endregion + } + catch (Exception ex) + { + Growl.Error("出现异常:" + ex.Message); + } + finally + { + } + } + + public void RefreshStockTakingOrderList(string OrderNumber = "") + { + #region 调用接口获取发料单 + try + { + var body = new GetStockTakingOrdersRequest() + { + + }; + var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "stockTaking/getStockTakingOrdersByStatus", body, "POST"); + if (Result != null && Result.Code == 200) + { + OutOrderList = new ObservableCollection(Result.Data.Lists); + if (!string.IsNullOrEmpty(OrderNumber)) + { + SelectedOutOrder = OutOrderList.Where(t => t.StocktakingOrderNumber == OrderNumber).FirstOrDefault(); + } + } + else if (Result != null && !string.IsNullOrEmpty(Result.Message)) + { + Growl.Warning(Result.Message); + } + } + catch (Exception ex) + { + Growl.Warning(ex.Message); + } + #endregion + } + + public void RefreshDataGridItemSource() + { + if (SelectedOutOrder == null) + { + //选择的单据为空无法进行查询 + return; + } + #region 调用接口获取盘点单物料明细 + Task.Run(() => + { + var body = new GetStockTakingOrderMatDetailRequest() + { + StockTakingOrderId = selectedOutOrder.Id, + StockTakingOrderNumber = selectedOutOrder.StocktakingOrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + + }; + var Result = ApiHelp.GetDataFromHttp>>(LocalFile.Config.ApiIpHost + "stockTaking/getStockTakingOrderMatDetail", body, "POST"); + if (Result != null && Result.Code == 200) + { + if (Result.Data.Count > 0) + { + DataGridItemSource = new ObservableCollection(Result.Data); + } + else + { + App.Current.Dispatcher.Invoke(() => + { + DataGridItemSource?.Clear(); + }); + + Growl.Warning("该单据未查询到盘点明细!"); + } + } + else if (Result != null) + { + Growl.Warning(Result.Message); + } + else + { + Growl.Warning("调用接口失败!"); + } + }); + #endregion + } + #endregion + } +} diff --git a/货架标准上位机/Views/InOutRecordView.xaml b/货架标准上位机/Views/InOutRecordView.xaml new file mode 100644 index 0000000..c62a021 --- /dev/null +++ b/货架标准上位机/Views/InOutRecordView.xaml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/货架标准上位机/Views/OutInventoryDocumentView.xaml b/货架标准上位机/Views/OutInventoryDocumentView.xaml index a865303..9c62643 100644 --- a/货架标准上位机/Views/OutInventoryDocumentView.xaml +++ b/货架标准上位机/Views/OutInventoryDocumentView.xaml @@ -115,6 +115,7 @@ + diff --git a/货架标准上位机/Views/OutInventoryView.xaml b/货架标准上位机/Views/OutInventoryView.xaml index 842afad..3a545a8 100644 --- a/货架标准上位机/Views/OutInventoryView.xaml +++ b/货架标准上位机/Views/OutInventoryView.xaml @@ -162,10 +162,10 @@ - + diff --git a/货架标准上位机/Views/StockTakingView.xaml b/货架标准上位机/Views/StockTakingView.xaml new file mode 100644 index 0000000..a193ab2 --- /dev/null +++ b/货架标准上位机/Views/StockTakingView.xaml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <货架标准上位机:WorkItemBackgroundConverter x:Key="converter"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/货架标准上位机/Views/StockTakingView.xaml.cs b/货架标准上位机/Views/StockTakingView.xaml.cs new file mode 100644 index 0000000..bb38269 --- /dev/null +++ b/货架标准上位机/Views/StockTakingView.xaml.cs @@ -0,0 +1,69 @@ +using Ping9719.WpfEx; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using System.Text.RegularExpressions; +using 货架标准上位机.ViewModel; + +namespace 货架标准上位机 +{ + public partial class StockTakingView : UserControlBase + { + public static StocktakingViewModel viewModel = new StocktakingViewModel(); + public StockTakingView() + { + InitializeComponent(); + this.DataContext = viewModel; + } + + private void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) + { + try + { + var viewModel = this.DataContext as InInventoryViewModel; + DataGrid datagrid = sender as DataGrid; + var index = datagrid.SelectedIndex; + if (index >= 0) + { + + } + datagrid.UnselectAllCells(); + } + catch + { + + } + } + + private void ListView_PreviewMouseWheel(object sender, MouseWheelEventArgs e) + { + if (!e.Handled) + { + // ListView拦截鼠标滚轮事件 + e.Handled = true; + + // 激发一个鼠标滚轮事件,冒泡给外层ListView接收到 + var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta); + eventArg.RoutedEvent = UIElement.MouseWheelEvent; + eventArg.Source = sender; + var parent = ((Control)sender).Parent as UIElement; + parent.RaiseEvent(eventArg); + } + } + + private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) + { + viewModel.RefreshStockTakingOrderList(viewModel.SelectedOutOrderNumber); + } + } +} diff --git a/货架标准上位机/Views/StocktakingDocumentDetailView.xaml b/货架标准上位机/Views/StocktakingDocumentDetailView.xaml new file mode 100644 index 0000000..c6716b2 --- /dev/null +++ b/货架标准上位机/Views/StocktakingDocumentDetailView.xaml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + +