From d8c0f4088dd1619279f6f894766a28bb0ecfe0a4 Mon Sep 17 00:00:00 2001
From: pengmn <pmn@HanInfo>
Date: 星期五, 04 七月 2025 17:21:12 +0800
Subject: [PATCH] 1

---
 HH.WCS.Mobox3.HangYang/process/TaskProcess.cs |  745 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 524 insertions(+), 221 deletions(-)

diff --git a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
index 178735f..cbb716f 100644
--- a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
+++ b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
@@ -12,6 +12,7 @@
 using Swashbuckle.Swagger;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Reflection;
 using System.Security.Cryptography;
@@ -373,9 +374,9 @@
         }
 
         /// <summary>
-        /// 鍏ュ簱鍗曟柊澧�+        /// 鏉哀鐗╂枡涓绘暟鎹柊澧炴帴鍙�         /// </summary>
-        /// <param name="model">鍏ュ簱鍗�/param>
+        /// <param name="model">鐗╂枡涓绘暟鎹�/param>
         /// <returns></returns>
         public static Result GetMaterialData(List<MES_Material> model)
         {
@@ -384,44 +385,25 @@
             {
                 if (model == null)
                 {
-                    result.errMsg = "鍏ュ簱鍗曚笉鍙负绌哄�锛�;
+                    result.errMsg = "鐗╂枡涓绘暟鎹笉鍙负绌哄�锛�;
                     return result;
                 }
+                var materialList = new List<TN_Material>();
 
-                //foreach (var item in model.InOrderDetail)
-                //{
-                //    var itemType = WMSHelper.GetItemType(item.S_ITEM_CODE);
-                //    if (itemType == null)
-                //    {
-                //        result.errMsg = $"鏈煡璇㈠埌鐗╂枡{item.S_ITEM_CODE}鐨勭墿鏂欏睘鎬э紒";
-                //        return result;
-                //    }
-                //    item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE;
-                //}
-
-                //var groupedInOrders = model.InOrderDetail
-                //                      .GroupBy(detail => detail.S_EXT_ATTR1) // 鎸夌墿鏂欏睘鎬у垎缁�-                //                      .Select((group, index) => new InOrder
-                //                      {
-                //                          S_NO = $"{model.S_BS_NO}_{index + 1}", // 鎷兼帴鏉ユ簮鍗曞彿
-                //                          S_BS_NO = model.S_BS_NO,
-                //                          S_OP_TYPE = model.S_OP_TYPE,
-                //                          S_BS_TYPE = model.S_BS_TYPE,
-                //                          S_NOTE = model.S_NOTE,
-                //                          InOrderDetail = group.Select(detail =>
-                //                          {
-                //                              // 淇敼 group 涓殑 S_IO_NO 瀛楁涓�S_NO 鐨勫�
-                //                              detail.S_IO_NO = $"{model.S_BS_NO}_{index + 1}";
-                //                              detail.S_BS_NO = model.S_BS_NO;
-                //                              return detail;
-                //                          }).ToList() // 鍒嗙粍鍚庣殑鏄庣粏
-                //                      })
-                //                      .ToList();
-                //var res = WMSHelper.CreateOrderIn(groupedInOrders);
-                //if (res)
-                //{
-                //    result.success = true;
-                //}
+                foreach (var item in model)
+                {
+                    materialList.Add(new TN_Material
+                    {
+                        S_ITEM_CODE = item.S_ITEM_CODE,
+                        S_ITEM_NAME = item.S_ITEM_NAME,
+                        S_AREA_CODE = item.S_AREA_CODE,
+                        S_ITEM_SPEC = item.S_MATERIAL_SPEC,
+                        S_MATERIAL = item.S_MATERIAL,
+                        S_UOM = item.S_UOM,
+                        C_CLEAN = item.C_CLEAN,
+                    });
+                }
+                WMSHelper.CreateMaterialData(materialList);
                 return result;
             }
             catch (Exception ex)
@@ -432,7 +414,7 @@
                 var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
                 if (frame != null)
                 {
-                    LogHelper.Error($"GetInboundOrder鍏ュ簱鍗曟柊澧炲嚭鐜伴敊璇紒锛�, ex);
+                    LogHelper.Error($"GetMaterialData鐗╂枡涓绘暟鎹柊澧炲嚭鐜伴敊璇紒锛�, ex);
                     LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
                     LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
                     LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
@@ -443,7 +425,7 @@
         }
 
         /// <summary>
-        /// 鍏ュ簱鍗曟柊澧�+        /// 鍏ュ簱鍗曟柊澧炰互鍙婁慨鏀�         /// </summary>
         /// <param name="model">鍏ュ簱鍗�/param>
         /// <returns></returns>
@@ -466,7 +448,7 @@
                         result.errMsg = $"鏈煡璇㈠埌鐗╂枡{item.S_ITEM_CODE}鐨勭墿鏂欏睘鎬э紒";
                         return result;
                     }
-                    item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE;
+                    item.S_EXT_ATTR1 = itemType.S_AREA_CODE;
                     item.S_ITEM_NAME = itemType.S_ITEM_NAME;
                 }
 
@@ -517,9 +499,9 @@
         }
 
         /// <summary>
