From 966d1fe6077c885db064fcea98bb48cbccb464d6 Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期一, 14 十月 2024 17:23:02 +0800
Subject: [PATCH] WCS

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs |  346 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 333 insertions(+), 13 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs"
index 551b0a2..258aa0d 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs"
@@ -2,12 +2,17 @@
 
 public class Dt_OutOrderService : ServiceBase<Dt_OutOrder, IDt_OutOrderRepository>, IDt_OutOrderService
 {
+    private readonly LogFactory LogFactory = new LogFactory();
     private readonly IUnitOfWorkManage _unitOfWorkManage;
     private readonly IDt_OutOrderProductionService _outOrderProductionService;
     private readonly IDt_OutOrderProductionDetailService _outOrderProductionDetailService;
     private readonly IDt_OutOrderDtailService _outOrderDtailService;
     private readonly IDt_OutOrderTransferRepository _OutOrderTransferRepository;
     private readonly IDt_OutOrderTransferDetailRepository _OutOrderTransferDetailRepository;
+    private readonly IDt_MaterielInfoRepository _materielInfoRepository;
+    private readonly IDt_BillGroupStockRepository _billGroupStockRepository;
+    private readonly IDt_OutOrderAndStockRepository _outOrderAndStockRepository;
+    private readonly IDt_TaskRepository _taskRepository;
 
     public Dt_OutOrderService(IDt_OutOrderRepository BaseDal,
                               IUnitOfWorkManage unitOfWorkManage,
@@ -15,7 +20,11 @@
                               IDt_OutOrderProductionDetailService outOrderProductionDetailService,
                               IDt_OutOrderDtailService outOrderDtailService,
                               IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository,
-                              IDt_OutOrderTransferRepository outOrderTransferRepository) : base(BaseDal)
+                              IDt_OutOrderTransferRepository outOrderTransferRepository,
+                              IDt_MaterielInfoRepository materielInfoRepository,
+                              IDt_BillGroupStockRepository billGroupStockRepository,
+                              IDt_OutOrderAndStockRepository outOrderAndStockRepository,
+                              IDt_TaskRepository taskRepository) : base(BaseDal)
     {
         _unitOfWorkManage = unitOfWorkManage;
         _outOrderProductionService = outOrderProductionService;
@@ -23,6 +32,10 @@
         _outOrderDtailService = outOrderDtailService;
         _OutOrderTransferDetailRepository = outOrderTransferDetailRepository;
         _OutOrderTransferRepository = outOrderTransferRepository;
+        _materielInfoRepository = materielInfoRepository;
+        _billGroupStockRepository = billGroupStockRepository;
+        _outOrderAndStockRepository = outOrderAndStockRepository;
+        _taskRepository = taskRepository;
     }
 
     /// <summary>
@@ -35,51 +48,76 @@
         WebResponseContent content = new WebResponseContent();
         try
         {
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "璇锋眰", JsonConvert.SerializeObject(model));
             // 1. 鏋勫缓鐢熶骇鍑哄簱鍗曞璞�
             var production = CreateProductionOrder(model.MainData);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓鐢熶骇鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(production));
 
             // 2. 鏋勫缓鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛�
             var productionDetails = CreateProductionDetails(model.DetailData);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓鐢熶骇鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(productionDetails));
 
             // 3. 鏋勫缓绯荤粺鍑哄簱鍗曞璞�
             var order = CreateSystemOrder(production);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(order));
 
             // 4. 鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛�
             var orderDetails = CreateSystemOrderDetails(productionDetails);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(orderDetails));
 
             // 寮�鍚簨鍔�
             _unitOfWorkManage.BeginTran();
