From b7308bba3d7ffad271ce7fc7a93c8c45d76be87d Mon Sep 17 00:00:00 2001
From: 杨前锦 <1010338399@qq.com>
Date: 星期五, 13 六月 2025 17:21:03 +0800
Subject: [PATCH] 优化印尼佳通-硫化胚胎出入库逻辑策略优化

---
 HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs     |  229 ++++----
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/MoboxController.cs  |    2 
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs        |  126 +++-
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs        |  439 +++++++++++------
 HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/WmsController.cs |    3 
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/LjLotOnhand.cs   |    1 
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/SideLocConfig.cs |    1 
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs         |  130 ++--
 HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs     |  427 +++++++++++-----
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/LocationHelper.cs   |   23 
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/WCSCore.cs         |   84 +-
 HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/Program.cs              |    6 
 12 files changed, 904 insertions(+), 567 deletions(-)

diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/Program.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/Program.cs
index 1de6c57..e36ba54 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/Program.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/Program.cs
@@ -81,8 +81,10 @@
                 List<Task> tasks = new List<Task>();
                 // 娣诲姞浠诲姟鎺ㄩ�绾跨▼
                 tasks.Add(GetTask(WCSCore.Dispatch));
-                // 鐩戝惉MES浠诲姟锛屼笅鍙戜换鍔�-                tasks.Add(GetTask(Monitor.MonitorMesTask));
+                // 鐩戝惉鎴愬瀷鏈哄彨鏂欎换鍔�+                tasks.Add(GetTask(Monitor.MonitorCXJCallMaterialMesTask));
+                // 鐩戝惉閽㈠寘婊℃枡涓嬬嚎浠诲姟
+                tasks.Add(GetTask(Monitor.MonitorGBOffLineMesTask));
                 // 鐩戝惉鏂滆鍑哄簱浠诲姟琛�                 tasks.Add(GetTask(Monitor.MonitorXcOutTask));
                 // 鑷姩琛ュ厖绌哄伐瑁呬换鍔�diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
index 176e9dc..49ea593 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
@@ -228,43 +228,53 @@
         public static ResponseResult offLineProcess(OffLineRequest model) {
             ResponseResult responseResult = new ResponseResult();
 
-            // 鏌ヨ璧风偣璐т綅鏄惁瀛樺湪宸插瓨鍦ㄤ换鍔★紝闃叉浠诲姟閲嶅鍙戣捣
-            var existWmsTask = WMSHelper.GetWmsTaskByStart(model.loc);
-            if (existWmsTask == null)
+            var areaCodes = Settings.areaPropertyList.Select(a => a.areaCode).ToList();
+            var isExistCntr = LocationHelper.checkAreaExistCntr(areaCodes,model.cntrNo);
+            if (!isExistCntr)
             {
-                // 鏌ヨ瀵瑰簲鏈哄彴鐨勭墿鏂欎笅绾块厤缃俊鎭�-                var logicConfig = WMSHelper.getLogicConfigByJtCode(model.jtNo);
-                if (logicConfig != null)
+                // 鏌ヨ璧风偣璐т綅鏄惁瀛樺湪宸插瓨鍦ㄤ换鍔★紝闃叉浠诲姟閲嶅鍙戣捣
+                var existWmsTask = WMSHelper.GetWmsTaskByStart(model.loc);
+                if (existWmsTask == null)
                 {
-                    Container container = ContainerHelper.GetCntr(model.cntrNo);
-                    if (container == null || !model.isNormal)
+                    // 鏌ヨ瀵瑰簲鏈哄彴鐨勭墿鏂欎笅绾块厤缃俊鎭�+                    var logicConfig = WMSHelper.getLogicConfigByJtCode(model.jtNo);
+                    if (logicConfig != null)
                     {
-                        ContainerHelper.AddCntr(model.cntrNo);
-                        ContainerHelper.UpdateCntrState(model.cntrNo, 1);
-                        WMSHelper.addRfidAnomalyRecord(model.cntrNo, 1, model.loc, null);
-                    }
+                        Container container = ContainerHelper.GetCntr(model.cntrNo);
+                        if (container == null || !model.isNormal)
+                        {
+                            ContainerHelper.AddCntr(model.cntrNo);
+                            ContainerHelper.UpdateCntrState(model.cntrNo, 1);
+                            WMSHelper.addRfidAnomalyRecord(model.cntrNo, 1, model.loc, null);
+                        }
 
-                    // 鏍规嵁鐗╂枡涓嬬嚎閰嶇疆淇℃伅锛屽垽鏂换鍔$被鍨嬫槸鐩磋繛涓嬬嚎杩樻槸闈炵洿杩炰笅绾�-                    if (logicConfig.S_TASK_TYPE == "1" || logicConfig.S_TASK_TYPE == "2")
-                    {
-                        triggerItemOffLineFlow(model.loc, model.cntrNo, logicConfig);
+                        // 鏍规嵁鐗╂枡涓嬬嚎閰嶇疆淇℃伅锛屽垽鏂换鍔$被鍨嬫槸鐩磋繛涓嬬嚎杩樻槸闈炵洿杩炰笅绾�+                        if (logicConfig.S_TASK_TYPE == "1" || logicConfig.S_TASK_TYPE == "2")
+                        {
+                            triggerItemOffLineFlow(model.loc, model.cntrNo, logicConfig);
+                        }
+                        else
+                        {
+                            // 婊℃枡涓嬬嚎锛堥潪鐩磋繛锛�+                            triggerItemOffLineFlow4(model.loc, model.cntrNo, logicConfig);
+                        }
                     }
                     else
                     {
-                        // 婊℃枡涓嬬嚎锛堥潪鐩磋繛锛�-                        triggerItemOffLineFlow4(model.loc, model.cntrNo, logicConfig);
+                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鏈哄彴鍙穥model.jtNo},娌℃湁鍙敤鐨勯�杈戠嚎璺�璇疯仈绯荤鐞嗕汉鍛�);
+                        throw new BusinessException($"鏈哄彴鍙穥model.jtNo},娌℃湁鍙敤鐨勯�杈戠嚎璺紝璇疯仈绯荤鐞嗕汉鍛�);
                     }
                 }
                 else
                 {
-                    WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鏈哄彴鍙穥model.jtNo},娌℃湁鍙敤鐨勯�杈戠嚎璺�璇疯仈绯荤鐞嗕汉鍛�);
-                    throw new BusinessException($"鏈哄彴鍙穥model.jtNo},娌℃湁鍙敤鐨勯�杈戠嚎璺紝璇疯仈绯荤鐞嗕汉鍛�);
+                    WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"涓嬬嚎璐т綅锛歿model.loc}宸叉湁浠诲姟锛岃鍕块噸澶嶄笅鍙戜换鍔�);
+                    throw new BusinessException($"涓嬬嚎璐т綅锛歿model.loc}宸叉湁浠诲姟锛岃鍕块噸澶嶄笅鍙戜换鍔�);
                 }
             }
             else 
             {
-                WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"涓嬬嚎璐т綅锛歿model.loc}宸叉湁浠诲姟锛岃鍕块噸澶嶄笅鍙戜换鍔�);
-                throw new BusinessException($"涓嬬嚎璐т綅锛歿model.loc}宸叉湁浠诲姟锛岃鍕块噸澶嶄笅鍙戜换鍔�);
+                WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"宸ヨ锛歿model.cntrNo}宸插叆搴擄紝璇峰嬁閲嶅鍏ュ簱");
+                throw new BusinessException($"宸ヨ锛歿model.cntrNo}宸插叆搴擄紝璇峰嬁閲嶅鍏ュ簱");
             }
             return responseResult;
         }
@@ -369,8 +379,8 @@
                         }
                         else
                         {
-                            WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"绌哄伐瑁呭嚭搴撶珯鍙�{logicConfig.S_LKKTJBLOC},娌℃湁绌哄伐瑁�);
-                            photoStatus = false;
+                            kgzCntrCode = "铏氭嫙瀹瑰櫒";
+                            WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"绌哄伐瑁呭嚭搴撶珯鍙�{logicConfig.S_LKKTJBLOC},娌℃湁绌哄伐瑁�);
                         }
                     }
 
@@ -917,7 +927,6 @@
                                 // 鏇存柊鍑哄簱浠诲姟涓棿琛ㄧ姸鎬�                                 WMSHelper.updateLotOutTask(cst.S_CNTR_CODE, "2");
                             }
-
                         }
                     }
                 }
@@ -941,45 +950,27 @@
                 if (mst != null && mst.N_B_STATE < 2) {
 
                     int emptyFlag = 0;  // 瀹瑰櫒绌烘弧鏍囪瘑
-                    Container cntr = ContainerHelper.GetCntr(cst.S_CNTR_CODE);
-                    if (cntr != null && cntr.N_DETAIL_COUNT > 0) {
+                    var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE);
+                    if (cntrItemRels.Count > 0) {
                         emptyFlag = 1;
                     }
 
                     // 1锛氬爢鍨涙満鏀捐揣寮傚父鐢宠鏂扮粓鐐�                     if (model.applyType == 1) {
                         // 鎶ヨ锛氭祦绋嬪紓甯�-                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"鍫嗗灈鏈烘斁璐у紓甯革紝寮傚父璐т綅锛歿cst.S_END_LOC}");
+                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"鍫嗗灈鏈烘斁璐у紓甯革紝浠诲姟鍙凤細{cst.S_CODE}锛屽紓甯歌揣浣嶏細{cst.S_END_LOC}");
 
                         // 1.灏嗗紓甯歌揣浣嶄笂閿侊紝骞舵姤璀�                         LocationHelper.LockLoc(cst.S_END_LOC, 3);
 
                         // 2.鏌ヨ鏂扮殑鍏ュ簱缁堢偣
-                        Location endLoc = WMSHelper.getInStockEndLoc(cst.S_END_AREA, emptyFlag);
+                        Location endLoc = WMSHelper.getInStockEndLoc(cst.S_END_AREA, emptyFlag );
                         cst.S_END_LOC = endLoc.S_CODE;
                         WCSHelper.UpdateEndLoc(cst);
 
                         LocationHelper.LockLoc(endLoc.S_CODE, 1);
                         applyDest.destLoc = endLoc.S_CODE;
                     }
-                    else if (model.applyType == 2)
-                    {
-                        if (cst.S_END_LOC == "铏氭嫙搴撲綅")
-                        {
-                            var transfeRelevance = WMSHelper.GetTransfeRelevance(model.loc);  // 鎺ラ┏浣嶅叧鑱斿睘鎬�-                            if (transfeRelevance != null)
-                            {
-                                // 1.鏌ヨ鏂扮殑鍏ュ簱缁堢偣
-                                Location endLoc = WMSHelper.getInStockEndLoc(transfeRelevance.S_RELE_AREA, emptyFlag);
-                                cst.S_END_LOC = endLoc.S_CODE;
-                                WCSHelper.UpdateEndLoc(cst);
-
-                                LocationHelper.LockLoc(endLoc.S_CODE, 1);
-                                applyDest.destLoc = endLoc.S_CODE;
-                            }
-                        }
-                    }
-
                 }
             }
             result.data = applyDest;
