From e2ec31cc0062b3c1af621437554aa9a3505d2a56 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期五, 23 五月 2025 17:26:55 +0800
Subject: [PATCH] 优化产线安全交互的部分,优化AGV调试接口

---
 device/TcpClientHelper.cs                                                           |  323 +++++++++++++++
 Program.cs                                                                          |    6 
 wms/LocationHelper.cs                                                               |    2 
 device/ProductionLineDevice.cs                                                      |   67 ++
 core/Monitor.cs                                                                     |  107 +++-
 /dev/null                                                                           |    0 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/848a02bc-1e77-4a4d-8129-5fd396f4d138.vsidx |    0 
 util/LogHelper.cs                                                                   |   14 
 api/ApiModel.cs                                                                     |   42 -
 core/WCSCore.cs                                                                     |  114 ++++-
 HH.WCS.Mobox3.DSZSH.csproj                                                          |    1 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c30fdd47-6615-4811-b8bd-dfc4b98d2d2f.vsidx |    0 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/49ec3933-2a6b-4835-ab77-24f5cfc05e26.vsidx |    0 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/72178599-9865-468a-a3b6-7e0cf3fce2a8.vsidx |    0 
 api/DebugController.cs                                                              |   41 +
 util/Settings.cs                                                                    |   15 
 api/ApiHelper.cs                                                                    |  279 ++++++++-----
 Models/TN_CG_Detail.cs                                                              |   13 
 process/TaskProcess.cs                                                              |  173 +++++---
 api/MoboxController.cs                                                              |   60 +-
 20 files changed, 940 insertions(+), 317 deletions(-)

diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3f7a8a50-7623-4582-a788-1727f4b734e0.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3f7a8a50-7623-4582-a788-1727f4b734e0.vsidx
deleted file mode 100644
index c9bf307..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3f7a8a50-7623-4582-a788-1727f4b734e0.vsidx
+++ /dev/null
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
new file mode 100644
index 0000000..c0d9b1a
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/49ec3933-2a6b-4835-ab77-24f5cfc05e26.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
new file mode 100644
index 0000000..d2fec1f
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/72178599-9865-468a-a3b6-7e0cf3fce2a8.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/74bd051a-76c6-4faf-9203-3846175eb944.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/74bd051a-76c6-4faf-9203-3846175eb944.vsidx
deleted file mode 100644
index 5dae330..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/74bd051a-76c6-4faf-9203-3846175eb944.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/79fc4010-d1c2-42bb-9f8f-a7b972ec34f6.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/79fc4010-d1c2-42bb-9f8f-a7b972ec34f6.vsidx
deleted file mode 100644
index 206014a..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/79fc4010-d1c2-42bb-9f8f-a7b972ec34f6.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
new file mode 100644
index 0000000..1ab47db
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/848a02bc-1e77-4a4d-8129-5fd396f4d138.vsidx
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
new file mode 100644
index 0000000..47a5694
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c30fdd47-6615-4811-b8bd-dfc4b98d2d2f.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/cfeb14b9-8063-424f-8831-ddd93cd9c6f5.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/cfeb14b9-8063-424f-8831-ddd93cd9c6f5.vsidx
deleted file mode 100644
index 6aaf23d..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/cfeb14b9-8063-424f-8831-ddd93cd9c6f5.vsidx
+++ /dev/null
Binary files differ
diff --git a/HH.WCS.Mobox3.DSZSH.csproj b/HH.WCS.Mobox3.DSZSH.csproj
index 62b0e59..5b3a82c 100644
--- a/HH.WCS.Mobox3.DSZSH.csproj
+++ b/HH.WCS.Mobox3.DSZSH.csproj
@@ -235,6 +235,7 @@
     <Compile Include="core\Monitor.cs" />
     <Compile Include="core\WCSCore.cs" />
     <Compile Include="core\WMSCore.cs" />
+    <Compile Include="device\TcpClientHelper.cs" />
     <Compile Include="process\TaskProcess.cs" />
     <Compile Include="util\SqlHelper.cs" />
     <Compile Include="models\TN_Container_Item.cs" />
diff --git a/Models/TN_CG_Detail.cs b/Models/TN_CG_Detail.cs
index 047d09d..f705e15 100644
--- a/Models/TN_CG_Detail.cs
+++ b/Models/TN_CG_Detail.cs
@@ -69,9 +69,18 @@
         /// </summary>
         public string S_QUALITY_GRADE { get; set; } = string.Empty;
 
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public int N_PRODUCT_LINE { get; set; } = 0; // NOTE 鍚庣画MES鍙兘浼氭彁渚涳紝鍏堝垱寤�
+
+        // ----------------
+
+        // TODO
+
         ///// <summary>
-        ///// 浜х嚎鍙�+        ///// 鐗╂枡鎵�湪鐨勫尯鍩�         ///// </summary>
-        //public int N_PRODUCT_LINE { get; set; } = 0; // NOTE 鍚庣画MES鍙兘浼氭彁渚涳紝鍏堝垱寤�
+        //public string S_AREA_CODE { get; set; } = string.Empty;
     }
 }
diff --git a/Program.cs b/Program.cs
index 5f4e00f..e3e9b9b 100644
--- a/Program.cs
+++ b/Program.cs
@@ -22,9 +22,9 @@
             // 2.0 寮�惎tcp
             StartTcp();
             // 3.0 寮�惎S7
-            StartS7();
+            //StartS7();
             // 4.0 寮�惎Modbus
-            StartModbus();
+            //StartModbus();
 
             // 5.0 寮�惎绾跨▼
             var rc = HostFactory.Run(x => {
@@ -113,6 +113,8 @@
             {
                 List<Task> tasks = new List<Task>();
 
+                tasks.Add(GetTask(WCSCore.Dispatch));
+
                 // 杞锛氬嚭搴撳崟鐘舵�
                 tasks.Add(GetTask(Monitor.CheckOutboundOrder));
 
diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index 3c352ae..9c71a92 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -32,7 +32,7 @@
             try {
                 // 灏哖DA鎻愪緵鐨勭墿鏂欑紪鐮佷笌璐存爣鏈虹殑淇℃伅姣斿
                 var cgDetail = db.Queryable<TN_CG_Detail>()
-                    .Where(d => d.S_ITEM_CODE == model.s_item_code && d.S_BATCH_NO == model.s_batch) // 鎸囧畾锛氱墿鏂欑紪鐮併�鎵规鍙�+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo) // 鎸囧畾锛氱墿鏂欑紪鐮併�鎵规鍙�                     .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮") // NOTE 鍐椾綑妫�煡锛氱墿鏂欑姸鎬佸簲璇ヤ负 1寰呮
                     .First();
 
@@ -43,19 +43,19 @@
                 }
 
                 var startLoc = db.Queryable<TN_Location>()
-                    .Where(a => a.S_CODE == model.s_start_loc) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
-                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(l => l.S_CODE == model.StartLoc) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
+                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
                     .First();
 
                 if (startLoc == null) {
-                    info = $"璧风偣浣嶇疆 '{model.s_start_loc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�;
+                    info = $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�;
                     LogHelper.Info(info);
                     return NewSimpleResult(3, info);
                 }
 
                 // 缁戝畾璐т綅鍜屽鍣ㄥ彿
                 var locCntrRel = new TN_Loc_Container {
-                    S_LOC_CODE = model.s_start_loc,
+                    S_LOC_CODE = model.StartLoc,
                     S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                     S_CNTR_TYPE = "濂借繍绠�,
                 };
@@ -72,7 +72,7 @@
                     .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)
-                    .OrderBy(l => l.S_AREA_CODE).First();
+                    .First();
 
                 if (endLoc == null) {
                     info = "婊$鍏ュ簱鏆傛椂娌℃湁鍚堥�鐨勮揣浣嶅彲浠ュ叆搴�;
@@ -83,8 +83,8 @@
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -94,7 +94,7 @@
                         it.T_MODIFY
                     }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
                         LogHelper.Info(info);
                         return NewSimpleResult(4, info);
                     }
@@ -105,29 +105,28 @@
                         it.S_LOCK_OP,
                         it.T_MODIFY
                     }).ExecuteCommand() <= 0) {
-
                         tran.RollbackTran();
-                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�;
                         LogHelper.Info(info);
                         return NewSimpleResult(4, info);
                     }
 
                     if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                         LogHelper.Info(info);
                         return NewSimpleResult(4, info);
                     }
 
                     tran.CommitTran();
-                    info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                    info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                     LogHelper.Info(info);
                     return NewSimpleResult(0, info);
                 }
             }
             catch (Exception ex) {
                 info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
-                LogHelper.Info(info);
+                LogHelper.InfoEx(ex);
                 return NewSimpleResult(1, info);
             }
         }
@@ -249,7 +248,9 @@
                     .First();
 
                 if (startLoc == null) {
-                    return NewSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
+                    info = $"璧风偣浣嶇疆{model.StartLoc}涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�;
+                    LogHelper.Info(info);
+                    return NewSimpleResult(2, info);
                 }
 
                 // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�@@ -258,55 +259,70 @@
                     .First();
 
                 if (locCntrRel == null) {
-                    return NewSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
+                    info = $"璧风偣浣嶇疆{model.StartLoc}娌℃湁缁戝畾瀹瑰櫒{model.CntrCode}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(3, info);
                 }
 
                 // 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();
