From 638a684258fb4bc6adf76a1964bdf0d7f99e404f Mon Sep 17 00:00:00 2001 From: wangxinhui <wangxinhui@hnkhzn.com> Date: 星期一, 31 三月 2025 02:18:54 +0800 Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn --- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs | 294 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 288 insertions(+), 6 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs" index fc4b072..e4efd48 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs" @@ -3,8 +3,13 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using WIDESEA_Common.StockEnum; +using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseServices; +using WIDESEA_Core.Enums; +using WIDESEA_Core.Helper; +using WIDESEA_IBasicRepository; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_Model.Models; @@ -14,22 +19,71 @@ public partial class ProStockInfoService : ServiceBase<Dt_ProStockInfo, IProStockInfoRepository>, IProStockInfoService { public IProStockInfoRepository Repository => BaseDal; - public IStockRepository _stockRepository; - public ProStockInfoService(IProStockInfoRepository BaseDal,IStockRepository stockRepository) : base(BaseDal) + private readonly IStockRepository _stockRepository; + private readonly IBasicRepository _basicRepository; + public ProStockInfoService(IProStockInfoRepository BaseDal,IStockRepository stockRepository, IBasicRepository basicRepository) : base(BaseDal) { _stockRepository = stockRepository; + _basicRepository = basicRepository; } + /// <summary> + /// 鏍规嵁澶栧寘淇℃伅瑙g粦鍐呭寘淇℃伅 + /// </summary> public WebResponseContent UnBindStock(List<Dt_ProStockInfoDetail> proStockInfoDetails) { WebResponseContent content = new WebResponseContent(); //鏍规嵁鍐呭寘鍙疯繘琛屽簱瀛樻墸闄� try { + //鑾峰彇搴撳瓨 + List<string> BagNos = proStockInfoDetails.Select(x => x.BagNo).Distinct().ToList(); + List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>() + .Where(x => x.StockStatus == StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt()) + .Includes(x => x.proStockInfoDetails) + .Where(x => x.proStockInfoDetails.Any(v => BagNos.Contains(v.BagNo))).Distinct().ToList(); List<Dt_ProStockInfoDetail> delProStockDetails=new List<Dt_ProStockInfoDetail>(); - //foreach (var item in collection) - //{ - // Dt_ProStockInfoDetail delProStockDetal= - //} + List<Dt_ProStockInfoDetail> upProStockDetails = new List<Dt_ProStockInfoDetail>(); + List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>(); + foreach (var item in proStockInfoDetails) + { + Dt_ProStockInfo? proStockInfo = proStockInfos.Where(x => x.proStockInfoDetails.Any(v => v.BagNo == item?.BagNo)).FirstOrDefault(); + Dt_ProStockInfoDetail? proStockInfoDetail = proStockInfo?.proStockInfoDetails.Where(x => x.BagNo == item?.BagNo).FirstOrDefault(); + if (proStockInfo==null || proStockInfoDetail == null) + { + return content.Error($"鏈壘鍒皗item?.BagNo}搴撳瓨"); + } + + //鍒ゆ柇鏄庣粏鏄惁鍏ㄩ儴鎵嚭 + if (proStockInfoDetail.StockPcsQty==item.StockPcsQty) + { + delProStockDetails.Add(proStockInfoDetail); + proStockInfo.proStockInfoDetails.Remove(proStockInfoDetail); + } + else + { + proStockInfoDetail.StockPcsQty -= item.StockPcsQty; + proStockInfoDetail.SETQty -= item.SETQty; + upProStockDetails.Add(proStockInfoDetail); + } + + if (proStockInfo.proStockInfoDetails.Count==0) + { + delProStockInfos.Add(proStockInfo); + } + } + if (delProStockInfos.Count>0) + { + BaseDal.DeleteAndMoveIntoHty(delProStockInfos, OperateTypeEnum.鑷姩鍒犻櫎); + } + if (delProStockDetails.Count > 0) + { + _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delProStockDetails, OperateTypeEnum.鑷姩鍒犻櫎); + } + if (upProStockDetails.Count > 0) + { + _stockRepository.ProStockInfoDetailRepository.UpdateData(upProStockDetails); + } + content.OK(); } catch (Exception ex) { @@ -37,5 +91,233 @@ } return content; } + //鏌ユ壘鍙敤搴撳瓨 + public List<Dt_ProStockInfo> GetUseableStocks(int warehoseId,Dt_ProOutOrderDetail proOutOrderDetail) + { + List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); + return BaseDal.GetProStocks(proOutOrderDetail,locationCodes); + } + /// <summary> + /// MES鎻愬簱鍙敤搴撳瓨 + /// </summary> + /// <returns></returns> + public List<Dt_ProStockInfo> GetUseableStocks(Dt_MesRworkOutboundOrder mesRworkOutboundOrder) + { + //杞崲鎴� 鎴愬搧浠撲粨搴撲俊鎭幏鍙栧熬鏁板睘鎬х殑璐т綅 + Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString()); + List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehouse.WarehouseId); + return BaseDal.GetProStocks(mesRworkOutboundOrder, locationCodes); + } + /// <summary> + /// 鑾峰彇鍑哄簱搴撳瓨 + /// </summary> + public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_ProOutOrderDetail outOrderDetail, float needQuantity, out float residueQuantity) + { + List<Dt_ProStockInfo> assignOutStocks =new List<Dt_ProStockInfo>(); + float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); + //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); + bool isCanLot = string.IsNullOrEmpty(outOrderDetail.PLot); + bool isCanDate = string.IsNullOrEmpty(outOrderDetail.DateCode); + if (stockTotalQuantity >= needQuantity)//搴撳瓨澶� + { + int index = 0; + while (needQuantity > 0) + { + Dt_ProStockInfo stockInfo = stockInfos[index]; + float useableStockQuantity = stockInfo.proStockInfoDetails + .Where(x => x.SaleOrder == outOrderDetail.SaleOrder && x.ProductCode == outOrderDetail.PCode && x.ProductVersion == outOrderDetail.PVer + && (isCanLot ? isCanLot : x.LotNumber == outOrderDetail.PLot) + && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)) + .Sum(x => x.StockPcsQty - x.OutboundQuantity); + if (useableStockQuantity < needQuantity) + { + stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockPcsQty); + needQuantity -= useableStockQuantity; + } + else + { + stockInfo.proStockInfoDetails.ForEach(x => + { + if ((x.StockPcsQty > x.OutboundQuantity) && x.SaleOrder == outOrderDetail.SaleOrder + && x.ProductCode == outOrderDetail.PCode && x.ProductVersion == outOrderDetail.PVer + && (isCanLot ? isCanLot : x.LotNumber == outOrderDetail.PLot) + && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)) + { + if (x.StockPcsQty - x.OutboundQuantity >= needQuantity) + { + x.OutboundQuantity += needQuantity; + needQuantity = 0; + } + else + { + needQuantity -= (x.StockPcsQty - x.OutboundQuantity); + x.OutboundQuantity = x.StockPcsQty; + } + } + }); + } + assignOutStocks.Add(stockInfo); + index++; + } + } + else + { + for (int i = 0; i < stockInfos.Count; i++) + { + Dt_ProStockInfo stockInfo = stockInfos[i]; + float useableStockQuantity = stockInfo.proStockInfoDetails + .Where(x => x.SaleOrder == outOrderDetail.SaleOrder && x.ProductCode == outOrderDetail.PCode && x.ProductVersion == outOrderDetail.PVer + && (isCanLot ? isCanLot : x.LotNumber == outOrderDetail.PLot) + && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)) + .Sum(x => x.StockPcsQty - x.OutboundQuantity); + if (useableStockQuantity < needQuantity) + { + stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockPcsQty); + needQuantity -= useableStockQuantity; + } + else + { + stockInfo.proStockInfoDetails.ForEach(x => + { + if (x.StockPcsQty > x.OutboundQuantity && x.SaleOrder == outOrderDetail.SaleOrder + && x.ProductCode == outOrderDetail.PCode && x.ProductVersion == outOrderDetail.PVer + && (isCanLot ? isCanLot : x.LotNumber == outOrderDetail.PLot) + && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)) + { + if (x.StockPcsQty - x.OutboundQuantity >= needQuantity) + { + x.OutboundQuantity += needQuantity; + needQuantity = 0; + } + else + { + needQuantity -= (x.StockPcsQty - x.OutboundQuantity); + x.OutboundQuantity = x.StockPcsQty; + } + } + }); + } + assignOutStocks.Add(stockInfo); + } + } + residueQuantity = needQuantity; + return assignOutStocks; + } + /// <summary> + /// 鑾峰彇MES鎻愬簱搴撳瓨 + /// </summary> + public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_MesRworkOutboundOrder mesRworkOutboundOrder, float needQuantity, out float residueQuantity) + { + List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>(); + float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); + //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); + bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode); + if (stockTotalQuantity >= needQuantity)//搴撳瓨澶� + { + int index = 0; + while (needQuantity > 0) + { + Dt_ProStockInfo stockInfo = stockInfos[index]; + float useableStockQuantity = stockInfo.proStockInfoDetails + .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder + && x.ProductCode == mesRworkOutboundOrder.ProductCode + && x.ProductVersion == mesRworkOutboundOrder.ProductVersion + && (isCanDate? isCanDate: x.DateCode == mesRworkOutboundOrder.DateCode)) + .Sum(x => x.StockPcsQty - x.OutboundQuantity); + if (useableStockQuantity < needQuantity) + { + stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockPcsQty); + needQuantity -= useableStockQuantity; + } + else + { + stockInfo.proStockInfoDetails.ForEach(x => + { + if ((x.StockPcsQty > x.OutboundQuantity) && x.SaleOrder == mesRworkOutboundOrder.SaleOrder + && x.ProductCode == mesRworkOutboundOrder.ProductCode + && x.ProductVersion == mesRworkOutboundOrder.ProductVersion + && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) + { + if (x.StockPcsQty - x.OutboundQuantity >= needQuantity) + { + x.OutboundQuantity += needQuantity; + needQuantity = 0; + } + else + { + needQuantity -= (x.StockPcsQty - x.OutboundQuantity); + x.OutboundQuantity = x.StockPcsQty; + } + } + }); + } + assignOutStocks.Add(stockInfo); + index++; + } + } + else + { + for (int i = 0; i < stockInfos.Count; i++) + { + Dt_ProStockInfo stockInfo = stockInfos[i]; + float useableStockQuantity = stockInfo.proStockInfoDetails + .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder + && x.ProductCode == mesRworkOutboundOrder.ProductCode + && x.ProductVersion == mesRworkOutboundOrder.ProductVersion + && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) + .Sum(x => x.StockPcsQty - x.OutboundQuantity); + if (useableStockQuantity < needQuantity) + { + stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockPcsQty); + needQuantity -= useableStockQuantity; + } + else + { + stockInfo.proStockInfoDetails.ForEach(x => + { + if (x.StockPcsQty > x.OutboundQuantity && x.SaleOrder == mesRworkOutboundOrder.SaleOrder + && x.ProductCode == mesRworkOutboundOrder.ProductCode + && x.ProductVersion == mesRworkOutboundOrder.ProductVersion + && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) + { + if (x.StockPcsQty - x.OutboundQuantity >= needQuantity) + { + x.OutboundQuantity += needQuantity; + needQuantity = 0; + } + else + { + needQuantity -= (x.StockPcsQty - x.OutboundQuantity); + x.OutboundQuantity = x.StockPcsQty; + } + } + }); + } + assignOutStocks.Add(stockInfo); + } + } + residueQuantity = needQuantity; + return assignOutStocks; + } + ////澶勭悊鍑哄簱搴撳瓨 + //public (List<Dt_ProStockInfoDetail>?, List<Dt_ProStockInfoDetail>?) HandleOutProStock(Dt_ProStockInfo proStockInfo) + //{ + // List<Dt_ProStockInfoDetail>? deleteStockDetails = null; + // List<Dt_ProStockInfoDetail>? updateStockDetails = null; + // foreach (var item in proStockInfo.proStockInfoDetails) + // { + // if (item.StockPcsQty==item.OutboundQuantity) + // { + // item.ProOutDetailStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt(); + // deleteStockDetails.Add(item); + // } + // else if(item.StockPcsQty> item.OutboundQuantity && item.OutboundQuantity>0) + // { + // item.StockPcsQty-=item.OutboundQuantity; + // updateStockDetails.Add(item); + // } + // } + // return (deleteStockDetails, updateStockDetails); + //} } } -- Gitblit v1.9.3