@@ -1066,18 +1057,22 @@
             {
                 if (mst.S_TYPE == "浣欐枡/绌哄伐瑁呭叆搴�)
                 {
-                    var mesTask = WMSHelper.GetLjMesTaskById(int.Parse(mst.S_OP_DEF_CODE));
-                    if (mesTask.QTY != 0)
+                    var bo = int.TryParse(mst.S_OP_DEF_CODE, out int mesId);
+                    if (bo) 
                     {
-                        var awaitTask = WMSHelper.GetAwaitWmsTaskByMaterialCode(mesTask.MATERIAL_CODE);
-                        if (awaitTask != null)
+                        var mesTask = WMSHelper.GetLjMesTaskById(mesId);
+                        if (mesTask.QTY != 0)
                         {
-                            // 鍙栨秷浠诲姟
-                            ApiHelper.cancelTask(awaitTask.S_CODE);
-                            // 淇敼缁堢偣
-                            agvEndLoc = LocationHelper.GetLoc(awaitTask.S_END_LOC);
-                            wmsEndLoc = agvEndLoc;
-                            mst.S_TYPE = "鍙枡鍑哄簱浠诲姟";
+                            var awaitTask = WMSHelper.GetAwaitWmsTaskByMaterialCode(mesTask.MATERIAL_CODE);
+                            if (awaitTask != null)
+                            {
+                                // 鍙栨秷浠诲姟
+                                ApiHelper.cancelTask(awaitTask.S_CODE);
+                                // 淇敼缁堢偣
+                                agvEndLoc = LocationHelper.GetLoc(awaitTask.S_END_LOC);
+                                wmsEndLoc = agvEndLoc;
+                                mst.S_TYPE = "鍙枡鍑哄簱浠诲姟";
+                            }
                         }
                     }
                 }
@@ -1199,7 +1194,7 @@
                             }
                             else
                             {
-                                WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛屾湭鏌ヨ鍒扮珛搴撴帴椹充綅");
+                                WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛岀珛搴�{wmsEndLoc.S_AREA_CODE}鏈厤缃珛搴撴帴椹充綅");
                                 return null;
                             }
                         }
@@ -1342,118 +1337,112 @@
         /// 鎴愭柊鏈哄彨鏂�         /// </summary>
         /// <param name="materialCode"></param>
-        /// <param name="endLocCode"></param>
+        /// <param name="jtNo"></param>
         /// <param name="mesTaskId"></param>
-        public static void callMaterial(string materialCode, string endLocCode, int mesTaskId)
+        public static void callMaterial(string materialCode, string jtNo, int mesTaskId)
         {
-            var oldWmsTask = WMSHelper.GetWmsTaskByEnd(endLocCode);
-            if (oldWmsTask == null) {
-                string cntrCode = "";
-                Location endLoc = LocationHelper.GetLoc(endLocCode);
+            string cntrCode = "";
+            var mesTask = WMSHelper.GetLjMesTaskById(mesTaskId);
+
+            if (mesTask != null)
+            {
+                Location endLoc = WMSHelper.getCallMaterialLocCode(jtNo);
                 if (endLoc != null)
                 {
                     Location middleLoc = null;
                     Location startLoc = WMSHelper.getOutStockStartLoc(null, materialCode);
-                    if (startLoc == null)
-                    {
-                        var mesTask = WMSHelper.GetLjMesTaskById(mesTaskId);
-                        if (mesTask != null)
-                        {
-                            mesTask.RECEIVE_MSG = "娌℃湁搴撳瓨";
-                            WMSHelper.updateLjMesTask(mesTask);
-                        }
-                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鍙枡澶辫触锛岀墿鏂�{materialCode}娌℃湁搴撳瓨");
-                        return;
-                    }
-                    else 
+                    if (startLoc != null)
                     {
                         var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                         if (locCntrRels.Count > 0)
                         {
                             cntrCode = locCntrRels[0].S_CNTR_CODE;
-                        }
-                        else 
-                        {
-                            WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鏌ヨ鐗╂枡寮傚父锛岃揣浣�{startLoc.S_CODE}缂哄皯瀹瑰櫒淇℃伅");
-                            return;
-                        }
-                    }
-
-                    middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 1 , 2);
-
-                    if (middleLoc != null)
-                    {
-                        // 1.鍒涘缓鎴愭柊鏈哄彨鏂欎綔涓�-                        var wmsTask = new WMSTask()
-                        {
-                            S_CNTR_CODE = cntrCode,
-                            S_CODE = WMSHelper.GenerateTaskNo(),
-                            S_START_LOC = startLoc.S_CODE,
-                            S_START_AREA = startLoc.S_AREA_CODE,
-                            S_END_LOC = endLoc.S_CODE,
-                            S_END_AREA = endLoc.S_AREA_CODE,
-                            S_TYPE = "鍙枡鍑哄簱浠诲姟",
-                            S_OP_DEF_CODE = mesTaskId.ToString(),
-                            S_OP_DEF_NAME = "鎴愬瀷鏈哄彨鏂欏嚭搴撲换鍔�,
-                            T_START_TIME = DateTime.Now,
-                        };
-                        if (WMSHelper.CreateWmsTask(wmsTask))
-                        {
-                            WCSTask wcsTask = new WCSTask()
+                            middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 1, 2);
+                            if (middleLoc != null)
                             {
-                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
-                                S_OP_CODE = wmsTask.S_CODE,
-                                S_CODE = WCSHelper.GenerateTaskNo(),
-                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
-                                S_TYPE = wmsTask.S_TYPE + "-WCS",
-                                S_START_LOC = startLoc.S_CODE,
-                                S_START_AREA = startLoc.S_AREA_CODE,
-                                S_END_LOC = middleLoc.S_CODE,
-                                S_END_AREA = middleLoc.S_AREA_CODE,
-                                S_SCHEDULE_TYPE = "WCS",
-                                N_PRIORITY = 10,
-                                T_START_TIME = DateTime.Now,
-                            };
+                                // 1.鍒涘缓鎴愭柊鏈哄彨鏂欎綔涓�+                                var wmsTask = new WMSTask()
+                                {
+                                    S_CNTR_CODE = cntrCode,
+                                    S_CODE = WMSHelper.GenerateTaskNo(),
+                                    S_START_LOC = startLoc.S_CODE,
+                                    S_START_AREA = startLoc.S_AREA_CODE,
+                                    S_END_LOC = endLoc.S_CODE,
+                                    S_END_AREA = endLoc.S_AREA_CODE,
+                                    S_TYPE = "鍙枡鍑哄簱浠诲姟",
+                                    S_OP_DEF_CODE = mesTaskId.ToString(),
+                                    S_OP_DEF_NAME = "鎴愬瀷鏈哄彨鏂欏嚭搴撲换鍔�,
+                                    T_START_TIME = DateTime.Now,
+                                };
+                                if (WMSHelper.CreateWmsTask(wmsTask))
+                                {
+                                    WCSTask wcsTask = new WCSTask()
+                                    {
+                                        S_OP_NAME = wmsTask.S_OP_DEF_NAME,
+                                        S_OP_CODE = wmsTask.S_CODE,
+                                        S_CODE = WCSHelper.GenerateTaskNo(),
+                                        S_CNTR_CODE = wmsTask.S_CNTR_CODE,
+                                        S_TYPE = wmsTask.S_TYPE,
+                                        S_START_LOC = startLoc.S_CODE,
+                                        S_START_AREA = startLoc.S_AREA_CODE,
+                                        S_END_LOC = middleLoc.S_CODE,
+                                        S_END_AREA = middleLoc.S_AREA_CODE,
+                                        S_SCHEDULE_TYPE = "WCS",
+                                        N_PRIORITY = 10,
+                                        T_START_TIME = DateTime.Now,
+                                    };
 
-                            if (WCSHelper.CreateTask(wcsTask))
-                            {
-                                // 璧风偣銆佺粓鐐瑰姞閿�-                                LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
-                                LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
+                                    if (WCSHelper.CreateTask(wcsTask))
+                                    {
+                                        // 璧风偣銆佺粓鐐瑰姞閿�+                                        LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
+                                        LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
 
-                                // 鏇存柊浣滀笟浠诲姟鐘舵�
-                                wmsTask.N_B_STATE = 1;
-                                WMSHelper.UpdateTaskState(wmsTask);
+                                        // 鏇存柊浣滀笟浠诲姟鐘舵�
+                                        wmsTask.N_B_STATE = 1;
+                                        WMSHelper.UpdateTaskState(wmsTask);
+                                    }
+
+                                    // 棰勫垱寤轰簩娈典换鍔�+                                    WCSTask twoWcsTask = new WCSTask()
+                                    {
+                                        S_OP_NAME = wmsTask.S_OP_DEF_NAME,
+                                        S_OP_CODE = wmsTask.S_CODE,
+                                        S_CODE = WCSHelper.GenerateTaskNo(),
+                                        S_CNTR_CODE = wmsTask.S_CNTR_CODE,
+                                        S_TYPE = wmsTask.S_TYPE,
+                                        S_START_LOC = middleLoc.S_CODE,
+                                        S_START_AREA = middleLoc.S_AREA_CODE,
+                                        S_END_LOC = endLoc.S_CODE,
+                                        S_END_AREA = endLoc.S_AREA_CODE,
+                                        S_SCHEDULE_TYPE = "AGV",
+                                        N_PRIORITY = 10,
+                                        T_START_TIME = DateTime.Now,
+                                        N_B_STATE = -1
+                                    };
+                                    WCSHelper.CreateTask(twoWcsTask);
+                                    WMSHelper.readLjMesCallItemTask(wmsTask.S_CODE, mesTaskId);
+                                }
                             }
-
-                            // 棰勫垱寤轰簩娈典换鍔�-                            WCSTask twoWcsTask = new WCSTask()
+                            else
                             {
-                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
-                                S_OP_CODE = wmsTask.S_CODE,
-                                S_CODE = WCSHelper.GenerateTaskNo(),
-                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
-                                S_TYPE = wmsTask.S_TYPE,
-                                S_START_LOC = middleLoc.S_CODE,
-                                S_START_AREA = middleLoc.S_AREA_CODE,
-                                S_END_LOC = endLoc.S_CODE,
-                                S_END_AREA = endLoc.S_AREA_CODE,
-                                S_SCHEDULE_TYPE = "AGV",
-                                N_PRIORITY = 10,
-                                T_START_TIME = DateTime.Now,
-                                N_B_STATE = -1
-                            };
-                            WCSHelper.CreateTask(twoWcsTask);
-
-                            WMSHelper.readLjMesCallItemTask(wmsTask.S_CODE, mesTaskId);
+                                WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝搴撳尯{startLoc.S_AREA_CODE}鏈煡璇㈠埌鍙敤鐨勬帴椹充綅");
+                            }
+                        }
+                        else
+                        {
+                            WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝寮�璐т綅:{startLoc.S_CODE}寮傚父锛岀己灏戝鍣ㄤ俊鎭�);
                         }
                     }
-                    else 
+                    else
                     {
-                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"搴撳尯{startLoc.S_AREA_CODE}鏈煡璇㈠埌鍙敤鐨勬帴椹充綅");
-                    }
+                        mesTask.AWAIT_MSG = "搴撳瓨涓嶈冻";
+                        WMSHelper.updateLjMesTask(mesTask);
+                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝鐗╂枡:{materialCode}搴撳瓨涓嶈冻");
+                    }  
                 }
             }
+            
         }
         
         /// <summary>
@@ -1465,14 +1454,142 @@
         /// <param name="materialCode"></param>
         /// <param name="endLocCode"></param>
         /// <param name="mesTaskId"></param>
