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 |  670 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 670 insertions(+), 0 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"
new file mode 100644
index 0000000..258aa0d
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs"
@@ -0,0 +1,670 @@
+锘縩amespace WIDESEA_StorageOutOrderServices;
+
+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,
+                              IDt_OutOrderProductionService outOrderProductionService,
+                              IDt_OutOrderProductionDetailService outOrderProductionDetailService,
+                              IDt_OutOrderDtailService outOrderDtailService,
+                              IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository,
+                              IDt_OutOrderTransferRepository outOrderTransferRepository,
+                              IDt_MaterielInfoRepository materielInfoRepository,
+                              IDt_BillGroupStockRepository billGroupStockRepository,
+                              IDt_OutOrderAndStockRepository outOrderAndStockRepository,
+                              IDt_TaskRepository taskRepository) : base(BaseDal)
+    {
+        _unitOfWorkManage = unitOfWorkManage;
+        _outOrderProductionService = outOrderProductionService;
+        _outOrderProductionDetailService = outOrderProductionDetailService;
+        _outOrderDtailService = outOrderDtailService;
+        _OutOrderTransferDetailRepository = outOrderTransferDetailRepository;
+        _OutOrderTransferRepository = outOrderTransferRepository;
+        _materielInfoRepository = materielInfoRepository;
+        _billGroupStockRepository = billGroupStockRepository;
+        _outOrderAndStockRepository = outOrderAndStockRepository;
+        _taskRepository = taskRepository;
+    }
+
+    /// <summary>
+    /// 娣诲姞鐢熶骇鍑哄簱鍗�
+    /// </summary>
+    /// <param name="model">鍑哄簱鏁版嵁</param>
+    /// <returns>鎴愬姛鎴栧け璐�</returns>
+    public WebResponseContent AddOutOrderProduction(SaveModel model)
+    {
+        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
+            {
+                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));
+        }
+    }
+
+    /// <summary>
+    /// 娣诲姞璋冩嫧鍑哄簱鍗�
+    /// </summary>
+    /// <param name="model">鍑哄簱鏁版嵁</param>
+    /// <returns>鎴愬姛鎴栧け璐�</returns>
+    public WebResponseContent AddOutOrderTransfer(SaveModel model)
+    {
+        WebResponseContent content = new WebResponseContent();
+        try
+        {
+            // 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
+            {
+                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);
+        }
+    }
+
+    /// <summary>
+    /// 鏍规嵁鍑哄簱鍗曞彿鏌ヨ鍑哄簱璁㈠崟
+    /// </summary>
+    /// <param name="orderNumber">鍑哄簱鍗曞彿</param>
+    /// <returns>鍑哄簱璁㈠崟</returns>
+    public WebResponseContent GetOutOrderByNumber(string orderNumber)
+    {
+        WebResponseContent content = new WebResponseContent();
+        var order = Db.Queryable<Dt_OutOrder>()
+             .Includes(x => x.OrderDetailList)
+             .Where(x => x.OrderNumber == orderNumber).First();
+        if (order == null)
+            content.Error($"璁㈠崟缂栧彿{orderNumber}鏌ヨ涓虹┖");
+        else
+            content.OK("鏌ヨ鎴愬姛", order);
+        return content;
+    }
+
+    /// <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> OutOrderUpdatedAsync(Dt_OutOrder 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 绉佹湁鏂规硶
+
+    #region 鐢熶骇鍑哄簱鍗�
+
+    /// <summary>
+    /// 鏍规嵁涓绘暟鎹瀯寤虹敓浜у嚭搴撳崟瀵硅薄銆�
+    /// </summary>
+    private Dt_OutOrderProduction CreateProductionOrder(Dictionary<string, object> mainData)
+    {
+        return new Dt_OutOrderProduction
+        {
+            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
+            WarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
+            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,
+        };
+    }
+
+    /// <summary>
+    /// 鏍规嵁鏄庣粏鏁版嵁鍜岀敓浜у嚭搴撳崟ID鏋勫缓鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛ㄣ��
+    /// </summary>
+    private List<Dt_OutOrderProductionDetail> CreateProductionDetails(List<Dictionary<string, object>> detailData)
+    {
+        var details = new List<Dt_OutOrderProductionDetail>();
+        foreach (var item in detailData)
+        {
+            var detail = new Dt_OutOrderProductionDetail
+            {
+                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
+                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
+                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);
+        }
+        return details;
+    }
+
+    /// <summary>
+    /// 鏍规嵁鐢熶骇鍑哄簱鍗曞璞″拰鐢熶骇鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曞璞°��
+    /// </summary>
+    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderProduction production)
+    {
+        return new Dt_OutOrder
+        {
+            Status = production.Status,
+            CreateDate = DateTime.Now,
+            Creater = production.Creater,
+            OrderDate = DateTime.Now,
+            OrderNumber = production.OrderNumber,
+            Remarks = production.Remarks,
+            CreateID = 1,
+            WarehouseId = production.WarehouseId,
+        };
+    }
+
+    /// <summary>
+    /// 鏍规嵁鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛ㄥ拰绯荤粺鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛ㄣ��
+    /// </summary>
+    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderProductionDetail> productionDetails)
+    {
+        var orderDetails = new List<Dt_OutOrderDetail>();
+        foreach (var item in productionDetails)
+        {
+            var detail = new Dt_OutOrderDetail
+            {
+                AllocatedQuantity = 0,
+                BatchNumber = item.BatchNumber,
+                CompletedQuantity = 0,
+                CreateDate = item.CreateDate,
+                Creater = item.Creater,
+                MaterialId = item.MaterialId,
+                OutboundQuantity = item.Quantity,
+                Remarks = item.Remarks,
+                CreateID = 1,
+                MaterialName = item.Remarks // 鐗╂枡鍚嶇О
+            };
+            orderDetails.Add(detail);
+        }
+        return orderDetails;
+    }
+
+    #endregion 鐢熶骇鍑哄簱鍗�
+
+    #region 璋冩嫧鍑哄簱鍗�
+
+    /// <summary>
+    /// 鏍规嵁涓绘暟鎹瀯寤鸿皟鎷ㄥ嚭搴撳崟瀵硅薄銆�
+    /// </summary>
+    private Dt_OutOrderTransfer CreateTransferOrder(Dictionary<string, object> mainData)
+    {
+        return new Dt_OutOrderTransfer
+        {
+            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
+            SourceWarehouseId = mainData.GetValueOrDefault("SourceWarehouseId")?.ObjToInt() ?? 0,
+            DestinationWarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
+            Status = (int)OutOrderTypeEnum.Allocate,
+            CreateID = 1,
+            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
+            Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
+            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
+            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now,
+        };
+    }
+
+    /// <summary>
+    /// 鏍规嵁鏄庣粏鏁版嵁鍜岃皟鎷ㄥ嚭搴撳崟ID鏋勫缓璋冩嫧鍑哄簱鍗曟槑缁嗗垪琛ㄣ��
+    /// </summary>
+    private List<Dt_OutOrderTransferDetail> CreateTransferDetails(List<Dictionary<string, object>> detailData)
+    {
+        var details = new List<Dt_OutOrderTransferDetail>();
+        foreach (var item in detailData)
+        {
+            var detail = new Dt_OutOrderTransferDetail
+            {
+                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
+                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
+                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);
+        }
+        return details;
+    }
+
+    /// <summary>
+    /// 鏍规嵁鐢熶骇鍑哄簱鍗曞璞″拰鐢熶骇鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曞璞°��
+    /// </summary>
+    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderTransfer transfer)
+    {
+        return new Dt_OutOrder
+        {
+            Status = transfer.Status,
+            CreateDate = DateTime.Now,
+            Creater = transfer.Creater,
+            CreateID = 1,
+            OrderDate = DateTime.Now,
+            OrderNumber = transfer.OrderNumber,
+            Remarks = transfer.Remarks,
+            WarehouseId = transfer.SourceWarehouseId,
+        };
+    }
+
+    /// <summary>
+    /// 鏍规嵁鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛ㄥ拰绯荤粺鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛ㄣ��
+    /// </summary>
+    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderTransferDetail> transferDetails)
+    {
+        var orderDetails = new List<Dt_OutOrderDetail>();
+        foreach (var item in transferDetails)
+        {
+            var detail = new Dt_OutOrderDetail
+            {
+                AllocatedQuantity = 0,
+                BatchNumber = item.BatchNumber,
+                CompletedQuantity = 0,
+                CreateDate = item.CreateDate,
+                Creater = item.Creater,
+                CreateID = 1,
+                MaterialId = item.MaterialId,
+                OutboundQuantity = item.Quantity,
+                Remarks = item.Remarks,
+                MaterialName = item.Remarks // 鐗╂枡鍚嶇О
+            };
+            orderDetails.Add(detail);
+        }
+        return orderDetails;
+    }
+
+    #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