From f57b79d0fcb7aeca0c81054a2db63ce5e0cf3277 Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Fri, 10 May 2024 09:52:27 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=8D=95=E7=81=AF=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E6=9F=A5=E8=AF=A2=E7=89=A9=E6=96=99=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2.修改入库查询物料接口 3.货架出库单据计算物料重复问题修复 4.出库单据、盘点单据生成单据号修改为按 202406100001这种格式 --- WCS.BLL/Config/JsConfig.cs | 13 +- WCS.BLL/DbModels/DocumentSerialNumber.cs | 50 ++++++ WCS.BLL/Manager/DbInit.cs | 23 +++ WCS.BLL/Services/IService/IInstoreService.cs | 1 + WCS.BLL/Services/Service/GenerateService.cs | 33 +++- WCS.BLL/Services/Service/InstoreService.cs | 156 +++++++++++------- WCS.BLL/Services/Service/OutstoreService.cs | 16 +- .../ApiModel/InStore/QueryByMatSnRequest.cs | 2 + WCS.WebApi/Controllers/InstoreController.cs | 12 ++ WCS.WebApi/Controllers/OutstoreController.cs | 1 - .../Views/OutInventoryDocumentView.xaml | 2 +- .../Views/StocktakingDocumentView.xaml | 2 +- 12 files changed, 228 insertions(+), 83 deletions(-) create mode 100644 WCS.BLL/DbModels/DocumentSerialNumber.cs diff --git a/WCS.BLL/Config/JsConfig.cs b/WCS.BLL/Config/JsConfig.cs index f3f2eb5..7390edf 100644 --- a/WCS.BLL/Config/JsConfig.cs +++ b/WCS.BLL/Config/JsConfig.cs @@ -11,8 +11,19 @@ namespace WCS.BLL.Config /// public class JsConfig { - public List ModuleCodePatterns { get; set; } + public List? ModuleCodePatterns { get; set; } + /// + /// 不同种类的物料分批次入库 + /// public bool IsSameMatCodeOut { get; set; } + /// + /// 是否接入WMS系统 + /// + public bool IsAccessWMS { get; set; } + /// + /// WMS系统 + /// + public string? WMSUrl { get; set; } } } diff --git a/WCS.BLL/DbModels/DocumentSerialNumber.cs b/WCS.BLL/DbModels/DocumentSerialNumber.cs new file mode 100644 index 0000000..c5efd11 --- /dev/null +++ b/WCS.BLL/DbModels/DocumentSerialNumber.cs @@ -0,0 +1,50 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WCS.DAL.DbModels; +using WCS.Model.ApiModel.InOutRecord; + +namespace WCS.BLL.DbModels +{ + /// + /// 用于记录单据生成到哪个序号了 + /// + [SugarTable("document_serial_number")] + public class DocumentSerialNumber + { + /// + /// 主键 自增Id + /// + [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsNullable = false, IsIdentity = true)] + public int Id { get; set; } + + /// + /// 单据类型 + /// + [SugarColumn(ColumnName = "document_type", IsNullable = false, ColumnDescription = "单据类型 出库单据 = 1,\r\n盘点单据 = 2,")] + public DocumentTypeEnum DocumentType { get; set; } + + + /// + /// 当前单据序号 + /// + [SugarColumn(ColumnName = "current_serial_number", IsNullable = false, ColumnDescription = "当前单据序号")] + public int CurrentSerialNumber { get; set; } + + /// + /// 日期 + /// + [SugarColumn(ColumnName = "update_date", IsNullable = false, ColumnDescription = "更新日期")] + public DateTime UpdateDate { get; set; } + } + + public enum DocumentTypeEnum + { + 出库单据 = 1, + 盘点单据 = 2, + } + +} diff --git a/WCS.BLL/Manager/DbInit.cs b/WCS.BLL/Manager/DbInit.cs index 8d9d77b..a790d46 100644 --- a/WCS.BLL/Manager/DbInit.cs +++ b/WCS.BLL/Manager/DbInit.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using WCS.BLL.DbModels; using WCS.DAL.Db; +using WCS.DAL.Db.AuthDb; using WCS.DAL.DbModels; namespace WCS.BLL.Manager @@ -17,9 +18,31 @@ namespace WCS.BLL.Manager , typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail) , typeof(ShelfTypeInfo), typeof(MatBaseInfo), typeof(MatInfo) , typeof(StockTakingOrder), typeof(StockTakingOrderMatDetail), typeof(InOutRecord) + , typeof(DocumentSerialNumber) ); DbHelp.dbLog.CodeFirst.InitTables(typeof(SystemApiLogRecord)); + + //初始化单据序列号数据 + if (!DbHelp.db.Queryable().Any()) + { + var outDocumentSerialNumber = new DocumentSerialNumber() + { + DocumentType = DocumentTypeEnum.出库单据, + UpdateDate = DateTime.Now, + CurrentSerialNumber = 0 + }; + + var stockTakingDocumentSerialNumber = new DocumentSerialNumber() + { + DocumentType = DocumentTypeEnum.盘点单据, + UpdateDate = DateTime.Now, + CurrentSerialNumber = 0 + }; + + DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand(); + DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand(); + } } } } diff --git a/WCS.BLL/Services/IService/IInstoreService.cs b/WCS.BLL/Services/IService/IInstoreService.cs index 4576a2d..8b83646 100644 --- a/WCS.BLL/Services/IService/IInstoreService.cs +++ b/WCS.BLL/Services/IService/IInstoreService.cs @@ -12,6 +12,7 @@ namespace WCS.BLL.Services.IService public ResponseBase shelfGoInInStore(ShelfGoInInstoreRequest request); public ResponseBase shelfGoOutInStore(ShelfGoOutInStoreRequest request); public Task queryByMatSn(QueryByMatSnRequest request); + public Task queryByMatSnOut(QueryByMatSnRequest request); public Task queryInstoreStatus(QueryByMatSnRequest request); } } diff --git a/WCS.BLL/Services/Service/GenerateService.cs b/WCS.BLL/Services/Service/GenerateService.cs index 2dc388b..e0e6551 100644 --- a/WCS.BLL/Services/Service/GenerateService.cs +++ b/WCS.BLL/Services/Service/GenerateService.cs @@ -1,6 +1,7 @@ using SqlSugar; using System; using System.Collections.Generic; +using System.Drawing; using System.IO; using System.Linq; using System.Runtime; @@ -120,8 +121,8 @@ namespace WCS.BLL.Services.Service { lock (stockTakingFlag) { - Thread.Sleep(1); - return "PD" + DateTime.Now.ToString("yyMMddHHmmssfff"); + var serialNumber = GetSerialNumber(DocumentTypeEnum.盘点单据); + return "PD" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0'); } } @@ -129,9 +130,33 @@ namespace WCS.BLL.Services.Service { lock (stockTakingFlag) { - Thread.Sleep(1); - return "CK" + DateTime.Now.ToString("yyMMddHHmmssfff"); + var serialNumber = GetSerialNumber(DocumentTypeEnum.出库单据); + return "CK" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0'); } } + + public int GetSerialNumber(DocumentTypeEnum documentType) + { + var documentSerialNumber = DbHelp.db.Queryable() + .Where(t => t.DocumentType == documentType) + .First(); + if (documentSerialNumber != null) + { + //如果日期不是当天 + if (documentSerialNumber.UpdateDate.Date != DateTime.Now.Date) + { + documentSerialNumber.CurrentSerialNumber = 0; + documentSerialNumber.UpdateDate = DateTime.Now; + } + var serialNumber = ++documentSerialNumber.CurrentSerialNumber; + DbHelp.db.Updateable(documentSerialNumber).ExecuteCommand(); + return serialNumber; + } + else + { + return 0; + } + } + } } diff --git a/WCS.BLL/Services/Service/InstoreService.cs b/WCS.BLL/Services/Service/InstoreService.cs index a53b5a6..0f9a316 100644 --- a/WCS.BLL/Services/Service/InstoreService.cs +++ b/WCS.BLL/Services/Service/InstoreService.cs @@ -122,25 +122,6 @@ namespace WCS.BLL.Services.Service public async Task queryByMatSn(QueryByMatSnRequest request) { - //获取货架 - var shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault(); - if (shelf == null)//货架不存在 - { - return new ResponseCommon() - { - Code = 201, - Message = $"操作失败:货架[{request.ShelfCode}]不存在!", - }; - } - //判断当前是否是入库模式 - if (shelf.CurrentMode != Mode.入库模式) - { - return new ResponseCommon() - { - Code = 201, - Message = $"操作失败:货架[{request.ShelfCode}]不在入库模式!\r\n当前为{shelf.CurrentMode}", - }; - } //判断物料是否已入库 var inventory = await DbHelp.db.Queryable().Where(t => t.MatSN == request.MatSn).FirstAsync(); if (inventory != null) @@ -148,50 +129,65 @@ namespace WCS.BLL.Services.Service return new ResponseCommon() { Code = 201, - Message = $"操作失败:物料{inventory.MatSN}已入库,库位为{inventory.StoreCode}", + Message = $"操作失败:物料{inventory.MatSN}已入库!库位为{inventory.StoreCode}", }; } + + IShelfBase shelf = null; + if (!request.IsSingleLightIn) + { + //获取货架 + shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault(); + if (shelf == null)//货架不存在 + { + return new ResponseCommon() + { + Code = 201, + Message = $"操作失败:货架[{request.ShelfCode}]不存在!", + }; + } + //判断当前是否是入库模式 + if (shelf.CurrentMode != Mode.入库模式) + { + return new ResponseCommon() + { + Code = 201, + Message = $"操作失败:货架[{request.ShelfCode}]不在入库模式!\r\n当前为{shelf.CurrentMode}", + }; + } + } + #region 获取物料数据 //调用接口或者直接查询数据库 //TODO做成配置 调用接口 - if (1 != 1) + if (LocalFile.Config.IsAccessWMS) { - #region 调用Mes接口获取物料信息 + #region 调用WMS接口获取物料信息 try { var body = new { materialBar = request.MatSn }; - //var Result = ApiHelp.GetDataFromHttp>>("http://192.168.2.23:9213/integrate/instock/queryBybar", body, "POST"); - var Result = new ResponseCommon>() - { - Code = 200, - Data = new List() {new queryByBarResponse() - { - materialBar = request.MatSn, - materialCode = "100200300", - materialName = "电阻", - materialQty = 1000, - } - } - }; + var Result = ApiHelp.GetDataFromHttp>>("http://192.168.2.23:9213/integrate/instock/queryBybar", body, "POST"); + //查询到物料信息 if (Result != null && Result.Code == 200 && Result.Data != null && Result.Data.Count > 0) { var data = Result.Data.First(); - shelf.InStoreData = new MatInfoResponse() - { - materialBar = data.materialBar, - materialCode = data.materialCode, - materialName = data.materialName, - materialQty = data.materialQty, - materialSpec = data.materialSpec, - batchNo = data.batchNo, - supplier = "", - customer = data.materialBar, + if (!request.IsSingleLightIn && shelf != null) + shelf.InStoreData = new MatInfoResponse() + { + materialBar = data.materialBar, + materialCode = data.materialCode, + materialName = data.materialName, + materialQty = data.materialQty, + materialSpec = data.materialSpec, + batchNo = data.batchNo, + supplier = "", + customer = data.materialBar, - InstoreUser = request.UserName - }; + InstoreUser = request.UserName + }; var matInfo = new MatInfo() { @@ -240,26 +236,27 @@ namespace WCS.BLL.Services.Service } #endregion } - //查询数据库 + //查询数据库是否存在这个物料 else { var matInfo = await DbHelp.db.Queryable().Where(t => t.MatSn == request.MatSn).FirstAsync(); if (matInfo != null) { //TODO 改成wcs的实体 - shelf.InStoreData = new MatInfoResponse() - { - materialBar = matInfo.MatSn, - materialCode = matInfo.MatCode, - materialName = matInfo.MatName, - materialQty = matInfo.MatQty, - materialSpec = matInfo.MatSpec, - batchNo = matInfo.MatBatch, - supplier = matInfo.MatSupplier, - customer = matInfo.MatCustomer, + if (!request.IsSingleLightIn && shelf != null) + shelf.InStoreData = new MatInfoResponse() + { + materialBar = matInfo.MatSn, + materialCode = matInfo.MatCode, + materialName = matInfo.MatName, + materialQty = matInfo.MatQty, + materialSpec = matInfo.MatSpec, + batchNo = matInfo.MatBatch, + supplier = matInfo.MatSupplier, + customer = matInfo.MatCustomer, - InstoreUser = request.UserName - }; + InstoreUser = request.UserName + }; return new ResponseCommon() { @@ -276,10 +273,47 @@ namespace WCS.BLL.Services.Service Message = $"不存在物料{request.MatSn}" }; } - #endregion } + /// + /// 单灯出库时查询物料信息 这里返回库存的数据 + /// + /// + /// + public async Task queryByMatSnOut(QueryByMatSnRequest request) + { + //判断物料是否已入库 + var inventory = await DbHelp.db.Queryable().Where(t => t.MatSN == request.MatSn).FirstAsync(); + if (inventory == null) + { + return new ResponseCommon() + { + Code = 201, + Message = $"操作失败:物料不在库存内,无法进行出库!", + }; + } + else + { + return new ResponseCommon() + { + Code = 200, + Message = $"Success", + Data = new MatInfo() + { + MatSn = inventory.MatSN, + MatCode = inventory.MatCode, + MatName = inventory.MatName, + MatBatch = inventory.MatBatch, + MatQty = inventory.MatQty, + MatSpec = inventory.MatSpec, + MatSupplier = inventory.MatSupplier, + MatCustomer = inventory.MatCustomer, + } + }; + } + } + public async Task queryInstoreStatus(QueryByMatSnRequest request) { //获取货架 diff --git a/WCS.BLL/Services/Service/OutstoreService.cs b/WCS.BLL/Services/Service/OutstoreService.cs index 1b4dccb..fdf3e67 100644 --- a/WCS.BLL/Services/Service/OutstoreService.cs +++ b/WCS.BLL/Services/Service/OutstoreService.cs @@ -505,20 +505,7 @@ namespace WCS.BLL.Services.Service try { DbHelp.db.BeginTran(); - - ////第一步 删除、解锁 放在上一次结束入库时操作 - //var outOrderMatDetails = DbHelp.db.Queryable() - // .Where(t => t.OrderId == order.Id) - // .ToList(); - //var inventoryIds = outOrderMatDetails.Select(t => t.Id).ToList(); - //var inventoryDetails = DbHelp.db.Queryable() - // .Where(t => inventoryIds.Contains(t.Id)) - // .ToList(); - //inventoryDetails.ForEach(t => { t.IsLocked = false; }); - //DbHelp.db.Deleteable(outOrderMatDetails).ExecuteCommand(); - //DbHelp.db.Updateable(inventoryDetails).ExecuteCommand(); - - //第一步 找到需求物料 + //第一步 物料需求表 var outOrderDetails = DbHelp.db.Queryable() .Where(t => t.OrderId == order.Id) .ToList(); @@ -538,6 +525,7 @@ namespace WCS.BLL.Services.Service var matInventoryDetails = DbHelp.db.Queryable() .Where(t => t.MatCode == outOrderDetail.MatCode) .WhereIF(!string.IsNullOrEmpty(outOrderDetail.MatBatch), t => t.MatBatch == outOrderDetail.MatBatch) + .Where(t => t.IsLocked == false)//未锁定的物料 .OrderBy(t => t.MatBatch)//先进先出 .OrderBy(t => t.MatQty)//零散料先出 .ToList(); diff --git a/WCS.Model/ApiModel/InStore/QueryByMatSnRequest.cs b/WCS.Model/ApiModel/InStore/QueryByMatSnRequest.cs index 46e426a..fefa30f 100644 --- a/WCS.Model/ApiModel/InStore/QueryByMatSnRequest.cs +++ b/WCS.Model/ApiModel/InStore/QueryByMatSnRequest.cs @@ -11,5 +11,7 @@ namespace WCS.Model public string MatSn { get; set; } = string.Empty; public string ShelfCode { get; set; } = string.Empty; public string IpAddress { get; set; } = string.Empty; + + public bool IsSingleLightIn { get; set; } = false; } } diff --git a/WCS.WebApi/Controllers/InstoreController.cs b/WCS.WebApi/Controllers/InstoreController.cs index d637d3d..fd2a56a 100644 --- a/WCS.WebApi/Controllers/InstoreController.cs +++ b/WCS.WebApi/Controllers/InstoreController.cs @@ -92,6 +92,18 @@ namespace WebApi.Controllers return await _instoreService.queryByMatSn(request); } + /// + /// ɨ ȡϸ + /// + /// + /// + [Route("queryByMatSnOut")] + [HttpPost(Name = "queryByMatSnOut")] + public async Task queryByMatSnOut(QueryByMatSnRequest request) + { + return await _instoreService.queryByMatSnOut(request); + } + /// /// ѯ״̬ /// diff --git a/WCS.WebApi/Controllers/OutstoreController.cs b/WCS.WebApi/Controllers/OutstoreController.cs index ac10222..18df91a 100644 --- a/WCS.WebApi/Controllers/OutstoreController.cs +++ b/WCS.WebApi/Controllers/OutstoreController.cs @@ -7,7 +7,6 @@ using WCS.Model; namespace WebApi.Controllers { - //[ServiceFilter(typeof(LogActionFilter))] [ApiController] [Route("[controller]")] public class OutstoreController : ControllerBase diff --git a/货架标准上位机/Views/OutInventoryDocumentView.xaml b/货架标准上位机/Views/OutInventoryDocumentView.xaml index 9c62643..245f324 100644 --- a/货架标准上位机/Views/OutInventoryDocumentView.xaml +++ b/货架标准上位机/Views/OutInventoryDocumentView.xaml @@ -117,7 +117,7 @@ - + diff --git a/货架标准上位机/Views/StocktakingDocumentView.xaml b/货架标准上位机/Views/StocktakingDocumentView.xaml index 929d684..dfaaba5 100644 --- a/货架标准上位机/Views/StocktakingDocumentView.xaml +++ b/货架标准上位机/Views/StocktakingDocumentView.xaml @@ -114,7 +114,7 @@ - +