From 41388b3fc48589a26ba7e79fc60ffc0facd21be7 Mon Sep 17 00:00:00 2001
From: cjs <2216046164@qq.com>
Date: 星期五, 30 五月 2025 17:21:43 +0800
Subject: [PATCH] 11

---
 HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs | 1437 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 1,134 insertions(+), 303 deletions(-)

diff --git a/HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs b/HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs
index af9ada7..788c9d7 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs
@@ -100,39 +100,43 @@
         internal static void sendSing(WCSTask wmsTask, int state = 0)
         {
             LogHelper.Info($"鏀跺埌浠诲姟{wmsTask.S_CODE}淇″彿{state},绫诲瀷{wmsTask.S_TYPE}");
-            int devType = wmsTask.S_TYPE == "鎴愬搧涓嬬嚎" ? 14 : 19;
-            var plc = Settings.deviceInfos.Where(a => a.deviceType == devType).FirstOrDefault();
-            if (plc != null)
+            if(wmsTask.S_TYPE == "鎴愬搧涓嬬嚎" || wmsTask.S_TYPE == "鏍堟澘涓婄嚎")
             {
-                if (wmsTask.S_TYPE == "鎴愬搧涓嬬嚎")
+                int devType = wmsTask.S_TYPE == "鎴愬搧涓嬬嚎" ? 1 : 2;
+                var plc = Settings.deviceInfos.Where(a => a.deviceType == devType).FirstOrDefault();
+                if (plc != null)
                 {
-                    if (state == 1101)
+                    if (wmsTask.S_TYPE == "鎴愬搧涓嬬嚎")
                     {
-                        PlcHelper.SendHex(plc.address, "3F00110D0A");
+                        if (state == 1101)
+                        {
+                            PlcHelper.SendHex(plc.address, "3F00110D0A");
+                        }
+                        if (state == 1102)
+                        {
+                            PlcHelper.SendHex(plc.address, "3F00100d0a");
+                        }
                     }
-                    if (state == 1102)
+                    if (wmsTask.S_TYPE == "鏍堟澘涓婄嚎")
                     {
-                        PlcHelper.SendHex(plc.address, "3F00100d0a");
+                        if (state == 1103)
+                        {
+                            PlcHelper.SendHex(plc.address, "3F00210d0a");
+                        }
+                        if (state == 1104 || state == -1)
+                        {
+                            PlcHelper.SendHex(plc.address, "3F00200d0a");
+                        }
                     }
+
                 }
-                if (wmsTask.S_TYPE == "鏍堟澘涓婄嚎")
-                {
-                    if (state == 1103)
-                    {
-                        PlcHelper.SendHex(plc.address, "3F00210d0a");
-                    }
-                    if (state == 1104 || state == -1)
-                    {
-                        PlcHelper.SendHex(plc.address, "3F00200d0a");
-                    }
-                }
-                if (wmsTask.S_TYPE.Contains("绌烘墭涓婄嚎") || wmsTask.S_TYPE.Contains("婊℃墭涓婄嚎") || wmsTask.S_TYPE.Contains("绌烘墭涓嬬嚎") || wmsTask.S_TYPE.Contains("婊℃墭涓嬬嚎"))
-                {
-                    LogHelper.Info($"{wmsTask.S_TYPE}鍙栨秷鍐欏叆澶嶄綅淇″彿");
-                    writeSignal(wmsTask);
-                }
+                else LogHelper.Info("鍐滃か鏋楄姖-L6杈撻�绾�鏈厤缃�);
             }
-            else LogHelper.Info("鍐滃か涓存睙-L6杈撻�绾�鏈厤缃�);
+            else
+            {
+                LogHelper.Info($"{wmsTask.S_TYPE}鍐欏叆澶嶄綅淇″彿");
+                writeSignal(wmsTask, state);
+            }
         }
 
         public static void writeSignal(WCSTask mst, int state = 0)
@@ -157,7 +161,8 @@
                 var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault();
                 if (devInfo != null)
                 {
-                    var signal = "3F 00 10 0D 0A";
+                    var signal = "3F 00 12 21 0D 0A";
+                    if (state == 1104) signal = "3F 00 10 20 0D 0A";
                     if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}浠诲姟鍗歌揣瀹屾垚锛屽啓鍏ヤ俊鍙凤細{signal}锛宨p锛歿devInfo.address}");
                 }
                 else LogHelper.Info($"璁惧鏈壘鍒帮紝璐т綅鍙凤細{mst.S_END_LOC}");
@@ -170,6 +175,7 @@
                 if (devInfo != null)
                 {
                     var signal = "3F 00 12 22 00 0D 0A";
+                    if (state == 1102) signal = "3F 00 10 20 0D 0A";
                     if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}浠诲姟鍙栬揣瀹屾垚锛屽啓鍏ヤ俊鍙凤細{signal}锛宨p锛歿devInfo.address}");
                 }
                 else LogHelper.Info($"璁惧鏈壘鍒帮紝璐т綅鍙凤細{mst.S_END_LOC}");
@@ -198,12 +204,424 @@
 
         internal static void ThirdReportStatus(WCSTask mst, int state, string forkliftNo)
         {
+            if (state == 2)
+            {
+                TaskProcess.TASK_STATUSFunc(mst);
+            }
+        }
 