-        /// 鍑哄簱鍗曟柊澧�+        /// 鍑哄簱鍗曟柊澧炰互鍙婁慨鏀�         /// </summary>
-        /// <param name="model">鍏ュ簱鍗�/param>
+        /// <param name="model">鍑哄簱鍗�/param>
         /// <returns></returns>
         public static Result GetOutboundOrder(OutOrder model)
         {
@@ -541,7 +523,7 @@
                         result.errMsg = $"鏈煡璇㈠埌鐗╂枡{item.S_ITEM_CODE}鐨勭墿鏂欏睘鎬э紒";
                         return result;
                     }
-                    item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE;
+                    item.S_EXT_ATTR1 = itemType.S_AREA_CODE;
                     item.S_ITEM_NAME = itemType.S_ITEM_NAME;
                     item.C_CLEAN = itemType.C_CLEAN;
                 }
@@ -598,6 +580,85 @@
                 return result;
             }
         }
+
+        /// <summary>
+        /// 鍏ュ簱鍗曞彇娑�+        /// </summary>
+        /// <param name="model">鍏ュ簱鍗�/param>
+        /// <returns></returns>
+        public static Result CancelInboundOrder(InOrderCancel model)
+        {
+            Result result = new Result() { success = false, };
+            try
+            {
+                if (model == null || !model.OrderDetail.Any())
+                {
+                    result.errMsg = "鍏ュ簱鍗曞彇娑堜笉鍙负绌哄�锛�;
+                    return result;
+                }
+                var res = WMSHelper.CancelOrderIn(model);
+                if (res)
+                {
+                    result.success = true;
+                }
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.success = false;
+                result.errMsg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"CancelInboundOrder鍏ュ簱鍗曞彇娑堝嚭鐜伴敊璇紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+        }
+
+        /// <summary>
+        /// 鍑哄簱鍗曞彇娑�+        /// </summary>
+        /// <param name="model">鍑哄簱鍗�/param>
+        /// <returns></returns>
+        public static Result CancelOutboundOrder(OutOrderCancel model)
+        {
+            Result result = new Result() { success = false };
+            try
+            {
+                if (model == null || !model.OrderDetail.Any())
+                {
+                    result.errMsg = "鍑哄簱鍗曚笉鍙负绌哄�锛�;
+                    return result;
+                }
+                var res = WMSHelper.CancelOrderOut(model);
+                if (res)
+                {
+                    result.success = true;
+                }
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.success = false;
+                result.errMsg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0);
+                if (frame != null)
+                {
+                    LogHelper.Error($"CancelOutboundOrder鍑哄簱鍗曞彇娑堝嚭鐜伴敊璇紒", ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+        }
+
 
         ///// <summary>
         ///// 鑾峰彇浣滀笟鍒涘缓鍏ュ簱浠诲姟
@@ -1606,6 +1667,246 @@
 
         #endregion
 
+        #region WCS璋冪敤鎺ュ彛
+
+        /// <summary>
+        /// WCS璋冪敤璁惧淇″彿鍙嶉
+        /// </summary>
+        /// <param name="model">璇锋眰鍙傛暟</param>
+        /// <returns></returns>
+        public static async Task<WcsResult> notifyDeviceSignal(List<WcsModel> model)
+        {
+            WcsResult result = new WcsResult() { code = 1, };
+            try
+            {
+                foreach (var item in model)
+                {
+                    if (string.IsNullOrEmpty(item.cntrNo))
+                    {
+                        result.msg = "鎵樼洏鍙蜂负绌猴紒";
+                        return result;
+                    }
+                    var list = WMSHelper.GetWmsTaskList("绛夊緟", item.cntrNo);
+                    if (list == null)
+                    {
+                        list = WMSHelper.GetWmsTaskList("鎵ц", item.cntrNo);
+                        if (list != null && list.S_TYPE.Contains("鍥炲簱"))
+                        {
+                            list.S_END_AREA = "TPLKQ";
+                        }
+                    }
+                    if (list == null)
+                    {
+                        result.msg = "鏈煡璇㈠埌鍦ㄧ瓑寰呬腑鐨勪綔涓氾紒";
+                        return result;
+                    }
+
+                    var inbound = new Inbound()
+                    {
+                        areaCode = list.S_END_AREA
+                    };
+                    var wh = new Warehouse(inbound);
+                    var stored = await wh.StoreItemAsync();
+                    if (stored == null)
+                    {
+                        result.msg = "绔嬪簱鍖烘湭鏌ヨ鍒板彲鐢ㄨ揣浣嶏紒";
+                        return result;
+                    }
+
+                    var startLoc = ContainerHelper.GetCntrLoc(list.S_CNTR_CODE);
+                    if (startLoc == null)
+                    {
+                        result.msg = $"鏈煡璇㈠埌鎵樼洏{list.S_CNTR_CODE}鎵�湪鐨勮揣浣嶏紒";
+                        return result;
+                    }
+                    var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, stored.loationCode, list.S_B_STATE == "绛夊緟" ? "鏂欑鍏ュ簱" : "鎵樼洏鍏ュ簱", list.S_CNTR_CODE, list.S_CODE);
+                    if (!res)
+                    {
+                        result.msg = "鍏ュ簱浠诲姟鍒涘缓澶辫触锛�;
+                        return result;
+                    }
+                    WMSHelper.UpdateTaskStatus(list.S_CODE, 1);
+                    ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, "");
+                }
+                result.code = 0;
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.code = 2;
+                result.msg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"notifyDeviceSignal璁惧淇″彿鍙嶉鍑虹幇閿欒锛侊紒", ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+        }
+
+        /// <summary>
+        /// WCS璋冪敤浠诲姟鐘舵�鍙嶉
+        /// </summary>
+        /// <param name="model">璇锋眰鍙傛暟</param>
+        /// <returns></returns>
+        public static async Task<WcsResult> notifyTaskStatus(WcsTaskModel model)
+        {
+            WcsResult result = new WcsResult() { code = 1, };
+            try
+            {
+                if (model == null)
+                {
+                    result.msg = "璇锋眰鍙傛暟涓虹┖";
+                    return result;
+                }
+
+                var task = WCSHelper.GetTask(model.taskNo);
+                if (task == null)
+                {
+                    result.msg = "鏈煡璇㈠埌浠诲姟鍙�;
+                    return result;
+                } 
+
+                // 鐘舵�涓庢搷浣滅殑鏄犲皠瀛楀吀
+                var stateActions = new Dictionary<int, Action>
+                {
+                    [1] = () => WCSHelper.Begin(task),
+                    [2] = () => HandleTaskCompletion(task),
+                    [3] = () => WCSHelper.UpdateStatus(task, "寮�鍙栬揣"),
+                    [4] = () => HandlePickCompletion(task),
+                    [5] = () => WCSHelper.UpdateStatus(task, "寮�鍗歌揣"),
+                    [6] = () => HandleUnloadCompletion(task),
+                    [7] = () => HandleTaskFailure(task),
+                    [8] = () => HandleTaskCompletion(task)
+                };
+                result.code = 0;
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.code = 2;
+                result.msg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"notifyTaskStatus浠诲姟鐘舵�鍙嶉鍑虹幇閿欒锛侊紒", ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+        }
+
+        // 澶勭悊浠诲姟瀹屾垚閫昏緫
+        private static void HandleTaskCompletion(WCSTask task)
+        {
+            WCSHelper.End(task);
+
+            // 鏍规嵁浠诲姟绫诲瀷澶勭悊涓嶅悓鐨勫畬鎴愰�杈�+            if (Settings.CompleteTasks.taskType.Contains(task.S_TYPE))
+            {
+                WMSHelper.UpdateWmsTask(task, 2);
+                WMSHelper.UpdateDistributionCntrState(2, 3, task.S_CNTR_CODE);
+            }
+
+            if (new List<string> { "鏂欑鍏ュ簱", "鎵樼洏鍏ュ簱" }.Contains(task.S_TYPE))
+            {
+                ContainerHelper.UpdateCntrItem(task.S_CNTR_CODE);
+            }
+
+            // 澶勭悊鍖哄煙鍙樻洿
+            HandleAreaChange(task);
+        }
+
+        // 澶勭悊鍙栬揣瀹屾垚閫昏緫
+        private static void HandlePickCompletion(WCSTask task)
+        {
+            WCSHelper.UpdateStatus(task, "鍙栬揣瀹屾垚");
+            TaskProcess.OperateStatus(task, 4);
+        }
+
+        // 澶勭悊鍗歌揣瀹屾垚閫昏緫
+        private static void HandleUnloadCompletion(WCSTask task)
+        {
+            WCSHelper.UpdateStatus(task, "鍗歌揣瀹屾垚");
+            TaskProcess.OperateStatus(task, 6);
+        }
+
+        // 澶勭悊浠诲姟澶辫触閫昏緫
+        private static void HandleTaskFailure(WCSTask task)
+        {
+            TaskProcess.OperateStatus(task, 7);
+            WCSHelper.Fail(task);
+        }
+
+        // 澶勭悊鍖哄煙鍙樻洿閫昏緫
+        private static void HandleAreaChange(WCSTask task)
+        {
+            var areas = new List<string> { "TPLKQ", "LXLKQ" };
+            var area = new List<string> { "閰嶇洏鍑哄簱", "閰嶇洏缂撳瓨" };
+
+            if (areas.Contains(task.S_START_AREA) && !area.Contains(task.S_TYPE))
+            {
+                WMSHelper.DeleteChange(task);
+            }
+
+            if (areas.Contains(task.S_END_AREA))
+            {
+                WMSHelper.AddChange(task);
+            }
+        }
+
+        /// <summary>
+        /// WCS璋冪敤鐢宠缁堢偣
+        /// </summary>
+        /// <param name="model">璇锋眰鍙傛暟</param>
+        /// <returns></returns>
+        public static async Task<WcsResult> applyDest(WcsTaskEnd model)
+        {
+            WcsResult result = new WcsResult() { code = 1, };
+            try
+            {
+                if (model == null)
+                {
+                    result.msg = "璇锋眰鍙傛暟涓虹┖";
+                    return result;
+                }
+
+                var task = WCSHelper.GetTask(model.taskNo);
+                if (task == null)
+                {
+                    result.msg = "鏈煡璇㈠埌浠诲姟鍙�;
+                    return result;
+                }
+
+                result.code = 0;
+                result.data.Add(new DataModel { taskNo = task.S_CODE, cntrCode = task.S_CNTR_CODE, end = task.S_END_LOC });
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.code = 2;
+                result.msg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"applyDest鐢宠缁堢偣鍑虹幇閿欒锛侊紒", ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+        }
+        #endregion
+
 
 
 
@@ -1628,10 +1929,6 @@
 
             LogHelper.Error("CreateInTask鑾峰彇浣滀笟鍒涘缓鍏ュ簱浠诲姟鍑虹幇閿欒锛� + errorDetails, ex);
         }
-
-
-
-
 
         /// <summary>
         /// 寰幆鍏ュ簱缂撳瓨鍖烘煡璇㈠悎鎵樺伐浣嶅拰鍏ュ簱鎺ラ┏浣嶆槸鍚︽湁绌鸿揣浣嶏紙鍒涘缓浠诲姟锛�@@ -1797,206 +2094,212 @@
         }
 
         /// <summary>
-        /// WCS璋冪敤璁惧淇″彿鍙嶉
+        /// 鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔�         /// </summary>
-        /// <param name="model">璇锋眰鍙傛暟</param>
+        /// <param name="distributionCntrs">閰嶇洏鍗�/param>
         /// <returns></returns>
-        public static async Task<Result> notifyDeviceSignal(List<Wcsmodel> model)
+        internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntrs)
         {
-            Result result = new Result() { success = false, };
             try
             {
-                foreach (var item in model)
-                {
-                    if (string.IsNullOrEmpty(item.cntrNo))
-                    {
-                        result.errMsg = "鎵樼洏鍙蜂负绌猴紒";
-                        return result;
-                    }
-                    var list = WMSHelper.GetWmsTaskList("绛夊緟", item.cntrNo);
-                    if (list == null)
-                    {
-                        list = WMSHelper.GetWmsTaskList("鎵ц", item.cntrNo);
-                        if (list != null && list.S_TYPE.Contains("鍥炲簱"))
-                        {
-                            list.S_END_AREA = "TPLKQ";
-                        }
-                    }
-                    if (list == null)
-                    {
-                        result.errMsg = "鏈煡璇㈠埌鍦ㄧ瓑寰呬腑鐨勪綔涓氾紒";
-                        return result;
-                    }
-                    
-                    var inbound = new Inbound()
-                    {
-                        areaCode = list.S_END_AREA
-                    };
-                    var wh = new Warehouse(inbound);
-                    var stored = await wh.StoreItemAsync();
-                    if (stored == null)
-                    {
-                        result.errMsg = "绔嬪簱鍖烘湭鏌ヨ鍒板彲鐢ㄨ揣浣嶏紒";
-                        return result;
-                    }
+                // 1. 鍒濆鍖栬皟搴﹀櫒鍜屽嚭搴撲换鍔″垪琛�+                var scheduler = new DoubleDeepOutboundScheduler(distributionCntrs);
+                var outboundTasks = CreateOutboundTasks(distributionCntrs);
 
-                    var startLoc = ContainerHelper.GetCntrLoc(list.S_CNTR_CODE);
-                    if (startLoc == null)
-                    {
-                        result.errMsg = $"鏈煡璇㈠埌鎵樼洏{list.S_CNTR_CODE}鎵�湪鐨勮揣浣嶏紒";
-                        return result;
-                    }
-                    var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, stored.loationCode, list.S_B_STATE == "绛夊緟" ? "鏂欑鍏ュ簱" : "鎵樼洏鍏ュ簱", list.S_CNTR_CODE, list.S_CODE);
-                    if (!res)
-                    {
-                        result.errMsg = "鍏ュ簱浠诲姟鍒涘缓澶辫触锛�;
-                        return result;
-                    }
-                    WMSHelper.UpdateTaskStatus(list.S_CODE, 1);
-                    ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, "");
-                }
+                // 2. 璁$畻璐т綅鐢熸垚浠诲姟鏁版嵁
+                var tasks = scheduler.GenerateOutboundTasks(outboundTasks);
+                if (!tasks.Any()) return false;
 
+                // 3. 鍒涘缓WMS浣滀笟
+                var mainTask = CreateMainWmsTask(tasks.Where(s=>s.S_TYPE == "閰嶇洏鍑哄簱").First());
+                if (!WMSHelper.CreateWmsTask(mainTask)) return false;
 
-                result.success = true;
-                return result;
+                // 4. 鐢熸垚WMS涓讳换鍔�+                return ProcessAllTransportTasks(tasks, mainTask.S_CODE);
             }
             catch (Exception ex)
             {
-                result.success = false;
-                result.errMsg = ex.Message;
-                var st = new System.Diagnostics.StackTrace(ex, true);
-                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
-                if (frame != null)
-                {
-                    LogHelper.Error($"notifyDeviceSignalWCS璋冪敤璁惧淇″彿鍙嶉鍑虹幇閿欒锛侊紒", ex);
-                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
-                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
-                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
-                }
-                return result;
+                LogErrorWithStackTrace("鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″け璐�, ex);
+                return false;
             }
         }
 
-        /// <summary>
-        /// 鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔�-        /// </summary>
-        /// <param name="distributionCntr">閰嶇洏鍗�/param>
-        /// <returns></returns>
-        internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntr)
+        // --------------------- 杈呭姪鏂规硶 ---------------------
+
+        private static List<Outbound> CreateOutboundTasks(List<DistributionCntr> distributionCntrs)
         {
-            try
+            return distributionCntrs.Select(item => new Outbound
             {
-                // 鍒涘缓璋冨害鍣�-                var scheduler = new DoubleDeepOutboundScheduler(distributionCntr);
+                locCode = item.S_LOC_CODE,
+                areaCode = item.S_AREA_CODE,
+                endArea = item.S_EXIT_AREA_CODE,
+                endBit = item.S_EXIT_LOC_CODE,
+                trayCode = item.S_CNTR_CODE,
+                taskType = "閰嶇洏鍑哄簱"
+            }).ToList();
+        }
 
-                var listOut = new List<Outbound>();
-                foreach (var item in distributionCntr)
+        private static WMSTask CreateMainWmsTask(WCSTask firstTask)
+        {
+            return new WMSTask
+            {
+                S_CNTR_CODE = firstTask.S_CNTR_CODE,
+                S_CODE = WMSHelper.GenerateTaskNo(),
+                S_START_LOC = firstTask.S_START_LOC,
+                S_START_AREA = firstTask.S_START_AREA,
+                S_END_LOC = firstTask.S_END_LOC,
+                S_END_AREA = firstTask.S_END_AREA,
+                S_START_WH = "CK001",
+                S_END_WH = "CK001",
+                N_B_STATE = 1,
+                S_B_STATE = "鎵ц",
+                N_TYPE = 2,
+                S_TYPE = "閰嶇洏鍑哄簱"
+            };
+        }
+
+        private static bool ProcessAllTransportTasks(List<WCSTask> tasks, string wmsTaskCode)
+        {
+            foreach (var task in tasks.OrderBy(t => t.N_PRIORITY))
+            {
+                if (IsLxLkqOrRelocationTask(task))
                 {
-                    listOut.Add(new Outbound
-                    {
-                        locCode = item.S_LOC_CODE,
-                        areaCode = item.S_AREA_CODE,
-                        endArea = item.S_EXIT_AREA_CODE,
-                        endBit = item.S_EXIT_LOC_CODE,
-                        trayCode = item.S_CNTR_CODE,
-                        taskType = "閰嶇洏鍑哄簱"
-                    });
+                    if (!ProcessLxLkqTransportTask(task, wmsTaskCode))
+                        return false;
                 }
-                // 璇锋眰鍑哄簱
-                var tasks = scheduler.GenerateOutboundTasks(listOut);
-
-                foreach (var item in tasks)
+                else
                 {
-                    var wmsTask = new WMSTask();
-                    if (string.IsNullOrEmpty(item.S_OP_CODE))
-                    {
-                        wmsTask = new WMSTask
-                        {
-                            S_CNTR_CODE = item.S_CNTR_CODE,
-                            S_CODE = WMSHelper.GenerateTaskNo(),
-                            S_START_LOC = item.S_START_LOC,
-                            S_START_AREA = item.S_START_AREA,
-                            S_END_LOC = item.S_END_LOC,
-                            S_END_AREA = item.S_END_AREA,
-                            S_START_WH = "CK001",
-                            S_END_WH = "CK001",
-                            N_B_STATE = 1,
-                            S_B_STATE = "鎵ц",
-                            N_TYPE = 2,
-                            S_TYPE = "閰嶇洏鍑哄簱"
-                        };
-                        if (!WMSHelper.CreateWmsTask(wmsTask))
-                        {
-                            return false;
-                        }
-                    }
-
-                    if (item.S_END_AREA == "LXLKQ")
-                    {
-                        // 鍒涘缓鍑哄簱浠诲姟
-                        var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, wmsTask.S_CODE);
-                        UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE);
-                        if (!res)
-                        {
-                            LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
-                            return false;
-                        }
-                    }
-                    else
-                    {
-                        //鏍规嵁鍒嗘嫞璐т綅鍘绘煡璇㈤厤缃紝濡傛灉鍒嗘嫞鍖烘病鏈夌┖璐т綅灏卞幓鍑哄簱鍒嗘嫞鏆傚瓨鍖�-                        var relevancys = Settings.OutRelevancys.Where(s => s.conLoc == item.S_END_LOC).FirstOrDefault();
-                        if (relevancys == null)
-                        {
-                            LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽item.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀");
-                            break;
-                        }
-                        var locList = LocationHelper.GetLocListEmptyFree(relevancys.sorLoc.ToList());
-                        if (locList.Any())
-                        {
-                            // 鍒涘缓鍑哄簱浠诲姟
-                            var res = TaskProcess.HYCreateTransport(item.S_START_LOC, locList.FirstOrDefault().S_CODE, item.S_TYPE, item.S_CNTR_CODE, wmsTask.S_CODE);
-                            UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE);
-                            if (!res)
-                            {
-                                LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
-                                return false;
-                            }
-                        }
-                        else
-                        {
-                            var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "鎷i�缂撳瓨鍖�).FirstOrDefault();
-                            var lxLocations = LocationHelper.GetLocAreaList(reservoirs.areaCode);
-                            if (lxLocations.Any())
-                            {
-                                // 鍒涘缓鍑哄簱浠诲姟
-                                var res = TaskProcess.HYCreateTransport(item.S_START_LOC, lxLocations.FirstOrDefault().S_CODE, "閰嶇洏缂撳瓨", item.S_CNTR_CODE, wmsTask.S_CODE);
-                                UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE);
-                                if (!res)
-                                {
-                                    LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
-                                    return false;
-                                }
-                            }
-                        }
-                    }
+                    if (!ProcessNormalTransportTask(task, wmsTaskCode))
+                        return false;
                 }
