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/HH.WCS.Mobox3.NFLZ.csproj    |    9 
 HH.WCS.Mobox3.NongFuLinZhi/models/Location.cs           |    1 
 HH.WCS.Mobox3.NongFuLinZhi/device/TcpServer.cs          |    7 
 HH.WCS.Mobox3.NongFuLinZhi/models/RowLock.cs            |   39 
 HH.WCS.Mobox3.NongFuLinZhi/models/WMSTask.cs            |    3 
 HH.WCS.Mobox3.NongFuLinZhi/process/TaskProcess.cs       | 1437 +++++++++++++++++++++++++------
 HH.WCS.Mobox3.NongFuLinZhi/models/SegmentTable.cs       |   39 
 HH.WCS.Mobox3.NongFuLinZhi/models/LocCntrRel.cs         |    4 
 HH.WCS.Mobox3.NongFuLinZhi/models/RowComparsionTable.cs |   19 
 HH.WCS.Mobox3.NongFuLinZhi/models/CntrItemRel.cs        |    1 
 .vs/农夫林芝/v17/DocumentLayout.json                        |   65 +
 HH.WCS.Mobox3.NongFuLinZhi/wms/WCSHelper.cs             |  122 ++
 HH.WCS.Mobox3.NongFuLinZhi/config/config.json           |    3 
 HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiDeviceState.cs  |   25 
 HH.WCS.Mobox3.NongFuLinZhi/models/ItemRel.cs            |   31 
 HH.WCS.Mobox3.NongFuLinZhi/models/YiKuWorkOrder.cs      |   39 
 HH.WCS.Mobox3.NongFuLinZhi/models/TN_Lock.cs            |    1 
 HH.WCS.Mobox3.NongFuLinZhi/core/WMSCore.cs              |   11 
 HH.WCS.Mobox3.NongFuLinZhi/util/Settings.cs             |    5 
 .vs/VSWorkspaceState.json                               |    7 
 HH.WCS.Mobox3.NongFuLinZhi/models/itemPrecedenceLine.cs |   31 
 HH.WCS.Mobox3.NongFuLinZhi/wms/WMSHelper.cs             |   49 
 HH.WCS.Mobox3.NongFuLinZhi/process/DeviceProcess.cs     |  544 +++++++++++
 HH.WCS.Mobox3.NongFuLinZhi/Program.cs                   |    4 
 HH.WCS.Mobox3.NongFuLinZhi/models/CPXXTable.cs          |   23 
 HH.WCS.Mobox3.NongFuLinZhi/models/WCSTask.cs            |    6 
 HH.WCS.Mobox3.NongFuLinZhi/core/WCSCore.cs              |   94 +
 HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiTrayInfo.cs     |   43 
 .vs/农夫林芝/v17/.wsuo                                      |    0 
 29 files changed, 2,248 insertions(+), 414 deletions(-)

diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json
new file mode 100644
index 0000000..6738466
--- /dev/null
+++ b/.vs/VSWorkspaceState.json
@@ -0,0 +1,7 @@
+{
+  "ExpandedNodes": [
+    ""
+  ],
+  "SelectedNode": "\\C:\\software\\A-\u5DE5\u4F5C\\\u6E90\u7801\\GIT\\\u519C\u592B\u6797\u829D",
+  "PreviewInSolutionExplorer": false
+}
\ No newline at end of file
diff --git "a/.vs/\345\206\234\345\244\253\346\236\227\350\212\235/v17/.wsuo" "b/.vs/\345\206\234\345\244\253\346\236\227\350\212\235/v17/.wsuo"
new file mode 100644
index 0000000..dd169e9
--- /dev/null
+++ "b/.vs/\345\206\234\345\244\253\346\236\227\350\212\235/v17/.wsuo"
Binary files differ
diff --git "a/.vs/\345\206\234\345\244\253\346\236\227\350\212\235/v17/DocumentLayout.json" "b/.vs/\345\206\234\345\244\253\346\236\227\350\212\235/v17/DocumentLayout.json"
new file mode 100644
index 0000000..0059f7e
--- /dev/null
+++ "b/.vs/\345\206\234\345\244\253\346\236\227\350\212\235/v17/DocumentLayout.json"
@@ -0,0 +1,65 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "C:\\software\\A-\u5DE5\u4F5C\\\u6E90\u7801\\GIT\\\u519C\u592B\u6797\u829D\\",
+  "Documents": [],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": [
+        {
+          "DockedWidth": 12,
+          "SelectedChildIndex": -1,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{eefa5220-e298-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{b1e99781-ab81-11d0-b683-00aa00a3ee26}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
+            }
+          ]
+        },
+        {
+          "DockedWidth": 22,
+          "SelectedChildIndex": -1,
+          "Children": [
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{d78612c7-9962-4b83-95d9-268046dad23a}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:0:0:{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}"
+            },
+            {
+              "$type": "Bookmark",
+              "Name": "ST:1:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/HH.WCS.Mobox3.NFLZ.csproj b/HH.WCS.Mobox3.NongFuLinZhi/HH.WCS.Mobox3.NFLZ.csproj
index ed885e9..ff638ca 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/HH.WCS.Mobox3.NFLZ.csproj
+++ b/HH.WCS.Mobox3.NongFuLinZhi/HH.WCS.Mobox3.NFLZ.csproj
@@ -159,6 +159,15 @@
     <Compile Include="dispatch\HanAo.cs" />
     <Compile Include="dispatch\NDC.cs" />
     <Compile Include="core\Monitor.cs" />
+    <Compile Include="models\SegmentTable.cs" />
+    <Compile Include="models\RowComparsionTable.cs" />
+    <Compile Include="models\RowLock.cs" />
+    <Compile Include="models\CPXXTable.cs" />
+    <Compile Include="models\ItemRel.cs" />
+    <Compile Include="models\itemPrecedenceLine.cs" />
+    <Compile Include="models\LinZhiTrayInfo.cs" />
+    <Compile Include="models\LinZhiDeviceState.cs" />
+    <Compile Include="models\YiKuWorkOrder.cs" />
     <Compile Include="models\HttpRepeatSend.cs" />
     <Compile Include="models\BaseModel.cs" />
     <Compile Include="models\Area.cs" />
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/Program.cs b/HH.WCS.Mobox3.NongFuLinZhi/Program.cs
index a612d59..7347e29 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/Program.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/Program.cs
@@ -35,7 +35,7 @@
                 //2.0 寮�惎tcp
                 StartTcp();
                 //3.0 寮�惎澶栨寕鏈嶅姟
-                StartOther();
+                //StartOther();
                 //3.0 寮�惎绾跨▼
                 var rc = HostFactory.Run(x => {
                     x.Service<WorkThread>(s => {
@@ -98,7 +98,7 @@
 
                 //tasks.Add(GetTask(Monitor.CheckDevice));
                 tasks.Add(GetTask(Monitor.BottleBlankTransportation)); //鐡剁洊杞繍
-                tasks.Add(GetTask(Monitor.BCPWorkSurveillance)); //鍗婃垚鍝佸伐鍗曠洃鎺�+                //tasks.Add(GetTask(Monitor.BCPWorkSurveillance)); //鍗婃垚鍝佸伐鍗曠洃鎺� 
                 Task.WaitAll(tasks.ToArray());
             }
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/config/config.json b/HH.WCS.Mobox3.NongFuLinZhi/config/config.json
index eff5ffc..81ea337 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/config/config.json
+++ b/HH.WCS.Mobox3.NongFuLinZhi/config/config.json
@@ -14,6 +14,7 @@
     "SqlServer": "Data Source=DESKTOP-J39FOS3;Initial Catalog=NFLZ;integrated security=True",
     "SqlServer1": "Data Source=192.168.1.198\\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015",
     "ApiPort": 8800,
+    "TcpPort": 2024,
     "FacCode": "0000",
     "WHCode": "W001",
     "DeviceInfo": [
@@ -21,7 +22,7 @@
             "address": "127.0.0.11",
             "deviceName": "鍐滃か鏋楄姖-鐡跺澂鏈�,
             "deviceNo": [],
-            "location": [ "YLWJG1005", "YLWJG1006" ],
+            "TN_Location": [ "YLWJG1005", "YLWJG1006" ],
             "deviceType": 2,
             "enable": 0
         }
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/core/WCSCore.cs b/HH.WCS.Mobox3.NongFuLinZhi/core/WCSCore.cs
index 9b4ddf4..b2ef758 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/core/WCSCore.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/core/WCSCore.cs
@@ -2,6 +2,7 @@
 using HH.WCS.Mobox3.NFLZ.process;
 using HH.WCS.Mobox3.NFLZ.util;
 using HH.WCS.Mobox3.NFLZ.wms;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -19,45 +20,62 @@
             else {
                 var TN_Task = WCSHelper.GetTask(model.No);
                 if (TN_Task != null) {
-                    if (model.State <= 7 && !WCSHelper.CheckActionRecordExist(model.No,model.State)) {
-                        //鏈変换鍔″彿璇锋眰
-                        switch (model.State) {
-                            case 1:
-                                WCSHelper.Begin(TN_Task);
-                                break;
-                            #region MyRegion
-                            case 3:
-                                WCSHelper.UpdateStatus(TN_Task, "寮�鍙栬揣");
-                                break;
-                            case 4:
-                                WCSHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚");
-                                TaskProcess.OperateStatus(TN_Task, 4);
-                                break;
-                            case 5:
-                                WCSHelper.UpdateStatus(TN_Task, "寮�鍗歌揣");
-                                break;
-                            case 6:
-                                WCSHelper.UpdateStatus(TN_Task, "鍗歌揣瀹屾垚");
-                                TaskProcess.OperateStatus(TN_Task, 6);
-                                break;
-                            #endregion
-                            case 2:
-                                WCSHelper.End(TN_Task);
-                                //sendsencondtask(TN_Task);
-                                WMSHelper.End(TN_Task);
-                                break;
-                            case 7:
-                                TaskProcess.OperateStatus(TN_Task, 7);
-                                WCSHelper.Fail(TN_Task);
-                                //sendsencondtask(TN_Task);
-                                //WMSHelper.End(TN_Task);
-                                break;
+                    if (model.State <= 7) 
+                    {
+                        if (!WCSHelper.CheckActionRecordExist(model.No, model.State))
+                        {
+                            //鏈変换鍔″彿璇锋眰
+                            switch (model.State)
+                            {
+                                case 1:
+                                    WCSHelper.Begin(TN_Task);
+                                    break;
+                                #region MyRegion
+                                case 3:
+                                    WCSHelper.UpdateStatus(TN_Task, "寮�鍙栬揣", model.ForkliftNo);
+                                    //if (TN_Task.S_TYPE == "娉ㄥ搴撳瓨婊℃墭涓嬬嚎锛堢摱鍧級" || TN_Task.S_TYPE == "娉ㄥ鍗充骇婊℃墭涓嬬嚎锛堢摱鍧級")
+                                    //{
+                                    //    TaskProcess.writeSignal(TN_Task);
+                                    //}
+                                    break;
+                                case 4:
+                                    WCSHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚");
+                                    TaskProcess.OperateStatus(TN_Task, 4);
+                                    break;
+                                case 5:
+                                    WCSHelper.UpdateStatus(TN_Task, "寮�鍗歌揣");
+                                    break;
+                                case 6:
+                                    WCSHelper.UpdateStatus(TN_Task, "鍗歌揣瀹屾垚");
+                                    TaskProcess.OperateStatus(TN_Task, 6);
+                                    break;
+                                #endregion
+                                case 2:
+                                    if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 4))
+                                    {
+                                        TaskProcess.OperateStatus(TN_Task, 4);
+                                    }
+                                    if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 6))
+                                    {
+                                        TaskProcess.OperateStatus(TN_Task, 6);
+                                    }
+                                    WCSHelper.End(TN_Task);
+                                    //sendsencondtask(TN_Task);
+                                    WMSHelper.End(TN_Task);
+                                    break;
+                                case 7:
+                                    TaskProcess.OperateStatus(TN_Task, 7);
+                                    WCSHelper.Fail(TN_Task);
+                                    //sendsencondtask(TN_Task);
+                                    //WMSHelper.End(TN_Task);
+                                    break;
+                            }
+                            WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
+                            //璋冪敤绗笁鏂规帴鍙o紙濡傛灉鏈夛級TaskProcess.ReportStatus
+                            TaskProcess.ThirdReportStatus(TN_Task, model.State, model.ForkliftNo);
+                            TaskProcess.UpdateAgvNo(TN_Task, model.ForkliftNo);
+                            if (AlterControlSwitch01 == "1") TaskProcess.GeneralInterFaceFunc(TN_Task, model.State.ToString(), model.ForkliftNo);
                         }
-                        WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
-                        //璋冪敤绗笁鏂规帴鍙o紙濡傛灉鏈夛級TaskProcess.ReportStatus
-                        TaskProcess.ThirdReportStatus(TN_Task, model.State, model.ForkliftNo);
-                        TaskProcess.UpdateAgvNo(TN_Task, model.ForkliftNo);
-                        if (AlterControlSwitch01 == "1") TaskProcess.GeneralInterFaceFunc(TN_Task, model.State.ToString(), model.ForkliftNo);
                     }
                     else {
                         LogHelper.Info("瀹夊叏璇锋眰浜や簰");
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/core/WMSCore.cs b/HH.WCS.Mobox3.NongFuLinZhi/core/WMSCore.cs
index b74e88d..0938510 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/core/WMSCore.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/core/WMSCore.cs
@@ -39,12 +39,12 @@
         /// </summary>
         internal static void Start()
         {
-            LogHelper.Info($"浣滀笟鍚姩 鍒涘缓瀛愪换鍔�);
+            //LogHelper.Info($"浣滀笟鍚姩 鍒涘缓瀛愪换鍔�);
             var db = new SqlHelper<object>().GetInstance();
             List<WMSTask> list = WMSHelper.GetWaitingOperationList();
-            LogHelper.Info($"鑾峰彇浠诲姟鏁版嵁 鏁伴噺{list.Count}");
             if (list.Count > 0)
             {
+                LogHelper.Info($"鑾峰彇浠诲姟鏁版嵁 鏁伴噺{list.Count}");
                 //濡傛灉鏄嚭搴撶殑浣滀笟閿佸畾鎵樼洏鐨勬椂鍊欏凡缁忔槑纭捣鐐逛簡锛屽鏋滃彂璐у崟鎴栧垎鎷e崟鎸囧畾浜嗙粓鐐癸紝
                 //濡傛灉娌℃湁浣滀笟銆佷换鍔$殑椤哄簭闄愬埗灏卞彲浠ュ惎鍔紝鍒涘缓瀛愪换鍔′簡
                 foreach (var a in list)
@@ -125,8 +125,13 @@
                                     N_CNTR_COUNT = 1,
                                     S_CNTR_CODE = a.S_CNTR_CODE,
                                     N_START_LAYER = startinfo.N_CURRENT_NUM,
-                                    N_END_LAYER = endinfo.N_CURRENT_NUM + 1
+                                    N_END_LAYER = endinfo.N_CURRENT_NUM + 1,
+                                    S_TRAY_TYPE = a.S_TRAY_TYPE,
+                                    S_WORK_NO = a.S_WORK_NO,
+                                    S_ITEM_CODE = a.S_ITEM_CODE,
+                                    S_NOTE = a.S_NOTE
                                 };
+                                
 
                                 if (WCSHelper.CreateTask(wcsTask))
                                 {
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/device/TcpServer.cs b/HH.WCS.Mobox3.NongFuLinZhi/device/TcpServer.cs
index 26ff97d..6a92834 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/device/TcpServer.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/device/TcpServer.cs
@@ -3,6 +3,7 @@
 using System.Linq;
 using System.Net;
 using System.Net.Sockets;
+using HH.WCS.Mobox3.NFLZ.util;
 
 namespace HH.WCS.Mobox3.NFLZ.device
 {
@@ -16,8 +17,8 @@
             var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             try {
                 //灏嗚socket缁戝畾鍒颁富鏈轰笂闈㈢殑鏌愪釜绔彛锛岀鍙e簲璇ユ斁鍒伴厤缃枃浠朵腑
-                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), 2023));
-                Console.WriteLine(2023);
+                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), Settings.tcpPort));
+                Console.WriteLine(Settings.tcpPort);
                 //鍚姩鐩戝惉锛屽苟涓旇缃竴涓渶澶х殑闃熷垪闀垮害
                 socket.Listen(30);
                 //寮�鎺ュ彈瀹㈡埛绔繛鎺ヨ姹�@@ -80,7 +81,7 @@
                     if (buffers.Keys.Contains(remote_ip)) {
                         //璇诲彇鍑烘潵娑堟伅鍐呭
                         var message = GetHexString(buffers[remote_ip], length);//16   10
-                        Console.WriteLine(message);
+                        //Console.WriteLine(message);
                         if (message.Substring(0, 4) == "3f00" && message.Substring(message.Length - 4) == "0d0a") {
                             //鏄剧ず娑堟伅
                             string msg = message.Replace(@"0d", "").Replace(@"0a", "").Replace(@"0d0a", "").Trim();
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/CPXXTable.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/CPXXTable.cs
new file mode 100644
index 0000000..8a5fec5
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/CPXXTable.cs
@@ -0,0 +1,23 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_CPXXTable")]
+    public class CPXXTable : BaseModel
+    {
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 鎺掑彿
+        /// </summary>
+        public string S_ROW { get; set; }
+        /// <summary>
+        /// 浠诲姟绫诲瀷
+        /// </summary>
+        public string S_TASK_TYPE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/CntrItemRel.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/CntrItemRel.cs
index d071502..1982551 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/models/CntrItemRel.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/CntrItemRel.cs
@@ -59,6 +59,7 @@
         /// 是否暂存
         /// </summary>
         public string S_EXT_ATTR3 { get; set; } = "N";
+        public string S_ITEM_MODEL { get; set; }
 
         /// <summary>
         /// 反向映射
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/ItemRel.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/ItemRel.cs
new file mode 100644
index 0000000..95646ca
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/ItemRel.cs
@@ -0,0 +1,31 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_ItemRel")]
+    public class ItemRel : BaseModel
+    {
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+        /// <summary>
+        /// 鐗╂枡瑙勬牸/灞傞珮
+        /// </summary>
+        public string S_ITEM_MODEL { get; set; }
+        /// <summary>
+        /// 涓嬪彂TS楂樺害鍊�+        /// </summary>
+        public string S_ITEM_LAYER { get; set; }
+        /// <summary>
+        /// 鏍堟澘绫诲瀷
+        /// </summary>
+        public string S_TRAY_TYPE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiDeviceState.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiDeviceState.cs
new file mode 100644
index 0000000..423793d
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiDeviceState.cs
@@ -0,0 +1,25 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_LinZhiDeviceState")]
+    public class LinZhiDeviceState : BaseModel
+    {
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public string DeviceName { get; set; }
+        /// <summary>
+        /// 绗竴娆℃敹鍒颁骇绾夸笅绾夸俊鍙锋椂闂�浠呮洿鏂颁竴娆�+        /// </summary>
+        public string DeviceTime { get; set; }
+        /// <summary>
+        /// 璁惧鐘舵�鏍囪瘑
+        /// --0-榛樿鍊硷細鏀跺埌涓嬬嚎淇″彿鍙互鏇存柊 DeviceStartTime
+        /// --1-閿佸畾鍊硷細鏇存柊 DeviceStartTime 鍊间箣鍚庯紝鏇存敼姝ゅ�锛屾鏃朵笉鍏佽鏇存柊 DeviceStartTime 鍊硷紝绛夊埌鍙栬揣瀹屾垚鎭㈠涓�
+        /// </summary>
+        public string DeviceState { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiTrayInfo.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiTrayInfo.cs
new file mode 100644
index 0000000..53508e7
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/LinZhiTrayInfo.cs
@@ -0,0 +1,43 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_LinZhiTrayInfo")]
+    public class LinZhiTrayInfo : BaseModel
+    {
+        /// <summary>
+        /// 璁惧缂栫爜
+        /// </summary>
+        public string deviceName { get; set; }
+        /// <summary>
+        /// 宸ュ崟鍙�+        /// </summary>
+        public string workNo { get; set; }
+        /// <summary>
+        /// 鎵樼洏鐮�+        /// </summary>
+        public string trayCode { get; set; }
+        /// <summary>
+        /// 鎵樼洏鏁伴噺
+        /// </summary>
+        public string trayNum { get; set; }
+        /// <summary>
+        /// 璧嬬爜鏃堕棿
+        /// </summary>
+        public string dateTime { get; set; }
+        /// <summary>
+        /// 鎵规鍙�+        /// </summary>
+        public string batchNo { get; set; }
+        /// <summary>
+        /// 鏍囧噯鎵樿
+        /// </summary>
+        public string trayRule { get; set; }
+        /// <summary>
+        /// 鐗╂枡灞傛暟
+        /// </summary>
+        public string itemLayer { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/LocCntrRel.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/LocCntrRel.cs
index 17055cf..9b9b01f 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/models/LocCntrRel.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/LocCntrRel.cs
@@ -19,6 +19,10 @@
         public string S_STATE_PRE { get; set; }
         public int N_REVIEW_RESULT { get; set; }
         public int N_BIND_ORDER { get; set; }
+        /// <summary>
+        /// 托盘来源
+        /// </summary>
+        public string S_SRC { get; set; }
 
         [SugarColumn(IsIgnore = true)]
         [Navigate(NavigateType.OneToMany, nameof(S_CNTR_CODE))]
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/Location.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/Location.cs
index 339c769..1ca5cfc 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/models/Location.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/Location.cs
@@ -25,6 +25,7 @@
         public int N_AGV_SITE_LAYER { get; set; }
         public int N_ROADWAY { get; set; }
         public int N_ROW { get; set; }
+        public string S_ROW { get; set; }
         public int N_COL { get; set; }
         public int N_LAYER { get; set; }
         public string S_TYPE { get; set; }
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/RowComparsionTable.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/RowComparsionTable.cs
new file mode 100644
index 0000000..c475366
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/RowComparsionTable.cs
@@ -0,0 +1,19 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_RowComparsionTable")]
+    public class RowComparsionTable : BaseModel
+    {
+        /// <summary>
+        /// 鏋楄姖鎺掑彿
+        /// </summary>
+        public string S_LJ_ROW { get; set; }
+        /// <summary>
+        /// 瀵屽嫆鎺掑彿
+        /// </summary>
+        public string S_FL_ROW { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/RowLock.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/RowLock.cs
new file mode 100644
index 0000000..9e0d653
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/RowLock.cs
@@ -0,0 +1,39 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_RowLock")]
+    public class RowLock : BaseModel
+    {
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 鎺掑彿
+        /// </summary>
+        public string S_ROW { get; set; }
+        /// <summary>
+        /// 閿佸畾鐘舵�--榛樿锛氭棤
+        /// </summary>
+        public string S_LOCK_STATE { get; set; }
+        /// <summary>
+        /// 宸ヤ綔妯″紡
+        /// </summary>
+        public string S_WORK_MODE { get; set; }
+        /// <summary>
+        /// 閿佹潵婧�+        /// </summary>
+        public string S_LOCK_SRC { get; set; }
+        /// <summary>
+        /// 閿佸畾鏃堕棿
+        /// </summary>
+        public DateTime T_LOCK_TIME { get; set; }
+        /// <summary>
+        /// 瑙i攣鏃堕棿
+        /// </summary>
+        public DateTime T_UNLOCK_TIME { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/SegmentTable.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/SegmentTable.cs
new file mode 100644
index 0000000..1fe66a4
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/SegmentTable.cs
@@ -0,0 +1,39 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_SegmentTable")]
+    public class SegmentTable : BaseModel
+    {
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 鎺掑彿
+        /// </summary>
+        public string N_ROW { get; set; }
+        /// <summary>
+        /// 绾挎璧风偣鍒�+        /// </summary>
+        public int S_START_COL { get; set; }
+        /// <summary>
+        /// 绾挎缁堢偣鍒�+        /// </summary>
+        public int S_END_COL { get; set; }
+        /// <summary>
+        /// 涓�眰绔欑偣
+        /// </summary>
+        public string S_First_Bit { get; set; }
+        /// <summary>
+        /// 浜屽眰绔欑偣
+        /// </summary>
+        public string S_Second_Bit { get; set; }
+        /// <summary>
+        /// 鎵樼洏绫诲瀷
+        /// </summary>
+        public string board { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/TN_Lock.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/TN_Lock.cs
index 0492695..8efe4a5 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/models/TN_Lock.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/TN_Lock.cs
@@ -9,7 +9,6 @@
     public  class TN_Lock : BaseModel
     {
       
-        
         public int N_OBJ_TYPE { get; set; }
         public string S_OBJ_CODE { get; set; }
         public int N_TYPE { get; set; }
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/WCSTask.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/WCSTask.cs
index d9f0df4..1e3d96b 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/models/WCSTask.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/WCSTask.cs
@@ -25,6 +25,12 @@
         /// 0绛夊緟	1宸叉帹閫�    2鎵ц    3瀹屾垚    4閿欒
         /// </summary>
         public int N_B_STATE { get; set; }
+        public string S_TRAY_TYPE { get; set; }
+        /// <summary>
+        /// 宸ュ崟鍙�+        /// </summary>
+        public string S_WORK_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
         public string S_START_WH { get; set; }
         public string S_END_WH { get; set; }
         public string S_START_SITE { get; set; }
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/WMSTask.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/WMSTask.cs
index 5778f1b..6475bc6 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/models/WMSTask.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/WMSTask.cs
@@ -28,6 +28,9 @@
         /// 1入库 2出库
         /// </summary>
         public int N_TYPE { get; set; }
+        public string S_TRAY_TYPE { get; set; }
+        public string S_WORK_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
         public string S_OP_DEF_NAME { get; set; }
         /// <summary>
         /// 应该根据货位查找仓库对应的工厂
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/YiKuWorkOrder.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/YiKuWorkOrder.cs
new file mode 100644
index 0000000..fd032e8
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/YiKuWorkOrder.cs
@@ -0,0 +1,39 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_YiKuWorkOrder")]
+    public class YiKuWorkOrder : BaseModel
+    {
+        /// <summary>
+        /// 宸ュ崟鍙�+        /// </summary>
+        public string S_WorkNo { get; set; }
+        /// <summary>
+        /// 宸ュ崟绫诲瀷
+        /// </summary>
+        public string S_ORDER_TYPE { get; set; }
+        /// <summary>
+        /// 宸ュ崟鐘舵�
+        /// </summary>
+        public string S_WorkState { get; set; }
+        /// <summary>
+        /// 鐗╂枡灞傛暟
+        /// </summary>
+        public string S_ItemLayer { get; set; }
+        /// <summary>
+        /// 璧风偣搴撲綅
+        /// </summary>
+        public string S_StartLoca { get; set; }
+        /// <summary>
+        /// 缁堢偣搴撲綅
+        /// </summary>
+        public string S_EndLoca { get; set; }
+        /// <summary>
+        /// 绉诲簱鏁伴噺
+        /// </summary>
+        public int S_YiKuNum { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/models/itemPrecedenceLine.cs b/HH.WCS.Mobox3.NongFuLinZhi/models/itemPrecedenceLine.cs
new file mode 100644
index 0000000..24bdb75
--- /dev/null
+++ b/HH.WCS.Mobox3.NongFuLinZhi/models/itemPrecedenceLine.cs
@@ -0,0 +1,31 @@
+锘縰sing HH.WCS.Mobox3.NFLZ.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.Mobox3.NFLZ
+{
+    [SugarTable("TN_itemPrecedenceLine")]
+    public class itemPrecedenceLine : BaseModel
+    {
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+        /// <summary>
+        /// 浼樺厛绾�+        /// </summary>
+        public int S_PRIORITY { get; set; }
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 鏍堟澘绫诲瀷
+        /// </summary>
+        public string S_TRAY_TYPE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/process/DeviceProcess.cs b/HH.WCS.Mobox3.NongFuLinZhi/process/DeviceProcess.cs
index dba413b..95a01fb 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/process/DeviceProcess.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/process/DeviceProcess.cs
@@ -2,6 +2,7 @@
 using HH.WCS.Mobox3.NFLZ.dispatch;
 using HH.WCS.Mobox3.NFLZ.util;
 using HH.WCS.Mobox3.NFLZ.wms;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -50,12 +51,442 @@
         private static void LinZhiAnalysisDeviceChange(string data, Settings.deviceInfo plc)
         {
             if (plc.deviceType == 1) AnalysisDoor(data, plc);//鑷姩闂ㄥ鐞�-            //if (plc.deviceType == 2) LinJiangAnalysisProductLine(data, plc);//杈撻�绾垮鐞�-- 鎴愬搧涓嬬嚎
-            //if (plc.deviceType == 3) LinJiangAnalysisProductLine(data, plc);//杈撻�绾垮鐞�-- 绌烘墭涓婄嚎
+            if (plc.deviceType == 2) LinZhiAnalysisProductLine(data, plc);//杈撻�绾垮鐞�-- 鎴愬搧涓嬬嚎
+            if (plc.deviceType == 3) LinZhiAnalysisProductLine(data, plc);//杈撻�绾垮鐞�-- 绌烘墭涓婄嚎
             if (plc.deviceType == 4) LinZhiAnalysisPreform(data, plc);//鐡跺澂鏈�             if (plc.deviceType == 5) LinZhiAnalysisPGDump(data, plc);//鐡剁洊缈绘枟鏈�             if (plc.deviceType == 6) LinZhiAnalysisPPDump(data, plc);//鐡跺澂缈绘枟鏈�         }
+
+
+
+        private static void LinZhiAnalysisProductLine(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"{plc.deviceName}-{plc.address}-{data}", "杈撻�绾�);
+
+            if (LineState.Keys.Contains(plc.TN_Location[0]))
+            {
+                LineState[plc.TN_Location[0]].status = data;
+                LineState[plc.TN_Location[0]].modify = DateTime.Now;
+            }
+            else
+            {
+                LineState.Add(plc.TN_Location[0], new statemodel { status = data, modify = DateTime.Now });
+            }
+
+            //鐘舵�1	婊℃墭涓嬬嚎鎴栫┖鎵樹笂绾匡紝鍏蜂綋浠诲姟绫诲瀷闇�鏍规嵁TCP娑堟伅浣嶆暟鍒ゆ柇 11-婊℃墭涓嬬嚎  21-绌烘墭涓婄嚎
+            //婊℃墭涓嬬嚎锛氶渶瑕佹牴鎹墿鏂欙紝鍝佺浉锛屾壒娆″叆搴�      绌烘墭涓婄嚎锛氱┖鎵樻槸鍚﹀崟鐙瓨鍦ㄧ┖鎵樺簱鍖猴紝寰呯‘瀹�+            //涓嶅悓浜х嚎涓嬬嚎搴撳尯涓嶅悓锛岄儴鍒嗕骇绾夸笅绾垮簱鍖虹浉鍚岋紝浣嗘湁鍏堝悗椤哄簭
+            //涓嬬嚎搴撳尯鍏堝悗椤哄簭锛氬叆搴撳尯鍩熼『搴忥細3-6-2-5-4-1
+            //B1~B6  鍙屾墭涓嬬嚎--鍙兘瀛樺湪灏炬墭涓哄崟鎵樼殑鎯呭喌--灏炬墭(鍗曟墭)浜哄伐PDA涓嬪彂(鍏ラ浂澶村簱)----婊℃墭涓嬬嚎
+            //B1~B5  鍗曟墭涓婄嚎   B6  鍙屾墭涓婄嚎------------------------------------------------绌烘墭涓婄嚎
+            if (data.Length == 4)
+            {
+                if (data.Substring(0, 4) == "1220")
+                {
+                    //婊℃墭涓嬬嚎
+                    ConveryInfoFull(plc, plc.TN_Location[0]);
+                }
+                if (data.Substring(0, 4) == "1021")
+                {
+                    //绌烘墭涓婄嚎
+                    ConveryInfoEmpty(plc, plc.TN_Location[0]);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 杈撻�绾跨┖鎵樹笂绾�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        private static void ConveryInfoEmpty(Settings.deviceInfo plc, string location)
+        {
+            //try
+            //{
+            //    if (location != "")
+            //    {
+            //        if (LocationHelper.CheckLocFree(location))
+            //        {
+            //            var db = new SqlHelper<object>().GetInstance();
+            //            bool flag = true;
+            //            var cgInfo = db.Queryable<CGTTable>().Where(a => a.Bit == location).First();
+            //            if (cgInfo != null)
+            //            {
+            //                if (cgInfo.time.AddSeconds(5) > DateTime.Now)
+            //                {
+            //                    flag = false;
+            //                }
+            //
+            //            }
+            //            if (flag)
+            //            {
+            //                LogHelper.Info($"杈撻�绾匡細{plc.deviceName}, {location}琛ョ┖淇″彿 鏌ヨ宸ュ崟", "杈撻�绾�);
+            //                var workorder = WCSHelper.GetLinZhiWorkOrder(plc.deviceName);
+            //                if (workorder != null && workorder.S_WorkState.Trim() == "鎵ц涓�)
+            //                {
+            //                    LogHelper.Info($"杈撻�绾匡細{plc.deviceName}, {location}涓嬬嚎淇″彿 鎵惧埌宸ュ崟", "杈撻�绾�);
+            //                    ProductLineempty(plc, location, workorder);
+            //                }
+            //                else
+            //                {
+            //                    LogHelper.Info($"杈撻�绾匡細{plc.deviceName} ,{location}涓嬬嚎淇″彿 鏈壘鍒板伐鍗�, "杈撻�绾�);
+            //                }
+            //            }
+            //        }
+            //        else
+            //        {
+            //            LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂绌烘墭涓婄嚎", "杈撻�绾�);
+            //        }
+            //    }
+            //}
+            //catch (Exception ex)
+            //{
+            //    Console.WriteLine($"杈撻�绾垮懠鍙┖鎵樺紓甯� 寮傚父淇℃伅={ex.Message}");
+            //}
+        }
+
+        /// <summary>
+        /// 杈撻�绾挎弧鎵樹笅绾�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        private static bool ConveryInfoFull(Settings.deviceInfo plc, string location)
+        {
+            var result = false;
+            try
+            {
+                if (location != "")
+                {
+                    //鍙栨弧锛岄渶瑕佹牴鎹伐鍗曚互鍙婁骇绾夸俊鎭紝鍒ゆ柇褰撳墠浜х嚎搴旇涓嬪彂鍒板摢涓簱鍖猴紝浠ュ強鏄粈涔堟墭鐩樼被鍨嬩笅绾�+                    if (LocationHelper.CheckLocFree(location))
+                    {
+                        var db = new SqlHelper<object>().GetInstance();
+                        LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "杈撻�绾�);
+                        //1.鏌ヨ褰撳墠浜х嚎宸ュ崟淇℃伅
+                        var workOrder = WCSHelper.GetLinZhiWorkOrder(plc.deviceName);
+                        if (workOrder != null)
+                        {
+                            //workOrder.S_BatchNo = DateTime.Now.ToString("yyyy-MM-dd");
+                            //db.Updateable(workOrder).UpdateColumns(a => new { a.S_BatchNo }).ExecuteCommand();
+                            //
+                            //workOrder = WCSHelper.GetLinJiangWorkOrder(plc.deviceName);
+                            string DeviceStartTime = DateTime.Now.ToString();//褰撳墠璁惧绗竴娆℃敹鍒颁笅绾夸俊鍙锋椂闂�+                            string TrayCode = "";//鎵樼洏缂栫爜--澶氫釜缂栫爜鐢�鑻辨枃閫楀彿闅斿紑
+                            string BatchNo = string.IsNullOrEmpty(workOrder.S_BatchNo) ? "" : workOrder.S_BatchNo.Trim();//鎵规鍙�+                            string ItemLayer = string.IsNullOrEmpty(workOrder.S_ItemLayer) ? "" : workOrder.S_ItemLayer.Trim();//鐗╂枡灞傛暟
+                            string ItemTrayType = workOrder.S_TrayType;//璐х墿澶у皬鏉�-澶ф澘銆佸皬鏉裤�闆嗗寲鏉�鎵樼洏绫诲瀷闇�鍙樺姩)
+                            string StartBit = plc.TN_Location[0];
+                            string workNo = "";
+                            //浠ヤ笅涓変釜瀛楁鏆傛湭浣跨敤
+                            //string EndBit = "";
+                            //string StartLayer = "1";//鐢熶骇涓嬬嚎-璧风偣灞傛暟榛樿涓�
+                            //string EndLayer = "";
+
+                            //浜х嚎涓嬬嚎娴佺▼----姝e父娴佺▼涓嬬嚎
+                            if (workOrder.S_ORDER_TYPE.Trim() != "鏃犵爜鍏ュ簱")
+                            {
+                                bool full = true;
+                                //鍒ゆ柇褰撳墠璐т綅鏄惁瀛樺湪鎵樼洏锛屽鏋滃瓨鍦ㄥ垯 鏃犻渶浠庢墭鐩樹俊鎭腑闂磋〃鑾峰彇
+                                var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == StartBit).ToList();
+                                if (trayInfo.Count() > 0)
+                                {
+                                    BatchNo = workOrder.S_BatchNo.Trim();
+                                    ItemLayer = workOrder.S_ItemLayer.Trim();
+                                    trayInfo.ForEach(a =>
+                                    {
+                                        TrayCode = TrayCode + a.S_CNTR_CODE + ",";
+                                        workNo = a.S_SRC;
+                                    });
+                                }
+                                else
+                                {
+                                    //2.鑾峰彇璁惧绗竴娆′笅绾挎椂闂�+                                    bool IsTime = true;
+                                    DeviceStartTime = ConveryInfoFullTwo(plc, DeviceStartTime);
+
+                                    if (IsTime)
+                                    {
+                                        //3.澶勭悊 宸ュ崟淇℃伅琛ㄦ暟鎹�-鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�+                                        full = ConveryInfoFullThree(plc, location, workOrder, DeviceStartTime, ref TrayCode, ref BatchNo, ref ItemLayer, ref workNo);
+                                    }
+                                    else full = false;
+                                }
+
+                                if (full)
+                                {
+                                    //5.姝e父浜х嚎涓嬬嚎
+                                    ProductLineFull(plc, location, workOrder, TrayCode, BatchNo, ItemLayer, ItemTrayType, StartBit, workNo);
+                                }
+                                else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭瓨鍦ㄥ紓甯革紝璇锋煡璇㈠紓甯告棩蹇楋紒", "杈撻�绾�);
+                            }
+                            //鏃犵爜鍏ュ簱娴佺▼----浜哄伐鍒涘缓宸ュ崟鏃�---宸ュ崟绫诲瀷 搴旈�鎷�鏃犵爜鍏ュ簱
+                            else
+                            {
+                                //鍒ゆ柇褰撳墠璁惧鍙f槸鍚﹀瓨鍦ㄦ墭鐩�浠诲姟鏈彇璐у畬鎴愶紝鎵樼洏杩樻槸缁戝畾鍦ㄨ澶囧彛鐨�锛屾湁娌跨敤锛屾棤鐢熸垚鏂版墭鐩�+                                var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).ToList();
+                                if (trayInfo.Count() == 0) TrayCode = Guid.NewGuid().ToString("N") + "," + Guid.NewGuid().ToString("N");
+                                else
+                                {
+                                    TrayCode = "";
+                                    trayInfo.ForEach(a => { TrayCode = TrayCode + "," + a.S_CNTR_CODE.Trim(); });
+                                }
+                                LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏃犵爜鍏ュ簱锛�, "杈撻�绾�);
+                                Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏃犵爜鍏ュ簱锛�);
+                                ProductLineFull(plc, location, workOrder, TrayCode, BatchNo, ItemLayer, workOrder.S_TrayType, StartBit, workOrder.S_WorkNo);
+                            }
+                        }
+                        else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "杈撻�绾�);
+                    }
+                    else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂婊℃墭涓嬬嚎", "杈撻�绾�);
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"杈撻�绾垮鐞嗗紓甯革細{ex.Message}", "杈撻�绾�);
+            }
+
+            return result;
+        }
+
+        private static void ProductLineFull(Settings.deviceInfo plc, string location, LinZhiWorkOrder workOrder, string TrayCode, string BatchNo, string ItemLayer, string ItemTrayType, string StartBit, string workNo = "", bool ProType = true)
+        {
+            //5.鏍规嵁閰嶇疆鏂囦欢鑾峰彇褰撳墠浜х嚎浼樺厛涓嬪彂搴撳尯锛屽啀杩炲悓鐗╂枡銆佸ぇ灏忔澘銆佹壒娆★紝鑾峰彇姝ゅ簱鍖�鍙敤璐т綅
+            //      閬嶅巻搴撳尯鏌ヨ-鍒ゆ柇鎺掗攣-琛ㄥ悕锛�RowLock 
+            var creResult = false;
+            LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 鏌ヨ鍏ュ簱缁堢偣璐т綅", "杈撻�绾�);
+            ////Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 鏌ヨ鍏ュ簱缁堢偣璐т綅");
+            //string ItemNameLayer = workOrder.S_ItemCode.Trim() + workOrder.S_ItemLayer.Trim();
+            //var PriProLineInfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.ItemTrayType == "婊� && a.ItemName == workOrder.S_ItemCode.Trim()).FirstOrDefault();
+            var db = new SqlHelper<object>().GetInstance();
+            LogHelper.Info($"itemtrayType锛歿ItemTrayType}");
+            var ipl = db.Queryable<itemPrecedenceLine>().Where(a => a.S_ITEM_CODE == workOrder.S_ItemCode.Trim() && a.S_TRAY_TYPE.Trim() == ItemTrayType.Trim()).OrderByDescending(a => a.S_PRIORITY).ToList();
+            if (ipl.Count() > 0)
+            {
+                if (ProType)
+                {
+                    LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 鏌ヨ鍒拌〃鏁版嵁", "杈撻�绾�);
+                    ////Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 鏌ヨ鍒伴厤缃枃浠�);
+                    for (int i = 0; i < ipl.Count(); i++)
+                    {
+                        string areaCode = ipl[i].S_AREA_CODE;
+                        if (!creResult) creResult = TaskProcess.LinZhiPlcTask(StartBit, "鎴愬搧涓嬬嚎", TrayCode, areaCode, workOrder.S_ItemCode.Trim(), BatchNo, ItemLayer, ItemTrayType, plc.deviceName, true, workNo);
+                    }
+                }
+                else
+                {
+                    for (int i = 0; i < ipl.Count(); i++)
+                    {
+                        string areaCode = ipl[i].S_AREA_CODE;
+                        if (!creResult) creResult = TaskProcess.LinZhiPlcTask(StartBit, "闆跺ご涓嬬嚎", TrayCode, areaCode, workOrder.S_ItemCode.Trim(), BatchNo, ItemLayer, ItemTrayType, plc.deviceName, true, workOrder.S_WorkNo.Trim());
+                    }
+                }
+
+                if (creResult)
+                {
+                    LogHelper.Info("缁戝畾鎵樼洏琛ㄥ拰鎵樼洏鐗╂枡琛�);
+                    //浠诲姟鍒涘缓鎴愬姛 缁戝畾璧风偣鎵樼洏琛紝鎵樼洏鐗╂枡琛�+                    TaskProcess.BindLocCntr(StartBit, TrayCode, workOrder.S_ItemCode.Trim(), BatchNo, workNo, ItemLayer);
+                }
+            }
+            else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈幏鍙栧埌褰撳墠浜х嚎鐨勪紭鍏堜笅绾垮簱鍖�itemPrecedenceLine 鏁版嵁銆傝鐗╂枡涓嶅瓨鍦細{workOrder.S_ItemCode.Trim()}", "杈撻�绾�);
+        }
+
+
+        private static bool ConveryInfoFullThree(Settings.deviceInfo plc, string location, LinZhiWorkOrder workOrder, string DeviceStartTime, ref string TrayCode, ref string BatchNo, ref string ItemLayer, ref string workNo)
+        {
+            bool result = true;
+            var db = new SqlHelper<object>().GetInstance();
+            //3.浠�瀵屽嫆鎵樼洏淇℃伅涓棿琛�鑾峰彇 dateTime < DeviceStartTime 鐨勬暟鎹�  ChunAnTrayInfo
+            //      鏈変袱鏉★細杩涘叆绗�3-1 姝�+            //      灏忎簬涓ゆ潯锛氬紓甯�杩炴帴 鎶ヨ鍣�杩涜澹板厜鎶ヨ
+            //3-1.鍒ゆ柇鎵樼洏淇℃伅涓�鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�鏄惁鏈夊�---------鏍规嵁 鎵樿 鍒ゆ柇褰撳墠鎵樼洏鏄惁涓洪浂澶�+            //      鏈夊�锛氬垽鏂綋鍓嶅�鏄惁涓�宸ュ崟淇℃伅 鐩稿悓锛屼笉鍚屼唬琛�褰撳墠浜х嚎鍒囨崲浜嗙敓浜х被鍨嬫垨棣栨涓嬬嚎锛岄渶鍚屾鏇存柊 宸ュ崟淇℃伅
+            //      鏃犲�锛氬垽鏂伐鍗曟槸鍚﹀瓨鍦ㄥ搴斿�锛屼笉瀛樺湪 鍗�寮傚父
+            if (!string.IsNullOrEmpty(DeviceStartTime))
+            {
+                var trayTableInfo = WCSHelper.GetLinZhiTrayInfoList(DeviceStartTime, plc.deviceName);
+                if (trayTableInfo != null)
+                {
+                    if (trayTableInfo.Count == 2)// || trayTableInfo.Count == 1
+                    {
+                        workNo = trayTableInfo[0].workNo;
+                        LogHelper.Info($"杈撻�绾匡細鑾峰彇褰撳墠涓嬬嚎鏃堕棿鍓嶇殑涓や釜鎵樼洏鏁版嵁锛屾寜鏃堕棿鍗囧簭銆備骇绾垮彿锛歿plc.deviceName},涓嬬嚎鏃堕棿锛歿DeviceStartTime}.", "杈撻�绾�);
+                        trayTableInfo = db.Queryable<LinZhiTrayInfo>().Where(a => Convert.ToDateTime(a.dateTime.Trim()) < Convert.ToDateTime(DeviceStartTime) && a.deviceName == plc.deviceName).OrderBy(a => a.dateTime).Take(2).ToList();
+                        LogHelper.Info($"杈撻�绾匡細鑾峰彇褰撳墠涓嬬嚎鏃堕棿鍓嶇殑涓や釜鎵樼洏鏁版嵁涓猴細{JsonConvert.SerializeObject(trayTableInfo)}銆倇plc.deviceName},涓嬬嚎鏃堕棿锛歿DeviceStartTime}.", "杈撻�绾�);
+                        string trayCode = ""; string batchNo = ""; string itemLayer = "";
+                        //1-棣栧厛鍒ゆ柇宸ュ崟 鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�涓変釜鍙傛暟鏄惁鏈夊� 
+                        //      鏈夊�锛氬垽鏂拰褰撳墠鍊兼槸鍚︾浉鍚岋紝涓嶅悓 鍗�鏇存柊   UpdateWorkInfo
+                        //      鏃犲�锛氭洿鏂板伐鍗曞搴斾俊鎭�+                        trayTableInfo.ForEach(a =>
+                        {
+                            trayCode = trayCode + "," + a.trayCode;
+                            string TrayRule = "";
+                            string UpdateWorkOn = "";//鏇存柊宸ュ崟淇℃伅寮�叧 榛樿涓虹┖ 1-闇�鏇存柊 鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�淇℃伅
+
+
+                            //鐢熶骇涓嬬嚎锛氶鎵樹笅绾�蹇呴』 浼犺緭鍏ㄩ儴淇℃伅-鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁帮紱鍚﹀垯 绗竴鎵樺氨鏃犳硶涓嬬嚎
+                            //          涔嬪悗濡傛灉缂哄皯淇℃伅锛屽彲浠ヤ粠宸ュ崟鑾峰彇
+                            //宸ュ崟鍒濆鐘舵�锛氭墭瑙勩�鎵规鍙枫�鐗╂枡灞傛暟 蹇呯劧鏈変竴涓�涓虹┖锛涘悗缁細涓�洿鏈夊�
+                            Console.WriteLine($"鏇存敼宸ュ崟鎵樼洏鏁版嵁锛氬伐鍗曞彿锛歿workOrder.S_WorkNo},鎵樿锛歿a.trayRule},鎵规鍙凤細{a.batchNo},鐗╂枡灞傛暟锛歿a.itemLayer}");
+                            if (string.IsNullOrEmpty(workOrder.S_TrayRules) || string.IsNullOrEmpty(workOrder.S_BatchNo) || string.IsNullOrEmpty(workOrder.S_ItemLayer))
+                            {
+                                WCSHelper.UpdateWorkInfo(workOrder, a.trayRule, a.batchNo, a.itemLayer);
+                                batchNo = a.batchNo; itemLayer = a.itemLayer;
+                            }
+                            //澶勭悊 褰撳墠鎵樼洏 鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�淇℃伅
+                            ConveryInfoFullThreeS(plc, location, a, workOrder, DeviceStartTime, ref batchNo, ref itemLayer, ref TrayRule, ref UpdateWorkOn);
+                            if (UpdateWorkOn == "1") WCSHelper.UpdateWorkInfo(workOrder, TrayRule, batchNo, itemLayer);
+                            //闆跺ご鐗╂枡鍒ゆ柇
+                            //if (TrayRule != a.trayNum)
+                            //{
+                            //    result = false;
+                            //    LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀敓浜т笅绾�褰撳墠鐗╂枡绠辨暟锛歿a.itemLayer}涓庢爣鍑嗘墭瑙勶細{TrayRule}涓嶇锛屾爣鍑嗘墭瑙勪俊鎭紓甯革紒", "杈撻�绾�);
+                            //    //姝e父涓嬬嚎-涓嶆槸鏁存墭涓嬬嚎  杩炴帴鎶ヨ鍣� 鎶ヨ
+                            //    Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀敓浜т笅绾�褰撳墠鐗╂枡绠辨暟锛歿a.itemLayer}涓庢爣鍑嗘墭瑙勶細{TrayRule}涓嶇锛屾爣鍑嗘墭瑙勪俊鎭紓甯革紒");
+                            //    SendErrorTcpMsg(plc, DeviceStartTime);
+                            //}
+                        });
+                        var trayAll = WCSHelper.GetLinJiangTrayInfoAllList(plc.deviceName);
+                        if (trayTableInfo.Count != trayAll.Count && trayTableInfo.Count == 1)
+                        {
+                            result = false;
+                            LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝璁板綍鎵樼洏淇℃伅涓簕trayAll.Count}鏉★紝鎵樼洏淇℃伅寮傚父锛�, "杈撻�绾�);
+                            //杩炴帴鎶ヨ鍣� 杩涜寮傚父鎶ヨ
+                            Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝璁板綍鎵樼洏淇℃伅涓簕trayAll.Count}鏉★紝鎵樼洏淇℃伅寮傚父锛�);
+                            SendErrorTcpMsg(plc, DeviceStartTime);
+                            db.Deleteable<LinZhiDeviceState>().Where(a => a.DeviceName == plc.deviceName).ExecuteCommand();
+                        }
+                        TrayCode = trayCode; BatchNo = batchNo; ItemLayer = itemLayer;
+                    }
+                    else
+                    {
+                        result = false;
+                        LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝鎵樼洏淇℃伅寮傚父锛�, "杈撻�绾�);
+                        //杩炴帴鎶ヨ鍣� 杩涜寮傚父鎶ヨ
+                        Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝鎵樼洏淇℃伅寮傚父锛�);
+                        SendErrorTcpMsg(plc, DeviceStartTime);
+                        db.Deleteable<LinZhiDeviceState>().Where(a => a.DeviceName == plc.deviceName).ExecuteCommand();
+                    }
+                }
+                else
+                {
+                    result = false;
+                    LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝鎵樼洏淇℃伅寮傚父锛�, "杈撻�绾�);
+                    SendErrorTcpMsg(plc, DeviceStartTime);
+                    db.Deleteable<LinZhiDeviceState>().Where(a => a.DeviceName == plc.deviceName).ExecuteCommand();
+
+                }
+            }
+            else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} ,DeviceStartTime 璁惧绗竴娆′笅绾挎椂闂翠负绌猴紝绋嬪簭寮傚父锛�, "杈撻�绾�);
+            return result;
+        }
+
+        /// <summary>
+        /// 杈撻�绾挎墭鐩樹俊鎭紓甯�鍚戣緭閫佺嚎鍙戦�寮傚父淇″彿
+        /// 1銆佷笅绾挎椂闂村墠鐨勬墭鐩樻暟灏忎簬2
+        /// 2銆佹墭瑙勪笉绛変簬褰撳墠鏁伴噺
+        /// </summary>
+        /// <param name="plc"></param>
+        public static void SendErrorTcpMsg(Settings.deviceInfo plc, string deviceStartTime)
+        {
+            if (DateTime.Now >= Convert.ToDateTime(deviceStartTime)) PlcHelper.SendHex(plc.address, "3F00600d0a");
+        }
+
+        private static void ConveryInfoFullThreeS(Settings.deviceInfo plc, string location, LinZhiTrayInfo a, LinZhiWorkOrder workOrder, string DeviceStartTime, ref string BatchNo, ref string ItemLayer, ref string TrayRule, ref string UpdateWorkOn)
+        {
+            if (string.IsNullOrEmpty(a.trayRule))
+            {
+                //浼犺緭缂哄皯 鏍囧噯鎵樿淇℃伅锛岄渶瑕佷粠宸ュ崟鑾峰彇
+                if (!string.IsNullOrEmpty(workOrder.S_TrayRules)) TrayRule = workOrder.S_TrayRules;
+                else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭〃鏃犳爣鍑嗘墭瑙勪俊鎭笖宸ュ崟:{workOrder.S_WorkNo}涔熸病鏈夋爣鍑嗘墭瑙勪俊鎭紝鏍囧噯鎵樿淇℃伅寮傚父锛�, "杈撻�绾�);
+            }
+            else
+            {
+                //涓�鍒囨崲浜�鐢熶骇鐗╂枡锛岄渶瑕佹洿鏂�宸ュ崟淇℃伅
+                if (workOrder.S_TrayRules != a.trayRule)
+                {
+                    TrayRule = a.trayRule;
+                    UpdateWorkOn = "1";
+                }
+                else TrayRule = a.trayRule;
+            }
+            if (string.IsNullOrEmpty(a.batchNo))
+            {
+                //浼犺緭缂哄皯 鎵规鍙蜂俊鎭紝闇�浠庡伐鍗曡幏鍙�+                if (!string.IsNullOrEmpty(workOrder.S_BatchNo)) BatchNo = workOrder.S_BatchNo;
+                else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭〃鏃犳壒娆″彿淇℃伅涓斿伐鍗�{workOrder.S_WorkNo}涔熸病鏈夋壒娆″彿淇℃伅锛屾壒娆″彿淇℃伅寮傚父锛�, "杈撻�绾�);
+            }
+            else
+            {
+                //涓�鍒囨崲浜�鐢熶骇鐗╂枡锛岄渶瑕佹洿鏂�宸ュ崟淇℃伅
+                if (workOrder.S_BatchNo != a.batchNo)
+                {
+                    BatchNo = a.batchNo;
+                    UpdateWorkOn = "1";
+                }
+                else BatchNo = a.batchNo;
+            }
+            if (string.IsNullOrEmpty(a.itemLayer))
+            {
+                //浼犺緭缂哄皯 鎵规鍙蜂俊鎭紝闇�浠庡伐鍗曡幏鍙�+                if (!string.IsNullOrEmpty(workOrder.S_ItemLayer)) ItemLayer = workOrder.S_ItemLayer;
+                else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭〃鏃犵墿鏂欏眰鏁颁俊鎭笖宸ュ崟:{workOrder.S_WorkNo}涔熸病鏈夌墿鏂欏眰鏁颁俊鎭紝鐗╂枡灞傛暟淇℃伅寮傚父锛�, "杈撻�绾�);
+            }
+            else
+            {
+                //涓�鍒囨崲浜�鐢熶骇鐗╂枡锛岄渶瑕佹洿鏂�宸ュ崟淇℃伅
+                if (workOrder.S_ItemLayer != a.itemLayer)
+                {
+                    ItemLayer = a.itemLayer;
+                    UpdateWorkOn = "1";
+                }
+                else ItemLayer = a.itemLayer;
+            }
+        }
+
+
+        private static string ConveryInfoFullTwo(Settings.deviceInfo plc, string DeviceStartTime)
+        {
+            //2.鑾峰彇褰撳墠浜х嚎 璁惧涓棿琛�瀵瑰簲淇℃伅   LinJiangDeviceState 
+            //2-1.鏈夋暟鎹紝鍒ゆ柇褰撳墠鏄惁涓虹涓�鏀跺埌涓嬬嚎淇″彿
+            //      绗竴娆★細鏇存柊 DeviceState = 1锛孌eviceStartTime = 褰撳墠鏃堕棿
+            //      绗琋娆★細鍒ゆ柇褰撳墠 DeviceState 鏄惁涓�锛屼笉涓�锛屾洿鏂�DeviceState 浠ュ強 DeviceStartTime
+            //2-2.鏃犳暟鎹紝鎻掑叆 DeviceName 锛孌eviceState = 1锛孌eviceStartTime = 褰撳墠鏃堕棿 鏁版嵁
+            //浠诲姟鍒涘缓鎴愬姛浼氬垹闄ゆ琛ㄦ暟鎹�+
+            var db = new SqlHelper<object>().GetInstance();
+            var workInfo = db.Queryable<LinZhiWorkOrder>().Where(a => a.S_PLineNo == plc.deviceName && a.S_ORDER_TYPE == "浜х嚎涓嬬嚎" && a.S_WorkState == "鎵ц涓�).First();
+            if (workInfo != null)
+            {
+                var deviceTableInfo = WCSHelper.GetLinJiangDeviceState(plc.deviceName);
+                if (deviceTableInfo != null)
+                {
+                    if (deviceTableInfo.DeviceState.Trim() != "1")
+                    {
+                        WCSHelper.UpdateLinJiangDeviceState(deviceTableInfo, "1", DeviceStartTime);
+                        //isTime = false;
+                    }
+                    else
+                    {
+                        DeviceStartTime = deviceTableInfo.DeviceTime;
+                    }
+                }
+                else
+                {
+                    DateTime dateTime = Convert.ToDateTime(DeviceStartTime).AddMinutes(1);
+                    DeviceStartTime = dateTime.ToString();
+                    WCSHelper.LinJiangInsertDeviceState(new LinZhiDeviceState
+                    {
+                        DeviceName = plc.deviceName,
+                        DeviceTime = DeviceStartTime,
+                        DeviceState = "1"
+                    });
+                }
+            }
+            return DeviceStartTime;
+        }
+
         /// <summary>
         /// 鐡跺澂缈绘枟鏈虹┖鎵樹笅绾�         /// </summary>
@@ -111,7 +542,7 @@
                     emptyTaskType = "缈绘枟鏈哄簱瀛樼┖鎵樹笅绾匡紙鐡跺澂锛�;
                 }
 
-                endArea = Settings.areaInfos.Where(a => a.areaName == "鐡跺澂缈绘枟鏈虹┖鎵� && a.enable == 1).FirstOrDefault().areaCode;
+                endArea = Settings.areaInfos.Where(a => a.areaName == "鐡跺澂绌烘墭" && a.enable == 1).FirstOrDefault().areaCode;
 
                 if (data.Length == 6)
                 {
@@ -138,8 +569,8 @@
                                 //鍒ゆ柇褰撳墠缈绘枟鏈烘槸鍚︽湁閫佽繃婊℃墭 S_NOTE 瀛楁榛樿绌哄瓧绗︿覆锛屾弧鎵樺嵏璐у畬鎴愪箣鍚庝細鏍囪涓烘弧鎵橈紝绌烘墭鍙栬揣瀹屾垚澶嶄綅涓虹┖瀛楃涓�                                 Location startLoca = null;
                                 var locCode = plc.TN_Location[0];
-                                var plcLoca = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).ToList();
-                                if (plcLoca.Count <= 0)
+                                var plcLoca = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).First();
+                                if (plcLoca == null)
                                 {
                                     LogHelper.Info($"鐡跺澂缈绘枟鏈轰笂鏃犳墭鐩橈紝鐢熸垚婊℃墭涓婄嚎浠诲姟锛岀摱鍧炕鏂楁満鐐逛綅锛歿plc.TN_Location[0]}");
                                     //鍒濆鐘舵�锛屾棤鎵樼洏锛岀洿鎺ヤ笂婊℃墭(闈炲嵆浜у嵆鐢ㄩ渶瑕佹牎楠�濂楄瀹屾垚锛屽嵆浜у嵆鐢ㄧ洿鎺ヤ娇鐢�
@@ -150,7 +581,7 @@
                                         if (startLoca == null)
                                         {
                                             LogHelper.Info($"鐡跺澂鍗充骇鍗崇敤A搴撳尯鏈壘鍒版弧鎵橈紝鍘荤摱鍧嵆浜у嵆鐢˙搴撳尯鏌ユ壘");
-                                            startLoca = TaskProcess.BCPInOrOut(db, true, "鐡跺澂鍗充骇鍗崇敤B", workInfo.S_ItemCode);
+                                            startLoca = TaskProcess.BCPInOrOut(db, false, "鐡跺澂鍗充骇鍗崇敤B", workInfo.S_ItemCode);
                                         }
                                     }
                                     else
@@ -169,7 +600,7 @@
                                     LogHelper.Info($"鐡跺澂缈绘枟鏈轰笂鏈夌┖鎵樼洏锛岀敓鎴愮┖鎵樹笅绾夸换鍔★紝鐡跺澂缈绘枟鏈虹偣浣嶏細{plc.TN_Location[0]}");
 
                                     //鍒涘缓浣滀笟
-                                    WMSHelper.CreateOpTask(locCode, "", "鍏ュ簱", emptyTaskType, plcLoca[0].S_CNTR_CODE);
+                                    WMSHelper.CreateOpTask(locCode, "", "鍏ュ簱", emptyTaskType, plcLoca.S_CNTR_CODE);
                                 }
                             }
                         }
@@ -226,8 +657,7 @@
                 fullTaskType = "缈绘枟鏈哄簱瀛樻弧鎵樹笂绾匡紙鐡剁洊锛�;
                 emptyTaskType = "缈绘枟鏈哄簱瀛樼┖鎵樹笅绾匡紙鐡剁洊锛�;
 
-                endArea = Settings.areaInfos.Where(a => a.areaCode == "鐡剁洊绌烘墭" && a.enable == 1).FirstOrDefault().areaCode;
-
+                endArea = Settings.areaInfos.Where(a => a.areaName == "鐡剁洊绌烘墭" && a.enable == 1).FirstOrDefault().areaCode;
                 if (data.Length == 6)
                 {
                     if (data.Substring(0, 2) == "11")
@@ -235,7 +665,6 @@
                         if (LocationHelper.CheckLocFree(plc.TN_Location[0]))
                         {
                             var bit = plc.TN_Location[0];
-
                             bool flag = true;
                             var cgInfo = db.Queryable<CGTTable>().Where(a => a.Bit == bit).First();
                             if (cgInfo != null)
@@ -251,8 +680,8 @@
                                 Location startLoca = null;
 
                                 var locCode = plc.TN_Location[0];
-                                var plcLoca = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).ToList();
-                                if (plcLoca.Count <= 0)
+                                var plcLoca = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).First();
+                                if (plcLoca == null)
                                 {
                                     LogHelper.Info($"鐡剁洊缈绘枟鏈轰笂鏃犳墭鐩橈紝鐢熸垚婊℃墭涓婄嚎浠诲姟锛岀摱鐩栫炕鏂楁満鐐逛綅锛歿plc.TN_Location[0]}");
                                     //鍒濆鐘舵�锛屾棤鎵樼洏锛岀洿鎺ヤ笂婊℃墭(闈炲嵆浜у嵆鐢ㄩ渶瑕佹牎楠�濂楄瀹屾垚锛屽嵆浜у嵆鐢ㄧ洿鎺ヤ娇鐢�
@@ -268,7 +697,7 @@
                                 {
                                     LogHelper.Info($"鐡剁洊缈绘枟鏈轰笂鏈夌┖鎵樼洏锛岀敓鎴愮┖鎵樹笅绾夸换鍔★紝鐡剁洊缈绘枟鏈虹偣浣嶏細{plc.TN_Location[0]}");
                                     //鍒涘缓浣滀笟
-                                    WMSHelper.CreateOpTask(plc.TN_Location[0],"", "鍏ュ簱", emptyTaskType, startLoca.LocCntrRel.S_CNTR_CODE);
+                                    WMSHelper.CreateOpTask(plc.TN_Location[0],"", "鍏ュ簱", emptyTaskType, plcLoca.S_CNTR_CODE);
                                 }
                             }
                         }
@@ -306,6 +735,10 @@
                     }
                 }
             }
+            else
+            {
+                LogHelper.Info($"涓烘煡璇㈠埌鍙兘婊℃墭锛屽簱鍖虹紪鐮侊細{startArea}");
+            }
             return result;
         }
 
@@ -319,6 +752,21 @@
         {
             LogHelper.Info($"{plc.deviceName}-{plc.address}-{data}", "鐡跺澂鏈�);
             var db = new SqlHelper<object>().GetInstance();
+
+            LogHelper.Info($"鐡跺澂鏈猴紝鏌ヨ浠诲姟缁堢偣锛歿plc.TN_Location[0]}");
+            if (LineState.Keys.Contains(plc.TN_Location[0]))
+            {
+                LogHelper.Info("鐡跺澂鏈哄寘鍚浠诲姟缁堢偣");
+                LineState[plc.TN_Location[0]].status = data;
+                LineState[plc.TN_Location[0]].modify = DateTime.Now;
+            }
+            else
+            {
+                LogHelper.Info("鐡跺澂鏈烘湭鍖呭惈璇ヤ换鍔$粓鐐�);
+                LineState.Add(plc.TN_Location[0], new statemodel { status = data, modify = DateTime.Now });
+            }
+
+
             var workInfo = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo == plc.deviceName).First();
             if (workInfo != null && workInfo.S_WorkState == "鎵ц涓�)
             {
@@ -336,7 +784,6 @@
                     taskType = "娉ㄥ搴撳瓨婊℃墭涓嬬嚎锛堢摱鍧級";
                 }
                 //endArea = Settings.GetLinJiangBCPAreaList().Where(a => a.AreaName == "鐡跺澂婊℃墭" && a.Enable == "1").FirstOrDefault().AreaNo;
-
                 if (data.Length == 4)
                 {
                     if (data == "1122") LinZhialysisBottleCapAndPreformTwo(plc, db, workInfo, endArea, taskType, plc.TN_Location[0], "鐡跺澂鏈�);
@@ -395,32 +842,31 @@
                             }
                             
                             Location startLoca = TaskProcess.getMStartLoc(db);
-                            //鍒涘缓浣滀笟
-                            WMSHelper.CreateOpTask(startLoca.S_CODE, deviceBit, "鍑哄簱", taskType, startLoca.LocCntrRel.S_CNTR_CODE);
+                            if (startLoca != null)
+                            {
+                                //鍒涘缓浣滀笟
+                                WMSHelper.CreateOpTask(startLoca.S_CODE, deviceBit, "鍑哄簱", taskType, startLoca.LocCntrRel.S_CNTR_CODE);
+                            }
+                            else
+                            {
+                                LogHelper.Info("鏈煡璇㈠埌鍙嚭绌烘墭");
+                            }
+                            
                         }
                         else
                         {
-                            LogHelper.Info($"{type}娉ㄥ鏈轰笂鏈粦瀹氭墭鐩�鑷姩缁戝畾鎵樼洏");
                             string cntrCode = Guid.NewGuid().ToString("N");
                             var cntrInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == deviceBit).First();
                             if(cntrInfo == null)
                             {
-                                LocCntrRel cntr = new LocCntrRel
-                                {
-                                    S_LOC_CODE = deviceBit,
-                                    S_CNTR_CODE = cntrCode,
-                                };
-                                if (db.Insertable(cntr).ExecuteCommand() > 0)
-                                {
-                                    locInfo.N_CURRENT_NUM = locInfo.N_CURRENT_NUM + 1;
-                                    db.Updateable(locInfo).UpdateColumns(a => a.N_CURRENT_NUM).ExecuteCommand();
-                                    LogHelper.Info($"璧风偣鎴愬姛缁戝畾鎵樼洏锛岃捣鐐癸細{deviceBit}锛屾墭鐩樺彿锛歿cntrCode}");
-                                    
-                                }
+                                LogHelper.Info($"{type}娉ㄥ鏈轰笂鏈粦瀹氭墭鐩�鑷姩缁戝畾鎵樼洏");
+
+                                TaskProcess.BindLocCntr(deviceBit, cntrCode, workInfo.S_ItemCode, "");
                             }
                             else
                             {
                                 cntrCode = cntrInfo.S_CNTR_CODE;
+                                TaskProcess.BindCntrItem(deviceBit, cntrCode, workInfo.S_ItemCode, "");
                             }
                             //鍒涘缓浣滀笟
                             WMSHelper.CreateOpTask(deviceBit, "", "鍏ュ簱", taskType, cntrCode);
@@ -482,7 +928,7 @@
                 if (mst.S_TYPE.Contains("缈绘枟鏈�))
                 {
                     LogHelper.Info($"鏌ヨ缈绘枟鏈哄厑璁稿彇绌轰俊鍙�鍏佽鍙栫┖淇″彿={LineState[mst.S_START_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
-                    if (LineState[mst.S_START_LOC.Trim()].status == "112100" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)
+                    if ((LineState[mst.S_START_LOC.Trim()].status == "112100" || LineState[mst.S_START_LOC.Trim()].status == "112200") && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)
                     {
                         NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1101, 18);
                         TaskProcess.sendSing(mst, 1101);
@@ -491,11 +937,23 @@
                 else
                 {
                     LogHelper.Info($"鏌ヨ杈撻�绾垮厑璁稿彇婊′俊鍙�鍏佽鍙栨弧淇″彿={LineState[mst.S_START_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
-                    if (LineState[mst.S_START_LOC.Trim()].status == "1220" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)
+                    if (mst.S_TYPE.Contains("婊℃墭涓嬬嚎"))
                     {
-                        NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1101, 18);
-                        TaskProcess.sendSing(mst, 1101);
+                        if ((LineState[mst.S_START_LOC.Trim()].status == "1122" || LineState[mst.S_START_LOC.Trim()].status == "1221") && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)
+                        {
+                            NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1101, 18);
+                            TaskProcess.sendSing(mst, 1101);
+                        }
                     }
+                    else
+                    {
+                        if (LineState[mst.S_START_LOC.Trim()].status == "1220" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)
+                        {
+                            NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1101, 18);
+                            TaskProcess.sendSing(mst, 1101);
+                        }
+                    }
+                    
                 }
             }
             else LogHelper.Info($"瀛楀吀涓湭鎵惧埌璇ey鐨勬暟鎹紝key锛歿mst.S_START_LOC}");
@@ -512,7 +970,7 @@
                     if (mst.S_TYPE.Contains("缈绘枟鏈�))
                     {
                         LogHelper.Info($"鏌ヨ缈绘枟鏈哄厑璁镐笂婊′俊鍙�鍏佽涓婃弧淇″彿={LineState[mst.S_END_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
-                        if (LineState[mst.S_END_LOC.Trim()].status == "112100" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)
+                        if ((LineState[mst.S_END_LOC.Trim()].status == "112100" || LineState[mst.S_END_LOC.Trim()].status == "112200") && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)
                         {
                             NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1103, 18);
                             TaskProcess.sendSing(mst, 1103);
@@ -521,11 +979,23 @@
                     else
                     {
                         LogHelper.Info($"鏌ヨ杈撻�绾垮厑璁歌ˉ绌轰俊鍙�鍏佽琛ョ┖淇″彿={LineState[mst.S_END_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
-                        if (LineState[mst.S_END_LOC.Trim()].status == "1021" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)
+                        if (mst.S_TYPE.Contains("绌烘墭涓婄嚎"))
                         {
-                            NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1103, 18);
-                            TaskProcess.sendSing(mst, 1103);
+                            if ((LineState[mst.S_END_LOC.Trim()].status == "1122" || LineState[mst.S_END_LOC.Trim()].status == "1221") && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)
+                            {
+                                NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1103, 18);
+                                TaskProcess.sendSing(mst, 1103);
+                            }
                         }
+                        else
+                        {
+                            if (LineState[mst.S_END_LOC.Trim()].status == "1021" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)
+                            {
+                                NDCHelper.ChangeParam(mst.S_CODE.Trim(), 1103, 18);
+                                TaskProcess.sendSing(mst, 1103);
+                            }
+                        }
+                        
                     }
                 }
                 else LogHelper.Info($"瀛楀吀涓湭鍖呭惈缁堢偣鐨勫叧閿瓧锛岀粓鐐硅揣浣嶏細{mst.S_END_LOC}");
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");
+                }
+            }
+        }
     }
 }
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/util/Settings.cs b/HH.WCS.Mobox3.NongFuLinZhi/util/Settings.cs
index 7ddc9dc..193c667 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/util/Settings.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/util/Settings.cs
@@ -28,6 +28,7 @@
         public static int port { get; set; }
         public static string WHCode { get; set; }
         public static string FacCode { get; set; }
+        public static int tcpPort { get; set; }
 
         public static void Init()
         {
@@ -83,6 +84,10 @@
                             {
                                 FacCode = keyValue.Value.ToString();
                             }
+                            if (keyValue.Name == "TcpPort")
+                            {
+                                tcpPort = int.Parse(keyValue.Value.ToString());
+                            }
                             if (keyValue.Name == "ApiPort")
                             {
                                 port = int.Parse(keyValue.Value.ToString());
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/wms/WCSHelper.cs b/HH.WCS.Mobox3.NongFuLinZhi/wms/WCSHelper.cs
index 668cb09..6b83aef 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/wms/WCSHelper.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/wms/WCSHelper.cs
@@ -1,4 +1,5 @@
 锘縰sing HH.WCS.Mobox3.NFLZ.util;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -13,11 +14,16 @@
             var date = DateTime.Now.ToString("yyMMdd");
             return $"TN{date}{id.ToString().PadLeft(4, '0')}";
         }
-        internal static bool UpdateStatus(WCSTask task, string status) {
+        internal static bool UpdateStatus(WCSTask task, string status, string S_AGV_NO = "") {
+            Console.WriteLine("寮�鍙栬揣");
             var res = false;
             var db = new SqlHelper<WCSTask>().GetInstance();
             task.S_B_STATE = status;
-            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE,it.N_B_STATE }).ExecuteCommand();
+            if (S_AGV_NO != "")
+            {
+                task.S_EQ_NO = S_AGV_NO;
+            }
+            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE,it.N_B_STATE,it.S_EQ_NO }).ExecuteCommand();
             return res;
         }
         internal static bool UpdatePrioryty(WCSTask task,int Prioryty) {
@@ -117,7 +123,7 @@
         }
         internal static bool CheckActionRecordExist(string no, int code) {
             var db = new SqlHelper<TaskAction>().GetInstance();
-            return db.Queryable<TaskAction>().Count(a => a.S_TASK_CODE == no&& a.N_ACTION_CODE == code) > 0;
+            return db.Queryable<TaskAction>().Count(a => a.S_TASK_CODE == no && a.N_ACTION_CODE == code) > 0;
         }
         internal static void Begin(WCSTask task) {
             var db = new SqlHelper<WCSTask>().GetInstance();
@@ -206,5 +212,115 @@
         {
             //var order1 = new SqlHelper<OI_SYS_MAXID>().CreateTable();
         }
+
+        #region 鏋楄姖WCS涓氬姟澶勭悊
+        /// <summary>
+        /// 鏋楄姖-鏌ヨ宸ュ崟淇℃伅--鎵ц涓垨鑰呮殏鍋�+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static LinZhiWorkOrder GetLinZhiWorkOrder(string lineNo)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var order = db.Queryable<LinZhiWorkOrder>().Where(a => a.S_PLineNo == lineNo && a.S_WorkState == "鎵ц涓�).First();
+            //var order = new SqlHelper<LinJiangWorkOrder>().Get(a => a.S_PLineNo == lineNo && (a.S_WorkState == "鎵ц涓�), a => a.T_CREATE, true);
+            return order;
+        }
+
+        internal List<YiKuWorkOrder> GetLinJianglysisOrderWork(string orderType)
+        {
+            var order = new SqlHelper<YiKuWorkOrder>().GetList(a => a.S_ORDER_TYPE == orderType && a.S_WorkState == "鎵ц涓�);
+            return order;
+        }
+
+        internal static void CreateLinJiangMiddleTableTest()
+        {
+            var order4 = new SqlHelper<OI_SYS_MAXID>().CreateTable();//HTTP鎺ュ彛璋冪敤澶辫触閲嶅彂涓棿琛�+        }
+
+        /// <summary>
+        /// 鏋楄姖-鏌ヨ褰撳墠璁惧淇℃伅
+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static LinZhiDeviceState GetLinJiangDeviceState(string deviceName)
+        {
+            var order = new SqlHelper<LinZhiDeviceState>().Get(a => a.DeviceName == deviceName, a => a.DeviceTime, true);
+            return order;
+        }
+
+        internal static bool UpdateLinJiangDeviceState(LinZhiDeviceState deviceInfo, string status, string dateTime, string extData = "")
+        {
+            var res = false;
+            var db = new SqlHelper<LinZhiDeviceState>().GetInstance();
+            deviceInfo.DeviceState = status;
+            deviceInfo.DeviceTime = dateTime;
+            db.Updateable(deviceInfo).UpdateColumns(it => new { it.DeviceState, it.DeviceTime }).ExecuteCommand();
+            return res;
+        }
+
+        /// <summary>
+        /// 鏋楄姖-鎻掑叆璁惧淇℃伅
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        /// <returns></returns>
+        internal static bool LinJiangInsertDeviceState(LinZhiDeviceState deviceState)
+        {
+            var db = new SqlHelper<LinZhiDeviceState>().GetInstance();
+            return db.Insertable(deviceState).ExecuteCommand() > 0;
+        }
+
+        /// <summary>
+        /// 鏋楄姖-鏌ヨ鎵樼洏淇℃伅-涓嬬嚎鏃堕棿涔嬪墠鐨勬暟鎹�+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static List<LinZhiTrayInfo> GetLinZhiTrayInfoList(string dateTime, string deviceName)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var order = new SqlHelper<LinZhiTrayInfo>().GetList(a => Convert.ToDateTime(a.dateTime.Trim()) < Convert.ToDateTime(dateTime) && a.deviceName == deviceName);
+
+            var trayInfo = new SqlHelper<LinZhiTrayInfo>().GetInstance().Queryable<LinZhiTrayInfo>().ToList();
+            LogHelper.Info("瀵屼箰鎵樼洏琛ㄥ叏閮ㄦ暟鎹細" + JsonConvert.SerializeObject(trayInfo));
+
+            //if (order != null && order.Count > 0)
+            //{
+            //    //鍒犻櫎褰撳墠浜х嚎涓嬬嚎鏃堕棿鍓�0鍒嗛挓鐨勬墭鐩樻暟鎹�+            //    for (int i = order.Count - 1; i >= 0; i--)
+            //    {
+
+            //    }
+            //}
+            return order;
+        }
+
+        /// <summary>
+        /// 鏋楄姖-鏇存敼宸ュ崟淇℃伅锛氭墭瑙勩�鎵规鍙枫�鐗╂枡灞傛暟
+        /// </summary>
+        /// <param name="task"></param>
+        /// <param name="status"></param>
+        /// <returns></returns>
+        internal static bool UpdateWorkInfo(LinZhiWorkOrder task, string trayRule = "", string batchNo = "", string itemLayer = "")
+        {
+            var res = false;
+            var db = new SqlHelper<LinZhiWorkOrder>().GetInstance();
+            task.S_TrayRules = trayRule;
+            task.S_BatchNo = batchNo;
+            task.S_ItemLayer = itemLayer;
+            db.Updateable(task).UpdateColumns(it => new { it.S_TrayRules, it.S_BatchNo, it.S_ItemLayer }).ExecuteCommand();
+            return res;
+        }
+
+        /// <summary>
+        /// 鏋楄姖-鏌ヨ鎵樼洏淇℃伅-鍏ㄩ儴-涓轰簡瀵规瘮褰撳墠鏄惁涓烘甯镐笅绾�+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static List<LinZhiTrayInfo> GetLinJiangTrayInfoAllList(string deviceName)
+        {
+            var order = new SqlHelper<LinZhiTrayInfo>().GetList(a => a.deviceName == deviceName);
+            return order;
+        }
+        #endregion
     }
 }
diff --git a/HH.WCS.Mobox3.NongFuLinZhi/wms/WMSHelper.cs b/HH.WCS.Mobox3.NongFuLinZhi/wms/WMSHelper.cs
index 66ed6d2..842580e 100644
--- a/HH.WCS.Mobox3.NongFuLinZhi/wms/WMSHelper.cs
+++ b/HH.WCS.Mobox3.NongFuLinZhi/wms/WMSHelper.cs
@@ -630,7 +630,7 @@
             }
         }
 
-        public static bool CreateOpTask(string startLoc, string endLoc, string sType, string taskType, string trayCode,string note = "")
+        public static bool CreateOpTask(string startLoc, string endLoc, string sType, string taskType, string trayCode, string note = "", string trayType = "", string workNo = "", string itemCode = "")
         {
             bool result = false;
             int nType = sType == "鍏ュ簱" ? 1 : 2;
@@ -644,7 +644,10 @@
                 S_TYPE = sType,
                 S_OP_DEF_CODE = "",
                 S_OP_DEF_NAME = taskType,
-                S_NOTE = note
+                S_NOTE = note,
+                S_TRAY_TYPE = trayType,
+                S_WORK_NO = workNo,
+                S_ITEM_CODE = itemCode,
             };
             result = WMSHelper.CreateWmsTask(wmsTask);
             if (result)
@@ -694,26 +697,26 @@
                 if (a.N_TYPE == 2)
                 {
                     LogHelper.Info($"浣滀笟缁堢偣涓嶄负鎺ラ┏浣�鏌ユ壘搴撳尯{a.S_END_AREA} 鍙敤璐т綅");
-
+                    
                     //鍏朵粬搴撳尯
-                    var endlist = db.Queryable<Location>()
-                    .Where(it => it.S_AREA_CODE == a.S_END_AREA && it.N_CURRENT_NUM < it.N_CAPACITY)
-                    .OrderBy(it => it.N_COL)
-                    .PartitionBy(it => it.N_ROW)
-                    .Take(1)
-                    .ToList();
-                    LogHelper.Info($"绗﹀悎鏉′欢鐨勬暟閲弡endlist.Count}");
-                    foreach (var item in endlist)
-                    {
-                        var lockinfo = db.Queryable<Location>().Where(it => it.N_LOCK_STATE != 0 && it.S_AREA_CODE == item.S_AREA_CODE && it.N_ROW == item.N_ROW).First();
-                        if (lockinfo == null)
-                        {
-                            result = item;
-                            a.S_END_LOC = item.S_CODE;
-                            break;
-                        }
-                        else LogHelper.Info($"璐т綅{lockinfo.S_CODE} 鏈夐攣 褰撳墠鎺掍笉鍙娇鐢�);
-                    }
+                    //var endlist = db.Queryable<Location>()
+                    //.Where(it => it.S_AREA_CODE == a.S_END_AREA && it.N_CURRENT_NUM < it.N_CAPACITY)
+                    //.OrderBy(it => it.N_COL)
+                    //.PartitionBy(it => it.N_ROW)
+                    //.Take(1)
+                    //.ToList();
+                    //LogHelper.Info($"绗﹀悎鏉′欢鐨勬暟閲弡endlist.Count}");
+                    //foreach (var item in endlist)
+                    //{
+                    //    var lockinfo = db.Queryable<Location>().Where(it => it.N_LOCK_STATE != 0 && it.S_AREA_CODE == item.S_AREA_CODE && it.N_ROW == item.N_ROW).First();
+                    //    if (lockinfo == null)
+                    //    {
+                    //        result = item;
+                    //        a.S_END_LOC = item.S_CODE;
+                    //        break;
+                    //    }
+                    //    else LogHelper.Info($"璐т綅{lockinfo.S_CODE} 鏈夐攣 褰撳墠鎺掍笉鍙娇鐢�);
+                    //}
                 }
                 else
                 {
@@ -741,13 +744,13 @@
                                 result = TaskProcess.BCPFullOut(db, a.S_OP_DEF_NAME, itemInfo.S_ITEM_CODE);
                             }
                         }
-                        
                     }
                     if (a.S_OP_DEF_NAME.Contains("绌烘墭涓嬬嚎"))
                     {
-                        result = TaskProcess.BCPEmptyOut(db,a.S_OP_DEF_NAME);
+                        result = TaskProcess.BCPEmptyOut(db, a.S_OP_DEF_NAME);
                     }
 
+
                     //鍏朵粬搴撳尯
                     //var endlist = db.Queryable<Location>()
                     //.Where(it => it.S_AREA_CODE == a.S_END_AREA && it.N_CURRENT_NUM < it.N_CAPACITY)

--
Gitblit v1.9.1