+        #region   瀵屽嫆娴佺▼澶勭悊
+        /// <summary>
+        /// 浠诲姟瀹屾垚鐘舵�鍥炴姤--1.姝e父浠诲姟瀹屾垚鍥炴姤    2.绉诲簱浠诲姟瀹屾垚鍥炴姤
+        /// </summary>
+        /// <param name="JsonData"></param>
+        /// <returns></returns>
+        internal static void TASK_STATUSFunc(WCSTask wmsTask)
+        {
+            string msg = ""; List<string> trayList = new List<string>();
+            var req = new SimpleResult();
+            var StartInfo = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_CODE == wmsTask.S_START_LOC.Trim()).First();
+            var EndInfo = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_CODE == wmsTask.S_END_LOC.Trim()).First();
+            List<string> taskTrayList = new List<string>(wmsTask.S_CNTR_CODE.Trim().Split(','));
+            taskTrayList.ForEach(a =>
+            {
+                if (!string.IsNullOrEmpty(a)) trayList.Add(a.Replace(",", ""));
+            });
+            string[] trayInfo = trayList.ToArray();
+            var url = Settings.thirdPartyUrls.Where(a => a.UrlNo == "2" && a.enable == 1).FirstOrDefault();
+            if (wmsTask.S_TYPE.Contains("绉诲簱"))
+            {
+                //绉诲簱浠诲姟 瀹屾垚鍥炴姤
+                var httpVerify = Settings.httpApiVerifys.Where(a => a.VerifyNo == "1" && a.Project == Settings.ProjectName && a.enable == 1).FirstOrDefault();
+                if (httpVerify != null)
+                {
+                    var startRow = StartInfo.S_ROW.Trim();
+                    var endRow = EndInfo.S_ROW.Trim();
+                    var FLStartRow = new SqlHelper<Object>().GetInstance().Queryable<RowComparsionTable>().Where(a => a.S_LJ_ROW == startRow).First();
+                    var FLEndRow = new SqlHelper<Object>().GetInstance().Queryable<RowComparsionTable>().Where(a => a.S_LJ_ROW == endRow).First();
+                    if (FLStartRow != null && FLEndRow != null)
+                    {
+                        string sendMsg = JsonConvert.SerializeObject(new
+                        {
+                            startAreaNo = FLStartRow.S_FL_ROW.Trim(),
+                            endAreaNo = FLEndRow.S_FL_ROW.Trim(),
+                            trayInfo = trayInfo,
+                            repoNo = "LJ02"
+                        });
+                        LogHelper.Info("sendMsg secusess:" + JsonConvert.SerializeObject(sendMsg));
+                        req = FuLeWebPost(sendMsg, "yikuTaskStatus ", url.Url);//YKRWSD AreaRowLockState
+                    }
+                }
+                else
+                {
+                    AnalysisCompleteModel model = new AnalysisCompleteModel();
+                    model.TrayInfo = trayInfo;
+                    model.StartAreaNo = StartInfo.S_ROW.Trim().Replace("-XB", "");
+                    model.EndAreaNo = EndInfo.S_ROW.Trim().Replace("-XB", "");
+                    string sendMsg = JsonConvert.SerializeObject(model);
+                    req = FuLeWebPost(sendMsg, "YKRWWC", url.Url);//YKRWWC YIKUTASK_STATUS
+                }
+            }
+            else if (wmsTask.S_TYPE.Contains("涓嬬嚎"))
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                string SrcNo = wmsTask.S_WORK_NO?.Trim();
+                var workInfo = db.Queryable<LinZhiWorkOrder>().Where(a => a.S_WorkNo == SrcNo).First();
+                if (workInfo != null)
+                {
+                    if (workInfo.S_ORDER_TYPE.Trim() != "鏃犵爜鍏ュ簱")
+                    {
+                        //浜х嚎涓嬬嚎 瀹屾垚鍥炴姤
+                        var httpVerify = Settings.httpApiVerifys.Where(a => a.VerifyNo == "2" && a.Project == Settings.ProjectName && a.enable == 1).FirstOrDefault();
+                        if (httpVerify != null)
+                        {
+                            var endRow = EndInfo.S_ROW.Trim();
+                            var FLEndRow = new SqlHelper<Object>().GetInstance().Queryable<RowComparsionTable>().Where(a => a.S_LJ_ROW == endRow).First();
+                            if (FLEndRow != null)
+                            {
+                                string sendMsg = JsonConvert.SerializeObject(new
+                                {
+                                    trayInfo = trayInfo,
+                                    workNo = wmsTask.S_WORK_NO.Trim(),
+                                    repoNo = "LJ02",
+                                    areaLoca = FLEndRow.S_FL_ROW,
+                                });
+                                LogHelper.Info("sendMsg secucess:" + JsonConvert.SerializeObject(sendMsg));
+                                req = FuLeWebPost(sendMsg, "proTaskStatus", url.Url); //AreaRowLockState
+                            }
+                        }
+                        else
+                        {
+                            ProCompleteModel model = new ProCompleteModel();
+                            model.TrayInfo = trayInfo;
+                            model.WorkNo = wmsTask.S_WORK_NO.Trim();
+                            model.AreaLoca = EndInfo.S_ROW.Trim().Replace("-XB", "");
+                            string sendMsg = JsonConvert.SerializeObject(model);
+                            req = FuLeWebPost(sendMsg, "WGHB", url.Url);//WGHB PROTASK_STATUS
+                        }
+                    }
+                }
+            }
+            
+            if (req != null && req.success) msg = $"TASK_STATUS:杩斿洖浠诲姟鐘舵�鎴愬姛:{JsonConvert.SerializeObject(req)}锛�;
+            else msg = $"TASK_STATUS:杩斿洖浠诲姟鐘舵�澶辫触:{JsonConvert.SerializeObject(req)}锛�;
+            LogHelper.Info(msg, "ThirdSystemLog");
+        }
+
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--姹夊拰浠诲姟姣忎釜鐘舵�杩涜瀹炴椂涓婁紶(鍖呮嫭浠诲姟鍒涘缓鏃讹紝涓婃姤 8)
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        internal static void GeneralInterFaceFunc(WCSTask wmsTask, string taskStatus, string forkliftNo = "")
+        {
+            string msg = "";
+            var req = new SimpleResult();
+            var db = new SqlHelper<object>().GetInstance();
+            ///鍚屼竴鏉′换鍔″悓绉嶇姸鎬佸彧涓婃姤涓�
+            ///鏌ヨ浠诲姟鍔ㄤ綔琛紝鏈変换鍔$浉鍚屽苟涓斾换鍔$姸鎬佺浉鍚岀殑锛屽氨涓嶄笂鎶ワ紙浠诲姟鐘舵�涓�杩樿鏌ヨ杞﹀彿鏄惁瀛樺湪锛�+            bool flage = false;
+            var no = wmsTask.S_CODE;
+            var code = int.Parse(taskStatus);
+            if (taskStatus == "1")
+            {
+                if (forkliftNo != "0")
+                {
+                    if (db.Queryable<TaskAction>().Count(a => a.S_TASK_CODE.Trim() == no.Trim() && a.N_ACTION_CODE == code) == 2)
+                    {
+                        wmsTask.S_EQ_NO = forkliftNo;
+                        flage = true;
+                    }
+                }
+            }
+            else
+            {
+                flage = true;
+            }
+
+            if (flage)
+            {
+                if (WCSHelper.CheckActionRecordExist(wmsTask.S_CODE, 4) && taskStatus == "7") taskStatus = "2";
+                try
+                {
+                    //鑾峰彇涓婃姤鎺ュ彛鐨刄RL
+                    var url = Settings.thirdPartyUrls.Where(a => a.UrlNo == "1" && a.enable == 1).FirstOrDefault();
+                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},鑾峰彇URL锛歿url}", "ThirdSystemLog");
+                    //浠诲姟绫诲瀷鏁版嵁澶勭悊
+                    string taskType = "";
+                    var taskTypeInfo = db.Queryable<TaskTypeConvTable>().Where(a => a.taskTypeName == wmsTask.S_TYPE).First();
+                    if (taskTypeInfo != null) taskType = taskTypeInfo.taskType;
+                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},浠诲姟绫诲瀷鏁版嵁澶勭悊锛歿taskType}", "ThirdSystemLog");
+
+                    //鎵樼洏鐗╂枡鏁版嵁澶勭悊
+                    List<string> cntrList = new List<string>(wmsTask.S_CNTR_CODE.Split(','));//鑾峰彇鎵樼洏鏁版嵁
+                    string itemCode = "";//鐗╂枡缂栫爜
+                    itemCode = GeneralInterFaceGetItemCodeFunc(wmsTask, db, cntrList, itemCode);
+                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},鐗╂枡缂栫爜锛歿itemCode}", "ThirdSystemLog");
+                    List<asnReferenceDModel> asnReferenceList = new List<asnReferenceDModel> { };//鎵樼爜鏁扮粍
+                    GeneralInterFaceGetTrayCodeFunc(wmsTask, db, asnReferenceList, cntrList);
+                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},鑾峰彇鎵樼洏鏁版嵁锛歿JsonConvert.SerializeObject(asnReferenceList)}", "ThirdSystemLog");
+
+                    //AGV璁惧淇℃伅澶勭悊
+                    string equipmentCode = "";
+                    string orgCode = "";
+                    string orgName = "";
+                    string proxyInterfaceCode = "0050";
+                    GeneralInterFaceGetAgvDeviceInfoFunc(wmsTask, db, ref equipmentCode, ref orgCode, ref orgName, ref proxyInterfaceCode);
+                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},equipmentCode锛歿equipmentCode},orgCode锛歿orgCode},orgName:{orgName},proxyInterfaceCode:{proxyInterfaceCode}", "ThirdSystemLog");
+
+                    LogHelper.Info($"wmstask.t_start_time锛歿wmsTask.T_START_TIME}");
+                    if (DateTime.MinValue == wmsTask.T_START_TIME)
+                    {
+                        wmsTask.T_START_TIME = null;
+                    }
+
+                    DateTime dateTime = taskStatus == "1" ? Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8) : taskStatus == "2" || taskStatus == "7" ? Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8) : taskStatus == "8" ? Convert.ToDateTime(wmsTask.T_CREATE).AddHours(-8) : DateTime.UtcNow;
+                    string createTime = GetTimeStamp(wmsTask.T_CREATE.AddHours(-8), 1, 2);
+                    string startTime = "";
+                    //鍦–#涓紝浣跨敤DateTimeOffset.UtcNow.ToUnixTimeSeconds()鏂规硶鑾峰彇Unix鏃堕棿鎴虫椂锛屽彲鑳戒細澶氬嚭涓�釜姣銆傝繖鏄洜涓篣nix鏃堕棿鎴虫槸浠ョ涓哄崟浣嶇殑锛岃�DateTimeOffset.UtcNow杩斿洖鐨勬槸UTC鏃堕棿锛屽叾绮惧害涓�00绾崇銆�+                    if (wmsTask.S_WORK_MODE != "agv" && !string.IsNullOrEmpty(wmsTask.S_WORK_MODE)) startTime = wmsTask.S_WORK_MODE;
+                    else
+                    {
+                        startTime = wmsTask.T_START_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8), 1, 2);
+                        if (startTime != null)
+                        {
+                            wmsTask.S_WORK_MODE = startTime;
+                            db.Updateable(wmsTask).UpdateColumns(a => new { a.S_WORK_MODE }).ExecuteCommand();
+                        }
+                    }
+
+                    string endTime = wmsTask.T_END_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8), 1, 2);
+                    string businessTime = taskStatus == "1" ? startTime : taskStatus == "2" || taskStatus == "7" ? endTime : taskStatus == "8" ? createTime : GetTimeStamp(dateTime, 1, 2);
+                    string dt = wmsTask.T_START_TIME == null ? null : Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8).ToString();
+                    string mill = wmsTask.T_START_TIME == null ? null : Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8).Millisecond.ToString();
+                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},浠诲姟寮�鏃堕棿锛歿wmsTask.T_START_TIME}锛屼换鍔¤浆鎹㈠悗鏃堕棿锛歿dt}锛屼换鍔″彿姣鏃堕棿锛歿mill}锛岃浆鎹㈠悗鏃堕棿锛歿startTime}", "ThirdSystemLog");
+
+                    string sendMsg = JsonConvert.SerializeObject(new
+                    {
+                        taskCode = wmsTask.S_CODE,//浠诲姟缂栫爜
+                        taskStatus = taskStatus,//浠诲姟鐘舵�-浠诲姟鍒涘缓鎴愬姛浼犺緭 8
+                        taskType = taskType,//浠诲姟绫诲瀷-闇�鏍规嵁 閰嶇疆琛ㄦ暟鎹繘琛岃浆鎹紝杞崲涓篗ES鐨勪换鍔$被鍨�+                        createTime = createTime,//闇�浆鎹负 鏃堕棿鎴�   wmsTask.T_CREATE
+                        startTime = startTime,//闇�浆鎹负 鏃堕棿鎴�wmsTask.T_START_TIME
+                        endTime = endTime,//闇�浆鎹负 鏃堕棿鎴�wmsTask.T_END_TIME
+                        businessTime = businessTime,//褰撳墠浠诲姟鏃堕棿-闇�浆鎹负 鏃堕棿鎴�  DateTime.Now
+                        startAddress = wmsTask.S_START_LOC,//璧风偣
+                        endAddress = wmsTask.S_END_LOC,//缁堢偣
+                        equipmentNo = wmsTask.S_EQ_NO,//杞﹁締缂栧彿
+                        equipmentCode = equipmentCode,//杞﹁締閾墝-闇�鏍规嵁 閰嶇疆琛ㄦ暟鎹紝閫氳繃 杞﹁締缂栧彿浠ュ強宸ュ巶缂栫爜 鏌ヨ瀵瑰簲杞﹁締閾墝
+                        orgCode = Settings.FactoryCode,//宸ュ巶缂栫爜
+                        orgName = Settings.FactoryName,//宸ュ巶鍚嶇О
+                        sku = itemCode,//鐗╂枡缂栫爜
+                        asnReferenceDList = asnReferenceList,//鎵樼爜鏁扮粍 姝ゆ鍙夎溅鍙夌殑鎵樼洏鍠风爜锛�涓�鍙夎締杞︼紝鏈変袱涓紪鐮�  浜х嚎涓嬬嚎涓旈潪鏃犵爜妯″紡鏃朵紶杈�+                        appliactionId = "MOBOX"
+                        //proxyInterfaceCode = proxyInterfaceCode //鎺ュ彛鍞竴鏍囪瘑鐮�鍥哄畾鍊硷細0050
+                    });
+                    //http://yst-open-zuul-qa.idc.yst.com.cn/proxy/v1/
+                    req = FuLeWebPost(sendMsg, "generalInterface", url.Url, true);//YKRWSD AreaRowLockState
+
+                    if (req != null && req.success) msg = $"GeneralInterFaceFunc:杩斿洖浠诲姟鐘舵�鎴愬姛:{JsonConvert.SerializeObject(req)}锛�;
+                    else msg = $"GeneralInterFaceFunc:杩斿洖浠诲姟鐘舵�澶辫触:{JsonConvert.SerializeObject(req)}锛�;
+                }
+                catch (Exception ex)
+                {
+                    msg = $"GeneralInterFaceFunc Error:TaskInfo:{JsonConvert.SerializeObject(wmsTask)},TaskState:{taskStatus},ErrorMsg:{ex.Message}";
+                }
+            }
+
+            LogHelper.Info(msg, "ThirdSystemLog");
+        }
+        public class ProCompleteModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string StockNo { get; set; } = "CK001";
+            public string[] TrayInfo { get; set; }
+            public string WorkNo { get; set; }
+            public string AreaLoca { get; set; }
+        }
+        public class AnalysisCompleteModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string StockNo { get; set; } = "CK001";
+            public string[] TrayInfo { get; set; }
+            public string StartAreaNo { get; set; }
+            public string EndAreaNo { get; set; }
+        }
+
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鐗╂枡缂栫爜
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        private static string GeneralInterFaceGetItemCodeFunc(WMSTask wmsTask, SqlSugarClient db, List<string> cntrList, string itemCode)
+        {
+            //if (cntrList.Count > 0)
+            //{
+            //    string SrcNo = wmsTask.S_SRC_NO?.Trim();
+            //    // 鍐滃か缃戠涓嬪彂鐨勫伐鍗曪紝鐗╂枡鑾峰彇鏂瑰紡
+            //    if (!string.IsNullOrEmpty(SrcNo) && wmsTask.S_TYPE.Contains("涓嬬嚎"))
+            //    {
+            //        var workInfo = db.Queryable<LinJiangWorkOrder>().Where(a => a.S_WorkNo == SrcNo).First();
+            //        if (workInfo != null) itemCode = workInfo.S_ItemCode;
+            //    }
+            //    // 鍏朵粬鐨勪汉宸ュ缓绔嬬殑宸ュ崟锛岀墿鏂欒幏鍙栨柟寮�+            //    else
+            //    {
+            //        var cntrItemInfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrList[0]).First();
+            //        if (cntrItemInfo != null)
+            //        {
+            //            //姝ゅ鏌ヨ 鐗╂枡琛紝浠呴檺娣冲畨鑾峰彇MES鐗╂枡浣跨敤锛屽叾浠栧伐鍘傚彲鑷娉ㄩ噴锛涘洜娣冲畨鍏ュ簱鐗╂枡鏄娇鐢�鐗╂枡鍚嶇О+鐗╂枡灞傛暟 鎷兼帴鑰屾垚锛屽洜姝ら渶瑕�閫氳繃鐗╂枡琛ㄨ浆鎹负 MES 鐨勭墿鏂欑紪鐮�+            //            //var itemInfo = db.Queryable<ItemRel>().Where(a => a.S_ITEM_NAME == cntrItemInfo.S_ITEM_CODE).First();
+            //            //if (itemInfo != null) itemCode = itemInfo.S_ITEM_CODE;
+            //            itemCode = cntrItemInfo.S_ITEM_CODE;
+            //        }
+            //    }
+            //}
+            //
+            return itemCode;
+        }
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鎵樼洏鏁版嵁
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        private static void GeneralInterFaceGetTrayCodeFunc(WMSTask wmsTask, SqlSugarClient db, List<asnReferenceDModel> asnReferenceList, List<string> cntrList)
+        {
+            //string SrcNo = wmsTask.S_SRC_NO?.Trim();
+            //
+            ////鏍规嵁浠诲姟涓瓨鏀剧殑宸ュ崟鍙凤紝鑾峰彇宸ュ崟绫诲瀷--鍥犱负娣冲畨 婊℃墭涓嬬嚎浠诲姟鍖呭惈 涓嬬嚎 鍊硷紝鍥犳澶氬垽鏂竴姝ワ紝鍑忓皯宸ュ崟琛ㄧ殑鏌ヨ
+            //if (!string.IsNullOrEmpty(SrcNo) && wmsTask.S_TYPE.Contains("涓嬬嚎"))
+            //{
+            //    var workInfo = db.Queryable<LinJiangWorkOrder>().Where(a => a.S_WorkNo == SrcNo).First();
+            //    if (workInfo != null)
+            //    {
+            //        if (workInfo.S_ORDER_TYPE.Trim() != "鏃犵爜鍏ュ簱")
+            //        {
+            //
+            //            if (cntrList.Count > 0)
+            //            {
+            //                cntrList.ForEach(a =>
+            //                {
+            //                    if (!string.IsNullOrEmpty(a))
+            //                        asnReferenceList.Add(new asnReferenceDModel { asnReferenceD = a });
+            //                });
+            //            }
+            //        }
+            //    }
+            //}
+        }
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇AGV璁惧淇℃伅鏁版嵁
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        /// <param name="db"></param>
+        /// <param name="equipmentCode"></param>
+        /// <param name="orgCode"></param>
+        /// <param name="orgName"></param>
+        /// <param name="proxyInterfaceCode"></param>
+        private static void GeneralInterFaceGetAgvDeviceInfoFunc(WMSTask wmsTask, SqlSugarClient db, ref string equipmentCode, ref string orgCode, ref string orgName, ref string proxyInterfaceCode)
+        {
+            //if (!string.IsNullOrEmpty(wmsTask.S_AGV_NO))
+            //{
+            //    var agvDeviceInfo = db.Queryable<AGVDeviceDataTable>().Where(a => a.equipmentNo == wmsTask.S_AGV_NO && a.orgCode == Settings.FactoryCode).First();
+            //    if (agvDeviceInfo != null)
+            //    {
+            //        equipmentCode = agvDeviceInfo.equipmentCode;
+            //        orgCode = agvDeviceInfo.orgCode;
+            //        orgName = agvDeviceInfo.orgName;
+            //        proxyInterfaceCode = agvDeviceInfo.proxyInterfaceCode;
+            //    }
+            //}
+        }
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鏃堕棿鎴�+        /// </summary>
+        /// <param name="DataBitType">鏁版嵁浣嶆暟锛氬�锛�2|64  鍚箟锛�2浣峾64浣�/param>
+        /// <param name="TimeType">鑾峰彇鏃堕棿绫诲瀷锛氬�锛�|2   鍚箟锛�-绉掔骇   2-姣绾�/param>
+        /// <param name="TimeUtcType">鑾峰彇鏃堕棿Utc绫诲瀷锛氬�锛�|2   鍚箟锛�-鏈湴鏃堕棿   2-Utc鏃堕棿</param>
+        /// <returns></returns>
+        public static string GetTimeStamp(DateTime dateTime, int DataBitType, int TimeType)
+        {
+            string timeStamp = "";
+
+            //鏃堕棿鎴虫墦鍗�+            TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);//鏃堕棿鎴宠幏鍙�+            double tsTime = TimeType == 1 ? ts.TotalSeconds : ts.TotalMilliseconds;//绉掔骇|姣绾ф椂闂磋幏鍙�+
+            string TimeTypeInfo = TimeType == 1 ? "绉掔骇" : "姣绾�;
+            timeStamp = DataBitType == 32 ? Convert.ToInt32(tsTime).ToString() : Convert.ToInt64(tsTime).ToString();
+
+            //double result = 0;
+            //result = DataBitType == 32 ? Convert.ToInt32(tsTime) : Convert.ToInt64(tsTime);
+
+            return timeStamp;
         }
 
 