+                    .First();
 
                 if (endLoc == null) {
-                    return NewSimpleResult(4, $"鏆傛椂娌℃湁绗﹀悎鏉′欢鐨勭粓鐐规斁璐т綅");
+                    info = $"鏆傛椂娌℃湁绗﹀悎鏉′欢鐨勭粓鐐规斁璐т綅";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(4, info);
                 }
 
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     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) {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     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) {
-
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     tran.CommitTran();
-                    return NewSimpleResult(0,
-                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
                 }
             }
             catch (Exception ex) {
                 info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
-                LogHelper.Info(info);
+                LogHelper.InfoEx(ex);
                 return NewSimpleResult(1, info);
             }
         }
@@ -327,7 +343,9 @@
                     .First();
 
                 if (startLoc == null) {
-                    return NewSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
+                    info = $"璧风偣浣嶇疆{model.StartLoc}涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�;
+                    LogHelper.Info(info);
+                    return NewSimpleResult(2, info);
                 }
 
                 // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�@@ -336,7 +354,9 @@
                     .First();
 
                 if (locCntrRel == null) {
-                    return NewSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
+                    info = $"璧风偣浣嶇疆{model.StartLoc}娌℃湁缁戝畾瀹瑰櫒{model.CntrCode}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(3, info);
                 }
 
                 // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
@@ -352,38 +372,51 @@
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     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) {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     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) {
-
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     tran.CommitTran();
-                    return NewSimpleResult(0,
-                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
                 }
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -431,8 +464,8 @@
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -442,8 +475,9 @@
                         it.T_MODIFY
                     }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
@@ -452,25 +486,29 @@
                         it.S_LOCK_OP,
                         it.T_MODIFY
                     }).ExecuteCommand() <= 0) {
-
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     tran.CommitTran();
-                    return NewSimpleResult(0,
-                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
                 }
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -517,38 +555,51 @@
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     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) {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     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) {
-
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(500,
-                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                        info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
                     }
 
                     tran.CommitTran();
-                    return NewSimpleResult(0,
-                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
                 }
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -621,7 +672,9 @@
                 return NewSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
         /// <summary>
@@ -693,8 +746,8 @@
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
@@ -744,7 +797,7 @@
             }
             catch (Exception ex) {
                 info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
-                LogHelper.Info(info);
+                LogHelper.InfoEx(ex);
                 return NewSimpleResult(1, info);
             }
         }
@@ -798,8 +851,8 @@
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
@@ -848,7 +901,9 @@
                 }
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -859,6 +914,7 @@
             try {
                 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") // 绛涢�锛氭湭涓婇攣
                     .First();
 
                 var locCntrRel = db.Queryable<TN_Loc_Container>()
@@ -879,8 +935,8 @@
                 var cntId = locCntrRel.S_CNTR_CODE;
                 var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -922,8 +978,9 @@
                 }
             }
             catch (Exception ex) {
-
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -1047,7 +1104,9 @@
                 return NewSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�);
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -1107,7 +1166,9 @@
                 return NewSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�);
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -1172,7 +1233,7 @@
             }
             catch (Exception ex) {
                 info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
-                LogHelper.Info(info);
+                LogHelper.InfoEx(ex);
                 return result;
             }
         }
@@ -1246,7 +1307,9 @@
                 return NewSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
             }
             catch (Exception ex) {
-                return BuildSimpleEx(ex);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewSimpleResult(1, info);
             }
         }
 
@@ -1266,11 +1329,10 @@
             }
             catch (Exception ex) {
                 info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
-                LogHelper.Info(info);
+                LogHelper.InfoEx(ex);
                 return result;
             }
         }
-
 
         private static string GenerateOrderNo(string snType, string prefix) {
             var id = SYSHelper.GetSerialNumber(snType, prefix);
@@ -1286,12 +1348,13 @@
         public static WmsResult CgInfoSync(CgInfoSyncInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var random = new Random();
+            var info = "";
 
             try {
                 var detail = new TN_CG_Detail {
                     S_ITEM_CODE = model.ItemCode,
                     S_ITEM_NAME = model.ItemName,
-                    S_CNTR_CODE = Guid.NewGuid().ToString("D"), // NOTE 瀹瑰櫒鍙凤細鐩墠闅忔満锛堝悗鏈熷彲鑳戒細鎸囧畾锛屾垨鑰匬DA缁戝畾鏃跺啀濉叆锛�+                    S_CNTR_CODE = GenerateOrderNo("瀹瑰櫒鍙�, "CN"), // NOTE 瀹瑰櫒鍙凤細鐩墠闅忔満锛堝悗鏈熷彲鑳戒細鎸囧畾锛屾垨鑰匬DA缁戝畾鏃跺啀濉叆锛�                     S_BATCH_NO = model.BatchNo,
                     S_STANDARD = model.Standard,
                     S_NET_WEIGHT = model.NetWeight,
@@ -1299,31 +1362,35 @@
                     //N_PRODUCT_LINE = random.Next(0, 3), // NOTE 浜х嚎鍙凤細鐩墠闅忔満锛堝悗鏈熷彲鑳戒細鎸囧畾锛屾垨鑰匬DA缁戝畾鏃跺啀濉叆锛�                 };
 
-                // 璐т綅瀹瑰櫒缁戝畾鐨勯�杈戯紝鍦ㄥソ杩愮涓嬬嚎PDA鐨勬祦绋嬩腑鎿嶄綔
-
                 //var locCntrRel = new TN_Loc_Container {
                 //    //S_LOC_CODE = Settings.Config.ProductionLines[detail.N_PRODUCT_LINE].OffLoc[0], // 濂借繍绠辩殑浣嶇疆鏄搷浣滃尯锛屼笉鏄骇绾�                 //    S_CNTR_CODE = detail.S_CNTR_CODE,
                 //    S_CNTR_TYPE = "濂借繍绠�, // 璐存爣鏈哄彧閽堝濂借繍绠�                 //};
 
-                //using (var tran = db.Ado.UseTran()) {
-                //    if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0
-                //        && db.Insertable<TN_Loc_Container>(detail).ExecuteCommand() <= 0) {
-                //        tran.RollbackTran();
-                //        return MesResultBuilder(2, "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail));
-                //    }
-                //    tran.CommitTran();
-                //}
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail);
+                        return NewWmsResult(2, info);
+                    }
 
-                if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0) {
-                    return MesResultBuilder(2, "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail));
+                    //if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                    //    tran.RollbackTran();
+                    //    info = "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail);
+                    //    return NewWmsResult(2, info);
+                    //}
+
+                    tran.CommitTran();
                 }
 
-                return MesResultBuilder(0, "鎻掑叆鐗╂枡淇℃伅鎴愬姛");
+                info = "鎻掑叆鐗╂枡淇℃伅鎴愬姛";
+                return NewWmsResult(0, info);
             }
             catch (Exception ex) {
-                return MesResultBuilder(1, ex.Message);
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewWmsResult(1, info);
             }
         }
     }
diff --git a/api/ApiModel.cs b/api/ApiModel.cs
index 9f65d18..5a5ac90 100644
--- a/api/ApiModel.cs
+++ b/api/ApiModel.cs
@@ -28,20 +28,6 @@
         }
 
         /// <summary>
-        /// 鏋勫缓 <see cref="SimpleResult"/> 寮傚父杩斿洖鍊硷紝閫夋嫨鎵撳嵃寮傚父鏃ュ織淇℃伅锛堥粯璁ゆ墦鍗帮級
-        /// </summary>
-        /// <param name="ex"></param>
-        /// <param name="exCode"></param>
-        /// <param name="pringLog"></param>
-        /// <returns></returns>
-        public static SimpleResult BuildSimpleEx(Exception ex, int exCode = 1, bool pringLog = true) {
-            if (pringLog) {
-                LogHelper.InfoEx(ex);
-            }
-            return new SimpleResult { resultCode = exCode, resultMsg = ex.Message };
-        }
-
-        /// <summary>
         /// HostToAGV 涓婃姤浠诲姟鐘舵�
         /// </summary>
         public class AgvTaskState {
@@ -69,7 +55,7 @@
 
         public class SafetyInteractionInfo {
 
-            public int station_id { get; set; }
+            //public int station_id { get; set; }
 
             /// <summary>
             /// 璇锋眰涓婄嚎/涓嬬嚎鐨勭殑绔欏彴搴撲綅鍚嶇О锛屼緥濡倃ork6銆亀ork8
@@ -80,7 +66,7 @@
             /// 璇锋眰鐮�             /// </summary>
             public string apply_code { get; set; }
-            public string task_no { set; get; }
+            //public string task_no { set; get; }
         }
 
         /// <summary>
@@ -89,6 +75,10 @@
         public class ReturnResult {
             public int ResultCode { get; set; }
             public string ResultMsg { get; set; }
+        }
+
+        public static ReturnResult NewReturnResult(int code, string message) {
+            return new ReturnResult { ResultCode = code, ResultMsg = message };
         }
 
         public class orderStatusReportParme {
@@ -153,13 +143,10 @@
         /// 杩斿洖缁橤Z
         /// </summary>
         public class GzResult {
-
             public int resultCode { get; set; }
             public string msg { get; set; }
             public int orderID { get; set; }
         }
-
-
 
     }
 
@@ -172,7 +159,8 @@
             /// <summary>
             /// 鐗╂枡缂栫爜
             /// </summary>
-            public string s_item_code { get; set; }
+            [JsonProperty("s_item_code")]
+            public string ItemCode { get; set; }
             ///// <summary>
             ///// 鐗╂枡鍚嶇О
             ///// </summary>
@@ -181,20 +169,23 @@
             /// <summary>
             /// 鎵规鍙�             /// </summary>
-            public string s_batch { get; set; }
+            [JsonProperty("s_batch")]
+            public string BatchNo { get; set; }
             /// <summary>
             /// 鐗╂枡瑙勬牸
             /// </summary>
-        
+            [JsonProperty("s_spec")]
             public string s_spec { get; set; }
             /// <summary>
             /// 鏁伴噺
             /// </summary>
+            [JsonProperty("n_num")]
             public int n_num { get; set; }
             /// <summary>
             /// 璧风偣璐т綅淇℃伅
             /// </summary>
-            public string s_start_loc { get; set; }
+            [JsonProperty("s_start_loc")]
+            public string StartLoc { get; set; }
         }
         /// <summary>
         /// 绌烘墭/绌虹鍏ュ簱缁戝畾(PDA)鏁版嵁绫�@@ -559,10 +550,7 @@
             public string Data { get; set; }
         }
 
