From 00621bcd55d27967e8b5a84a902c8f6178e66b8b Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Sat, 25 May 2024 17:25:27 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E7=9B=9F=E8=AE=AF=E5=85=AC?= =?UTF-8?q?=E5=8F=B8=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=80=82=E9=85=8D=20=E5=89=8D=E5=90=8E=E7=AB=AF=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0=E2=80=9CISMX?= =?UTF-8?q?=E2=80=9D=E8=BF=9B=E8=A1=8C=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2.前端websocket取消心跳机制(原有心跳和断线重连当服务端网线断开后需要等tcp保活期到期后才能发现重连),自己实现心跳和重连 3.前端关闭后任占用后台线程问题修复 --- WCS.BLL/Config/JsConfig.cs | 32 ++ WCS.BLL/DbModels/DingDingSendUser.cs | 19 + WCS.BLL/DbModels/DocumentSerialNumber.cs | 2 +- WCS.BLL/DbModels/InOutRecord.cs | 29 +- WCS.BLL/DbModels/InventoryDetail.cs | 33 +- WCS.BLL/DbModels/MatBaseInfo.cs | 2 +- WCS.BLL/DbModels/MatInfo.cs | 2 +- WCS.BLL/DbModels/ModuleInfo.cs | 8 +- WCS.BLL/DbModels/OutOrder.cs | 8 +- WCS.BLL/DbModels/OutOrderDetail.cs | 2 +- WCS.BLL/DbModels/OutOrderMatDetail.cs | 2 +- WCS.BLL/DbModels/ShelfInfo.cs | 4 +- WCS.BLL/DbModels/ShelfTypeInfo.cs | 2 +- WCS.BLL/DbModels/StockTakingOrder.cs | 2 +- WCS.BLL/DbModels/StockTakingOrderMatDetail.cs | 2 +- WCS.BLL/DbModels/StoreInfo.cs | 31 +- WCS.BLL/DbModels/SystemApiLogRecord.cs | 2 +- WCS.BLL/HardWare/SmartShelf.cs | 18 + WCS.BLL/Manager/DbInit.cs | 65 +++- WCS.BLL/Manager/MXBackgroundThread.cs | 255 ++++++++++++++ WCS.BLL/Manager/ShelfManager.cs | 6 +- WCS.BLL/Manager/WarningManager.cs | 27 +- WCS.BLL/Manager/WebSoceketManager.cs | 8 +- .../IService/IMatInventoryDetailService.cs | 2 + WCS.BLL/Services/Service/InstoreService.cs | 44 ++- .../Service/MatInventoryDetailService.cs | 44 +++ WCS.BLL/Services/Service/OutstoreService.cs | 328 +++++++++++++----- .../Services/Service/StockTakingService.cs | 6 + WCS.BLL/Services/Service/StoreInfoService.cs | 68 ++-- WCS.BLL/Services/Service/WarningService.cs | 1 + WCS.BLL/Tool/Api/ApiHelp.cs | 2 +- WCS.DAL/Db/AuthDb/AuthDbHelp.cs | 2 +- WCS.DAL/Db/AuthDb/AuthModels.cs | 11 +- WCS.DAL/Db/DbHelp.cs | 20 +- .../ApiModel/MXBackgroundThread/ApiResult.cs | 51 +++ .../MXBackgroundThread/BunkerOutRequest.cs | 27 ++ .../MXBackgroundThread/InputStockInRequest.cs | 25 ++ .../MXBackgroundThread/MXMesResponseCommon.cs | 14 + .../MXBackgroundThread/PickOrderRequest.cs | 72 ++++ .../ApiModel/MXBackgroundThread/QueryByBar.cs | 49 +++ .../RecommendedBarCodeRequest.cs | 64 ++++ .../SelectMaterialBarDto.cs | 31 ++ .../CompareMatInventoryDetailRequest.cs | 14 + .../ApiModel/StoreInfo/ModuleInfoModel.cs | 2 +- .../ApiModel/StoreInfo/ShelfInfoModel.cs | 2 +- .../WebSocketModel/SolveWarningRequesr.cs | 2 +- .../WebSocketModel/WebSocketMessageModel.cs | 6 + .../Controllers/FileDownLoadController.cs | 2 +- .../MatInventoryDetailController.cs | 8 + WCS.WebApi/Program.cs | 120 ++++--- .../PublishProfiles/FolderProfile1.pubxml | 8 +- 货架标准上位机/Api/ApiHelp.cs | 96 +++++ 货架标准上位机/App.xaml | 1 - 货架标准上位机/App.xaml.cs | 17 + 货架标准上位机/Models/JsConfig.cs | 20 ++ .../{扫码枪结束入库二维码.png => goOutInstore.png} | Bin .../MXViewModel/MXOutInventoryViewModel.cs | 305 ++++++++++++++++ .../MXViewModel/MXOutOrderDetailViewViewModel.cs | 216 ++++++++++++ .../ViewModels/MXViewModel/MXOutOrderViewModel.cs | 132 +++++++ .../ViewModels/ShelfInfoAddOrUpdateViewModel.cs | 12 +- 货架标准上位机/Views/InInventoryView.xaml | 28 +- 货架标准上位机/Views/InInventoryView.xaml.cs | 4 +- .../Views/MXWindows/MXMainWindow.xaml | 308 ++++++++++++++++ .../Views/MXWindows/MXMainWindow.xaml.cs | 57 +++ .../Views/MXWindows/MXOutInventoryView.xaml | 194 +++++++++++ .../Views/MXWindows/MXOutInventoryView.xaml.cs | 69 ++++ .../Views/MXWindows/MXOutOrderDetailView.xaml | 80 +++++ .../Views/MXWindows/MXOutOrderDetailView.xaml.cs | 158 +++++++++ .../Views/MXWindows/MXOutOrderView.xaml | 123 +++++++ .../Views/MXWindows/MXOutOrderView.xaml.cs | 156 +++++++++ .../Views/MainWindows/MainWindow.xaml.cs | 3 + .../Views/MainWindows/MainWindow1.xaml | 1 + .../Views/MainWindows/MainWindow1.xaml.cs | 9 +- 货架标准上位机/Views/ModuleInfoView.xaml | 2 +- .../Views/ShelfInfoAddOrUpdateView.xaml | 4 +- .../Views/ShelfInfoAddOrUpdateView.xaml.cs | 4 +- 货架标准上位机/Views/ShelfInfoView.xaml | 2 +- .../Views/StocktakingDocumentDetailView.xaml | 2 +- .../Views/Windows/WarningWindow.xaml.cs | 2 + 货架标准上位机/WebSocket.cs | 33 +- 货架标准上位机/data/jsconfig.json | 16 +- 货架标准上位机/货架标准上位机.csproj | 4 + 82 files changed, 3404 insertions(+), 240 deletions(-) create mode 100644 WCS.BLL/DbModels/DingDingSendUser.cs create mode 100644 WCS.BLL/Manager/MXBackgroundThread.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/ApiResult.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/BunkerOutRequest.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/InputStockInRequest.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/MXMesResponseCommon.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/PickOrderRequest.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/QueryByBar.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/RecommendedBarCodeRequest.cs create mode 100644 WCS.Model/ApiModel/MXBackgroundThread/SelectMaterialBarDto.cs create mode 100644 WCS.Model/ApiModel/MatInventoryDetail/CompareMatInventoryDetailRequest.cs rename 货架标准上位机/Resources/{扫码枪结束入库二维码.png => goOutInstore.png} (100%) create mode 100644 货架标准上位机/ViewModels/MXViewModel/MXOutInventoryViewModel.cs create mode 100644 货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs create mode 100644 货架标准上位机/ViewModels/MXViewModel/MXOutOrderViewModel.cs create mode 100644 货架标准上位机/Views/MXWindows/MXMainWindow.xaml create mode 100644 货架标准上位机/Views/MXWindows/MXMainWindow.xaml.cs create mode 100644 货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml create mode 100644 货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml.cs create mode 100644 货架标准上位机/Views/MXWindows/MXOutOrderDetailView.xaml create mode 100644 货架标准上位机/Views/MXWindows/MXOutOrderDetailView.xaml.cs create mode 100644 货架标准上位机/Views/MXWindows/MXOutOrderView.xaml create mode 100644 货架标准上位机/Views/MXWindows/MXOutOrderView.xaml.cs diff --git a/WCS.BLL/Config/JsConfig.cs b/WCS.BLL/Config/JsConfig.cs index 7390edf..d5ef580 100644 --- a/WCS.BLL/Config/JsConfig.cs +++ b/WCS.BLL/Config/JsConfig.cs @@ -18,6 +18,18 @@ namespace WCS.BLL.Config /// public bool IsSameMatCodeOut { get; set; } /// + /// 数据-数据库路径 + /// + public string DataDbPath { get; set; } + /// + /// 日志-数据库路径 + /// + public string LogDbPath { get; set; } + /// + /// 权限-数据库路径 + /// + public string AuthDbPath { get; set; } + /// /// 是否接入WMS系统 /// public bool IsAccessWMS { get; set; } @@ -25,5 +37,25 @@ namespace WCS.BLL.Config /// WMS系统 /// public string? WMSUrl { get; set; } + + #region 盟讯公司后台配置 + public bool IsMx { get; set; } + /// + /// 回传Mes入库/移库 + /// + public string InputStockInStr { get; set; } + /// + /// 回传Mes出库 + /// + public string BunkerOutStr { get; set; } + /// + /// 通过条码查询物料信息接口 + /// + public string QueryBybar { get; set; } + /// + /// 后台配置的组别 + /// + public string GroupName { get; set; } + #endregion } } diff --git a/WCS.BLL/DbModels/DingDingSendUser.cs b/WCS.BLL/DbModels/DingDingSendUser.cs new file mode 100644 index 0000000..d19c848 --- /dev/null +++ b/WCS.BLL/DbModels/DingDingSendUser.cs @@ -0,0 +1,19 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WCS.BLL.DbModels +{ + [SugarTable("ding_ding_send_user")] + public class DingDingSendUser + { + /// + /// 工号 + /// + [SugarColumn(ColumnName = "user_name", Length = 50, IsNullable = true, ColumnDescription = "创建人")] + public string UserName { get; set; } + } +} diff --git a/WCS.BLL/DbModels/DocumentSerialNumber.cs b/WCS.BLL/DbModels/DocumentSerialNumber.cs index c5efd11..1860f35 100644 --- a/WCS.BLL/DbModels/DocumentSerialNumber.cs +++ b/WCS.BLL/DbModels/DocumentSerialNumber.cs @@ -12,7 +12,7 @@ namespace WCS.BLL.DbModels /// /// 用于记录单据生成到哪个序号了 /// - [SugarTable("document_serial_number")] + [SugarTable("wcs_document_serial_number")] public class DocumentSerialNumber { /// diff --git a/WCS.BLL/DbModels/InOutRecord.cs b/WCS.BLL/DbModels/InOutRecord.cs index 08014b8..080816f 100644 --- a/WCS.BLL/DbModels/InOutRecord.cs +++ b/WCS.BLL/DbModels/InOutRecord.cs @@ -12,7 +12,7 @@ namespace WCS.BLL.DbModels /// /// 出入库记录 /// - [SugarTable("in_out_record")] + [SugarTable("wcs_in_out_record")] public class InOutRecord { /// @@ -115,6 +115,33 @@ namespace WCS.BLL.DbModels [SugarColumn(ColumnName = "operate_user", Length = 100, IsNullable = true, ColumnDescription = "创建人")] public string OperateUser { get; set; } + /// + /// 串联绑定后的大货架编码 + /// + [SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")] + public string? BigShelfCode { get; set; } = string.Empty; + /// + /// Row 行 + /// + [SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")] + public string R { get; set; } + /// + /// Column 列 + /// + [SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")] + public string C { get; set; } + /// + /// Column 位 + /// + [SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")] + public string Wei { get; set; } + + /// + /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架) + /// + [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")] + public string GroupName { get; set; } + /// /// 序号 /// diff --git a/WCS.BLL/DbModels/InventoryDetail.cs b/WCS.BLL/DbModels/InventoryDetail.cs index 3707137..93ddf90 100644 --- a/WCS.BLL/DbModels/InventoryDetail.cs +++ b/WCS.BLL/DbModels/InventoryDetail.cs @@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels /// /// 库存明细表 /// - [SugarTable("inventory_detail")] + [SugarTable("wcs_inventory_detail")] public class InventoryDetail { /// @@ -102,7 +102,38 @@ namespace WCS.BLL.DbModels /// [SugarColumn(ColumnName = "is_locked", IsNullable = false, ColumnDescription = "物料是否已被锁定")] public bool IsLocked { get; set; } = false; + /// + /// 串联绑定后的大货架编码 + /// + [SugarColumn(ColumnName = "big_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")] + public string? BigShelfCode { get; set; } = string.Empty; + /// + /// Row 行 + /// + [SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")] + public string R { get; set; } + /// + /// Column 列 + /// + [SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")] + public string C { get; set; } + /// + /// Column 位 + /// + [SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")] + public string Wei { get; set; } + /// + /// WarehouseCode 仓库代码 + /// + [SugarColumn(ColumnName = "WarehouseCode", Length = 10, IsNullable = true, ColumnDescription = "仓库代码")] + public string WarehouseCode { get; set; } + + /// + /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架) + /// + [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")] + public string GroupName { get; set; } /// /// 序号 /// diff --git a/WCS.BLL/DbModels/MatBaseInfo.cs b/WCS.BLL/DbModels/MatBaseInfo.cs index 6f234ae..2b1b4a4 100644 --- a/WCS.BLL/DbModels/MatBaseInfo.cs +++ b/WCS.BLL/DbModels/MatBaseInfo.cs @@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels /// ///物料基础信息 /// - [SugarTable("mat_base_info")] + [SugarTable("wcs_mat_base_info")] public partial class MatBaseInfo { /// diff --git a/WCS.BLL/DbModels/MatInfo.cs b/WCS.BLL/DbModels/MatInfo.cs index 9c392f7..896f613 100644 --- a/WCS.BLL/DbModels/MatInfo.cs +++ b/WCS.BLL/DbModels/MatInfo.cs @@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels /// ///物料信息表 /// - [SugarTable("mat_info")] + [SugarTable("wcs_mat_info")] public class MatInfo { /// diff --git a/WCS.BLL/DbModels/ModuleInfo.cs b/WCS.BLL/DbModels/ModuleInfo.cs index 73a4c41..77d31c6 100644 --- a/WCS.BLL/DbModels/ModuleInfo.cs +++ b/WCS.BLL/DbModels/ModuleInfo.cs @@ -11,7 +11,7 @@ namespace WCS.DAL.DbModels /// ///模组信息表 /// - [SugarTable("module_info")] + [SugarTable("wcs_module_info")] public class ModuleInfo { @@ -62,7 +62,11 @@ namespace WCS.DAL.DbModels /// [SugarColumn(ColumnName = "client_ip", Length = 50, IsNullable = false, ColumnDescription = "货架对应Can模块的Ip")] public string CleintIp { get; set; } - + /// + /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架) + /// + [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")] + public string GroupName { get; set; } /// /// R 行 /// diff --git a/WCS.BLL/DbModels/OutOrder.cs b/WCS.BLL/DbModels/OutOrder.cs index dac1965..5fb7a59 100644 --- a/WCS.BLL/DbModels/OutOrder.cs +++ b/WCS.BLL/DbModels/OutOrder.cs @@ -6,7 +6,7 @@ namespace WCS.BLL.DbModels /// /// 出库单据 /// - [SugarTable("out_order")] + [SugarTable("wcs_out_order")] public class OutOrder { /// @@ -63,6 +63,12 @@ namespace WCS.BLL.DbModels [SugarColumn(ColumnName = "shelf_type_id", IsNullable = false, DefaultValue = "0", ColumnDescription = "货架类型Id")] public int ShelfTypeId { get; set; } = 0; + /// + /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架) + /// + [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")] + public string GroupName { get; set; } + /// /// 创建时间 /// diff --git a/WCS.BLL/DbModels/OutOrderDetail.cs b/WCS.BLL/DbModels/OutOrderDetail.cs index 73550b5..477c0e1 100644 --- a/WCS.BLL/DbModels/OutOrderDetail.cs +++ b/WCS.BLL/DbModels/OutOrderDetail.cs @@ -6,7 +6,7 @@ namespace WCS.BLL.DbModels /// /// 出库单据明细表 /// - [SugarTable("out_order_detail")] + [SugarTable("wcs_out_order_detail")] public class OutOrderDetail { /// diff --git a/WCS.BLL/DbModels/OutOrderMatDetail.cs b/WCS.BLL/DbModels/OutOrderMatDetail.cs index 84e1fa5..3b284fd 100644 --- a/WCS.BLL/DbModels/OutOrderMatDetail.cs +++ b/WCS.BLL/DbModels/OutOrderMatDetail.cs @@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels /// /// 出库物料明细(库存数据加锁后缓存对应的数据并记录状态) /// - [SugarTable("out_order_mat_detail")] + [SugarTable("wcs_out_order_mat_detail")] public class OutOrderMatDetail { /// diff --git a/WCS.BLL/DbModels/ShelfInfo.cs b/WCS.BLL/DbModels/ShelfInfo.cs index df5f5f6..66fcd40 100644 --- a/WCS.BLL/DbModels/ShelfInfo.cs +++ b/WCS.BLL/DbModels/ShelfInfo.cs @@ -8,7 +8,7 @@ using WCS.BLL.HardWare; namespace WCS.DAL.DbModels { - [SugarTable("shelf_info")] + [SugarTable("wcs_shelf_info")] public class ShelfInfo { @@ -83,7 +83,7 @@ namespace WCS.DAL.DbModels /// 串联绑定后的大货架编码 /// [SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")] - public string? BindShelfCode { get; set; } = string.Empty; + public string? BigShelfCode { get; set; } = string.Empty; /// /// 序号 diff --git a/WCS.BLL/DbModels/ShelfTypeInfo.cs b/WCS.BLL/DbModels/ShelfTypeInfo.cs index 6b0db4b..5e84a14 100644 --- a/WCS.BLL/DbModels/ShelfTypeInfo.cs +++ b/WCS.BLL/DbModels/ShelfTypeInfo.cs @@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels /// /// 货架类型 /// - [SugarTable("shelf_type")] + [SugarTable("wcs_shelf_type")] public class ShelfTypeInfo { [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsNullable = false, IsIdentity = true)] diff --git a/WCS.BLL/DbModels/StockTakingOrder.cs b/WCS.BLL/DbModels/StockTakingOrder.cs index 47498ce..ccd2e36 100644 --- a/WCS.BLL/DbModels/StockTakingOrder.cs +++ b/WCS.BLL/DbModels/StockTakingOrder.cs @@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels /// /// 盘点单据 /// - [SugarTable("stock_taking_order")] + [SugarTable("wcs_stock_taking_order")] public class StockTakingOrder { /// diff --git a/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs b/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs index 203ebb3..83b9c33 100644 --- a/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs +++ b/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs @@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels /// /// 盘点单据物料明细 /// - [SugarTable("stock_taking_order_matdetail")] + [SugarTable("wcs_stock_taking_order_matdetail")] public class StockTakingOrderMatDetail { /// diff --git a/WCS.BLL/DbModels/StoreInfo.cs b/WCS.BLL/DbModels/StoreInfo.cs index ff551aa..1b6a409 100644 --- a/WCS.BLL/DbModels/StoreInfo.cs +++ b/WCS.BLL/DbModels/StoreInfo.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace WCS.DAL.DbModels { - [SugarTable("store_info")] + [SugarTable("wcs_store_info")] public partial class StoreInfo { /// @@ -25,7 +25,7 @@ namespace WCS.DAL.DbModels /// 货架类型Id /// [SugarColumn(ColumnName = "shelf_type_id", IsNullable = false, DefaultValue = "0", ColumnDescription = "货架类型Id")] - public int ShelfTypeId { get; set; } + public int ShelfTypeId { get; set; } /// /// 模组Id /// @@ -92,6 +92,33 @@ namespace WCS.DAL.DbModels [SugarColumn(ColumnName = "offset_voltage", IsNullable = true, ColumnDescription = "电压偏移值")] public decimal OffsetVoltage { get; set; } + /// + /// 串联绑定后的大货架编码 + /// + [SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")] + public string? BigShelfCode { get; set; } = string.Empty; + /// + /// Row 行 + /// + [SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")] + public string R { get; set; } + /// + /// Column 列 + /// + [SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")] + public string C { get; set; } + /// + /// Column 位 + /// + [SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")] + public string Wei { get; set; } + + /// + /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架) + /// + [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")] + public string GroupName { get; set; } + /// /// 序号 /// diff --git a/WCS.BLL/DbModels/SystemApiLogRecord.cs b/WCS.BLL/DbModels/SystemApiLogRecord.cs index e1ae5a9..6746e34 100644 --- a/WCS.BLL/DbModels/SystemApiLogRecord.cs +++ b/WCS.BLL/DbModels/SystemApiLogRecord.cs @@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels /// /// 系统接口日志记录 /// - [SugarTable("system_api_log_record")] + [SugarTable("wcs_system_api_log_record")] public class SystemApiLogRecord { /// diff --git a/WCS.BLL/HardWare/SmartShelf.cs b/WCS.BLL/HardWare/SmartShelf.cs index 03ae84f..782a4dd 100644 --- a/WCS.BLL/HardWare/SmartShelf.cs +++ b/WCS.BLL/HardWare/SmartShelf.cs @@ -949,6 +949,12 @@ namespace WCS.BLL.HardWare StoreCode = storeInfo.StoreCode, StoreId = storeInfo.Id, + R = storeInfo.R, + C = storeInfo.C, + Wei = storeInfo.Wei, + BigShelfCode = storeInfo.BigShelfCode, + GroupName = storeInfo.GroupName, + MatSN = this.InStoreData.materialBar, MatCode = this.InStoreData.materialCode, MatName = this.InStoreData.materialName, @@ -969,6 +975,12 @@ namespace WCS.BLL.HardWare StoreId = storeInfo.Id, StoreInfo = storeInfo, + R = storeInfo.R, + C = storeInfo.C, + Wei = storeInfo.Wei, + BigShelfCode = storeInfo.BigShelfCode, + GroupName = storeInfo.GroupName, + MatSN = this.InStoreData.materialBar, MatCode = this.InStoreData.materialCode, MatName = this.InStoreData.materialName, @@ -1344,6 +1356,12 @@ namespace WCS.BLL.HardWare StoreId = storeInfo.Id, StoreInfo = storeInfo, + R = storeInfo.R, + C = storeInfo.C, + Wei = storeInfo.Wei, + BigShelfCode = storeInfo.BigShelfCode, + GroupName = storeInfo.GroupName, + MatSN = inventoryDetail.MatSN, MatCode = inventoryDetail.MatCode, MatName = inventoryDetail.MatName, diff --git a/WCS.BLL/Manager/DbInit.cs b/WCS.BLL/Manager/DbInit.cs index 981e4f2..e7d6f36 100644 --- a/WCS.BLL/Manager/DbInit.cs +++ b/WCS.BLL/Manager/DbInit.cs @@ -1,9 +1,13 @@ -using System; +using SqlSugar; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using WCS.BLL.Config; using WCS.BLL.DbModels; +using WCS.BLL.HardWare; +using WCS.DAL; using WCS.DAL.Db; using WCS.DAL.Db.AuthDb; using WCS.DAL.DbModels; @@ -15,7 +19,49 @@ namespace WCS.BLL.Manager public static void InitDb() { Logs.Write("【初始化数据库】开始", LogsType.StartBoot); + //初始化数据库对象 + if (LocalFile.Config.IsMx) + { + DbHelp.db = new SqlSugarScope(new ConnectionConfig() + { + ConnectionString = LocalFile.Config.DataDbPath, + DbType = DbType.SqlServer,//[Sqlite]安装[System.Data.SQLite]; + IsAutoCloseConnection = true + }, db => + { + db.Aop.OnError = ex => + { + }; + }); + + DbHelp.dbLog = new SqlSugarScope(new ConnectionConfig() + { + ConnectionString = LocalFile.Config.LogDbPath, + DbType = DbType.SqlServer,//[Sqlite]安装[System.Data.SQLite]; + IsAutoCloseConnection = true + }, db => + { + db.Aop.OnError = ex => + { + }; + }); + + AuthDbHelp.db = new SqlSugarScope(new ConnectionConfig() + { + ConnectionString = LocalFile.Config.AuthDbPath, + DbType = DbType.SqlServer,//[Sqlite]安装[System.Data.SQLite]; + IsAutoCloseConnection = true + }, db => + { + db.Aop.OnError = ex => + { + }; + }); + } + + DbHelp.db.DbMaintenance.CreateDatabase(); + DbHelp.dbLog.DbMaintenance.CreateDatabase(); DbHelp.db.CodeFirst.InitTables(typeof(ModuleInfo), typeof(ShelfInfo), typeof(StoreInfo) , typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail) @@ -46,8 +92,25 @@ namespace WCS.BLL.Manager DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand(); DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand(); } + //初始化货架类型 + if (!DbHelp.db.Queryable().Any()) + { + var smartShelf = new ShelfTypeInfo() + { + ShelfTypeName = "智能货架" + }; + var singleLight = new ShelfTypeInfo() + { + ShelfTypeName = "信息化货架" + }; + DbHelp.db.Insertable(smartShelf).ExecuteCommand(); + DbHelp.db.Insertable(singleLight).ExecuteCommand(); + } Logs.Write("【初始化数据库】结束", LogsType.StartBoot); + + //初始化权限数据库 + AuthDbHelp.InitDb(); } } } diff --git a/WCS.BLL/Manager/MXBackgroundThread.cs b/WCS.BLL/Manager/MXBackgroundThread.cs new file mode 100644 index 0000000..1b6de7f --- /dev/null +++ b/WCS.BLL/Manager/MXBackgroundThread.cs @@ -0,0 +1,255 @@ +using SqlSugar; +using WCS.BLL.Config; +using WCS.BLL.DbModels; +using WCS.BLL.Tool; +using WCS.DAL; +using WCS.DAL.Db; +using WCS.DAL.Db.AuthDb; +using WCS.Model; +using WCS.Model.ApiModel.InOutRecord; +using WCS.Model.ApiModel.MXBackgroundThread; + +namespace WCS.BLL.Manager +{ + //盟讯公司后台方法 + public static class MXBackgroundThread + { + public static void InitBackgroundThread() + { + #region 定时任务:回传Mes入库出库 + Task.Run(() => + { + while (true) + { + //每5秒同步一次 + Thread.Sleep(5000); + try + { + var records = DbHelp.db.Queryable() + .Where(t => t.OperateTime > DateTime.Now.AddDays(-3)) //只查询回传三天内数据 + .Where(t => t.IsUpload == false) + .Includes(t => t.StoreInfo) + .OrderBy(t => t.Id) + .ToList(); + //入库记录上传 + var inventoryDetails = records.Where(t => t.Direction == DirectionEnum.入库) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName) + .ToList(); + if (inventoryDetails != null && inventoryDetails.Count > 0) + { + for (int i = 0; i < inventoryDetails.Count; i++) + { + try + { + //请求WMS上传入库记录 + var data = new InputStockInRequest + { + materialBar = inventoryDetails[i].MatSN, + shelfCode = inventoryDetails[i].BigShelfCode, + shelfX = "R" + inventoryDetails[i].R, + shelfY = "C" + inventoryDetails[i].C, + shelfZ = inventoryDetails[i].Wei, + inUser = inventoryDetails[i].OperateUser, + inTime = inventoryDetails[i].OperateTime.ToString("yyyy-MM-dd HH:mm:ss"), + }; + Guid guid = Guid.NewGuid(); + var result = ApiHelp.GetDataFromHttp(LocalFile.Config.InputStockInStr, data, "POST", true); + if (result != null && (result.Code == 200)) + { + //上传成功 更改上传状态 + inventoryDetails[i].IsUpload = true; + DbHelp.db.Updateable(inventoryDetails[i]).ExecuteCommand(); + } + + } + catch (Exception ex) + { + + } + Thread.Sleep(200); + } + } + + //出库记录上传 + var outRecord = records.Where(t => t.Direction == DirectionEnum.出库) + .Where(t => !string.IsNullOrEmpty(t.OrderNumber)) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName) + .ToList(); + if (outRecord != null && outRecord.Count > 0) + { + for (int i = 0; i < outRecord.Count; i++) + { + try + { + var retString = string.Empty; + + var data = new BunkerOutRequest() + { + materialBar = outRecord[i].MatSN, + outType = 0, + pickBillNumber = outRecord[i].OrderNumber, + qty = outRecord[i].MatQty, + }; + var result = ApiHelp.GetDataFromHttp(LocalFile.Config.BunkerOutStr, data, "POST", true); + //请求成功 + if (result != null && result.Code == 200) + { + //上传成功 更改上传状态 + outRecord[i].IsUpload = true; + DbHelp.db.Updateable(outRecord[i]).ExecuteCommand(); + } + + } + catch (Exception ex) + { + + } + Thread.Sleep(200); + } + } + } + catch (Exception ex) + { + Logs.Write("【定时任务】上传异常:" + ex.Message); + } + } + }); + #endregion + + #region 定时任务:超时退出 出库、入库、盘点模式 + + #endregion + + #region 定时任务:海康未扫物料码的物料更新数据 + Task.Run(() => + { + while (true) + { + //间隔20秒同步一次 + Thread.Sleep(20000); + try + { + var inventoryDetails = DbHelp.db.Queryable() + .Where(t => t.MatName == "暂时未知") + .Where(t => t.InstoreTime > DateTime.Now.AddDays(-3)) + .ToList(); + if (inventoryDetails != null && inventoryDetails.Count > 0) + { + for (int i = 0; i < inventoryDetails.Count; i++) + { + try + { + //请求WMS获取物料的信息 + var request = new QueryBybarRequest() + { + materialBar = inventoryDetails[i].MatSN + }; + var result = ApiHelp.GetDataFromHttp(LocalFile.Config.QueryBybar, request, "POST", true); + if (result != null && (result.code == 200) && result.data != null && result.data.Count() > 0) + { + //查询成功 更改数值 + var instoreDto = result.data.FirstOrDefault(); + inventoryDetails[i].MatCode = instoreDto.materialCode; + inventoryDetails[i].MatName = instoreDto.materialName; + inventoryDetails[i].MatBatch = instoreDto.batchNo; + inventoryDetails[i].MatSpec = instoreDto.materialSpec; + inventoryDetails[i].MatQty = (int)instoreDto.materialQty; + DbHelp.db.Updateable(inventoryDetails[i]).ExecuteCommand(); + } + + } + catch (Exception ex) + { + + } + Thread.Sleep(500); + } + } + + + + } + catch (Exception ex) + { + Logs.Write("【定时任务】更新海康物料信息异常:" + ex.Message); + } + + Thread.Sleep(3000); + try + { + var inventoryDetails = DbHelp.db.Queryable() + .Where(t => t.WarehouseCode == null) + .Where(t => t.InstoreTime > DateTime.Now.AddDays(-30)) + .ToList(); + if (inventoryDetails != null && inventoryDetails.Count > 0) + { + for (int i = 0; i < inventoryDetails.Count; i++) + { + try + { + var url = $"http://192.168.2.23:9213/integrate/hkwsInventoryDetail/selectMaterialBar?materialBar={inventoryDetails[i].MatSN}"; + var result = ApiHelp.GetDataFromHttp(url, null, "POST", false); + if (result != null && result.code == 200 && result.data != null && !string.IsNullOrEmpty(result.data.warehouseCode)) + { + //查询成功 更改数值 + inventoryDetails[i].WarehouseCode = result.data.warehouseCode; + DbHelp.db.Updateable(inventoryDetails[i]).ExecuteCommand(); + } + + } + catch (Exception ex) + { + Logs.Write("【定时任务】更新仓库代码异常:" + ex.Message); + } + Thread.Sleep(500); + } + } + } + catch (Exception ex) + { + } + } + }); + #endregion + + #region 定时任务:紧机复原和监测警示灯关灯机制 + #endregion + } + + /// + /// 发送钉钉消息 + /// + /// 发送的消息内容 + /// 错误信息 + /// 工号列表 + /// + public static bool SendDingDingMsg(string msg, List idList, ref string errMsg) + { + try + { + #region 获取所有工程研发人员 + var list = AuthDbHelp.db.Queryable().Where(t => t.IsGCYF) + .Select(t => t.LoginName) + .ToList(); + #endregion + string ids = string.Join(",", list); + string url = "http://192.168.2.23:9213/integrate/cmccMonitor/rateAlertByCMCC?" + $"context={msg}&messageType=软件管理平台&username={ids}"; + #region 调用接口请求发送钉钉消息 + var Result = ApiHelp.GetDataFromHttp(url, null, "GET"); + if (Result != null && Result.code != 200) + { + errMsg = Result.msg; + return false; + } + return true; + #endregion + + } + catch (Exception ex) + { + errMsg = "接口调用失败"; + return false; + } + } + } +} diff --git a/WCS.BLL/Manager/ShelfManager.cs b/WCS.BLL/Manager/ShelfManager.cs index 20a1c35..347222e 100644 --- a/WCS.BLL/Manager/ShelfManager.cs +++ b/WCS.BLL/Manager/ShelfManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using WCS.BLL.Config; using WCS.BLL.DbModels; using WCS.BLL.HardWare; using WCS.DAL.Db; @@ -22,7 +23,10 @@ namespace WCS.BLL.Manager { Logs.Write("【InitShelves】开始", LogsType.StartBoot); - var shelvesInDb = DbHelp.db.Queryable().ToList(); + var shelvesInDbQueryable = DbHelp.db.Queryable(); + if (LocalFile.Config.IsMx) + shelvesInDbQueryable = shelvesInDbQueryable.Where(t => t.GroupName == LocalFile.Config.GroupName); + var shelvesInDb = shelvesInDbQueryable.ToList(); foreach (var shelfInDb in shelvesInDb) { Shelves.Add(InitShelf(shelfInDb)); diff --git a/WCS.BLL/Manager/WarningManager.cs b/WCS.BLL/Manager/WarningManager.cs index ab69ca2..b8fafe7 100644 --- a/WCS.BLL/Manager/WarningManager.cs +++ b/WCS.BLL/Manager/WarningManager.cs @@ -139,7 +139,6 @@ namespace WCS.BLL.Manager public static void SolveLoss(WebSocketMessageModel warning) { #region 【后台】丢失的数据处理 - try { //获取库位 @@ -164,6 +163,12 @@ namespace WCS.BLL.Manager StoreId = storeInfo.Id, StoreInfo = storeInfo, + R = storeInfo.R, + C = storeInfo.C, + Wei = storeInfo.Wei, + BigShelfCode = storeInfo.BigShelfCode, + GroupName = storeInfo.GroupName, + MatSN = inventoryDetail.MatSN, MatCode = inventoryDetail.MatCode, MatName = inventoryDetail.MatName, @@ -174,9 +179,29 @@ namespace WCS.BLL.Manager MatSupplier = inventoryDetail.MatSupplier, Direction = DirectionEnum.丢失, + OperateUser = warning.SolvedUser, }; DbHelp.db.Insertable(inOutRecord).ExecuteCommand(); DbHelp.db.Deleteable(inventoryDetail).ExecuteCommand(); + + #region 如果是出库 删除正在出库缓存的数据 + if (warning.WarningType == WarningTypeEnum.出库自检丢失) + { + //清掉需要出库的缓存 + var shelf = ShelfManager.Shelves + .Where(t => t.ShelfId == warning.ShelfId) + .FirstOrDefault(); + if (shelf != null) + { + var smartShelf = shelf as SmartShelf; + if (smartShelf != null) + { + smartShelf.CurrentOutStoreMatSNs.RemoveAll(t => t == inventoryDetail.MatSN); + //TODO 如何保证丢失的继续进行 + } + } + } + #endregion } DbHelp.db.CommitTran(); } diff --git a/WCS.BLL/Manager/WebSoceketManager.cs b/WCS.BLL/Manager/WebSoceketManager.cs index 423ee15..540bcee 100644 --- a/WCS.BLL/Manager/WebSoceketManager.cs +++ b/WCS.BLL/Manager/WebSoceketManager.cs @@ -32,7 +32,13 @@ namespace WCS.BLL.Manager .UseAutoPong();//当收到ping报文时自动回应pong a.Add();//自定义插件。 })); - + //客户端成功连接 + service.Connected = (client, e) => + { + Logs.Write("[WebSocket]" + client.GetIPPort() + "成功连接!", LogsType.StartBoot); + Console.WriteLine("[WebSocket]" + client.GetIPPort() +"成功连接!"); + return EasyTask.CompletedTask; + }; service.Start(); Console.WriteLine("【启动WebSocket】结束"); Logs.Write("【启动WebSocket】结束", LogsType.StartBoot); diff --git a/WCS.BLL/Services/IService/IMatInventoryDetailService.cs b/WCS.BLL/Services/IService/IMatInventoryDetailService.cs index 87024f8..55e6e55 100644 --- a/WCS.BLL/Services/IService/IMatInventoryDetailService.cs +++ b/WCS.BLL/Services/IService/IMatInventoryDetailService.cs @@ -15,5 +15,7 @@ namespace WCS.BLL.Services.IService public Task> exportMatInventoryDetail(GetMatInventoryDetailRequest request); public Task>> getMatInventorySummary(GetMatInventorySummaryRequest request); + + public Task> compareMatInventoryDetail(CompareMatInventoryDetailRequest request); } } diff --git a/WCS.BLL/Services/Service/InstoreService.cs b/WCS.BLL/Services/Service/InstoreService.cs index 96e37ea..18aeb4b 100644 --- a/WCS.BLL/Services/Service/InstoreService.cs +++ b/WCS.BLL/Services/Service/InstoreService.cs @@ -13,6 +13,7 @@ using WCS.DAL.Db; using WCS.DAL.DbModels; using WCS.Model; using WCS.Model.ApiModel.InOutRecord; +using WCS.Model.ApiModel.MXBackgroundThread; namespace WCS.BLL.Services.Service { @@ -180,7 +181,7 @@ namespace WCS.BLL.Services.Service materialSpec = data.materialSpec, batchNo = data.batchNo, supplier = "", - customer = data.materialBar, + customer = "", InstoreUser = request.UserName }; @@ -207,6 +208,47 @@ namespace WCS.BLL.Services.Service else if (Result != null && Result.Code == 200 && Result.Data == null) { //Mes系统中未获取到物料信息 + + //简单校验看是否满足海康物料 + //海康物料 只扫了外箱码 未扫条码 + if ((request.MatSn.Length == 54 || request.MatSn.Length == 56) && !request.MatSn.Contains("\\") && !request.MatSn.Contains("/")) + { + + if (!request.SingleLightIn && shelf != null) + shelf.InStoreData = new MatInfoResponse() + { + materialBar = request.MatSn, + materialCode = "暂时未知", + materialName = "暂时未知", + materialQty = 0, + materialSpec = "暂时未知", + batchNo = "暂时未知", + supplier = "", + customer = "", + + InstoreUser = request.UserName + }; + + var matInfo = new MatInfo() + { + MatSn = request.MatSn, + MatCode = "暂时未知", + MatName = "暂时未知", + MatBatch = "暂时未知", + MatQty = 0, + MatSpec = "暂时未知", + MatSupplier = "", + MatCustomer = "", + }; + + return new ResponseCommon() + { + Code = 200, + Data = matInfo, + Message = "success" + }; + } + return new ResponseCommon() { Code = 201, diff --git a/WCS.BLL/Services/Service/MatInventoryDetailService.cs b/WCS.BLL/Services/Service/MatInventoryDetailService.cs index c8bab98..5896341 100644 --- a/WCS.BLL/Services/Service/MatInventoryDetailService.cs +++ b/WCS.BLL/Services/Service/MatInventoryDetailService.cs @@ -6,6 +6,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using TouchSocket.Core; +using WCS.BLL.Config; using WCS.BLL.DbModels; using WCS.BLL.Services.IService; using WCS.DAL.Db; @@ -149,5 +150,48 @@ namespace WCS.BLL.Services.Service Data = inventortyDetails }; } + + public async Task> compareMatInventoryDetail(CompareMatInventoryDetailRequest request) + { + try + { + //查询 本分组中 是否含有所传SN的物料 + var recordsQueryable = DbHelp.db.Queryable() + .Where(t => request.MatSns.Contains(t.MatSN)) + .OrderBy(t => t.MatCode) + .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.StoreInfo.GroupName == LocalFile.Config.GroupName); + var totalCount = await recordsQueryable.CountAsync(); + var records = await recordsQueryable.ToListAsync(); + //生成序号 选中 + for (int i = 0; i < records.Count; i++) + { + records[i].RowNumber = i + 1; + records[i].IsSelected = true; + } + return new PageQueryResponse() + { + Code = 200, + Message = $"success", + Data = new PageQueryResponseData() + { + TotalCount = totalCount, + Count = records.Count, + Lists = records.ToList() + } + }; + } + catch + { + return new PageQueryResponse() + { + Code = 200, + Message = $"success", + Data = new PageQueryResponseData() + { + Lists = new List() + } + }; + } + } } } diff --git a/WCS.BLL/Services/Service/OutstoreService.cs b/WCS.BLL/Services/Service/OutstoreService.cs index 14cbeb6..32b065b 100644 --- a/WCS.BLL/Services/Service/OutstoreService.cs +++ b/WCS.BLL/Services/Service/OutstoreService.cs @@ -1,4 +1,5 @@ -using SqlSugar; +using Microsoft.Data.SqlClient; +using SqlSugar; using WCS.BLL.Config; using WCS.BLL.DbModels; using WCS.BLL.Manager; @@ -154,103 +155,262 @@ namespace WCS.BLL.Services.Service Message = "出库单据同步失败:缺少物料明细!" }; } - //库存有无校验 & 库存已锁校验 - try + //标准版逻辑-库存有无校验 & 库存已锁校验 + if (!LocalFile.Config.IsMx) { - await DbHelp.db.BeginTranAsync(); - var inventoryDetails = await DbHelp.db.Queryable() - .Where(t => request.SnList.Contains(t.MatSN)) - .TranLock(DbLockType.Wait) - .ToListAsync(); - if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量 + try { - var existsSns = inventoryDetails.Select(t => t.MatSN).ToList(); - request.SnList.RemoveAll(t => existsSns.Contains(t)); - await DbHelp.db.RollbackTranAsync(); - //返回提示哪些物料库存不存在 + await DbHelp.db.BeginTranAsync(); + var inventoryDetails = await DbHelp.db.Queryable() + .Where(t => request.SnList.Contains(t.MatSN)) + .TranLock(DbLockType.Wait) + .ToListAsync(); + if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量 + { + var existsSns = inventoryDetails.Select(t => t.MatSN).ToList(); + request.SnList.RemoveAll(t => existsSns.Contains(t)); + await DbHelp.db.RollbackTranAsync(); + //返回提示哪些物料库存不存在 + return new ResponseCommon() + { + Code = 201, + Message = "出库单据同步失败:存在物料不在库存中!", + Data = request.SnList + + }; + } + else if (inventoryDetails.Where(t => t.IsLocked).Any()) + { + await DbHelp.db.RollbackTranAsync(); + //返回提示哪些物料库存已被锁定 + return new ResponseCommon() + { + Code = 201, + Message = "出库单据同步失败:存在物料被锁定!", + Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList() + }; + } + + #region 保存数据 + + //锁库存 + inventoryDetails.ForEach(t => + { + t.IsLocked = true; + }); + var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync(); + + //保存数据 + var order = new OutOrder() + { + OrderNumber = request.OrderNumber, + OrderSource = request.OrderSource, + OrderType = request.OrderType, + SyncType = SyncTypeEnum.ByMatSn, + CreateUser = request.UserName, + }; + order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync(); + + //通过库存数据保存出库物料明细表 + var matDetailTasks = inventoryDetails.Select(async t => + { + var orderMatDetail = new OutOrderMatDetail() + { + OrderId = order.Id, + OrderNumber = order.OrderNumber, + InventoryDetailId = t.Id, + StoreId = t.StoreId, + StoreCode = t.StoreCode, + MatSN = t.MatSN, + MatCode = t.MatCode, + MatName = t.MatName, + MatSpec = t.MatSpec, + MatBatch = t.MatBatch, + MatQty = t.MatQty, + MatSupplier = t.MatSupplier, + MatCustomer = t.MatCustomer, + CreateUser = request.UserName + }; + await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync(); + }).ToList(); + + await lockTask; + await Task.WhenAll(matDetailTasks); + + await DbHelp.db.CommitTranAsync(); return new ResponseCommon() { - Code = 201, - Message = "出库单据同步失败:存在物料不在库存中!", - Data = request.SnList - + Code = 200, + Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}", + Data = order.Id }; + #endregion } - else if (inventoryDetails.Where(t => t.IsLocked).Any()) + catch (Exception ex) { await DbHelp.db.RollbackTranAsync(); - //返回提示哪些物料库存已被锁定 - return new ResponseCommon() + return new ResponseBase() { Code = 201, - Message = "出库单据同步失败:存在物料被锁定!", - Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList() + Message = $"出库单据同步失败:{ex.Message}" }; } - - #region 保存数据 - - //锁库存 - inventoryDetails.ForEach(t => - { - t.IsLocked = true; - }); - var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync(); - - //保存数据 - var order = new OutOrder() - { - OrderNumber = request.OrderNumber, - OrderSource = request.OrderSource, - OrderType = request.OrderType, - SyncType = SyncTypeEnum.ByMatSn, - CreateUser = request.UserName, - }; - order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync(); - - //通过库存数据保存出库物料明细表 - var matDetailTasks = inventoryDetails.Select(async t => - { - var orderMatDetail = new OutOrderMatDetail() - { - OrderId = order.Id, - OrderNumber = order.OrderNumber, - InventoryDetailId = t.Id, - StoreId = t.StoreId, - StoreCode = t.StoreCode, - MatSN = t.MatSN, - MatCode = t.MatCode, - MatName = t.MatName, - MatSpec = t.MatSpec, - MatBatch = t.MatBatch, - MatQty = t.MatQty, - MatSupplier = t.MatSupplier, - MatCustomer = t.MatCustomer, - CreateUser = request.UserName - }; - await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync(); - }).ToList(); - - await lockTask; - await Task.WhenAll(matDetailTasks); - - await DbHelp.db.CommitTranAsync(); - return new ResponseCommon() - { - Code = 200, - Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}", - Data = order.Id - }; - #endregion } - catch (Exception ex) + //盟讯公司逻辑 不锁库存 直接保存数据/清除未发送的 + else { - await DbHelp.db.RollbackTranAsync(); - return new ResponseBase() + try { - Code = 201, - Message = $"出库单据同步失败:{ex.Message}" - }; + DbHelp.db.BeginTran(); + //1. 获取库存物料明细 + var inventoryDetails = await DbHelp.db.Queryable() + .Where(t => request.SnList.Contains(t.MatSN)) + .ToListAsync(); + if (inventoryDetails == null || inventoryDetails.Count == 0) + { + return new ResponseCommon() + { + Code = 201, + Message = "保存出库单失败!请重试!", + Data = request.SnList + }; + } + //2. 先获取对应单号是否已经保存 + var outOrder = DbHelp.db.Queryable() + .Where(t => t.OrderNumber == request.OrderNumber) + .Where(t => t.GroupName == LocalFile.Config.GroupName) + .First(); + //数据库中没有才添加 + if (outOrder == null) + { + //OutOrder + outOrder = new OutOrder() + { + OrderNumber = request.OrderNumber, + OutOrderExeStatus = OutOrderExeStatus.开始发料, + OrderSource = "WCS前端", + SyncType = SyncTypeEnum.ByMatSn, + ShelfTypeName = "智能货架", + ShelfTypeId = 0, + GroupName = LocalFile.Config.GroupName, + }; + outOrder.Id = await DbHelp.db.Insertable(outOrder).ExecuteReturnIdentityAsync(); + outOrder = await DbHelp.db.Queryable().Where(t => t.OrderNumber == request.OrderNumber) + .Where(t => t.Id == outOrder.Id) + .FirstAsync(); + //保存单据失败了 + if (outOrder == null) + return new ResponseCommon() + { + Code = 201, + Message = "保存出库单失败!保存Order失败!", + Data = request.SnList + }; + + //出库物料明细 + foreach (var item in inventoryDetails) + { + var orderMatDetail = new OutOrderMatDetail() + { + OrderId = outOrder.Id, + OrderNumber = outOrder.OrderNumber, + InventoryDetailId = item.Id, + StoreId = item.StoreId, + StoreCode = item.StoreCode, + MatSN = item.MatSN, + MatCode = item.MatCode, + MatName = item.MatName, + MatSpec = item.MatSpec, + MatBatch = item.MatBatch, + MatQty = item.MatQty, + MatSupplier = item.MatSupplier, + MatCustomer = item.MatCustomer, + CreateUser = request.UserName + }; + await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync(); + } + DbHelp.db.CommitTran(); + } + //数据库已有该Order + else + { + outOrder.CreateTime = DateTime.Now; + DbHelp.db.Updateable(outOrder).ExecuteCommand(); + //删除未出库的 + var outOrderDetails = DbHelp.db.Deleteable() + .Where(t => t.OrderId == outOrder.Id) + .Where(t => t.IsSended == false) + .ExecuteCommand(); + //当前已出库的 //已出库的也不在库存中了 应该查询不到了 + //避免影响效率 就不查重了 + foreach (var item in inventoryDetails) + { + var orderMatDetail = new OutOrderMatDetail() + { + OrderId = outOrder.Id, + OrderNumber = outOrder.OrderNumber, + InventoryDetailId = item.Id, + StoreId = item.StoreId, + StoreCode = item.StoreCode, + MatSN = item.MatSN, + MatCode = item.MatCode, + MatName = item.MatName, + MatSpec = item.MatSpec, + MatBatch = item.MatBatch, + MatQty = item.MatQty, + MatSupplier = item.MatSupplier, + MatCustomer = item.MatCustomer, + CreateUser = request.UserName + }; + await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync(); + } + DbHelp.db.CommitTran(); + + //更新订单状态 + Task.Run(() => + { + if (outOrder != null) + { + #region 物料明细表是否已发完 + var orderMatDetails = DbHelp.db.Queryable() + .Where(t => t.OrderId == outOrder.Id) + .ToList(); + var isExistNoSendMat = orderMatDetails.Where(t => t.IsSended == false) + .Any(); + if (isExistNoSendMat) + { + outOrder.OrderStatus = OutOrderStatus.部分发料; + } + else + { + outOrder.OrderStatus = OutOrderStatus.全部发料; + outOrder.OutOrderExeStatus = OutOrderExeStatus.发料完成; + } + #endregion + DbHelp.db.Updateable(outOrder).ExecuteCommand(); + } + }); + } + return new ResponseCommon() + { + Code = 200, + Message = $"Success", + Data = request.SnList + }; + + } + catch (Exception ex) + { + DbHelp.db.RollbackTran(); + Logs.Write($"同步出库单据发生异常{ex.Message}", LogsType.Info); + return new ResponseCommon() + { + Code = 201, + Message = $"保存出库单失败!{ex.Message}!", + Data = request.SnList + }; + } + } } @@ -887,7 +1047,7 @@ namespace WCS.BLL.Services.Service t.GoOutOutstore(); }); - + return new ResponseCommon() { diff --git a/WCS.BLL/Services/Service/StockTakingService.cs b/WCS.BLL/Services/Service/StockTakingService.cs index c71eb2b..4d47e00 100644 --- a/WCS.BLL/Services/Service/StockTakingService.cs +++ b/WCS.BLL/Services/Service/StockTakingService.cs @@ -941,6 +941,12 @@ namespace WCS.BLL.Services.Service StoreCode = inventoryDetail.StoreCode, StoreId = inventoryDetail.StoreId, + R = inventoryDetail.R, + C = inventoryDetail.C, + Wei = inventoryDetail.Wei, + BigShelfCode = inventoryDetail.BigShelfCode, + GroupName = inventoryDetail.GroupName, + MatSN = inventoryDetail.MatSN, MatCode = inventoryDetail.MatCode, MatName = inventoryDetail.MatName, diff --git a/WCS.BLL/Services/Service/StoreInfoService.cs b/WCS.BLL/Services/Service/StoreInfoService.cs index aef3f20..a05038e 100644 --- a/WCS.BLL/Services/Service/StoreInfoService.cs +++ b/WCS.BLL/Services/Service/StoreInfoService.cs @@ -5,7 +5,9 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using TouchSocket.Core; +using WCS.BLL.Config; using WCS.BLL.DbModels; +using WCS.BLL.Manager; using WCS.BLL.Services.IService; using WCS.DAL; using WCS.DAL.Db; @@ -107,7 +109,7 @@ namespace WCS.BLL.Services.Service shelfnfo.ClientIp = request.ShelfInfo.ClientIp; shelfnfo.GroupName = request.ShelfInfo.GroupName; shelfnfo.IsBind = request.ShelfInfo.IsBind; - shelfnfo.BindShelfCode = request.ShelfInfo.BindShelfCode; + shelfnfo.BigShelfCode = request.ShelfInfo.BigShelfCode; var rowNum = await DbHelp.db.Updateable(shelfnfo).ExecuteCommandAsync(); if (rowNum == 0) @@ -154,7 +156,7 @@ namespace WCS.BLL.Services.Service ClientIp = request.ShelfInfo.ClientIp, GroupName = request.ShelfInfo.GroupName, IsBind = request.ShelfInfo.IsBind, - BindShelfCode = request.ShelfInfo.BindShelfCode, + BigShelfCode = request.ShelfInfo.BigShelfCode, }; var rowNum = await DbHelp.db.Insertable(newShelfInfo).ExecuteCommandAsync(); if (rowNum == 0) @@ -243,29 +245,36 @@ namespace WCS.BLL.Services.Service /// public async Task> GenerateStoreInfo() { - var shelfInfo = await DbHelp.db.Queryable().Where(t => t.ShelfCode == "C04-1").FirstAsync(); - var ModuleInfos = await DbHelp.db.Queryable().Where(t => t.ShelfId == shelfInfo.Id).ToListAsync(); - ModuleInfos.ForEach(moduleInfo => + var shelfInfos = DbHelp.db.Queryable().ToList(); + foreach (var shelfInfo in shelfInfos) { - for (int i = 1; i <= moduleInfo.LightCount; i++) + var ModuleInfos = await DbHelp.db.Queryable().Where(t => t.ShelfId == shelfInfo.Id).ToListAsync(); + ModuleInfos.ForEach(moduleInfo => { - var storeInfo = new StoreInfo() + for (int i = 1; i <= moduleInfo.LightCount; i++) { - StoreCode = moduleInfo.ModuleCode + "-" + i.ToString(), - ModuleId = moduleInfo.Id, - ModuleCode = moduleInfo.ModuleCode, - ShelfId = shelfInfo.Id, - ShelfCode = shelfInfo.ShelfCode, - BoardId = moduleInfo.BoardId, - LightNumber = i, - Priority = 1, - CurrentMatSn = string.Empty, - }; - DbHelp.db.Insertable(storeInfo).ExecuteCommand(); - - } - }); - + var storeInfo = new StoreInfo() + { + StoreCode = moduleInfo.ModuleCode + "-" + i.ToString(), + ShelfTypeId = 1, + ModuleId = moduleInfo.Id, + ModuleCode = moduleInfo.ModuleCode, + ShelfId = shelfInfo.Id, + ShelfCode = shelfInfo.ShelfCode, + BoardId = moduleInfo.BoardId, + LightNumber = i, + Priority = 1, + CurrentMatSn = string.Empty, + BigShelfCode = moduleInfo.Bigshelfcode, + R = moduleInfo.R, + C = moduleInfo.C, + Wei = i.ToString(), + GroupName = moduleInfo.GroupName, + }; + DbHelp.db.Insertable(storeInfo).ExecuteCommand(); + } + }); + } return new ResponseCommon() { Message = "111" }; } @@ -333,11 +342,16 @@ namespace WCS.BLL.Services.Service try { DbHelp.db.BeginTran(); - //禁用需要删除当前库存数据 + //禁用 if (request.DisableOrEnable == DisableOrEnableEnum.Disable) { moduleInfo.IsEnable = false; - + //盟讯公司发送钉钉消息 + if (LocalFile.Config.IsMx) + { + var DingDing = string.Empty; + MXBackgroundThread.SendDingDingMsg($"【智能货架】模组{moduleInfo.ModuleCode}被屏蔽", new List { "104379", "103595" }, ref DingDing); + } } else { @@ -444,6 +458,12 @@ namespace WCS.BLL.Services.Service StoreId = storeInfo.Id, StoreInfo = storeInfo, + R = storeInfo.R, + C = storeInfo.C, + Wei = storeInfo.Wei, + BigShelfCode = storeInfo.BigShelfCode, + GroupName = storeInfo.GroupName, + MatSN = inventory.MatSN, MatCode = inventory.MatCode, MatName = inventory.MatName, diff --git a/WCS.BLL/Services/Service/WarningService.cs b/WCS.BLL/Services/Service/WarningService.cs index 4fcd5ce..78844cd 100644 --- a/WCS.BLL/Services/Service/WarningService.cs +++ b/WCS.BLL/Services/Service/WarningService.cs @@ -26,6 +26,7 @@ namespace WCS.BLL.Services.Service .FirstOrDefault(); if (warning != null) { + warning.SolvedUser = request.UserName; WarningManager.ClearWarning(warning, request.SolveType); } //判断一下是否还存在对应报警 diff --git a/WCS.BLL/Tool/Api/ApiHelp.cs b/WCS.BLL/Tool/Api/ApiHelp.cs index 98fffcf..ae463ec 100644 --- a/WCS.BLL/Tool/Api/ApiHelp.cs +++ b/WCS.BLL/Tool/Api/ApiHelp.cs @@ -274,7 +274,7 @@ namespace WCS.BLL.Tool public static T GetDataFromHttp(string url, object dataObj, string httpMethod, bool isSaveLog = false) { Guid guid = Guid.NewGuid(); - var data = JsonConvert.SerializeObject(dataObj); + var data = dataObj == null ? string.Empty : JsonConvert.SerializeObject(dataObj); try { if (isSaveLog) diff --git a/WCS.DAL/Db/AuthDb/AuthDbHelp.cs b/WCS.DAL/Db/AuthDb/AuthDbHelp.cs index bacaadb..8981d8b 100644 --- a/WCS.DAL/Db/AuthDb/AuthDbHelp.cs +++ b/WCS.DAL/Db/AuthDb/AuthDbHelp.cs @@ -49,7 +49,7 @@ namespace WCS.DAL { Id = 1, LoginName = "admin", - Password = "", + Password = "admin123", RoleIds = new List () { 1 }, IsAdmin = true, Time = dt, diff --git a/WCS.DAL/Db/AuthDb/AuthModels.cs b/WCS.DAL/Db/AuthDb/AuthModels.cs index 813a026..1780d79 100644 --- a/WCS.DAL/Db/AuthDb/AuthModels.cs +++ b/WCS.DAL/Db/AuthDb/AuthModels.cs @@ -10,7 +10,7 @@ namespace WCS.DAL.Db.AuthDb /// /// 用户 /// - [SugarTable("User")] + [SugarTable("wcs_user")] public class UserBase { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] @@ -37,6 +37,13 @@ namespace WCS.DAL.Db.AuthDb /// 是否最大权限 /// public bool IsAdmin { get; set; } + + ///// + ///// 是否是工程研发 + ///// + //[SugarColumn(ColumnName = "IsGCYF", IsNullable = true, ColumnDescription = "是否是工程研发人员")] + public bool IsGCYF { get; set; } = false; + /// /// 创建时间 /// @@ -52,7 +59,7 @@ namespace WCS.DAL.Db.AuthDb /// /// 角色 /// - [SugarTable("Role")] + [SugarTable("wcs_role")] public class RoleBase { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] diff --git a/WCS.DAL/Db/DbHelp.cs b/WCS.DAL/Db/DbHelp.cs index d8a842f..180b104 100644 --- a/WCS.DAL/Db/DbHelp.cs +++ b/WCS.DAL/Db/DbHelp.cs @@ -1,6 +1,7 @@ using SqlSugar; using System; using System.Collections.Generic; +using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -21,11 +22,8 @@ namespace WCS.DAL.Db { db.Aop.OnError = ex => { - //TO DO LOG - //Logs.Write($@"{nameof(db)}{Environment.NewLine}SQL:{ex?.Sql}{Environment.NewLine}Parametres:{JsonConvert.SerializeObject(ex?.Parametres)}{Environment.NewLine}InnerException:{ex?.InnerException?.ToString()}{Environment.NewLine}Exception:{ex?.ToString()}{Environment.NewLine}", LogsType.DbErr); }; }); - /// /// 日志数据库 /// @@ -38,23 +36,7 @@ namespace WCS.DAL.Db { db.Aop.OnError = ex => { - //TO DO LOG - //Logs.Write($@"{nameof(dbAuth)}{Environment.NewLine}SQL:{ex?.Sql}{Environment.NewLine}Parametres:{JsonConvert.SerializeObject(ex?.Parametres)}{Environment.NewLine}InnerException:{ex?.InnerException?.ToString()}{Environment.NewLine}Exception:{ex?.ToString()}{Environment.NewLine}", LogsType.DbErr); }; }); - - public static void InitDb() - { - //#region 初始化业务数据库 - ////不存在创建数据库,存在不会创建 - //db.DbMaintenance.CreateDatabase(); - ////创建表根据实体类 - //db.CodeFirst.InitTables(typeof(ModuleInfo), typeof(ShelfInfo), typeof(StoreInfo)); - //#endregion - - //#region 初始化日志数据库 - //dbLog.DbMaintenance.CreateDatabase(); - //#endregion - } } } diff --git a/WCS.Model/ApiModel/MXBackgroundThread/ApiResult.cs b/WCS.Model/ApiModel/MXBackgroundThread/ApiResult.cs new file mode 100644 index 0000000..ab61a70 --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/ApiResult.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class ApiResult + { + /// + /// 处理结果 200成功 + /// + public int code { get; set; } + /// + /// 处理消息 + /// + public string message { get; set; } + + } + + public class ApiResult : ApiResult + { + + /// + /// 数据 + /// + public T data { get; set; } + } + + + public class ApiResultMsg + { + /// + /// 处理结果 200成功 + /// + public int code { get; set; } + /// + /// 处理消息 + /// + public string msg { get; set; } + + } + + public class ApiResultMsg : ApiResultMsg + { + + /// + /// 数据 + /// + public T data { get; set; } + } +} diff --git a/WCS.Model/ApiModel/MXBackgroundThread/BunkerOutRequest.cs b/WCS.Model/ApiModel/MXBackgroundThread/BunkerOutRequest.cs new file mode 100644 index 0000000..96c75a3 --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/BunkerOutRequest.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class BunkerOutRequest + { + public string materialBar { get; set; } + /// + /// + /// + public int outType { get; set; } = 0; + /// + /// + /// + public string pickBillNumber { get; set; } + /// + /// + /// + public int qty { get; set; } = 0; + /// + /// + /// + public int warehouseType { get; set; } = 20; + } +} diff --git a/WCS.Model/ApiModel/MXBackgroundThread/InputStockInRequest.cs b/WCS.Model/ApiModel/MXBackgroundThread/InputStockInRequest.cs new file mode 100644 index 0000000..daa5a0f --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/InputStockInRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class InputStockInRequest + { + public string materialBar { get; set; } + + public string shelfCode { get; set; } + + public string shelfX { get; set; } + + public string shelfY { get; set; } + + public string shelfZ { get; set; } + + public string inUser { get; set; } = string.Empty; + + public string inTime { get; set; } + + public int warehouseType { get; set; } = 20; + } +} diff --git a/WCS.Model/ApiModel/MXBackgroundThread/MXMesResponseCommon.cs b/WCS.Model/ApiModel/MXBackgroundThread/MXMesResponseCommon.cs new file mode 100644 index 0000000..c600841 --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/MXMesResponseCommon.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class MXMesResponseCommon + { + public int code { get; set; } + public string message { get; set; } + public string msg { get; set; } + public object data { get; set; } + } +} diff --git a/WCS.Model/ApiModel/MXBackgroundThread/PickOrderRequest.cs b/WCS.Model/ApiModel/MXBackgroundThread/PickOrderRequest.cs new file mode 100644 index 0000000..de230df --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/PickOrderRequest.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class PickOrderRequest + { + public string orderProdNumber { get; set; } + public string orderWorkNumber { get; set; } + public string pickBillNumber { get; set; } + } + + public class PickOrderResponse + { + /// + /// + /// + public int code { get; set; } + /// + /// + /// + public string msg { get; set; } + /// + /// + /// + public List data { get; set; } + } + public class PickOrder + { + public bool IsSelected { get; set; } + public int id { get; set; } + public string pickBillNumber { get; set; } + public string relationPickNumber { get; set; } + public string orderProdIds { get; set; } + public string orderProdNumbers { get; set; } + public string orderWorkIds { get; set; } + public string orderWorkNumbers { get; set; } + public string dictType { get; set; } + public string dictTypeStr + { + get + { + switch (dictType) + { + case "1": + return "生产领料"; + default: return "其他"; + } + } + } + public string dictStatus { get; set; } + public string dictStatusStr + { + get + { + switch (dictStatus) + { + case "15": + return "待领料"; + case "10": + return "部分领料"; + default: return dictStatus.ToString(); + } + } + } + public string createdBy { get; set; } + public string createdDt { get; set; } + public string updatedBy { get; set; } + public string updatedDt { get; set; } + } +} diff --git a/WCS.Model/ApiModel/MXBackgroundThread/QueryByBar.cs b/WCS.Model/ApiModel/MXBackgroundThread/QueryByBar.cs new file mode 100644 index 0000000..1a8ba81 --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/QueryByBar.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class QueryBybarRequest + { + //条码 + public string materialBar { get; set; } + } + + public class InStoreDto + { + public string materialBar { get; set; } + /// + /// + /// + public string materialCode { get; set; } + /// + /// 有源蜂鸣器 + /// + public string materialName { get; set; } + /// + /// TMB09A03/5X9电压3V + /// + public string materialSpec { get; set; } + + public double materialQty { get; set; } + + public string batchNo { get; set; } + } + + public class QueryBybarResponse + { + /// + /// + /// + public int code { get; set; } + /// + /// + /// + public string message { get; set; } + /// + /// + /// + public List data { get; set; } + } +} diff --git a/WCS.Model/ApiModel/MXBackgroundThread/RecommendedBarCodeRequest.cs b/WCS.Model/ApiModel/MXBackgroundThread/RecommendedBarCodeRequest.cs new file mode 100644 index 0000000..d5e9d58 --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/RecommendedBarCodeRequest.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class RecommendedBarCodeRequest + { + public string pickBillNumber { get; set; } + public string warehouseCode { get; set; } = string.Empty; + public int warehouseType { get; set; } = 10; + + } + + public class FistPushRecommendedBarCodeRequest : RecommendedBarCodeRequest + { + public string reportSide { get; set; } = null; + } + + public class RecommendedBarCodeResponse + { + /// + /// + /// + public int code { get; set; } + /// + /// + /// + public string message { get; set; } + /// + /// + /// + public List data { get; set; } + } + + public class PickOrderDetailGetReturnList + { + public bool IsInstore { get; set; } + public int id { get; set; } + public string materialBar { get; set; } + public string materialId { get; set; } + public string materialCode { get; set; } + public string materialName { get; set; } + public string materialSpec { get; set; } + public string unitOfMeasure { get; set; } + public string batchNo { get; set; } + public double qty { get; set; } + public string warehouseId { get; set; } + public string warehouseCode { get; set; } + public string warehouseName { get; set; } + public string shelfCode { get; set; } + public string shelfX { get; set; } + public string shelfY { get; set; } + public string shelfZ { get; set; } + public string inUser { get; set; } + public string inTime { get; set; } + public string outUser { get; set; } + public string outTime { get; set; } + public string createdBy { get; set; } + public string createdDt { get; set; } + public string updatedBy { get; set; } + public string updatedDt { get; set; } + } +} diff --git a/WCS.Model/ApiModel/MXBackgroundThread/SelectMaterialBarDto.cs b/WCS.Model/ApiModel/MXBackgroundThread/SelectMaterialBarDto.cs new file mode 100644 index 0000000..2cb6edf --- /dev/null +++ b/WCS.Model/ApiModel/MXBackgroundThread/SelectMaterialBarDto.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MXBackgroundThread +{ + public class SelectMaterialBarDto + { + public string materialBar { get; set; } + + public string warehouseCode { get; set; } + + public string warehouseName { get; set; } + } + + public class SelectMaterialBarResponse + { + /// + /// + /// + public int code { get; set; } + /// + /// + /// + public string msg { get; set; } + /// + /// + /// + public SelectMaterialBarDto data { get; set; } + } +} diff --git a/WCS.Model/ApiModel/MatInventoryDetail/CompareMatInventoryDetailRequest.cs b/WCS.Model/ApiModel/MatInventoryDetail/CompareMatInventoryDetailRequest.cs new file mode 100644 index 0000000..01cca12 --- /dev/null +++ b/WCS.Model/ApiModel/MatInventoryDetail/CompareMatInventoryDetailRequest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.MatInventoryDetail +{ + public class CompareMatInventoryDetailRequest : RequestBase + { + public List MatSns { get; set; } + + public string GroupName { get; set; } + + } +} diff --git a/WCS.Model/ApiModel/StoreInfo/ModuleInfoModel.cs b/WCS.Model/ApiModel/StoreInfo/ModuleInfoModel.cs index 1213eb9..4cff369 100644 --- a/WCS.Model/ApiModel/StoreInfo/ModuleInfoModel.cs +++ b/WCS.Model/ApiModel/StoreInfo/ModuleInfoModel.cs @@ -24,7 +24,7 @@ namespace WCS.Model.ApiModel.StoreInfo public string C { get; set; } - public string? Bigshelfcode { get; set; } + public string? BigShelfCode { get; set; } public bool IsEnable { get; set; } diff --git a/WCS.Model/ApiModel/StoreInfo/ShelfInfoModel.cs b/WCS.Model/ApiModel/StoreInfo/ShelfInfoModel.cs index eb2a6af..feb3e4f 100644 --- a/WCS.Model/ApiModel/StoreInfo/ShelfInfoModel.cs +++ b/WCS.Model/ApiModel/StoreInfo/ShelfInfoModel.cs @@ -49,7 +49,7 @@ namespace WCS.Model.ApiModel.StoreInfo public bool IsBind { get; set; } - public string BindShelfCode { get; set; } = string.Empty; + public string BigShelfCode { get; set; } public int RowNumber { get; set; } diff --git a/WCS.Model/WebSocketModel/SolveWarningRequesr.cs b/WCS.Model/WebSocketModel/SolveWarningRequesr.cs index 94a718d..7b97545 100644 --- a/WCS.Model/WebSocketModel/SolveWarningRequesr.cs +++ b/WCS.Model/WebSocketModel/SolveWarningRequesr.cs @@ -4,7 +4,7 @@ using System.Text; namespace WCS.Model.WebSocketModel { - public class SolveWarningRequest + public class SolveWarningRequest : RequestBase { public Guid Guid { get; set; } public SolveTypeEnum SolveType { get; set; } diff --git a/WCS.Model/WebSocketModel/WebSocketMessageModel.cs b/WCS.Model/WebSocketModel/WebSocketMessageModel.cs index 40e4f7f..4838fcf 100644 --- a/WCS.Model/WebSocketModel/WebSocketMessageModel.cs +++ b/WCS.Model/WebSocketModel/WebSocketMessageModel.cs @@ -25,6 +25,12 @@ namespace WCS.Model.WebSocketModel //恢复正常需要消除的报警guid public List SolvedGuids { get; set; } + + + /// + /// 异常处理人 + /// + public string SolvedUser { get; set; } } public enum WarningTypeEnum diff --git a/WCS.WebApi/Controllers/FileDownLoadController.cs b/WCS.WebApi/Controllers/FileDownLoadController.cs index 028b6be..83bfd85 100644 --- a/WCS.WebApi/Controllers/FileDownLoadController.cs +++ b/WCS.WebApi/Controllers/FileDownLoadController.cs @@ -44,7 +44,7 @@ namespace WCS.WebApi.Controllers [HttpGet("getLatestAppName")] public ResponseCommon getLatestAppName() { - string directoryPath = Path.Combine(Directory.GetCurrentDirectory(), $"Files"); + string directoryPath = Path.Combine(AppContext.BaseDirectory, $"Files"); // 获取目录下的所有文件信息 FileInfo[] files = Directory.GetFiles(directoryPath, "*.APK") diff --git a/WCS.WebApi/Controllers/MatInventoryDetailController.cs b/WCS.WebApi/Controllers/MatInventoryDetailController.cs index b0e75e3..ad52277 100644 --- a/WCS.WebApi/Controllers/MatInventoryDetailController.cs +++ b/WCS.WebApi/Controllers/MatInventoryDetailController.cs @@ -86,5 +86,13 @@ namespace WCS.WebApi.Controllers { return await _matInventoryDetailService.getMatInventorySummary(request); } + + [Route("compareMatInventoryDetail")] + [HttpPost(Name = "compareMatInventoryDetail")] + public async Task compareMatInventoryDetail(CompareMatInventoryDetailRequest request) + { + return await _matInventoryDetailService.compareMatInventoryDetail(request); + } + } } diff --git a/WCS.WebApi/Program.cs b/WCS.WebApi/Program.cs index a9af159..61af649 100644 --- a/WCS.WebApi/Program.cs +++ b/WCS.WebApi/Program.cs @@ -20,60 +20,76 @@ namespace WebApi { public static void Main(string[] args) { - //ʼwebsocket - WebSoceketManager.InitWebSocket(); - - //ʼݿ - DbInit.InitDb(); - - //ʼļ - LocalFile.SaveConfig(); - - //ʼTCP - TCPClientManager.InitTcpClient(); - - //ʼ - ShelfManager.InitShelves(); - - - WarningManager.StartWarningMessageThread(); - - var builder = WebApplication.CreateBuilder(args); - - // Add services to the container. - builder.Services.AddControllers(); - // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle - builder.Services.AddEndpointsApiExplorer(); - builder.Services.AddSwaggerGen(); - - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - //롢ɵõģʽ - builder.Services.AddSingleton(); - - var app = builder.Build(); - - app.UseMiddleware(); - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) + try { - app.UseSwagger(); - app.UseSwaggerUI(); - } + //ʼwebsocket + WebSoceketManager.InitWebSocket(); - app.UseAuthorization(); - app.MapControllers(); - app.Run("http://0.0.0.0:8888");//0.0.0.0ʾipv4 + //ʼݿ + DbInit.InitDb(); + + //ʼļ + LocalFile.SaveConfig(); + + //ʼTCP + TCPClientManager.InitTcpClient(); + + //ʼܻϢ + ShelfManager.InitShelves(); + + //Ϣط߳ + WarningManager.StartWarningMessageThread(); + + //Ѷ˾̨߳ + if (LocalFile.Config.IsMx) + { + MXBackgroundThread.InitBackgroundThread(); + var str = string.Empty; + //MXBackgroundThread.SendDingDingMsg("ɹ", new List { "104379" }, ref str); + } + + + + var builder = WebApplication.CreateBuilder(args); + // Add services to the container. + builder.Services.AddControllers(); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(); + + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + //롢ɵõģʽ + builder.Services.AddSingleton(); + + var app = builder.Build(); + + app.UseMiddleware(); + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } + + app.UseAuthorization(); + app.MapControllers(); + app.Run("http://0.0.0.0:8888");//0.0.0.0ʾipv4 + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } } } } diff --git a/WCS.WebApi/Properties/PublishProfiles/FolderProfile1.pubxml b/WCS.WebApi/Properties/PublishProfiles/FolderProfile1.pubxml index 36847ea..f5f22fe 100644 --- a/WCS.WebApi/Properties/PublishProfiles/FolderProfile1.pubxml +++ b/WCS.WebApi/Properties/PublishProfiles/FolderProfile1.pubxml @@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. --> - false + true false true Release @@ -13,5 +13,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121. bin\Release\net6.0\publish\ FileSystem <_TargetId>Folder + + net6.0 + linux-x64 + 118d453b-1693-4c00-8378-20ecbfcf2700 + false + false \ No newline at end of file diff --git a/货架标准上位机/Api/ApiHelp.cs b/货架标准上位机/Api/ApiHelp.cs index 99822fc..4abe7dd 100644 --- a/货架标准上位机/Api/ApiHelp.cs +++ b/货架标准上位机/Api/ApiHelp.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Input; using WCS.Model; +using WCS.Model.ApiModel.MXBackgroundThread; namespace 货架标准上位机.Api { @@ -320,5 +321,100 @@ namespace 货架标准上位机.Api return default(T); } } + + /// + /// 调用接口-长延时(MX MES接口返回时间偶尔10秒+为保证业务能正常进行所以增加此接口) + /// + /// + /// + /// + /// + /// + /// + public static ApiResult MXGetDataFromHttpLongWait(string data, string url, string httpMethod, bool isSaveLog = false) + { + Guid guid = Guid.NewGuid(); + try + { + if (isSaveLog) + Logs.Write($"【{guid}】开始请求调用接口 url:{url} 请求方式:{httpMethod} 数据:{data}"); + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = httpMethod; + request.ContentType = "application/json"; + request.Timeout = 20000; + if (!string.IsNullOrEmpty(data)) + { + string strContent = data; //参数data + using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream())) + { + dataStream.Write(strContent); + dataStream.Close(); + } + } + + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + string encoding = response.ContentEncoding; + if (encoding == null || encoding.Length < 1) + { + encoding = "UTF-8"; //默认编码 + } + StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding)); + string retString = reader.ReadToEnd(); + if (isSaveLog) + Logs.Write($"【{guid}】请求调用接口结束 返回数据为{retString}"); + return JsonConvert.DeserializeObject>(retString); + } + catch (Exception ex) + { + Logs.Write($"【{guid}】请求调用遇到异常 异常信息为{ex.Message}"); + return new ApiResult() + { + code = 500, + message = ex.Message, + }; + } + } + public static ApiResult MXGetDataFromHttp(string data, string url, string httpMethod, bool isSaveLog = false) + { + Guid guid = Guid.NewGuid(); + try + { + if (isSaveLog) + Logs.Write($"【{guid}】开始请求调用接口 url:{url} 请求方式:{httpMethod} 数据:{data}"); + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = httpMethod; + request.ContentType = "application/json"; + request.Timeout = 8000; + if (!string.IsNullOrEmpty(data)) + { + string strContent = data; //参数data + using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream())) + { + dataStream.Write(strContent); + dataStream.Close(); + } + } + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + string encoding = response.ContentEncoding; + if (encoding == null || encoding.Length < 1) + { + encoding = "UTF-8"; //默认编码 + } + StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding)); + string retString = reader.ReadToEnd(); + if (isSaveLog) + Logs.Write($"【{guid}】请求调用接口结束 返回数据为{retString}"); + return JsonConvert.DeserializeObject>(retString); + } + catch (Exception ex) + { + Logs.Write($"【{guid}】请求调用遇到异常 异常信息为{ex.Message}"); + return new ApiResult() + { + code = 500, + message = ex.Message, + }; + } + } } } diff --git a/货架标准上位机/App.xaml b/货架标准上位机/App.xaml index 1640844..feac15d 100644 --- a/货架标准上位机/App.xaml +++ b/货架标准上位机/App.xaml @@ -2,7 +2,6 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:货架标准上位机" - StartupUri="Views/MainWindows/MainWindow1.xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:hc="https://handyorg.github.io/handycontrol"> diff --git a/货架标准上位机/App.xaml.cs b/货架标准上位机/App.xaml.cs index e7a4e99..02490c8 100644 --- a/货架标准上位机/App.xaml.cs +++ b/货架标准上位机/App.xaml.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; +using System.Management.Instrumentation; using System.Threading.Tasks; using System.Windows; +using System.Windows.Controls; namespace 货架标准上位机 { @@ -13,5 +15,20 @@ namespace 货架标准上位机 /// public partial class App : Application { + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + + if (LocalFile.Config.IsMx) + { + MainWindow = new MXMainWindow(); + } + else + { + MainWindow = new MainWindow1(); + } + MainWindow.ShowDialog(); + + } } } diff --git a/货架标准上位机/Models/JsConfig.cs b/货架标准上位机/Models/JsConfig.cs index 95206fb..e13e763 100644 --- a/货架标准上位机/Models/JsConfig.cs +++ b/货架标准上位机/Models/JsConfig.cs @@ -45,6 +45,26 @@ namespace 货架标准上位机 /// 串口扫码枪延时 /// public int ScannerTimeOut { get; set; } + + #region 盟讯公司配置 + public bool IsMx { get; set; } + /// + ///MX-获取要料单接口地址 + /// + public string GetPickOrderUrl { get; set; } + /// + ///MX-获取要料明细接口地址 + /// + public string RecommendedBarCode { get; set; } + /// + ///MX-首盘发料明细接口地址 + /// + public string FirstSendRecommendedBarCode { get; set; } + /// + ///MX-后续发料明细接口地址 + /// + public string ElectronicSiloPush { get; set; } + #endregion } public class JsSysConfig diff --git a/货架标准上位机/Resources/扫码枪结束入库二维码.png b/货架标准上位机/Resources/goOutInstore.png similarity index 100% rename from 货架标准上位机/Resources/扫码枪结束入库二维码.png rename to 货架标准上位机/Resources/goOutInstore.png diff --git a/货架标准上位机/ViewModels/MXViewModel/MXOutInventoryViewModel.cs b/货架标准上位机/ViewModels/MXViewModel/MXOutInventoryViewModel.cs new file mode 100644 index 0000000..c343196 --- /dev/null +++ b/货架标准上位机/ViewModels/MXViewModel/MXOutInventoryViewModel.cs @@ -0,0 +1,305 @@ +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 MXOutInventoryViewModel : BindableBase + { + public MXOutInventoryViewModel() + { + RefreshOutOrderList(); + } + + #region Property + private OutOrderModel selectedOutOrder; + public OutOrderModel SelectedOutOrder + { + get { return selectedOutOrder; } + set + { + SetProperty(ref selectedOutOrder, value); + if (selectedOutOrder != null) + { + SelectedOutOrderNumber = selectedOutOrder.OrderNumber; + 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.IsSended).Count(); + TotalPan = dataGridItemSource.Count(); + }); + } + #endregion + + #region Command + public ICommand BtnOutOrderCommand { get => new DelegateCommand(BtnOutOrder); } + public void BtnOutOrder() + { + var window = new MXOutOrderView(); + window.Owner = Application.Current.MainWindow; + window.ShowDialog(); + } + + + public ICommand BtnStartCommand { get => new DelegateCommand(BtnStart); } + public void BtnStart() + { + try + { + //判断是否选择单据 + if (SelectedOutOrder == null) + { + Growl.Warning("未选择单据!"); + return; + } + + #region 调用接口开始出库 + var body = new GetOutOrderDetailRequest() + { + OrderId = selectedOutOrder.Id, + OrderNumber = selectedOutOrder.OrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outStore/goInOutstore", 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 GetOutOrderDetailRequest() + { + OrderId = selectedOutOrder.Id, + OrderNumber = selectedOutOrder.OrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + }; + var Result = ApiHelp.GetDataFromHttp(LocalFile.Config.ApiIpHost + "outStore/goOutOutstore", 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 RefreshOutOrderList(string OrderNumber = "") + { + #region 调用接口获取发料单 + try + { + var body = new GetOutOrderListByStatusRequest() + { + OrderExeStatus = new List() { OutOrderExeStatus.开始发料, OutOrderExeStatus.发料完成 } + }; + var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "outstore/getOutOrderListByStatus", body, "POST"); + if (Result != null && Result.Code == 200) + { + OutOrderList = new ObservableCollection(Result.Data.Lists); + if (!string.IsNullOrEmpty(OrderNumber)) + { + SelectedOutOrder = OutOrderList.Where(t => t.OrderNumber == 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 GetOutOrderDetailRequest() + { + OrderId = selectedOutOrder.Id, + OrderNumber = selectedOutOrder.OrderNumber, + UserName = LocalStatic.CurrentUser, + DeviceType = LocalFile.Config.DeviceType, + + }; + var Result = ApiHelp.GetDataFromHttp>>(LocalFile.Config.ApiIpHost + "outStore/getOutOrderMatDetail", body, "POST"); + if (Result != null && Result.Code == 200) + { + if (Result.Data.Count > 0) + { + DataGridItemSource = new ObservableCollection(Result.Data); + OrderStatus = Result.Message; + } + 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/货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs b/货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs new file mode 100644 index 0000000..c32319a --- /dev/null +++ b/货架标准上位机/ViewModels/MXViewModel/MXOutOrderDetailViewViewModel.cs @@ -0,0 +1,216 @@ +using HandyControl.Controls; +using HandyControl.Data; +using MiniExcelLibs; +using Newtonsoft.Json; +using Ping9719.WpfEx.Mvvm; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Input; +using TouchSocket.Core; +using System.Windows.Markup; +using System.Security.Policy; +using WCS.Model.ApiModel.MXBackgroundThread; +using 货架标准上位机; +using WCS.Model.ApiModel.MatInventoryDetail; +using 货架标准上位机.Api; +using System.Runtime.CompilerServices; +using WCS.Model; + +namespace 货架标准上位机.ViewModel +{ + public class MXOutOrderDetailViewViewModel : BindableBase + { + /// + /// + /// + /// + /// + /// + /// + /// 是否是首盘发料 + public MXOutOrderDetailViewViewModel( + string billNumber, string warehouseCode + , string orderProdNumbers, string orderWorkNumbers + , int isFirstSend = 0, string reportSide = null + ) + { + BillNumber = billNumber; + OrderProdNumbers = orderProdNumbers; + OrderWorkNumbers = orderWorkNumbers; + WarehouseCode = warehouseCode; + + Task.Run(() => + { + var request = new RecommendedBarCodeRequest() + { + pickBillNumber = billNumber, + warehouseCode = warehouseCode, + warehouseType = 20 + }; + var requeststr = JsonConvert.SerializeObject(request); + var url = string.Empty; + if (isFirstSend == 0) + { + url = LocalFile.Config.RecommendedBarCode; + } + else if (isFirstSend == 1) + { + request = new FistPushRecommendedBarCodeRequest() + { + pickBillNumber = billNumber, + warehouseCode = warehouseCode, + warehouseType = 20, + reportSide = reportSide, + }; + requeststr = JsonConvert.SerializeObject(request); + url = LocalFile.Config.FirstSendRecommendedBarCode; + } + //后续料 + else + { + url = LocalFile.Config.ElectronicSiloPush; + } + + var result = ApiHelp.MXGetDataFromHttp>(requeststr, url, "POST", true); + if (result != null && result.code == 200 && result.data != null && result.data.Count() > 0) + { + //获取推荐的条码 + var matSns = result.data.Select(t => t.materialBar).ToList(); + + //调用 比对库存数据 获取库存中有的数据 + #region 调用接口 比对库存数据 获取库存中有的数据 + try + { + var body = new CompareMatInventoryDetailRequest() + { + MatSns = matSns, + }; + var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "matInventoryDetail/compareMatInventoryDetail", body, "POST", true); + + //查询到物料信息 + if (Result != null && Result.Data != null && Result.Data.Lists != null && Result.Data.Lists.Count != 0) + { + DataGridItemSource = Result.Data.Lists; + } + else if (Result != null && Result.Code == 200 && (Result.Data == null || Result.Data.Lists == null || Result.Data.Lists.Count == 0)) + { + MessageBox.Show($"未查询到领料明细!所推荐物料在此货架上不存在,请确认是否在其他货架上!\r\n{string.Join(",\r\n", matSns)}"); + DataGridItemSource = null; + } + else + { + MessageBox.Show($"未查询到领料明细!请重试!"); + DataGridItemSource = null; + } + } + catch (Exception e) + { + MessageBox.Show($"未查询到领料明细!请重试!"); + DataGridItemSource = null; + } + #endregion + } + else if (result != null && result.code == 200 && (result.data == null || result.data.Count == 0)) + { + Growl.Warning("未查询到物料明细!MES推荐物料明细为空!"); + DataGridItemSource = null; + } + else + { + Growl.Warning("未查询到领料明细!请求MES接口失败!"); + DataGridItemSource = null; + } + }); + } + + + #region Property + private int selectedCount; + public int SelectedCount + { + get { return selectedCount; } + set { SetProperty(ref selectedCount, value); } + } + + private int selectedPan; + public int SelectedPan + { + get { return selectedPan; } + set { SetProperty(ref selectedPan, value); } + } + //发料单号 + private string billNumber; + public string BillNumber + { + get { return billNumber; } + set { SetProperty(ref billNumber, value); } + } + + //订单号 + private string orderProdNumbers; + public string OrderProdNumbers + { + get { return orderProdNumbers; } + set { SetProperty(ref orderProdNumbers, value); } + } + + //工单号 + private string orderWorkNumbers; + public string OrderWorkNumbers + { + get { return orderWorkNumbers; } + set { SetProperty(ref orderWorkNumbers, value); } + } + + //输入的仓库代码 + private string warehouseCode; + public string WarehouseCode + { + get { return warehouseCode; } + set + { + SetProperty(ref warehouseCode, value); + } + } + + private List dataGridItemSource; + public List DataGridItemSource + { + get { return dataGridItemSource; } + set + { + SetProperty(ref dataGridItemSource, value); + RefreshCount(); + } + } + + + public void RefreshCount() + { + Task.Run(() => + { + try + { + SelectedCount = dataGridItemSource.Where(t => t.IsSelected == true).Sum(t => t.MatQty); + SelectedPan = dataGridItemSource.Where(t => t.IsSelected == true).Count(); + } + catch { } + + }); + } + + #endregion + + #region Command + + #endregion + } +} diff --git a/货架标准上位机/ViewModels/MXViewModel/MXOutOrderViewModel.cs b/货架标准上位机/ViewModels/MXViewModel/MXOutOrderViewModel.cs new file mode 100644 index 0000000..f592f81 --- /dev/null +++ b/货架标准上位机/ViewModels/MXViewModel/MXOutOrderViewModel.cs @@ -0,0 +1,132 @@ +using HandyControl.Controls; +using HandyControl.Data; +using MiniExcelLibs; +using Ping9719.WpfEx.Mvvm; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Input; +using TouchSocket.Core; +using Newtonsoft.Json; +using WCS.Model.ApiModel.MXBackgroundThread; +using 货架标准上位机.Api; + +namespace 货架标准上位机.ViewModel +{ + public class MXOutOrderViewModel : BindableBase + { + public MXOutOrderViewModel() + { + } + + + #region Property + private string matCode1; + public string MatCode1 + { + get { return matCode1; } + set + { + SetProperty(ref matCode1, value); + } + } + + private string orderProdNumber; + public string OrderProdNumber + { + get { return orderProdNumber; } + set + { + SetProperty(ref orderProdNumber, value); + } + } + + private string orderWorkNumber; + public string OrderWorkNumber + { + get { return orderWorkNumber; } + set + { + SetProperty(ref orderWorkNumber, value); + } + } + + private string pickBillNumber; + public string PickBillNumber + { + get { return pickBillNumber; } + set + { + SetProperty(ref pickBillNumber, value); + } + } + + private string warehouseCode; + public string WarehouseCode + { + get { return warehouseCode; } + set + { + SetProperty(ref warehouseCode, value); + } + } + + + + private List dataGridItemSource; + public List DataGridItemSource + { + get { return dataGridItemSource; } + set + { + SetProperty(ref dataGridItemSource, value); + } + } + + + + + #endregion + + #region Command + public ICommand BtnSearchCommand { get => new DelegateCommand(BtnSearch); } + public void BtnSearch() + { + Task.Run(() => + { + var request = new PickOrderRequest() + { + orderProdNumber = OrderProdNumber, + orderWorkNumber = OrderWorkNumber, + pickBillNumber = PickBillNumber + }; + var requeststr = JsonConvert.SerializeObject(request); + var result = ApiHelp.MXGetDataFromHttpLongWait>(requeststr, LocalFile.Config.GetPickOrderUrl, "POST"); + if (result != null && result.code == 200 && result.data != null && result.data.Count() > 0) + { + DataGridItemSource = result.data; + } + else if (result != null && result.code == 200 && (result.data == null || result.data.Count == 0)) + { + result.message = "输入的搜索条件未查询到发料单信息!"; + Growl.Warning(result.message); + DataGridItemSource = result.data; + } + else + { + Growl.Warning("调用MES接口超时:搜索失败!"); + } + }); + } + #endregion + + + } +} diff --git a/货架标准上位机/ViewModels/ShelfInfoAddOrUpdateViewModel.cs b/货架标准上位机/ViewModels/ShelfInfoAddOrUpdateViewModel.cs index a5b8063..0b24199 100644 --- a/货架标准上位机/ViewModels/ShelfInfoAddOrUpdateViewModel.cs +++ b/货架标准上位机/ViewModels/ShelfInfoAddOrUpdateViewModel.cs @@ -33,7 +33,7 @@ namespace 货架标准上位机.ViewModel ClientIp = shelfInfoModel.ClientIp; GroupName = shelfInfoModel.GroupName; IsBind = shelfInfoModel.IsBind; - BindShelfCode = shelfInfoModel.BindShelfCode; + BigShelfCode = shelfInfoModel.BigShelfCode; } } @@ -51,7 +51,7 @@ namespace 货架标准上位机.ViewModel ClientIp = ClientIp, GroupName = GroupName, IsBind = IsBind, - BindShelfCode = BindShelfCode, + BigShelfCode = BigShelfCode, }; } @@ -156,13 +156,13 @@ namespace 货架标准上位机.ViewModel } } - private string bindShelfCode; - public string BindShelfCode + private string bigShelfCode; + public string BigShelfCode { - get { return bindShelfCode; } + get { return bigShelfCode; } set { - SetProperty(ref bindShelfCode, value); + SetProperty(ref bigShelfCode, value); } } #endregion diff --git a/货架标准上位机/Views/InInventoryView.xaml b/货架标准上位机/Views/InInventoryView.xaml index a92fbaf..efee7eb 100644 --- a/货架标准上位机/Views/InInventoryView.xaml +++ b/货架标准上位机/Views/InInventoryView.xaml @@ -34,7 +34,7 @@ hc:BorderElement.CornerRadius="15" MinHeight="40" FontSize="20" - Content="结束入库" + Content="结束所有入库" FontFamily="{StaticResource IconFont}" Command="{Binding BtnEndCommand}"> @@ -42,17 +42,33 @@ - - - - + + + + + + + + + + + + + + + + + + + + - + diff --git a/货架标准上位机/Views/InInventoryView.xaml.cs b/货架标准上位机/Views/InInventoryView.xaml.cs index c8793cd..c9bb6a9 100644 --- a/货架标准上位机/Views/InInventoryView.xaml.cs +++ b/货架标准上位机/Views/InInventoryView.xaml.cs @@ -36,8 +36,10 @@ namespace 货架标准上位机 t.ScannerDisplayControl = control; scannersWrapPanel.Children.Add(control); }); - } + //ImageSource = new BitmapImage(new Uri("/Resources/goOutInstore.png")); + } + //public BitmapImage ImageSource { get; set; } private void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { DataGrid datagrid = sender as DataGrid; diff --git a/货架标准上位机/Views/MXWindows/MXMainWindow.xaml b/货架标准上位机/Views/MXWindows/MXMainWindow.xaml new file mode 100644 index 0000000..a9afc94 --- /dev/null +++ b/货架标准上位机/Views/MXWindows/MXMainWindow.xaml @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 主页 + + + + + + + + + + + + 物料入库 + + + + + + + + + + + + + + 物料出库 + + + + + + + + + + + + 盘点单据 + + + + + + + + + + + + 物料盘点 + + + + + + + + + + + + 库存查询 + + + + + + + + + + + + 出入记录 + + + + + + + + + + + + 库位管理 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 接口记录 + + + + + + + + + + + + 权限 + + + + + + + + + + + + + + + + + + + + + 调试 + + + + + + + + + + + + + + + + + + + + + 设置 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/货架标准上位机/Views/MXWindows/MXMainWindow.xaml.cs b/货架标准上位机/Views/MXWindows/MXMainWindow.xaml.cs new file mode 100644 index 0000000..c341185 --- /dev/null +++ b/货架标准上位机/Views/MXWindows/MXMainWindow.xaml.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Threading; +using 货架标准上位机.ViewModel; +using HandyControl.Controls; + +namespace 货架标准上位机 +{ + /// + /// MainWindow1.xaml 的交互逻辑 + /// + public partial class MXMainWindow : HandyControl.Controls.Window + { + public static MainViewModel viewModel = MainWindow.viewModel; + public MXMainWindow() + { + if (!viewModel.InitAgo()) + { + this.Close(); + System.Environment.Exit(0); + } + InitializeComponent(); + this.DataContext = viewModel; + } + + private void load(object sender, RoutedEventArgs e) + { + viewModel.Init(this); + } + + private void tabControl_PreviewKeyDown(object sender, KeyEventArgs e) + { + //取消tabControl快捷键切换 + if (e.Key == Key.LeftCtrl || e.Key == Key.LeftCtrl || e.Key == Key.Tab) + e.Handled = true; + } + + private void Window_Closed(object sender, EventArgs e) + { + System.Environment.Exit(0); + } + } +} diff --git a/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml b/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml new file mode 100644 index 0000000..cfc1f84 --- /dev/null +++ b/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml.cs b/货架标准上位机/Views/MXWindows/MXOutInventoryView.xaml.cs new file mode 100644 index 0000000..f93396f --- /dev/null +++ b/货架标准上位机/Views/MXWindows/MXOutInventoryView.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 MXOutInventoryView : UserControlBase + { + public static MXOutInventoryViewModel viewModel = new MXOutInventoryViewModel(); + public MXOutInventoryView() + { + 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.RefreshOutOrderList(viewModel.SelectedOutOrderNumber); + } + } +} diff --git a/货架标准上位机/Views/MXWindows/MXOutOrderDetailView.xaml b/货架标准上位机/Views/MXWindows/MXOutOrderDetailView.xaml new file mode 100644 index 0000000..4ad9511 --- /dev/null +++ b/货架标准上位机/Views/MXWindows/MXOutOrderDetailView.xaml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + A + B + + + + + +