From d0cc37c3c11859cc55f30624692dca55be2b8a32 Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期一, 29 十二月 2025 07:26:51 +0800
Subject: [PATCH] 变更及代码优化

---
 项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs |  223 ++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 186 insertions(+), 37 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs"
index 8217f9e..7e82669 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs"
@@ -299,7 +299,59 @@
             return tasks;
         }
         /// <summary>
-        /// 搴撳瓨鏁版嵁杞嚭搴撲换鍔�(MES宸ュ崟)
+        /// 搴撳瓨鏁版嵁杞嚭搴撲换鍔�(MES宸ュ崟鎴愬搧)
+        /// </summary>
+        /// <param name="stockInfos"></param>
+        /// <returns></returns>
+        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, List<Dt_OutStockLockInfo> outStockLockInfos, TaskTypeEnum taskType = new TaskTypeEnum())
+        {
+            List<Dt_Task> tasks = new List<Dt_Task>();
+            for (int i = 0; i < stockInfos.Count; i++)
+            {
+                Dt_ProStockInfo stockInfo = stockInfos[i];
+
+                if (stockInfo != null)
+                {
+                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
+                    if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
+                    {
+                        Dt_OutStockLockInfo outStockLockInfo = outStockLockInfos.FirstOrDefault(x => x.PalletCode == stockInfo.PalletCode);
+                        taskType = outStockLockInfo.MachineName.ObjToInt() switch
+                        {
+                            (int)StationAreaEnum.浜屾ゼ绾歌 or
+                            (int)StationAreaEnum.浜屾ゼ鏃犵汉甯冭 or
+                            (int)StationAreaEnum.浜屾ゼ绾告澂 => TaskTypeEnum.OutCarton,
+                            (int)StationAreaEnum.涓�妤兼棤绾虹粐甯� => TaskTypeEnum.OutWFB,
+                            _ => throw new Exception($"鏈壘鍒板姞宸ヤ腑蹇冧换鍔$被鍨嬪垎閰�")
+                        };
+                        Dt_Task task = new()
+                        {
+                            CurrentAddress = stockInfo.LocationCode,
+                            Grade = 0,
+                            PalletCode = stockInfo.PalletCode,
+                            NextAddress = "",
+                            Roadway = locationInfo.RoadwayNo,
+                            SourceAddress = stockInfo.LocationCode,
+                            TargetAddress = "",
+                            TaskStatus = TaskStatusEnum.CallPending.ObjToInt(),
+                            TaskType = taskType.ObjToInt(),
+                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
+                            PalletType = stockInfo.PalletType,
+                            WarehouseId = stockInfo.WarehouseId,
+                            MaterielCode = stockInfo.proStockInfoDetails?.FirstOrDefault().ProductCode ??"",
+                            Quantity = stockInfo.proStockInfoDetails?.Sum(x=>x.StockQty) ?? 0,
+                            OrderNo = outStockLockInfo.OrderNo,
+                            DispatchPlanId = outStockLockInfo.OrderDetailId,
+                            WorkCentreCode = outStockLockInfo.MakeCode
+                        };
+                        tasks.Add(task);
+                    }
+                }
+            }
+            return tasks;
+        }
+        /// <summary>
+        /// 搴撳瓨鏁版嵁杞嚭搴撲换鍔�(MES宸ュ崟鍘熸枡)
         /// </summary>
         /// <param name="stockInfos"></param>
         /// <returns></returns>
@@ -320,6 +372,7 @@
                         {
                             (int)StationAreaEnum.浜屾ゼ绾歌 => TaskTypeEnum.PaperYLOutZDGL,
                             (int)StationAreaEnum.涓�妤煎嵃鍒� => TaskTypeEnum.PrintYLOutbound,
+                            (int)StationAreaEnum.涓�妤煎垎鍒� => TaskTypeEnum.OutFenQie,
                             _ => throw new Exception($"鏈壘鍒板姞宸ヤ腑蹇冧换鍔$被鍨嬪垎閰�")
                         };
                         Dt_Task task = new()
@@ -383,7 +436,7 @@
                             PalletType = stockInfo.PalletType,
                             WarehouseId = stockInfo.WarehouseId,
                             MaterielCode= stockInfo.proStockInfoDetails?.FirstOrDefault().ProductCode ?? "" ,