-        public static WmsResult MesResultBuilder(int code, string message = "", bool printLog = true) {
-            if (printLog && string.IsNullOrEmpty(message)) {
-                LogHelper.Info(message);
-            }
+        public static WmsResult NewWmsResult(int code, string message = "", bool printLog = true) {
             return new WmsResult {
                 Result = code,
                 Success = code == 0, // 浠呭綋code=0鏃讹紝success=true
diff --git a/api/DebugController.cs b/api/DebugController.cs
index 2a5c8bd..2ce3d54 100644
--- a/api/DebugController.cs
+++ b/api/DebugController.cs
@@ -3,6 +3,7 @@
 using System.Runtime.ConstrainedExecution;
 using System.Web.Http;
 
+using HH.WCS.Mobox3.DSZSH.core;
 using HH.WCS.Mobox3.DSZSH.models;
 using HH.WCS.Mobox3.DSZSH.util;
 
@@ -18,15 +19,45 @@
     public class DebugController : ApiController
     {
         /// <summary>
-        /// 妯℃嫙 AGV 澶氭鍥炴姤浠诲姟鐘舵�
+        /// AGV鐘舵�涓�敭鍥炴姤134562
         /// </summary>
         /// <param name="model">瀹瑰櫒鍙�/param>
         /// <returns></returns>
         [HttpPost]
-        [Route("AgvSeriesReports")]
-        public ReturnResults AgvSeriesReports(UpdateTaskState model)
-        {
-            return new ReturnResults();
+        [Route("AGVSeriesReports")]
+        public ReturnResults AGVSeriesReports(UpdateTaskState model) {
+            var agvTaskState = new AgvTaskState() {
+                task_no = model.TaskID,
+                forklift_no = model.ForkliftNo,
+                state = 1
+            };
+            ReturnResults returnResult = new ReturnResults();
+            returnResult.ResultList = new List<ReturnResult>();
+
+            var temp1 = WCSCore.OperateAgvTaskStatus(agvTaskState);
+            returnResult.ResultList.Add(temp1);
+
+            agvTaskState.state = 3;
+            var temp3 = WCSCore.OperateAgvTaskStatus(agvTaskState);
+            returnResult.ResultList.Add(temp3);
+
+            agvTaskState.state = 4;
+            var temp4 = WCSCore.OperateAgvTaskStatus(agvTaskState);
+            returnResult.ResultList.Add(temp4);
+
+            agvTaskState.state = 5;
+            var temp5 = WCSCore.OperateAgvTaskStatus(agvTaskState);
+            returnResult.ResultList.Add(temp5);
+
+            agvTaskState.state = 6;
+            var temp6 = WCSCore.OperateAgvTaskStatus(agvTaskState);
+            returnResult.ResultList.Add(temp6);
+
+            agvTaskState.state = 2;
+            var temp2 = WCSCore.OperateAgvTaskStatus(agvTaskState);
+            returnResult.ResultList.Add(temp2);
+
+            return returnResult;
         }
 
         /// <summary>
diff --git a/api/MoboxController.cs b/api/MoboxController.cs
index a309518..36a11bf 100644
--- a/api/MoboxController.cs
+++ b/api/MoboxController.cs
@@ -21,7 +21,9 @@
         [HttpPost]
         [Route("goodpack-offline")]
         public SimpleResult GoodpackOffline(GoodpackOfflineInfo model) {
-            LogHelper.InfoApi("濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)", model);
+            var apiName = "濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)";
+            LogHelper.InfoApi(apiName, model);
+
             return ApiHelper.GoodpackOffline(model);
         }
 
@@ -54,7 +56,8 @@
         [HttpPost]
         [Route("empty-inbound")]
         public SimpleResult EmptyInbound(EmptyInboundInfo model) {
-            LogHelper.InfoApi("绌烘墭/绌虹鍏ュ簱", model);
+            var apiName = "绌烘墭/绌虹鍏ュ簱";
+            LogHelper.InfoApi(apiName, model);
 
             if (model.CntrType == "鎵樼洏") {
                 return ApiHelper.EmptyInboundPallet(model);
@@ -107,6 +110,8 @@
         [HttpPost]
         [Route("empty-online-pallet")]
         public SimpleResult EmptyOnlinePallet(EmptyOnlinePalletInfo model) {
+            var apiName = "鎵樼洏-绌烘墭涓婄嚎(PDA)";
+            LogHelper.InfoApi(apiName, model);
             return ApiHelper.EmptyOnlinePallet(model);
         }
 
@@ -118,6 +123,8 @@
         [HttpPost]
         [Route("empty-online-goodpack")]
         public SimpleResult EmptyOnlineGoodpack(EmptyOnlineGoodpackInfo model) {
+            var apiName = "濂借繍绠�绌虹涓婄嚎(PDA)";
+            LogHelper.InfoApi(apiName, model);
             return ApiHelper.EmptyOnlineGoodpack(model);
         }
 
@@ -146,6 +153,8 @@
         [HttpPost]
         [Route("qualified-back")]
         public SimpleResult QualifiedBack(QualifiedBackInfo model) {
+            var apiName = "鍚堟牸鍥炲簱(PDA)";
+            LogHelper.InfoApi(apiName, model);
             return ApiHelper.QualifiedBack(model);
         }
 
@@ -156,6 +165,8 @@
         [HttpPost]
         [Route("unqualified-shift")]
         public SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
+            var apiName = "涓嶅悎鏍肩Щ搴�PDA)";
+            LogHelper.InfoApi(apiName, model);
             return ApiHelper.UnqualifiedShift(model);
         }
 
@@ -167,6 +178,8 @@
         [HttpPost]
         [Route("rest-back")]
         public SimpleResult RestBack(RestBackInfo model) {
+            var apiName = "浣欐枡灏剧鍥炲簱(PDA)";
+            LogHelper.InfoApi(apiName, model);
             return ApiHelper.RestBack(model);
         }
 
@@ -178,7 +191,8 @@
         [HttpPost]
         [Route("finished-outbound")]
         public SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
-            LogHelper.InfoApi("鎴愬搧鑳跺嚭搴�PDA)", model);
+            var apiName = "鎴愬搧鑳跺嚭搴�PDA)";
+            LogHelper.InfoApi(apiName, model);
 
             if (model.ForcedOut) {
                 return ApiHelper.FinishedOutboundForce(model);
@@ -188,26 +202,26 @@
             }
         }
 
-        /// <summary>
-        /// 鎶芥-鍒涘缓鎶芥鍗�WMS)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        [HttpPost]
-        [Route("create-check-order")]
-        public SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
-            return ApiHelper.CreateCheckOrder(model);
-        }
+        ///// <summary>
+        ///// 鎶芥-鍒涘缓鎶芥鍗�WMS)
+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //[HttpPost]
+        //[Route("create-check-order")]
+        //public SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
+        //    return ApiHelper.CreateCheckOrder(model);
+        //}
 
-        /// <summary>
-        /// 绉诲簱-鍒涘缓绉诲簱浠诲姟(WMS)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        [HttpPost]
-        [Route("shift-storage")]
-        public SimpleResult CreateShiftOrder(CreateShiftOrderInfo model) {
-            return ApiHelper.CreateShiftOrder(model);
-        }
+        ///// <summary>
+        ///// 绉诲簱-鍒涘缓绉诲簱浠诲姟(WMS)
+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //[HttpPost]
+        //[Route("shift-storage")]
+        //public SimpleResult CreateShiftOrder(CreateShiftOrderInfo model) {
+        //    return ApiHelper.CreateShiftOrder(model);
+        //}
     }
 }
diff --git a/core/Monitor.cs b/core/Monitor.cs
index 0dce8c5..728acbe 100644
--- a/core/Monitor.cs
+++ b/core/Monitor.cs
@@ -11,10 +11,42 @@
 
 namespace HH.WCS.Mobox3.DSZSH.core {
     public class Monitor {
+        public static void CheckInbound() {
+            var taskName = TaskName.鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                // 鏌ヤ骇绾挎槸鍚︽湁鐗╂枡淇℃伅
+
+                var itemCode = "";
+                var batchNo = "";
+                var cntrCode = "";
+                var startLocCode = "";
+
+                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") // 绛涢�锛氭湭涓婇攣
+                    .First();
+
+                
+
+            }
+            catch (Exception ex) {
+                LogHelper.InfoEx(ex);
+            }
+
+        }
+
         public static void CheckOutboundOrder() {
             var taskName = TaskName.鎴愬搧鑳跺嚭搴�
             var db = new SqlHelper<object>().GetInstance();
-            var info = "";
+            var info = $"杞--{taskName}--";
 
             try {
                 var orderList = db.Queryable<TN_Outbound_Order>()
@@ -23,7 +55,8 @@
                     .ToList();
 
                 if (orderList.Count == 0) {
-                    LogHelper.Info("杞--鍑哄簱--鏆傛棤寰呮墽琛岀殑Order");
+                    info += $"鏆傛棤寰呮墽琛岀殑{taskName}鍗�;
+                    LogHelper.Info(info);
                     return;
                 }
 
@@ -33,7 +66,8 @@
                         .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�                     var allCount = db.Queryable<TN_Outbound_Detail>()
                         .Count(d => d.S_OO_NO == order.S_NO);
-                    LogHelper.Info($"杞--鍑哄簱--缁熻鍑哄簱鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
+                    info += $"缁熻{taskName}鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}";
+                    LogHelper.Info(info);
 
                     if (doingCount == allCount) {
                         order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
@@ -44,16 +78,20 @@
                     var lastDetail = db.Queryable<TN_Outbound_Detail>()
                         .Where(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == 2) // TODO 鎴栬�鏀规垚鏌ask
                         .First();
+
                     if (lastDetail != null) {
-                        LogHelper.Info($"杞--鍑哄簱--鍑哄簱鍗�{order.S_NO}'涓婁竴涓换鍔′粛鍦ㄨ繘琛屼腑锛� + JsonConvert.SerializeObject(lastDetail));
+                        info += $"{taskName}鍗�{order.S_NO}'涓婁竴涓换鍔′粛鍦ㄨ繘琛屼腑锛� + JsonConvert.SerializeObject(lastDetail);
+                        LogHelper.Info(info);
                         continue;
                     }
 
                     var outboundDetail = db.Queryable<TN_Outbound_Detail>()
                         .Where(a => a.S_OO_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�                         .First();
-                    if (outboundDetail != null) {
-                        LogHelper.Info($"杞--鍑哄簱--");
+
+                    if (outboundDetail == null) {
+                        info += $"浠嶆湁浠诲姟鏈墽琛屽畬鎴愶紝浣嗗綋鍓嶆病鏈夊凡涓嬪彂鐨勪换鍔�;
+                        LogHelper.Info(info);
                         continue;
                     }
 
@@ -61,13 +99,9 @@
                 }
 
                 if (detailList.Count == 0) {
+                    // 涓婇潰娴佺▼宸茬粡鎵撳嵃杩囨棩蹇�                     return;
                 }
-
-                var startLocList = new List<TN_Location>();
-                var endLocList = new List<TN_Location>();
-
-                var taskList = new List<TN_Task>();
 
                 foreach (var detail in detailList) {
                     var startLoc = db.Queryable<TN_Location>()
@@ -76,7 +110,7 @@
                         .First();
 
                     if (startLoc == null) {
-                        LogHelper.Info($"杞--鍑哄簱锛氭病鏈夋壘鍒板悎閫傜殑璧风偣璐т綅锛�);
+                        LogHelper.Info($"杞--{taskName}锛氭病鏈夋壘鍒板悎閫傜殑璧风偣璐т綅锛�);
                         continue;
                     }
 
@@ -86,7 +120,7 @@
                         .Where(a => a.N_CURRENT_NUM == 0).First();
 
                     if (endLoc == null) {
-                        LogHelper.Info($"杞--鍑哄簱锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛丼_NO涓�'{detail.S_OO_NO}'锛岃姹侫rea涓�'{detail.S_END_AREA}'");
+                        LogHelper.Info($"杞--{taskName}锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛佸崟鍙�{detail.S_OO_NO}'瑕佹眰缁堢偣搴撳尯涓�{detail.S_END_AREA}'");
                         continue;
                     }
 
@@ -95,13 +129,15 @@
                     var cntId = detail.S_CNTR_CODE;
                     var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                    LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                    LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                    LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                    LocationHelper.LockLoc(ref endLoc, 1); // 缁堢偣鍏ュ簱閿� 
                     using (var tran = db.Ado.UseTran()) {
                         if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
-                            LogHelper.Info($"杞--鍑哄簱--淇敼鏄庣粏琛ㄧ姸鎬佷负瀹屾垚澶辫触锛�);
+                            info += $"淇敼鏄庣粏琛ㄧ姸鎬佷负瀹屾垚--澶辫触锛�;
+                            LogHelper.Info(info);
+                            continue;
                         }
 
                         if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -111,7 +147,7 @@
                             it.T_MODIFY
                         }).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
-                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            info += $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
                             LogHelper.Info(info);
                             continue;
                         }
@@ -122,28 +158,28 @@
                             it.S_LOCK_OP,
                             it.T_MODIFY
                         }).ExecuteCommand() <= 0) {
-
                             tran.RollbackTran();
-                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            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}";
+                            info += $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                             LogHelper.Info(info);
                             continue;
                         }
 
                         tran.CommitTran();
-                        info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        info += $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                         LogHelper.Info(info);
                         continue;
                     }
                 }
             }
             catch (Exception ex) {
+                info += $"鍙戠敓浜嗗紓甯革細{ex.Message}";
                 LogHelper.InfoEx(ex);
             }
         }
@@ -152,6 +188,7 @@
             var taskName = TaskName.鎶芥_鍑哄簱;
             var db = new SqlHelper<object>().GetInstance();
             var info = "";
+
             try {
                 var orderList = db.Queryable<TN_Check_Order>()
                     .Where(c => c.N_B_STATE == 1)
@@ -182,7 +219,7 @@
                         .ToList();
 
                     if (checkDetailList.Count == 0) {
-                        LogHelper.Info($"杞--");
+                        LogHelper.Info($"杞--{taskName}--浠嶆湁浠诲姟鏈墽琛屽畬鎴愶紝浣嗗綋鍓嶆病鏈夊凡涓嬪彂鐨勪换鍔�);
                         continue;
                     }
 
@@ -217,8 +254,8 @@
                     var cntId = detail.S_CNTR_CODE;
                     var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                    LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                    LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                    LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                    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) {
@@ -234,7 +271,7 @@
                             it.T_MODIFY
                         }).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
-                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
                             LogHelper.Info(info);
                             continue;
                         }
@@ -246,20 +283,20 @@
                             it.T_MODIFY
                         }).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