+
             // 5. 娣诲姞鐢熶骇鍑哄簱鍗曞苟鑾峰彇涓婚敭ID
             var productionId = _outOrderProductionService.AddOrderProduction(production);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞鐢熶骇鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", productionId);
 
             // 6. 鐢熶骇鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D
             productionDetails.ForEach(item => { item.ProductionOutOrderId = productionId; });
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鐢熶骇鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", productionId);
 
             // 7. 娣诲姞鐢熶骇鍑哄簱鍗曟槑缁�
             var detailAddResult = _outOrderProductionDetailService.AddData(productionDetails);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞鐢熶骇鍑哄簱鍗曟槑缁�", detailAddResult.Status);
 
             // 8. 绯荤粺鍑哄簱鍗曠粦瀹氱敓浜у嚭搴撳崟ID
             order.UpperOutOrderId = productionId;
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曠粦瀹氱敓浜у嚭搴撳崟ID", productionId);
 
             // 9. 娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID
             var orderId = BaseDal.AddData(order);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", orderId);
 
             // 10 . 绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D
             orderDetails.ForEach(item => { item.OutOrderId = orderId; });
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", orderId);
 
             // 11. 娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉
             content = _outOrderDtailService.AddData(orderDetails);
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉", content.Status);
+
             if (content.Status && productionId > 0 && detailAddResult.Status && orderId > 0)
+            {
+                LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鎵�鏈夋搷浣滄墽琛屽畬鎴愭彁浜や簨鍔�", "鏃犲弬鏁�");
                 _unitOfWorkManage.CommitTran(); // 鎻愪氦浜嬪姟
+            }
             else
-                throw new Exception("鍑哄簱鍗曟坊鍔犲け璐�");
+            {
+                LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�", $"绯荤粺鍑哄簱鍗曟槑缁�:{content.Status},娣诲姞绯荤粺鍑哄簱鍗�:{orderId > 0},鐢熶骇鍑哄簱鍗�:{productionId > 0},鐢熶骇鍑哄簱鍗曟槑缁�:{detailAddResult.Status}");
+                throw new Exception("鍑哄簱鍗曟坊鍔犲け璐�" + $"绯荤粺鍑哄簱鍗曟槑缁�:{content.Status},娣诲姞绯荤粺鍑哄簱鍗�:{orderId > 0},鐢熶骇鍑哄簱鍗�:{productionId > 0},鐢熶骇鍑哄簱鍗曟槑缁�:{detailAddResult.Status}");
+            }
 
             return content;
         }
         catch (Exception ex)
         {
             _unitOfWorkManage.RollbackTran(); // 鍥炴粴浜嬪姟
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, $"绯荤粺寮傚父锛屽紓甯镐俊鎭細{ex.Message}", "鏃犲弬鏁�");
             return content.Error(ex.Message);
+        }
+        finally
+        {
+            LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鍝嶅簲", JsonConvert.SerializeObject(content));
         }
     }
 
@@ -95,48 +133,67 @@
         {
             // 1. 鏋勫缓璋冩嫧鍑哄簱鍗曞璞�
             var transfer = CreateTransferOrder(model.MainData);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓璋冩嫧鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(transfer));
 
             // 2. 鏋勫缓璋冩嫧鍑哄簱鍗曟槑缁嗗垪琛�
             var transferDetail = CreateTransferDetails(model.DetailData);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓璋冩嫧鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(transferDetail));
 
             // 3. 鏋勫缓绯荤粺鍑哄簱鍗曞璞�
             var order = CreateSystemOrder(transfer);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(order));
 
             // 4. 鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛�
             var orderDetails = CreateSystemOrderDetails(transferDetail);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(orderDetails));
 
             // 娣诲姞浜嬪姟
             _unitOfWorkManage.BeginTran();
 
             // 5. 娣诲姞璋冩嫧鍑哄簱鍗曞苟鑾峰彇涓婚敭ID
             var transferId = _OutOrderTransferRepository.AddData(transfer);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞璋冩嫧鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", transferId);
 
             // 6. 璋冩嫧鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D
             transferDetail.ForEach(item => { item.TransferOutOrderId = transferId; });
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "璋冩嫧鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", transferId);
 
             // 7. 娣诲姞鐢熶骇鍑哄簱鍗曟槑缁�
             var detailAddResult = _OutOrderTransferDetailRepository.AddData(transferDetail);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞鐢熶骇鍑哄簱鍗曟槑缁�", detailAddResult);
 
             // 8. 绯荤粺鍑哄簱鍗曠粦瀹氳皟鎷ㄥ嚭搴撳崟ID
             order.UpperOutOrderId = transferId;
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曠粦瀹氳皟鎷ㄥ嚭搴撳崟ID", transferId);
 
             // 9. 娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID
             var orderId = BaseDal.AddData(order);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", orderId);
 
             // 10 . 绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D
             orderDetails.ForEach(item => { item.OutOrderId = orderId; });
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", orderId);
 
             // 11. 娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉
             content = _outOrderDtailService.AddData(orderDetails);
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉", content.Status);
+
             if (content.Status && transferId > 0 && detailAddResult > 0 && orderId > 0)