-        public static void callMaterialHDK(string materialCode, string endLocCode, int mesTaskId)
+        public static void callMaterialXC(string materialCode, string endLocCode, int mesTaskId)
         {
             // 1.鏌ヨ鐜甫搴撶墿鏂欏簱瀛�+            DateTime inStockTimeXc = DateTime.MinValue;
+            List<CntrItemRel> cntrItemRelsXc = new List<CntrItemRel>();
+            if (cntrItemRelsXc.Count > 0) 
+            {
+                inStockTimeXc = cntrItemRelsXc[0].T_INBOUND_TIME;
+            }
 
-            // 2.鏌ヨ涓浆搴撳簱瀛橈紝鏍规嵁鍏ュ簱鏃堕棿 杩涜鍏堝叆鍏堝嚭
+            // 2.鏌ヨ涓浆搴撳簱瀛�+            DateTime inStockTime = DateTime.MinValue;
+            var cntrItemRels = WMSHelper.getZZKInventoryInfo(materialCode);
+            if (cntrItemRels.Count > 0) 
+            {
+                inStockTime = cntrItemRels[0].T_INBOUND_TIME;   
+            }
 
-            // 3.灏哅ES浠诲姟鍐欏叆鐜甫搴撲换鍔′腑闂磋〃
-            WMSHelper.addLjXcTask(mesTaskId);
+            // 3.鏍规嵁鍏堣繘鍏堝嚭璁$畻鍑哄簱鐨勭墿鏂欐槸鐜甫搴�杩樻槸涓浆搴�+            var mesTask = WMSHelper.GetLjMesTaskById(mesTaskId);
+            if (inStockTime >= inStockTimeXc)
+            {
+                //鏂滆鐗╂枡鍑哄簱
+                if (cntrItemRelsXc.Count > 0) 
+                {
+                    // 4.灏哅ES浠诲姟鍐欏叆鐜甫搴撲换鍔′腑闂磋〃
+                    WMSHelper.addLjXcTask(mesTask);
+                }
+            }
+            else 
+            {
+                //涓浆搴撶墿鏂欏嚭搴�+                if (cntrItemRels.Count > 0) 
+                {
+                    var cntrItemRel = cntrItemRels[0];
+                    var locCntrRel = LocationHelper.GetLocCntrByCntr(cntrItemRel.S_CNTR_CODE);
+                    if (locCntrRel != null) 
+                    {
+                      var endLoc = LocationHelper.GetLoc(locCntrRel.S_LOC_CODE);
+                        if (endLoc != null)
+                        {
+                            Location middleLoc = null;
+                            Location startLoc = WMSHelper.getOutStockStartLoc(null, materialCode);
+                            if (startLoc != null)
+                            {
+                                var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
+                                if (locCntrRels.Count > 0)
+                                {
+                                    var cntrCode = cntrItemRel.S_CNTR_CODE;
+                                    middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 1, 2);
+                                    if (middleLoc != null)
+                                    {
+                                        // 1.鍒涘缓鎴愭柊鏈哄彨鏂欎綔涓�+                                        var wmsTask = new WMSTask()
+                                        {
+                                            S_CNTR_CODE = cntrCode,
+                                            S_CODE = WMSHelper.GenerateTaskNo(),
+                                            S_START_LOC = startLoc.S_CODE,
+                                            S_START_AREA = startLoc.S_AREA_CODE,
+                                            S_END_LOC = endLoc.S_CODE,
+                                            S_END_AREA = endLoc.S_AREA_CODE,
+                                            S_TYPE = "鍙枡鍑哄簱浠诲姟",
+                                            S_OP_DEF_CODE = mesTaskId.ToString(),
+                                            S_OP_DEF_NAME = "鎴愬瀷鏈哄彨鏂欏嚭搴撲换鍔�,
+                                            T_START_TIME = DateTime.Now,
+                                        };
+                                        if (WMSHelper.CreateWmsTask(wmsTask))
+                                        {
+                                            WCSTask wcsTask = new WCSTask()
+                                            {
+                                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
+                                                S_OP_CODE = wmsTask.S_CODE,
+                                                S_CODE = WCSHelper.GenerateTaskNo(),
+                                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
+                                                S_TYPE = wmsTask.S_TYPE,
+                                                S_START_LOC = startLoc.S_CODE,
+                                                S_START_AREA = startLoc.S_AREA_CODE,
+                                                S_END_LOC = middleLoc.S_CODE,
+                                                S_END_AREA = middleLoc.S_AREA_CODE,
+                                                S_SCHEDULE_TYPE = "WCS",
+                                                N_PRIORITY = 10,
+                                                T_START_TIME = DateTime.Now,
+                                            };
+
+                                            if (WCSHelper.CreateTask(wcsTask))
+                                            {
+                                                // 璧风偣銆佺粓鐐瑰姞閿�+                                                LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
+                                                LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
+
+                                                // 鏇存柊浣滀笟浠诲姟鐘舵�
+                                                wmsTask.N_B_STATE = 1;
+                                                WMSHelper.UpdateTaskState(wmsTask);
+                                            }
+
+                                            // 棰勫垱寤轰簩娈典换鍔�+                                            WCSTask twoWcsTask = new WCSTask()
+                                            {
+                                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
+                                                S_OP_CODE = wmsTask.S_CODE,
+                                                S_CODE = WCSHelper.GenerateTaskNo(),
+                                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
+                                                S_TYPE = wmsTask.S_TYPE,
+                                                S_START_LOC = middleLoc.S_CODE,
+                                                S_START_AREA = middleLoc.S_AREA_CODE,
+                                                S_END_LOC = endLoc.S_CODE,
+                                                S_END_AREA = endLoc.S_AREA_CODE,
+                                                S_SCHEDULE_TYPE = "AGV",
+                                                N_PRIORITY = 10,
+                                                T_START_TIME = DateTime.Now,
+                                                N_B_STATE = -1
+                                            };
+                                            WCSHelper.CreateTask(twoWcsTask);
+                                            WMSHelper.readLjMesCallItemTask(wmsTask.S_CODE, mesTaskId);
+                                        }
+                                    }
+                                    else
+                                    {
+                                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝搴撳尯{startLoc.S_AREA_CODE}鏈煡璇㈠埌鍙敤鐨勬帴椹充綅");
+                                    }
+                                }
+                                else
+                                {
+                                    WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝寮�璐т綅:{startLoc.S_CODE}寮傚父锛岀己灏戝鍣ㄤ俊鎭�);
+                                }
+                            }
+                            else
+                            {
+                                mesTask.AWAIT_MSG = "搴撳瓨涓嶈冻";
+                                WMSHelper.updateLjMesTask(mesTask);
+                                WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝鐗╂枡:{materialCode}搴撳瓨涓嶈冻");
+                            }
+                        }
+                    }
+                }
+            }
         }
 
         /// <summary>
@@ -1483,12 +1600,12 @@
         /// 3.鍒涘缓浣欐枡鍥炲簱浣滀笟锛屽垱寤篴gv鎼繍浠诲姟锛岃櫄鎷熺粓鐐�         /// </summary>
         /// <param name="locCode">鎴愬瀷鏈哄彨鏂欑粓鐐�/param>
