liulijun
2026-03-12 7dcd8da0f2467d077551ddd39f33be5836dd80a9
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/ProStockInfoService.cs
@@ -26,75 +26,52 @@
            _stockRepository = stockRepository;
            _basicRepository = basicRepository;
        }
        /// <summary>
        /// æ ¹æ®å¤–包信息解绑内包信息
        /// </summary>
        public WebResponseContent UnBindStock(List<Dt_ProStockInfoDetail> proStockInfoDetails)
        public List<Dt_ProStockInfo> GetUseableStocks(string materielCode, int warehoseId)
        {
            WebResponseContent content = new WebResponseContent();
            //根据内包号进行库存扣除
            try
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
            return BaseDal.GetStockInfos(materielCode, locationCodes);
        }
        public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, decimal needQuantity)
        {
            List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>();
            decimal stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockQty-v.OutboundQuantity)).Sum(x => x);
            if (stockTotalQuantity >= needQuantity)//库存够
            {
                //获取库存
                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>();
                List<Dt_ProStockInfoDetail> upProStockDetails = new List<Dt_ProStockInfoDetail>();
                List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>();
                foreach (var item in proStockInfoDetails)
                int index = 0;
                while (needQuantity > 0)
                {
                    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)
                    Dt_ProStockInfo stockInfo = stockInfos[index];
                    decimal useableStockQuantity = stockInfo.proStockInfoDetails
                        .Sum(x => x.StockQty - x.OutboundQuantity);
                    if (useableStockQuantity < needQuantity && useableStockQuantity > 0)
                    {
                       return content.Error($"未找到{item?.BagNo}库存");
                    }
                    //判断明细是否全部扫出
                    if (proStockInfoDetail.StockPcsQty==item.StockPcsQty)
                    {
                        delProStockDetails.Add(proStockInfoDetail);
                        proStockInfo.proStockInfoDetails.Remove(proStockInfoDetail);
                        item.OutDetailId = proStockInfoDetail.OutDetailId;
                        item.OutDetailSaleNo = proStockInfoDetail.OutDetailSaleNo;
                        stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockQty);
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        proStockInfoDetail.StockPcsQty -= item.StockPcsQty;
                        proStockInfoDetail.SETQty -= item.SETQty;
                        proStockInfoDetail.OutboundQuantity = 0;
                        item.OutDetailId = 0;
                        item.OutDetailSaleNo = "";
                        upProStockDetails.Add(proStockInfoDetail);
                        stockInfo.proStockInfoDetails.ForEach(x =>
                        {
                            if (x.StockQty - x.OutboundQuantity >= needQuantity)
                            {
                                x.OutboundQuantity += needQuantity;
                                needQuantity = 0;
                            }
                            else
                            {
                                needQuantity -= (x.StockQty - x.OutboundQuantity);
                                x.OutboundQuantity = x.StockQty;
                            }
                        });
                    }
                    if (proStockInfo.proStockInfoDetails.Count==0)
                    {
                        delProStockInfos.Add(proStockInfo);
                    }
                    assignOutStocks.Add(stockInfo);
                    index++;
                }
                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("成功", proStockInfoDetails);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
            return assignOutStocks;
        }
    }
}