-                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            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}";
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                             LogHelper.Info(info);
                             continue;
                         }
 
                         tran.CommitTran();
-                        info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                         LogHelper.Info(info);
                         continue;
                     }
@@ -304,7 +341,7 @@
                         .ToList();
 
                     if (checkDetailList.Count == 0) {
-                        LogHelper.Info($"杞--");
+                        LogHelper.Info($"杞--{taskName}--浠嶆湁浠诲姟鏈墽琛屽畬鎴愶紝浣嗗綋鍓嶆病鏈夊凡涓嬪彂鐨勪换鍔�);
                         continue;
                     }
 
@@ -339,8 +376,8 @@
                     var cntId = detail.S_CNTR_CODE;
                     var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
 
-                    LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�-                    LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+                    LocationHelper.LockLoc(ref startLoc, 2); // 璧风偣鍑哄簱閿�+                    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) {
@@ -356,7 +393,7 @@
                             it.T_MODIFY
                         }).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
-                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�;
                             LogHelper.Info(info);
                             continue;
                         }
@@ -368,20 +405,20 @@
                             it.T_MODIFY
                         }).ExecuteCommand() <= 0) {
                             tran.RollbackTran();
-                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            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}";
+                            info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                             LogHelper.Info(info);
                             continue;
                         }
 
                         tran.CommitTran();
-                        info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屽鍣ㄥ彿{cntId}锛岃捣鐐箋startLoc.S_CODE}锛岀粓鐐硅揣鏋秢endLoc.S_CODE}";
                         LogHelper.Info(info);
                         continue;
                     }
diff --git a/core/WCSCore.cs b/core/WCSCore.cs
index 95eff3f..5fbf07f 100644
--- a/core/WCSCore.cs
+++ b/core/WCSCore.cs
@@ -5,7 +5,6 @@
 using System.Threading.Tasks;
 
 using HH.WCS.Mobox3.DSZSH.device;
-
 using HH.WCS.Mobox3.DSZSH.models;
 using HH.WCS.Mobox3.DSZSH.process;
 using HH.WCS.Mobox3.DSZSH.util;
@@ -14,7 +13,6 @@
 using Newtonsoft.Json;
 
 using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
