From 53d582ad41d8450b21045b2d862a532ecc57a9ba Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期一, 26 五月 2025 17:29:57 +0800
Subject: [PATCH] 抽检移库基本测完,添加TCP模拟测试输送线产品下线的逻辑

---
 device/TcpClientHelper.cs                                                           |   83 +++++++
 models/TN_RelocationList_Detail.cs                                                  |   24 ++
 Program.cs                                                                          |   18 +
 device/ProductionLineDevice.cs                                                      |    8 
 /dev/null                                                                           |   11 -
 core/Monitor.cs                                                                     |  202 ++++++++++++++++---
 config/config.json                                                                  |   40 +++
 models/TN_SpotCheck_Detail.cs                                                       |   30 +++
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f1cb2527-5e7a-4ff5-bd94-7e85a024df58.vsidx |    0 
 core/WCSCore.cs                                                                     |   20 +
 HH.WCS.Mobox3.DSZSH.csproj                                                          |    5 
 models/TN_Spot_Check.cs                                                             |   26 ++
 models/TN_Relocation_List.cs                                                        |   20 ++
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/06d8e01f-6afb-4384-90b8-31f0488cd604.vsidx |    0 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/67e4ef9b-7188-43f4-a60f-46c9a1d6bd44.vsidx |    0 
 util/Settings.cs                                                                    |   27 ++
 api/ApiHelper.cs                                                                    |   60 +++--
 Models/TN_CG_Detail.cs                                                              |    8 
 process/TaskProcess.cs                                                              |   16 +
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/21a5a3a3-5cdb-4cd3-a5e2-25be17fb4dfe.vsidx |    0 
 20 files changed, 500 insertions(+), 98 deletions(-)

diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/06d8e01f-6afb-4384-90b8-31f0488cd604.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/06d8e01f-6afb-4384-90b8-31f0488cd604.vsidx
new file mode 100644
index 0000000..4d1fb68
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/06d8e01f-6afb-4384-90b8-31f0488cd604.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/21a5a3a3-5cdb-4cd3-a5e2-25be17fb4dfe.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/21a5a3a3-5cdb-4cd3-a5e2-25be17fb4dfe.vsidx
new file mode 100644
index 0000000..a87405c
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/21a5a3a3-5cdb-4cd3-a5e2-25be17fb4dfe.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/49ec3933-2a6b-4835-ab77-24f5cfc05e26.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/49ec3933-2a6b-4835-ab77-24f5cfc05e26.vsidx
deleted file mode 100644
index c0d9b1a..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/49ec3933-2a6b-4835-ab77-24f5cfc05e26.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/67e4ef9b-7188-43f4-a60f-46c9a1d6bd44.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/67e4ef9b-7188-43f4-a60f-46c9a1d6bd44.vsidx
new file mode 100644
index 0000000..4d375c1
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/67e4ef9b-7188-43f4-a60f-46c9a1d6bd44.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/72178599-9865-468a-a3b6-7e0cf3fce2a8.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/72178599-9865-468a-a3b6-7e0cf3fce2a8.vsidx
deleted file mode 100644
index d2fec1f..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/72178599-9865-468a-a3b6-7e0cf3fce2a8.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/848a02bc-1e77-4a4d-8129-5fd396f4d138.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/848a02bc-1e77-4a4d-8129-5fd396f4d138.vsidx
deleted file mode 100644
index 1ab47db..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/848a02bc-1e77-4a4d-8129-5fd396f4d138.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c30fdd47-6615-4811-b8bd-dfc4b98d2d2f.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c30fdd47-6615-4811-b8bd-dfc4b98d2d2f.vsidx
deleted file mode 100644
index 47a5694..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c30fdd47-6615-4811-b8bd-dfc4b98d2d2f.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f1cb2527-5e7a-4ff5-bd94-7e85a024df58.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f1cb2527-5e7a-4ff5-bd94-7e85a024df58.vsidx
new file mode 100644
index 0000000..c8264a7
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f1cb2527-5e7a-4ff5-bd94-7e85a024df58.vsidx
Binary files differ
diff --git a/HH.WCS.Mobox3.DSZSH.csproj b/HH.WCS.Mobox3.DSZSH.csproj
index 5b3a82c..09c07a9 100644
--- a/HH.WCS.Mobox3.DSZSH.csproj
+++ b/HH.WCS.Mobox3.DSZSH.csproj
@@ -236,13 +236,16 @@
     <Compile Include="core\WCSCore.cs" />
     <Compile Include="core\WMSCore.cs" />
     <Compile Include="device\TcpClientHelper.cs" />
+    <Compile Include="models\TN_RelocationList_Detail.cs" />
+    <Compile Include="models\TN_Relocation_List.cs" />
+    <Compile Include="models\TN_SpotCheck_Detail.cs" />
+    <Compile Include="models\TN_Spot_Check.cs" />
     <Compile Include="process\TaskProcess.cs" />
     <Compile Include="util\SqlHelper.cs" />
     <Compile Include="models\TN_Container_Item.cs" />
     <Compile Include="models\TN_Check_Detail.cs" />
     <Compile Include="models\TN_Check_Order.cs" />
     <Compile Include="models\TN_Inbound_Order.cs" />
-    <Compile Include="models\TN_Order_Task.cs" />
     <Compile Include="models\TN_Outbound_Order.cs" />
     <Compile Include="models\TN_Outbound_Detail.cs" />
     <Compile Include="models\TN_Shift_Detail.cs" />