+            {
+                LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鎵�鏈夋搷浣滄墽琛屽畬鎴愭彁浜や簨鍔�", "鏃犲弬鏁�");
                 _unitOfWorkManage.CommitTran(); // 鎻愪氦浜嬪姟
+            }
             else
-                throw new Exception("鍑哄簱鍗曟坊鍔犲け璐�");
+            {
+                LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�", $"绯荤粺鍑哄簱鍗曟槑缁�:{content.Status},娣诲姞绯荤粺鍑哄簱鍗�:{orderId > 0},鐢熶骇鍑哄簱鍗�:{transferId > 0},鐢熶骇鍑哄簱鍗曟槑缁�:{detailAddResult > 0}");
+                throw new Exception("娣诲姞璋冩嫧鍑哄簱鍗�");
+            }
             return content;
         }
         catch (Exception ex)
         {
             _unitOfWorkManage.RollbackTran(); // 鍥炴粴浜嬪姟
+            LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, $"绯荤粺寮傚父锛屽紓甯镐俊鎭細{ex.Message}", "鏃犲弬鏁�");
             return content.Error(ex.Message);
         }
     }
@@ -160,14 +217,163 @@
     }
 
     /// <summary>
+    /// 鏍规嵁璁㈠崟鍒嗛厤鍑哄簱搴撳瓨
+    /// </summary>
+    /// <param name="orderNo">璁㈠崟缂栧彿</param>
+    /// <returns></returns>
+    public async Task<WebResponseContent> GetOutboundStockAsync(string orderNo)
+    {
+        WebResponseContent content = new WebResponseContent();
+        try
+        {
+            // 鑾峰彇璁㈠崟
+            var order = await BaseDal.GetOutOrderByNumberAsync(orderNo);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鏍规嵁璁㈠崟缂栧彿鑾峰彇璁㈠崟鏁版嵁", JsonConvert.SerializeObject(order));
+
+            // 妫�鏌ヨ鍗曟槸鍚﹁幏鍙栨垚鍔�
+            if (order == null)
+            {
+                return content.Error("鑾峰彇璁㈠崟澶辫触");
+            }
+
+            // 鑾峰彇璁㈠崟涓殑绗竴涓墿鏂欑紪鍙�
+            var materielInfo = await _materielInfoRepository.QueryFirstAsync(x => x.MaterielID == order.OrderDetailList.MaterialId);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鑾峰彇璁㈠崟鐗╂枡缂栧彿", JsonConvert.SerializeObject(materielInfo));
+
+            #region 鍏堝叆鍏堝嚭
+
+            // 鑾峰彇璇ョ墿鏂欐墍鏈夊彲鍑哄簱搴撳瓨
+            var filteredStocks = _billGroupStockRepository.GetOutboundStockList(materielInfo.MaterielCode)
+                .OrderBy(x => x.CreateDate).ToList();
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鑾峰彇璇ョ墿鏂欐墍鏈夊彲鍑哄簱搴撳瓨", JsonConvert.SerializeObject(filteredStocks));
+
+            #endregion 鍏堝叆鍏堝嚭
+
+            #region 鏌ユ壘闈犺繎鍑哄簱鍙e簱瀛�
+
+            // 榛樿鍒楄秺澶ц秺闈犺繎鍑哄簱鍙�
+            filteredStocks = filteredStocks.OrderByDescending(x => x.LocationInfo.Column).OrderBy(x => x.CreateDate).ToList();
+
+            #endregion 鏌ユ壘闈犺繎鍑哄簱鍙e簱瀛�
+
+            #region 涓�娣变綅浼樺厛鏌ユ壘锛屽啀鏌ユ壘鍚屽垪浜屾繁浣�
+
+            filteredStocks = PickStocks(filteredStocks);
+
+            #endregion 涓�娣变綅浼樺厛鏌ユ壘锛屽啀鏌ユ壘鍚屽垪浜屾繁浣�
+
+            // 鍒涘缓浠诲姟鍒楄〃
+            var (tasks, updateOrder, stock) = CreateTasks(order, filteredStocks);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鍒涘缓浠诲姟鍒楄〃锛屼慨鏀硅鍗曞垎閰嶆暟閲忥紝鑾峰彇鍑哄簱鍒嗛厤搴撳瓨",
+                $"浠诲姟鍒楄〃:{JsonConvert.SerializeObject(tasks)},璁㈠崟鍒楄〃锛歿JsonConvert.SerializeObject(updateOrder)},宸插垎閰嶅簱瀛橈細{JsonConvert.SerializeObject(stock)}");
+
+            // 鏇存柊搴撳瓨鐘舵��
+            var stockList = UpdateStocks(stock);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鏇存柊搴撳瓨鐘舵��", JsonConvert.SerializeObject(stockList));
+
+            // 鍒涘缓璁㈠崟搴撳瓨鍒楄〃
+            List<Dt_OutOrderAndStock>? orderStocks = CreateOrderStock(stock, updateOrder);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鍒涘缓璁㈠崟搴撳瓨鍒楄〃", JsonConvert.SerializeObject(orderStocks));
+
+            // 寮�濮嬩簨鍔�
+            _unitOfWorkManage.BeginTran();
+
+            // 鏇存柊搴撳瓨
+            var isStockUpdated = _billGroupStockRepository.UpdateNavStock(stockList);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟鏇存柊搴撳瓨", isStockUpdated);
+
+            // 鏇存柊璁㈠崟
+            var isOrderUpdated = await BaseDal.OutOrderUpdatedAsync(updateOrder);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟鏇存柊璁㈠崟", isOrderUpdated);
+
+            //娣诲姞璁㈠崟搴撳瓨
+            var isOrderStockCread = await _outOrderAndStockRepository.AddDataAsync(orderStocks) > 0;
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟娣诲姞璁㈠崟搴撳瓨", isOrderStockCread);
+
+            // 鍒涘缓浠诲姟
+            var isTaskCreated = await _taskRepository.Create(tasks);
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟鍒涘缓浠诲姟", isTaskCreated);
+
+            // 鎻愪氦鎴栧洖婊氫簨鍔�
+            if (isStockUpdated && isTaskCreated && isOrderUpdated && isOrderStockCread)
+            {
+                LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鏁版嵁澶勭悊瀹屾垚锛屾彁浜や簨鍔�", "鏃犲弬鏁�");
+                _unitOfWorkManage.CommitTran();
+            }
+            else
+            {
+                LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�,鏁版嵁鍥炴粴", $"鏇存柊搴撳瓨:{isStockUpdated},鏇存柊璁㈠崟:{isOrderUpdated},娣诲姞璁㈠崟搴撳瓨:{isOrderStockCread},鍒涘缓浠诲姟:{isTaskCreated}");
+                _unitOfWorkManage.RollbackTran();
+                throw new Exception("娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�,鏁版嵁鍥炴粴");
+            }
+
+            return content.OK(data: orderStocks);
+        }
+        catch (Exception ex)
+        {
+            _unitOfWorkManage.RollbackTran();
+            LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, $"绯荤粺寮傚父锛屽紓甯镐俊鎭細{ex.Message}", "鏃犲弬鏁�");
+            return content.Error(ex.Message);
+        }
+    }
+
+    /// <summary>
     /// 淇敼鍑哄簱璁㈠崟锛堝鑸慨鏀癸級
     /// </summary>
     /// <param name="outOrder"></param>
     /// <returns>鏄惁鎴愬姛</returns>
