From 9f225bb1f1e26d25c1652d3e1ec2a8f239f69615 Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期二, 18 三月 2025 10:41:29 +0800
Subject: [PATCH] 1

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs |  171 ++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 146 insertions(+), 25 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs"
index 945fcd4..09bda15 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs"
@@ -19,12 +19,17 @@
 using WIDESEA_IStockRepository;
 using WIDESEA_IStockService;
 using WIDESEA_Model.Models;
+using WIDESEA_OutboundRepository;
 using WIDESEA_StockRepository;
 
 namespace WIDESEA_OutboundService
 {
     public partial class OutboundOrderDetailService : ServiceBase<Dt_OutboundOrderDetail, IOutboundOrderDetailRepository>, IOutboundOrderDetailService
     {
+        public override PageGridData<Dt_OutboundOrderDetail> GetPageData(PageDataOptions options)
+        {
+            return base.GetPageData(options);
+        }
         public WebResponseContent LockOutboundStock(int orderDetailId)
         {
             Dt_OutboundOrderDetail outboundOrderDetail = BaseDal.QueryFirst(x => x.Id == orderDetailId);
@@ -125,7 +130,22 @@
             }
             return (true, "鎴愬姛");
         }
+        public (List<Dt_StockInfo>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_OutboundOrder outboundOrder, List<StockSelectViewDTO> stockSelectViews)
+        {
+            List<Dt_StockInfo> outStocks = null;
+            List<Dt_OutStockLockInfo> outStockLockInfos = _outStockLockInfoService.GetOutStockLockInfos(outboundOrder, outboundOrder.Details.First(), outStocks);
 
+            List<Dt_LocationInfo> locationInfos = _basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList());
+
+            return (outStocks, outStockLockInfos, locationInfos);
+        }
+        /// <summary>
+        /// 鍒嗛厤鍑哄簱搴撳瓨
+        /// </summary>
+        /// <param name="outboundOrderDetail"></param>
+        /// <param name="stockSelectViews">鎸囧畾搴撳瓨</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
         public (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
         {
             (bool, string) checkResult = CheckSelectStockDeital(outboundOrderDetail, stockSelectViews);
@@ -135,16 +155,27 @@
             decimal originalNeedQuantity = outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity;
 
             decimal needQuantity = originalNeedQuantity;
+            #region 鏍规嵁鎵樼洏鍙锋煡鎵惧簱瀛�
+            //List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
+            #endregion
 
-            List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
-            decimal assignQuantity = 0;
-            outStocks.ForEach(x =>
-            {
-                x.Details.ForEach(v =>
-                {
-                    assignQuantity += v.StockQuantity - v.OutboundQuantity;
-                });
-            });
+
+
+            List<Dt_StockInfoDetail> outStockDetails = _stockService.StockInfoDetailService.GetStockInfosByBatchNoCodes(stockSelectViews);
+
+            List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByIds(outStockDetails.Select(x => x.StockId).ToList());
+
+            decimal assignQuantity = outStocks.Count;
+            #region MyRegion
+            //decimal assignQuantity = 0;
+            //outStocks.ForEach(x =>
+            //{
+            //    x.Details.ForEach(v =>
+            //    {
+            //        assignQuantity += v.StockQuantity - v.OutboundQuantity;
+            //    });
+            //}); 
+            #endregion
 
             outboundOrderDetail.LockQuantity += assignQuantity;
             outStocks.ForEach(x =>
@@ -155,27 +186,55 @@
                 });
             });
             needQuantity -= assignQuantity;