diff --git a/Models/TN_CG_Detail.cs b/Models/TN_CG_Detail.cs
index f705e15..9a9a2a9 100644
--- a/Models/TN_CG_Detail.cs
+++ b/Models/TN_CG_Detail.cs
@@ -69,10 +69,10 @@
         /// </summary>
         public string S_QUALITY_GRADE { get; set; } = string.Empty;
 
-        /// <summary>
-        /// 浜х嚎鍙�-        /// </summary>
-        public int N_PRODUCT_LINE { get; set; } = 0; // NOTE 鍚庣画MES鍙兘浼氭彁渚涳紝鍏堝垱寤�
+        ///// <summary>
+        ///// 浜х嚎鍙�+        ///// </summary>
+        //public int N_PRODUCT_LINE { get; set; } = 0; // NOTE 鍚庣画MES鍙兘浼氭彁渚涳紝鍏堝垱寤�
 
         // ----------------
 
diff --git a/Models/TN_Order_Task.cs b/Models/TN_Order_Task.cs
deleted file mode 100644
index 58e79b9..0000000
--- a/Models/TN_Order_Task.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.models {
-    public class TN_Order_Task {
-
-    }
-}
diff --git a/Program.cs b/Program.cs
index e3e9b9b..d8c574e 100644
--- a/Program.cs
+++ b/Program.cs
@@ -26,6 +26,9 @@
             // 4.0 寮�惎Modbus
             //StartModbus();
 