-        public static void returnMaterialOrEmptyTray(string locCode) 
+        /// <param name="jtNo">鎴愬瀷鏈哄彨鏂欑粓鐐�/param>
+        public static void returnMaterialOrEmptyTray(string locCode ,string jtNo) 
         {
             if (locCode != null)
             {
-                // 2.鏌ヨmes浠诲姟涓棿琛�-                var mesTask = WMSHelper.getLjMesTaskByLoc(locCode);
+                var mesTask = WMSHelper.getLjMesTaskByJtNo(jtNo);
                 if (mesTask != null)
                 {
                     createReturnTask(locCode, mesTask);
@@ -1665,10 +1782,11 @@
                     }
                 }
 
-                if (cst.S_TYPE == "鍙枡鍑哄簱浠诲姟")
+                var bo = int.TryParse(mst.S_OP_DEF_CODE, out int mesId);
+                if (bo) 
                 {
-                    var mesTask = WMSHelper.GetLjMesTaskByAgvorderId(mst.S_CODE);
-                    callMaterial( mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
+                    var mesTask = WMSHelper.GetLjMesTaskById(mesId);
+                    callMaterial(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
                 }
             }
             return result;
@@ -2019,7 +2137,8 @@
         //----------------------------------------------------------------------------------------------------------------------------
         public class LocModel
         {
-            public string locCode { get; set; }
+            public string locCode { get; set; }  // 杩旀枡璐т綅缂栧彿
+            public string jtNo { get; set; } // 鏈哄彴鍙�         }
 
         public class ApplyDest {
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/MoboxController.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/MoboxController.cs
index 56f8e9d..6652b31 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/MoboxController.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/MoboxController.cs
@@ -70,7 +70,7 @@
         {
             LogHelper.Info("浣欐枡/绌哄伐瑁呰繑鍥�returnMaterialAndPallet 鍏ュ弬锛� + JsonConvert.SerializeObject(model), "Mobox");
             ResponseResult responseResult = new ResponseResult();
-            ApiHelper.returnMaterialOrEmptyTray(model.locCode);
+            ApiHelper.returnMaterialOrEmptyTray(model.locCode ,model.jtNo);
             LogHelper.Info("浣欐枡/绌哄伐瑁呰繑鍥�returnMaterialAndPallet 鍑哄弬锛� + JsonConvert.SerializeObject(responseResult), "Mobox");
             return responseResult;
         }
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs
index d7a5809..889f4cc 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs
@@ -23,55 +23,67 @@
     /// </summary>
     internal class Monitor
     {
-       
+
         /// <summary>
-        /// 鐩戝惉MES浠诲姟涓棿琛�-        /// 1.閽㈠寘婊℃枡涓嬬嚎
-        /// 2.鎴愬瀷鏈哄彨鏂�+        /// 鐩戝惉閽㈠寘婊℃枡涓嬬嚎MES浠诲姟
         /// </summary>
-        public static void MonitorMesTask() {
-            LogHelper.Info("鐩戝惉MES浠诲姟涓棿琛�, "WMS");
+        public static void MonitorGBOffLineMesTask() 
+        {
             var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING");
-            foreach (var mesTask in mesTaskList)
+            if (mesTaskList.Count > 0) 
             {
-                // 1.閽㈠寘婊℃枡涓嬬嚎
-                List<string> lineLoclist = new List<string>() { };
-                lineLoclist.Add("GBJTW-01");
-                lineLoclist.Add("GBJTW-02");
-                if (mesTask.MSG_TYPE == "1" && mesTask.PALLET_TYPE == "7" && lineLoclist.Contains(mesTask.PALLET_ID)) 
+                mesTaskList = mesTaskList.Where(a => a.MSG_TYPE == "1" && a.PALLET_TYPE == "7").ToList();
+                if (mesTaskList.Count > 0) 
                 {
-                    LogHelper.Info("MES閽㈠寘婊℃枡涓嬬嚎浠诲姟", "WMS");
-                    OffLineRequest request = new OffLineRequest(){ loc = mesTask.POSITION_ID, cntrNo = mesTask.PALLET_ID};
-                    ApiHelper.offLineProcess(request);
-                }
-
-                // 2.鎴愭柊鏈哄彨鏂�-                if (mesTask.MSG_TYPE == "0") {
-                    var lineSideLoc = WMSHelper.GetLineSideLoc(mesTask.POSITION_ID);  
-                    if (lineSideLoc != null ) 
+                    foreach (var mesTask in mesTaskList)
                     {
-                        LogHelper.Info("MES鎴愭柊鏈哄彨鏂欎换鍔�, "WMS");
+                        LogHelper.Info("MES閽㈠寘婊℃枡涓嬬嚎浠诲姟", "WMS");
+                        OffLineRequest request = new OffLineRequest() { loc = mesTask.POSITION_ID, cntrNo = mesTask.PALLET_ID };
+                        ApiHelper.offLineProcess(request);
+                    }
+                }
+            }
+        }
 
-                        // 2.1鎴愭柊鏈哄彨鏂�鏂滆)
-                        if (mesTask.PALLET_TYPE == "5" || mesTask.PALLET_TYPE == "6")
+        /// <summary>
+        /// 鐩戝惉鎴愬瀷鏈哄彨鏂橫ES浠诲姟
+        /// </summary>
+        public static void MonitorCXJCallMaterialMesTask()
+        {
+            var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING");
+            if (mesTaskList.Count > 0)
+            {
+                mesTaskList = mesTaskList.Where(a => a.MSG_TYPE == "0").ToList();
+                if (mesTaskList.Count > 0)
+                {
+                    foreach (var mesTask in mesTaskList)
+                    {
+                        var lineSideLoc = WMSHelper.GetLineSideLoc(mesTask.EQP);
+                        if (lineSideLoc != null)
                         {
-                            var xcTask = WMSHelper.GetLjXcTaskById(mesTask.ID);
-                            if (xcTask == null)
+                            LogHelper.Info($"鎴愬瀷鏈哄彨鏂欎换鍔★紝MES浠诲姟ID锛歿mesTask.ID}", "WMS");
+
+                            // 2.1鎴愭柊鏈哄彨鏂�鏂滆)
+                            if (mesTask.PALLET_TYPE == "5" || mesTask.PALLET_TYPE == "6")
                             {
-                                ApiHelper.callMaterialHDK(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
+                                var xcTask = WMSHelper.GetLjXcTaskById(mesTask.ID);
+                                if (xcTask == null)
+                                {
+                                    ApiHelper.callMaterialXC(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
+                                }
+                                else
+                                {
+                                    mesTask.RETURN_CODE = xcTask.RETURN_CODE;
+                                    mesTask.RECEIVE_FLAG = xcTask.RECEIVE_FLAG;
+                                    mesTask.RECEIVE_DATE = xcTask.RECEIVE_DATE;
+                                    WMSHelper.updateLjMesTask(mesTask);
+                                }
                             }
                             else
                             {
-                                mesTask.RETURN_CODE = xcTask.RETURN_CODE;
-                                mesTask.RECEIVE_FLAG = xcTask.RECEIVE_FLAG;
-                                mesTask.RECEIVE_DATE = xcTask.RECEIVE_DATE;
-                                WMSHelper.updateLjMesTask(mesTask);
+                                // 2.2 鎴愭柊鏈哄彨鏂�+                                ApiHelper.callMaterial(mesTask.MATERIAL_CODE, mesTask.EQP, mesTask.ID);
                             }
-                        }
-                        else
-                        {
-                            // 2.2 鎴愭柊鏈哄彨鏂�-                            ApiHelper.callMaterial(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
                         }
                     }
                 }
@@ -91,12 +103,15 @@
                 if (mesTask != null && mesTask.RETURN_CODE == "2")
                 {
                     Location startLoc = LocationHelper.GetLoc(outTask.POSITION_ID);
-                    Location endLoc = LocationHelper.GetLoc(mesTask.POSITION_ID);
-
-                    var wmsTask = WMSHelper.GetWmsTaskByCntr(outTask.PALLET_ID);
-                    if (wmsTask == null)
+                    if (startLoc == null) 
                     {
-                        if (startLoc.N_LOCK_STATE == 0 && endLoc.N_LOCK_STATE == 0)
+                        WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏嚭搴�鏂滆)锛岃捣鐐�{outTask.POSITION_ID}鍦╓MS绯荤粺涓笉瀛樺湪");
+                    }
+                    Location endLoc = WMSHelper.getCallMaterialLocCode(mesTask.EQP);
+                    if (endLoc != null) 
+                    {
+                        var wmsTask = WMSHelper.GetWmsTaskByCntr(outTask.PALLET_ID);
+                        if (wmsTask == null)
                         {
                             // 1.鍒涘缓鏂滆-鎴愭柊鏈哄彨鏂欎綔涓�                             wmsTask = new WMSTask()
@@ -141,39 +156,6 @@
                                     WMSHelper.UpdateTaskState(wmsTask);
                                 }
                             }
-                        }
-                        else
-                        {
-                            LogHelper.Info($"XC鍑哄簱浠诲姟ID锛歿mesTask.ID},鏃犳硶鐢熸垚鍙枡浠诲姟,璧风偣鎴栫粓鐐逛笂閿�, "鏂滆");
-                        }
-                    }
-                    else 
-                    {
-                        WCSTask wcsTask = new WCSTask()
-                        {
-                            S_OP_NAME = wmsTask.S_OP_DEF_NAME,
-                            S_OP_CODE = wmsTask.S_CODE,
-                            S_CODE = WCSHelper.GenerateTaskNo(),
-                            S_CNTR_CODE = wmsTask.S_CNTR_CODE,
-                            S_TYPE = wmsTask.S_TYPE,
-                            S_START_LOC = startLoc.S_CODE,
-                            S_START_AREA = startLoc.S_AREA_CODE,
-                            S_END_LOC = endLoc.S_CODE,
-                            S_END_AREA = endLoc.S_AREA_CODE,
-                            S_SCHEDULE_TYPE = "AGV",
-                            N_PRIORITY = 10,
-                            T_START_TIME = DateTime.Now,
-                        };
-
-                        if (WCSHelper.CreateTask(wcsTask))
-                        {
-                            // 璧风偣銆佺粓鐐瑰姞閿�-                            LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
-                            LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
-
-                            // 鏇存柊浣滀笟浠诲姟鐘舵�
-                            wmsTask.N_B_STATE = 1;
-                            WMSHelper.UpdateTaskState(wmsTask);
                         }
                     }
                 }
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/WCSCore.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/WCSCore.cs
index d77c89c..fe6838e 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/WCSCore.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/WCSCore.cs
@@ -54,7 +54,7 @@
                                     case 3:
                                         WCSHelper.UpdateStatus(cst, "寮�鍙栬揣");
                                         var locCntrRels = LocationHelper.GetLocCntr(cst.S_START_LOC);
-                                        if (locCntrRels.Count > 0) 
+                                        if (locCntrRels.Count > 0)
                                         {
                                             cst.S_CNTR_CODE = locCntrRels[0].S_CNTR_CODE;
                                             WCSHelper.UpdateWcsTask(cst);
@@ -90,9 +90,9 @@
                                 WMSHelper.addRfidAnomalyRecord(cst.S_CNTR_CODE, 2, cst.S_START_LOC, null);
                                 // 鏌ヨ鎵弿鐨凴FID
                                 // 鍙戦� 00 04 71 02鍒版壂鐮佸櫒 锛屾帴鍙楄繑鍥炴暟鎹苟瑙f瀽
-                                byte[] bytes = new byte[] { 00, 04, 71, 02 };
-                                var plc = Settings.carDeviceInfos.Where(a => a.deviceNo == model.ForkliftNo && a.enable == 1).FirstOrDefault();
-                                TcpServer.TcpServerSend(plc.address, bytes);
+                                /*    byte[] bytes = new byte[] { 00, 04, 71, 02 };
+                                    var plc = Settings.carDeviceInfos.Where(a => a.deviceNo == model.ForkliftNo && a.enable == 1).FirstOrDefault();
+                                    TcpServer.TcpServerSend(plc.address, bytes);*/
                             }
                             else if (model.State == 1002)
                             {
@@ -113,7 +113,7 @@
                                         agvEndLoc = ApiHelper.AGVApplyDest(model.No, cst.S_START_LOC, cst.S_CNTR_CODE, "2");
                                     }
 
-                                    ChangeParamModel paramModel = new ChangeParamModel() 
+                                    ChangeParamModel paramModel = new ChangeParamModel()
                                     {
                                         task_no = model.No,
                                         param_no = 0,
@@ -124,7 +124,7 @@
                                 }
                                 else
                                 {
-                                    WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"AGV浠诲姟鍥炴姤,浠诲姟瀹瑰櫒缂栫爜:{cst.S_CNTR_CODE}鐨勫鍣ㄦ病鏈夊綍鍏ュ埌WMS绯荤粺","AGV");
+                                    WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"AGV浠诲姟鍥炴姤,浠诲姟瀹瑰櫒缂栫爜:{cst.S_CNTR_CODE}鐨勫鍣ㄦ病鏈夊綍鍏ュ埌WMS绯荤粺", "AGV");
                                 }
                             }
                             else
@@ -136,39 +136,9 @@
                             // AGV浠诲姟瀹屾垚
                             if (model.State == 2)
                             {
-                                // 妫�祴鐗╂枡鏄惁鍚堟牸,濡備笉鍚堟牸锛�-                                // 鍒ゆ柇鐗╂枡鏄惁鏄幆甯﹀簱鐗╂枡锛屾槸鍒欏洖鐜甫搴擄紝骞惰鐜甫涓嬪彂鏂扮殑鐗╂枡
-                                // 闈炵幆甯﹀簱鐗╂枡锛屽垯閫�嚭绔嬪簱锛屽悓鏃朵笅鍙戞柊鐨勭墿鏂欏嚭搴撲换鍔�-                                if (cst.S_TYPE.Contains("鍙枡鍑哄簱浠诲姟"))
-                                {
-                                    var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE);
-                                    if (cntrItemRels != null && cntrItemRels.Count > 0)
-                                    {
-                                        if (cntrItemRels[0].S_ITEM_STATE == "2")
-                                        {
-                                            // 涓嶅悎鏍煎搧鍥炲簱
-                                            ApiHelper.rejectReturnStock(mst, cst);
-                                        }
-                                    }
-                                }
-
-                                // 妫�祴鏄惁鏄鐮佷綅锛岄潪璇荤爜浣嶏紝鍙互婵�椿棰勫垱寤轰换鍔�-                                var transfe = WMSHelper.GetTransfeRelevance(cst.S_END_LOC);  // 鎺ラ┏浣嶅睘鎬�-                                if (transfe != null && transfe.N_READ_LOC == 1) 
-                                {
-                                    WCSHelper.ActivatePreCreateTask(mst.S_CODE);
-                                }
-                                else if ( transfe.N_READ_LOC == 0)
-                                {
-                                    if (cst.S_TYPE.Contains("銆愬紓甯搞�"))
-                                    {
-                                        WCSHelper.ActivatePreCreateTask(mst.S_CODE,1);
-                                    }
-                                    else 
-                                    {
-                                        WCSHelper.ActivatePreCreateTask(mst.S_CODE);
-                                    }
-                                }
+                                // 婵�椿棰勫垱寤轰换鍔�+                                // 鍦烘櫙锛�.璇荤爜浣嶆縺娲婚鍒涘缓浠诲姟 2.绌哄伐瑁呭嚭搴撴縺娲绘弧鏂欎笅绾夸换鍔�闈炵洿杩�
+                                WCSHelper.ActivatePreCreateTask(mst.S_CODE);
 
                                 // 鏌ヨ鏄惁鏈夋湭瀹屾垚鐨勪换鍔�                                 if (WMSHelper.isFinishTask(mst.S_CODE))
@@ -180,16 +150,42 @@
 
                                     // 鏇存柊浠诲姟涓棿琛ㄧ姸鎬�                                     WMSHelper.updateMesTaskStatus(mst.S_CODE, "3");
+                                }
 
-                                    // 濡傛灉浣滀笟鍚嶇О涓烘垚鍨嬫満鍙枡鍑哄簱浠诲姟锛屽垯瑙﹀彂浣欐枡/绌烘墭鎼繍浠诲姟
-                                    string locCode = WMSHelper.getReturnMaterialLocCode(mst.S_END_LOC);
-                                    ApiHelper.returnMaterialOrEmptyTray(locCode);
-                                }   
+                                // 妫�祴鐗╂枡鏄惁鍚堟牸,濡備笉鍚堟牸锛�+                                // 鍒ゆ柇鐗╂枡鏄惁鏄幆甯﹀簱鐗╂枡锛屾槸鍒欏洖鐜甫搴擄紝骞惰鐜甫涓嬪彂鏂扮殑鐗╂枡
+                                // 闈炵幆甯﹀簱鐗╂枡锛屽垯閫�嚭绔嬪簱锛屽悓鏃朵笅鍙戞柊鐨勭墿鏂欏嚭搴撲换鍔�+                                if (cst.S_TYPE.Contains("鍙枡鍑哄簱浠诲姟"))
+                                {
+                                    var bo = int.TryParse(mst.S_OP_DEF_CODE, out int mesId);
+                                    if (bo) 
+                                    {
+                                        var mesTask = WMSHelper.GetLjMesTaskById(mesId);
+                                        var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE);
+                                        if (cntrItemRels != null && cntrItemRels.Count > 0)
+                                        {
+                                            if (cntrItemRels[0].S_ITEM_STATE == "2")
+                                            {
+                                                mesTask.AWAIT_MSG = "鐗╂枡妫�獙鐘舵�涓轰笉鍚堟牸锛岄噸鏂板彨鏂欎腑";
+                                                WMSHelper.updateLjMesTask(mesTask);
+
+                                                // 涓嶅悎鏍煎搧鍥炲簱
+                                                ApiHelper.rejectReturnStock(mst, cst);
+                                            }
+                                            else
+                                            {
+                                                // 濡傛灉浣滀笟鍚嶇О涓烘垚鍨嬫満鍙枡鍑哄簱浠诲姟锛屽垯瑙﹀彂浣欐枡/绌烘墭鎼繍浠诲姟
+                                                var sideLocConfig = WMSHelper.getReturnMaterialLocCode(mst.S_END_LOC);
+                                                ApiHelper.returnMaterialOrEmptyTray(sideLocConfig.S_RETURN_LOC_CODE, sideLocConfig.EQP);
+                                            }
+                                        }
+                                    } 
+                                }
                             }
                         }
                         else
                         {
-                            WMSHelper.addAlarmRecord("绯荤粺閿欒", "楂�, $"AGV浠诲姟鐘舵�鍥炴姤锛屼綔涓氬彿:{cst.S_OP_CODE}锛屾湭鏌ヨ鍒颁綔涓�,"AGV");
+                            WMSHelper.addAlarmRecord("绯荤粺閿欒", "楂�, $"AGV浠诲姟鐘舵�鍥炴姤锛屼綔涓氬彿:{cst.S_OP_CODE}锛屾湭鏌ヨ鍒颁綔涓�, "AGV");
                         }
                     }
                     else
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/LjLotOnhand.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/LjLotOnhand.cs
index 9f69fe0..547af1b 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/LjLotOnhand.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/LjLotOnhand.cs
@@ -24,5 +24,6 @@
         public float QTY { get; set; } //鏁伴噺
         public DateTime IN_DATE { get; set; } //鍏ュ簱鏃堕棿
         public DateTime CREATION_DATE { get; set; } //鍒涘缓鏃ユ湡
+        public string WAREHOUSE_TYPE { get; set; } //鍖哄垎涓嶅悓鍘傚锛�/鎬濆皵鐗癸紝2/鏉弶锛�     }
 }
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/SideLocConfig.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/SideLocConfig.cs
index bf6a4d0..f8fa32a 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/SideLocConfig.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/SideLocConfig.cs
@@ -14,6 +14,7 @@
     [SugarTable("TN_Side_Loc_Config")]
     internal class SideLocConfig : BaseModel
     {
+        public string EQP { get; set; } // 鏈哄彴鍙�         public string S_LOC_CODE { get; set; }  // 绾胯竟鍙枡璐т綅
         public string S_RETURN_LOC_CODE { get; set; } // 瀵瑰簲杩旀枡璐т綅
     }
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/LocationHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/LocationHelper.cs
index 9140963..b5f0207 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/LocationHelper.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/LocationHelper.cs
@@ -112,6 +112,19 @@
             return db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == areaCode && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
         }
 