-    public async Task<bool> OutOrderUpdated(Dt_OutOrder outOrder)
+    public async Task<bool> OutOrderUpdatedAsync(Dt_OutOrder outOrder)
     {
-        return await BaseDal.OutOrderUpdated(outOrder);
+        return await BaseDal.OutOrderUpdatedAsync(outOrder);
     }
+
+    #region 鍐呴儴璋冪敤
+
+    /// <summary>
+    /// 涓�娣变綅浼樺厛鏌ユ壘
+    /// </summary>
+    /// <param name="filteredStocks">鍙嚭搴撳簱瀛�</param>
+    /// <returns>鎺掑簭濂界殑鍑哄簱搴撳瓨</returns>
+    public List<Dt_BillGroupStock> PickStocks(List<Dt_BillGroupStock> filteredStocks)
+    {
+        var oneDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == "涓�娣变綅").ToList();
+        var twoDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == "浜屾繁浣�").ToList();
+
+        var results = new List<Dt_BillGroupStock>();
+        foreach (var oneDepth in oneDepthList)
+        {
+            // 灏� Line 瀛楃涓茶浆鎹负鏁存暟
+            if (!int.TryParse(oneDepth.LocationInfo.Line, out int oneDepthLine))
+            {
+                continue; // 濡傛灉杞崲澶辫触锛岃烦杩囪繖涓褰�
+            }
+
+            // 璁$畻鐩稿琛�
+            int relativeLine = oneDepthLine % 2 == 1 ? oneDepthLine + 1 : oneDepthLine - 1;
+
+            // 鏌ユ壘鏈�鎺ヨ繎鐨勪簩娣变綅璁板綍
+            var closestTwoDepth = twoDepthList
+                .Where(t => t.LocationInfo.Line == relativeLine.ToString())
+                .Where(x => x.LocationInfo.Column == oneDepth.LocationInfo.Column)
+                .Where(x => x.LocationInfo.Layer == oneDepth.LocationInfo.Layer)
+                .FirstOrDefault();
+
+            // 濡傛灉鎵惧埌浜嗘渶鎺ヨ繎鐨勪簩娣变綅璁板綍锛屽皢鍏朵笌涓�娣变綅涓�璧锋坊鍔犲埌缁撴灉鍒楄〃
+            if (closestTwoDepth != null)
+            {
+                results.Add(oneDepth);
+                results.Add(closestTwoDepth);
+            }
+            else
+            {
+                // 濡傛灉娌℃湁鎵惧埌鏈�鎺ヨ繎鐨勪簩娣变綅璁板綍锛屽皢涓�娣变綅娣诲姞鍒扮粨鏋滃垪琛�
+                results.Add(oneDepth);
+            }
+        }
+        return results;
+    }
+
+    #endregion 鍐呴儴璋冪敤
 
     #region 绉佹湁鏂规硶
 