+            // TCP娴嬭瘯
+            //TcpClientHelper.Link("127.0.0.1", 8550);
+
             // 5.0 寮�惎绾跨▼
             var rc = HostFactory.Run(x => {
                 x.Service<WorkThread>(s => {
@@ -52,7 +55,7 @@
             Console.WriteLine("Startup ApiController");
             Task.Run(() =>
             {
-                var url = Settings.WebApiUrl; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
+                var url = Settings.WebApiUrl;
                 Console.WriteLine(url);
                 using (WebApp.Start<Startup>(url))
                 {
@@ -67,10 +70,12 @@
         /// </summary>
         private static void StartTcp()
         {
-            var tcpServerIP = Settings.TcpServerIp; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
-            var tcpServerPort = Settings.TcpServerPort; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
+            var tcpServerIP = Settings.TcpServerIp;
+            var tcpServerPort = Settings.TcpServerPort;
             new TcpServer(tcpServerIP, tcpServerPort);
-
+            //var res = TcpClientHelper.Init(tcpServerIP, tcpServerPort);
+            //var res = TcpClientHelper.Init(tcpServerIP, 8550);
+            //LogHelper.Info($"TcpClient杩炴帴" + (res ? "鎴愬姛" : "澶辫触"));
         }
 
         /// <summary>
@@ -97,7 +102,7 @@
         private static void StartModbus()
         {
             // 鎵�湁鐨凪odbus璁惧
-            var allPLCDevice = Settings.ProductionLines; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
+            var allPLCDevice = Settings.ProductionLines;
             
             if (allPLCDevice.Count > 0) {
                 foreach (var item in allPLCDevice) {
@@ -115,6 +120,9 @@
 
                 tasks.Add(GetTask(WCSCore.Dispatch));
 
+                // 娴嬭瘯锛氭墭鐩樹笅绾�+                tasks.Add(GetTask(Monitor.CheckInbound));
+
                 // 杞锛氬嚭搴撳崟鐘舵�
                 tasks.Add(GetTask(Monitor.CheckOutboundOrder));
 
diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index 9c71a92..0d86eb0 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -45,6 +45,7 @@
                 var startLoc = db.Queryable<TN_Location>()
                     .Where(l => l.S_CODE == model.StartLoc) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
                     .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_CURRENT_NUM == 0) // 璧风偣缁戝畾鍓嶆病鏈夊鍣�                     .First();
 
                 if (startLoc == null) {
@@ -59,12 +60,6 @@
                     S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                     S_CNTR_TYPE = "濂借繍绠�,
                 };
-
-                if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
-                    info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴澶辫触锛� + JsonConvert.SerializeObject(locCntrRel);
-                    LogHelper.Info(info);
-                    return NewSimpleResult(4, info);
-                }
 
                 // TODO 婊$鍏ュ簱绠楁硶寰呬紭鍖�                 var endLoc = db.Queryable<TN_Location>()
@@ -87,6 +82,13 @@
                 LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                        info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴澶辫触锛� + JsonConvert.SerializeObject(locCntrRel);
+                        tran.RollbackTran();
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
                     if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
                         it.N_LOCK_STATE,
                         it.S_LOCK_STATE,
@@ -266,7 +268,9 @@
 
                 // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(a => Settings.AreaMap[AreaName.绌烘墭瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                    .Where(l => Settings.AreaMap[AreaName.绌烘墭瀛樻斁鍖篯.Contains(l.S_AREA_CODE))
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 0)
                     .OrderBy(l => l.N_LAYER)
                     .First();
 
@@ -361,9 +365,11 @@
 
                 // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(a => Settings.AreaMap[AreaName.绌虹瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
-                    .OrderBy(l => l.N_LAYER)
-                    .OrderBy(l => l.S_AREA_CODE).First();
+                    .Where(l => Settings.AreaMap[AreaName.绌虹瀛樻斁鍖篯.Contains(l.S_AREA_CODE))
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 0)
+                    .OrderBy(l => new { l.N_LAYER })
+                    .First();
 
                 if (endLoc == null) {
                     return NewSimpleResult(4, $"鏆傛椂娌℃湁绗﹀悎鏉′欢鐨勭粓鐐规斁璐т綅");
@@ -451,10 +457,10 @@
                 }
 
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(a => Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(a.S_AREA_CODE))
+                    .Where(l => Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(l.S_AREA_CODE))
                     .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
-                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
-                    .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
+                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
                     .First();
 
                 if (endLoc == null) {
@@ -542,10 +548,10 @@
                 }
 
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(a => Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(a.S_AREA_CODE))
+                    .Where(l => Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(l.S_AREA_CODE))
                     .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
-                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
-                    .Where(a => a.N_CURRENT_NUM == 0)
+                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_CURRENT_NUM == 0)
                     .First();
 
                 if (endLoc == null) {
@@ -707,7 +713,8 @@
 
                 var startLoc = db.Queryable<TN_Location>()
                     .Where(l => l.S_CODE == locCntrRel.S_LOC_CODE)
-                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_CURRENT_NUM == 1)
                     .First();
 
                 if (startLoc == null) {
@@ -719,16 +726,16 @@
                 var endLoc = new TN_Location();
                 if (locCntrRel.S_CNTR_TYPE == "鎵樼洏") {
                     endLoc = db.Queryable<TN_Location>()
-                        .Where(a => Settings.AreaMap[AreaName.婊℃墭瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
-                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
-                        .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
+                        .Where(l => Settings.AreaMap[AreaName.婊℃墭瀛樻斁鍖篯.Contains(l.S_AREA_CODE))
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
                         .First();
                 }
                 else if (locCntrRel.S_CNTR_TYPE == "濂借繍绠�) {
                     endLoc = db.Queryable<TN_Location>()
-                        .Where(a => Settings.AreaMap[AreaName.婊$瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
-                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
-                        .Where(a => a.N_CURRENT_NUM == 0)
+                        .Where(l => Settings.AreaMap[AreaName.婊$瀛樻斁鍖篯.Contains(l.S_AREA_CODE))
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 0)
                         .First();
                 }
                 else {
@@ -827,7 +834,8 @@
 
                 var startLoc = db.Queryable<TN_Location>()
                     .Where(l => l.S_CODE == locCntrRel.S_LOC_CODE)
-                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_CURRENT_NUM == 1)
                     .First();
 
                 if (startLoc == null) {
@@ -839,7 +847,8 @@
                 var endLoc = db.Queryable<TN_Location>()
                     .Where(l => l.S_AREA_CODE == model.EndArea)
                     .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
-                    .Where(a => a.N_CURRENT_NUM == 0).First();
+                    .Where(a => a.N_CURRENT_NUM == 0)
+                    .First();
 
                 if (endLoc == null) {
                     return NewSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅");
@@ -915,6 +924,7 @@
                 var startLoc = db.Queryable<TN_Location>()
                     .Where(l => l.S_CODE == model.StartLoc)
                     .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.N_CURRENT_NUM == 1)
                     .First();
 
                 var locCntrRel = db.Queryable<TN_Loc_Container>()
diff --git a/config/config.json b/config/config.json
index 3aa016c..e40371a 100644
--- a/config/config.json
+++ b/config/config.json
@@ -128,7 +128,7 @@
             "Id": "2",
             "Name": "鎵樼洏浜х嚎2",
             "PlcIp": "127.0.0.1",
-            "PlcPort": 502,
+            "PlcPort": 503,
             "SlaveId": 2,
             "OnLoc": [
                 "CX21"
@@ -141,7 +141,7 @@
             "Id": "3",
             "Name": "濂借繍绠变骇绾�",
             "PlcIp": "127.0.0.1",
-            "PlcPort": 502,
+            "PlcPort": 504,
             "SlaveId": 3,
             "OnLoc": [
                 "CX31"
@@ -154,7 +154,7 @@
             "Id": "4",
             "Name": "濂借繍绠变骇绾�",
             "PlcIp": "127.0.0.1",
-            "PlcPort": 502,
+            "PlcPort": 505,
             "SlaveId": 4,
             "OnLoc": [
                 "CX41"
@@ -163,5 +163,39 @@
                 "CX42"
             ]
         }
+    ],
+    "ProdAgvSite": [
+        {
+            "Code": "work111",
+            "ProdId": 0
+        },
+        {
+            "Code": "work112",
+            "ProdId": 0
+        },
+        {
+            "Code": "work121",
+            "ProdId": 1
+        },
+        {
+            "Code": "work122",
+            "ProdId": 1
+        },
+        {
+            "Code": "work131",
+            "ProdId": 2
+        },
+        {
+            "Code": "work132",
+            "ProdId": 2
+        },
+        {
+            "Code": "work141",
+            "ProdId": 3
+        },
+        {
+            "Code": "work142",
+            "ProdId": 3
+        }
     ]
 }
\ No newline at end of file
diff --git a/core/Monitor.cs b/core/Monitor.cs
index 728acbe..ccb2fd5 100644
--- a/core/Monitor.cs
+++ b/core/Monitor.cs
@@ -4,37 +4,167 @@
 using System.Text;
 using System.Threading.Tasks;
 
+using HH.WCS.Mobox3.DSZSH.device;
 using HH.WCS.Mobox3.DSZSH.models;
 using HH.WCS.Mobox3.DSZSH.util;
 using HH.WCS.Mobox3.DSZSH.wms;
+using Microsoft.Win32;
+
 using Newtonsoft.Json;
 
 namespace HH.WCS.Mobox3.DSZSH.core {
     public class Monitor {
+        public class ItemData {
+            public string item_code { get; set; }
+            public string batch_no { get; set;}
+            public string cntr_code { get; set; }
+        }
+
         public static void CheckInbound() {
             var taskName = TaskName.鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱;
             var db = new SqlHelper<object>().GetInstance();
             var info = "";
             try {
                 // 鏌ヤ骇绾挎槸鍚︽湁鐗╂枡淇℃伅
+                foreach (var prod in Settings.ProductionLines) {
+                    if (int.Parse(prod.Id) > 1) break; // TEST
 
-                var itemCode = "";
-                var batchNo = "";
-                var cntrCode = "";
-                var startLocCode = "";
+                    //var prodDevice = new ProductionLineDevice(prod); // TODO 寰呴渶姹傜‘瀹氬悗鍐嶅鐞�+                    //TcpClientHelper.Link("127.0.0.1", 8550); // 鐢ㄤ簬娴嬭瘯
+                    TcpClientHelper.Link(prod.PlcIp, prod.PlcPort);
 
-                var cgDetail = new TN_CG_Detail {
-                    S_ITEM_CODE = itemCode,
-                    S_BATCH_NO = batchNo,
-                    S_CNTR_CODE = cntrCode,
-                };
+                    // TCPClient浼犻�淇℃伅鐨勬椂鍊欙紝涓嶈鐢ㄦ柇鐐归樆濉炵▼搴�+                    // {"item_code":"CG1001","batch_no":"BN1001","cntr_code":"CN2505111"}
+                    if (!TcpClientHelper.TryReadProductionLine(out byte[] read)) {
+                        info = $"娴嬭瘯{prod.Id}鍙蜂骇绾縶prod.PlcIp}:{prod.PlcPort}锛氳鍙栦骇绾夸俊鎭け璐�;
+                        LogHelper.Info(info);
+                        continue;
+                    }
 
-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(l => l.S_CODE == startLocCode) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
-                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
-                    .First();
+                    // 3. 灏嗗瘎瀛樺櫒鍊艰浆鎹负瀛楄妭鏁扮粍
+                    //byte[] bytes = TcpClientHelper.ConvertRegistersToBytes(registers);
 
-                
+                    // 4. 灏嗗瓧鑺傛暟缁勮浆鎹负瀛楃涓�+                    string result = TcpClientHelper.ConvertBytesToString(read);
+
+                    //var itemData = BitConverter.ToString(read);
+                    LogHelper.Info($"璇诲彇鐨勪骇绾夸俊鎭瘂result}");
+                    var data = JsonConvert.DeserializeObject<ItemData>(result);
+
+                    LogHelper.Info(JsonConvert.SerializeObject(data));
+
+                    var itemCode = data.item_code;
+                    var batchNo = data.batch_no;
+                    var cntrCode = data.cntr_code;
+
+                    var startLocCode = prod.OffLoc[0]; // 鐢ㄤ簬娴嬭瘯
+                    //var startLocCode = "CX01"; // 鐢ㄤ簬娴嬭瘯
+
+                    var cgDetail = new TN_CG_Detail {
+                        S_ITEM_CODE = itemCode,
+                        S_BATCH_NO = batchNo,
+                        S_CNTR_CODE = cntrCode,
+                    };
+
+                    var startLoc = db.Queryable<TN_Location>()
+                        .Where(l => l.S_CODE == startLocCode) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 0)
+                        .First();
+
+                    if (startLoc == null) {
+                        info = $"璧风偣浣嶇疆 '{startLocCode}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�;
+                        LogHelper.Info(info);
+                        continue;
+                        //return;
+                    }
+
+                    // 缁戝畾璐т綅鍜屽鍣ㄥ彿
+                    var locCntrRel = new TN_Loc_Container {
+                        S_LOC_CODE = startLocCode,
+                        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                        S_CNTR_TYPE = "鎵樼洏",
+                    };
+
+                    //if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                    //    info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴澶辫触锛� + JsonConvert.SerializeObject(locCntrRel);
+                    //    LogHelper.Info(info);
+                    //    continue;
+                    //    //return;
+                    //}
+
+                    // TODO 婊$鍏ュ簱绠楁硶寰呬紭鍖�+                    var endLoc = db.Queryable<TN_Location>()
+                        .Where(a => Settings.AreaMap[AreaName.绌烘墭瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
+                        .OrderBy(l => l.N_LAYER)
+                        .First();
+
+                    if (endLoc == null) {
+                        info = "绌烘墭鍏ュ簱鏆傛椂娌℃湁鍚堥�鐨勮揣浣嶅彲浠ュ叆搴�;
+                        LogHelper.Info(info);
+                        continue;
+                    }
+
+                    var cntId = locCntrRel.S_CNTR_CODE;
+                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                    LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                    LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿�+
+                    using (var tran = db.Ado.UseTran()) {
+                        if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鎻掑叆瀹瑰櫒璐у搧淇℃伅琛ㄥけ璐ワ細鐗╂枡缂栫爜{cgDetail.S_ITEM_CODE}锛屽鍣ㄧ紪鐮亄cgDetail.S_CNTR_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐ワ細璐т綅缂栫爜{locCntrRel.S_LOC_CODE}锛屽鍣ㄧ紪鐮亄locCntrRel.S_CNTR_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�;
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        tran.CommitTran();
+                        info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        continue;
+                    }
+                }
 
             }
             catch (Exception ex) {
@@ -107,6 +237,8 @@
                     var startLoc = db.Queryable<TN_Location>()
                         .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
                         .Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE)
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 1)
                         .First();
 
                     if (startLoc == null) {
@@ -190,7 +322,7 @@
             var info = "";
 
             try {
-                var orderList = db.Queryable<TN_Check_Order>()
+                var orderList = db.Queryable<TN_Spot_Check>()
                     .Where(c => c.N_B_STATE == 1)
                     .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
                     .ToList();
@@ -200,22 +332,22 @@
                     return;
                 }
 
-                var detailList = new List<TN_Check_Detail>();
+                var detailList = new List<TN_SpotCheck_Detail>();
                 foreach (var order in orderList) {
-                    var doingCount = db.Queryable<TN_Check_Detail>()
-                        .Count(d => d.S_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�-                    var allCount = db.Queryable<TN_Check_Detail>()
-                        .Count(d => d.S_NO == order.S_NO);
+                    var doingCount = db.Queryable<TN_SpotCheck_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�+                    var allCount = db.Queryable<TN_SpotCheck_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO);
                     LogHelper.Info($"杞--{taskName}--缁熻{taskName}鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
 
                     if (doingCount == allCount) {
                         order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
-                        db.Updateable<TN_Check_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                        db.Updateable<TN_Spot_Check>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                         continue;
                     }
 
-                    var checkDetailList = db.Queryable<TN_Check_Detail>()
-                        .Where(a => a.S_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�+                    var checkDetailList = db.Queryable<TN_SpotCheck_Detail>()
+                        .Where(a => a.S_OO_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�                         .ToList();
 
                     if (checkDetailList.Count == 0) {
@@ -258,7 +390,7 @@
                     LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                     using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                        if (db.Updateable<TN_SpotCheck_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
                             LogHelper.Info($"杞--{taskName}锛氫慨鏀箋taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触锛�);
                             continue;
@@ -312,7 +444,7 @@
             var db = new SqlHelper<object>().GetInstance();
             var info = "";
             try {
-                var orderList = db.Queryable<TN_Shift_Order>()
+                var orderList = db.Queryable<TN_Relocation_List>()
                     .Where(c => c.N_B_STATE == 1)
                     .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
                     .ToList();
@@ -322,22 +454,22 @@
                     return;
                 }
 
-                var detailList = new List<TN_Shift_Detail>();
+                var detailList = new List<TN_RelocationList_Detail>();
                 foreach (var order in orderList) {
-                    var doingCount = db.Queryable<TN_Shift_Detail>()
-                        .Count(d => d.S_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�-                    var allCount = db.Queryable<TN_Shift_Detail>()
-                        .Count(d => d.S_NO == order.S_NO);
+                    var doingCount = db.Queryable<TN_RelocationList_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�+                    var allCount = db.Queryable<TN_RelocationList_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO);
                     LogHelper.Info($"杞--{taskName}--缁熻{taskName}鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
 
                     if (doingCount == allCount) {
                         order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
-                        db.Updateable<TN_Shift_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                        db.Updateable<TN_Relocation_List>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                         continue;
                     }
 
-                    var checkDetailList = db.Queryable<TN_Shift_Detail>()
-                        .Where(a => a.S_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�+                    var checkDetailList = db.Queryable<TN_RelocationList_Detail>()
+                        .Where(a => a.S_OO_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�                         .ToList();
 
                     if (checkDetailList.Count == 0) {
@@ -354,6 +486,8 @@
                     var startLoc = db.Queryable<TN_Location>()
                         .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
                         .Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE)
+                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(l => l.N_CURRENT_NUM == 1)
                         .First();
 
                     if (startLoc == null) {
@@ -380,7 +514,7 @@
                     LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                     using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                        if (db.Updateable<TN_RelocationList_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
                             LogHelper.Info($"杞--{taskName}锛氫慨鏀箋taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触锛�);
                             continue;
diff --git a/core/WCSCore.cs b/core/WCSCore.cs
index 5fbf07f..e5a61f9 100644
--- a/core/WCSCore.cs
+++ b/core/WCSCore.cs
@@ -127,9 +127,19 @@
             try {
                 ModbusHelper.Relink();
 
-                var prodLineInfo = Settings.ProductionLines[0];
+                //var loc = db.Queryable<TN_Location>()
+                //    .Where(l => l.S_AGV_SITE == model.station_name && Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(l.S_AREA_CODE))
+                //    .First();
 
-                var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort);
+                if (!Settings.AgvSite_ProdLineCodeMap.TryGetValue(model.station_name, out int prodIndex)) {
+                    info = $"AGV 绔欑偣{model.station_name}涓嶆槸鍚堟硶鐨勪骇绾挎帴椹充綅绔欑偣";
+                    LogHelper.Info(info);
+                    return NewReturnResult(1, info);
+                }
+
+                var prodLineInfo = Settings.ProductionLines[prodIndex];
+
+                var prodLineDevice = new ProductionLineDevice(prodLineInfo);
                 if (!prodLineDevice.LoadDeviceStateOk()) {
                     info = "涓庝骇绾胯澶囬�璁け璐�;
                     LogHelper.Info(info);
@@ -155,7 +165,7 @@
                     return NewReturnResult(3, info);
                 }
 
-                if (model.apply_code == "5") {
+                if (model.apply_code == "5") { // 璇锋眰鍙栬揣
                     if (prodLineDevice.FullOffline != 1) {
                         info = $"褰撳墠杈撻�绾挎弧鏂欎笅绾夸俊鍙蜂笉涓�锛屾棤娉曞彇璐�;
                         LogHelper.Info(info);
@@ -173,7 +183,7 @@
                     return NewReturnResult(0, info);
 
                 }
-                else if (model.apply_code == "1") {
+                else if (model.apply_code == "1") { // 璇锋眰鍗歌揣
                     if (prodLineDevice.AllowAgvPlacePallet != 1) {
                         info = $"褰撳墠杈撻�绾垮厑璁告斁鎵樼洏淇″彿涓嶄负1锛屾棤娉曟斁璐�;
                         LogHelper.Info(info);
@@ -191,7 +201,7 @@
                     return NewReturnResult(0, info);
                 }
                 else {
-                    info = $"褰撳墠杈撻�绾垮厑璁�;
+                    info = $"褰撳墠AGV璇锋眰鐮佷笉涓�5鍙栬揣 鎴�1鍗歌揣";
                     LogHelper.Info(info);
                     return NewReturnResult(8, info);
                 }
diff --git a/device/ProductionLineDevice.cs b/device/ProductionLineDevice.cs
index 4eaf326..c22a7d7 100644
--- a/device/ProductionLineDevice.cs
+++ b/device/ProductionLineDevice.cs
@@ -22,10 +22,14 @@
             Port = port;
             Id = id;
         }
+        
+        public ProductionLineDevice(Config.ProductionLine line) {
+            Ip = line.PlcIp;
+            Port = line.PlcPort;
+            Id = line.Id;
+        }
 
         public string Id { get; set; }
-
-
 
         /// <summary>
         /// 绯荤粺鐘舵�锛�鏈湴 1鑱斿姩(AGV妯″紡) 2鏁呴殰
diff --git a/device/TcpClientHelper.cs b/device/TcpClientHelper.cs
index 740887e..bfdcc2c 100644
--- a/device/TcpClientHelper.cs
+++ b/device/TcpClientHelper.cs
@@ -64,7 +64,6 @@
             lock (_linkLock) {
                 try {
 
-
                     // 鑻ocket瀛樺湪浣嗗疄闄呭凡鏂紑锛屽己鍒舵竻鐞�                     if (_clientSocket != null && (_clientSocket.Poll(0, SelectMode.SelectRead) && _clientSocket.Available == 0)) {
                         SafeCloseSocket();
@@ -72,13 +71,18 @@
 
                     // 鍘熸湁閫昏緫
                     if (_clientSocket != null && _clientSocket.Connected) {
-                        LogHelper.Info($"鐢垫宸茶繛鎺ワ紝鏃犻渶閲嶈繛锛孖P锛歿ip}锛岀鍙o細{port}");
-                        return false;
+                        //if (ip == _ip && port == _port) {
+                            LogHelper.Info($"浜х嚎宸茶繛鎺ワ紝鏃犻渶閲嶈繛锛孖P锛歿ip}锛岀鍙o細{port}");
+                            return false;
+                        //}
+
+                        //LogHelper.Info($"oldIP={_ip};newIP={ip};oldPort={_port};newPort={port}");
+                        //SafeCloseSocket();
                     }
                     return Init(ip, port);
                 }
                 catch (Exception ex) {
-                    LogHelper.Error($"鐢垫閲嶈繛澶辫触锛孖P锛歿ip}锛岀鍙o細{port}锛屽紓甯革細{ex.Message}", ex);
+                    LogHelper.Error($"浜х嚎閲嶈繛澶辫触锛孖P锛歿ip}锛岀鍙o細{port}锛屽紓甯革細{ex.Message}", ex);
                     return false;
                 }
             }
@@ -210,6 +214,77 @@
             }
         }
 
+        /// <summary>
+        /// {\"item_code\":\"CG1001\",\"batch_no\":\"BN1001\",\"cntr_code\":\"CN2505111\"}<br/>
+        /// {"item_code":"CG1001","batch_no":"BN1001","cntr_code":"CN2505111"}
+        /// </summary>
+        /// <param name="read"></param>
+        /// <returns></returns>
+        public static bool TryReadProductionLine(out byte[] read) {
+            read = null;
+            try {
+                if (_clientSocket != null && _clientSocket?.Connected == true) {
+                    if (!_receivedDataQueue.TryGetValue($"{_ip}:{_port}", out byte[] result)) {
+                        LogHelper.Info($"璇讳骇绾挎墭鐩樹笅绾挎暟鎹け璐�);
+                        //read = result;
+                        return false;
+                    }
+                    LogHelper.Info($"璇讳骇绾挎墭鐩樹笅绾挎暟鎹垚鍔燂細{BitConverter.ToString(result)}");
+                    read = result;
+                    return true;
+                }
+                else {
+                    //LogHelper.Info($"_clientSocket={_clientSocket} connected={_clientSocket?.Connected}");
+                    Link(_ip, _port);
+                    LogHelper.Info($"璇讳骇绾挎墭鐩樹笅绾挎暟鎹け璐ワ紙鏈繛鎺ワ級锛屽噯澶囬噸杩�);
+                    return false;
+                }
+            }
+            catch (Exception ex) {
+                //LogHelper.Error($"璇讳骇绾挎墭鐩樹笅绾挎暟鎹け璐ワ紙鍙戠敓浜嗗紓甯革細{JsonConvert.SerializeObject(ex)}锛夛細{ex.Message}", ex);
+                LogHelper.InfoEx(ex);
+                return false;
+                /* 寮傚父澶勭悊 */
+            }
+
+            //return false;
+        }
+
+        /// <summary>
+        /// 灏哅odbus瀵勫瓨鍣ㄦ暟缁勮浆鎹负瀛楄妭鏁扮粍
+        /// </summary>
+        /// <param name="registers">Modbus瀵勫瓨鍣ㄦ暟缁�/param>
+        /// <returns>瀛楄妭鏁扮粍</returns>
+        public static byte[] ConvertRegistersToBytes(ushort[] registers) {
+            // 姣忎釜瀵勫瓨鍣ㄦ槸16浣�2瀛楄妭)锛屾墍浠ユ�瀛楄妭鏁版槸瀵勫瓨鍣ㄦ暟閲忕殑2鍊�+            byte[] bytes = new byte[registers.Length * 2];
+
+            for (int i = 0; i < registers.Length; i++) {
+                // Modbus浣跨敤澶х搴忥紝楂樹綅瀛楄妭鍦ㄥ墠
+                bytes[i * 2] = (byte)(registers[i] >> 8);     // 楂樹綅瀛楄妭
+                bytes[i * 2 + 1] = (byte)(registers[i] & 0xFF); // 浣庝綅瀛楄妭
+            }
+
+            return bytes;
+        }
+
+        /// <summary>
+        /// 灏嗗瓧鑺傛暟缁勮浆鎹负瀛楃涓�+        /// </summary>
+        /// <param name="bytes">瀛楄妭鏁扮粍</param>
+        /// <returns>杞崲鍚庣殑瀛楃涓�/returns>
+        public static string ConvertBytesToString(byte[] bytes) {
+            // 鏌ユ壘绗竴涓�x00瀛楄妭(瀛楃涓茬粨鏉熺)鐨勪綅缃�+            int length = Array.IndexOf(bytes, (byte)0);
+            if (length < 0) length = bytes.Length; // 濡傛灉娌℃湁缁撴潫绗︼紝浣跨敤鍏ㄩ儴瀛楄妭
+
+            // 鏍规嵁璁惧浣跨敤鐨勭紪鐮佽浆鎹�甯歌鐨勬湁ASCII鎴朥TF-8)
+            // 杩欓噷浣跨敤ASCII缂栫爜浣滀负绀轰緥锛屽疄闄呭簲鏍规嵁璁惧鏂囨。纭畾缂栫爜鏂瑰紡
+            return Encoding.ASCII.GetString(bytes, 0, length);
+
+            // 濡傛灉鏄疷TF-8缂栫爜锛屼娇鐢ㄤ笅闈㈣繖琛屼唬鏇夸笂闈㈤偅琛�+            // return Encoding.UTF8.GetString(bytes, 0, length);
+        }
 
         public static bool WriteElevatorDownOk(byte[] sends) {
             try {
diff --git a/models/TN_RelocationList_Detail.cs b/models/TN_RelocationList_Detail.cs
new file mode 100644
index 0000000..1977cb8
--- /dev/null
+++ b/models/TN_RelocationList_Detail.cs
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.Mobox3.DSZSH.models {
+    public class TN_RelocationList_Detail : BaseModel {
+        public string S_OO_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+
+        //public string S_LOC_CODE { get; set; }
+
+        public string S_CNTR_CODE { get; set; }
+
+        public string S_BATCH_NO { get; set; }
+        public string S_END_AREA { get; set; }
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; } = 1; // 鍒涘缓鍗虫墽琛�+    }
+}
diff --git a/models/TN_Relocation_List.cs b/models/TN_Relocation_List.cs
new file mode 100644
index 0000000..ff76c85
--- /dev/null
+++ b/models/TN_Relocation_List.cs
@@ -0,0 +1,20 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.Mobox3.DSZSH.models {
+    public class TN_Relocation_List : BaseModel {
+        public string S_NO { get; set; }
+        //public string S_ITEM_CODE { get; set; }
+        //public string S_ITEM_NAME { get; set; }
+        //public string S_BATCH_NO { get; set; }
+        //public int N_COUNT { get; set; }
+        public string S_END_AREA { get; set; }
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; } = 0; // 鍒涘缓鍚庨渶瑕佺‘璁ゆ墽琛�+    }
+}
diff --git a/models/TN_SpotCheck_Detail.cs b/models/TN_SpotCheck_Detail.cs
new file mode 100644
index 0000000..0765fc1
--- /dev/null
+++ b/models/TN_SpotCheck_Detail.cs
@@ -0,0 +1,30 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using SqlSugar;
+
+namespace HH.WCS.Mobox3.DSZSH.models {
+    /// <summary>
+    /// 鎶芥鍗曟槑缁�+    /// </summary>
+    [SugarTable("TN_SpotCheck_Detail")]
+    public class TN_SpotCheck_Detail : BaseModel {
+        public string S_OO_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+
+        //public string S_LOC_CODE { get; set; }
+
+        public string S_CNTR_CODE { get; set; }
+
+        public string S_BATCH_NO { get; set; }
+        public string S_END_AREA { get; set; }
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; } = 1; // 鍒涘缓鍗虫墽琛�+    }
+}
diff --git a/models/TN_Spot_Check.cs b/models/TN_Spot_Check.cs
new file mode 100644
index 0000000..9c3302e
--- /dev/null
+++ b/models/TN_Spot_Check.cs
@@ -0,0 +1,26 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using SqlSugar;
+
+namespace HH.WCS.Mobox3.DSZSH.models {
+    /// <summary>
+    /// 鎶芥鍗�+    /// </summary>
+    [SugarTable("TN_Spot_Check")]
+    public class TN_Spot_Check : BaseModel {
+        public string S_NO { get; set; }
+        //public string S_ITEM_CODE { get; set; }
+        //public string S_ITEM_NAME { get; set; }
+        //public string S_BATCH_NO { get; set; }
+        //public int N_COUNT { get; set; }
+        public string S_END_AREA { get; set; }
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; } = 0; // 鍒涘缓鍚庨渶瑕佺‘璁ゆ墽琛�+    }
+}
diff --git a/process/TaskProcess.cs b/process/TaskProcess.cs
index a8a0c33..638f618 100644
--- a/process/TaskProcess.cs
+++ b/process/TaskProcess.cs
@@ -7,6 +7,7 @@
 using HH.WCS.Mobox3.DSZSH.models;
 using HH.WCS.Mobox3.DSZSH.wms;
 using HH.WCS.Mobox3.DSZSH;
+using HH.WCS.Mobox3.DSZSH.util;
 
 namespace HH.WCS.Mobox3.DSZSH.process {
     internal class TaskProcess {
@@ -111,6 +112,9 @@
             var result = false;
             var start = "0"; var end = "0";
             var taskType = mst.S_TYPE.Trim();
+
+            //var db = new SqlHelper<object>().GetInstance();
+
             if (mst.N_B_STATE == 0) {
                 start = LocationHelper.GetAgvSite(mst.S_START_LOC);
                 end = LocationHelper.GetAgvSite(mst.S_END_LOC);
@@ -119,6 +123,18 @@
                 //    end = LocationHelper.GetAgvSite(mst.S_END_LOC, true);
                 //}
 
+                // 浠诲姟涓嬪彂鍚庯紝鏃犺AGV鏄惁鎺ュ彈锛宻tate 閮芥槸2浜嗭紝灏辩畻鏆傚仠鏃犳祹浜庝簨
+                // 濡傛灉鍚庣画闇�璁╂殏鍋滅殑浠诲姟涓嶅啀鍒嗗彂锛岄偅涔堝繀椤绘敼鍙樼幇鏈夌殑state鍒ゆ柇鏈哄埗
+
+                //if (mst.S_TYPE == TaskName.绉诲簱) {
+                //    var detail = db.Queryable<TN_RelocationList_Detail>()
+                //        .Where(d => d.S_CNTR_CODE == mst.S_CNTR_CODE).First();
+
+                //    if (detail == null) {
+
+                //    }
+                //}
+
                 LogHelper.Info($"NDC鎺ㄩ�浠诲姟 {mst.S_CODE};" + "start=" + start + "end= " + end);
                 var startLoc = LocationHelper.GetLoc(mst.S_START_LOC);
                 var endLoc = LocationHelper.GetLoc(mst.S_END_LOC);
diff --git a/util/Settings.cs b/util/Settings.cs
index 70de35d..f5b2934 100644
--- a/util/Settings.cs
+++ b/util/Settings.cs
@@ -2,6 +2,8 @@
 using System.Collections.Generic;
 using System.IO;
 
+using HH.WCS.Mobox3.DSZSH.util;
+
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 
@@ -16,7 +18,7 @@
         public static List<Config.Area> Areas { get; set; } = new List<Config.Area>();
         public static List<Config.Task> Tasks { get; set; } = new List<Config.Task>();
         public static List<Config.ProductionLine> ProductionLines { get; set; } = new List<Config.ProductionLine>();
-
+        public static List<Config.ProdAgvSite> ProdAgvSites { get; set; } = new List<Config.ProdAgvSite>();
         /// <summary>
         /// 搴撳尯瀛楀吀锛堝姞杞藉悗灏变笉鍙橈級
         /// </summary>
@@ -61,6 +63,11 @@
                 Tasks = root.Tasks;
                 ProductionLines = root.ProductionLines;
 
+                ProdAgvSites = root.ProdAgvSite;
+                foreach (var item in ProdAgvSites) {
+                    AgvSite_ProdLineCodeMap.Add(item.Code, item.ProdId);
+                }
+
             }   
             catch (FileNotFoundException) {
                 LogHelper.Info("JSON 鏂囦欢鏈壘鍒�);
@@ -87,12 +94,16 @@
         }
 
         private static void LoadProdLines() {
-            foreach (var prod in ProductionLines) {
-
-            }
+            //var db = new SqlHelper<object>().GetInstance();
+            //for (int  i = 0;  i < ProductionLines.Count;  i++) {
+            //    var line = ProductionLines[i];
+            //    // 閫氳繃OnLoc OffLoc鎵惧埌AGVsite鐒跺悗鍐欏叆瀛楀吀
+            //}
         }
 
     }
+
+    // [Convert JSON to C# Classes Online - Json2CSharp Toolkit](https://json2csharp.com/)
 
     public class Config {
 
@@ -100,6 +111,11 @@
         public class Area {
             public string Name { get; set; }
             public List<string> Codes { get; set; }
+        }
+
+        public class ProdAgvSite {
+            public string Code { get; set; }
+            public int ProdId { get; set; }
         }
 
         public class ProductionLine {
@@ -121,6 +137,7 @@
             public List<Area> Areas { get; set; }
             public List<Task> Tasks { get; set; }
             public List<ProductionLine> ProductionLines { get; set; }
+            public List<ProdAgvSite> ProdAgvSite { get; set; }
         }
 
         public class Task {
@@ -128,6 +145,8 @@
             public List<string> StartAreas { get; set; }
             public List<string> EndAreas { get; set; }
         }
+
+
     }
 
     public class AreaName {

--
Gitblit v1.9.1