+        internal static bool checkAreaExistCntr(List<string> areaCodes ,string cntrCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>()
+                    .LeftJoin<LocCntrRel>((a,b) => a.S_CODE == b.S_LOC_CODE)
+                    .Where((a, b) => areaCodes.Contains(a.S_AREA_CODE.Trim())
+                                && a.N_CURRENT_NUM == 0 
+                                && a.N_LOCK_STATE == 0 
+                                && a.C_ENABLE == "Y"
+                                && b.S_CNTR_CODE == cntrCode
+                                ).Count() > 0;
+        }
+
         /// <summary>
         ///鑾峰彇鎵�湁璐т綅鎵╁睍淇℃伅 
         /// </summary>
@@ -150,8 +163,16 @@
                 });
             }
             return result;
-
         }
+
+        internal static LocCntrRel GetLocCntrByCntr(string cntrCode)
+        {
+            var result = new List<LocCntrRel>();
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE.Trim() == cntrCode).OrderBy(a => a.T_CREATE).First();
+        }
+
         internal static List<LocCntrRel> GetLocCntrRel(string loc) {
             //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
             var db = new SqlHelper<object>().GetInstance();
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
index 47e90f5..66bc083 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
@@ -165,18 +165,39 @@
         }
 
         /// <summary>
-        /// 
+        /// 鏌ヨ鎴愬瀷鏈鸿繑鏂欒揣浣�         /// </summary>
         /// <param name="locCode"></param>
         /// <returns></returns>
-        public static string getReturnMaterialLocCode(string locCode)
+        public static SideLocConfig getReturnMaterialLocCode(string locCode)
         {
             var db = new SqlHelper<object>().GetInstance();
-            var returnMaterialLoc = db.Queryable<SideLocConfig>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
-            if (returnMaterialLoc != null) {
-                return returnMaterialLoc.S_RETURN_LOC_CODE;
+            return db.Queryable<SideLocConfig>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
+        }
+
+        /// <summary>
+        /// 鏌ヨ鎴愬瀷鏈哄彨鏂欎綅
+        /// </summary>
+        /// <param name="jtNo"></param>
+        /// <returns></returns>
+        public static Location getCallMaterialLocCode(string jtNo)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+
+            Location loc = null;
+            var returnMaterialLocs = db.Queryable<SideLocConfig>().Where(a => a.EQP.Trim() == jtNo).ToList();
+            if (returnMaterialLocs.Count > 0)
+            {
+                foreach (var item in returnMaterialLocs)
+                {
+                    loc = LocationHelper.GetLoc(item.S_LOC_CODE);
+                    if (loc.N_CURRENT_NUM == 0 && loc.N_LOCK_STATE == 0) 
+                    {
+                        break;
+                    }
+                }
             }
-            return null;
+            return loc;
         }
         // --------------------------------------------------------绂忓缓浣抽�-----------------------------------------
 
@@ -239,6 +260,34 @@
                 .OrderBy(a => a.S_PRI)
                 .First();
             return logicConfig;
+        }
+
+        /// <summary>
+        /// 鏌ヨ鏌愪釜鐗╂枡鍦ㄤ腑杞簱鐨勫簱瀛樹俊鎭�+        /// </summary>
+        /// <param name="itemCode"></param>
+        /// <returns></returns>
+        public static List<CntrItemRel> getZZKInventoryInfo(string itemCode) 
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            List < CntrItemRel > cntrItemRels = new List<CntrItemRel>();
+            string areaCode = Settings.areaPropertyList.Where(a => a.areaName.Contains("涓浆搴�)).Select(a => a.areaCode).FirstOrDefault();
+            if (areaCode != null) 
+            {
+                cntrItemRels = db.Queryable<CntrItemRel>()
+                    .LeftJoin<LocCntrRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
+                    .LeftJoin<Location>((a, b, c) => b.S_LOC_CODE == c.S_CODE)
+                    .LeftJoin<Container>((a, b, c, d) => a.S_CNTR_CODE == d.S_CODE)
+                    .Where((a, b, c, d) => c.S_AREA_CODE == areaCode 
+                                            && c.N_CURRENT_NUM == 1 
+                                            && c.N_LOCK_STATE == 0
+                                            && a.S_ITEM_CODE == itemCode
+                                            && d.N_E_STATE == 0             // 鎵樼洏姝e父
+                    )
+                    .OrderBy((a, b, c, d) => a.T_INBOUND_TIME)
+                    .ToList();
+            }
+            return cntrItemRels;
         }
 
         /// <summary>
@@ -380,7 +429,7 @@
             bool result = true;
             LogHelper.Info(alarmMsg, logSite);
             var alarmRecord = db.Queryable<AlarmRecord>().Where(a => a.N_IS_READ == 0 && a.S_ALARM_MSG == alarmMsg).First();
-            if (alarmRecord == null) 
+            if (alarmRecord == null)
             {
                 alarmRecord = new AlarmRecord()
                 {
@@ -391,6 +440,11 @@
                     S_FILE_NAME = logSite,
                 };
                 result = db.Insertable<AlarmRecord>(alarmRecord).ExecuteCommand() > 0;
+            }
+            else 
+            {
+                alarmRecord.T_MODIFY = DateTime.Now;
+                result = db.Updateable<AlarmRecord>(alarmRecord).ExecuteCommand() > 0;
             }
             return result;
         }
@@ -412,12 +466,12 @@
         /// <summary>
         /// 鏌ヨ鎴愬瀷鏈虹嚎杈�         /// </summary>
-        /// <param name="locCode"></param>
+        /// <param name="jtNo"></param>
         /// <returns></returns>
-        public static SideLocConfig GetLineSideLoc(string locCode)
+        public static SideLocConfig GetLineSideLoc(string jtNo)
         {
             var db = new SqlHelper<object>().GetInstance();
-            return db.Queryable<SideLocConfig>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
+            return db.Queryable<SideLocConfig>().Where(a => a.EQP.Trim() == jtNo).First();
         }
 
         /// <summary>
@@ -701,7 +755,20 @@
         }
 
         /// <summary>