-
 
 namespace HH.WCS.Mobox3.DSZSH.core {
     public class WCSCore {
@@ -102,11 +100,11 @@
                 case 2: // 瀹屾垚
                     WCSHelper.End(TN_Task); // 浠诲姟鐘舵�鏀规垚缁撴潫
 
-                    if (TN_Task.S_TYPE == TaskName.鎶芥_鍑哄簱) {
-                        var checkCompleteTask = Task.Run(() => {
-                            UpdateCheckTaskState(3);
-                        });
-                    }
+                    //if (TN_Task.S_TYPE == TaskName.鎶芥_鍑哄簱) {
+                    //    var checkCompleteTask = Task.Run(() => {
+                    //        UpdateCheckTaskState(3);
+                    //    });
+                    //}
 
                     break;
                 case 7: // 寮傚父
@@ -123,45 +121,90 @@
         }
 
         public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
-            var gzResult = new ReturnResult();
             var db = new SqlHelper<object>().GetInstance();
-            ModbusHelper.Relink();
+            var info = "";
 
             try {
-
+                ModbusHelper.Relink();
 
                 var prodLineInfo = Settings.ProductionLines[0];
+
                 var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort);
                 if (!prodLineDevice.LoadDeviceStateOk()) {
-                    LogHelper.Info("鍔犺浇璁惧淇℃伅澶辫触");
+                    info = "涓庝骇绾胯澶囬�璁け璐�;
+                    LogHelper.Info(info);
+                    return NewReturnResult(2, info);
                 }
 
-                var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.task_no);
-                if (tn_task == null) {
-                    LogHelper.Info($"浠诲姟鍙�'{model.task_no}' 涓嶅瓨鍦�);
+                //var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.task_no);
+                //if (tn_task == null) {
+                //    LogHelper.Info($"浠诲姟鍙�'{model.task_no}' 涓嶅瓨鍦�);
+                //}
+                //if (prodLineDevice.SystemState == 1) {
+                //    if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱) {
+                //        prodLineDevice.AgvPicking = 1;
+                //    }
+                //    if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_绌烘墭涓婄嚎) {
+                //        prodLineDevice.AgvPlacingPallet = 1;
+                //    }
+                //}
+
+                if (prodLineDevice.SystemState != 1) {
+                    info = $"褰撳墠浜х嚎鏃犳硶涓嶢GV鑱斿姩锛氱姸鎬亄prodLineDevice.SystemState}";
+                    LogHelper.Info(info);
+                    return NewReturnResult(3, info);
                 }
 
-                // 寰呬慨鏀癸細琛ュ厖涓嶅悓鍒嗘敮AGV鍒ゆ柇
-                if (prodLineDevice.SystemState == 1) {
-                    if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱) {
-                        prodLineDevice.AgvPicking = 1;
+                if (model.apply_code == "5") {
+                    if (prodLineDevice.FullOffline != 1) {
+                        info = $"褰撳墠杈撻�绾挎弧鏂欎笅绾夸俊鍙蜂笉涓�锛屾棤娉曞彇璐�;
+                        LogHelper.Info(info);
+                        return NewReturnResult(4, info);
                     }
-                    if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_绌烘墭涓婄嚎) {
-                        prodLineDevice.AgvPlacingPallet = 1;
+                    
+                    if (!prodLineDevice.SetAgvPicking(1)) {
+                        info = $"鍚戣緭閫佺嚎鍐欏叆鍏佽鍙栬揣淇″彿澶辫触";
+                        LogHelper.Info(info);
+                        return NewReturnResult(5, info);
                     }
+                    
+                    info = $"鍚戣緭閫佺嚎鍐欏叆鍏佽鍙栬揣淇″彿鎴愬姛";
+                    LogHelper.Info(info);
+                    return NewReturnResult(0, info);
+
+                }
+                else if (model.apply_code == "1") {
+                    if (prodLineDevice.AllowAgvPlacePallet != 1) {
+                        info = $"褰撳墠杈撻�绾垮厑璁告斁鎵樼洏淇″彿涓嶄负1锛屾棤娉曟斁璐�;
+                        LogHelper.Info(info);
+                        return NewReturnResult(6, info);
+                    }
+
+                    if (!prodLineDevice.SetAgvPlacingPallet(1)) {
+                        info = $"鍚戣緭閫佺嚎鍐欏叆鍏佽鏀捐揣淇″彿澶辫触";
+                        LogHelper.Info(info);
+                        return NewReturnResult(7, info);
+                    }
+
+                    info = $"鍚戣緭閫佺嚎鍐欏叆鍏佽鏀捐揣淇″彿鎴愬姛";
+                    LogHelper.Info(info);
+                    return NewReturnResult(0, info);
+                }
+                else {
+                    info = $"褰撳墠杈撻�绾垮厑璁�;
+                    LogHelper.Info(info);
+                    return NewReturnResult(8, info);
                 }
 
-                LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented));
-                return gzResult;
             }
             catch (Exception ex) {
-                LogHelper.Info($"鍙戠敓浜嗗紓甯革細{ex.Message}");
-                return gzResult;
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.InfoEx(ex);
+                return NewReturnResult(1, info);
             }
         }
 
         public static void UpdateOutboundTaskState(int spotStateCode) {
-
             var db = new SqlHelper<object>().GetInstance();
 
             var detail = db.Queryable<TN_Outbound_Detail>()
@@ -280,5 +323,26 @@
                 tran.CommitTran();
             }
         }
+
+        /// <summary>
+        /// 浠诲姟鍒嗗彂锛屾牴鎹皟搴︾被鍨嬪彂缁欎笉鍚岀殑璋冨害绯荤粺
+        /// </summary>
+        internal static void Dispatch() {
+            //鏌ヨ浠诲姟
+            //鑾峰彇鎵�湁绛夊緟鐨勪换鍔�+            var list = WCSHelper.GetWaitingTaskList();
+            LogHelper.Info("绛夊緟浠诲姟淇℃伅" + JsonConvert.SerializeObject(list), "API");
+            if (list.Count > 0) {
+                list.ForEach(task => {
+                    //浣跨敤鑷畾涔変换鍔℃帹閫�+                    TaskProcess.SendTask(task);//璋冨害NDC鎴栨澀濂ユ垨鍥借嚜璁惧
+                    //TaskProcess.SendGZTask(task);///璋冨害鍥借嚜璁惧
+
+                });
+            }
+            else {
+                LogHelper.Info("鏆傛棤浠诲姟");
+            }
+        }
     }
 }