-                return true;
             }
-            catch (Exception ex)
+            return true;
+        }
+
+        private static bool IsLxLkqOrRelocationTask(WCSTask task)
+        {
+            return task.S_START_AREA == "LXLKQ" || task.S_TYPE == "娣变綅绉诲簱";
+        }
+
+        /// <summary>
+        /// 鐢熸垚LXLKQ || 娣变綅绉诲簱鐨勯厤鐩樹换鍔�+        /// </summary>
+        /// <param name="task"></param>
+        /// <param name="wmsTaskCode"></param>
+        /// <returns></returns>
+        private static bool ProcessLxLkqTransportTask(WCSTask task, string wmsTaskCode)
+        {
+            bool success = false;
+            if (task.S_TYPE == "娣变綅绉诲簱")
             {
-                var st = new System.Diagnostics.StackTrace(ex, true);
-                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
-                if (frame != null)
-                {
-                    LogHelper.Error($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″け璐ex.Message}锛侊紒", ex);
-                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
-                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
-                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
-                }
+                success = TaskProcess.HYCreateTransport(
+                task.S_START_LOC,
+                task.S_END_LOC,
+                task.S_TYPE,
+                task.S_CNTR_CODE,
+                wmsTaskCode,
+                task.N_PRIORITY);
+                return  success;
+            }
+            var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC);
+            if (relevancy == null)
+            {
+                LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽task.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀");
                 return false;
             }
 