-        /// 鏌ヨMES鍙枡浠诲姟
+        /// 鏍规嵁鏈哄彴鍙锋煡璇ES浠诲姟
+        /// </summary>
+        /// <param name="jtNo"></param>
+        /// <returns></returns>
+        internal static LjMesTask getLjMesTaskByJtNo(string jtNo)
+        {
+            // 1.鏌ヨMES浠诲姟琛�+            var db = new SqlHelper<object>().GetInstance();
+            var mesTask = db.Queryable<LjMesTask>().Where(a => a.EQP.Trim() == jtNo && a.RECEIVE_FLAG.Trim() == "PENDING").OrderByDescending(a => a.T_CREATE).First();
+            return mesTask;
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐐逛綅缂栧彿鏌ヨMES鍙枡浠诲姟
         /// </summary>
         /// <param name="positionId"></param>
         /// <returns></returns>
@@ -722,8 +789,6 @@
         {
             bool result = false;
             var db = new SqlHelper<object>().GetInstance();
-            mesTask.RECEIVE_FLAG = "COMPLETE";
-            mesTask.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd");
             result = db.Updateable(mesTask).ExecuteCommand() > 0;
             return result;
         }
@@ -898,30 +963,29 @@
         /// <summary>
         /// 涓嬪彂XC浠诲姟
         /// </summary>
-        /// <param name="mesTaksId"></param>
+        /// <param name="mesTask"></param>
         /// <returns></returns>
-        public static bool addLjXcTask(int mesTaksId) 
+        public static bool addLjXcTask(LjMesTask mesTask) 
         {
             bool result = false;
             var db = new SqlHelper<object>().GetInstance();
-            var ljMesTask = GetLjMesTaskById(mesTaksId);
-            if (ljMesTask != null) {
+            if (mesTask != null) {
                 LjXcTask ljXcTask = new LjXcTask() { 
-                    ID = ljMesTask.ID,
-                    POSITION_ID = ljMesTask.POSITION_ID,
-                    RETURN_CODE = ljMesTask.RETURN_CODE,
-                    MSG_TYPE = ljMesTask.MSG_TYPE,
-                    PALLET_TYPE = ljMesTask.PALLET_TYPE,
-                    MATERIAL_NAME = ljMesTask.MATERIAL_NAME,
-                    MATERIAL_CODE = ljMesTask.MATERIAL_CODE,
-                    QTY = ljMesTask.QTY,
-                    YCL_BATCH = ljMesTask.YCL_BATCH,
-                    PALLET_ID = ljMesTask.PALLET_ID,
-                    AGVORDER_ID = ljMesTask.AGVORDER_ID,
+                    ID = mesTask.ID,
+                    POSITION_ID = mesTask.POSITION_ID,
+                    RETURN_CODE = mesTask.RETURN_CODE,
+                    MSG_TYPE = mesTask.MSG_TYPE,
+                    PALLET_TYPE = mesTask.PALLET_TYPE,
+                    MATERIAL_NAME = mesTask.MATERIAL_NAME,
+                    MATERIAL_CODE = mesTask.MATERIAL_CODE,
+                    QTY = mesTask.QTY,
+                    YCL_BATCH = mesTask.YCL_BATCH,
+                    PALLET_ID = mesTask.PALLET_ID,
+                    AGVORDER_ID = mesTask.AGVORDER_ID,
                     CREATION_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
-                    RECEIVE_FLAG = ljMesTask.RECEIVE_FLAG,
-                    EQP = ljMesTask.EQP,
-                    PLAN_ID = ljMesTask.PLAN_ID
+                    RECEIVE_FLAG = mesTask.RECEIVE_FLAG,
+                    EQP = mesTask.EQP,
+                    PLAN_ID = mesTask.PLAN_ID
                 };
                 result = db.Insertable<LjXcTask>(ljXcTask).ExecuteCommand() > 0;
             }
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
index 911da84..959c9e7 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
@@ -134,7 +134,13 @@
                             EndLocGroup endLocGroup = null;
                             if (barcodeList.Count > 0) 
                             {
-                               endLocGroup = WMSHelper.getInStockEndLoc(barcodeList.Count);
+                               string itemCode = null;
+                               var cntrItemRels = ContainerHelper.GetCntrItemRel(barcodeList[0].rfid);
+                               if (cntrItemRels.Count > 0) 
+                               {
+                                    itemCode = cntrItemRels[0].S_ITEM_CODE;
+                               }
+                               endLocGroup = WMSHelper.getInStockEndLoc(barcodeList.Count, itemCode);
                             }
 
                             foreach (var ext in extData)
@@ -365,126 +371,120 @@
         {
             ResponseResult response = new ResponseResult();
 
-            //鍙傛暟鏍¢獙
-            if (model.locCodes.Count == 0) 
+            int locNum = model.locCodes.Count;
+            if (locNum > 0) 
             {
-                string msg = $"纭寲鏈猴細{model.mcn}鍛煎彨鑳氳儙鍑哄簱锛屽弬鏁版牎楠屽け璐ワ紝缂哄皯璐т綅淇℃伅";
-                LogHelper.Info(msg, "WMS");
-                response.code = 1;
-                response.msg = msg;
-                return response;
-            }
-
-            // 1.涓�釜纭寲鏈哄伐浣嶅彧鑳藉悓鏃跺瓨鍦ㄤ竴涓鍦ㄦ墽琛屼腑鐨勪换鍔�-            WCSTask existTask = WCSHelper.GetTaskByEqNo(model.mcn);
-            if (existTask == null)
-            {
-                // 2.鏍规嵁褰撳墠鏃堕棿锛屽垽鏂彮娆℃棩鏈熷拰鐝
-                var currentTime = DateTime.Now;
-                var shift = getShift(currentTime.TimeOfDay);
-                var dateShift = DateTime.Now.ToString("dd/MM/yyyy");
-                TimeSpan shiftIII_Start = new TimeSpan(7, 00, 0); // 7:00:00
-                if (shift == "III" && currentTime.TimeOfDay < shiftIII_Start)
+                Location prevLoc = null;
+                Dictionary<string,Location> outLocDic = new Dictionary<string,Location>();
+                foreach (var mcn in model.locCodes)
                 {
-                    dateShift = DateTime.Now.AddDays(-1).ToString("dd/MM/yyyy");
+                    // 1.涓�釜纭寲鏈哄伐浣嶅彧鑳藉悓鏃跺瓨鍦ㄤ竴涓鍦ㄦ墽琛屼腑鐨勪换鍔�+                    var existTask = WCSHelper.GetTaskByEnd(mcn);
+                    if (existTask.Count == 0) 
+                    {
+                        // 2.鏍规嵁褰撳墠鏃堕棿锛屽垽鏂彮娆℃棩鏈熷拰鐝
+                        var currentTime = DateTime.Now;
+                        var shift = getShift(currentTime.TimeOfDay);  // 鐝
+                        var dateShift = currentTime.ToString("dd/MM/yyyy");
+                        TimeSpan shiftIII_Start = new TimeSpan(7, 00, 0); // 7:00:00
+                        if (shift == "III" && currentTime.TimeOfDay < shiftIII_Start)
+                        {
+                            dateShift = DateTime.Now.AddDays(-1).ToString("dd/MM/yyyy");
+                        }
+
+                        // 3.鏍规嵁鐝鏃ユ湡+鐝+纭寲鏈哄伐浣嶅彿鏌ヨ 纭寲鏈哄伐鍗�涓殑鐗╂枡缂栫爜銆侀璁$敓浜ф暟閲�+                        var productionShedule = WMSHelper.getProductionShedule(dateShift, mcn, shift);
+
+                        if (productionShedule != null && productionShedule.QTY != 0)
+                        {
+                            // 4鏌ヨ銆愯儦鑳庡凡瀹屾垚鐨勬潯鐮佷腑闂磋〃銆戝苟璁$畻褰撳墠鐝鐨勫凡瀹屾垚鏁伴噺
+                            int finishNum = WMSHelper.getEmbryoFinishNum(dateShift, mcn, shift);
+                            if (productionShedule.QTY > finishNum)
+                            {
+                                // 5.鍑哄簱绛栫暐 1.浼樺厛鏌ヨ鍓嶄竴鎷栬揣浣嶇殑宸﹀彸涓よ竟鏄惁婊¤冻鏉′欢  2.璁$畻锛�.宸烽亾涓嶆姤璀︺�2.鐗╂枡鐘舵�OK銆�.灏忎簬澶辨晥鏃堕棿 澶т簬绛変簬鐢熸晥鏃堕棿 4.鍔犳�鏂欏厛鍑恒�5.鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級锛夊嚭搴撶墿鏂欙紝鐢熸垚浠诲姟
+                                var startLoc = WMSHelper.getOutStockStartLoc(productionShedule.ITEMCODE, prevLoc);
+                                if (startLoc != null) 
+                                {
+                                    outLocDic.Add(mcn, startLoc);
+                                    prevLoc = startLoc;
+                                }
+                            }
+                        }
+                    }
                 }
 
-                // 3.鏍规嵁鐝鏃ユ湡+鐝+纭寲鏈哄伐浣嶅彿鏌ヨ鍛煎彨鐨勭墿鏂欑紪鐮併�棰勮鐢熶骇鏁伴噺
-                var productionShedule = WMSHelper.getProductionShedule(dateShift, model.mcn, shift);
-                if (productionShedule != null && productionShedule.QTY != 0)
+                // 6.鍒ゆ柇鍑哄簱璐т綅鏄惁鏄悓涓�贩閬擄紝鍚屼竴宸烽亾鐢熸垚浠诲姟缁勫彿
+                string groupNo = null;
+                if (outLocDic.Count > 1) 
                 {
-                    // 4.鏌ヨ銆愯儦鑳庡凡瀹屾垚鐨勬潯鐮佷腑闂磋〃銆戝苟璁$畻褰撳墠鐝鐨勫凡瀹屾垚鏁伴噺
-                    int finishNum = WMSHelper.getEmbryoFinishNum(dateShift, model.mcn, shift);
-
-                    if (productionShedule.QTY > finishNum)
+                    var groupNum = outLocDic.Select(a => a.Value).ToList().GroupBy(a => a.N_ROADWAY).Count();
+                    if (groupNum == 1) 
                     {
-                        // 5.璁$畻锛�.宸烽亾涓嶆姤璀︺�2.鐗╂枡鐘舵�OK銆�.灏忎簬澶辨晥鏃堕棿 澶т簬绛変簬鐢熸晥鏃堕棿 4.鍔犳�鏂欏厛鍑恒�5.鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級锛夊嚭搴撶墿鏂欙紝鐢熸垚浠诲姟
-                        int locNum = model.locCodes.Count;
-                        var startLocData = WMSHelper.getOutStockStartLoc(productionShedule.ITEMCODE,locNum);
-                        if (startLocData.startLocList != null && startLocData.startLocList.Count == locNum)
+                        groupNo = GenerateTaskGroupNo();
+                    }
+                }
+
+                // 7.鐢熸垚鍑哄簱浠诲姟
+                if (outLocDic.Count > 0) 
+                {
+                    foreach (var item in outLocDic)
+                    {
+                        Location endLoc = LocationHelper.GetLoc(item.Key);
+                        Location startLoc = item.Value;
+                        if (endLoc != null)
                         {
-                            var startLocList = startLocData.startLocList;
-                            for (int i = 0; i < locNum; i++)
+                            var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
+                            if (locCntrRels != null && locCntrRels.Count > 0)
                             {
-                                Location startLoc = startLocList[i];
-                                Location endLoc =  LocationHelper.GetLoc(model.locCodes[i]);
-                                if (endLoc != null) 
+                                var wmsTask = new WMSTask()
                                 {
-                                    var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
-                                    if (locCntrRels != null && locCntrRels.Count > 0) 
+                                    S_CNTR_CODE = locCntrRels[0].S_CNTR_CODE,
+                                    S_CODE = WMSHelper.GenerateTaskNo(),
+                                    S_START_LOC = startLoc.S_CODE,
+                                    S_START_AREA = startLoc.S_AREA_CODE,
+                                    S_END_LOC = endLoc.S_CODE,
+                                    S_END_AREA = endLoc.S_AREA_CODE,
+                                    S_TYPE = "婊℃枡涓嬬嚎鍏ュ簱浠诲姟",
+                                    S_OP_DEF_CODE = model.reqId,
+                                    S_OP_DEF_NAME = "鎴愬瀷鏈烘弧鏂欎笅绾垮叆搴�,
+                                    N_PRIORITY = 1,
+                                    T_START_TIME = DateTime.Now,
+                                    S_GROUP_NO = groupNo,
+                                };
+                                if (WMSHelper.CreateWmsTask(wmsTask))
+                                {
+                                    // 鍒涘缓涓�鍏ュ簱浠诲姟
+                                    WCSTask wcsTask = new WCSTask()
                                     {
-                                        var wmsTask = new WMSTask()
-                                        {
-                                            S_CNTR_CODE = locCntrRels[0].S_CNTR_CODE,
-                                            S_CODE = WMSHelper.GenerateTaskNo(),
-                                            S_START_LOC = startLoc.S_CODE,
-                                            S_START_AREA = startLoc.S_AREA_CODE,
-                                            S_END_LOC = endLoc.S_CODE,
-                                            S_END_AREA = endLoc.S_AREA_CODE,
-                                            S_TYPE = "婊℃枡涓嬬嚎鍏ュ簱浠诲姟",
-                                            S_OP_DEF_CODE = model.reqId,
-                                            S_OP_DEF_NAME = "鎴愬瀷鏈烘弧鏂欎笅绾垮叆搴�,
-                                            N_PRIORITY = 1,
-                                            T_START_TIME = DateTime.Now,
-                                            S_GROUP_NO = startLocData.groupNo,
-                                        };
-                                        if (WMSHelper.CreateWmsTask(wmsTask))
-                                        {
-                                            // 鍒涘缓涓�鍏ュ簱浠诲姟
-                                            WCSTask wcsTask = new WCSTask()
-                                            {
-                                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
-                                                S_OP_CODE = wmsTask.S_CODE,
-                                                S_CODE = WCSHelper.GenerateTaskNo(),
-                                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
-                                                S_TYPE = wmsTask.S_TYPE,
-                                                S_START_LOC = startLoc.S_CODE,
-                                                S_START_AREA = startLoc.S_AREA_CODE,
-                                                S_END_LOC = endLoc.S_CODE,
-                                                S_END_AREA = endLoc.S_AREA_CODE,
-                                                S_SCHEDULE_TYPE = "WCS",
-                                                N_PRIORITY = 1,
-                                                T_START_TIME = DateTime.Now,
-                                            };
+                                        S_OP_NAME = wmsTask.S_OP_DEF_NAME,
+                                        S_OP_CODE = wmsTask.S_CODE,
+                                        S_CODE = WCSHelper.GenerateTaskNo(),
+                                        S_CNTR_CODE = wmsTask.S_CNTR_CODE,
+                                        S_TYPE = wmsTask.S_TYPE,
+                                        S_START_LOC = startLoc.S_CODE,
+                                        S_START_AREA = startLoc.S_AREA_CODE,
+                                        S_END_LOC = endLoc.S_CODE,
+                                        S_END_AREA = endLoc.S_AREA_CODE,
+                                        S_SCHEDULE_TYPE = "WCS",
+                                        N_PRIORITY = 1,
+                                        T_START_TIME = DateTime.Now,
+                                    };
 
-                                            if (WCSHelper.CreateTask(wcsTask))
-                                            {
-                                                // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�-                                                LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
-                                                LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
+                                    if (WCSHelper.CreateTask(wcsTask))
+                                    {
+                                        // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+                                        LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
+                                        LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
 
-                                                // 鏇存柊浣滀笟浠诲姟鐘舵�
-                                                wmsTask.N_B_STATE = 1;
-                                                WMSHelper.UpdateTaskState(wmsTask);
-                                            }
-                                        }
+                                        // 鏇存柊浣滀笟浠诲姟鐘舵�
+                                        wmsTask.N_B_STATE = 1;
+                                        WMSHelper.UpdateTaskState(wmsTask);
                                     }
                                 }
                             }
                         }
-                        else 
-                        {
-                            string msg = $"搴撳唴娌℃湁婊¤冻鏉′欢鐨勭墿鏂�;
-                            LogHelper.Info(msg, "WMS");
-                            response.code = 1;
-                            response.msg = msg;
-                        }
-                    }
-                    else
-                    {
-                        string msg = $"纭寲鏈�{model.mcn}鐨勫綋鍓嶇彮娆′换鍔″凡瀹屾垚锛屽仠姝㈠彨鏂�;
-                        LogHelper.Info(msg, "WMS");
-                        response.code = 1;
-                        response.msg = msg;
                     }
                 }
-            }
-            else 
-            {
-                string msg = $"纭寲鏈猴細{model.mcn}鐨勫瓨鍦ㄦ鍦ㄦ墽琛屼腑鐨勪换鍔★紝璇峰嬁閲嶅鍙枡";
-                LogHelper.Info(msg, "WMS");
-                response.code = 1;
-                response.msg = msg;
             }
             return response;
         }
@@ -498,7 +498,7 @@
         {
             ResponseResult response = new ResponseResult();
             Location startLoc = LocationHelper.GetLoc(model.startLoc);
-            var endLocGroup = WMSHelper.getInStockEndLoc(1);
+            var endLocGroup = WMSHelper.getInStockEndLoc(1,null);
             if (endLocGroup.endLocList.Count == 1)
             {
                 Location endLoc = endLocGroup.endLocList[0];
@@ -562,11 +562,10 @@
         public static ResponseResult callEmptyTrayOutStock(CallEmptyTrayOutStockModel model) 
         {
             ResponseResult responseResult = new ResponseResult();
-            Location endLoc = LocationHelper.GetLoc(model.endLoc);
-            var startLocData = WMSHelper.getOutStockStartLoc(null, 1);
-            if (startLocData.startLocList != null && startLocData.startLocList.Count == 1)
+            Location startLoc = WMSHelper.getOutStockStartLoc(null);
+            if (startLoc != null) 
             {
-                Location startLoc = startLocData.startLocList[0];
+                Location endLoc = LocationHelper.GetLoc(model.endLoc);
                 if (endLoc != null)
                 {
                     var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
@@ -584,8 +583,7 @@
                             S_OP_DEF_CODE = model.reqId,
                             S_OP_DEF_NAME = "鍛煎彨绌烘墭鍑哄簱",
                             N_PRIORITY = 1,
-                            T_START_TIME = DateTime.Now,
-                            S_GROUP_NO = startLocData.groupNo,
+                            T_START_TIME = DateTime.Now
                         };
                         if (WMSHelper.CreateWmsTask(wmsTask))
                         {
@@ -619,13 +617,16 @@
                         }
                     }
                 }
+                else 
+                {
+                    responseResult.code = 1;
+                    responseResult.msg = $"缁堢偣璐т綅:{model.endLoc}鍦╓MS绯荤粺涓笉瀛樺湪";
+                }
             }
-            else
+            else 
             {
-                string msg = $"搴撳唴娌℃湁婊¤冻鏉′欢鐨勭墿鏂�;
-                LogHelper.Info(msg, "WMS");
                 responseResult.code = 1;
-                responseResult.msg = msg;
+                responseResult.msg = "搴撳唴绌烘墭涓嶈冻";
             }
             return responseResult;
         }
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/WmsController.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/WmsController.cs
index 89ec50a..6d02829 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/WmsController.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/WmsController.cs
@@ -230,8 +230,7 @@
         {
             public string reqId { get; set; }
             public string reqTime { get; set; }
-            public string mcn { get; set; }
-            public List<string> locCodes { get; set; }
+            public List<string> locCodes { get; set; }  // 纭寲鏈哄伐浣�         }
 
         public class NotifyDeviceSignalModel 
diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs
index 5e8905b..da0078c 100644
--- a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs
+++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs
@@ -384,121 +384,309 @@
             return greenTireInformation;
         }
 
-        /// <summary>
+        /*/// <summary>
         /// 鏌ヨ鍏ュ簱缁堢偣璐т綅
+        /// 鍏ュ簱绛栫暐锛�+        /// 宸烽亾鍐呭悓瑙勬牸鏁伴噺 灏忎簬 10锛堟殏瀹氾級锛屾寜鐗╂枡鍧囪 璁$畻锛屽鏋滄墍鏈夌殑宸烽亾鍐呭悓瑙勬牸鏁伴噺閮藉ぇ浜�0锛屽垯鎸夌収宸烽亾鍧囪 璁$畻
         /// </summary>
         /// <param name="locNum">1.鍗曡揣浣�2.鍙岃揣浣�/param>
         /// <returns></returns>
-        public static EndLocGroup getInStockEndLoc(int locNum) 
+        public static EndLocGroup getInStockEndLoc(int locNum , string itemCode) 
         {
             var db = new SqlHelper<object>().GetInstance();
             EndLocGroup endLocGroup = new EndLocGroup();
             List<Location> locations = new List<Location>();
-            // 1.鎸夊绉巼浠庡ぇ鍒板皬锛屽宸烽亾杩涜鎺掑簭
-            var roadwayOrderList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y")
-                .GroupBy(a => a.N_ROADWAY)
-                .Select(a => new { roadway = a.N_ROADWAY ,  num = SqlFunc.AggregateCount(a.S_CODE)})
-                .OrderByDescending(a => a.num)
+
+            List<int> roadwayList = new List<int>();
+
+            // 1.鎸夊贩閬撹繘琛屽垎缁勶紝鏌ヨ姣忎釜宸烽亾鍐呭悓瑙勬牸鐗╂枡鐨勬暟閲忥紝骞朵粠灏忓埌澶ф帓搴�+            var roadwayItemNumOrderGroup = db.Queryable<Location>()
+                .LeftJoin<LocCntrRel>((a,b) => a.S_CODE == b.S_LOC_CODE)
+                .LeftJoin<CntrItemRel>((a,b,c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
+                .Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && c.S_ITEM_CODE == itemCode)
+                .GroupBy((a, b, c) => a.N_ROADWAY)
+                .Select((a, b, c) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateCount(a.S_CODE) })
+                .OrderBy(a => a.num)
                 .ToList();
 
-            // 鏌ヨ鍗曡揣浣�-            foreach (var order in roadwayOrderList)
+            roadwayList = roadwayItemNumOrderGroup.Where(a => a.num < 10).OrderBy(a => a.num).Select(a => a.roadway).ToList();
+
+            // 2.鎸夊贩閬撹繘琛屽垎缁勶紝鏌ヨ姣忎釜宸烽亾绌鸿揣浣嶆暟閲忥紝骞朵粠澶у埌灏忔帓搴�+            if (roadwayList.Count == 0) 
             {
-                if (locNum == 1) 
+                var roadwayEmptyNumOrderGroup = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y")
+                    .GroupBy(a => a.N_ROADWAY)
+                    .Select(a => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateCount(a.S_CODE) })
+                    .OrderByDescending(a => a.num)
+                    .ToList();
+                roadwayList = roadwayEmptyNumOrderGroup.Select(a => a.roadway).ToList();
+            }
+
+            if (roadwayList.Count > 0) 
+            {
+                // 鏌ヨ鍗曡揣浣�+                foreach (var roadway in roadwayList)
                 {
-                    /*// 鏌ヨ鎵�湁鐩稿悓鐗╂枡璐т綅
-                    var sameItemLocList = db.Queryable<Location>()
-                       .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
-                       .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
-                       .Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea
-                                       && a.N_ROADWAY == order.roadway
-                                       && a.N_CURRENT_NUM == 1
-                                       && a.N_LOCK_STATE == 0
-                                       && a.C_ENABLE == "Y"
-                                       && b.S_CNTR_CODE != null
-                                       && c.S_ITEM_CODE == itemCode
-                                       )
-                       .OrderBy((a, b, c) => new { a.N_LAYER, a.N_COL })
-                       .ToList();
-
-                    // 鏌ヨ鐩稿悓鐗╂枡鐨勫乏鍙虫槸鍚︽湁绌鸿揣浣�-                    foreach (var loc in sameItemLocList)
+                    if (locNum == 1)
                     {
-                        var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (leftLoc != null)
+                        // 鏌ヨ绌鸿揣浣�+                        var emptyLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).First();
+                        if (emptyLoc != null)
                         {
-                            locations.Add(leftLoc);
-                            break;
+                            locations.Add(emptyLoc);
+                            endLocGroup.endLocList = locations;
+                            return endLocGroup;
                         }
+                    }
 
-                        var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (rightLoc != null)
-                        {
-                            locations.Add(leftLoc);
-                            break;
-                        }
-                    }*/
-
-                    // 鏌ヨ绌鸿揣浣�-                    var emptyLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).First();
-                    if (emptyLoc != null) 
+                    if (locNum == 2)
                     {
-                        locations.Add(emptyLoc);
-                        endLocGroup.endLocList = locations;
-                        return endLocGroup;
+                        var emptyLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).ToList();
+                        if (emptyLocList.Count > 0)
+                        {
+                            // 浼樺厛鏌ヨ鐩搁偦鍙屾嫋绌鸿揣浣�+                            if (locations.Count == 0)
+                            {
+                                foreach (var loc in emptyLocList)
+                                {
+                                    // 鏌ヨ鐩搁偦宸︿晶鏄惁鏈夌┖璐т綅
+                                    var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
+                                    if (leftLoc != null)
+                                    {
+                                        locations.Add(loc);
+                                        locations.Add(leftLoc);
+                                        break;
+                                    }
+
+                                    // 鏌ヨ鐩搁偦鍙充晶鏄惁鏈夌┖璐т綅
+                                    var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
+                                    if (rightLoc != null)
+                                    {
+                                        locations.Add(loc);
+                                        locations.Add(rightLoc);
+                                        break;
+                                    }
+                                }
+                            }
+
+                            if (locations.Count < locNum) 
+                            {
+                                // 鏌ヨ涓嶇浉閭荤殑鍗曟嫋璐т綅
+                                foreach (var loc in emptyLocList)
+                                {
+                                    locations.Add(loc);
+                                    if (locations.Count == locNum)
+                                    {
+                                        break;
+                                    }
+                                }
+                            }
+
+                            if (locations.Count == locNum)
+                            {
+                                endLocGroup.endLocList = locations;
+                                // 鏍¢獙璐т綅鏄惁鏄悓宸烽亾锛屾槸鍒欑敓鎴愪换鍔$粍鍙�+                                var groupNum = locations.GroupBy(a => a.N_ROADWAY).Count();
+                                if (groupNum == 1) 
+                                {
+                                    endLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
+                                }
+                                return endLocGroup;
+                            }
+                        }
                     }
                 }
