using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseServices; using WIDESEA_IBasicRepository; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_Model.Models; namespace WIDESEA_StockService { public partial class ProStockInfoService : ServiceBase, IProStockInfoService { public IProStockInfoRepository Repository => BaseDal; private readonly IStockRepository _stockRepository; private readonly IBasicRepository _basicRepository; public ProStockInfoService(IProStockInfoRepository BaseDal,IStockRepository stockRepository, IBasicRepository basicRepository) : base(BaseDal) { _stockRepository = stockRepository; _basicRepository = basicRepository; } /// /// 根据外包信息解绑内包信息 /// public WebResponseContent UnBindStock(List proStockInfoDetails) { WebResponseContent content = new WebResponseContent(); //根据内包号进行库存扣除 try { List delProStockDetails=new List(); //foreach (var item in collection) //{ // Dt_ProStockInfoDetail delProStockDetal= //} } catch (Exception ex) { content.Error(ex.Message); } return content; } //查找可用库存 public List GetUseableStocks(int warehoseId,Dt_ProOutOrderDetail proOutOrderDetail) { List locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); return BaseDal.GetProStocks(proOutOrderDetail,locationCodes); } /// /// 获取出库库存 /// public List GetOutboundStocks(List stockInfos, Dt_ProOutOrderDetail outOrderDetail, float needQuantity, out float residueQuantity) { List assignOutStocks =new List(); float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x); //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); 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) .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) { 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) .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) { 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; } } }