-                            Quantity = 0,
+                            Quantity = stockInfo.proStockInfoDetails?.Sum(x=>x.StockQty) ?? 0,
                         };
                         tasks.Add(task);
                     }
@@ -455,6 +508,7 @@
                     nameof(StationAreaEnum.涓�妤煎垎鍒�) => TaskTypeEnum.OutFenQie,
                     nameof(StationAreaEnum.涓�妤兼ā鍒�) => TaskTypeEnum.OutMoQie,
                     nameof(StationAreaEnum.涓�妤煎啿鍒�) => TaskTypeEnum.OutChongQie,
+                    nameof(StationAreaEnum.涓�妤兼垚鍝�) => TaskTypeEnum.OutProduct,
                     nameof(StationAreaEnum.浜屾ゼ绾歌) or 
                     nameof(StationAreaEnum.浜屾ゼ鏃犵汉甯冭) or 
                     nameof(StationAreaEnum.浜屾ゼ绾告澂) => TaskTypeEnum.OutCarton,
@@ -897,54 +951,98 @@
                 //鎿嶄綔鏁版嵁锛屽苟鍒嗛厤闇�姹傚簱瀛�
                 _outboundRepository.OutMESOrderRepository.AddData(AddoutMESOrders);
                 List<Dt_OutMESOrder> mESOrders = _outboundRepository.OutMESOrderRepository.QueryData(x => AddoutMESOrders.Select(x => x.OutDetailId).Contains(x.OutDetailId));
-                List<Dt_Task> tasks = new List<Dt_Task>();
-                List<Dt_StockInfo>? stockInfos = null;
-                List<Dt_OutMESOrder>? Orders = null;
-                List<Dt_OutStockLockInfo>? outStockLockInfos = null;
-                List<Dt_LocationInfo>? locationInfos = null;
                 {
-                    //鍒嗛厤搴撳瓨
-                    (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignStockOutbound(mESOrders);
-                    if (result.Item1 != null && result.Item1.Count > 0)
+                    List<Dt_Task> tasks = new List<Dt_Task>();
+                    List<Dt_ProStockInfo>? stockInfos = null;
+                    List<Dt_OutMESOrder>? Orders = null;
+                    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
+                    List<Dt_LocationInfo>? locationInfos = null;
                     {
-                        //鍒涘缓浠诲姟
-                        tasks = GetTasks(result.Item1, result.Item3);
-                        result.Item2.ForEach(x =>
+                        if (mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()).ToList().Count>0)
                         {
-                            OutOrderStatusEnum.鍑哄簱涓�.ObjToInt();
-                        });
-                        result.Item3.ForEach(x =>
-                        {
-                            x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
-                        });
+                            //鍒嗛厤搴撳瓨
+                            (List<Dt_ProStockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignProStockOutbound(mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()).ToList());
+                            if (result.Item1 != null && result.Item1.Count > 0)
+                            {
+                                //鍒涘缓浠诲姟
+                                tasks = GetTasks(result.Item1, result.Item3);
+                                result.Item2.ForEach(x =>
+                                {
+                                    OutOrderStatusEnum.鍑哄簱涓�.ObjToInt();
+                                });
+                                result.Item3.ForEach(x =>
+                                {
+                                    x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
+                                });
 
-                        stockInfos = result.Item1;
-                        Orders = result.Item2;
-                        outStockLockInfos = result.Item3;
-                        locationInfos = result.Item4;
+                                stockInfos = result.Item1;
+                                Orders = result.Item2;
+                                outStockLockInfos = result.Item3;
+                                locationInfos = result.Item4;
+                            }
+                        }
                     }
-                    else
+                    if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0 && tasks.Count>0)
                     {
-                        throw new Exception("鏃犲簱瀛�");
+                        BaseDal.AddData(tasks);
+                        stockInfos.ForEach(x =>
+                        {
+                            x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                        });
+                        WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
+
+                        if (!contentResponse.Status)
+                        {
+                            _unitOfWorkManage.RollbackTran();
+                            return content.Error(contentResponse.Message);
+                        }
                     }
                 }