-
-                if (locNum == 2) 
-                {
-                    var emptyLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).ToList();
-
-                    if (emptyLocList.Count > 0)
-                    {
-                        // 鏌ヨ鍙屾嫋绌鸿揣浣�-                        if (locations.Count == 0) 
-                        {
-                            foreach (var loc in emptyLocList)
-                            {
-                                var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                                if (leftLoc != null)
-                                {
-                                    locations.Add(loc);
-                                    locations.Add(leftLoc);
-                                    break;
-                                }
-
-                                var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                                if (rightLoc != null)
-                                {
-                                    locations.Add(loc);
-                                    locations.Add(leftLoc);
-                                    break;
-                                }
-                            }
-
-                            if (locations.Count == locNum)
-                            {
-                                endLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
-                                endLocGroup.endLocList = locations;
-                                return endLocGroup;
-                            }
-                        }
-
-                        // 鏌ヨ鍗曟嫋璐т綅
-                        foreach (var loc in emptyLocList)
-                        {
-                            locations.Add(loc);
-                            if (locations.Count == locNum)
-                            {
-                                endLocGroup.endLocList = locations;
-                                return endLocGroup;
-                            }
-                        }
-                    }
-                } 
             }
             return endLocGroup;
+        }*/
+
+        /// <summary>
+        /// 鏌ヨ鍏ュ簱缁堢偣璐т綅
+        /// 鍏ュ簱绛栫暐锛�+        /// 宸烽亾鍐呭悓瑙勬牸鏁伴噺 灏忎簬 10锛堟殏瀹氾級锛屾寜鐗╂枡鍧囪 璁$畻锛屽鏋滄墍鏈夌殑宸烽亾鍐呭悓瑙勬牸鏁伴噺閮藉ぇ浜�0锛屽垯鎸夌収宸烽亾鍧囪 璁$畻
+        /// </summary>
+        /// <param name="locNum"></param>
+        /// <param name="itemCode"></param>
+        /// <returns></returns>
+        public static EndLocGroup getInStockEndLoc(int locNum, string itemCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            EndLocGroup endLocGroup = new EndLocGroup { endLocList = new List<Location>() };
+
+            // 1. 鑾峰彇鍊欓�宸烽亾鍒楄〃锛堢墿鏂欏潎琛℃垨宸烽亾鍧囪 锛�+            var candidateRoadways = GetCandidateRoadways(db, itemCode);
+            if (candidateRoadways.Count == 0) return endLocGroup;
+
+            // 2. 澶勭悊鍗曡揣浣嶅叆搴�+            if (locNum == 1)
+            {
+                return FindSingleLocation(db, candidateRoadways);
+            }
+
+            // 3. 澶勭悊鍙岃揣浣嶅叆搴�+            return FindDoubleLocations(db, candidateRoadways);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍊欓�宸烽亾鍒楄〃锛堟寜绛栫暐鎺掑簭锛�+        /// </summary>
+        private static List<int> GetCandidateRoadways(SqlSugarClient db, string itemCode)
+        {
+            // 绛栫暐1锛氬贩閬撳唴鍚岃鏍肩墿鏂�< 10 鐨勫贩閬擄紙鎸夋暟閲忓崌搴忥級
+            var materialRoadways = db.Queryable<Location>()
+                .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
+                .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
+                .Where((a, b, c) =>
+                    a.S_AREA_CODE == Settings.stockArea &&
+                    a.N_CURRENT_NUM == 1 &&
+                    a.N_LOCK_STATE == 0 &&
+                    a.C_ENABLE == "Y" &&
+                    b.S_CNTR_CODE != null &&
+                    c.S_ITEM_CODE == itemCode)
+                .GroupBy(a => a.N_ROADWAY)
+                .Having(a => SqlFunc.AggregateCount(a.S_CODE) < 10)
+                .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) })
+                .OrderBy(a => a.Count)
+                .Select(a => a.Roadway)
+                .ToList();
+
+            if (materialRoadways.Count > 0) return materialRoadways;
+
+            // 绛栫暐2锛氭墍鏈夊贩閬撴寜绌鸿揣浣嶆暟闄嶅簭鎺掑簭
+            return db.Queryable<Location>()
+                .Where(a =>
+                    a.S_AREA_CODE == Settings.stockArea &&
+                    a.N_CURRENT_NUM == 0 &&
+                    a.N_LOCK_STATE == 0 &&
+                    a.C_ENABLE == "Y")
+                .GroupBy(a => a.N_ROADWAY)
+                .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) })
+                .OrderByDescending(a => a.Count)
+                .Select(a => a.Roadway)
+                .ToList();
+        }
+
+        /// <summary>
+        /// 鏌ユ壘鍗曡揣浣�+        /// </summary>
+        private static EndLocGroup FindSingleLocation(SqlSugarClient db, List<int> candidateRoadways)
+        {
+            foreach (var roadway in candidateRoadways)
+            {
+                var location = db.Queryable<Location>()
+                    .Where(a =>
+                        a.S_AREA_CODE == Settings.stockArea &&
+                        a.N_ROADWAY == roadway &&
+                        a.N_CURRENT_NUM == 0 &&
+                        a.N_LOCK_STATE == 0 &&
+                        a.C_ENABLE == "Y")
+                    .OrderBy(a => a.N_LAYER)
+                    .OrderBy(a => a.N_COL)
+                    .First();
+
+                if (location != null)
+                {
+                    return new EndLocGroup
+                    {
+                        endLocList = new List<Location> { location }
+                    };
+                }
+            }
+            return new EndLocGroup();
+        }
+
+        /// <summary>
+        /// 鏌ユ壘鍙岃揣浣嶏紙浼樺寲鐩搁偦璐т綅鏌ユ壘锛�+        /// </summary>
+        private static EndLocGroup FindDoubleLocations(SqlSugarClient db, List<int> candidateRoadways)
+        {
+            // 鍏堝皾璇曟壘鐩搁偦璐т綅
+            foreach (var roadway in candidateRoadways)
+            {
+                // 涓�鎬ц幏鍙栧贩閬撴墍鏈夌┖璐т綅锛堝噺灏慏B鏌ヨ锛�+                var emptyLocs = db.Queryable<Location>()
+                    .Where(a =>
+                        a.S_AREA_CODE == Settings.stockArea &&
+                        a.N_ROADWAY == roadway &&
+                        a.N_CURRENT_NUM == 0 &&
+                        a.N_LOCK_STATE == 0 &&
+                        a.C_ENABLE == "Y")
+                    .OrderBy(a => a.N_LAYER)
+                    .OrderBy(a => a.N_COL)
+                    .ToList();
+
+                if (emptyLocs.Count < 2) continue;
+
+                // 鍦ㄥ唴瀛樹腑鏌ユ壘鐩搁偦璐т綅锛堥珮鎬ц兘锛�+                var adjacentPair = FindAdjacentLocations(emptyLocs);
+                if (adjacentPair != null)
+                {
+                    return CreateDoubleLocGroup(adjacentPair);
+                }
+            }
+
+            // 娌℃湁鐩搁偦璐т綅鏃讹紝鍙栦换鎰忎袱涓揣浣�+            foreach (var roadway in candidateRoadways)
+            {
+                var emptyLocs = db.Queryable<Location>()
+                    .Where(a =>
+                        a.S_AREA_CODE == Settings.stockArea &&
+                        a.N_ROADWAY == roadway &&
+                        a.N_CURRENT_NUM == 0 &&
+                        a.N_LOCK_STATE == 0 &&
+                        a.C_ENABLE == "Y")
+                    .OrderBy(a => a.N_LAYER)
+                    .OrderBy(a => a.N_COL)
+                    .Take(2)
+                    .ToList();
+
+                if (emptyLocs.Count == 2)
+                {
+                    return CreateDoubleLocGroup(emptyLocs);
+                }
+            }
+
+            return new EndLocGroup();
+        }
+
+        /// <summary>
+        /// 鍦ㄥ唴瀛樹腑鏌ユ壘鐩搁偦璐т綅锛堥珮鏁堢畻娉曪級
+        /// </summary>
+        private static List<Location> FindAdjacentLocations(List<Location> locations)
+        {
+            // 鎸夊眰->鍒楁帓搴忥紝渚夸簬鏌ユ壘鐩搁偦
+            var sorted = locations
+                .OrderBy(l => l.N_LAYER)
+                .ThenBy(l => l.N_COL)
+                .ToList();
+
+            for (int i = 0; i < sorted.Count - 1; i++)
+            {
+                var current = sorted[i];
+                var next = sorted[i + 1];
+
+                // 鍒ゆ柇鏄惁鍚屼竴灞備笖鐩搁偦鍒�+                if (current.N_LAYER == next.N_LAYER &&
+                    current.N_COL + 1 == next.N_COL)
+                {
+                    return new List<Location> { current, next };
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 鍒涘缓鍙岃揣浣嶈繑鍥炵粨鏋�+        /// </summary>
+        private static EndLocGroup CreateDoubleLocGroup(List<Location> locations)
+        {
+            return new EndLocGroup
+            {
+                endLocList = locations,
+                groupNo = locations.GroupBy(a => a.N_ROADWAY).Count() == 1
+                    ? WMSHelper.GenerateTaskGroupNo()
+                    : null
+            };
         }
 
         public class EndLocGroup
@@ -509,14 +697,15 @@
 
         /// <summary>
         /// 鏌ヨ鍑哄簱寮�璐т綅
-        /// 璁$畻锛�.宸烽亾涓嶆姤璀︺�2.鐗╂枡鐘舵�OK銆�.灏忎簬澶辨晥鏃堕棿 澶т簬绛変簬鐢熸晥鏃堕棿 4.鍔犳�鏂欏厛鍑恒�5.鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級锛夊嚭搴撶墿鏂�+        /// 1.璁$畻锛�.宸烽亾涓嶆姤璀︺�2.鐗╂枡鐘舵�OK銆�.灏忎簬澶辨晥鏃堕棿 澶т簬绛変簬鐢熸晥鏃堕棿 4.鍔犳�鏂欏厛鍑恒�5.鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級锛夊嚭搴撶墿鏂�+        /// 2.鍚岀瓑鏉′欢涓嬶紝浼樺厛鍙栧墠涓�墭璐х殑鐩搁偦璐т綅(鏆傛椂涓嶅仛鑰冭檻锛岄渶纭畾鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級鏄寜澶╃畻锛岃繕鏄簿纭埌鏃跺垎绉�
         /// </summary>
         /// <param name="itemCode"></param>
-        /// <param name="locNum"></param>
-        public static StartLocGroup getOutStockStartLoc(string itemCode, int locNum ) 
+        /// <param name="prevLoc"></param>
+        public static Location getOutStockStartLoc(string itemCode, Location prevLoc = null) 
         {
             var db = new SqlHelper<object>().GetInstance();
-            StartLocGroup startLocGroup = new StartLocGroup();
+            Location startLoc = null;
 
             // 1.鏌ヨ锛堢墿鏂欑姸鎬丱K 锛屼笖灏忎簬澶辨晥鏃堕棿锛屽ぇ浜庣瓑浜庣敓鏁堟椂闂达級鍑哄簱鐗╂枡锛屽苟鎸夊姞鎬ユ枡鍏堝嚭锛屽厛鍏ュ厛鍑猴紙鐢熶骇鏃堕棿锛夌殑鍘熷垯杩涜鎺掑簭
             var query = db.Queryable<Location>()
@@ -557,48 +746,10 @@
                         continue;
                     }
 
-                    var cntrItemRel = db.Queryable<CntrItemRel>().LeftJoin<LocCntrRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE).Where((a, b) => b.S_LOC_CODE == loc.S_CODE).First();
-                    if (cntrItemRel != null) 
-                    {
-                        startLocGroup.startLocList.Add(loc);
-                        if (locNum == startLocGroup.startLocList.Count) 
-                        {
-                            break;
-                        }
-
-                        var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (leftLoc != null)
-                        {
-                            var locCntrRel = db.Queryable<LocCntrRel>()
-                               .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
-                               .Where((a, b) => a.S_LOC_CODE == leftLoc.S_CODE && b.S_ITEM_CODE == itemCode)
-                               .First();
-                            if (locCntrRel != null)
-                            {
-                                startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
-                                startLocGroup.startLocList.Add(leftLoc);
-                                break;
-                            }
-                        }
-
-                        var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (rightLoc != null && startLocGroup.startLocList.Count == 0)
-                        {
-                            var locCntrRel = db.Queryable<LocCntrRel>()
-                                .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
-                                .Where((a, b) => a.S_LOC_CODE == rightLoc.S_CODE && b.S_ITEM_CODE == itemCode)
-                                .First();
-                            if (locCntrRel != null)
-                            {
-                                startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
-                                startLocGroup.startLocList.Add(rightLoc);
-                                break;
-                            }
-                        }
-                    }
+                    startLoc = loc;
                 }
             }
-            return startLocGroup;
+            return startLoc;
 
         }
 

--
Gitblit v1.9.1