+            #region 鎸囧畾鍑哄簱鏁伴噺灏戜簬璁㈠崟鏁伴噺鑷姩鍒嗛厤婊¤冻鏉′欢搴撳瓨
+            //if (outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity)
+            //{
+            //    List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode);
+            //    stockInfos = stockInfos.Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode)).ToList();
+            //    List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, outboundOrderDetail.MaterielCode, needQuantity, out decimal residueQuantity);
+            //    outboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
+            //    outStocks.AddRange(autoAssignStocks);
+            //    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
+            //    if (residueQuantity > 0)
+            //    {
+            //        outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
+            //    }
+            //}
+            #endregion
+
+            #region 鏈寚瀹氬簱瀛橈紝鑷姩鍒嗛厤搴撳瓨
             if (outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity)
             {
-                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode);
-                stockInfos = stockInfos.Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode)).ToList();
+                List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode);//鑾峰彇鎵�鏈夊簱瀛�
+
+                stockInfos = stockInfos.Where(x => !outStocks.Select(v => v.Id).Contains(x.Id)).ToList();
                 List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(stockInfos, outboundOrderDetail.MaterielCode, needQuantity, out decimal residueQuantity);
                 outboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
                 outStocks.AddRange(autoAssignStocks);
-                outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
-                if (residueQuantity > 0)
-                {
-                    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
-                }
+                //outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
+                //if (residueQuantity > 0)
+                //{
+                //    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
+                //}
             }
+            #endregion
 
+            outboundOrderDetail.OrderDetailStatus = outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity ? OrderDetailStatusEnum.AssignOverPartial.ObjToInt() : OrderDetailStatusEnum.AssignOver.ObjToInt();
+
+
+            //娣诲姞鍑哄簱鍒嗛厤璇︽儏
             List<Dt_OutStockLockInfo> outStockLockInfos = _outStockLockInfoService.GetOutStockLockInfos(outboundOrder, outboundOrderDetail, outStocks);
 
             List<Dt_LocationInfo> locationInfos = _basicService.LocationInfoService.Repository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList());
 
             return (outStocks, outboundOrderDetail, outStockLockInfos, locationInfos);
         }