+
+            // 灏濊瘯浣跨敤鍒嗘嫞浣�+            var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault();
+            if (emptyLoc != null)
+            {
+                success = TaskProcess.HYCreateTransport(
+                task.S_START_LOC,
+                emptyLoc.S_CODE,
+                task.S_TYPE,
+                task.S_CNTR_CODE,
+                wmsTaskCode,
+                task.N_PRIORITY);
+                if (success && task.S_TYPE != "娣变綅绉诲簱")
+                {
+                    UpdateDistributionCntrState(1, 2, task.S_CNTR_CODE);
+                }
+            }
+            return success;
+        }
+
+        /// <summary>
+        /// 鐢熸垚TPLKQ鐨勯厤鐩樹换鍔�+        /// </summary>
+        /// <param name="task"></param>
+        /// <param name="wmsTaskCode"></param>
+        /// <returns></returns>
+        private static bool ProcessNormalTransportTask(WCSTask task, string wmsTaskCode)
+        {
+            var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC);
+            if (relevancy == null)
+            {
+                LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽task.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀");
+                return false;
+            }
+
+            // 灏濊瘯浣跨敤鍒嗘嫞浣�+            var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault();
+            if (emptyLoc != null)
+            {
+                return CreateAndLogTransport(
+                    task.S_START_LOC,
+                    emptyLoc.S_CODE,
+                    task.S_TYPE,
+                    task.S_CNTR_CODE,
+                    wmsTaskCode,
+                    task.N_PRIORITY);
+            }
+
+            // 灏濊瘯浣跨敤鎷i�缂撳瓨鍖�+            var reservoir = Settings.ReservoirAreas.FirstOrDefault(s => s.areaName == "鎷i�缂撳瓨鍖�);
+            if (reservoir == null) return false;
+
+            var lxLocation = LocationHelper.GetLocAreaList(reservoir.areaCode).FirstOrDefault();
+            if (lxLocation == null) return false;
+
+            return CreateAndLogTransport(
+                task.S_START_LOC,
+                lxLocation.S_CODE,
+                "閰嶇洏缂撳瓨",
+                task.S_CNTR_CODE,
+                wmsTaskCode,
+                task.N_PRIORITY);
+        }
+
+        private static bool CreateAndLogTransport(string startLoc, string endLoc, string taskType,
+            string cntrCode, string wmsTaskCode, int priority)
+        {
+            var success = TaskProcess.HYCreateTransport(
+                startLoc, endLoc, taskType, cntrCode, wmsTaskCode, priority);
+
+            if (success)
+            {
+                UpdateDistributionCntrState(1, 2, cntrCode);
+            }
+            else
+            {
+                LogHelper.Info("鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
+            }
+
+            return success;
+        }
+
+        private static void LogErrorWithStackTrace(string message, Exception ex)
+        {
+            var st = new StackTrace(ex, true);
+            var frame = st.GetFrame(0);
+            if (frame == null) return;
+
+            LogHelper.Error($"{message}{ex.Message}锛侊紒", ex);
+            LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+            LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+            LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
         }
 
         #endregion

--
Gitblit v1.9.1