+        public class asnReferenceDModel
+        {
+            public string asnReferenceD { get; set; }
+        }
 
-        
+        /// <summary>
+        /// 搴撲綅閿佸畾瑙i攣鍥炴姤-绉诲簱浠诲姟閿佸畾瑙i攣搴撲綅
+        /// </summary>
+        /// <param name="AreaRow">搴撲綅鍙�澶氫釜搴撲綅鍙风敤鑻辨枃閫楀彿闅斿紑</param>
+        /// <param name="state">true-閿佸畾搴撲綅 false-瑙i攣搴撲綅</param>
+        internal static void AreaRowLockState(string AreaRow, bool state = true)
+        {
+            string msg = ""; List<string> areaList = new List<string>();
+            var req = new SimpleResult();
+            List<string> taskAreaList = new List<string>(AreaRow.Split(','));
+            taskAreaList.ForEach(a =>
+            {
+                if (!string.IsNullOrEmpty(a)) areaList.Add(a);
+            });
+            string[] AreaInfo = areaList.ToArray();
+            var url = Settings.thirdPartyUrls.Where(a => a.UrlNo == "2" && a.enable == 1).FirstOrDefault();
+            var httpVerify = Settings.httpApiVerifys.Where(a => a.VerifyNo == "1" && a.Project == Settings.ProjectName && a.enable == 1).FirstOrDefault();
+            if (httpVerify != null)
+            {
+                string sendMsg = JsonConvert.SerializeObject(new
+                {
+                    areaNum = AreaInfo,
+                    repoNo = "LJ02",
+                    areaLock = state ? "1" : "2"
+                });
+                LogHelper.Info("sendMsg:" + JsonConvert.SerializeObject(sendMsg));
+                req = FuLeWebPost(sendMsg, "areaRowLockState", url.Url);//YKRWSD AreaRowLockState
+            }
+            else
+            {
+                AreaRowLockStateModel model = new AreaRowLockStateModel();
+                model.AreaNum = AreaInfo;
+                model.AreaLock = state ? "1" : "2";
+                string sendMsg = JsonConvert.SerializeObject(model);
+                req = FuLeWebPost(sendMsg, "YKRWSD", url.Url);//YKRWSD AreaRowLockState
+            }
+
+            if (req != null && req.success) msg = $"YKRWSD:杩斿洖搴撲綅鐘舵�鎴愬姛:{JsonConvert.SerializeObject(req)}锛�;
+            else msg = $"YKRWSD:杩斿洖搴撲綅鐘舵�澶辫触:{JsonConvert.SerializeObject(req)}锛�;
+            LogHelper.Info(msg, "ThirdSystemLog");
+        }
+        public class AreaRowLockStateModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string StockNo { get; set; } = "CK001";
+            public string[] AreaNum { get; set; }
+            /// <summary>
+            /// 搴撲綅閿佸畾鐘舵�--1-閿佸畾 2-瑙i攣
+            /// </summary>
+            public string AreaLock { get; set; }
+        }
+        #endregion
+
+
+
+
         /// <summary>
         /// 浠诲姟鎷︽埅
         /// </summary>
@@ -236,6 +654,7 @@
             if (state == 6)//鍗歌揣瀹屾垚
             {
                 claimGoodsTime(mst, state);
+                writeSignal(mst);
                 CacheBitUpdate(mst, false);
             }
             if (state == 7)
@@ -551,7 +970,7 @@
                     string Extend8 = "";//缁堢偣鍒�                     int startLayer = mst.N_START_LAYER;// 璧风偣鍙栬揣灞傛暟
                     int endLayer = mst.N_END_LAYER;// 缁堢偣鍗歌揣灞傛暟
-                    string workNo = mst.S_EQ_TASK_CODE;// 宸ュ崟鍙�+                    string workNo = mst.S_WORK_NO;// 宸ュ崟鍙�                     string trayType = mst.S_NOTE;//鎵樼洏绫诲瀷-鏍规嵁鍚勮嚜鐜板満鎯呭喌鑾峰彇
                     var taskType = mst.S_TYPE;// 浠诲姟绫诲瀷
 