diff --git a/device/ProductionLineDevice.cs b/device/ProductionLineDevice.cs
index d6d6b04..4eaf326 100644
--- a/device/ProductionLineDevice.cs
+++ b/device/ProductionLineDevice.cs
@@ -1,6 +1,7 @@
 锘縰sing System;
 
 using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
 
 namespace HH.WCS.Mobox3.DSZSH.device {
     /// <summary>
@@ -46,29 +47,65 @@
         /// </summary>
         public int AllowAgvPlacePallet { get; set; }
 
-        private int _agvPicking;
-        private int _agvPlacingPallet;
+        //private int _agvPicking;
+        //private int _agvPlacingPallet;
+
+        ///// <summary>
+        ///// AGV 姝e湪鍙栬揣锛氫笅绾緼GV鍐欏叆1锛屽彇璐у畬鎴愬悗鎭㈠0
+        ///// </summary>
+        //public int AgvPicking {
+        //    get => _agvPicking;
+        //    set {
+        //        var isOk = ModbusHelper.WriteSingleRegister(10, value, Ip, Port);
+        //        _agvPicking = isOk ? value : throw new Exception($"淇敼 [AGV 姝e湪鍙栬揣] 涓�'{value}' 澶辫触");
+        //    }
+        //}
 
         /// <summary>
         /// AGV 姝e湪鍙栬揣锛氫笅绾緼GV鍐欏叆1锛屽彇璐у畬鎴愬悗鎭㈠0
         /// </summary>
-        public int AgvPicking {
-            get => _agvPicking;
-            set {
-                var isOk = ModbusHelper.WriteSingleRegister(10, value, Ip, Port);
-                _agvPicking = isOk ? value : throw new Exception($"淇敼 [AGV 姝e湪鍙栬揣] 涓�'{value}' 澶辫触");
+        public int AgvPicking { get; set; }
+
+        /// <summary>
+        /// AGV 姝e湪鍙栬揣锛氫笅绾緼GV鍐欏叆1锛屽彇璐у畬鎴愬悗鎭㈠0
+        /// </summary>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public bool SetAgvPicking(int value) {
+            if (!ModbusHelper.WriteSingleRegister(10, value, Ip, Port)) {
+                return false;
             }
+
+            AgvPicking = value;
+            return true;
         }
+
+        ///// <summary>
+        ///// AGV 姝e湪鏀炬墭鐩樺灈锛氫笂绾緼GV鍐欏叆1锛屾斁鎵樺畬鎴愬悗鎭㈠0
+        ///// </summary>
+        //public int AgvPlacingPallet {
+        //    get => _agvPlacingPallet;
+        //    set {
+        //        var isOk = ModbusHelper.WriteSingleRegister(11, value, Ip, Port);
+        //        _agvPlacingPallet = isOk ? value : throw new Exception($"淇敼 [AGV 姝e湪鏀炬墭鐩樺灈] 涓�'{value}' 澶辫触");
+        //    }
+        //}
 
         /// <summary>
         /// AGV 姝e湪鏀炬墭鐩樺灈锛氫笂绾緼GV鍐欏叆1锛屾斁鎵樺畬鎴愬悗鎭㈠0
         /// </summary>
-        public int AgvPlacingPallet {
-            get => _agvPlacingPallet;
-            set {
-                var isOk = ModbusHelper.WriteSingleRegister(11, value, Ip, Port);
-                _agvPlacingPallet = isOk ? value : throw new Exception($"淇敼 [AGV 姝e湪鏀炬墭鐩樺灈] 涓�'{value}' 澶辫触");
+        public int AgvPlacingPallet { get; set; }
+
+        /// <summary>
+        /// AGV 姝e湪鏀炬墭鐩樺灈锛氫笂绾緼GV鍐欏叆1锛屾斁鎵樺畬鎴愬悗鎭㈠0
+        /// </summary>
+        public bool SetAgvPlacingPallet(int value) {
+            if (!ModbusHelper.WriteSingleRegister(11, value, Ip, Port)) {
+                return false;
             }
+
+            AgvPlacingPallet = value;
+            return true;
         }
 
         public bool LoadDeviceStateOk() {
@@ -83,8 +120,10 @@
             CallPallet = readArray[2];
             AllowAgvPlacePallet = readArray[3];
             // 鍙啓鍦板潃鏁版嵁
-            _agvPicking = readArray[10];
-            _agvPlacingPallet = readArray[11];
+            //_agvPicking = readArray[10];
+            //_agvPlacingPallet = readArray[11];
+            AgvPicking = readArray[10];
+            AgvPlacingPallet = readArray[11];
 
             var log = JsonConvert.SerializeObject(readArray);
             LogHelper.Info(log);
diff --git a/device/TcpClientHelper.cs b/device/TcpClientHelper.cs
new file mode 100644
index 0000000..740887e
--- /dev/null
+++ b/device/TcpClientHelper.cs
@@ -0,0 +1,323 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+
+using Newtonsoft.Json;
+
+namespace HH.WCS.Mobox3.DSZSH.device {
+    public class TcpClientHelper {
+
+        private static Socket _clientSocket;
+        private static byte[] _buffer = new byte[1024];
+        public static Dictionary<string, byte[]> _receivedDataQueue = new Dictionary<string, byte[]>();
+        public static string _ip { get; set; }
+        public static int _port { get; set; }
+
+        private static bool _isConnecting = false; // 鏍囪鏄惁姝e湪杩炴帴涓�+        private static readonly object _connectLock = new object(); // 杩炴帴鎿嶄綔鐨勫悓姝ラ攣
+
+        /// <summary>
+        /// 閲嶈繛鐨勮瘽璋冪敤鏂瑰啀瀹炰緥鍖栦竴涓氨琛屼簡
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        public static bool Init(string ip, int port) {
+            lock (_connectLock) {
+                try {
+                    // 鑻ユ鍦ㄨ繛鎺ヤ腑锛岀洿鎺ヨ繑鍥�+                    if (_isConnecting) {
+                        LogHelper.Info("宸叉湁杩炴帴姝e湪灏濊瘯涓紝绂佹閲嶅鎿嶄綔");
+                        return false;
+                    }
+
+                    _isConnecting = true; // 鏍囪涓鸿繛鎺ヤ腑
+
+                    // 閲婃斁鏃�Socket锛堜粎鍦ㄦ湭杩炴帴鏃讹級
+                    if (_clientSocket != null && !_clientSocket.Connected) {
+                        SafeCloseSocket();
+                    }
+
+                    // 鍒涘缓鏂�Socket 骞惰繛鎺�+                    _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                    IPAddress ipAdd = IPAddress.Parse(ip);
+                    IPEndPoint endPoint = new IPEndPoint(ipAdd, port);
+                    _clientSocket.BeginConnect(endPoint, ConnectCallback, null);
+
+                    // 鏇存柊 IP 鍜岀鍙�+                    _ip = ip;
+                    _port = port;
+                    return true;
+                }
+                catch (SocketException ex) {
+                    _isConnecting = false;
+                    LogHelper.Error($"鍒濆鍖栬繛鎺ュけ璐� {ex.Message}", ex);
+                    return false;
+                }
+            }
+        }
+
+        private static readonly object _linkLock = new object();
+
+        public static bool Link(string ip, int port) {
+            lock (_linkLock) {
+                try {
+
+
+                    // 鑻ocket瀛樺湪浣嗗疄闄呭凡鏂紑锛屽己鍒舵竻鐞�+                    if (_clientSocket != null && (_clientSocket.Poll(0, SelectMode.SelectRead) && _clientSocket.Available == 0)) {
+                        SafeCloseSocket();
+                    }
+
+                    // 鍘熸湁閫昏緫
+                    if (_clientSocket != null && _clientSocket.Connected) {
+                        LogHelper.Info($"鐢垫宸茶繛鎺ワ紝鏃犻渶閲嶈繛锛孖P锛歿ip}锛岀鍙o細{port}");
+                        return false;
+                    }
+                    return Init(ip, port);
+                }
+                catch (Exception ex) {
+                    LogHelper.Error($"鐢垫閲嶈繛澶辫触锛孖P锛歿ip}锛岀鍙o細{port}锛屽紓甯革細{ex.Message}", ex);
+                    return false;
+                }
+            }
+        }
+
+
+        public static bool TcpClose() {
+            try {
+                _clientSocket?.Close();
+                return true;
+            }
+            catch {
+                return false;
+            }
+        }
+
+        public static void SendMsg(string ip, int port, string message) {
+            try {
+                if (_clientSocket?.Connected == true) {
+                    byte[] data = Encoding.UTF8.GetBytes(message);
+                    _clientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, SendCallback, null);
+                }
+                else {
+                    Link(ip, port);
+                }
+            }
+            catch {
+                /* 寮傚父澶勭悊 */
+            }
+        }
+        private static void SendCallback(IAsyncResult ar) {
+            try {
+                _clientSocket.EndSend(ar);
+            }
+            catch { /* 鍙戦�寮傚父澶勭悊 */ }
+        }
+
+        private static void ConnectCallback(IAsyncResult ar) {
+            try {
+                lock (_connectLock) {
+                    // 妫�煡 Socket 鏄惁鏈夋晥
+                    if (_clientSocket == null || !ar.IsCompleted) {
+                        LogHelper.Info("杩炴帴宸插彇娑堟垨Socket鏃犳晥");
+                        return;
+                    }
+
+                    // 瀹屾垚杩炴帴
+                    _clientSocket.EndConnect(ar);
+
+                    // 浠呭湪杩炴帴鎴愬姛鏃跺惎鍔ㄦ帴鏀�+                    if (_clientSocket.Connected) {
+                        LogHelper.Info($"鎴愬姛杩炴帴鍒版湇鍔$锛歿_ip}:{_port}");
+                        _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceiveCallback, null);
+                    }
+                    else {
+                        LogHelper.Info("杩炴帴鏈垚鍔燂紝鍏抽棴Socket");
+                        SafeCloseSocket();
+                    }
+                }
+            }
+            catch (ObjectDisposedException) {
+                LogHelper.Info("杩炴帴杩囩▼涓璖ocket琚噴鏀�);
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"杩炴帴澶辫触锛歿ex.Message}", ex);
+                SafeCloseSocket();
+            }
+            finally {
+                _isConnecting = false; // 閲嶇疆杩炴帴鐘舵�
+            }
+        }
+
+        // 瀹夊叏鐨凷ocket鍏抽棴鏂规硶
+        private static void SafeCloseSocket() {
+            try {
+                if (_clientSocket != null) {
+                    // 閬垮厤閲嶅鍏抽棴
+                    if (_clientSocket.Connected) {
+                        _clientSocket.Shutdown(SocketShutdown.Both);
+                    }
+                    _clientSocket.Close();
+                    _clientSocket.Dispose();
+
+                    // 鏂紑鍚庯細娓呴櫎瀵瑰簲IP:Port鐨勬帴鏀舵暟鎹�+                    string key = $"{_ip}:{_port}";
+                    if (_receivedDataQueue.ContainsKey(key)) {
+                        _receivedDataQueue.Remove(key);
+                        LogHelper.Info($"宸叉竻鐞嗛槦鍒楁暟鎹紝Key锛歿key}");
+                    }
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"閲婃斁Socket璧勬簮寮傚父锛歿ex.Message}", ex);
+            }
+            finally {
+                _clientSocket = null;
+                _isConnecting = false; // 纭繚閲嶇疆杩炴帴鏍囪
+            }
+        }
+
+        private static void ReceiveCallback(IAsyncResult ar) {
+            try {
+                if (_clientSocket == null) {
+                    return;
+                }
+                int bytesRead = _clientSocket.EndReceive(ar);
+                if (bytesRead > 0) {
+                    // 澶嶅埗鏈夋晥鏁版嵁鍒版柊鏁扮粍
+                    byte[] receivedBytes = new byte[bytesRead];
+                    Array.Copy(_buffer, 0, receivedBytes, 0, bytesRead);
+
+                    // 瀛樺叆闃熷垪
+                    string key = $"{_ip}:{_port}";
+                    string receivedMessage = Encoding.UTF8.GetString(receivedBytes);
+                    _receivedDataQueue[key] = receivedBytes;
+
+                    // 缁х画鎺ユ敹涓嬩竴鎵规暟鎹�+                    _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceiveCallback, null);
+                }
+                else {
+                    // 鏈嶅姟绔富鍔ㄥ叧闂繛鎺ワ紝瑙﹀彂娓呯悊
+                    LogHelper.Info("杩炴帴宸茶鏈嶅姟绔叧闂�);
+                    SafeCloseSocket();
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"鎺ユ敹鏁版嵁寮傚父锛歿ex.Message}", ex);
+                SafeCloseSocket(); // 寮傚父鏃朵富鍔ㄥ叧闂�+            }
+        }
+
+
+        public static bool WriteElevatorDownOk(byte[] sends) {
+            try {
+                if (_clientSocket?.Connected == true) {
+                    _clientSocket.BeginSend(sends, 0, sends.Length, SocketFlags.None, SendCallback, null);
+                    return true;
+                }
+                else {
+                    Link(_ip, _port);
+                    LogHelper.Info($"鍐欑數姊叆璐ф暟鎹け璐ワ紙鏈繛鎺ワ級锛歿Encoding.UTF8.GetString(sends)}");
+                    return false;
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"鍐欑數姊叆璐ф暟鎹け璐ワ紙鍙戦�浜嗗紓甯革級锛歿ex.Message}", ex);
+                return false;
+            }
+        }
+
+        public static byte[] ReadElevatorOutOk() {
+            try {
+                if (_clientSocket != null && _clientSocket?.Connected == true) {
+                    _receivedDataQueue.TryGetValue($"{_ip}:{_port}", out byte[] result);
+                    LogHelper.Info($"璇荤數姊嚭璐ф暟鎹垚鍔燂細{BitConverter.ToString(result)}");
+                    return result;
+                }
+                else {
+                    Link(_ip, _port);
+                    LogHelper.Info($"璇荤數姊嚭璐ф暟鎹け璐ワ紙鏈繛鎺ワ級锛屽噯澶囬噸杩�);
+                    return null;
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"璇荤數姊嚭璐ф暟鎹け璐ワ紙鍙戠敓浜嗗紓甯革細{JsonConvert.SerializeObject(ex)}锛夛細{ex.Message}", ex);
+                return null;
+                /* 寮傚父澶勭悊 */
+            }
+        }
+
+        public static string ChekElevator() {
+            try {
+                var res = "璇诲彇鐢垫鏁版嵁鐨刴odel锛岀储寮曚粠1寮�锛屾弧瓒充互涓嬫潯浠舵墠鑳藉彂浠诲姟 \r\n " +
+                   "瀛楁锛宨sNormal 锛屾槸鍚︽甯告ā寮忥紝1锛氭甯告ā寮忥紝绗�涓狟yte鍙充晶绗竴浣岯it \r\n" +
+                   "瀛楁锛宨sValid锛屽綋鍓嶄綅缃槸鍚︽湁鏁堬紝1锛氭湁鏁堬紝0锛氫笉鐢ㄧ锛岀9涓狟yte鍙充晶绗竴浣岯it \r\n" +
+                   "瀛楁锛宺unMode锛岀數姊繍琛屾ā寮忥紝9=绌洪棽娉婂仠锛�=鑷姩杩愯锛岀10涓狟yte\r\n" +
+                   "瀛楁锛宨sLock_1_Out,涓�眰鍑哄彛鏄惁鍗犵敤锛� = 鍗犵敤锛岀14涓狟yte鍙充晶绗竴浣岯it\r\n" +
+                   "瀛楁锛宨sLock_2_Out锛屼簩灞傚嚭鍙f槸鍚﹀崰鐢紝1 = 鍗犵敤锛岀14涓狟yte鍙充晶绗簩浣岯it\r\n" +
+                   "瀛楁锛宼askNO锛屼换鍔″彿\r\n" +
+                   "鍒ゆ柇鐢垫鏄惁绗﹀悎2妤煎埌1妤兼惉閫佹潯浠讹細isNormal  涓�(runMode == 9 鎴�runMode == 7) 涓�锛乮sLock_1_Out \r\n" +
+                   "鍒ゆ柇鐢垫鏄惁绗﹀悎1妤煎埌鎴愬搧搴撳尯鏉′欢锛歩sNormal  涓�(runMode == 9 鎴�runMode == 7) 涓�isLock_1_Out\r\n";
+
+
+                var isRead = ReadElevatorOutOk();
+                var log = BitConverter.ToString(isRead);
+                res += "璇诲彇鍒扮殑鐢垫byte鏁扮粍锛� + log + "\r\n";
+                //if (isRead != null && isRead.Length >= 14) {
+                //    var elevatorReadInfo = new ElevatorReadInfo() {
+                //        isNormal = (isRead[6] & 1) == 1,
+                //        isValid = (isRead[8] & 1) == 1,
+                //        runMode = isRead[9],
+                //        isLock_1_Out = (isRead[13] & 1) == 1,
+                //        isLock_2_Out = (isRead[13] & (1 << 1)) == 1,
+                //    };
+                //    log = JsonConvert.SerializeObject(elevatorReadInfo);
+                //    res += "瑙f瀽鍚庣殑鐢垫淇℃伅" + log + "\r\n";
+
+                //    var res1 = elevatorReadInfo.is2To1Ok();
+
+                //    res += "鍒ゆ柇鐢垫鏄惁绗﹀悎2妤煎埌1妤兼惉閫佹潯浠讹紝濡傛灉绗﹀悎鍒欒繑鍥瀟rue锛岀粨鏋� + res1 + "\r\n";
+
+                //    var res2 = elevatorReadInfo.is1ToOk();
+
+                //    res += "鍒ゆ柇鐢垫鏄惁绗﹀悎1妤煎埌鎴愬搧搴撳尯鏉′欢锛屽鏋滅鍚堝垯杩斿洖true锛岀粨鏋� + res2 + "\r\n";
+                //}
+                //else {
+                //    return "璇诲彇鐢垫鐘舵�澶辫触锛宐yte鏁扮粍瑕佹眰澶т簬绛変簬14涓笖涓嶄负绌�;
+                //}
+                return res;
+            }
+            catch (Exception ex) {
+                return ex.Message;
+            }
+
+        }
+
+        public static bool IsDuanDian() {
+            try {
+                var isRead = ReadElevatorOutOk();
+                //if (isRead != null && isRead.Length >= 14) {
+                //    var elevatorReadInfo = new ElevatorReadInfo() {
+                //        isNormal = (isRead[6] & 1) == 1,
+                //        isValid = (isRead[8] & 1) == 1,
+                //        runMode = isRead[9],
+                //        isLock_1_Out = (isRead[13] & 1) == 1,
+                //        isLock_2_Out = (isRead[13] & (1 << 1)) == 1,
+                //    };
+                //    if (elevatorReadInfo.runMode == 5)//5=鏂數閲嶈繛
+                //    {
+                //        SafeCloseSocket();
+                //        return true;
+                //    }
+                //}
+                return false;
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"鍒ゆ柇鐢垫鏄惁鏂數锛堝彂鐢熶簡寮傚父锛歿JsonConvert.SerializeObject(ex)}锛夛細{ex.Message}", ex);
+                return false;
+            }
+        }
+    }
+}
diff --git a/process/TaskProcess.cs b/process/TaskProcess.cs
index 1bb20f5..a8a0c33 100644
--- a/process/TaskProcess.cs
+++ b/process/TaskProcess.cs
@@ -112,81 +112,120 @@
             var start = "0"; var end = "0";
             var taskType = mst.S_TYPE.Trim();
             if (mst.N_B_STATE == 0) {
-                if (mst.N_SCHEDULE_TYPE == 1)//閫氳繃NDC锛宧osttoagv璋冨害璁惧
-                {
-                    start = LocationHelper.GetAgvSite(mst.S_START_LOC);
-                    end = LocationHelper.GetAgvSite(mst.S_END_LOC);
+                start = LocationHelper.GetAgvSite(mst.S_START_LOC);
+                end = LocationHelper.GetAgvSite(mst.S_END_LOC);
 
-                    //if (mst.S_TYPE == "绌烘墭涓嬬嚎鍫嗗彔") {
-                    //    end = LocationHelper.GetAgvSite(mst.S_END_LOC, true);
-                    //}
+                //if (mst.S_TYPE == "绌烘墭涓嬬嚎鍫嗗彔") {
+                //    end = LocationHelper.GetAgvSite(mst.S_END_LOC, true);
+                //}
 
-                    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);
-                    var dic = new List<param>();
-                    dic.Add(new param() { name = "IKey", value = "IKey" });
-                    dic.Add(new param() { name = "From", value = start.ToString() });
-                    dic.Add(new param() { name = "To", value = end.ToString() });
-                    dic.Add(new param() { name = "FUNC", value = startLoc.N_LAYER.ToString() });
+                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);
+                var dic = new List<param>();
+                dic.Add(new param() { name = "IKey", value = "IKey" });
+                dic.Add(new param() { name = "From", value = start.ToString() });
+                dic.Add(new param() { name = "To", value = end.ToString() });
+                dic.Add(new param() { name = "FUNC", value = startLoc.N_LAYER.ToString() });
 
-                    dic.Add(new param() { name = "Ctype", value = "0" });
+                dic.Add(new param() { name = "Ctype", value = "0" });
 
 
-                    //if (mst.S_TYPE == "浣欐枡涓嬬嚎鍏ュ簱" || mst.S_TYPE == "浜哄伐鎷嗙洏鍏ュ簱") {
-                    //    dic.Add(new param() { name = "DATA", value = "1024" });
-                    //}
-                    //else {
-                    //    dic.Add(new param() { name = "DATA", value = "0" });
-                    //}
+                //if (mst.S_TYPE == "浣欐枡涓嬬嚎鍏ュ簱" || mst.S_TYPE == "浜哄伐鎷嗙洏鍏ュ簱") {
+                //    dic.Add(new param() { name = "DATA", value = "1024" });
+                //}
+                //else {
+                //    dic.Add(new param() { name = "DATA", value = "0" });
+                //}
 
-                    var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//娣诲姞鏂板懡浠�-                    if (res != null && (res.err_code == 0 || res.err_code == 50009)) {
-                        //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
-                        mst.N_B_STATE = 1;
-                        mst.S_B_STATE = TN_Task.GetStateStr(1);
-                        WCSHelper.UpdateStatus(mst);//鏇存柊浠诲姟鐘舵�
-                        result = true;
-                        LogHelper.Info($"NDC鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
-                    }
-                    else {
-                        LogHelper.Info($"NDC鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
-                    }
+                var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//娣诲姞鏂板懡浠�+                if (res != null && (res.err_code == 0 || res.err_code == 50009)) {
+                    //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
+                    mst.N_B_STATE = 1;
+                    mst.S_B_STATE = TN_Task.GetStateStr(1);
+                    WCSHelper.UpdateStatus(mst);//鏇存柊浠诲姟鐘舵�
+                    result = true;
+                    LogHelper.Info($"NDC鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
                 }
-                else if (mst.N_SCHEDULE_TYPE == 5)//閫氳繃鏉ゥ璋冨害璁惧 
-                {
-                    //璋冪涓夋柟鎺ュ彛
-                    var model = new HanAo.TaskInfoModel {
-                        requestPk = mst.S_CODE,
-                        frmPos = mst.S_START_LOC,
-                        toPos = mst.S_END_LOC,
-                        trkType = mst.S_OP_NAME == "鍏ュ簱" ? "1" : "2",
-                        contNo = mst.S_CNTR_CODE
-                    };
-                    if (HanAo.CreateOrder(model)) {
-                        mst.N_B_STATE = 1;
-                        WCSHelper.UpdateStatus(mst);
-                        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + model.frmPos + "end= " + model.toPos);
-                    }
-                    else {
-                        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(model));
-                    }
+                else {
+                    LogHelper.Info($"NDC鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
                 }
-                else if (mst.N_SCHEDULE_TYPE == 3) //閫氳繃鍥借嚜璋冨害璁惧
-                {
-                    var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p");
-                    if (code > 0) {
-                        //鏇存柊浠诲姟鐘舵�
-                        mst.N_B_STATE = 1;
-                        mst.S_EQ_TASK_CODE = code.ToString();
-                        WCSHelper.UpdateStatus(mst);
-                        WCSHelper.UpdateEQNo(mst);
-                        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + mst.S_START_LOC + "end= " + mst.S_END_LOC);
-                    }
-                    else {
-                        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(mst));
-                    }
-                }
+
+                //if (mst.N_SCHEDULE_TYPE == 1)//閫氳繃NDC锛宧osttoagv璋冨害璁惧
+                //{
+                //    start = LocationHelper.GetAgvSite(mst.S_START_LOC);
+                //    end = LocationHelper.GetAgvSite(mst.S_END_LOC);
+
+                //    //if (mst.S_TYPE == "绌烘墭涓嬬嚎鍫嗗彔") {
+                //    //    end = LocationHelper.GetAgvSite(mst.S_END_LOC, true);
+                //    //}
+
+                //    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);
+                //    var dic = new List<param>();
+                //    dic.Add(new param() { name = "IKey", value = "IKey" });
+                //    dic.Add(new param() { name = "From", value = start.ToString() });
+                //    dic.Add(new param() { name = "To", value = end.ToString() });
+                //    dic.Add(new param() { name = "FUNC", value = startLoc.N_LAYER.ToString() });
+
+                //    dic.Add(new param() { name = "Ctype", value = "0" });
+
+
+                //    //if (mst.S_TYPE == "浣欐枡涓嬬嚎鍏ュ簱" || mst.S_TYPE == "浜哄伐鎷嗙洏鍏ュ簱") {
+                //    //    dic.Add(new param() { name = "DATA", value = "1024" });
+                //    //}
+                //    //else {
+                //    //    dic.Add(new param() { name = "DATA", value = "0" });
+                //    //}
+
+                //    var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//娣诲姞鏂板懡浠�+                //    if (res != null && (res.err_code == 0 || res.err_code == 50009)) {
+                //        //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
+                //        mst.N_B_STATE = 1;
+                //        mst.S_B_STATE = TN_Task.GetStateStr(1);
+                //        WCSHelper.UpdateStatus(mst);//鏇存柊浠诲姟鐘舵�
+                //        result = true;
+                //        LogHelper.Info($"NDC鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
+                //    }
+                //    else {
+                //        LogHelper.Info($"NDC鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
+                //    }
+                //}
+                //else if (mst.N_SCHEDULE_TYPE == 5)//閫氳繃鏉ゥ璋冨害璁惧 
+                //{
+                //    //璋冪涓夋柟鎺ュ彛
+                //    var model = new HanAo.TaskInfoModel {
+                //        requestPk = mst.S_CODE,
+                //        frmPos = mst.S_START_LOC,
+                //        toPos = mst.S_END_LOC,
+                //        trkType = mst.S_OP_NAME == "鍏ュ簱" ? "1" : "2",
+                //        contNo = mst.S_CNTR_CODE
+                //    };
+                //    if (HanAo.CreateOrder(model)) {
+                //        mst.N_B_STATE = 1;
+                //        WCSHelper.UpdateStatus(mst);
+                //        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + model.frmPos + "end= " + model.toPos);
+                //    }
+                //    else {
+                //        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(model));
+                //    }
+                //}
+                //else if (mst.N_SCHEDULE_TYPE == 3) //閫氳繃鍥借嚜璋冨害璁惧
+                //{
+                //    var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p");
+                //    if (code > 0) {
+                //        //鏇存柊浠诲姟鐘舵�
+                //        mst.N_B_STATE = 1;
+                //        mst.S_EQ_TASK_CODE = code.ToString();
+                //        WCSHelper.UpdateStatus(mst);
+                //        WCSHelper.UpdateEQNo(mst);
+                //        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + mst.S_START_LOC + "end= " + mst.S_END_LOC);
+                //    }
+                //    else {
+                //        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(mst));
+                //    }
+                //}
 
             }
             return result;