-
+        /// <summary>
+        /// 鎸囧畾搴撳瓨閿佸畾搴撳瓨
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <param name="stockSelectViews"></param>
+        /// <returns></returns>
         public WebResponseContent LockOutboundStock(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
         {
             try
@@ -183,7 +242,7 @@
                 Dt_OutboundOrderDetail outboundOrderDetail = BaseDal.QueryFirst(x => x.Id == orderDetailId);
                 (bool, string) checkResult = CheckSelectStockDeital(outboundOrderDetail, stockSelectViews);
                 if (!checkResult.Item1) throw new Exception(checkResult.Item2);
-
+                //鍒嗛厤鍑哄簱搴撳瓨 
                 (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = AssignStockOutbound(outboundOrderDetail, stockSelectViews);
 
                 _unitOfWorkManage.BeginTran();
@@ -204,7 +263,11 @@
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
-
+        /// <summary>
+        /// 閿佸畾搴撳瓨//涓嶆寚瀹氬簱瀛橀攣瀹氬簱瀛�
+        /// </summary>
+        /// <param name="keys"></param>
+        /// <returns></returns>
         public WebResponseContent LockOutboundStock(int[] keys)
         {
             try
@@ -248,31 +311,85 @@
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
-
-        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
+        /// <summary>
+        /// 閿佸畾鍑哄簱鍗曞簱瀛樻暟鎹慨鏀�
+        /// </summary>
+        /// <param name="stockInfos"></param>
+        /// <param name="outboundOrderDetails"></param>
+        /// <param name="outStockLockInfos"></param>
+        /// <param name="locationInfos"></param>
+        /// <param name="locationStatus"></param>
+        /// <param name="tasks"></param>
+        /// <returns></returns>
+        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.OutLock, List<Dt_Task>? tasks = null)
         {
             try
             {
-                _stockService.StockInfoService.Repository.UpdateData(stockInfos);
+                #region 淇敼搴撳瓨鍜屽簱瀛樿鎯�
                 List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                 foreach (var item in stockInfos)
                 {
+                    if (item.StockStatus != StockStatusEmun.绉诲簱涓�.ObjToInt())
+                    {
+                        item.StockStatus = locationStatus == LocationStatusEnum.InStock
+                            ? StockStatusEmun.宸插叆搴�.ObjToInt() : StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                        item.Details.ForEach(x =>
+                        {
+                            x.Status = item.StockStatus;
+                        });
+                    }
                     stockInfoDetails.AddRange(item.Details);
                 }
+                _stockService.StockInfoService.Repository.UpdateData(stockInfos);
                 _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetails);
-                BaseDal.UpdateData(outboundOrderDetails);
 
+                #endregion
+                #region 淇敼鍑哄簱鍗曞拰鍑哄簱鍗曡鎯�
+                List<Dt_OutboundOrder> outboundOrders = _outboundRepository.OutboundOrderRepository.GetStockInfos(outboundOrderDetails.Select(x => x.OrderId).ToList());
+
+                foreach (var item in outboundOrderDetails)
+                {
+                    var outboundOrder = outboundOrders.Where(x => x.Id == item.OrderId).FirstOrDefault();
+                    outboundOrder.Details.RemoveAll(x => x.Id == item.Id);
+                    outboundOrder.Details.Add(item);
+                    outboundOrder.OrderStatus = outboundOrder.Details.FirstOrDefault
+                                (x => x.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt()) != null
+                                ? OutboundStatusEnum.鍑哄簱涓�.ObjToInt() : OutboundStatusEnum.鏈紑濮�.ObjToInt();
+                    //var outboundOrder = _outboundRepository.OutboundOrderRepository.QueryFirst(x => x.Id == item.OrderId);
+                    //if (!outboundOrders.Any(x => x.Id == item.OrderId))
+                    //{
+                    //    var outboundOrder = _outboundRepository.OutboundOrderRepository.GetStockInfo(item.OrderId);
+                    //    if (outboundOrder != null)
+                    //    {
+                    //        outboundOrder.Details.RemoveAll(x => x.Id == item.Id);
+                    //        outboundOrder.Details.Add(item);
+                    //        outboundOrder.OrderStatus = outboundOrder.Details.FirstOrDefault
+                    //            (x => x.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt()) != null
+                    //            ? OutboundStatusEnum.鍑哄簱涓�.ObjToInt() : OutboundStatusEnum.鏈紑濮�.ObjToInt();
+                    //        outboundOrders.Add(outboundOrder);
+                    //    }
+                    //}
+                }
+                _outboundRepository.OutboundOrderRepository.UpdateData(outboundOrders);
+                BaseDal.UpdateData(outboundOrderDetails);
+                #endregion
+
+                #region 娣诲姞鍑哄簱璇︽儏
                 List<Dt_OutStockLockInfo> addOutStockLockInfos = outStockLockInfos.Where(x => x.Id == 0).ToList();
                 if (addOutStockLockInfos != null && addOutStockLockInfos.Any())
                 {
                     _outStockLockInfoService.Repository.AddData(addOutStockLockInfos);
                 }
+                #endregion
+
+                #region 淇敼鍑哄簱璇︽儏
                 List<Dt_OutStockLockInfo> updateOutStockLockInfos = outStockLockInfos.Where(x => x.Id > 0).ToList();
                 if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any())
                 {
                     _outStockLockInfoService.Repository.UpdateData(updateOutStockLockInfos);
                 }
-
+                #endregion
+                //娣诲姞璐т綅淇℃伅鍙樻洿
                 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus.ObjToInt(), StockChangeType.Outbound.ObjToInt(), "", tasks?.Select(x => x.TaskNum).ToList());
                 _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
                 return WebResponseContent.Instance.OK();
@@ -299,7 +416,11 @@
             }
             return (true, "鎴愬姛");
         }
-
+        /// <summary>
+        /// 鎾ら攢鍒嗛厤
+        /// </summary>
+        /// <param name="orderDetailId"></param>
+        /// <returns></returns>
         public WebResponseContent RevokeLockOutboundStock(int orderDetailId)
         {
             Dt_OutboundOrderDetail outboundOrderDetail = BaseDal.QueryFirst(x => x.Id == orderDetailId);

--
Gitblit v1.9.3