@@ -562,122 +981,122 @@
                     string[] ConveryTaskList = new string[] { "鎴愬搧涓嬬嚎", "鏍堟澘涓婄嚎", "闆跺ご涓嬬嚎" };
                     if (ConveryTaskList.Contains(taskType) || taskType.Contains("绉诲簱"))
                     {
-                        //TsNo = 5;
-                        //
-                        //if (taskType.Contains("鏍堟澘涓婄嚎"))
-                        //{
-                        //    Extend1 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC && a.N_LAYER == mst.N_START_LAYER).First().S_AGV_SITE;
-                        //    Extend2 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC && a.N_LAYER == mst.N_END_LAYER).First().S_AGV_SITE;
-                        //
-                        //    var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC).First();
-                        //    var endLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC).First();
-                        //    int startCol = int.Parse(startLoc.N_COL.ToString());
-                        //    int endCol = int.Parse(endLoc.N_COL.ToString());
-                        //    Extend7 = (startCol - 1).ToString();
-                        //    Extend8 = (endCol - 1).ToString();
-                        //}
-                        //else
-                        //{
-                        //    // 鎴愬搧浠诲姟涓嬪彂鍙傛暟鑾峰彇
-                        //
-                        //    var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC).First();
-                        //    var endLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC).First();
-                        //    int startCol = int.Parse(startLoc.N_COL.ToString());
-                        //    int endCol = int.Parse(endLoc.N_COL.ToString());
-                        //    var startLocInfo = db.Queryable<SegmentTable>().Where(a => a.S_AREA_CODE == startLoc.S_AREA_CODE && a.N_ROW == startLoc.N_ROW && a.S_START_COL <= startCol && a.S_END_COL >= startCol).First();
-                        //    var endLocInfo = db.Queryable<SegmentTable>().Where(a => a.S_AREA_CODE == endLoc.S_AREA_CODE && a.N_ROW == endLoc.N_ROW && a.S_START_COL <= endCol && a.S_END_COL >= endCol).First();
-                        //
-                        //    if (startLocInfo != null)
-                        //    {
-                        //        Extend1 = mst.N_START_LAYER == 1 ? int.Parse(startLocInfo.S_First_Bit) : int.Parse(startLocInfo.S_Second_Bit);
-                        //        if (trayType.Contains("闆嗗寲鏉�)) Extend1 = Extend1 + 2;
-                        //
-                        //        Extend7 = (startCol - startLocInfo.S_START_COL).ToString();
-                        //    }
-                        //    else LogHelper.Info($"浠诲姟寮傚父锛歿mst.S_CODE},鑷敱绾挎琛ㄦ棤鍙敤璧风偣璐т綅鏁版嵁銆傝捣鐐硅揣浣嶇紪鐮侊細{mst.S_START_LOC}");
-                        //    if (endLocInfo != null)
-                        //    {
-                        //        Extend2 = mst.N_END_LAYER == 1 ? int.Parse(endLocInfo.S_First_Bit) : int.Parse(endLocInfo.S_Second_Bit);
-                        //        Extend8 = (endCol - endLocInfo.S_START_COL).ToString();
-                        //    }
-                        //    else LogHelper.Info($"浠诲姟寮傚父锛歿mst.S_CODE},鑷敱绾挎琛ㄦ棤鍙敤缁堢偣璐т綅鏁版嵁銆傜粓鐐硅揣浣嶇紪鐮侊細{mst.S_END_LOC}");
-                        //
-                        //    // 鍏朵粬鍔熻兘鐮佸彲浠ユ牴鎹换鍔$被鍨嬭嚜琛屾坊鍔�姝ゅ浠呯ず渚�绉诲簱 鍔熻兘鐮佽幏鍙栨柟寮忥紝濡傛灉鏈夋洿濂界殑鏂瑰紡锛屽彲浠ヨ嚜琛屼慨鏀�
-                        //    if (taskType.Contains("绉诲簱")) Extend3 = Convert.ToInt32("20", 16).ToString();
-                        //
-                        //}
-                        //
-                        ////// 鑾峰彇鎴愬搧宸ュ崟鏁版嵁(鏌ヨ 鎴愬搧宸ュ崟琛�f
-                        //if (taskType.Contains("绉诲簱"))
-                        //{
-                        //    var workInfo = db.Queryable<YiKuWorkOrder>().Where(a => a.S_WorkNo == workNo).First();
-                        //    if (workInfo != null)
-                        //    {
-                        //        LogHelper.Info($"{workInfo.S_ORDER_TYPE}");
-                        //        // 鑾峰彇涓嬪彂TS鐗╂枡灞傛暟鏁版嵁(鏌ヨ 鐗╂枡琛�
-                        //        if (workInfo.S_ORDER_TYPE.Contains("绉诲簱"))
-                        //        {
-                        //            LogHelper.Info($"鐗╂枡缂栫爜锛歿mst.S_ITEM_CODE},鏍堟澘绫诲瀷锛歿trayType},鐗╂枡瑙勬牸锛歿workInfo.S_ItemLayer}");
-                        //            var itemInfo1 = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == mst.S_ITEM_CODE && a.S_TRAY_TYPE == trayType && a.S_ITEM_MODEL == workInfo.S_ItemLayer).First();
-                        //            if (itemInfo1 != null)
-                        //            {
-                        //                Extend5 = itemInfo1.S_ITEM_LAYER;
-                        //            }
-                        //            else
-                        //            {
-                        //                LogHelper.Info($"鐗╂枡琛ㄦ湭缁存姢淇℃伅锛岀墿鏂欑紪鐮侊細{mst.S_ITEM_CODE},鏍堟澘绫诲瀷锛歿trayType},鐗╂枡瑙勬牸锛歿workInfo.S_ItemLayer}");
-                        //            }
-                        //            //if (workInfo.S_ORDER_TYPE == "鏃犵爜鍏ュ簱" && endLayer == 1) Extend5 = "";
-                        //        }
-                        //
-                        //        // 鏍规嵁宸ュ崟涓墭鐩樼被鍨嬭浆鎹负瀵瑰簲鐨勪笅鍙慣S鍙傛暟鏁版嵁
-                        //        LogHelper.Info($"S_TRAY_TYPE:{trayType}");
-                        //        LogHelper.Info($"Extend5:{Extend5}");
-                        //        int x = 0;
-                        //        if (trayType == "灏忔澘") x = 1;
-                        //        if (trayType == "闆嗗寲鏉�) x = 2;
-                        //        if (trayType == "灏忔澘瓒呮墭") x = 3;
-                        //        if (trayType == "闆嗗寲鏉胯秴鎵�) x = 4;
-                        //
-                        //        Extend6 = x.ToString();
-                        //
-                        //    }
-                        //}
-                        //else
-                        //{
-                        //    var workInfo = db.Queryable<LinJiangWorkOrder>().Where(a => a.S_WorkNo == workNo).First();
-                        //    if (workInfo != null)
-                        //    {
-                        //        LogHelper.Info($"{workInfo.S_ORDER_TYPE}");
-                        //        // 鑾峰彇涓嬪彂TS鐗╂枡灞傛暟鏁版嵁(鏌ヨ 鐗╂枡琛�
-                        //        if (workInfo.S_ORDER_TYPE.Contains("涓嬬嚎") || workInfo.S_ORDER_TYPE == "鏃犵爜鍏ュ簱")
-                        //        {
-                        //            var itemInfo1 = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == workInfo.S_ItemCode && a.S_TRAY_TYPE == trayType && a.S_ITEM_MODEL == workInfo.S_ItemLayer).First();
-                        //            if (itemInfo1 != null)
-                        //            {
-                        //                Extend5 = itemInfo1.S_ITEM_LAYER;
-                        //            }
-                        //            //if (workInfo.S_ORDER_TYPE == "鏃犵爜鍏ュ簱" && endLayer == 1) Extend5 = "";
-                        //        }
-                        //
-                        //        // 鏍规嵁宸ュ崟涓墭鐩樼被鍨嬭浆鎹负瀵瑰簲鐨勪笅鍙慣S鍙傛暟鏁版嵁
-                        //        LogHelper.Info($"S_TRAY_TYPE:{trayType}");
-                        //        int x = 0;
-                        //        if (trayType == "灏忔澘") x = 1;
-                        //        if (trayType == "闆嗗寲鏉�) x = 2;
-                        //        if (trayType == "灏忔澘瓒呮墭") x = 3;
-                        //        if (trayType == "闆嗗寲鏉胯秴鎵�) x = 4;
-                        //
-                        //        Extend6 = x.ToString();
-                        //
-                        //    }
-                        //}
-                        //
-                        //// 鑾峰彇 浠诲姟鍙傛暟4 DATA 鏁版嵁
-                        //string startLayerValue = Convert.ToString(startLayer, 16).ToUpper();
-                        //string endLayerValue = Convert.ToString(endLayer, 16).ToUpper();
-                        ////Extend4 = Convert.ToInt32(startLayerValue + endLayerValue, 16).ToString();
-                        //Extend4 = ((startLayer * 16) + endLayer).ToString();
+                        TsNo = 5;
+                        
+                        if (taskType.Contains("鏍堟澘涓婄嚎"))
+                        {
+                            Extend1 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC && a.N_LAYER == mst.N_START_LAYER).First().S_AGV_SITE;
+                            Extend2 = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC && a.N_LAYER == mst.N_END_LAYER).First().S_AGV_SITE;
+                        
+                            var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC).First();
+                            var endLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC).First();
+                            int startCol = int.Parse(startLoc.N_COL.ToString());
+                            int endCol = int.Parse(endLoc.N_COL.ToString());
+                            Extend7 = (startCol - 1).ToString();
+                            Extend8 = (endCol - 1).ToString();
+                        }
+                        else
+                        {
+                            // 鎴愬搧浠诲姟涓嬪彂鍙傛暟鑾峰彇
+                        
+                            var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_START_LOC).First();
+                            var endLoc = db.Queryable<Location>().Where(a => a.S_CODE == mst.S_END_LOC).First();
+                            int startCol = int.Parse(startLoc.N_COL.ToString());
+                            int endCol = int.Parse(endLoc.N_COL.ToString());
+                            var startLocInfo = db.Queryable<SegmentTable>().Where(a => a.S_AREA_CODE == startLoc.S_AREA_CODE && a.N_ROW == startLoc.S_ROW && a.S_START_COL <= startCol && a.S_END_COL >= startCol).First();
+                            var endLocInfo = db.Queryable<SegmentTable>().Where(a => a.S_AREA_CODE == endLoc.S_AREA_CODE && a.N_ROW == endLoc.S_ROW && a.S_START_COL <= endCol && a.S_END_COL >= endCol).First();
+                        
+                            if (startLocInfo != null)
+                            {
+                                Extend1 = mst.N_START_LAYER == 1 ? startLocInfo.S_First_Bit : startLocInfo.S_Second_Bit;
+                                if (trayType.Contains("闆嗗寲鏉�)) Extend1 = Extend1 + 2;
+                        
+                                Extend7 = (startCol - startLocInfo.S_START_COL).ToString();
+                            }
+                            else LogHelper.Info($"浠诲姟寮傚父锛歿mst.S_CODE},鑷敱绾挎琛ㄦ棤鍙敤璧风偣璐т綅鏁版嵁銆傝捣鐐硅揣浣嶇紪鐮侊細{mst.S_START_LOC}");
+                            if (endLocInfo != null)
+                            {
+                                Extend2 = mst.N_END_LAYER == 1 ? endLocInfo.S_First_Bit : endLocInfo.S_Second_Bit;
+                                Extend8 = (endCol - endLocInfo.S_START_COL).ToString();
+                            }
+                            else LogHelper.Info($"浠诲姟寮傚父锛歿mst.S_CODE},鑷敱绾挎琛ㄦ棤鍙敤缁堢偣璐т綅鏁版嵁銆傜粓鐐硅揣浣嶇紪鐮侊細{mst.S_END_LOC}");
+                        
+                            // 鍏朵粬鍔熻兘鐮佸彲浠ユ牴鎹换鍔$被鍨嬭嚜琛屾坊鍔�姝ゅ浠呯ず渚�绉诲簱 鍔熻兘鐮佽幏鍙栨柟寮忥紝濡傛灉鏈夋洿濂界殑鏂瑰紡锛屽彲浠ヨ嚜琛屼慨鏀�
+                            if (taskType.Contains("绉诲簱")) Extend3 = Convert.ToInt32("20", 16).ToString();
+                        
+                        }
+                        
+                        // 鑾峰彇鎴愬搧宸ュ崟鏁版嵁(鏌ヨ 鎴愬搧宸ュ崟琛�
+                        if (taskType.Contains("绉诲簱"))
+                        {
+                            var workInfo = db.Queryable<YiKuWorkOrder>().Where(a => a.S_WorkNo == workNo).First();
+                            if (workInfo != null)
+                            {
+                                LogHelper.Info($"{workInfo.S_ORDER_TYPE}");
+                                // 鑾峰彇涓嬪彂TS鐗╂枡灞傛暟鏁版嵁(鏌ヨ 鐗╂枡琛�
+                                if (workInfo.S_ORDER_TYPE.Contains("绉诲簱"))
+                                {
+                                    LogHelper.Info($"鐗╂枡缂栫爜锛歿mst.S_ITEM_CODE},鏍堟澘绫诲瀷锛歿trayType},鐗╂枡瑙勬牸锛歿workInfo.S_ItemLayer}");
+                                    var itemInfo1 = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == mst.S_ITEM_CODE && a.S_TRAY_TYPE == trayType && a.S_ITEM_MODEL == workInfo.S_ItemLayer).First();
+                                    if (itemInfo1 != null)
+                                    {
+                                        Extend5 = itemInfo1.S_ITEM_LAYER;
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info($"鐗╂枡琛ㄦ湭缁存姢淇℃伅锛岀墿鏂欑紪鐮侊細{mst.S_ITEM_CODE},鏍堟澘绫诲瀷锛歿trayType},鐗╂枡瑙勬牸锛歿workInfo.S_ItemLayer}");
+                                    }
+                                    //if (workInfo.S_ORDER_TYPE == "鏃犵爜鍏ュ簱" && endLayer == 1) Extend5 = "";
+                                }
+                        
+                                // 鏍规嵁宸ュ崟涓墭鐩樼被鍨嬭浆鎹负瀵瑰簲鐨勪笅鍙慣S鍙傛暟鏁版嵁
+                                LogHelper.Info($"S_TRAY_TYPE:{trayType}");
+                                LogHelper.Info($"Extend5:{Extend5}");
+                                int x = 0;
+                                if (trayType == "灏忔澘") x = 1;
+                                if (trayType == "闆嗗寲鏉�) x = 2;
+                                if (trayType == "灏忔澘瓒呮墭") x = 3;
+                                if (trayType == "闆嗗寲鏉胯秴鎵�) x = 4;
+                        
+                                Extend6 = x.ToString();
+                        
+                            }
+                        }
+                        else
+                        {
+                            var workInfo = db.Queryable<LinZhiWorkOrder>().Where(a => a.S_WorkNo == workNo).First();
+                            if (workInfo != null)
+                            {
+                                LogHelper.Info($"{workInfo.S_ORDER_TYPE}");
+                                // 鑾峰彇涓嬪彂TS鐗╂枡灞傛暟鏁版嵁(鏌ヨ 鐗╂枡琛�
+                                if (workInfo.S_ORDER_TYPE.Contains("涓嬬嚎") || workInfo.S_ORDER_TYPE == "鏃犵爜鍏ュ簱")
+                                {
+                                    var itemInfo1 = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == workInfo.S_ItemCode && a.S_TRAY_TYPE == trayType && a.S_ITEM_MODEL == workInfo.S_ItemLayer).First();
+                                    if (itemInfo1 != null)
+                                    {
+                                        Extend5 = itemInfo1.S_ITEM_LAYER;
+                                    }
+                                    //if (workInfo.S_ORDER_TYPE == "鏃犵爜鍏ュ簱" && endLayer == 1) Extend5 = "";
+                                }
+                        
+                                // 鏍规嵁宸ュ崟涓墭鐩樼被鍨嬭浆鎹负瀵瑰簲鐨勪笅鍙慣S鍙傛暟鏁版嵁
+                                LogHelper.Info($"S_TRAY_TYPE:{trayType}");
+                                int x = 0;
+                                if (trayType == "灏忔澘") x = 1;
+                                if (trayType == "闆嗗寲鏉�) x = 2;
+                                if (trayType == "灏忔澘瓒呮墭") x = 3;
+                                if (trayType == "闆嗗寲鏉胯秴鎵�) x = 4;
+                        
+                                Extend6 = x.ToString();
+                        
+                            }
+                        }
+                        
+                        // 鑾峰彇 浠诲姟鍙傛暟4 DATA 鏁版嵁
+                        string startLayerValue = Convert.ToString(startLayer, 16).ToUpper();
+                        string endLayerValue = Convert.ToString(endLayer, 16).ToUpper();
+                        //Extend4 = Convert.ToInt32(startLayerValue + endLayerValue, 16).ToString();
+                        Extend4 = ((startLayer * 16) + endLayer).ToString();
                     }
                     else
                     {
@@ -842,7 +1261,7 @@
                 if (areaInfo != null)
                 {
                     //搴撳尯璐т綅绾﹀畾锛氬垪鍙疯秺灏忚秺闈犻噷
-                    LogHelper.Info($"鍏ュ簱绠楁硶01:area锛歿areaInfo.areaCode},itemCode:{itemCode}", "WMSAlgoRithm");
+                    LogHelper.Info($"鍏ュ簱绠楁硶01:area锛歿areaInfo.areaCode},itemCode:{itemCode}");
                     try
                     {
                         if (result == null)
@@ -852,8 +1271,10 @@
                                 .ToList();
                             if (locInfo.Count > 0)
                             {
+                                LogHelper.Info($"鍏ュ簱绠楁硶02:鏌ヨ鍒板彲鍏ヨ揣浣嶇殑鏁伴噺涓猴細{locInfo.Count}");
                                 foreach (var a in locInfo)
                                 {
+                                    LogHelper.Info($"鍏ュ簱绠楁硶03:鏌ヨ璐т綅锛歿a.S_CODE},閿佺姸鎬侊細{a.S_LOCK_STATE}锛屽綋鍓嶆暟閲忥細{a.N_CURRENT_NUM}");
                                     //鍘绘帀褰撳墠璐т綅鏈夐攣锛屾垨鑰呬负绌烘墭鐨勮揣浣�                                     if (a.S_LOCK_STATE == "鏃�)
                                     {
@@ -872,6 +1293,7 @@
                                             LogHelper.Info($"缁堢偣璐т綅鏈粦瀹氭墭鐩樹俊鎭�);
                                             continue;
                                         }
+                                        LogHelper.Info($"鍏ュ簱绠楁硶04:鏌ヨ鍒板綋鍓嶈揣浣嶇粦瀹氱殑鐗╂枡缂栫爜涓�{endItemCode}");
                                         //鍒ゆ柇鏄惁鍜屽綋鍓嶈揣浣嶇殑鐗╂枡缂栫爜鐩稿悓
                                         if (itemCode == endItemCode)
                                         {
@@ -891,9 +1313,18 @@
                                                     break;
                                                 }
                                             }
+                                            else
+                                            {
+                                                LogHelper.Info($"鍏ュ簱绠楁硶05:鏌ヨ鍒板綋鍓嶆帓鏈夐攣锛屾帓鍙凤細{a.N_ROW}");
+
+                                            }
                                         }
                                     }
                                 }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鍏ュ簱绠楁硶02:鏈煡璇㈠埌鍙叆璐т綅");
                             }
                             if (result == null)
                             {
@@ -950,24 +1381,28 @@
                 }
                 else
                 {
-                    LogHelper.Info($"鍏ュ簱浠诲姟 璧风偣璐т綅鏈粦瀹氱墿鏂欎俊鎭�);
+                    LogHelper.Info($"鍏ュ簱浠诲姟锛歿areaName}鏈厤缃�);
                 }
             }
             else
             {
+                LogHelper.Info($"鍑哄簱绠楁硶01:area锛歿areaName},itemCode:{itemCode}");
                 var areaInfo = Settings.areaInfos.Where(a => a.areaName == areaName && a.enable == 1).FirstOrDefault();
                 if(areaInfo != null)
                 {
                     var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).Includes(a => a.LocCntrRel).ToList();
                     if(locList.Count > 0)
                     {
-                        foreach(var a in locList)
+                        LogHelper.Info($"鍑哄簱绠楁硶02:鏌ヨ鍒板彲鍑鸿揣浣嶆暟閲忥細{locList.Count}");
+                        foreach (var a in locList)
                         {
-                            if(a.S_LOCK_STATE == "鏃�)
+                            LogHelper.Info($"鍑哄簱绠楁硶03:鏌ヨ璐т綅锛歿a.S_CODE},閿佺姸鎬侊細{a.S_LOCK_STATE}");
+                            if (a.S_LOCK_STATE == "鏃�)
                             {
                                 var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == a.S_CODE).First();
                                 if(cntrInfo != null)
                                 {
+                                    LogHelper.Info($"鍑哄簱绠楁硶04:褰撳墠璐т綅缁戝畾鐨勬墭鐩樼爜涓猴細{cntrInfo.S_CNTR_CODE}");
                                     string endItemCode = "";
                                     var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrInfo.S_CNTR_CODE).First();
                                     if(itemInfo != null && itemInfo.S_ITEM_CODE == itemCode)
@@ -983,6 +1418,10 @@
                                             result = a;
                                             break;
                                         }
+                                        else
+                                        {
+                                            LogHelper.Info($"鍑哄簱绠楁硶05:褰撳墠鎺掓湁閿侊紝璐т綅鍙凤細{lockInfo.S_CODE}");
+                                        }
                                     }
                                 }
                             }
@@ -991,7 +1430,7 @@
                 }
                 else
                 {
-                    LogHelper.Info($"{areaName}鏈厤缃�);
+                    LogHelper.Info($"鍑哄簱绠楁硶01锛歿areaName}鏈厤缃�);
                 }
             }
             return result;
@@ -1027,6 +1466,7 @@
         {
             Location result = null;
 
+            LogHelper.Info($"鐡跺澂娉ㄥ婊℃墭涓嬬嚎锛氱被鍨嬶細{taskName}锛岀墿鏂欑紪鐮侊細{itemCode}");
             if (taskName.Contains("鍗充骇"))
             {
                 //鍗充骇鍗崇敤宸ュ崟锛屼笅绾垮埌鍗充骇鍗崇敤搴撳尯
@@ -1040,6 +1480,10 @@
                         result = locInfo;
                     }
 
+                }
+                else
+                {
+                    LogHelper.Info($"鐡跺澂娉ㄥ婊℃墭涓嬬嚎锛氱摱鍧嵆浜у嵆鐢ˋ 鏈厤缃�);
                 }
                 if (result == null)
                 {
@@ -1065,6 +1509,10 @@
                     }
 
                 }
+                else
+                {
+                    LogHelper.Info($"鐡跺澂娉ㄥ婊℃墭涓嬬嚎锛氱摱鍧潪鍗充骇鍗崇敤 鏈厤缃�);
+                }
                 if (result == null)
                 {
                     result = TaskProcess.BCPInOrOut(db, true, "鐡跺澂搴撳尯", itemCode);
@@ -1088,7 +1536,7 @@
             var areaInfo = Settings.areaInfos.Where(a => a.areaName == endAreaName && a.enable == 1).FirstOrDefault();
             if(areaInfo != null)
             {
-                var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).First();
+                var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM < a.N_CAPACITY && a.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).First();
                 if(locInfo != null)
                 {
                     result = locInfo;
@@ -1136,7 +1584,7 @@
                 if (machine == "鐡跺澂娉ㄥ鏈�)
                 {
                     //寮�惎锛屾煡璇�鐡跺澂绌烘墭 鏄惁绌烘墭鏁伴噺澶т簬3鎵橈紝濡傛灉涓嶅ぇ浜庯紝鍒欒ˉ绌烘墭
-                    var areaInfo = Settings.areaInfos.Where(a => a.areaName == "鐡跺澂绌烘墭" && a.enable == 1).FirstOrDefault();
+                    var areaInfo = Settings.areaInfos.Where(a => a.areaName == "鐡跺澂娉ㄥ鏈虹┖鎵� && a.enable == 1).FirstOrDefault();
                     if(areaInfo != null)
                     {
                         var locList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "鏃�).ToList();
@@ -1149,7 +1597,7 @@
                     }
                     else
                     {
-                        LogHelper.Info("鐡跺澂绌烘墭鏈厤缃�);
+                        LogHelper.Info("鐡跺澂娉ㄥ鏈虹┖鎵樻湭閰嶇疆");
                     }
 
                 }
@@ -1223,7 +1671,7 @@
                 if (machine == "鐡跺澂娉ㄥ鏈�)
                 {
                     //鍏抽棴锛屾煡璇�鐡跺澂绌烘墭 鏄惁鏈夌┖鎵橈紝鏈夊垯鍏ュ簱
-                    var areaInfo = Settings.areaInfos.Where(a => a.areaName == "鐡跺澂绌烘墭" && a.enable == 1).FirstOrDefault();
+                    var areaInfo = Settings.areaInfos.Where(a => a.areaName == "鐡跺澂娉ㄥ鏈虹┖鎵� && a.enable == 1).FirstOrDefault();
                     if (areaInfo != null)
                     {
                         startLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "鏃�).Includes(a => a.LocCntrRel).First();
@@ -1278,128 +1726,7 @@
             }
         }
 
-        /// <summary>
-        /// 浠诲姟淇℃伅鎺ュ彛--姹夊拰浠诲姟姣忎釜鐘舵�杩涜瀹炴椂涓婁紶(鍖呮嫭浠诲姟鍒涘缓鏃讹紝涓婃姤 8)
-        /// </summary>
-        /// <param name="wmsTask"></param>
-        internal static void GeneralInterFaceFunc(WCSTask wmsTask, string taskStatus, string forkliftNo = "")
-        {
-            string msg = "";
-            var req = new SimpleResult();
-            var db = new SqlHelper<object>().GetInstance();
-            ///鍚屼竴鏉′换鍔″悓绉嶇姸鎬佸彧涓婃姤涓�
-            ///鏌ヨ浠诲姟鍔ㄤ綔琛紝鏈変换鍔$浉鍚屽苟涓斾换鍔$姸鎬佺浉鍚岀殑锛屽氨涓嶄笂鎶ワ紙浠诲姟鐘舵�涓�杩樿鏌ヨ杞﹀彿鏄惁瀛樺湪锛�-            bool flage = false;
-            var no = wmsTask.S_CODE;
-            var code = int.Parse(taskStatus);
-            if (taskStatus == "1")
-            {
-                if (forkliftNo != "0")
-                {
-                    if (db.Queryable<TaskAction>().Count(a => a.S_TASK_CODE.Trim() == no.Trim() && a.N_ACTION_CODE == code) == 2)
-                    {
-                        wmsTask.S_EQ_NO = forkliftNo;
-                        flage = true;
-                    }
-                }
-            }
-            else
-            {
-                flage = true;
-            }
 
-            if (flage)
-            {
-                if (WCSHelper.CheckActionRecordExist(wmsTask.S_CODE, 4) && taskStatus == "7") taskStatus = "2";
-                try
-                {
-                    //鑾峰彇涓婃姤鎺ュ彛鐨刄RL
-                    var url = Settings.thirdPartyUrls.Where(a => a.UrlNo == "1" && a.enable == 1).FirstOrDefault();
-                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},鑾峰彇URL锛歿url}", "ThirdSystemLog");
-                    //浠诲姟绫诲瀷鏁版嵁澶勭悊
-                    string taskType = ""; 
-                    var taskTypeInfo = db.Queryable<TaskTypeConvTable>().Where(a => a.taskTypeName == wmsTask.S_TYPE).First();
-                    if (taskTypeInfo != null) taskType = taskTypeInfo.taskType;
-                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},浠诲姟绫诲瀷鏁版嵁澶勭悊锛歿taskType}", "ThirdSystemLog");
-
-                    //鎵樼洏鐗╂枡鏁版嵁澶勭悊
-                    List<string> cntrList = new List<string>(wmsTask.S_CNTR_CODE.Split(','));//鑾峰彇鎵樼洏鏁版嵁
-                    string itemCode = "";//鐗╂枡缂栫爜
-                    itemCode = GeneralInterFaceGetItemCodeFunc(wmsTask, db, cntrList, itemCode);
-                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},鐗╂枡缂栫爜锛歿itemCode}", "ThirdSystemLog");
-                    List<asnReferenceDModel> asnReferenceList = new List<asnReferenceDModel> { };//鎵樼爜鏁扮粍
-                    GeneralInterFaceGetTrayCodeFunc(wmsTask, db, asnReferenceList, cntrList);
-                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},鑾峰彇鎵樼洏鏁版嵁锛歿JsonConvert.SerializeObject(asnReferenceList)}", "ThirdSystemLog");
-
-                    //AGV璁惧淇℃伅澶勭悊
-                    string equipmentCode = "";
-                    string orgCode = "";
-                    string orgName = "";
-                    string proxyInterfaceCode = "0050";
-                    GeneralInterFaceGetAgvDeviceInfoFunc(wmsTask, db, ref equipmentCode, ref orgCode, ref orgName, ref proxyInterfaceCode);
-                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},equipmentCode锛歿equipmentCode},orgCode锛歿orgCode},orgName:{orgName},proxyInterfaceCode:{proxyInterfaceCode}", "ThirdSystemLog");
-
-                    LogHelper.Info($"wmstask.t_start_time锛歿wmsTask.T_START_TIME}");
-                    if (DateTime.MinValue == wmsTask.T_START_TIME)
-                    {
-                        wmsTask.T_START_TIME = null;
-                    }
-
-                    DateTime dateTime = taskStatus == "1" ? Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8) : taskStatus == "2" || taskStatus == "7" ? Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8) : taskStatus == "8" ? Convert.ToDateTime(wmsTask.T_CREATE).AddHours(-8) : DateTime.UtcNow;
-                    string createTime = GetTimeStamp(wmsTask.T_CREATE.AddHours(-8), 1, 2);
-                    string startTime = "";
-                    //鍦–#涓紝浣跨敤DateTimeOffset.UtcNow.ToUnixTimeSeconds()鏂规硶鑾峰彇Unix鏃堕棿鎴虫椂锛屽彲鑳戒細澶氬嚭涓�釜姣銆傝繖鏄洜涓篣nix鏃堕棿鎴虫槸浠ョ涓哄崟浣嶇殑锛岃�DateTimeOffset.UtcNow杩斿洖鐨勬槸UTC鏃堕棿锛屽叾绮惧害涓�00绾崇銆�-                    if (wmsTask.S_WORK_MODE != "agv" && !string.IsNullOrEmpty(wmsTask.S_WORK_MODE)) startTime = wmsTask.S_WORK_MODE;
-                    else
-                    {
-                        startTime = wmsTask.T_START_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8), 1, 2);
-                        if (startTime != null)
-                        {
-                            wmsTask.S_WORK_MODE = startTime;
-                            db.Updateable(wmsTask).UpdateColumns(a => new { a.S_WORK_MODE }).ExecuteCommand();
-                        }
-                    }
-
-                    string endTime = wmsTask.T_END_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8), 1, 2);
-                    string businessTime = taskStatus == "1" ? startTime : taskStatus == "2" || taskStatus == "7" ? endTime : taskStatus == "8" ? createTime : GetTimeStamp(dateTime, 1, 2);
-                    string dt = wmsTask.T_START_TIME == null ? null : Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8).ToString();
-                    string mill = wmsTask.T_START_TIME == null ? null : Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8).Millisecond.ToString();
-                    LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_CODE},浠诲姟鐘舵�锛歿taskStatus},浠诲姟寮�鏃堕棿锛歿wmsTask.T_START_TIME}锛屼换鍔¤浆鎹㈠悗鏃堕棿锛歿dt}锛屼换鍔″彿姣鏃堕棿锛歿mill}锛岃浆鎹㈠悗鏃堕棿锛歿startTime}", "ThirdSystemLog");
-
-                    string sendMsg = JsonConvert.SerializeObject(new
-                    {
-                        taskCode = wmsTask.S_CODE,//浠诲姟缂栫爜
-                        taskStatus = taskStatus,//浠诲姟鐘舵�-浠诲姟鍒涘缓鎴愬姛浼犺緭 8
-                        taskType = taskType,//浠诲姟绫诲瀷-闇�鏍规嵁 閰嶇疆琛ㄦ暟鎹繘琛岃浆鎹紝杞崲涓篗ES鐨勪换鍔$被鍨�-                        createTime = createTime,//闇�浆鎹负 鏃堕棿鎴�   wmsTask.T_CREATE
-                        startTime = startTime,//闇�浆鎹负 鏃堕棿鎴�wmsTask.T_START_TIME
-                        endTime = endTime,//闇�浆鎹负 鏃堕棿鎴�wmsTask.T_END_TIME
-                        businessTime = businessTime,//褰撳墠浠诲姟鏃堕棿-闇�浆鎹负 鏃堕棿鎴�  DateTime.Now
-                        startAddress = wmsTask.S_START_LOC,//璧风偣
-                        endAddress = wmsTask.S_END_LOC,//缁堢偣
-                        equipmentNo = wmsTask.S_EQ_NO,//杞﹁締缂栧彿
-                        equipmentCode = equipmentCode,//杞﹁締閾墝-闇�鏍规嵁 閰嶇疆琛ㄦ暟鎹紝閫氳繃 杞﹁締缂栧彿浠ュ強宸ュ巶缂栫爜 鏌ヨ瀵瑰簲杞﹁締閾墝
-                        orgCode = Settings.FactoryCode,//宸ュ巶缂栫爜
-                        orgName = Settings.FactoryName,//宸ュ巶鍚嶇О
-                        sku = itemCode,//鐗╂枡缂栫爜
-                        asnReferenceDList = asnReferenceList,//鎵樼爜鏁扮粍 姝ゆ鍙夎溅鍙夌殑鎵樼洏鍠风爜锛�涓�鍙夎締杞︼紝鏈変袱涓紪鐮�  浜х嚎涓嬬嚎涓旈潪鏃犵爜妯″紡鏃朵紶杈�-                        appliactionId = "MOBOX"
-                        //proxyInterfaceCode = proxyInterfaceCode //鎺ュ彛鍞竴鏍囪瘑鐮�鍥哄畾鍊硷細0050
-                    });
-                    //http://yst-open-zuul-qa.idc.yst.com.cn/proxy/v1/
-                    req = FuLeWebPost(sendMsg, "generalInterface", url.Url, true);//YKRWSD AreaRowLockState
-
-                    if (req != null && req.success) msg = $"GeneralInterFaceFunc:杩斿洖浠诲姟鐘舵�鎴愬姛:{JsonConvert.SerializeObject(req)}锛�;
-                    else msg = $"GeneralInterFaceFunc:杩斿洖浠诲姟鐘舵�澶辫触:{JsonConvert.SerializeObject(req)}锛�;
-                }
-                catch (Exception ex)
-                {
-                    msg = $"GeneralInterFaceFunc Error:TaskInfo:{JsonConvert.SerializeObject(wmsTask)},TaskState:{taskStatus},ErrorMsg:{ex.Message}";
-                }
-            }
-
-            LogHelper.Info(msg, "ThirdSystemLog");
-        }
 
         /// <summary>
         /// FuLeWebPost