diff --git a/util/LogHelper.cs b/util/LogHelper.cs
index 7221e4e..0afe82a 100644
--- a/util/LogHelper.cs
+++ b/util/LogHelper.cs
@@ -70,15 +70,15 @@
             }
         } 
 
-        #region 鑷畾涔夋柟娉�-        public static void InfoEx(Exception ex) {
-            Info($"寮傚父锛歿ex.Message}");
-        } 
+        // ------------
 
-        public static void InfoApi(string taskType, object model) {
-            Info($"瑙﹀彂API锛歿taskType} " + JsonConvert.SerializeObject(model), "API");
+        public static void InfoEx(Exception ex) {
+            Info($"鍙戠敓浜嗗紓甯革細{ex.Message}\n{ex.StackTrace}");
         }
-        #endregion
+
+        public static void InfoApi(string apiName, object model) {
+            Info($"瑙﹀彂API锛歿apiName} " + JsonConvert.SerializeObject(model), "API");
+        }
 
     }
 
diff --git a/util/Settings.cs b/util/Settings.cs
index aee5018..70de35d 100644
--- a/util/Settings.cs
+++ b/util/Settings.cs
@@ -13,9 +13,9 @@
         public static string SqlServer { get; set; }
         public static string TcpServerIp { get; set; }
         public static int TcpServerPort { get; set; }