@@ -182,8 +388,9 @@
         {
             OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
             WarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
-            Status = mainData.GetValueOrDefault("Status")?.ToString(),
+            Status = (int)OutOrderTypeEnum.Issue,
             Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
+            CreateID = 1,
             Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
             CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
             OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now,
@@ -202,11 +409,10 @@
             {
                 MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                 Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
-                UnitPrice = item.GetValueOrDefault("UnitPrice")?.ObjToDecimal(),
-                TotalPrice = item.GetValueOrDefault("TotalPrice")?.ObjToDecimal(),
                 Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                 CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                 Creater = item.GetValueOrDefault("Creater")?.ToString(),
+                CreateID = 1,
                 BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
             };
             details.Add(detail);
@@ -227,6 +433,7 @@
             OrderDate = DateTime.Now,
             OrderNumber = production.OrderNumber,
             Remarks = production.Remarks,
+            CreateID = 1,
             WarehouseId = production.WarehouseId,
         };
     }
@@ -249,6 +456,7 @@
                 MaterialId = item.MaterialId,
                 OutboundQuantity = item.Quantity,
                 Remarks = item.Remarks,
+                CreateID = 1,
                 MaterialName = item.Remarks // 鐗╂枡鍚嶇О
             };
             orderDetails.Add(detail);
@@ -261,7 +469,7 @@
     #region 璋冩嫧鍑哄簱鍗�
 
     /// <summary>
