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