-                int id = BaseDal.AddData(tasks);
-
-                if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
                 {
-                    stockInfos.ForEach(x =>
+                    List<Dt_Task> tasks = new List<Dt_Task>();
+                    List<Dt_StockInfo>? stockInfos = null;
+                    List<Dt_OutMESOrder>? Orders = null;
+                    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
+                    List<Dt_LocationInfo>? locationInfos = null;
                     {
-                        x.StockStatus=StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
-                    });
-                    WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
-
-                    if (!contentResponse.Status)
+                        if (mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt()).ToList().Count > 0)
+                        {
+                            //鍒嗛厤搴撳瓨
+                            (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignStockOutbound(mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt()).ToList());
+                            if (result.Item1 != null && result.Item1.Count > 0)
+                            {
+                                //鍒涘缓浠诲姟
+                                tasks = GetTasks(result.Item1, result.Item3);
+                                result.Item2.ForEach(x =>
+                                {
+                                    OutOrderStatusEnum.鍑哄簱涓�.ObjToInt();
+                                });
+                                result.Item3.ForEach(x =>
+                                {
+                                    x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
+                                });
+                                stockInfos = result.Item1;
+                                Orders = result.Item2;
+                                outStockLockInfos = result.Item3;
+                                locationInfos = result.Item4;
+                            }
+                        }
+                    }
+                    if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0 && tasks.Count>0)
                     {
-                        _unitOfWorkManage.RollbackTran();
-                        return content.Error(contentResponse.Message);
+                        BaseDal.AddData(tasks);
+                        stockInfos.ForEach(x =>
+                        {
+                            x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+                        });
+                        WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
+                        if (!contentResponse.Status)
+                        {
+                            _unitOfWorkManage.RollbackTran();
+                            return content.Error(contentResponse.Message);
+                        }
                     }
                 }
-
                 _unitOfWorkManage.CommitTran();
                 
                 return content.OK("鎺ユ敹鎴愬姛");
@@ -955,5 +1053,56 @@
             }
             return content;
         }
+        /// <summary>
+        /// 绌烘墭鍙犵洏鍑哄簱
+        /// </summary>
+        /// <returns></returns>
+        public WebResponseContent PlateOutbound(string stationCode)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                //鑾峰彇鎵�鏈夋湀鍙板嚭搴撲换鍔�
+                Dt_Task TasksOut = BaseDal.QueryFirst(x => x.TaskType == TaskTypeEnum.OutEmptyPlate.ObjToInt());
+                if (TasksOut != null)
+                    throw new Exception($"浠诲姟宸插瓨鍦�");
+                //鑾峰彇璐т綅
+                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt());
+                Dt_ProStockInfo? stockInfo = BaseDal.Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Select(x => x.LocationCode).Contains(x.LocationCode) && x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() && x.ProStockAttribute == ProStockAttributeEnum.绌烘墭.ObjToInt()).OrderBy(x => x.CreateDate).ToList().FirstOrDefault() ?? throw new Exception($"搴撳瓨绌烘墭鏁伴噺涓嶈冻");
+
+                Dt_LocationInfo locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
+                stockInfo.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+
+                TaskTypeEnum typeEnum = TaskTypeEnum.OutEmptyPlate;
+
+                List<Dt_Task> tasks = GetTasks(new List<Dt_ProStockInfo>() { stockInfo }, typeEnum, new List<Dt_LocationInfo>() { locationInfo });
+                if (tasks == null || tasks.Count <= 0)
+                {
+                    return content.Error($"鐢熸垚浠诲姟澶辫触");
+                }
+                tasks.ForEach(x =>
+                {
+                    x.TargetAddress = stationCode;
+                });
+                //鍒ゆ柇鏄惁鏈夊嚭搴撳崟淇℃伅
+                _unitOfWorkManage.BeginTran();
+                //鏇存柊搴撳瓨鐘舵��
+                _stockRepository.ProStockInfoRepository.UpdateData(stockInfo);
+                //鏇存柊璐т綅鐘舵��
+                _basicRepository.LocationInfoRepository.UpdateLocationStatus(new List<Dt_LocationInfo>() { locationInfo }, LocationStatusEnum.Lock);
+                //鍔犲叆璐т綅鍙樺姩璁板綍
+                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(new List<Dt_LocationInfo>() { locationInfo }, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
+                //鏂板缓浠诲姟
+                BaseDal.AddData(tasks);
+                _unitOfWorkManage.CommitTran();
+                PushTasksToWCS(tasks);
+                content.OK();
+            }
+            catch (Exception ex)
+            {
+                content.Error(ex.Message);
+            }
+            return content;
+        }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3