-        public static List<Config.Area> Areas { get; set; }
-        public static List<Config.Task> Tasks { get; set; }
-        public static List<Config.ProductionLine> ProductionLines { get; set; }
+        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>();
 
         /// <summary>
         /// 搴撳尯瀛楀吀锛堝姞杞藉悗灏变笉鍙橈級
@@ -26,6 +26,8 @@
         /// 浠诲姟瀛楀吀锛堝姞杞藉悗灏变笉鍙橈級
         /// </summary>
         public static Dictionary<string, Config.Task> TaskMap { get; set; } = new Dictionary<string, Config.Task>();
+
+        public static Dictionary<string, int> AgvSite_ProdLineCodeMap { get; set; } = new Dictionary<string, int>();
 
         public static void Init() {
             // 鍔犺浇閰嶇疆鏂囦欢
@@ -83,6 +85,13 @@
                 TaskMap.Add(task.Name, task);
             }
         }
+
+        private static void LoadProdLines() {
+            foreach (var prod in ProductionLines) {
+
+            }
+        }
+
     }
 
     public class Config {
diff --git a/wms/LocationHelper.cs b/wms/LocationHelper.cs
index ef584a3..db9d569 100644
--- a/wms/LocationHelper.cs
+++ b/wms/LocationHelper.cs
@@ -131,7 +131,7 @@
         /// 浣犲垱寤轰换鍔¢攣瀹氳揣浣嶇殑鏃跺�锛屾妸閿佺殑鏉ユ簮灏辨槸浠诲姟鍙蜂篃鍐欎笂鍘伙紙鍔犻攣鐨勬柟娉曞姞涓弬鏁帮紝鍙┖鐨勫弬鏁帮級锛岃В閿佺殑鏃跺�鎶婃潵婧愮疆绌恒�
         /// </summary>
         /// <param name="loc"></param>
-        /// <param name="lockState">1:鍏ュ簱閿併�2:鍑哄簱閿併�2:鍏跺畠閿�/param>
+        /// <param name="lockState">1:鍏ュ簱閿併�2:鍑哄簱閿併�3:鍏跺畠閿�/param>
         /// <param name="lockSource">閿佺殑鏉ユ簮=浠诲姟鍙�/param>
         /// <returns></returns>
         public static bool LockLoc(ref TN_Location loc, int lockState, string lockSource = "") {

--
Gitblit v1.9.1