@@ -1527,30 +1854,6 @@
         }
 
         /// <summary>
-        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鏃堕棿鎴�-        /// </summary>
-        /// <param name="DataBitType">鏁版嵁浣嶆暟锛氬�锛�2|64  鍚箟锛�2浣峾64浣�/param>
-        /// <param name="TimeType">鑾峰彇鏃堕棿绫诲瀷锛氬�锛�|2   鍚箟锛�-绉掔骇   2-姣绾�/param>
-        /// <param name="TimeUtcType">鑾峰彇鏃堕棿Utc绫诲瀷锛氬�锛�|2   鍚箟锛�-鏈湴鏃堕棿   2-Utc鏃堕棿</param>
-        /// <returns></returns>
-        public static string GetTimeStamp(DateTime dateTime, int DataBitType, int TimeType)
-        {
-            string timeStamp = "";
-
-            //鏃堕棿鎴虫墦鍗�-            TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);//鏃堕棿鎴宠幏鍙�-            double tsTime = TimeType == 1 ? ts.TotalSeconds : ts.TotalMilliseconds;//绉掔骇|姣绾ф椂闂磋幏鍙�-
-            string TimeTypeInfo = TimeType == 1 ? "绉掔骇" : "姣绾�;
-            timeStamp = DataBitType == 32 ? Convert.ToInt32(tsTime).ToString() : Convert.ToInt64(tsTime).ToString();
-
-            //double result = 0;
-            //result = DataBitType == 32 ? Convert.ToInt32(tsTime) : Convert.ToInt64(tsTime);
-
-            return timeStamp;
-        }
-
-        /// <summary>
         /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇AGV璁惧淇℃伅鏁版嵁
         /// </summary>
         /// <param name="wmsTask"></param>