-    /// 鏍规嵁涓绘暟鎹瀯寤虹敓浜у嚭搴撳崟瀵硅薄銆�
+    /// 鏍规嵁涓绘暟鎹瀯寤鸿皟鎷ㄥ嚭搴撳崟瀵硅薄銆�
     /// </summary>
     private Dt_OutOrderTransfer CreateTransferOrder(Dictionary<string, object> mainData)
     {
@@ -270,7 +478,8 @@
             OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
             SourceWarehouseId = mainData.GetValueOrDefault("SourceWarehouseId")?.ObjToInt() ?? 0,
             DestinationWarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
-            Status = mainData.GetValueOrDefault("Status")?.ToString(),
+            Status = (int)OutOrderTypeEnum.Allocate,
+            CreateID = 1,
             Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
             Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
             CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
@@ -279,7 +488,7 @@
     }
 
     /// <summary>
-    /// 鏍规嵁鏄庣粏鏁版嵁鍜岀敓浜у嚭搴撳崟ID鏋勫缓鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛ㄣ��
+    /// 鏍规嵁鏄庣粏鏁版嵁鍜岃皟鎷ㄥ嚭搴撳崟ID鏋勫缓璋冩嫧鍑哄簱鍗曟槑缁嗗垪琛ㄣ��
     /// </summary>
     private List<Dt_OutOrderTransferDetail> CreateTransferDetails(List<Dictionary<string, object>> detailData)
     {
@@ -290,11 +499,10 @@
             {
                 MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                 Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
-                UnitPrice = item.GetValueOrDefault("UnitPrice")?.ObjToDecimal(),
-                TotalPrice = item.GetValueOrDefault("TotalPrice")?.ObjToDecimal(),
                 Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                 CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                 Creater = item.GetValueOrDefault("Creater")?.ToString(),
+                CreateID = 1,
                 BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
             };
             details.Add(detail);
@@ -312,6 +520,7 @@
             Status = transfer.Status,
             CreateDate = DateTime.Now,
             Creater = transfer.Creater,
+            CreateID = 1,
             OrderDate = DateTime.Now,
             OrderNumber = transfer.OrderNumber,
             Remarks = transfer.Remarks,
@@ -334,6 +543,7 @@
                 CompletedQuantity = 0,
                 CreateDate = item.CreateDate,
                 Creater = item.Creater,
+                CreateID = 1,
                 MaterialId = item.MaterialId,
                 OutboundQuantity = item.Quantity,
                 Remarks = item.Remarks,
@@ -346,5 +556,115 @@
 
     #endregion 璋冩嫧鍑哄簱鍗�
 
+    #region 鍑哄簱鍒嗛厤
+
+    /// <summary>
+    /// 鍒涘缓浠诲姟鍒楄〃
+    /// </summary>
+    /// <param name="order">璁㈠崟瀵硅薄</param>
+    /// <param name="filteredStocks">绛涢�夊悗鐨勫簱瀛樺垪琛�</param>
+    /// <returns>銆愪换鍔″垪琛�,鏇存柊鍒嗛厤鏁伴噺璁㈠崟,鍒涘缓浠诲姟鐨勫簱瀛樸��</returns>
+    private (List<Dt_Task>, Dt_OutOrder, List<Dt_BillGroupStock>) CreateTasks(Dt_OutOrder order, List<Dt_BillGroupStock> filteredStocks)
+    {
+        var tasks = new List<Dt_Task>();
+        var stocks = new List<Dt_BillGroupStock>();
+
+        foreach (var stock in filteredStocks)
+        {
+            // 濡傛灉宸插垎閰嶆暟閲忚揪鍒板嚭搴撴暟閲忥紝鍋滄鍒嗛厤
+            if (order.OrderDetailList.AllocatedQuantity >= order.OrderDetailList.OutboundQuantity)
+                break;
+
+            // 濡傛灉鎵樼洏浠诲姟宸插瓨鍦紝璺宠繃
+            if (_taskRepository.QueryFirst(x => x.PalletCode == stock.PalletCode) != null)
+                continue;
+
+            // 鍒涘缓浠诲姟
+            tasks.Add(new Dt_Task
+            {
+                CreateDate = DateTime.Now, // 鍒涘缓鏃堕棿
+                Creater = App.User.UserName, // 鍒涘缓浜�
+                CurrentAddress = stock.LocationCode, //褰撳墠浣嶇疆
+                Dispatchertime = DateTime.Now, //璋冨害鏃堕棿锛堜换鍔′笅鍙戞椂闂达級
+                Grade = 1, // 绛夌骇
+                InboundNo = stock.OrderNo, //鍗曟嵁缂栧彿
+                MaterialNo = stock.MaterialNo, // 鐗╂枡鍙�
+                NextAddress = stock.LocationCode, // 涓嬩竴浣嶇疆
+                PalletCode = stock.PalletCode, //鎵樼洏鍙�
+                Remark = stock.Remark, //澶囨敞
+                Roadway = stock.LocationInfo.Roadway, //宸烽亾
+                SourceAddress = stock.LocationCode, //鏉ユ簮浣嶇疆
+                TargetAddress = order.OrderDetailList.Remarks, //鐩爣鍦板潃
+                TaskNum = _taskRepository.GetTaskNo().Result, //浠诲姟鍙�
+                TaskState = (int)OutTaskStatusEnum.OutNew, //浠诲姟鐘舵��
+                TaskType = (int)TaskTypeEnum.Outbound, //浠诲姟绫诲瀷
+            });
+
+            // 鏇存柊宸插垎閰嶆暟閲�
+            order.OrderDetailList.AllocatedQuantity += stock.Dt_BillGroupStockDetailList.Sum(x => x.PalletQuantity).Value;
+            stocks.Add(stock);
+        }
+
+        return (tasks, order, stocks);
+    }
+
+    /// <summary>
+    /// 鏇存柊搴撳瓨鐘舵��
+    /// </summary>
+    /// <param name="filteredStocks">绛涢�夊悗鐨勫簱瀛樺垪琛�</param>
+    /// <returns>鏇存柊鍚庣殑搴撳瓨鍒楄〃</returns>
+    private List<Dt_BillGroupStock> UpdateStocks(List<Dt_BillGroupStock> filteredStocks)
+    {
+        var updatedStocks = new List<Dt_BillGroupStock>();
+
+        foreach (var stock in filteredStocks)
+        {
+            // 鏇存柊搴撳瓨鐘舵��
+            stock.LocationInfo.IsLocked = true;
+            stock.LocationInfo.Status = (int)LocationEnum.Lock;
+            stock.State = (int)StockStateEmun.鍑哄簱閿佸畾;
+            updatedStocks.Add(stock);
+        }
+
+        return updatedStocks;
+    }
+
+    /// <summary>
+    /// 鍒涘缓璁㈠崟搴撳瓨鍒楄〃
+    /// </summary>
+    /// <param name="stock">绛涢�夊悗鐨勫簱瀛樺垪琛�</param>
+    /// <param name="order">璁㈠崟瀵硅薄</param>
+    /// <returns>璁㈠崟搴撳瓨鍒楄〃</returns>
+    private List<Dt_OutOrderAndStock> CreateOrderStock(List<Dt_BillGroupStock> stock, Dt_OutOrder order)
+    {
+        var orderStocks = new List<Dt_OutOrderAndStock>();
+        foreach (var item in stock)
+        {
+            orderStocks.Add(new Dt_OutOrderAndStock()
+            {
+                AllocatedQuantity = order.OrderDetailList.AllocatedQuantity,
+                MaterialNo = item.MaterialNo,
+                MaterialName = order.OrderDetailList.MaterialName,
+                OrderNumber = order.OrderNumber,
+                OutboundQuantity = order.OrderDetailList.OutboundQuantity,
+                PalletCode = item.PalletCode,
+                PalletQuantity = item.Dt_BillGroupStockDetailList.Sum(x => x.PalletQuantity),
+                State = item.State,
+                BatchNumber = order.OrderDetailList.BatchNumber,
+                CompletedQuantity = order.OrderDetailList.CompletedQuantity,
+                Creater = App.User.UserName,
+                CreateDate = DateTime.Now,
+                CreateID = App.User.UserId,
+                GroupId = item.GroupId,
+                LocationCode = item.LocationInfo.LocationCode,
+                OutOrderId = order.Id,
+            });
+        }
+
+        return orderStocks;
+    }
+
+    #endregion 鍑哄簱鍒嗛厤
+
     #endregion 绉佹湁鏂规硶
 }
\ No newline at end of file

--
Gitblit v1.9.3