@@ -1604,11 +1907,6 @@
             //}
         }
 
-        public class asnReferenceDModel
-        {
-            public string asnReferenceD { get; set; }
-        }
-
         /// <summary>
         /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鐗╂枡缂栫爜
         /// </summary>
@@ -1641,5 +1939,538 @@
             return itemCode;
         }
 
+        /// <summary>
+        /// 缁戝畾璐т綅瀹瑰櫒琛�+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static bool BindLocCntr(string loc, string cntr, string itemCode, string batchNo, string deviceName = "", string itemlayer = "")
+        {
+            LogHelper.Info($"缁戝畾璐т綅瀹瑰櫒琛�loc:{loc},cntr:{cntr}");
+            bool result = true;
+            List<string> list = new List<string>(cntr.Split(','));
+            var db = new SqlHelper<object>().GetInstance();
+            list.ForEach(it =>
+            {
+                if (!string.IsNullOrEmpty(it))
+                {
+                    string cntrCode = it.Trim();
+                    var Cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == loc && a.S_CNTR_CODE == cntrCode).First();
+                    if (Cntr == null)
+                    {
+                        var cir = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntrCode, S_SRC = deviceName };
+                        if (db.Insertable<LocCntrRel>(cir).ExecuteCommand() > 0) LogHelper.Info($"璐т綅瀹瑰櫒琛ㄧ粦瀹氭垚鍔燂紝璐т綅鍙凤細{loc}锛屾墭鐩樺彿锛歿cntrCode}");
+                        BindCntrItem(cntrCode, itemCode, batchNo, itemlayer);
+                    }
+                }
+            });
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            return result;
+        }
+
+        /// <summary>
+        /// 缁戝畾瀹瑰櫒鐗╂枡琛�+        /// </summary>
+        /// <param name="itemCode"></param>
+        /// <param name="batchNo"></param>
+        /// <param name="qty"></param>
+        /// <returns></returns>
+        internal static bool BindCntrItem(string trayCode, string itemCode, string batchNo, string itemlayer = "")
+        {
+            LogHelper.Info($"缁戝畾瀹瑰櫒鐗╂枡琛�trayCode:{trayCode}");
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                db.BeginTran();
+                //db.Updateable(cntr).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
+                //1.灏嗗師鏈夊鍣ㄧ墿鏂欎俊鎭垹闄�+                //db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == cntr.S_CNTR_CODE.Trim()).ExecuteCommand();
+                //2.鎻掑叆鏂扮殑瀹瑰櫒鐗╂枡淇℃伅锛堝鍣ㄥ彿涓嶅彉锛�+                var info = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE.Trim() == trayCode.Trim()).First();
+                if (info == null)
+                {
+                    var cir = new CntrItemRel { S_CNTR_CODE = trayCode, S_BATCH_NO = batchNo, S_ITEM_CODE = itemCode, S_ITEM_MODEL = itemlayer };
+                    if (db.Insertable<CntrItemRel>(cir).ExecuteCommand() > 0) LogHelper.Info($"瀹瑰櫒鐗╂枡琛ㄧ粦瀹氭垚鍔燂紝鎵樼洏鍙凤細{trayCode},鐗╂枡缂栫爜锛歿itemCode},鐗╂枡灞傛暟锛歿itemlayer}");
+                }
+
+
+                db.Ado.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"ex:{ex}");
+                db.Ado.RollbackTran();
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 鏍囧噯鍑哄叆搴撳鐞�+        /// </summary>
+        /// <param name="bit">璧风偣鐐逛綅 鎴�缁堢偣鐐逛綅</param>
+        /// <param name="taskType">浠诲姟绫诲瀷</param>
+        /// <param name="trayCode">鎵樼洏缂栫爜</param>
+        /// <param name="areaCode">搴撳尯缂栫爜</param>
+        /// <param name="itemCode">鐗╂枡缂栫爜</param>
+        /// <param name="batchNo">鎵规鍙�/param>
+        /// <param name="itemLayer">鐗╂枡灞傛暟</param>
+        /// <param name="itemTrayType">鐗╂枡鎵樼洏绫诲瀷</param>
+        /// <param name="actionType">鍔ㄤ綔绫诲瀷 True-鍏ュ簱 False-鍑哄簱</param>
+        /// <returns></returns>
+        internal static bool LinZhiPlcTask(string bit, string taskType, string trayCode, string areaCode, string itemCode, string batchNo, string itemLayer, string itemTrayType, string deviceName, bool actionType, string workNo = "")
+        {
+            var result = false;
+            var db = new SqlHelper<object>().GetInstance();
+            if (actionType)
+            {
+                LogHelper.Info($"鎴愬搧鍏ュ簱绠楁硶鍖归厤缁堢偣锛屼骇绾垮彿={deviceName},搴撳尯={areaCode},鐗╂枡缂栫爜={itemCode},鎵规鍙�{batchNo}", "杈撻�绾�);
+                //1.浠诲姟鍒涘缓锛氶攣瀹氳捣鐐癸紝缁堢偣锛岀粓鐐规帓鍙�鎺掗攣瀹氳〃锛堜换鍔″畬鎴愯В閿侊級锛�+                //      浠诲姟鏁版嵁鎼哄甫-鎵樼洏鐮�渚夸簬鍥炴姤)--涓や釜鎵樼洏鐮佸瓨鍏ヤ换鍔¤〃 WMSTask 鐨�鎵樼洏瀛楁 S_CNTRS 
+                //      鐗╂枡灞傛暟(NDC涓嬪彂蹇呰鍙傛暟) --璧风偣灞傛暟 N_START_LAYER 锛氶粯璁や负1
+                //                                --缁堢偣灞傛暟 N_END_LAYER 锛氳幏鍙�璐т綅琛�缁堢偣璐т綅淇℃伅 N_CAPACITY + 1
+                //2.鎻掑叆 褰撳墠鎺掑彿銆佷骇绾垮彿 鑷�鑷姩绉诲簱涓棿琛紝绛夊緟宸ュ崟瀹屾垚鍗宠繘琛�鑷姩绉诲簱
+                var info = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == itemCode && a.S_TRAY_TYPE == itemTrayType).First();
+                if (info != null)
+                {
+                    var endLocation = GetLocationIn(areaCode, itemCode, batchNo);
+                    if (endLocation != null)
+                    {
+                        var layer = endLocation.N_CURRENT_NUM + 1;
+                        //DaMingShanAnalysisMoveLib model = new DaMingShanAnalysisMoveLib { RowNo = endLocation.N_ROW, Batch = batchNo, DeviceName = deviceName };
+                        //WCSHelper.DaMingShanInsertAnalysisMoveLib(model);
+                        result = LinZhiCreateTransport(areaCode, bit, endLocation.S_CODE, taskType, trayCode, 1, layer, deviceName, endLocation.S_ROW, 1, 1, itemTrayType, workNo, batchNo, itemCode);
+                    }
+                    //else //Console.WriteLine($"MoboxHelperCreateTask: 鏈壘鍒扮粓鐐硅揣浣�);
+                }
+                else LogHelper.Info($"鐗╂枡琛ㄦ湭鍖归厤鍒扮墿鏂欎俊鎭紝鐗╂枡缂栫爜锛歿itemCode}锛屾墭鐩樼被鍨嬶細{itemTrayType}");
+            }
+            else
+            {
+                //Location startLocation = null;
+                //string cntrs = "";
+                //if (taskType == "鏍堟澘涓婄嚎")
+                //{
+                //    startLocation = GetLocationOutByRow(areaCode, itemTrayType);
+                //    cntrs = startLocation.LocCntrRel.S_CNTR_CODE;
+                //}
+                //else
+                //{
+                //    startLocation = GetLocationOut(areaCode, itemCode, batchNo, itemLayer);
+                //}
+                //if (startLocation != null)
+                //{
+                //    var startLayer = startLocation.N_LAYER;
+                //    var taskNo = DateTime.Now.Ticks.ToString();
+                //    //涓存睙鍙渶瑕佷竴涓竴鎷�+                //    //var carryCount = startLocation.N_CURRENT_NUM > 3 ? startLocation.N_CURRENT_NUM - 3 : startLocation.N_CURRENT_NUM;
+                //    //鍑哄簱瑕佷粠璧风偣鑾峰彇鎵樼洏
+                //    if (cntrs != "")
+                //    {
+                //        var cntrList = LocationHelper.GetLocCntr(startLocation.S_LOC_CODE);
+                //        //涓存睙涓�釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+                //        if (cntrList.Count == startLocation.N_CURRENT_NUM)
+                //        {
+                //            var trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Skip(1).ToList();
+                //            trayInfo.ForEach(a =>
+                //            {
+                //                cntrs = cntrs + "," + a.S_CNTR_CODE.Trim();
+                //            });
+                //            LogHelper.Info($"cntr:{cntrs}");
+                //            result = LinJiangCreateTransport(areaCode, startLocation.S_LOC_CODE, bit, taskType, cntrs, startLayer, 1, deviceName, startLocation.N_ROW, 1, 1, itemTrayType);
+                //        }
+                //        else
+                //        {
+                //            Console.WriteLine($"璧风偣鎵樼洏鏁伴噺鍜岃揣浣嶅鍣ㄨ〃涓嶇鍚堬紝璇锋鏌ャ�璐т綅琛ㄣ�鍜屻�璐т綅瀹瑰櫒琛ㄣ�");
+                //            LogHelper.Info($"璧风偣鎵樼洏鏁伴噺鍜岃揣浣嶅鍣ㄨ〃涓嶇鍚堬紝璇锋鏌ャ�璐т綅琛ㄣ�鍜屻�璐т綅瀹瑰櫒琛ㄣ�");
+                //        }
+                //    }
+                //}
+                //else LogHelper.Info($"瀵瑰簲鎴愬搧绌烘墭搴撳尯鏈壘鍒板悎閫傜┖鎵橈紝搴撳尯缂栫爜锛歿areaCode},鎵樼洏绫诲瀷锛歿itemTrayType}");
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鍒涘缓鎼繍浠诲姟
+        /// </summary>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="taskType"></param>
+        /// <param name="cntrs"></param>
+        /// <param name="startLayer"></param>
+        /// <param name="endLayer"></param>
+        /// <param name="trayCarryCount"></param>
+        /// <param name="priority"></param>
+        /// <returns></returns>
+        public static bool LinZhiCreateTransport(string areaCode, string start, string end, string taskType, string cntrs, int startLayer, int endLayer, string deviceName, string row, int trayCarryCount = 1, int priority = 1, string trayType = "", string workNo = "", string batch = "", string itemcode = "")
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = false;
+            var taskNo = DateTime.Now.Ticks.ToString();
+            //var res = TaskHelper.LinJiangCreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, cntrs, deviceName, trayCarryCount, startLayer, endLayer, trayType, workNo, batch, itemcode);
+            var res = WMSHelper.CreateOpTask(start, end, "鍏ュ簱", taskType, cntrs, trayType, workNo,itemcode);
+            if (res)
+            {
+                try
+                {
+                    LogHelper.Info($"{taskType}浠诲姟鍒涘缓鎴愬姛锛岃捣鐐癸細{start}锛岀粓鐐癸細{end}锛屾墭鐩樺彿锛歿cntrs}锛屾帓鍙凤細{row}锛屽簱鍖虹紪鐮侊細{areaCode}");
+                    result = true;
+                    //浠诲姟鍒涘缓鎴愬姛锛岃捣鐐硅揣浣嶅嚭搴撻攣瀹氾紝缁堢偣璐т綅鍏ュ簱閿佸畾
+                    LocationHelper.LockLoc(start, 2);
+                    LocationHelper.LockLoc(end, 1);
+
+                    //鎺掗攣瀹�+                    var Sinfo = db.Queryable<Location>().Where(a => a.S_CODE == start).First();
+                    var Einfo = db.Queryable<Location>().Where(a => a.S_CODE == end).First();
+                    if (Sinfo != null && Einfo != null)
+                    {
+                        string startRow = string.IsNullOrEmpty(Sinfo.S_ROW) ? "" : Sinfo.S_ROW.Trim();
+                        string sArea = string.IsNullOrEmpty(Sinfo.S_AREA_CODE) ? "" : Sinfo.S_AREA_CODE;
+                        string endRow = string.IsNullOrEmpty(Einfo.S_ROW) ? "" : Einfo.S_ROW.Trim();
+                        string eArea = string.IsNullOrEmpty(Einfo.S_AREA_CODE) ? "" : Einfo.S_AREA_CODE;
+                        LockRow(startRow, endRow, sArea, eArea, taskType, taskNo);
+
+                        if (taskType == "鎴愬搧涓嬬嚎")
+                        {
+                            //鐢熶骇涓嬬嚎浠诲姟鐢熸垚鎴愬姛锛屽垹闄よ澶囦笅绾挎椂闂存暟鎹�+                            db.Deleteable<LinZhiDeviceState>().Where(a => a.DeviceName.Trim() == deviceName).ExecuteCommand();
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    LogHelper.Error(ex.Message, ex);
+                }
+
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 浠诲姟鍒涘缓鏃堕攣瀹氭帓
+        /// </summary>
+        /// <param name="startRow"></param>
+        /// <param name="endRow"></param>
+        public static void LockRow(string startRow, string endRow, string SArea, string EArea, string taskType, string taskNo)
+        {
+            string startRowXB = startRow + "";
+            string endRowXB = endRow + "";
+            string SAreaXB = SArea + "";
+            string EAreaXB = EArea + "";
+            var db = new SqlHelper<object>().GetInstance();
+            string LockRow = "";
+            var Srow = db.Queryable<RowLock>().Where(a => a.S_ROW == startRow && a.S_AREA_CODE == SArea).First();
+            if (Srow != null && !Srow.S_LOCK_STATE.Trim().Contains("閿�))
+            {
+                Srow.S_LOCK_STATE = "鍑哄簱閿�;
+                db.Updateable(Srow).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand();
+                LogHelper.Info($"浠诲姟鍒涘缓鎴愬姛锛歍askNo:{taskNo}.鍑哄簱閿佸畾锛氳捣鐐瑰簱鍖猴細{SArea},璧风偣鎺掞細{startRow}", "WMSAlgoRithm");
+                LockRow = LockRow + Srow.S_ROW.Trim().Replace("-XB", "") + ",";
+            }
+            var Erow = db.Queryable<RowLock>().Where(a => a.S_ROW == endRow && a.S_AREA_CODE == EArea).First();
+            if (Erow != null && !Erow.S_LOCK_STATE.Trim().Contains("閿�))
+            {
+                Erow.S_LOCK_STATE = "鍏ュ簱閿�;
+                db.Updateable(Erow).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand();
+                LogHelper.Info($"浠诲姟鍒涘缓鎴愬姛锛歍askNo:{taskNo}.鍏ュ簱閿佸畾锛氳捣鐐瑰簱鍖猴細{EArea},璧风偣鎺掞細{endRow}", "WMSAlgoRithm");
+                LockRow = LockRow + Erow.S_ROW.Trim().Replace("-XB", "") + ",";
+            }
+            if (!string.IsNullOrEmpty(LockRow) && taskType.Contains("绉诲簱")) TaskProcess.AreaRowLockState(LockRow);//绉诲簱浠诲姟 鍥炴姤瀵屽嫆搴撲綅閿佸畾
+        }
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鍜岀墿鏂欒幏鍙栧叆搴撶殑璐т綅锛堝爢鍙犲厛鑰冭檻鏍囧噯鐨勶紝瀹归噺閮芥槸涓�牱鐨勶紝渚嬪鍧囧窞閮芥槸3+3锛涗笉鑰冭檻宄ㄧ湁灞遍潪鏍�+2鍜�+1鍚屾椂瀛樺湪锛�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location GetLocationIn(string area, string itemCode, string itemBatch)
+        {
+            //搴撳尯璐т綅绾﹀畾锛氬垪鍙疯秺灏忚秺闈犻噷
+            LogHelper.Info($"鍏ュ簱绠楁硶01:area锛歿area},itemCode:{itemCode},itemBatch:{itemBatch}", "WMSAlgoRithm");
+            Location result = null;
+            //itemCode = itemCode + itemLayer;
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+
+                //鎴愬搧鍏ュ簱绠楁硶锛屼笅绾跨殑鎺掍紭鍏堟煡璇箣鍓嶄笅绾跨殑鎺�+                bool action = queryRow(db, area, itemCode, itemBatch, ref result);
+                if (result == null)
+                {
+                    //1.0 鑾峰彇姣忎竴鎺掓渶澶х殑鍒�+                    //1.1 鍒ゆ柇褰撳墠鏁伴噺鏄笉鏄弧鐨勶紝濡傛灉鏄弧鐨勫苟涓旀槸鏈�ぇ鍒楋紝闇�鎺掗櫎
+                    var listMaxCol = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.S_ROW).ToList();
+                    //1.1 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�
+                    var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel).OrderBy(a => a.S_ROW).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+                    if (list.Count > 0)
+                    {
+                        LogHelper.Info($"鍏ュ簱绠楁硶03:鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�鏁伴噺锛歿list.Count}", "WMSAlgoRithm");
+                        for (int i = list.Count - 1; i >= 0; i--)
+                        {
+                            //鎺掗櫎宸茬粡閿佸畾鐨勮揣浣�鍜�鏀炬弧浜嗕笖鏄渶澶у垪鐨勮揣浣�      N_CAPACITY-璐т綅鏈�ぇ瀹归噺
+                            //鎺掗櫎宸查攣瀹氱殑鎺�+                            LogHelper.Info($"鍏ュ簱绠楁硶04-{i}:[鍒ゆ柇褰撳墠鎺掓槸鍚﹀厑璁镐娇鐢╙.鎺掑彿锛歿list[i].S_ROW.Trim()},鍒楀彿锛歿list[i].N_COL}," +
+                                $"璐т綅缂栫爜锛歿list[i].S_CODE.Trim()},璐т綅鐘舵�锛歿list[i].S_LOCK_STATE.Trim()},褰撳墠鏁伴噺锛歿list[i].N_CURRENT_NUM},鏈�ぇ鏁伴噺锛歿list[i].N_CAPACITY}", "WMSAlgoRithm");
+                            var rowInfo = db.Queryable<RowLock>().Where(a => a.S_AREA_CODE == area && a.S_ROW == list[i].S_ROW.Trim()).First();
+                            LogHelper.Info($"鎺掑彿锛歿list[i].S_ROW},閿佺姸鎬侊細{rowInfo.S_LOCK_STATE}");
+
+                            //鍒ゆ柇褰撳墠搴撳尯褰撳墠鎺掓槸鍚︽湁璐т綅鏈夐攣
+                            var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.S_ROW == list[i].S_ROW && a.S_LOCK_STATE != "鏃�).First();
+                            if (locInfo != null || rowInfo.S_LOCK_STATE.Trim() != "鏃� || list[i].S_LOCK_STATE.Trim() != "鏃� || (list[i].N_CURRENT_NUM == list[i].N_CAPACITY && listMaxCol.Count(a => a.S_CODE == list[i].S_CODE) > 0))
+                            {
+                                LogHelper.Info($"鍏ュ簱绠楁硶04-{i}:[鎺掗櫎宸茬粡閿佸畾鐨勮揣浣嶅拰鏀炬弧浜嗕笖鏄渶澶у垪鐨勮揣浣峕.鎺掑彿:{list[i].S_ROW},鎺掔姸鎬侊細{rowInfo.S_LOCK_STATE.Trim()},璐т綅褰撳墠鏁伴噺锛歿list[i].N_CURRENT_NUM}", "WMSAlgoRithm");
+                                list.Remove(list[i]);
+                            }
+                        }
+                        if (list.Count > 0)
+                        {
+                            //1.3 閬嶅巻鍒ゆ柇鐗╂枡绫诲瀷鏄惁鐩稿悓
+                            for (int i = 0; i < list.Count; i++)
+                            {
+                                //todo 杩橀渶瑕佸垽鏂攣
+                                #region 绌哄鍣ㄦ垨鑰呮弧瀹瑰櫒鍒ゆ柇 ,濡傛灉鏄┖瀹瑰櫒 瀹瑰櫒鐗╂枡淇℃伅涓虹┖
+                                if (list[i].LocCntrRel != null)
+                                {
+                                    LogHelper.Info("鍏ュ簱绠楁硶04:鏍规嵁鐗╂枡鑾峰彇鍙敤璐т綅銆俰temCode=" + itemCode, "WMSAlgoRithm");
+                                    queryItemInfo(db, list[i], area, itemCode, itemBatch, ref result);
+                                    if (result != null)
+                                    {
+                                        if (action)
+                                        {
+                                            //灏嗗綋鍓嶈揣浣嶆帓鍜屽垪鎻掑叆涓棿琛�+                                            CPXXTable table = new CPXXTable
+                                            {
+                                                S_AREA_CODE = area,
+                                                S_ROW = list[i].S_ROW,
+                                                S_TASK_TYPE = "鎴愬搧",
+
+                                            };
+                                            db.Insertable(table).ExecuteCommand();
+                                        }
+                                        break;
+                                    }
+                                }
+                                else LogHelper.Info("鍏ュ簱绠楁硶05:璐т綅瀹瑰櫒鐗╂枡淇℃伅涓虹┖", "WMSAlgoRithm");
+                                #endregion
+                            }
+                        }
+                    }
+                    if (result == null)
+                    {
+                        //todo 杩橀渶瑕佸垽鏂攣
+                        #region 鏌ユ壘鎵�湁鏁伴噺鏄┖鐨勬帓
+                        LogHelper.Info($"鍏ュ簱绠楁硶06:鏃犲彲鐢ㄨ揣浣嶏紝鑾峰彇绌烘帓璐т綅銆�, "WMSAlgoRithm");
+                        //2.0 绠�寲鏌ヨ鍙煡姣忎竴鎺掔涓�垪
+                        list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList();
+                        //2.1 閫変竴涓┖鎺�+                        if (list.Count > 0)
+                        {
+                            LogHelper.Info($"鍏ュ簱绠楁硶06:鏃犲彲鐢ㄨ揣浣嶏紝鑾峰彇绌烘帓璐т綅鏁伴噺涓猴細{list.Count}銆�, "WMSAlgoRithm");
+                            for (int i = 0; i < list.Count; i++)
+                            {
+                                LogHelper.Info($"鍏ュ簱绠楁硶07:鑾峰彇绌烘帓璐т綅锛氳揣浣嶇紪鐮侊細{list[i].S_CODE.Trim()},褰撳墠鏁伴噺锛歿list[i].N_CURRENT_NUM},鎺掑彿锛歿list[i].N_ROW},搴撳尯缂栫爜锛歿list[i].S_AREA_CODE.Trim()}", "WMSAlgoRithm");
+                                if (list[i].S_LOCK_STATE.Trim().Contains("鏃�))
+                                {
+                                    //浜屾鏍¢獙褰撳墠鎺掓墍鏈夎揣浣嶉兘鏄┖鐨勶紝闃叉绯荤粺鏁版嵁閿欎贡
+                                    string row = list[i].S_ROW.Trim();
+                                    string areaCode = list[i].S_AREA_CODE.Trim();
+                                    var rowLock = db.Queryable<RowLock>().Where(a => a.S_ROW == row && a.S_LOCK_STATE.Contains("閿�)).First();
+                                    if (rowLock == null)
+                                    {
+                                        //var rowSumInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == row).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                                        //if (rowSumInfo.sum == 0)
+                                        //{
+                                        //涓夋鏍¢獙 褰撳墠鎺掓墍瀵瑰簲鐨勫彟涓�増浣嶇殑鎺掍负绌烘帓
+                                        //bool DxEmptyCont = JYThreeDxEmptyFunc(area, db, row);
+                                        var locInfo = db.Queryable<Location>().Where(a => a.S_ROW == row).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                                        if (locInfo != null)
+                                        {
+                                            LogHelper.Info($"{locInfo.sum},row:{row}");
+                                            if (locInfo.sum == 0)
+                                            {
+                                                //绌烘帓
+                                                result = list[i];
+
+                                                if (action)
+                                                {
+                                                    //灏嗗綋鍓嶈揣浣嶆帓鍜屽垪鎻掑叆涓棿琛�+                                                    CPXXTable table = new CPXXTable
+                                                    {
+                                                        S_AREA_CODE = area,
+                                                        S_ROW = list[i].S_ROW,
+                                                        //S_TASK_TYPE = "鎴愬搧",
+
+                                                    };
+                                                    db.Insertable(table).ExecuteCommand();
+                                                }
+                                                break;
+                                            }
+                                        }
+                                        else LogHelper.Info("鏈壘鍒拌鎺�);
+                                    }
+                                    else LogHelper.Info("鎺掗攣宸蹭笂閿�);
+                                }
+                            }
+                        }
+                        else LogHelper.Info($"鏈幏鍙栧埌绌烘帓锛屽簱鍖虹紪鐮侊細{area}");
+                        #endregion
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocationIn:" + ex.Message, ex);
+            }
+            return result;
+        }
+
+        private static bool queryRow(SqlSugarClient db, string area, string itemCode, string itemBatch, ref Location result)
+        {
+            bool action = false;
+            LogHelper.Info("鎴愬搧涓嬬嚎鏌ヨ浼樺厛涓嬬嚎鎺掕〃");
+            try
+            {
+                //1銆佹煡璇腑闂磋〃鏄惁鏈夊�锛屾湁鍊硷紝鍒欐煡璇腑闂磋〃鎸囧畾鎺掔殑鍙敤璐т綅锛屽綋涓棿琛ㄦ寚瀹氭帓鏌ヤ笉鍒板彲鐢ㄨ揣浣嶇殑鏃跺�锛岃繘鍏ョ畻娉�+                //2銆佽嫢娌″�锛岃繘鍏ョ畻娉曪紝鏌ヨ鍒板彲鐢ㄨ揣浣嶏紝灏嗗彲鐢ㄨ揣浣嶇殑鎺掕褰曞埌涓棿琛�+                //var cpxxInfo = db.Queryable<CPXXTable>().Where(a => a.S_TASK_TYPE == "鎴愬搧").First();
+                var cpxxInfo = db.Queryable<CPXXTable>().Where(a => a.S_TASK_TYPE == "鎴愬搧").First();
+                if (cpxxInfo != null)
+                {
+                    LogHelper.Info($"褰撳墠搴撳尯缂栫爜锛歿cpxxInfo.S_AREA_CODE}锛屾帓鍙凤細{cpxxInfo.S_ROW}");
+                    //鏌ヨ褰撳墠鎺掓槸鍚︽湁鎺掗攣
+                    var rowInfo = db.Queryable<RowLock>().Where(a => a.S_AREA_CODE == cpxxInfo.S_AREA_CODE && a.S_ROW == cpxxInfo.S_ROW).First();
+                    if (rowInfo != null)
+                    {
+                        LogHelper.Info($"閿佺姸鎬�{rowInfo.S_LOCK_STATE}");
+                        if (rowInfo.S_LOCK_STATE == "鏃�)
+                        {
+                            LogHelper.Info($"aaa");
+                            //鏌ヨ褰撳墠鎺掓槸鍚︽湁璐т綅閿�+                            var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == cpxxInfo.S_AREA_CODE && a.S_ROW == cpxxInfo.S_ROW && a.S_LOCK_STATE != "鏃�).First();
+                            if (locInfo == null)
+                            {
+                                LogHelper.Info($"bbb");
+                                //鏌ヨ褰撳墠鎺掓渶澶ф帓鏄惁涓烘弧璐т綅
+                                var locInfo1 = db.Queryable<Location>().Where(a => a.S_AREA_CODE == cpxxInfo.S_AREA_CODE && a.S_ROW == cpxxInfo.S_ROW).OrderByDescending(a => a.N_COL).First();
+                                if (locInfo1 != null && locInfo1.N_CURRENT_NUM != locInfo1.N_CAPACITY)
+                                {
+                                    LogHelper.Info($"ccc");
+                                    //鏌ヨ褰撳墠鎺掓渶澶х殑鍙敤璐т綅 骞跺垽鏂槸鍚︽槸鏈�ぇ鍒�+                                    var endLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == cpxxInfo.S_AREA_CODE && a.S_ROW == cpxxInfo.S_ROW && a.N_CURRENT_NUM > 0).OrderByDescending(a => a.N_COL).Includes(a => a.LocCntrRel).First();
+                                    if (endLoc != null)
+                                    {
+                                        LogHelper.Info($"ddd");
+                                        queryItemInfo(db, endLoc, area, itemCode, itemBatch, ref result);
+                                        if (result == null)
+                                        {
+                                            LogHelper.Info($"fff");
+                                            //娓呴櫎涓棿琛ㄤ俊鎭�+                                            db.Deleteable<CPXXTable>().Where(a => a.S_ROW == cpxxInfo.S_ROW).ExecuteCommand();
+                                            action = true;
+                                        }
+                                        else
+                                        {
+                                            //鍒ゆ柇褰撳墠璐т綅鏄惁鏈夊嵏璐у畬鎴愪箣鍓嶇殑浠诲姟
+                                            string loc = result.S_CODE;
+                                            var taskInfo = db.Queryable<WMSTask>().Where(a => a.S_END_LOC == loc && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "鍗歌揣瀹屾垚").First();
+                                            LogHelper.Info("鏄惁鏈夊綋鍓嶈揣浣嶄换鍔★細" + JsonConvert.SerializeObject(taskInfo));
+                                            if (taskInfo != null) result = null;
+
+                                        }
+                                    }
+                                }
+                                else
+                                {
+                                    //娓呴櫎涓棿琛ㄤ俊鎭�+                                    db.Deleteable<CPXXTable>().Where(a => a.S_ROW == cpxxInfo.S_ROW).ExecuteCommand();
+                                    action = true;
+                                }
+                            }
+                        }
+                        else if (rowInfo.S_LOCK_STATE == "閿佸畾")
+                        {
+                            //娓呴櫎涓棿琛ㄤ俊鎭�+                            db.Deleteable<CPXXTable>().Where(a => a.S_ROW == cpxxInfo.S_ROW).ExecuteCommand();
+                            action = true;
+                            LogHelper.Info($"queryRow锛氳鎺掓湁閿侊紝搴撳尯缂栫爜锛歿cpxxInfo.S_AREA_CODE}锛屾帓鍙凤細{cpxxInfo.S_ROW}锛岄攣鐘舵�:{rowInfo.S_LOCK_STATE}");
+                        }
+                        else
+                        {
+                            LogHelper.Info($"queryRow锛氳鎺掓湁閿侊紝搴撳尯缂栫爜锛歿cpxxInfo.S_AREA_CODE}锛屾帓鍙凤細{cpxxInfo.S_ROW}锛岄攣鐘舵�:{rowInfo.S_LOCK_STATE}");
+                        }
+
+                    }
+                    else LogHelper.Info($"queryRow锛氳鎺掓湭鎵惧簱鍖虹紪鐮侊細{cpxxInfo.S_AREA_CODE}锛屾帓鍙凤細{cpxxInfo.S_ROW}");
+                }
+                else action = true;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error("queryRow:" + ex.Message, ex);
+            }
+
+            return action;
+        }
+
+        private static void queryItemInfo(SqlSugarClient db, Location loc, string area, string itemCode, string itemBatch, ref Location result)
+        {
+            string cntrCode = loc.LocCntrRel.S_CNTR_CODE;
+            var itemInfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrCode).First();
+
+            if ((itemCode != null && itemInfo != null && itemInfo.S_ITEM_CODE.Trim() == itemCode) || (itemCode == null && itemInfo == null))
+            {
+                LogHelper.Info("鐗╂枡缂栫爜鍖归厤鎴愬姛");
+                LogHelper.Info($"{itemInfo.S_BATCH_NO}");
+                //鐩稿悓鐗╂枡 鐩稿悓鎵规
+                if (itemInfo.S_BATCH_NO.Trim() == itemBatch.Trim())
+                {
+                    LogHelper.Info("鎵规鍙峰尮閰嶆垚鍔�);
+                    //褰撳墠鏁伴噺灏忎簬褰撳墠瀹归噺
+                    if (loc.N_CURRENT_NUM < loc.N_CAPACITY)
+                    {
+                        string locCode = loc.S_CODE.Trim();
+                        var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).ToList();
+                        if (trayInfo.Count() % 2 == 0)
+                        {
+                            result = loc;
+                            string code11 = result.S_CODE;
+                            var taskINfo = db.Queryable<WMSTask>().Where(a => a.S_END_LOC == code11 && a.S_B_STATE == "鍙栬揣瀹屾垚").First();
+                            if (taskINfo != null)
+                            {
+                                result = null;
+                            }
+
+                            LogHelper.Info($"鍏ュ簱绠楁硶05:褰撳墠璐т綅鍙敤锛岃幏鍙栧綋鍓嶈揣浣嶃�褰撳墠璐т綅锛歿loc.S_CODE.Trim()}.", "WMSAlgoRithm");
+                        }
+                        else
+                        {
+                            //1.33 涓嶆弧瓒冲垯閫夋嫨鍚庝竴鍒楋紝鍚庝竴鍒楄偗瀹氭槸绌鸿揣浣�+                            result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == loc.N_ROW && a.N_COL > loc.N_COL).OrderBy(a => a.N_COL).First();
+                            if (result.S_LOCK_STATE != "鏃�) result = null;
+                            LogHelper.Info($"鍏ュ簱绠楁硶05:褰撳墠璐т綅鎵樼洏鏁伴噺鍙眰浣�锛岃幏鍙栧悗涓�垪璐т綅銆傚綋鍓嶈揣浣嶏細{loc.S_CODE.Trim()}锛屾墭鐩樻暟閲忥細{trayInfo.Count()}.", "WMSAlgoRithm");
+                        }
+                    }
+                    else
+                    {
+                        //褰撳墠璐т綅婊′簡锛屾瘮浠朿ol澶т竴浣嶇殑璐т綅锛屽悗涓�垪鑲畾鏄┖璐т綅
+                        result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == loc.N_ROW && a.N_COL > loc.N_COL).OrderBy(a => a.N_COL).First();
+                        //if (result.S_LOCK_STATE != "鏃�) result = null;
+                        LogHelper.Info($"鍏ュ簱绠楁硶05:褰撳墠璐т綅宸叉弧锛岃幏鍙栧悗涓�垪绌轰綅銆傚綋鍓嶈揣浣嶏細{loc.S_CODE.Trim()}.", "WMSAlgoRithm");
+                    }
+                }
+                //鐩稿悓鐗╂枡 涓嶅悓鎵规鍙�锛岄渶闂撮殧涓�釜璐т綅 col-1
+                else
+                {
+                    result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == loc.N_ROW && a.N_COL - 1 > loc.N_COL).OrderBy(a => a.N_COL).First();
+                    //if (result.S_LOCK_STATE != "鏃�) result = null;
+                    LogHelper.Info($"鍏ュ簱绠楁硶05:鐩稿悓鐗╂枡 涓嶅悓鎵规鍙�锛岄渶闂撮殧涓�釜璐т綅,褰撳墠璐т綅锛歿loc.S_CODE.Trim()}.", "WMSAlgoRithm");
+                }
+            }
+        }
     }
 }

--
Gitblit v1.9.1