From 2ca90a404fa1ab94eb6374f50c6ddd47a2b7f0e6 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期四, 31 七月 2025 17:23:57 +0800
Subject: [PATCH] 删除有问题的TCP旧代码, 优化事务处理和ERP数据模型

---
 core/Monitor.cs                            |  146 --
 wms/WMSHelper.cs                           |   83 +
 dispatch/HanAo.cs                          |    1 
 api/ApiModel.cs                            |  804 ----------------
 HH.WCS.Mobox3.DSZSH.csproj                 |    7 
 wms/WCSHelper.cs                           |   95 +
 api/ErpModel.ErpSendOutboundPlanInfo.cs    |  276 +++++
 api/ForceController.cs                     |    2 
 device/OpcUaHelper.cs                      |   87 -
 dispatch/NDC.cs                            |   16 
 wms/LogMsg.cs                              |    4 
 App_Start/Startup.cs                       |    1 
 dispatch/NDCApi.cs                         |  101 -
 device/ModbusHelper.cs                     |    2 
 api/ErpController.cs                       |  159 +++
 /dev/null                                  |   24 
 dispatch/NDCHelper.cs                      |    6 
 core/WCSCore.cs                            |   14 
 device/ModbusFactory.cs                    |    1 
 api/DebugController.cs                     |   14 
 api/ErpModel.CreateTaskReturnErpInfo.cs    |  271 +++++
 dispatch/GZRobot.cs                        |    1 
 util/Settings.cs                           |   44 
 api/ApiHelper.cs                           |  403 ++-----
 App_Start/SwaggerControllerDescProvider.cs |   27 
 api/ErpModel.PickUpReturnErpInfo.cs        |  271 +++++
 api/MoboxController.cs                     |    1 
 wms/DbTran.cs                              |   66 +
 28 files changed, 1,426 insertions(+), 1,501 deletions(-)

diff --git a/App_Start/Startup.cs b/App_Start/Startup.cs
index 087146b..aec19e3 100644
--- a/App_Start/Startup.cs
+++ b/App_Start/Startup.cs
@@ -5,7 +5,6 @@
 using System.Web.Http;
 using Microsoft.Owin;
 using Newtonsoft.Json;
-
 using Owin;
 using Swashbuckle.Application;
 
diff --git a/App_Start/SwaggerControllerDescProvider.cs b/App_Start/SwaggerControllerDescProvider.cs
index b7f37fc..7ec6e59 100644
--- a/App_Start/SwaggerControllerDescProvider.cs
+++ b/App_Start/SwaggerControllerDescProvider.cs
@@ -9,8 +9,7 @@
     /// <summary>
     /// Swagger 鏄剧ず鎺у埗鍣ㄧ殑鎻忚堪
     /// </summary>
-    public class SwaggerCacheProvider : ISwaggerProvider
-    {
+    public class SwaggerCacheProvider : ISwaggerProvider {
         private readonly ISwaggerProvider _swaggerProvider;
         private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
         private readonly string _xmlPath;
@@ -18,18 +17,15 @@
         /// <summary></summary>
         /// <param name="swaggerProvider"></param>
         /// <param name="xmlpath">xml鏂囨。璺緞</param>
-        public SwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xmlpath)
-        {
+        public SwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xmlpath) {
             _swaggerProvider = swaggerProvider;
             _xmlPath = xmlpath;
         }
 
-        public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
-        {
+        public SwaggerDocument GetSwagger(string rootUrl, string apiVersion) {
             var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
             // 鍙鍙栦竴娆�-            if (!_cache.TryGetValue(cacheKey, out SwaggerDocument srcDoc))
-            {
+            if (!_cache.TryGetValue(cacheKey, out SwaggerDocument srcDoc)) {
                 srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
 
                 srcDoc.vendorExtensions = new Dictionary<string, object> {
@@ -44,21 +40,17 @@
         /// 浠嶢PI鏂囨。涓鍙栨帶鍒跺櫒鎻忚堪
         /// </summary>
         /// <returns>鎵�湁鎺у埗鍣ㄦ弿杩�/returns>
-        public ConcurrentDictionary<string, string> GetControllerDesc()
-        {
+        public ConcurrentDictionary<string, string> GetControllerDesc() {
             ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
-            if (File.Exists(_xmlPath))
-            {
+            if (File.Exists(_xmlPath)) {
                 XmlDocument xmldoc = new XmlDocument();
                 xmldoc.Load(_xmlPath);
 
                 string[] arrPath;
                 int cCount = "Controller".Length;
-                foreach (XmlNode node in xmldoc.SelectNodes("//member"))
-                {
+                foreach (XmlNode node in xmldoc.SelectNodes("//member")) {
                     string type = node.Attributes["name"].Value;
-                    if (type.StartsWith("T:"))
-                    {
+                    if (type.StartsWith("T:")) {
                         arrPath = type.Split('.');
                         string controllerName = arrPath[arrPath.Length - 1];
                         if (controllerName.EndsWith("Controller")) // 鎺у埗鍣�@@ -66,8 +58,7 @@
                             // 鑾峰彇鎺у埗鍣ㄦ敞閲�                             XmlNode summaryNode = node.SelectSingleNode("summary");
                             string key = controllerName.Remove(controllerName.Length - cCount, cCount);
-                            if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
-                            {
+                            if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key)) {
                                 controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
                             }
                         }
diff --git a/HH.WCS.Mobox3.DSZSH.csproj b/HH.WCS.Mobox3.DSZSH.csproj
index 5bc18dd..4827bd8 100644
--- a/HH.WCS.Mobox3.DSZSH.csproj
+++ b/HH.WCS.Mobox3.DSZSH.csproj
@@ -228,6 +228,9 @@
     <Compile Include="api\ApiModel.cs" />
     <Compile Include="api\DebugController.cs" />
     <Compile Include="api\ErpController.cs" />
+    <Compile Include="api\ErpModel.CreateTaskReturnErpInfo.cs" />
+    <Compile Include="api\ErpModel.ErpSendOutboundPlanInfo.cs" />
+    <Compile Include="api\ErpModel.PickUpReturnErpInfo.cs" />
     <Compile Include="api\ForceController.cs" />
     <Compile Include="api\MesController.cs" />
     <Compile Include="api\MoboxController.cs" />
@@ -251,10 +254,7 @@
     <Compile Include="device\ProductionLineDevice.cs" />
     <Compile Include="device\ModbusHelper.cs" />
     <Compile Include="device\OpcUaHelper.cs" />
-    <Compile Include="device\PlcHelper.cs" />
     <Compile Include="device\S7Helper.cs" />
-    <Compile Include="device\TcpClient.cs" />
-    <Compile Include="device\TcpServer.cs" />
     <Compile Include="dispatch\GZRobot.cs" />
     <Compile Include="dispatch\HanAo.cs" />
     <Compile Include="dispatch\NDC.cs" />
@@ -267,7 +267,6 @@
     <Compile Include="models\TN_Loc_Container.cs" />
     <Compile Include="models\TN_Task.cs" />
     <Compile Include="models\TN_Task_Action.cs" />
-    <Compile Include="process\DeviceProcess.cs" />
     <Compile Include="api\WMSController.cs" />
     <Compile Include="dispatch\HostToAGV.cs" />
     <Compile Include="util\LogHelper.cs" />
diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
index 909bdee..36225f0 100644
--- a/api/ApiHelper.cs
+++ b/api/ApiHelper.cs
@@ -1,19 +1,11 @@
 锘縰sing System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Security.Cryptography;
-
-using HH.WCS.Mobox3.DSZSH.core;
 using HH.WCS.Mobox3.DSZSH.models;
 using HH.WCS.Mobox3.DSZSH.util;
 using HH.WCS.Mobox3.DSZSH.wms;
-
 using Newtonsoft.Json;
-
 using SqlSugar;
-
-using Swashbuckle.Swagger;
-
 using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
 using static HH.WCS.Mobox3.DSZSH.api.OtherModel;
 
@@ -29,7 +21,7 @@
             var (ok, msg) = (false, string.Empty);
             var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.M婊$涓嬬嚎鍏ュ簱.Info();
+            var tInfo = ETask.M婊$涓嬬嚎鍏ュ簱.Info();
             const string preLog = "API:婊$涓嬬嚎鍏ュ簱:";
             const string cntrType = "濂借繍绠�;
 
@@ -39,7 +31,7 @@
                 }
 
                 // 妫�煡璐у搧瀹瑰櫒琛�鏄惁宸茬粡瀛樺湪璐存爣鏈轰紶閫掔殑寰呭叆搴撶墿鏂欎俊鎭�-                // TODO:鏁伴噺,瑙勬牸鏄惁涔熷弬涓庢瘮瀵癸紵
+                // QES:鏁伴噺,瑙勬牸鏄惁涔熷弬涓庢瘮瀵�
                 var cgDetail = db.Queryable<TN_CG_Detail>()
                     .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo 
                              && d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮").First();
@@ -48,23 +40,28 @@
                         $"璇锋鏌�PDA鎵爜鐗╂枡淇℃伅涓庤创鏍囨満浼犻�鐨勪俊鎭槸鍚︿竴鑷�!");
                 }
 
-                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, taskInfo.StartAreas)).First();
+                // 鏌ヨ璧风偣璐т綅(缁戝畾鍓�
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, tInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
+                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, tInfo.StartAreas));
                 }
 
                 // 鍜屾弧鎵樹笅绾垮叆搴撶殑閫昏緫涓�嚧,鐢变簬瀹瑰櫒绉诲姩涓嶄細鏇存敼缁戝畾淇℃伅,鎵�互蹇呴』鍒犻櫎鏃ф暟鎹�-                WMSHelper.FindCntrOldInfo(obj, cgDetail.S_CNTR_CODE, skipCgDetail: true);
+                WMSHelper.FindOldCntrInfo(obj, cgDetail.S_CNTR_CODE, skipCgDetail: true);
 
+                // 缁戝畾璐т綅瀹瑰櫒
                 var locCntrRel = WMSHelper.BindLocCntr(obj, startLoc, cgDetail.S_CNTR_CODE, cntrType);
 
-                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas))
+                // 鏌ヨ缁堢偣璐т綅
+                // Order:浼樺厛閫夋嫨浣庡眰璐ф灦
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: tInfo.EndAreas))
                     .OrderBy(l => new { l.N_LAYER }).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: tInfo.EndAreas));
                 }
 
-                WMSHelper.CreateTask(obj, startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
+                // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
+                WMSHelper.CreateTask(obj, startLoc, endLoc, locCntrRel.S_CNTR_CODE, tInfo.TaskName);
                 (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
@@ -81,49 +78,42 @@
         public static SimpleResult EmptyInboundPallet(EmptyInboundInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
+            var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.K绌烘墭鍏ュ簱.Info();
+            var tInfo = ETask.K绌烘墭鍏ュ簱.Info();
             const string preLog = "API:绌烘墭鍏ュ簱:";
             const string cntrType = "鎵樼洏";
 
             try {
-                // 鏌ヨ璧风偣璐т綅:鏁伴噺=0
-                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, taskInfo.StartAreas)).First();
-                if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
-                }
-
                 // 鏌ヨ瀹瑰櫒琛�瀹瑰櫒绫诲瀷瀛楁
                 (ok, msg) = WMSHelper.CheckCntrType(model.CntrCode, cntrType, out var cntr);
                 if (!ok) {
-                    return NewSimpleResult(3, preLog + msg);
+                    return NewSimpleResult(1, preLog + msg);
                 }
-                
+
+                // 鏌ヨ璧风偣璐т綅(缁戝畾鍓�
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, tInfo.StartAreas)).First();
+                if (startLoc == null) {
+                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, tInfo.StartAreas));
+                }
+
                 // 绌虹鍏ュ簱鏃�濡傛灉瀛樺湪鏃х殑缁戝畾鏁版嵁,鍒犻櫎
-                var old = WCSHelper.GetLocCntrCg(model.CntrCode);
+                WMSHelper.FindOldCntrInfo(obj, model.CntrCode);
 
                 // 缁戝畾璐т綅瀹瑰櫒
-                var locCntrRel = WCSHelper.BindLocCntr(startLoc, cntr.S_CODE);
-                locCntrRel.S_CNTR_TYPE = cntrType;
+                var locCntrRel = WMSHelper.BindLocCntr(obj, startLoc, cntr.S_CODE, cntrType);
 
                 // 鏌ヨ缁堢偣璐т綅
                 // Order:灞傛暟浠庝綆鍒伴珮,琛�鍒�-                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas))
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: tInfo.EndAreas))
                     .OrderBy(l => new { l.N_LAYER, l.N_ROW, l.N_COL }).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: tInfo.EndAreas));
                 }
 
                 // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
-
-                (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
-                    Old = old,
-                    New = new LocCntrCg { LocCntrRel = locCntrRel },
-                    StartLocToUpdate = startLoc,
-                    EndLocToUpdate = endLoc,
-                    TaskToInsert = task,
-                });
+                WMSHelper.CreateTask(obj, startLoc, endLoc, locCntrRel.S_CNTR_CODE, tInfo.TaskName);
+                (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
             catch (Exception ex) {
@@ -138,44 +128,39 @@
         public static SimpleResult EmptyInboundGoodpack(EmptyInboundInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
+            var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.K绌虹鍏ュ簱.Info();
+            var tInfo = ETask.K绌虹鍏ュ簱.Info();
             const string preLog = "API:绌虹鍏ュ簱:";
             const string cntrType = "濂借繍绠�;
 
             try {
-                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, taskInfo.StartAreas)).First();
+                // 鏌ヨ璧风偣璐т綅(缁戝畾鍓�
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(model.StartLoc, tInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, taskInfo.StartAreas));
+                    return NewSimpleResult(1, preLog + LogMsg.StartLocUnbindNotFound(model.StartLoc, tInfo.StartAreas));
                 }
 
                 // 鏌ヨ瀹瑰櫒琛�瀹瑰櫒绫诲瀷瀛楁
                 (ok, msg) = WMSHelper.CheckCntrType(model.CntrCode, cntrType, out var cntr);
                 if (!ok) {
-                    return NewSimpleResult(3, preLog + msg);
+                    return NewSimpleResult(2, preLog + msg);
                 }
 
                 // 绌虹鍏ュ簱鏃�濡傛灉瀛樺湪鏃х殑缁戝畾鏁版嵁,鍒犻櫎
-                var old = WCSHelper.GetLocCntrCg(model.CntrCode);
+                WMSHelper.FindOldCntrInfo(obj, model.CntrCode);
 
-                var locCntrRel = WCSHelper.BindLocCntr(startLoc, model.CntrCode);
-                locCntrRel.S_CNTR_TYPE = cntrType;
+                var locCntrRel = WMSHelper.BindLocCntr(obj, startLoc, model.CntrCode, cntrType);
 
-                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas))
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: tInfo.EndAreas))
                     .OrderBy(l => new { l.N_LAYER, l.N_ROW, l.N_COL }).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: tInfo.EndAreas));
                 }
 
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
-
-                (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
-                    Old = old,
-                    New = new LocCntrCg { LocCntrRel = locCntrRel },
-                    StartLocToUpdate = startLoc,
-                    EndLocToUpdate = endLoc,
-                    TaskToInsert = task,
-                });
+                // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
+                WMSHelper.CreateTask(obj, startLoc, endLoc, locCntrRel.S_CNTR_CODE, tInfo.TaskName);
+                (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
             catch (Exception ex) {
@@ -191,8 +176,9 @@
         public static SimpleResult EmptyOnlinePallet(EmptyOnlinePalletInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
+            var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.K绌烘墭涓婄嚎鍑哄簱.Info();
+            var tInfo = ETask.K绌烘墭涓婄嚎鍑哄簱.Info();
             const string preLog = "API:绌烘墭涓婄嚎鍑哄簱:";
             const string cntrType = "鎵樼洏";
 
@@ -203,11 +189,11 @@
                     return NewSimpleResult(1, preLog + msg);
                 }
 
+                // 妫�煡瀹瑰櫒琛�瀹瑰櫒瑙勬牸(鐗╂枡缂栫爜)
                 var needUpdateContainer = false;
                 if (string.IsNullOrEmpty(cntr.S_SPEC)) {
-                    // TEMP 鐩墠娴佺▼:濡傛灉瀹瑰櫒琛ㄤ腑瑙勬牸 (鐗╂枡缂栫爜) 涓虹┖,鏍规嵁娴佺▼鐨勭墿鏂欎俊鎭啓鍏�-                    // 寰呭畾:鍚庨潰鍙兘浼氭洿鏀规祦绋�鎴栬�鐢ㄥ叾浠栦俊鎭�(濡傜墿鏂欑被鍨�瑙勬牸) 浣滀负瀹瑰櫒鐨勮鏍�-
+                    // 鐩墠娴佺▼:濡傛灉瀹瑰櫒琛ㄤ腑瑙勬牸 (鐗╂枡缂栫爜) 涓虹┖,鏍规嵁娴佺▼鐨勭墿鏂欎俊鎭啓鍏�+                    // TEMP:鍚庨潰鍙兘浼氭洿鏀规祦绋�鎴栬�鐢ㄥ叾浠栦俊鎭�(濡傜墿鏂欑被鍨�瑙勬牸) 浣滀负瀹瑰櫒鐨勮鏍�                     needUpdateContainer = true;
                     cntr.S_SPEC = model.ItemCode;
                     LogHelper.Info($"瀹瑰櫒'{model.CntId}'鍦╗瀹瑰櫒琛╙涓璠瑙勬牸(鐗╂枡缂栫爜)]涓虹┖,灏嗙墿鏂欑紪鐮�{model.ItemCode}'鍐欏叆瀹瑰櫒鐨勮鏍�);
@@ -216,30 +202,29 @@
                     return NewSimpleResult(3, $"瀹瑰櫒'{model.CntId}'宸茬粡涓庣墿鏂欑被鍨�{cntr.S_SPEC}'缁戝畾,鏃犳硶鐢ㄤ簬瑁呰浇鐗╂枡'{model.ItemCode}'!");
                 }
 
+                // 鏌ヨ璧风偣璐т綅
                 var startLoc = db.Queryable<TN_Location>().LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
-                    .Where(DbExpr.StartLoc(areas: taskInfo.StartAreas))
+                    .Where(DbExpr.StartLoc(areas: tInfo.StartAreas))
                     .Where((l, c) => c.S_CNTR_CODE == model.CntId && c.S_CNTR_TYPE == cntrType).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.StartLocNotFound(areas: taskInfo.StartAreas) +
+                    return NewSimpleResult(3, preLog + LogMsg.StartLocNotFound(areas: tInfo.StartAreas) +
                         $"缁戝畾瀹瑰櫒缂栫爜='{model.CntId}';缁戝畾瀹瑰櫒绫诲瀷='{cntrType}';");
                 }
 
-                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: taskInfo.EndAreas)).First();
+                // 鏌ヨ缁堢偣璐т綅
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: tInfo.EndAreas)).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(5, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
+                    return NewSimpleResult(5, preLog + LogMsg.EndLocNotFound(areas: tInfo.EndAreas));
                 }
 
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, model.CntId, taskInfo.TaskName);
+                // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
+                var task = WMSHelper.CreateTask(obj, startLoc, endLoc, model.CntId, tInfo.TaskName);
 
                 cntr.S_SOURCE = task.S_CODE; // 鐢ㄤ换鍔″彿浣滀负瀹瑰櫒鏇存柊鐨勪緷鎹�                 cntr.T_MODIFY = DateTime.Now;
+                obj.ContainerToUpdate = needUpdateContainer ? cntr : null; // 濡傛灉闇�鏇存柊[瀹瑰櫒琛╙瑙勬牸,鍐欏叆obj
 
-                (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
-                    ContainerToUpdate = needUpdateContainer ? cntr : null,
-                    StartLocToUpdate = startLoc,
-                    EndLocToUpdate = endLoc,
-                    TaskToInsert = task,
-                });
+                (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
             catch (Exception ex) {
@@ -255,8 +240,9 @@
         public static SimpleResult EmptyOnlineGoodpack(EmptyOnlineGoodpackInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
+            var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.K绌虹涓婄嚎鍑哄簱.Info();
+            var tInfo = ETask.K绌虹涓婄嚎鍑哄簱.Info();
             const string preLog = "API:绌虹涓婄嚎鍑哄簱:";
             const string cntrType = "濂借繍绠�;
 
@@ -268,26 +254,21 @@
                 }
 
                 var startLoc = db.Queryable<TN_Location>().LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
-                    .Where(DbExpr.StartLoc(areas: taskInfo.StartAreas))
+                    .Where(DbExpr.StartLoc(areas: tInfo.StartAreas))
                     .Where((l, c) => c.S_CNTR_CODE == model.CntId && c.S_CNTR_TYPE == cntrType).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(2, preLog + preLog + LogMsg.StartLocNotFound(areas: taskInfo.StartAreas) +
+                    return NewSimpleResult(2, preLog + preLog + LogMsg.StartLocNotFound(areas: tInfo.StartAreas) +
                         $"缁戝畾瀹瑰櫒缂栫爜='{model.CntId}';缁戝畾瀹瑰櫒绫诲瀷='{cntrType}';");
                 }
 
-                var endLoc = db.Queryable<TN_Location>().Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y")
-                    .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE) && l.N_CURRENT_NUM == 0).First();
+                var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: tInfo.EndAreas)).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: taskInfo.EndAreas));
+                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: tInfo.EndAreas));
                 }
 
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, model.CntId, taskInfo.TaskName);
-
-                (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
-                    StartLocToUpdate = startLoc,
-                    EndLocToUpdate = endLoc,
-                    TaskToInsert = task,
-                });
+                // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
+                WMSHelper.CreateTask(obj, startLoc, endLoc, model.CntId, tInfo.TaskName);
+                (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
             catch (Exception ex) {
@@ -303,45 +284,43 @@
         public static SimpleResult QualifiedBack(QualifiedBackInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
+            var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.C鎶芥鍚堟牸鍥炲簱.Info();
-            const string preLog = "API:鎶芥鍚堟牸鍥炲簱";
+            var tInfo = ETask.C鎶芥鍚堟牸鍥炲簱.Info();
+            const string preLog = "API:鎶芥鍚堟牸鍥炲簱:";
 
             try {
                 var cgDetail = db.Queryable<TN_CG_Detail>()
                     .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_CNTR_CODE == model.CntrCode).First();
                 if (cgDetail == null) {
-                    return NewSimpleResult(2, preLog + LogMsg.CgDetailNotFound(item: model.ItemCode, cntr: model.CntrCode));
+                    return NewSimpleResult(1, preLog + LogMsg.CgDetailNotFound(item: model.ItemCode, cntr: model.CntrCode));
                 }
 
                 var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE).First();
                 if (locCntrRel == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.LocCntrRelNotFound(cntr: cgDetail.S_CNTR_CODE));
+                    return NewSimpleResult(2, preLog + LogMsg.LocCntrRelNotFound(cntr: cgDetail.S_CNTR_CODE));
                 }
 
-                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(locCntrRel.S_LOC_CODE, taskInfo.StartAreas)).First();
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(locCntrRel.S_LOC_CODE, tInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(4, preLog + LogMsg.StartLocNotFound(locCntrRel.S_LOC_CODE, taskInfo.StartAreas));
+                    return NewSimpleResult(3, preLog + LogMsg.StartLocNotFound(locCntrRel.S_LOC_CODE, tInfo.StartAreas));
                 }
 
-                var endAreas = locCntrRel.S_CNTR_CODE == "鎵樼洏" ? taskInfo.EndAreas_Pallet : taskInfo.EndAreas_Goodpack;
+                var endAreas = locCntrRel.S_CNTR_CODE == "鎵樼洏" ? tInfo.EndAreas_Pallet : tInfo.EndAreas_Goodpack;
                 var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: endAreas)).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: endAreas));
+                    return NewSimpleResult(4, preLog + LogMsg.EndLocNotFound(areas: endAreas));
                 }
 
+                //淇敼鐗╂枡鐘舵�涓篬鍚堟牸]
                 cgDetail.N_ITEM_STATE = 0;
                 cgDetail.S_ITEM_STATE = "鍚堟牸";
                 cgDetail.T_MODIFY = DateTime.Now;
+                obj.CgDetailToUpdate = cgDetail;
 
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
-
-                (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
-                    CgDetailToUpdate = cgDetail,
-                    StartLocToUpdate = startLoc,
-                    EndLocToUpdate = endLoc,
-                    TaskToInsert = task,
-                });
+                // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
+                WMSHelper.CreateTask(obj, startLoc, endLoc, locCntrRel.S_CNTR_CODE, tInfo.TaskName);
+                (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
             catch (Exception ex) {
@@ -357,13 +336,14 @@
         public static SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
+            var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.C鎶芥涓嶅悎鏍肩Щ搴�Info();
+            var tInfo = ETask.C鎶芥涓嶅悎鏍肩Щ搴�Info();
             const string preLog = "API:鎶芥涓嶅悎鏍肩Щ搴�";
 
             try {
-                if (!taskInfo.EndAreas.Contains(model.EndArea)) {
-                    return NewSimpleResult(1, preLog + $"缁堢偣搴撳尯'{model.EndArea}'涓嶆弧瓒虫潯浠�闇�:璐у尯={LogObject(taskInfo.EndAreas)}");
+                if (!tInfo.EndAreas.Contains(model.EndArea)) {
+                    return NewSimpleResult(1, preLog + $"缁堢偣搴撳尯'{model.EndArea}'涓嶆弧瓒虫潯浠�闇�:璐у尯={LogObject(tInfo.EndAreas)}");
                 }
 
                 var cgDetail = db.Queryable<TN_CG_Detail>()
@@ -377,27 +357,24 @@
                     return NewSimpleResult(3, preLog + LogMsg.LocCntrRelNotFound(cntr: cgDetail.S_CNTR_CODE));
                 }
 
-                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(locCntrRel.S_LOC_CODE, taskInfo.StartAreas)).First();
+                var startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(locCntrRel.S_LOC_CODE, tInfo.StartAreas)).First();
                 if (startLoc == null) {
-                    return NewSimpleResult(1, preLog + LogMsg.StartLocNotFound(locCntrRel.S_LOC_CODE, taskInfo.StartAreas));
+                    return NewSimpleResult(4, preLog + LogMsg.StartLocNotFound(locCntrRel.S_LOC_CODE, tInfo.StartAreas));
                 }
 
                 var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: new List<string> { model.EndArea })).First();
                 if (endLoc == null) {
-                    return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: new List<string> { model.EndArea }));
+                    return NewSimpleResult(5, preLog + LogMsg.EndLocNotFound(areas: new List<string> { model.EndArea }));
                 }
 
                 cgDetail.N_ITEM_STATE = 2;
                 cgDetail.S_ITEM_STATE = "涓嶅悎鏍�;
+                cgDetail.T_MODIFY = DateTime.Now;
+                obj.CgDetailToUpdate = cgDetail;
 
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
-
-                (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
-                    CgDetailToUpdate = cgDetail,
-                    StartLocToUpdate = startLoc,
-                    EndLocToUpdate = endLoc,
-                    TaskToInsert = task,
-                });
+                // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
+                WMSHelper.CreateTask(obj, startLoc, endLoc, locCntrRel.S_CNTR_CODE, tInfo.TaskName);
+                (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
             catch (Exception ex) {
@@ -413,8 +390,9 @@
         public static SimpleResult RestBack(RestBackInfo model) {
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
+            var obj = new CreateTaskObj();
 
-            var taskInfo = ETask.W灏炬枡鍥炲簱.Info();
+            var tInfo = ETask.W灏炬枡鍥炲簱.Info();
             const string preLog = "API:灏炬枡鍥炲簱:";
             
             try {
@@ -428,19 +406,15 @@
                     return NewSimpleResult(3, preLog + LogMsg.LocCntrRelNotFound(loc: model.StartLoc));
                 }
 
-                var endAreas = locCntrRel.S_CNTR_CODE == "鎵樼洏" ? taskInfo.EndAreas_Pallet : taskInfo.EndAreas_Goodpack;
+                var endAreas = locCntrRel.S_CNTR_CODE == "鎵樼洏" ? tInfo.EndAreas_Pallet : tInfo.EndAreas_Goodpack;
                 var endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(areas: endAreas)).First();
                 if (endLoc == null) {
                     return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(areas: endAreas));
                 }
 
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, locCntrRel.S_CNTR_CODE, taskInfo.TaskName);
-
-                (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
-                    StartLocToUpdate = startLoc,
-                    EndLocToUpdate = endLoc,
-                    TaskToInsert = task,
-                });
+                // 璧风偣缁堢偣涓婇攣,鍒涘缓浠诲姟
+                WMSHelper.CreateTask(obj, startLoc, endLoc, locCntrRel.S_CNTR_CODE, tInfo.TaskName);
+                (ok, msg) = DbTran.CreateTask(obj);
                 return NewSimpleResult(ok ? 0 : 500, preLog + msg);
             }
             catch (Exception ex) {
@@ -449,7 +423,20 @@
         }
 
         /// <summary>
-        /// 鎴愬搧鑳跺嚭搴�PDA) 寰呭畾,鏆傛椂涓嶉渶瑕佹鍔熻兘
+        /// 鐢熸垚鍑哄簱鍗曞彿,绉佹湁
+        /// </summary>
+        /// <param name="snType"></param>
+        /// <param name="prefix"></param>
+        /// <returns></returns>
+        private static string GenerateOrderNo(string snType, string prefix) {
+            //var id = SYSHelper.GetSerialNumberResetByDay(snType, prefix);
+            //var date = DateTime.Now.ToString("yyMMdd");
+            //return $"{prefix}{date}-{id.ToString().PadLeft(4, '0')}";
+            return SYSHelper.GenerateSN(snType, prefix, "yyMMdd");
+        }
+
+        /// <summary>
+        /// 鎴愬搧鑳跺嚭搴�鎼佺疆)
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
@@ -457,7 +444,7 @@
             var db = new SqlHelper<object>().GetInstance();
             var (ok, msg) = (false, string.Empty);
 
-            var taskInfo = ETask.C鎴愬搧鑳跺嚭搴�Info();
+            var tInfo = ETask.C鎴愬搧鑳跺嚭搴�Info();
             const string preLog = "API:鎴愬搧鑳跺嚭搴�";
 
             try {
@@ -555,12 +542,12 @@
                 using (var tran = db.Ado.UseTran()) {
                     if (db.Insertable(order).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(2, preLog + "鐢熸垚鍑哄簱鍗曞け璐�" + LogObject(order));
+                        return NewSimpleResult(500, preLog + "鐢熸垚鍑哄簱鍗曞け璐�" + LogObject(order));
                     }
 
                     if (db.Insertable(detailList).ExecuteCommand() <= 0) {
                         tran.RollbackTran();
-                        return NewSimpleResult(4, preLog + "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐�" + LogObject(detailList));
+                        return NewSimpleResult(500, preLog + "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐�" + LogObject(detailList));
                     }
 
                     tran.CommitTran();
@@ -588,7 +575,7 @@
                     return result;
                 }
 
-                // NOTE 鏍规嵁鎬婚噺閫塪etail鏃�鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵
+                // NOTE 鏍规嵁鎬婚噺閫塪etail鏃�鏄惁闇�鑰冭檻璐т綅鐨勯珮浣�
 
                 var sortedMaterials = new List<TN_CG_Detail>();
 
@@ -645,12 +632,7 @@
             }
         }
 
-        private static string GenerateOrderNo(string snType, string prefix) {
-            //var id = SYSHelper.GetSerialNumberResetByDay(snType, prefix);
-            //var date = DateTime.Now.ToString("yyMMdd");
-            //return $"{prefix}{date}-{id.ToString().PadLeft(4, '0')}";
-            return SYSHelper.GenerateSN(snType, prefix, "yyMMdd");
-        }
+        
 
         /// <summary>
         /// 鍗氬疄鐗╂枡淇℃伅涓嬪彂鍚屾 (鍙拡瀵瑰ソ杩愮) 
@@ -715,157 +697,6 @@
             }
             catch (Exception ex) {
                 return NewMesResult(-1, preLog + $"鍙戠敓浜嗗紓甯�{ex.Message}\n\n{ex.StackTrace}\n");
-            }
-        }
-
-        public static ErpResult ErpSendOutboundPlan(ErpSendOutboundPlanInfo model) {
-            var db = new SqlHelper<object>().GetInstance();
-            var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "CKD");
-            const string preLog = "API:ERP涓嬪彂鍑哄簱璁″垝鍗�";
-            try {
-                if (model.pzjs <= 0) {
-                    return NewErpResult(400, preLog + $"鐗╂枡鏁伴噺(pzjs)'{model.pzjs}'涓嶅悎娉�瑕佹眰:鐗╂枡鏁伴噺锛�");
-                }
-
-                var outboundPlan = db.Queryable<TN_Outbound_Plan>()
-                    .Where(p => p.JHDH == model.jhdh).First();
-                if (outboundPlan != null) {
-                    return NewErpResult(1, preLog + $"璁″垝鍗曞彿'{model.jhdh}'宸插湪[鍑哄簱璁″垝鍗昡涓瓨鍦�");
-                }
-
-                outboundPlan = new TN_Outbound_Plan {
-                    JHDH = model.jhdh, // 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
-                    CKZT = model.ckzt, // 鍑哄簱鐘舵� (闇�杩斿洖) 
-                    JHLB = model.jhlb, // 璁″垝绫诲埆
-                    CKDH = model.ckdh, // 鍙傝�鍗曞彿
-                    CPH = model.cph, // 杞︾墝鍙�-                    YSFS = model.ysfs, // 杩愯緭鏂瑰紡
-                    CPZT = model.cpzt, // 浜у搧鐘舵�
-                    MDDW = model.mddw, // 涔版柇鍗曚綅
-                    CPDM = model.cpdm, // 浜у搧浠g爜
-                    CPLB = model.cplb, // 浜у搧绫诲埆
-                    CPLBMX = model.cplbmx, // 浜у搧绫诲埆鏄庣粏
-                    PP = model.pp, // 鍝佺墝
-                    DJ = model.dj, // 绛夌骇 (闇�杩斿洖) 
-                    GH = model.gh, // 缃愬彿
-                    PH = model.ph, // 鎵瑰彿 (闇�杩斿洖) 
-                    BZLX = model.bzlx, // 鍖呰绫诲瀷
-                    PZDH = model.pzdh, // 娲捐鍗曞彿
-                    PZD_DW = model.pzd_dw, // 娲捐鍗曞崟浣�-                    PZD_DYBH = model.pzd_dybh, // 娲捐鍗曡皟杩愮紪鍙�-                    PZJS = model.pzjs, // 娲捐浠舵暟
-                    PZSL = model.pzsl, // 娲捐鏁伴噺
-                    PZ_RQ = model.pz_rq, // 娲捐鏃ユ湡(yyyy-mm-dd)
-                    PZ_CZRQ = model.pz_czrq, // 娲捐鎿嶄綔鏃ユ湡
-                    PZ_ZFBJ = model.pz_zfbj, // 娲捐浣滃簾鏍囪
-                    PZ_ZFRQ = model.pz_zfrq, // 娲捐浣滃簾鏃ユ湡
-                    PZ_BZ = model.pz_bz, // 娲捐澶囨敞
-                    CKDBH = model.ckdbh, // 鍑哄簱鍗曠紪鍙�-                    SFJS = model.sfjs, // 瀹炲彂浠舵暟 (闇�杩斿洖) 
-                    SFSL = model.sfsl, // 瀹炲彂鏁伴噺 (闇�杩斿洖) 
-                    SFCS = model.sfcs, // 瀹炲彂杞︽暟 (闇�杩斿洖) 
-                    ZCSJ = model.zcsj, // 瑁呰溅鏃堕棿 (闇�杩斿洖) 
-                    JLDW = model.jldw, // 璁¢噺鍗曚綅 (闇�杩斿洖) 
-                    FHRQ = model.fhrq, // 鍙戣揣鏃ユ湡 (闇�杩斿洖) 
-                    CKDM = model.ckdm, // 浠撳簱浠g爜 (闇�杩斿洖) 
-                    FHR = model.fhr, // 鍙戣揣浜�(闇�杩斿洖) 
-                    CZYDM = model.czydm, // 鎿嶄綔鍛�(闇�杩斿洖) 
-                    SHR_USERNAME = model.shr_username, // 瀹℃牳浜�-                    SHRQ = model.shrq, // 瀹℃牳鏃ユ湡
-                    ZFBJ = model.zfbj, // 浣滃簾鏍囪
-                    ZFRQ = model.zfrq, // 浣滃簾鏃ユ湡
-                    JSDW = model.jsdw, // 缁撶畻鍗曚綅
-                    SHDW = model.shdw, // 鏀惰揣鍗曚綅
-                    YSDW = model.ysdw, // 杩愯緭鍗曚綅
-                    LXR = model.lxr, // 鑱旂郴浜�-                    RY_ZXG = model.ry_zxg, // 瑁呭嵏宸�(闇�杩斿洖) 
-                    RY_CCSJ = model.ry_ccsj, // 鍙夎溅鍙告満 (闇�杩斿洖) 
-                    ERPHX_JHDH = model.erphx_jhdh, // erp浜よ揣鍗曞彿
-                    ERPHX_WLBM = model.erphx_wlbm, // erp鐗╂枡缂栫爜
-                    ERPHX_WLMC = model.erphx_wlmc, // erp鐗╂枡鍚嶇О
-                    ERPHX_CJRQ = model.erphx_cjrq, // erp鍒涘缓鏃ユ湡
-                    HW = model.hw, // 璐т綅 (闇�杩斿洖) 
-                    HWZT = model.hwzt // 璐т綅鐘舵� (闇�杩斿洖) 
-                };
-
-                //var cgDetailList = SelectCgByTotalQty(
-                //    qty: (int)model.pzsl,
-                //    itemCode: model.cpdm,
-                //    batchNo: model.ph
-                //    );
-
-                //if (cgDetailList.Count == 0) {
-                //    info = "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�;
-                //    LogHelper.Info(info);
-                //    return NewErpResult(3, info);
-                //}
-
-                var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_ITEM_CODE == model.cpdm && d.N_ITEM_NUM >= model.pzjs).First();
-                if (cgDetail == null ) {
-                    return NewErpResult(2, preLog + $"鍦╗璐у搧鏄庣粏琛╙涓病鏈夋壘鍒板悎閫傜殑鐗╂枡!瑕佹眰:鐗╂枡缂栫爜='{model.cpdm}',鐗╂枡鏁伴噺>={model.pzjs}");
-                }
-
-                var order = new TN_Outbound_Order {
-                    S_NO = orderNo,
-                    //S_ITEM_CODE = model.cpdm,
-                    //S_BATCH = model.ph,
-                    //N_END_NUM = (int)model.pzsl,
-                    S_ITEM_CODE = model.cpdm,
-                    S_BATCH = cgDetail.S_BATCH_NO,
-                    N_END_NUM = (int)model.pzjs,
-                    S_END_AREA = "QCCKQ", // ERP涓嬪彂鍑哄簱浠诲姟涓烘苯杞﹀嚭搴撳尯
-                    S_BS_NO = model.jhdh,
-                    S_BS_TYPE = "ERP",
-                };
-
-                var detailList = new List<TN_Outbound_Detail>();
-                //foreach (var cgDetail in cgDetailList) {
-                //    var detail = new TN_Outbound_Detail {
-                //        S_OO_NO = orderNo,
-                //        S_ITEM_CODE = cgDetail.S_ITEM_CODE,
-                //        S_BATCH_NO = cgDetail.S_BATCH_NO,
-                //        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
-                //        N_COUNT = cgDetail.N_ITEM_NUM,
-                //        S_END_AREA = order.S_END_AREA, // order涓篸etail鐨勬瘡涓�釜璐т綅璁剧疆缁堢偣鍊�-                //        S_BS_NO = order.S_BS_NO,
-                //        S_BS_TYPE= order.S_BS_TYPE,
-                //    };
-                //    detailList.Add(detail);
-                //}
-                var detail = new TN_Outbound_Detail {
-                    S_OO_NO = orderNo,
-                    S_ITEM_CODE = cgDetail.S_ITEM_CODE,
-                    S_BATCH_NO = cgDetail.S_BATCH_NO,
-                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
-                    N_COUNT = cgDetail.N_ITEM_NUM,
-                    S_END_AREA = order.S_END_AREA, // order涓篸etail鐨勬瘡涓�釜璐т綅璁剧疆缁堢偣鍊�-                    S_BS_NO = order.S_BS_NO,
-                    S_BS_TYPE = order.S_BS_TYPE,
-                };
-                detailList.Add(detail);
-
-                using (var tran = db.Ado.UseTran()) {
-                    if (db.Insertable(order).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return NewErpResult(500, preLog + $"鐢熸垚[鍑哄簱鍗昡澶辫触!鏁版嵁:{LogObject(order)}");
-                    }
-
-                    if (db.Insertable(detailList).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return NewErpResult(500, preLog + $"鐢熸垚[鍑哄簱鍗曟槑缁哴澶辫触!鏁版嵁:{LogObject(detailList)}");
-                    }
-
-                    if (db.Insertable(outboundPlan).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return NewErpResult(500, preLog + $"鐢熸垚[鍑哄簱鍗曡鍒掕褰曡〃]澶辫触!鏁版嵁:{LogObject(outboundPlan)}");
-                    }
-
-                    tran.CommitTran();
-                    return NewErpResult(0, preLog + $"鐢熸垚[鍑哄簱鍗昡鎴愬姛!鍑哄簱鍗�{LogObject(order)}\n鍑哄簱鍗曟槑缁�{LogObject(detail)}");
-                }
-            }
-            catch (Exception ex) {
-                return NewErpResult(1, preLog + $"鍙戠敓浜嗗紓甯�{ex.Message}\n\n{ex.StackTrace}\n");
             }
         }
 
diff --git a/api/ApiModel.cs b/api/ApiModel.cs
index cd2647e..dba3f6a 100644
--- a/api/ApiModel.cs
+++ b/api/ApiModel.cs
@@ -422,809 +422,5 @@
                 Data = message,
             };
         }
-
-        /// <summary>
-        /// 鍙嶉 ERP 鐨勬暟鎹被鍨�-        /// </summary>
-        public class ErpResult {
-            [JsonProperty("code")]
-            public int Code { get; set; }
-            [JsonProperty("message")]
-            public string Message { get; set; }
-        }
-
-        public static ErpResult NewErpResult(int code, string message, bool log = true) {
-            if (log) { LogHelper.Info(message); }
-            return new ErpResult { Code = code, Message = message };
-        }
-
-        /// <summary>
-        /// ERP 涓嬪彂鍑哄簱浠诲姟鐨勬暟鎹被鍨�-        /// </summary>
-        public class ErpSendOutboundPlanInfo {
-            /// <summary>
-            /// 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
-            /// </summary>
-            public string jhdh { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 鍑哄簱鐘舵�
-            /// </summary>
-            public string ckzt { get; set; } = string.Empty;// 闇�杩斿洖
-
-            /// <summary>
-            /// 璁″垝绫诲埆
-            /// </summary>
-            public string jhlb { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 鍙傝�鍗曞彿
-            /// </summary>
-            public string ckdh { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 杞︾墝鍙�-            /// </summary>
-            public string cph { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 杩愯緭鏂瑰紡
-            /// </summary>
-            public string ysfs { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 浜у搧鐘舵�
-            /// </summary>
-            public string cpzt { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 涔版柇鍗曚綅
-            /// </summary>
-            public string mddw { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 浜у搧浠g爜
-            /// </summary>
-            public string cpdm { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 浜у搧绫诲埆
-            /// </summary>
-            public string cplb { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 浜у搧绫诲埆鏄庣粏
-            /// </summary>
-            public string cplbmx { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 鍝佺墝
-            /// </summary>
-            public string pp { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 绛夌骇
-            /// </summary>
-            public string dj { get; set; } = string.Empty;// 闇�杩斿洖
-
-            /// <summary>
-            /// 缃愬彿
-            /// </summary>
-            public string gh { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 鎵瑰彿
-            /// </summary>
-            public string ph { get; set; } = string.Empty;// 闇�杩斿洖
-
-            /// <summary>
-            /// 鍖呰绫诲瀷
-            /// </summary>
-            public string bzlx { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 娲捐鍗曞彿
-            /// </summary>
-            public string pzdh { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 娲捐鍗曞崟浣�-            /// </summary>
-            public string pzd_dw { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 娲捐鍗曡皟杩愮紪鍙�-            /// </summary>
-            public string pzd_dybh { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 娲捐浠舵暟
-            /// </summary>
-            public double pzjs { get; set; } = 0;
-
-            /// <summary>
-            /// 娲捐鏁伴噺
-            /// </summary>
-            public decimal pzsl { get; set; } = 0;
-
-            /// <summary>
-            /// 娲捐鏃ユ湡(yyyy-mm-dd)
-            /// </summary>
-            public string pz_rq { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 娲捐鎿嶄綔鏃ユ湡
-            /// </summary>
-            public long pz_czrq { get; set; } = 0;
-
-            /// <summary>
-            /// 娲捐浣滃簾鏍囪
-            /// </summary>
-            public int pz_zfbj { get; set; } = 0;
-
-            /// <summary>
-            /// 娲捐浣滃簾鏃ユ湡
-            /// </summary>
-            public long pz_zfrq { get; set; } = 0;
-
-            /// <summary>
-            /// 娲捐澶囨敞
-            /// </summary>
-            public string pz_bz { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 鍑哄簱鍗曠紪鍙�-            /// </summary>
-            public string ckdbh { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 瀹炲彂浠舵暟
-            /// </summary>
-            public double sfjs { get; set; } = 0; // 闇�杩斿洖
-
-            /// <summary>
-            /// 瀹炲彂鏁伴噺
-            /// </summary>
-            public decimal sfsl { get; set; } = 0; // 闇�杩斿洖
-
-            /// <summary>
-            /// 瀹炲彂杞︽暟
-            /// </summary>
-            public int sfcs { get; set; } = 0; // 闇�杩斿洖
-
-            /// <summary>
-            /// 瑁呰溅鏃堕棿
-            /// </summary>
-            public string zcsj { get; set; } = string.Empty; // 闇�杩斿洖
-
-            /// <summary>
-            /// 璁¢噺鍗曚綅
-            /// </summary>
-            public string jldw { get; set; } = string.Empty;// 闇�杩斿洖
-
-            /// <summary>
-            /// 鍙戣揣鏃ユ湡
-            /// </summary>
-            public long fhrq { get; set; } = 0; // 闇�杩斿洖
-
-            /// <summary>
-            /// 浠撳簱浠g爜
-            /// </summary>
-            public string ckdm { get; set; } = string.Empty; // 闇�杩斿洖
-
-            /// <summary>
-            /// 鍙戣揣浜�-            /// </summary>
-            public string fhr { get; set; } = string.Empty; // 闇�杩斿洖
-
-            /// <summary>
-            /// 鎿嶄綔鍛�-            /// </summary>
-            public string czydm { get; set; } = string.Empty; // 闇�杩斿洖
-
-            /// <summary>
-            /// 瀹℃牳浜�-            /// </summary>
-            public string shr_username { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 瀹℃牳鏃ユ湡
-            /// </summary>
-            public long shrq { get; set; } = 0;
-
-            /// <summary>
-            /// 浣滃簾鏍囪
-            /// </summary>
-            public long zfbj { get; set; } = 0;
-
-            /// <summary>
-            /// 浣滃簾鏃ユ湡
-            /// </summary>
-            public long zfrq { get; set; } = 0;
-
-            /// <summary>
-            /// 缁撶畻鍗曚綅
-            /// </summary>
-            public string jsdw { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 鏀惰揣鍗曚綅
-            /// </summary>
-            public string shdw { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 杩愯緭鍗曚綅
-            /// </summary>
-            public string ysdw { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 鑱旂郴浜�-            /// </summary>
-            public string lxr { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 瑁呭嵏宸�-            /// </summary>
-            public string ry_zxg { get; set; } = string.Empty; // 闇�杩斿洖
-
-            /// <summary>
-            /// 鍙夎溅鍙告満
-            /// </summary>
-            public string ry_ccsj { get; set; } = string.Empty; // 闇�杩斿洖
-
-            /// <summary>
-            /// erp浜よ揣鍗曞彿
-            /// </summary>
-            public string erphx_jhdh { get; set; } = string.Empty;
-
-            /// <summary>
-            /// erp鐗╂枡缂栫爜
-            /// </summary>
-            public string erphx_wlbm { get; set; } = string.Empty;
-
-            /// <summary>
-            /// erp鐗╂枡鍚嶇О
-            /// </summary>
-            public string erphx_wlmc { get; set; } = string.Empty;
-
-            /// <summary>
-            /// erp鍒涘缓鏃ユ湡
-            /// </summary>
-            public string erphx_cjrq { get; set; } = string.Empty;
-
-            /// <summary>
-            /// 璐т綅
-            /// </summary>
-            public string hw { get; set; } = string.Empty; // 闇�杩斿洖
-
-            /// <summary>
-            /// 璐т綅鐘舵�
-            /// </summary>
-            public string hwzt { get; set; } = string.Empty; // 闇�杩斿洖
-        }
-
-        public class PickUpReturnErpInfo {
-            /// <summary>
-            /// 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
-            /// </summary>
-            public string jhdh { get; set; }
-
-            /// <summary>
-            /// 鍑哄簱鐘舵�
-            /// </summary>
-            public string ckzt { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 璁″垝绫诲埆
-            /// </summary>
-            public string jhlb { get; set; }
-
-            /// <summary>
-            /// 鍙傝�鍗曞彿
-            /// </summary>
-            public string ckdh { get; set; }
-
-            /// <summary>
-            /// 杞︾墝鍙�-            /// </summary>
-            public string cph { get; set; }
-
-            /// <summary>
-            /// 杩愯緭鏂瑰紡
-            /// </summary>
-            public string ysfs { get; set; }
-
-            /// <summary>
-            /// 浜у搧鐘舵�
-            /// </summary>
-            public string cpzt { get; set; }
-
-            /// <summary>
-            /// 涔版柇鍗曚綅
-            /// </summary>
-            public string mddw { get; set; }
-
-            /// <summary>
-            /// 浜у搧浠g爜
-            /// </summary>
-            public string cpdm { get; set; }
-
-            /// <summary>
-            /// 浜у搧绫诲埆
-            /// </summary>
-            public string cplb { get; set; }
-
-            /// <summary>
-            /// 浜у搧绫诲埆鏄庣粏
-            /// </summary>
-            public string cplbmx { get; set; }
-
-            /// <summary>
-            /// 鍝佺墝
-            /// </summary>
-            public string pp { get; set; }
-
-            /// <summary>
-            /// 绛夌骇
-            /// </summary>
-            public string dj { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 缃愬彿
-            /// </summary>
-            public string gh { get; set; }
-
-            /// <summary>
-            /// 鎵瑰彿
-            /// </summary>
-            public string ph { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 鍖呰绫诲瀷
-            /// </summary>
-            public string bzlx { get; set; }
-
-            /// <summary>
-            /// 娲捐鍗曞彿
-            /// </summary>
-            public string pzdh { get; set; }
-
-            /// <summary>
-            /// 娲捐鍗曞崟浣�-            /// </summary>
-            public string pzd_dw { get; set; }
-
-            /// <summary>
-            /// 娲捐鍗曡皟杩愮紪鍙�-            /// </summary>
-            public string pzd_dybh { get; set; }
-
-            /// <summary>
-            /// 娲捐浠舵暟
-            /// </summary>
-            public double pzjs { get; set; }
-
-            /// <summary>
-            /// 娲捐鏁伴噺
-            /// </summary>
-            public decimal pzsl { get; set; }
-
-            /// <summary>
-            /// 娲捐鏃ユ湡(yyyy-mm-dd)
-            /// </summary>
-            public string pz_rq { get; set; }
-
-            /// <summary>
-            /// 娲捐鎿嶄綔鏃ユ湡
-            /// </summary>
-            public long pz_czrq { get; set; }
-
-            /// <summary>
-            /// 娲捐浣滃簾鏍囪
-            /// </summary>
-            public int pz_zfbj { get; set; }
-
-            /// <summary>
-            /// 娲捐浣滃簾鏃ユ湡
-            /// </summary>
-            public long pz_zfrq { get; set; }
-
-            /// <summary>
-            /// 娲捐澶囨敞
-            /// </summary>
-            public string pz_bz { get; set; }
-
-            /// <summary>
-            /// 鍑哄簱鍗曠紪鍙�-            /// </summary>
-            public string ckdbh { get; set; }
-
-            /// <summary>
-            /// 瀹炲彂浠舵暟
-            /// </summary>
-            public double sfjs { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 瀹炲彂鏁伴噺
-            /// </summary>
-            public decimal sfsl { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 瀹炲彂杞︽暟
-            ///// </summary>
-            //public int sfcs { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 瑁呰溅鏃堕棿
-            ///// </summary>
-            //public string zcsj { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 璁¢噺鍗曚綅
-            ///// </summary>
-            //public string jldw { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鍙戣揣鏃ユ湡
-            ///// </summary>
-            //public long fhrq { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 浠撳簱浠g爜
-            ///// </summary>
-            //public string ckdm { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鍙戣揣浜�-            ///// </summary>
-            //public string fhr { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鎿嶄綔鍛�-            ///// </summary>
-            //public string czydm { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 瀹℃牳浜�-            /// </summary>
-            public string shr_username { get; set; }
-
-            /// <summary>
-            /// 瀹℃牳鏃ユ湡
-            /// </summary>
-            public long shrq { get; set; }
-
-            /// <summary>
-            /// 浣滃簾鏍囪
-            /// </summary>
-            public long zfbj { get; set; }
-
-            /// <summary>
-            /// 浣滃簾鏃ユ湡
-            /// </summary>
-            public long zfrq { get; set; }
-
-            /// <summary>
-            /// 缁撶畻鍗曚綅
-            /// </summary>
-            public string jsdw { get; set; }
-
-            /// <summary>
-            /// 鏀惰揣鍗曚綅
-            /// </summary>
-            public string shdw { get; set; }
-
-            /// <summary>
-            /// 杩愯緭鍗曚綅
-            /// </summary>
-            public string ysdw { get; set; }
-
-            /// <summary>
-            /// 鑱旂郴浜�-            /// </summary>
-            public string lxr { get; set; }
-
-            ///// <summary>
-            ///// 瑁呭嵏宸�-            ///// </summary>
-            //public string ry_zxg { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鍙夎溅鍙告満
-            ///// </summary>
-            //public string ry_ccsj { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// erp浜よ揣鍗曞彿
-            /// </summary>
-            public string erphx_jhdh { get; set; }
-
-            /// <summary>
-            /// erp鐗╂枡缂栫爜
-            /// </summary>
-            public string erphx_wlbm { get; set; }
-
-            /// <summary>
-            /// erp鐗╂枡鍚嶇О
-            /// </summary>
-            public string erphx_wlmc { get; set; }
-
-            /// <summary>
-            /// erp鍒涘缓鏃ユ湡
-            /// </summary>
-            public string erphx_cjrq { get; set; }
-
-            /// <summary>
-            /// 璐т綅
-            /// </summary>
-            public string hw { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 璐т綅鐘舵�
-            /// </summary>
-            public string hwzt { get; set; } // 闇�杩斿洖
-        }
-
-        public class CreateTaskReturnErpInfo {
-            /// <summary>
-            /// 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
-            /// </summary>
-            public string jhdh { get; set; }
-
-            /// <summary>
-            /// 鍑哄簱鐘舵�
-            /// </summary>
-            public string ckzt { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 璁″垝绫诲埆
-            /// </summary>
-            public string jhlb { get; set; }
-
-            /// <summary>
-            /// 鍙傝�鍗曞彿
-            /// </summary>
-            public string ckdh { get; set; }
-
-            /// <summary>
-            /// 杞︾墝鍙�-            /// </summary>
-            public string cph { get; set; }
-
-            /// <summary>
-            /// 杩愯緭鏂瑰紡
-            /// </summary>
-            public string ysfs { get; set; }
-
-            /// <summary>
-            /// 浜у搧鐘舵�
-            /// </summary>
-            public string cpzt { get; set; }
-
-            /// <summary>
-            /// 涔版柇鍗曚綅
-            /// </summary>
-            public string mddw { get; set; }
-
-            /// <summary>
-            /// 浜у搧浠g爜
-            /// </summary>
-            public string cpdm { get; set; }
-
-            /// <summary>
-            /// 浜у搧绫诲埆
-            /// </summary>
-            public string cplb { get; set; }
-
-            /// <summary>
-            /// 浜у搧绫诲埆鏄庣粏
-            /// </summary>
-            public string cplbmx { get; set; }
-
-            /// <summary>
-            /// 鍝佺墝
-            /// </summary>
-            public string pp { get; set; }
-
-            /// <summary>
-            /// 绛夌骇
-            /// </summary>
-            public string dj { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 缃愬彿
-            /// </summary>
-            public string gh { get; set; }
-
-            /// <summary>
-            /// 鎵瑰彿
-            /// </summary>
-            public string ph { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 鍖呰绫诲瀷
-            /// </summary>
-            public string bzlx { get; set; }
-
-            /// <summary>
-            /// 娲捐鍗曞彿
-            /// </summary>
-            public string pzdh { get; set; }
-
-            /// <summary>
-            /// 娲捐鍗曞崟浣�-            /// </summary>
-            public string pzd_dw { get; set; }
-
-            /// <summary>
-            /// 娲捐鍗曡皟杩愮紪鍙�-            /// </summary>
-            public string pzd_dybh { get; set; }
-
-            /// <summary>
-            /// 娲捐浠舵暟
-            /// </summary>
-            public double pzjs { get; set; }
-
-            /// <summary>
-            /// 娲捐鏁伴噺
-            /// </summary>
-            public decimal pzsl { get; set; }
-
-            /// <summary>
-            /// 娲捐鏃ユ湡(yyyy-mm-dd)
-            /// </summary>
-            public string pz_rq { get; set; }
-
-            /// <summary>
-            /// 娲捐鎿嶄綔鏃ユ湡
-            /// </summary>
-            public long pz_czrq { get; set; }
-
-            /// <summary>
-            /// 娲捐浣滃簾鏍囪
-            /// </summary>
-            public int pz_zfbj { get; set; }
-
-            /// <summary>
-            /// 娲捐浣滃簾鏃ユ湡
-            /// </summary>
-            public long pz_zfrq { get; set; }
-
-            /// <summary>
-            /// 娲捐澶囨敞
-            /// </summary>
-            public string pz_bz { get; set; }
-
-            /// <summary>
-            /// 鍑哄簱鍗曠紪鍙�-            /// </summary>
-            public string ckdbh { get; set; }
-
-            ///// <summary>
-            ///// 瀹炲彂浠舵暟
-            ///// </summary>
-            //public double sfjs { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 瀹炲彂鏁伴噺
-            ///// </summary>
-            //public decimal sfsl { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 瀹炲彂杞︽暟
-            ///// </summary>
-            //public int sfcs { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 瑁呰溅鏃堕棿
-            ///// </summary>
-            //public string zcsj { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 璁¢噺鍗曚綅
-            ///// </summary>
-            //public string jldw { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鍙戣揣鏃ユ湡
-            ///// </summary>
-            //public long fhrq { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 浠撳簱浠g爜
-            ///// </summary>
-            //public string ckdm { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鍙戣揣浜�-            ///// </summary>
-            //public string fhr { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鎿嶄綔鍛�-            ///// </summary>
-            //public string czydm { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 瀹℃牳浜�-            /// </summary>
-            public string shr_username { get; set; }
-
-            /// <summary>
-            /// 瀹℃牳鏃ユ湡
-            /// </summary>
-            public long shrq { get; set; }
-
-            /// <summary>
-            /// 浣滃簾鏍囪
-            /// </summary>
-            public long zfbj { get; set; }
-
-            /// <summary>
-            /// 浣滃簾鏃ユ湡
-            /// </summary>
-            public long zfrq { get; set; }
-
-            /// <summary>
-            /// 缁撶畻鍗曚綅
-            /// </summary>
-            public string jsdw { get; set; }
-
-            /// <summary>
-            /// 鏀惰揣鍗曚綅
-            /// </summary>
-            public string shdw { get; set; }
-
-            /// <summary>
-            /// 杩愯緭鍗曚綅
-            /// </summary>
-            public string ysdw { get; set; }
-
-            /// <summary>
-            /// 鑱旂郴浜�-            /// </summary>
-            public string lxr { get; set; }
-
-            ///// <summary>
-            ///// 瑁呭嵏宸�-            ///// </summary>
-            //public string ry_zxg { get; set; } // 闇�杩斿洖
-
-            ///// <summary>
-            ///// 鍙夎溅鍙告満
-            ///// </summary>
-            //public string ry_ccsj { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// erp浜よ揣鍗曞彿
-            /// </summary>
-            public string erphx_jhdh { get; set; }
-
-            /// <summary>
-            /// erp鐗╂枡缂栫爜
-            /// </summary>
-            public string erphx_wlbm { get; set; }
-
-            /// <summary>
-            /// erp鐗╂枡鍚嶇О
-            /// </summary>
-            public string erphx_wlmc { get; set; }
-
-            /// <summary>
-            /// erp鍒涘缓鏃ユ湡
-            /// </summary>
-            public string erphx_cjrq { get; set; }
-
-            /// <summary>
-            /// 璐т綅
-            /// </summary>
-            public string hw { get; set; } // 闇�杩斿洖
-
-            /// <summary>
-            /// 璐т綅鐘舵�
-            /// </summary>
-            public string hwzt { get; set; } // 闇�杩斿洖
-        }
     }
 }
diff --git a/api/DebugController.cs b/api/DebugController.cs
index b91bb2e..4a2455b 100644
--- a/api/DebugController.cs
+++ b/api/DebugController.cs
@@ -3,17 +3,13 @@
 using System.IO;
 using System.Runtime.ConstrainedExecution;
 using System.Web.Http;
-
 using HH.WCS.Mobox3.DSZSH.core;
 using HH.WCS.Mobox3.DSZSH.device;
 using HH.WCS.Mobox3.DSZSH.models;
 using HH.WCS.Mobox3.DSZSH.util;
 using HH.WCS.Mobox3.DSZSH.wms;
-
 using Newtonsoft.Json;
-
 using SqlSugar;
-
 using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
 using static HH.WCS.Mobox3.DSZSH.api.OtherModel;
 using static HH.WCS.Mobox3.DSZSH.core.Monitor;
@@ -159,18 +155,18 @@
         /// <returns></returns>
         [HttpPost]
         [Route("TestErpSendOutboundPlan")]
-        public ErpResult TestErpSendOutboundPlan(TestErpSendOutboundPlanInfo model) {
+        public ErpModel.ErpResult TestErpSendOutboundPlan(TestErpSendOutboundPlanInfo model) {
             var apiName = "ERP涓嬪彂鍑哄簱璁″垝鍗�;
             //LogHelper.InfoApi(apiName, model);
 
-            var erpModel = new ErpSendOutboundPlanInfo();
+            var erpModel = new ErpModel.ErpSendOutboundPlanInfo();
             erpModel.jhdh = model.PlanNo;
             erpModel.cpdm = model.ItemCode;
             erpModel.pzjs = model.ItemNum;
 
             LogHelper.InfoApi(apiName, erpModel);
 
-            return ApiHelper.ErpSendOutboundPlan(erpModel);
+            return ErpService.ErpSendOutboundPlan(erpModel);
         }
 
         /// <summary>
@@ -180,7 +176,7 @@
         /// <returns></returns>
         [HttpPost]
         [Route("PickUpReturn")]
-        public TestErpResult PickUpReturn(PickUpReturnErpInfo model) {
+        public TestErpResult PickUpReturn(ErpModel.PickUpReturnErpInfo model) {
             if (model.sfjs == 0) {
                 return new TestErpResult {
                     code = 1,
@@ -201,7 +197,7 @@
         /// <returns></returns>
         [HttpPost]
         [Route("CreateTaskReturn")]
-        public TestErpResult CreateTaskReturn(CreateTaskReturnErpInfo model) {
+        public TestErpResult CreateTaskReturn(ErpModel.CreateTaskReturnErpInfo model) {
             if (model.hw == "") {
                 return new TestErpResult {
                     code = 1,
diff --git a/api/ErpController.cs b/api/ErpController.cs
index d58e3fc..05cacb7 100644
--- a/api/ErpController.cs
+++ b/api/ErpController.cs
@@ -4,6 +4,10 @@
 using System.Web.Http;
 using static HH.WCS.Mobox3.DSZSH.api.OtherModel;
 using HH.WCS.Mobox3.DSZSH.util;
+using HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.wms;
+using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
+using static HH.WCS.Mobox3.DSZSH.api.ErpModel;
 
 namespace HH.WCS.Mobox3.DSZSH.api {
     /// <summary>
@@ -18,9 +22,160 @@
         /// <returns></returns>
         [HttpPost]
         [Route("ErpSendOutboundPlan")]
-        public ErpResult ErpSendOutboundPlan(ErpSendOutboundPlanInfo model) {
+        public ErpResult ErpSendOutboundPlan(ErpModel.ErpSendOutboundPlanInfo model) {
             LogHelper.InfoApi("ERP涓嬪彂鍑哄簱璁″垝鍗�, model);
-            return ApiHelper.ErpSendOutboundPlan(model);
+            return ErpService.ErpSendOutboundPlan(model);
         }
     }
+
+    public class ErpService {
+        public static ErpResult ErpSendOutboundPlan(ErpModel.ErpSendOutboundPlanInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            var orderNo = SYSHelper.GenerateSN("鍑哄簱鍗曞彿", "CKD", "yyMMdd");
+            const string preLog = "API:ERP涓嬪彂鍑哄簱璁″垝鍗�";
+            try {
+                if (model.pzjs <= 0) {
+                    return NewErpResult(400, preLog + $"鐗╂枡鏁伴噺(pzjs)'{model.pzjs}'涓嶅悎娉�!瑕佹眰:鐗╂枡鏁伴噺锛�");
+                }
+
+                var outboundPlan = db.Queryable<TN_Outbound_Plan>()
+                    .Where(p => p.JHDH == model.jhdh).First();
+                if (outboundPlan != null) {
+                    return NewErpResult(1, preLog + $"璁″垝鍗曞彿'{model.jhdh}'宸插湪[鍑哄簱璁″垝鍗昡涓瓨鍦�!");
+                }
+
+                outboundPlan = new TN_Outbound_Plan {
+                    JHDH = model.jhdh, // 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
+                    CKZT = model.ckzt, // 鍑哄簱鐘舵� (闇�杩斿洖) 
+                    JHLB = model.jhlb, // 璁″垝绫诲埆
+                    CKDH = model.ckdh, // 鍙傝�鍗曞彿
+                    CPH = model.cph, // 杞︾墝鍙�+                    YSFS = model.ysfs, // 杩愯緭鏂瑰紡
+                    CPZT = model.cpzt, // 浜у搧鐘舵�
+                    MDDW = model.mddw, // 涔版柇鍗曚綅
+                    CPDM = model.cpdm, // 浜у搧浠g爜
+                    CPLB = model.cplb, // 浜у搧绫诲埆
+                    CPLBMX = model.cplbmx, // 浜у搧绫诲埆鏄庣粏
+                    PP = model.pp, // 鍝佺墝
+                    DJ = model.dj, // 绛夌骇 (闇�杩斿洖) 
+                    GH = model.gh, // 缃愬彿
+                    PH = model.ph, // 鎵瑰彿 (闇�杩斿洖) 
+                    BZLX = model.bzlx, // 鍖呰绫诲瀷
+                    PZDH = model.pzdh, // 娲捐鍗曞彿
+                    PZD_DW = model.pzd_dw, // 娲捐鍗曞崟浣�+                    PZD_DYBH = model.pzd_dybh, // 娲捐鍗曡皟杩愮紪鍙�+                    PZJS = model.pzjs, // 娲捐浠舵暟
+                    PZSL = model.pzsl, // 娲捐鏁伴噺
+                    PZ_RQ = model.pz_rq, // 娲捐鏃ユ湡(yyyy-mm-dd)
+                    PZ_CZRQ = model.pz_czrq, // 娲捐鎿嶄綔鏃ユ湡
+                    PZ_ZFBJ = model.pz_zfbj, // 娲捐浣滃簾鏍囪
+                    PZ_ZFRQ = model.pz_zfrq, // 娲捐浣滃簾鏃ユ湡
+                    PZ_BZ = model.pz_bz, // 娲捐澶囨敞
+                    CKDBH = model.ckdbh, // 鍑哄簱鍗曠紪鍙�+                    SFJS = model.sfjs, // 瀹炲彂浠舵暟 (闇�杩斿洖) 
+                    SFSL = model.sfsl, // 瀹炲彂鏁伴噺 (闇�杩斿洖) 
+                    SFCS = model.sfcs, // 瀹炲彂杞︽暟 (闇�杩斿洖) 
+                    ZCSJ = model.zcsj, // 瑁呰溅鏃堕棿 (闇�杩斿洖) 
+                    JLDW = model.jldw, // 璁¢噺鍗曚綅 (闇�杩斿洖) 
+                    FHRQ = model.fhrq, // 鍙戣揣鏃ユ湡 (闇�杩斿洖) 
+                    CKDM = model.ckdm, // 浠撳簱浠g爜 (闇�杩斿洖) 
+                    FHR = model.fhr, // 鍙戣揣浜�(闇�杩斿洖) 
+                    CZYDM = model.czydm, // 鎿嶄綔鍛�(闇�杩斿洖) 
+                    SHR_USERNAME = model.shr_username, // 瀹℃牳浜�+                    SHRQ = model.shrq, // 瀹℃牳鏃ユ湡
+                    ZFBJ = model.zfbj, // 浣滃簾鏍囪
+                    ZFRQ = model.zfrq, // 浣滃簾鏃ユ湡
+                    JSDW = model.jsdw, // 缁撶畻鍗曚綅
+                    SHDW = model.shdw, // 鏀惰揣鍗曚綅
+                    YSDW = model.ysdw, // 杩愯緭鍗曚綅
+                    LXR = model.lxr, // 鑱旂郴浜�+                    RY_ZXG = model.ry_zxg, // 瑁呭嵏宸�(闇�杩斿洖) 
+                    RY_CCSJ = model.ry_ccsj, // 鍙夎溅鍙告満 (闇�杩斿洖) 
+                    ERPHX_JHDH = model.erphx_jhdh, // erp浜よ揣鍗曞彿
+                    ERPHX_WLBM = model.erphx_wlbm, // erp鐗╂枡缂栫爜
+                    ERPHX_WLMC = model.erphx_wlmc, // erp鐗╂枡鍚嶇О
+                    ERPHX_CJRQ = model.erphx_cjrq, // erp鍒涘缓鏃ユ湡
+                    HW = model.hw, // 璐т綅 (闇�杩斿洖) 
+                    HWZT = model.hwzt // 璐т綅鐘舵� (闇�杩斿洖) 
+                };
+
+                var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_ITEM_CODE == model.cpdm && d.N_ITEM_NUM >= model.pzjs).First();
+                if (cgDetail == null) {
+                    return NewErpResult(2, preLog + $"鍦╗璐у搧鏄庣粏琛╙涓病鏈夋壘鍒板悎閫傜殑鐗╂枡!瑕佹眰:鐗╂枡缂栫爜='{model.cpdm}',鐗╂枡鏁伴噺>={model.pzjs}");
+                }
+
+                var order = new TN_Outbound_Order {
+                    S_NO = orderNo,
+                    //S_ITEM_CODE = model.cpdm,
+                    //S_BATCH = model.ph,
+                    //N_END_NUM = (int)model.pzsl,
+                    S_ITEM_CODE = model.cpdm,
+                    S_BATCH = cgDetail.S_BATCH_NO,
+                    N_END_NUM = (int)model.pzjs,
+                    S_END_AREA = "QCCKQ", // ERP涓嬪彂鍑哄簱浠诲姟涓烘苯杞﹀嚭搴撳尯
+                    S_BS_NO = model.jhdh,
+                    S_BS_TYPE = "ERP",
+                };
+
+                var detailList = new List<TN_Outbound_Detail>();
+                var detail = new TN_Outbound_Detail {
+                    S_OO_NO = orderNo,
+                    S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+                    S_BATCH_NO = cgDetail.S_BATCH_NO,
+                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                    N_COUNT = cgDetail.N_ITEM_NUM,
+                    S_END_AREA = order.S_END_AREA, // order涓篸etail鐨勬瘡涓�釜璐т綅璁剧疆缁堢偣鍊�+                    S_BS_NO = order.S_BS_NO,
+                    S_BS_TYPE = order.S_BS_TYPE,
+                };
+                detailList.Add(detail);
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewErpResult(500, preLog + $"鐢熸垚[鍑哄簱鍗昡澶辫触!!鏁版嵁:\n\n{JsonConvert.SerializeObject(order)}\n");
+                    }
+
+                    if (db.Insertable(detailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewErpResult(500, preLog + $"鐢熸垚[鍑哄簱鍗曟槑缁哴澶辫触!!鏁版嵁:\n\n{JsonConvert.SerializeObject(detailList)}\n");
+                    }
+
+                    if (db.Insertable(outboundPlan).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewErpResult(500, preLog + $"鎻掑叆[鍑哄簱璁″垝璁板綍琛╙澶辫触!!鏁版嵁:\n\n{JsonConvert.SerializeObject(outboundPlan)}\n");
+                    }
+
+                    tran.CommitTran();
+                    return NewErpResult(0, preLog + $"鐢熸垚[鍑哄簱鍗昡鎴愬姛!!\n\n鍑哄簱鍗�{JsonConvert.SerializeObject(order)}\n鍑哄簱鍗曟槑缁�{JsonConvert.SerializeObject(detailList)}\n");
+                }
+            }
+            catch (Exception ex) {
+                return NewErpResult(1, preLog + $"鍙戠敓浜嗗紓甯�{ex.Message}\n\n{ex.StackTrace}\n");
+            }
+        }
+    }
+
+    public partial class ErpModel {
+        /// <summary>
+        /// 鍙嶉 ERP 鐨勬暟鎹被鍨�+        /// </summary>
+        public class ErpResult {
+            [JsonProperty("code")]
+            public int Code { get; set; }
+            [JsonProperty("message")]
+            public string Message { get; set; }
+        }
+
+        public static ErpResult NewErpResult(int code, string message, string name = "") {
+            LogHelper.Info(message, name);
+            return new ErpResult { Code = code, Message = message };
+        }
+
+        public static ErpResult NewErpResult(Exception ex, string preLog = "", int errCode = -1) {
+            LogHelper.InfoEx(ex, preLog);
+            return new ErpResult { Code = errCode, Message = $"鍙戠敓浜哰寮傚父]:{ex.Message}" };
+        }
+    } 
+
 }
\ No newline at end of file
diff --git a/api/ErpModel.CreateTaskReturnErpInfo.cs b/api/ErpModel.CreateTaskReturnErpInfo.cs
new file mode 100644
index 0000000..2cedf77
--- /dev/null
+++ b/api/ErpModel.CreateTaskReturnErpInfo.cs
@@ -0,0 +1,271 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.Mobox3.DSZSH.api {
+    public partial class ErpModel {
+        public class CreateTaskReturnErpInfo {
+            /// <summary>
+            /// 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
+            /// </summary>
+            public string jhdh { get; set; }
+
+            /// <summary>
+            /// 鍑哄簱鐘舵�
+            /// </summary>
+            public string ckzt { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 璁″垝绫诲埆
+            /// </summary>
+            public string jhlb { get; set; }
+
+            /// <summary>
+            /// 鍙傝�鍗曞彿
+            /// </summary>
+            public string ckdh { get; set; }
+
+            /// <summary>
+            /// 杞︾墝鍙�+            /// </summary>
+            public string cph { get; set; }
+
+            /// <summary>
+            /// 杩愯緭鏂瑰紡
+            /// </summary>
+            public string ysfs { get; set; }
+
+            /// <summary>
+            /// 浜у搧鐘舵�
+            /// </summary>
+            public string cpzt { get; set; }
+
+            /// <summary>
+            /// 涔版柇鍗曚綅
+            /// </summary>
+            public string mddw { get; set; }
+
+            /// <summary>
+            /// 浜у搧浠g爜
+            /// </summary>
+            public string cpdm { get; set; }
+
+            /// <summary>
+            /// 浜у搧绫诲埆
+            /// </summary>
+            public string cplb { get; set; }
+
+            /// <summary>
+            /// 浜у搧绫诲埆鏄庣粏
+            /// </summary>
+            public string cplbmx { get; set; }
+
+            /// <summary>
+            /// 鍝佺墝
+            /// </summary>
+            public string pp { get; set; }
+
+            /// <summary>
+            /// 绛夌骇
+            /// </summary>
+            public string dj { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 缃愬彿
+            /// </summary>
+            public string gh { get; set; }
+
+            /// <summary>
+            /// 鎵瑰彿
+            /// </summary>
+            public string ph { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 鍖呰绫诲瀷
+            /// </summary>
+            public string bzlx { get; set; }
+
+            /// <summary>
+            /// 娲捐鍗曞彿
+            /// </summary>
+            public string pzdh { get; set; }
+
+            /// <summary>
+            /// 娲捐鍗曞崟浣�+            /// </summary>
+            public string pzd_dw { get; set; }
+
+            /// <summary>
+            /// 娲捐鍗曡皟杩愮紪鍙�+            /// </summary>
+            public string pzd_dybh { get; set; }
+
+            /// <summary>
+            /// 娲捐浠舵暟
+            /// </summary>
+            public double pzjs { get; set; }
+
+            /// <summary>
+            /// 娲捐鏁伴噺
+            /// </summary>
+            public decimal pzsl { get; set; }
+
+            /// <summary>
+            /// 娲捐鏃ユ湡(yyyy-mm-dd)
+            /// </summary>
+            public string pz_rq { get; set; }
+
+            /// <summary>
+            /// 娲捐鎿嶄綔鏃ユ湡
+            /// </summary>
+            public long pz_czrq { get; set; }
+
+            /// <summary>
+            /// 娲捐浣滃簾鏍囪
+            /// </summary>
+            public int pz_zfbj { get; set; }
+
+            /// <summary>
+            /// 娲捐浣滃簾鏃ユ湡
+            /// </summary>
+            public long pz_zfrq { get; set; }
+
+            /// <summary>
+            /// 娲捐澶囨敞
+            /// </summary>
+            public string pz_bz { get; set; }
+
+            /// <summary>
+            /// 鍑哄簱鍗曠紪鍙�+            /// </summary>
+            public string ckdbh { get; set; }
+
+            ///// <summary>
+            ///// 瀹炲彂浠舵暟
+            ///// </summary>
+            //public double sfjs { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 瀹炲彂鏁伴噺
+            ///// </summary>
+            //public decimal sfsl { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 瀹炲彂杞︽暟
+            ///// </summary>
+            //public int sfcs { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 瑁呰溅鏃堕棿
+            ///// </summary>
+            //public string zcsj { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 璁¢噺鍗曚綅
+            ///// </summary>
+            //public string jldw { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鍙戣揣鏃ユ湡
+            ///// </summary>
+            //public long fhrq { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 浠撳簱浠g爜
+            ///// </summary>
+            //public string ckdm { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鍙戣揣浜�+            ///// </summary>
+            //public string fhr { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鎿嶄綔鍛�+            ///// </summary>
+            //public string czydm { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 瀹℃牳浜�+            /// </summary>
+            public string shr_username { get; set; }
+
+            /// <summary>
+            /// 瀹℃牳鏃ユ湡
+            /// </summary>
+            public long shrq { get; set; }
+
+            /// <summary>
+            /// 浣滃簾鏍囪
+            /// </summary>
+            public long zfbj { get; set; }
+
+            /// <summary>
+            /// 浣滃簾鏃ユ湡
+            /// </summary>
+            public long zfrq { get; set; }
+
+            /// <summary>
+            /// 缁撶畻鍗曚綅
+            /// </summary>
+            public string jsdw { get; set; }
+
+            /// <summary>
+            /// 鏀惰揣鍗曚綅
+            /// </summary>
+            public string shdw { get; set; }
+
+            /// <summary>
+            /// 杩愯緭鍗曚綅
+            /// </summary>
+            public string ysdw { get; set; }
+
+            /// <summary>
+            /// 鑱旂郴浜�+            /// </summary>
+            public string lxr { get; set; }
+
+            ///// <summary>
+            ///// 瑁呭嵏宸�+            ///// </summary>
+            //public string ry_zxg { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鍙夎溅鍙告満
+            ///// </summary>
+            //public string ry_ccsj { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// erp浜よ揣鍗曞彿
+            /// </summary>
+            public string erphx_jhdh { get; set; }
+
+            /// <summary>
+            /// erp鐗╂枡缂栫爜
+            /// </summary>
+            public string erphx_wlbm { get; set; }
+
+            /// <summary>
+            /// erp鐗╂枡鍚嶇О
+            /// </summary>
+            public string erphx_wlmc { get; set; }
+
+            /// <summary>
+            /// erp鍒涘缓鏃ユ湡
+            /// </summary>
+            public string erphx_cjrq { get; set; }
+
+            /// <summary>
+            /// 璐т綅
+            /// </summary>
+            public string hw { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 璐т綅鐘舵�
+            /// </summary>
+            public string hwzt { get; set; } // 闇�杩斿洖
+        }
+    }
+}
diff --git a/api/ErpModel.ErpSendOutboundPlanInfo.cs b/api/ErpModel.ErpSendOutboundPlanInfo.cs
new file mode 100644
index 0000000..dc504f9
--- /dev/null
+++ b/api/ErpModel.ErpSendOutboundPlanInfo.cs
@@ -0,0 +1,276 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HH.WCS.Mobox3.DSZSH.util;
+using Newtonsoft.Json;
+
+namespace HH.WCS.Mobox3.DSZSH.api {
+    public partial class ErpModel {
+        /// <summary>
+        /// ERP 涓嬪彂鍑哄簱浠诲姟鐨勬暟鎹被鍨�+        /// </summary>
+        public class ErpSendOutboundPlanInfo {
+            /// <summary>
+            /// 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
+            /// </summary>
+            public string jhdh { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 鍑哄簱鐘舵�
+            /// </summary>
+            public string ckzt { get; set; } = string.Empty;// 闇�杩斿洖
+
+            /// <summary>
+            /// 璁″垝绫诲埆
+            /// </summary>
+            public string jhlb { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 鍙傝�鍗曞彿
+            /// </summary>
+            public string ckdh { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 杞︾墝鍙�+            /// </summary>
+            public string cph { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 杩愯緭鏂瑰紡
+            /// </summary>
+            public string ysfs { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 浜у搧鐘舵�
+            /// </summary>
+            public string cpzt { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 涔版柇鍗曚綅
+            /// </summary>
+            public string mddw { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 浜у搧浠g爜
+            /// </summary>
+            public string cpdm { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 浜у搧绫诲埆
+            /// </summary>
+            public string cplb { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 浜у搧绫诲埆鏄庣粏
+            /// </summary>
+            public string cplbmx { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 鍝佺墝
+            /// </summary>
+            public string pp { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 绛夌骇
+            /// </summary>
+            public string dj { get; set; } = string.Empty;// 闇�杩斿洖
+
+            /// <summary>
+            /// 缃愬彿
+            /// </summary>
+            public string gh { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 鎵瑰彿
+            /// </summary>
+            public string ph { get; set; } = string.Empty;// 闇�杩斿洖
+
+            /// <summary>
+            /// 鍖呰绫诲瀷
+            /// </summary>
+            public string bzlx { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 娲捐鍗曞彿
+            /// </summary>
+            public string pzdh { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 娲捐鍗曞崟浣�+            /// </summary>
+            public string pzd_dw { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 娲捐鍗曡皟杩愮紪鍙�+            /// </summary>
+            public string pzd_dybh { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 娲捐浠舵暟
+            /// </summary>
+            public double pzjs { get; set; } = 0;
+
+            /// <summary>
+            /// 娲捐鏁伴噺
+            /// </summary>
+            public decimal pzsl { get; set; } = 0;
+
+            /// <summary>
+            /// 娲捐鏃ユ湡(yyyy-mm-dd)
+            /// </summary>
+            public string pz_rq { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 娲捐鎿嶄綔鏃ユ湡
+            /// </summary>
+            public long pz_czrq { get; set; } = 0;
+
+            /// <summary>
+            /// 娲捐浣滃簾鏍囪
+            /// </summary>
+            public int pz_zfbj { get; set; } = 0;
+
+            /// <summary>
+            /// 娲捐浣滃簾鏃ユ湡
+            /// </summary>
+            public long pz_zfrq { get; set; } = 0;
+
+            /// <summary>
+            /// 娲捐澶囨敞
+            /// </summary>
+            public string pz_bz { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 鍑哄簱鍗曠紪鍙�+            /// </summary>
+            public string ckdbh { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 瀹炲彂浠舵暟
+            /// </summary>
+            public double sfjs { get; set; } = 0; // 闇�杩斿洖
+
+            /// <summary>
+            /// 瀹炲彂鏁伴噺
+            /// </summary>
+            public decimal sfsl { get; set; } = 0; // 闇�杩斿洖
+
+            /// <summary>
+            /// 瀹炲彂杞︽暟
+            /// </summary>
+            public int sfcs { get; set; } = 0; // 闇�杩斿洖
+
+            /// <summary>
+            /// 瑁呰溅鏃堕棿
+            /// </summary>
+            public string zcsj { get; set; } = string.Empty; // 闇�杩斿洖
+
+            /// <summary>
+            /// 璁¢噺鍗曚綅
+            /// </summary>
+            public string jldw { get; set; } = string.Empty;// 闇�杩斿洖
+
+            /// <summary>
+            /// 鍙戣揣鏃ユ湡
+            /// </summary>
+            public long fhrq { get; set; } = 0; // 闇�杩斿洖
+
+            /// <summary>
+            /// 浠撳簱浠g爜
+            /// </summary>
+            public string ckdm { get; set; } = string.Empty; // 闇�杩斿洖
+
+            /// <summary>
+            /// 鍙戣揣浜�+            /// </summary>
+            public string fhr { get; set; } = string.Empty; // 闇�杩斿洖
+
+            /// <summary>
+            /// 鎿嶄綔鍛�+            /// </summary>
+            public string czydm { get; set; } = string.Empty; // 闇�杩斿洖
+
+            /// <summary>
+            /// 瀹℃牳浜�+            /// </summary>
+            public string shr_username { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 瀹℃牳鏃ユ湡
+            /// </summary>
+            public long shrq { get; set; } = 0;
+
+            /// <summary>
+            /// 浣滃簾鏍囪
+            /// </summary>
+            public long zfbj { get; set; } = 0;
+
+            /// <summary>
+            /// 浣滃簾鏃ユ湡
+            /// </summary>
+            public long zfrq { get; set; } = 0;
+
+            /// <summary>
+            /// 缁撶畻鍗曚綅
+            /// </summary>
+            public string jsdw { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 鏀惰揣鍗曚綅
+            /// </summary>
+            public string shdw { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 杩愯緭鍗曚綅
+            /// </summary>
+            public string ysdw { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 鑱旂郴浜�+            /// </summary>
+            public string lxr { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 瑁呭嵏宸�+            /// </summary>
+            public string ry_zxg { get; set; } = string.Empty; // 闇�杩斿洖
+
+            /// <summary>
+            /// 鍙夎溅鍙告満
+            /// </summary>
+            public string ry_ccsj { get; set; } = string.Empty; // 闇�杩斿洖
+
+            /// <summary>
+            /// erp浜よ揣鍗曞彿
+            /// </summary>
+            public string erphx_jhdh { get; set; } = string.Empty;
+
+            /// <summary>
+            /// erp鐗╂枡缂栫爜
+            /// </summary>
+            public string erphx_wlbm { get; set; } = string.Empty;
+
+            /// <summary>
+            /// erp鐗╂枡鍚嶇О
+            /// </summary>
+            public string erphx_wlmc { get; set; } = string.Empty;
+
+            /// <summary>
+            /// erp鍒涘缓鏃ユ湡
+            /// </summary>
+            public string erphx_cjrq { get; set; } = string.Empty;
+
+            /// <summary>
+            /// 璐т綅
+            /// </summary>
+            public string hw { get; set; } = string.Empty; // 闇�杩斿洖
+
+            /// <summary>
+            /// 璐т綅鐘舵�
+            /// </summary>
+            public string hwzt { get; set; } = string.Empty; // 闇�杩斿洖
+        }
+    }
+}
diff --git a/api/ErpModel.PickUpReturnErpInfo.cs b/api/ErpModel.PickUpReturnErpInfo.cs
new file mode 100644
index 0000000..b7628c7
--- /dev/null
+++ b/api/ErpModel.PickUpReturnErpInfo.cs
@@ -0,0 +1,271 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.Mobox3.DSZSH.api {
+    public partial class ErpModel {
+        public class PickUpReturnErpInfo {
+            /// <summary>
+            /// 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
+            /// </summary>
+            public string jhdh { get; set; }
+
+            /// <summary>
+            /// 鍑哄簱鐘舵�
+            /// </summary>
+            public string ckzt { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 璁″垝绫诲埆
+            /// </summary>
+            public string jhlb { get; set; }
+
+            /// <summary>
+            /// 鍙傝�鍗曞彿
+            /// </summary>
+            public string ckdh { get; set; }
+
+            /// <summary>
+            /// 杞︾墝鍙�+            /// </summary>
+            public string cph { get; set; }
+
+            /// <summary>
+            /// 杩愯緭鏂瑰紡
+            /// </summary>
+            public string ysfs { get; set; }
+
+            /// <summary>
+            /// 浜у搧鐘舵�
+            /// </summary>
+            public string cpzt { get; set; }
+
+            /// <summary>
+            /// 涔版柇鍗曚綅
+            /// </summary>
+            public string mddw { get; set; }
+
+            /// <summary>
+            /// 浜у搧浠g爜
+            /// </summary>
+            public string cpdm { get; set; }
+
+            /// <summary>
+            /// 浜у搧绫诲埆
+            /// </summary>
+            public string cplb { get; set; }
+
+            /// <summary>
+            /// 浜у搧绫诲埆鏄庣粏
+            /// </summary>
+            public string cplbmx { get; set; }
+
+            /// <summary>
+            /// 鍝佺墝
+            /// </summary>
+            public string pp { get; set; }
+
+            /// <summary>
+            /// 绛夌骇
+            /// </summary>
+            public string dj { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 缃愬彿
+            /// </summary>
+            public string gh { get; set; }
+
+            /// <summary>
+            /// 鎵瑰彿
+            /// </summary>
+            public string ph { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 鍖呰绫诲瀷
+            /// </summary>
+            public string bzlx { get; set; }
+
+            /// <summary>
+            /// 娲捐鍗曞彿
+            /// </summary>
+            public string pzdh { get; set; }
+
+            /// <summary>
+            /// 娲捐鍗曞崟浣�+            /// </summary>
+            public string pzd_dw { get; set; }
+
+            /// <summary>
+            /// 娲捐鍗曡皟杩愮紪鍙�+            /// </summary>
+            public string pzd_dybh { get; set; }
+
+            /// <summary>
+            /// 娲捐浠舵暟
+            /// </summary>
+            public double pzjs { get; set; }
+
+            /// <summary>
+            /// 娲捐鏁伴噺
+            /// </summary>
+            public decimal pzsl { get; set; }
+
+            /// <summary>
+            /// 娲捐鏃ユ湡(yyyy-mm-dd)
+            /// </summary>
+            public string pz_rq { get; set; }
+
+            /// <summary>
+            /// 娲捐鎿嶄綔鏃ユ湡
+            /// </summary>
+            public long pz_czrq { get; set; }
+
+            /// <summary>
+            /// 娲捐浣滃簾鏍囪
+            /// </summary>
+            public int pz_zfbj { get; set; }
+
+            /// <summary>
+            /// 娲捐浣滃簾鏃ユ湡
+            /// </summary>
+            public long pz_zfrq { get; set; }
+
+            /// <summary>
+            /// 娲捐澶囨敞
+            /// </summary>
+            public string pz_bz { get; set; }
+
+            /// <summary>
+            /// 鍑哄簱鍗曠紪鍙�+            /// </summary>
+            public string ckdbh { get; set; }
+
+            /// <summary>
+            /// 瀹炲彂浠舵暟
+            /// </summary>
+            public double sfjs { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 瀹炲彂鏁伴噺
+            /// </summary>
+            public decimal sfsl { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 瀹炲彂杞︽暟
+            ///// </summary>
+            //public int sfcs { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 瑁呰溅鏃堕棿
+            ///// </summary>
+            //public string zcsj { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 璁¢噺鍗曚綅
+            ///// </summary>
+            //public string jldw { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鍙戣揣鏃ユ湡
+            ///// </summary>
+            //public long fhrq { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 浠撳簱浠g爜
+            ///// </summary>
+            //public string ckdm { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鍙戣揣浜�+            ///// </summary>
+            //public string fhr { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鎿嶄綔鍛�+            ///// </summary>
+            //public string czydm { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 瀹℃牳浜�+            /// </summary>
+            public string shr_username { get; set; }
+
+            /// <summary>
+            /// 瀹℃牳鏃ユ湡
+            /// </summary>
+            public long shrq { get; set; }
+
+            /// <summary>
+            /// 浣滃簾鏍囪
+            /// </summary>
+            public long zfbj { get; set; }
+
+            /// <summary>
+            /// 浣滃簾鏃ユ湡
+            /// </summary>
+            public long zfrq { get; set; }
+
+            /// <summary>
+            /// 缁撶畻鍗曚綅
+            /// </summary>
+            public string jsdw { get; set; }
+
+            /// <summary>
+            /// 鏀惰揣鍗曚綅
+            /// </summary>
+            public string shdw { get; set; }
+
+            /// <summary>
+            /// 杩愯緭鍗曚綅
+            /// </summary>
+            public string ysdw { get; set; }
+
+            /// <summary>
+            /// 鑱旂郴浜�+            /// </summary>
+            public string lxr { get; set; }
+
+            ///// <summary>
+            ///// 瑁呭嵏宸�+            ///// </summary>
+            //public string ry_zxg { get; set; } // 闇�杩斿洖
+
+            ///// <summary>
+            ///// 鍙夎溅鍙告満
+            ///// </summary>
+            //public string ry_ccsj { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// erp浜よ揣鍗曞彿
+            /// </summary>
+            public string erphx_jhdh { get; set; }
+
+            /// <summary>
+            /// erp鐗╂枡缂栫爜
+            /// </summary>
+            public string erphx_wlbm { get; set; }
+
+            /// <summary>
+            /// erp鐗╂枡鍚嶇О
+            /// </summary>
+            public string erphx_wlmc { get; set; }
+
+            /// <summary>
+            /// erp鍒涘缓鏃ユ湡
+            /// </summary>
+            public string erphx_cjrq { get; set; }
+
+            /// <summary>
+            /// 璐т綅
+            /// </summary>
+            public string hw { get; set; } // 闇�杩斿洖
+
+            /// <summary>
+            /// 璐т綅鐘舵�
+            /// </summary>
+            public string hwzt { get; set; } // 闇�杩斿洖
+        }
+    }
+}
diff --git a/api/ForceController.cs b/api/ForceController.cs
index c19181d..11c25cf 100644
--- a/api/ForceController.cs
+++ b/api/ForceController.cs
@@ -51,7 +51,7 @@
                     return NewSimpleResult(3, preLog + LogMsg.EndLocNotFound(model.EndLoc, null, -1));
                 }
 
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, model.CntId, taskInfo.TaskName);
+                var task = WCSHelper.BuildTaskAndLockLoc(startLoc, endLoc, model.CntId, taskInfo.TaskName);
 
                 (ok, msg) = DbTran.CreateTask(new CreateTaskObj {
                     StartLocToUpdate = startLoc,
diff --git a/api/MoboxController.cs b/api/MoboxController.cs
index 71c46e0..9b723bb 100644
--- a/api/MoboxController.cs
+++ b/api/MoboxController.cs
@@ -122,6 +122,5 @@
                 return ApiHelper.FinishedOutbound(model);
             }
         }
-
     }
 }
diff --git a/core/Monitor.cs b/core/Monitor.cs
index da491d5..86fafc7 100644
--- a/core/Monitor.cs
+++ b/core/Monitor.cs
@@ -69,7 +69,9 @@
 
         public static void CheckOutboundOrder() {
             var db = new SqlHelper<object>().GetInstance();
-            var taskInfo = Settings.GetTaskInfo(ETask.C鎴愬搧鑳跺嚭搴�;
+            var (ok, msg) = (false, string.Empty);
+
+            var taskInfo = ETask.C鎴愬搧鑳跺嚭搴�Info();
             var taskName = "鍑哄簱";
             const string preLog = "杞:鍑哄簱:";
 
@@ -139,41 +141,22 @@
                     }
                     
                     detail.N_B_STATE = 2;
+                    detail.T_MODIFY = DateTime.Now;
 
-                    var cntId = detail.S_CNTR_CODE;
-
-                    var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, cntId, taskName);
+                    var task = WCSHelper.BuildTaskAndLockLoc(startLoc, endLoc, detail.S_CNTR_CODE, taskName);
                     task.S_OP_CODE = detail.S_OO_NO;
                     if (string.IsNullOrEmpty(detail.S_BS_NO)) {
                         task.S_BS_NO = detail.S_BS_NO;
                         task.S_BS_TYPE = "ERP";
                     }
 
-                    using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info($"杞:{taskName}:淇敼鏄庣粏琛ㄧ姸鎬佷负瀹屾垚--澶辫触!");
-                            continue;
-                        }
-
-                        // 鏇存柊[璧风偣/缁堢偣]閿佺姸鎬�鍒涘缓浠诲姟
-                        if (db.Updateable(startLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, it.N_CURRENT_NUM, }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鏇存柊[璧风偣璐т綅閿佺姸鎬乚澶辫触!璧风偣='{startLoc.S_CODE}',閿佺姸鎬�>'鍑哄簱閿�");
-                        }
-                        if (db.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鏇存柊[缁堢偣璐т綅閿佺姸鎬乚澶辫触!缁堢偣='{endLoc.S_CODE}',閿佺姸鎬�>'鍏ュ簱閿�");
-                        }
-                        if (db.Insertable(task).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鐢熸垚浠诲姟'{task.S_TYPE}'澶辫触!浠诲姟鍙�{task.S_CODE},瀹瑰櫒鍙�{task.S_CNTR_CODE},璧风偣={task.S_START_LOC},缁堢偣={task.S_END_LOC}");
-                        }
-
-                        // 鎻愪氦鏁版嵁搴撴洿鏀�-                        tran.CommitTran();
-                        LogHelper.Info(preLog + $"鐢熸垚浠诲姟'{task.S_TYPE}'鎴愬姛!浠诲姟鍙�{task.S_CODE},瀹瑰櫒鍙�{task.S_CNTR_CODE},璧风偣={task.S_START_LOC},缁堢偣={task.S_END_LOC}");
-                    }
+                    (ok, msg) = DbTran.CreateTaskOrderObj(new CreateTaskOrderObj {
+                        OutboundDetailToUpdate = detail,
+                        StartLocToUpdate = startLoc,
+                        EndLocToUpdate = endLoc,
+                        TaskToInsert = task,
+                    });
+                    LogHelper.Info(preLog + msg);
 
                     // 濡傛灉褰撳墠鍑哄簱鍗曟槑缁嗘槸ERP涓嬪彂鐨�浠诲姟鍒涘缓瀹屾垚鍙嶉璐т綅淇℃伅
                     if (detail.S_BS_TYPE == "ERP") {
@@ -193,7 +176,9 @@
 
         public static void CheckCheckOrder() {
             var db = new SqlHelper<object>().GetInstance();
-            var taskInfo = Settings.GetTaskInfo(ETask.C鎶芥鍑哄簱);
+            var (ok, msg) = (false, string.Empty);
+
+            var taskInfo = ETask.C鎶芥鍑哄簱.Info();
             var taskName = taskInfo.TaskName;
             const string preLog = "杞:鎶芥:";
 
@@ -250,40 +235,19 @@
                     }
 
                     detail.N_B_STATE = 2;
+                    detail.T_MODIFY = DateTime.Now;
 
                     var cntId = detail.S_CNTR_CODE;
-                    var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, cntId, taskName);
+                    var task = WCSHelper.BuildTaskAndLockLoc(startLoc, endLoc, cntId, taskName);
                     task.S_OP_CODE = detail.S_OO_NO;
 
-                    using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"淇敼{taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触!");
-                            continue;
-                        }
-
-                        if (db.Updateable(startLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, it.N_CURRENT_NUM, }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鏇存柊[璧风偣璐т綅閿佺姸鎬乚澶辫触!璧风偣='{startLoc.S_CODE}',閿佺姸鎬�>'鍑哄簱閿�");
-                            continue;
-                        }
-
-                        if (db.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鏇存柊[缁堢偣璐т綅閿佺姸鎬乚澶辫触!缁堢偣='{endLoc.S_CODE}',閿佺姸鎬�>'鍏ュ簱閿�");
-                            continue;
-                        }
-
-                        if (db.Insertable(task).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鐢熸垚浠诲姟'{taskName}'澶辫触,浠诲姟鍙�{task.S_CODE},瀹瑰櫒鍙�{cntId},璧风偣={startLoc.S_CODE},缁堢偣={endLoc.S_CODE}");
-                            continue;
-                        }
-
-                        tran.CommitTran();
-                        LogHelper.Info(preLog + $"鐢熸垚浠诲姟'{taskName}'鎴愬姛,浠诲姟鍙�{task.S_CODE},瀹瑰櫒鍙�{cntId},璧风偣={startLoc.S_CODE},缁堢偣={endLoc.S_CODE}");
-                        continue;
-                    }
+                    (ok, msg) = DbTran.CreateTaskOrderObj(new CreateTaskOrderObj {
+                        SpotCheckDetailToUpdate = detail,
+                        StartLocToUpdate = startLoc,
+                        EndLocToUpdate = endLoc,
+                        TaskToInsert = task,
+                    });
+                    LogHelper.Info(preLog + msg);
                 }
             }
             catch (Exception ex) {
@@ -293,7 +257,9 @@
 
         public static void CheckShiftOrder() {                
             var db = new SqlHelper<object>().GetInstance();
-            var taskInfo = Settings.GetTaskInfo(ETask.Y绉诲簱);
+            var (ok, msg) = (false, string.Empty);
+
+            var taskInfo = ETask.Y绉诲簱.Info();
             var taskName = taskInfo.TaskName;
             const string preLog = "杞:绉诲簱:";
             
@@ -337,63 +303,35 @@
                 }
 
                 foreach (var detail in detailList) {
-                    var startLoc = db.Queryable<TN_Location>()
-                        .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
-                        .Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE)
-                        .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") // 绛涢�:鏈笂閿�-                        .Where(l => l.N_CURRENT_NUM == 1)
-                        .First();
+                    var startLoc = db.Queryable<TN_Location>().LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
+                        .Where(DbExpr.StartLoc()).Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE).First();
 
                     if (startLoc == null) {
-                        LogHelper.Info(preLog + $"娌℃湁鎵惧埌缁堢偣璐т綅={detail.S_END_AREA}鐨勭粓鐐硅揣浣�闇�婊¤冻:鏈笂閿�褰撳墠瀹瑰櫒鏁伴噺=0");
+                        LogHelper.Info(preLog + LogMsg.StartLocNotFound() + $"缁戝畾瀹瑰櫒='{detail.S_CNTR_CODE}'");
                         continue;
                     }
 
                     var endLoc = db.Queryable<TN_Location>()
-                        .Where(l => l.S_AREA_CODE == detail.S_END_AREA)
-                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�:鏈笂閿�-                        .Where(a => a.N_CURRENT_NUM == 0).First();
-
+                        .Where(DbExpr.EndLoc(areas: new List<string> { detail.S_END_AREA })).First();
                     if (endLoc == null) {
-                        LogHelper.Info(preLog + $"娌℃湁鎵惧埌缁堢偣璐т綅={detail.S_END_AREA}鐨勭粓鐐硅揣浣�闇�婊¤冻:鏈笂閿�褰撳墠瀹瑰櫒鏁伴噺=0");
+                        LogHelper.Info(preLog + LogMsg.EndLocNotFound(areas: new List<string> { detail.S_END_AREA }));
                         continue;
                     }
 
                     detail.N_B_STATE = 2;
+                    detail.T_MODIFY = DateTime.Now;
 
                     var cntId = detail.S_CNTR_CODE;
-                    var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, cntId, taskName);
+                    var task = WCSHelper.BuildTaskAndLockLoc(startLoc, endLoc, cntId, taskName);
                     task.S_OP_CODE = detail.S_OO_NO;
 
-                    using (var tran = db.Ado.UseTran()) {
-                        if (db.Updateable(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info($"杞:{taskName}:淇敼{taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触!");
-                            continue;
-                        }
-
-                        if (db.Updateable(startLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, it.N_CURRENT_NUM, }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鏇存柊[璧风偣璐т綅閿佺姸鎬乚澶辫触!璧风偣='{startLoc.S_CODE}',閿佺姸鎬�>'鍑哄簱閿�");
-                            continue;
-                        }
-
-                        if (db.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鏇存柊[缁堢偣璐т綅閿佺姸鎬乚澶辫触!缁堢偣='{endLoc.S_CODE}',閿佺姸鎬�>'鍏ュ簱閿�");
-                            continue;
-                        }
-
-                        if (db.Insertable(task).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info(preLog + $"鐢熸垚浠诲姟'{taskName}'澶辫触,浠诲姟鍙�{task.S_CODE},瀹瑰櫒鍙�{cntId},璧风偣={startLoc.S_CODE},缁堢偣={endLoc.S_CODE}");
-                            continue;
-                        }
-
-                        tran.CommitTran();
-                        LogHelper.Info(preLog + $"鐢熸垚浠诲姟'{taskName}'鎴愬姛,浠诲姟鍙�{task.S_CODE},瀹瑰櫒鍙�{cntId},璧风偣={startLoc.S_CODE},缁堢偣={endLoc.S_CODE}");
-                        continue;
-                    }
+                    (ok, msg) = DbTran.CreateTaskOrderObj(new CreateTaskOrderObj {
+                        RelocationDetailToUpdate = detail,
+                        StartLocToUpdate = startLoc,
+                        EndLocToUpdate = endLoc,
+                        TaskToInsert = task,
+                    });
+                    LogHelper.Info(preLog + msg);
                 }
             }
             catch (Exception ex) {
@@ -422,7 +360,7 @@
                     LogHelper.Info($"璁″垝鍗曞彿{task.S_BS_NO}涓嶅瓨鍦�");
                 }
 
-                var model = new OtherModel.CreateTaskReturnErpInfo {
+                var model = new ErpModel.CreateTaskReturnErpInfo {
                     jhdh = plan.JHDH , // 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
                     ckzt = plan.CKZT , // 鍑哄簱鐘舵� (闇�杩斿洖) 
                     jhlb = plan.JHLB , // 璁″垝绫诲埆
diff --git a/core/WCSCore.cs b/core/WCSCore.cs
index 26a01cd..8404866 100644
--- a/core/WCSCore.cs
+++ b/core/WCSCore.cs
@@ -195,7 +195,7 @@
             try {
                 ModbusHelper.Relink();
 
-                var BZQ = Settings.GetTaskInfo(ETask.M婊℃墭涓嬬嚎鍏ュ簱).StartAreas;
+                var BZQ = ETask.M婊℃墭涓嬬嚎鍏ュ簱.StartAreas();
                 var loc = db.Queryable<TN_Location>()
                     .Where(l => BZQ.Contains(l.S_AREA_CODE) && l.S_AGV_SITE == model.station_name).First();
 
@@ -327,7 +327,7 @@
                     LogHelper.Info($"鐗╂枡缂栫爜涓嶅瓨鍦�");
                 }
 
-                var model = new OtherModel.PickUpReturnErpInfo {
+                var model = new ErpModel.PickUpReturnErpInfo {
                     jhdh = plan.JHDH, // 璁″垝鍗曞彿 (鍞竴鏍囪瘑) 
                     ckzt = plan.CKZT, // 鍑哄簱鐘舵� (闇�杩斿洖) 
                     jhlb = plan.JHLB, // 璁″垝绫诲埆
@@ -491,10 +491,10 @@
         public static (bool, string) CreateInboundTask(string startLocCode, string cntrCode) {
             var db = new SqlHelper<object>().GetInstance();
 
-            var taskInfo = Settings.GetTaskInfo(ETask.M婊℃墭涓嬬嚎鍏ュ簱);
-            var taskName = taskInfo.TaskName;
-            var startAreas = taskInfo.StartAreas;
-            var endAreas = taskInfo.EndAreas;
+            var tInfo = ETask.M婊℃墭涓嬬嚎鍏ュ簱.Info();
+            var taskName = tInfo.TaskName;
+            var startAreas = tInfo.StartAreas;
+            var endAreas = tInfo.EndAreas;
             const string cntrType = "鎵樼洏";
 
             try {
@@ -533,7 +533,7 @@
                 }
 
                 var cntId = locCntrRel.S_CNTR_CODE;
-                var task = WCSHelper.BuildTaskWithLocLock(startLoc, endLoc, cntId, taskName);
+                var task = WCSHelper.BuildTaskAndLockLoc(startLoc, endLoc, cntId, taskName);
 
                 using (var tran = db.Ado.UseTran()) {
                     if (locCntrRelOld != null) {
diff --git a/device/ModbusFactory.cs b/device/ModbusFactory.cs
index d44947b..d03901a 100644
--- a/device/ModbusFactory.cs
+++ b/device/ModbusFactory.cs
@@ -6,7 +6,6 @@
 using Org.BouncyCastle.Utilities.Net;
 using System.Web.UI.WebControls.WebParts;
 using System.Linq;
-
 using TcpClient = System.Net.Sockets.TcpClient;
 using System.IO;
 using HH.WCS.Mobox3.DSZSH.util;
diff --git a/device/ModbusHelper.cs b/device/ModbusHelper.cs
index 7633921..43d4ccb 100644
--- a/device/ModbusHelper.cs
+++ b/device/ModbusHelper.cs
@@ -2,9 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-
 using EasyModbus;
-
 using HH.WCS.Mobox3.DSZSH.util;
 
 namespace HH.WCS.Mobox3.DSZSH.device {
diff --git a/device/OpcUaHelper.cs b/device/OpcUaHelper.cs
index 4f8922c..a916ed8 100644
--- a/device/OpcUaHelper.cs
+++ b/device/OpcUaHelper.cs
@@ -4,33 +4,25 @@
 using Opc.Ua.Configuration;
 using HH.WCS.Mobox3.DSZSH.util;
 
-
-namespace HH.WCS.Mobox3.DSZSH.device
-{
-    internal class OpcUaHelper
-    {
+namespace HH.WCS.Mobox3.DSZSH.device {
+    internal class OpcUaHelper {
         private static Opc.Ua.Client.Session session;
 
-        static OpcUaHelper()
-        {
+        static OpcUaHelper() {
             CreateUpcSession();
         }
 
         /// <summary>
         /// 杩炴帴OPC鏈嶅姟
         /// </summary>
-        internal static async void CreateUpcSession()
-        {
-            try
-            {
+        internal static async void CreateUpcSession() {
+            try {
                 // 鍒涘缓涓�釜搴旂敤閰嶇疆瀵硅薄,鐢ㄤ簬璁剧疆搴旂敤鍚嶇О,鍞竴鏍囪瘑,绫诲瀷,璇佷功鍜屽畨鍏ㄧ瓥鐣�-                var config = new ApplicationConfiguration()
-                {
+                var config = new ApplicationConfiguration() {
                     ApplicationName = "MyClient",
                     ApplicationUri = Utils.Format(@"urn:{0}:MyClient", System.Net.Dns.GetHostName()),
                     ApplicationType = ApplicationType.Client,
-                    SecurityConfiguration = new SecurityConfiguration
-                    {
+                    SecurityConfiguration = new SecurityConfiguration {
                         ApplicationCertificate = new CertificateIdentifier { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", SubjectName = "MyClientSubjectName" },
                         TrustedIssuerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities" },
                         TrustedPeerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications" },
@@ -50,8 +42,7 @@
                 await config.Validate(ApplicationType.Client);
 
                 // 璁剧疆璇佷功楠岃瘉浜嬩欢,鐢ㄤ簬鑷姩鎺ュ彈涓嶅彈淇′换鐨勮瘉涔�-                if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates)
-                {
+                if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) {
                     config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); };
                 }
 
@@ -65,19 +56,16 @@
                 EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(config);
                 ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);
                 session = await Session.Create(config, endpoint, false, false, "DataCollector", 60000, new UserIdentity(), null);
-                if (session != null && session.Connected)
-                {
+                if (session != null && session.Connected) {
                     Console.WriteLine("The session is connected to the OPC UA server.");
                     LogHelper.Info($"鍒涘缓OPC杩炴帴鎴愬姛", "OPC");
                 }
-                else
-                {
+                else {
                     Console.WriteLine("The session is not connected to the OPC UA server.");
                     LogHelper.Info($"鍒涘缓OPC杩炴帴澶辫触", "OPC");
                 }
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"杩炴帴OPC鏈嶅姟寮傚父" + e.Message, "OPC");
             }
         }
@@ -86,27 +74,22 @@
         /// 璇诲彇OPC鑺傜偣鏁版嵁
         /// </summary>
         /// <param name="nodeId"></param>
-        internal static object ReadOpcValue(string nodeId)
-        {
-            try
-            {
-                if (session != null && session.Connected)
-                {
+        internal static object ReadOpcValue(string nodeId) {
+            try {
+                if (session != null && session.Connected) {
                     // 璇诲彇鏁版嵁鑺傜偣
                     DataValue item = session.ReadValue(nodeId: nodeId);
                     LogHelper.Info($"OPC璇诲彇:nodeid:{nodeId},value:{item.Value}", "OPC");
                     return item.Value;
                 }
-                else
-                {
+                else {
                     Console.WriteLine("The session is not connected to the OPC UA server.");
                     LogHelper.Info($"OPC杩炴帴澶辫触", "OPC");
                     CreateUpcSession();
                 }
-               
+
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
 
                 LogHelper.Info($"璇诲彇OPC鏁版嵁寮傚父" + e.Message, "OPC");
             }
@@ -118,15 +101,11 @@
         /// </summary>
         /// <param name="nodeId"></param>
         /// <param name="val"></param>
-        internal static void WriteOpcValue(string nodeId,bool val)
-        {
-            try
-            {
-                if (session != null && session.Connected)
-                {
+        internal static void WriteOpcValue(string nodeId, bool val) {
+            try {
+                if (session != null && session.Connected) {
                     // 鍐欏叆鏁版嵁鍒拌妭鐐�-                    WriteValue writeValue = new WriteValue
-                    {
+                    WriteValue writeValue = new WriteValue {
                         NodeId = new NodeId(nodeId),
                         AttributeId = Attributes.Value,
                         Value = new DataValue(val)
@@ -138,16 +117,14 @@
                     Console.WriteLine($"Write Status for {nodeId}: {results[0]}");
                     LogHelper.Info($"OPC鍐欏叆:nodeid:{nodeId},value:{val}", "OPC");
                 }
-                else
-                {
+                else {
                     Console.WriteLine("The session is not connected to the OPC UA server.");
                     LogHelper.Info($"OPC杩炴帴澶辫触", "OPC");
                     CreateUpcSession();
                 }
 
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"鍐欏叆OPC鏁版嵁寮傚父" + e.Message, "OPC");
             }
         }
@@ -157,15 +134,11 @@
         /// </summary>
         /// <param name="nodeId"></param>
         /// <param name="val"></param>
-        internal static void WriteOpcValue(string nodeId, int val)
-        {
-            try
-            {
-                if (session != null && session.Connected)
-                {
+        internal static void WriteOpcValue(string nodeId, int val) {
+            try {
+                if (session != null && session.Connected) {
                     // 鍐欏叆鏁版嵁鍒拌妭鐐�-                    WriteValue writeValue = new WriteValue
-                    {
+                    WriteValue writeValue = new WriteValue {
                         NodeId = new NodeId(nodeId),
                         AttributeId = Attributes.Value,
                         Value = new DataValue(val)
@@ -177,16 +150,14 @@
                     Console.WriteLine($"Write Status for {nodeId}: {results[0]}");
                     LogHelper.Info($"OPC鍐欏叆:nodeid:{nodeId},value:{val}", "OPC");
                 }
-                else
-                {
+                else {
                     Console.WriteLine("The session is not connected to the OPC UA server.");
                     LogHelper.Info($"OPC杩炴帴澶辫触", "OPC");
                     CreateUpcSession();
                 }
 
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"鍐欏叆OPC鏁版嵁寮傚父" + e.Message, "OPC");
             }
         }
diff --git a/device/PlcHelper.cs b/device/PlcHelper.cs
deleted file mode 100644
index c25ed1d..0000000
--- a/device/PlcHelper.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using HH.WCS.Mobox3.DSZSH.process;
-
-namespace HH.WCS.Mobox3.DSZSH.device
-{
-    internal class PlcHelper
-    {
-        internal static void Receive(string ip, string msg) {
-            //澶勭悊璁惧淇″彿
-            DeviceProcess.Analysis(msg, ip);
-        }
-        internal static bool SendHex(string ip, string msg) {
-            return TcpServer.TcpServerSend(ip, Hex2Bytes(msg));
-        }
-        internal static void SendAscii(string ip, string msg) {
-            TcpServer.TcpServerSend(ip, Encoding.ASCII.GetBytes(msg));
-        }
-
-        internal static byte[] Hex2Bytes(string hexString) {
-            hexString = hexString.Replace(" ", "");
-            if ((hexString.Length % 2) != 0)
-                hexString += " ";
-            byte[] returnBytes = new byte[hexString.Length / 2];
-            for (int i = 0; i < returnBytes.Length; i++)
-                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
-
-            return returnBytes;
-        }
-        internal static string Hex2Ascii(string hexString) {
-            hexString = hexString.Replace(" ", "");
-            if ((hexString.Length % 2) != 0)
-                hexString += " ";
-            byte[] returnBytes = new byte[hexString.Length / 2];
-            for (int i = 0; i < returnBytes.Length; i++)
-                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
-
-            return Encoding.ASCII.GetString(returnBytes);
-        }
-
-        #region 杩涘埗杞崲+CRC
-        internal static bool CheckCRC(string hex) {
-            var result = false;
-            var data = hex.Replace(" ", "");
-            if (data.Length % 2 == 0) {
-                var code1 = data.Substring(data.Length - 4, 4).ToLower();
-                var code2 = BitConverter.ToString(CRC16LH(Hex2Bytes(data.Substring(0, data.Length - 4)))).Replace("-", "").Replace(" ", "").ToLower();
-                result = code1 == code2;
-            }
-            return result;
-        }
-        internal static byte[] CRC16LH(byte[] pDataBytes) {
-            ushort crc = 0xffff;
-            ushort polynom = 0xA001;
-
-            for (int i = 0; i < pDataBytes.Length; i++) {
-                crc ^= pDataBytes[i];
-                for (int j = 0; j < 8; j++) {
-                    if ((crc & 0x01) == 0x01) {
-                        crc >>= 1;
-                        crc ^= polynom;
-                    }
-                    else {
-                        crc >>= 1;
-                    }
-                }
-            }
-
-            byte[] result = BitConverter.GetBytes(crc);
-            return result;
-        }
-        internal static byte[] CRC16HL(byte[] pDataBytes) {
-            ushort crc = 0xffff;
-            ushort polynom = 0xA001;
-
-            for (int i = 0; i < pDataBytes.Length; i++) {
-                crc ^= pDataBytes[i];
-                for (int j = 0; j < 8; j++) {
-                    if ((crc & 0x01) == 0x01) {
-                        crc >>= 1;
-                        crc ^= polynom;
-                    }
-                    else {
-                        crc >>= 1;
-                    }
-                }
-            }
-
-            byte[] result = BitConverter.GetBytes(crc).Reverse().ToArray();
-            return result;
-        }
-
-        #endregion
-
-    }
-}
diff --git a/device/TcpClient.cs b/device/TcpClient.cs
deleted file mode 100644
index 4b2bda1..0000000
--- a/device/TcpClient.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-锘縰sing HH.WCS.Mobox3.DSZSH;
-using HH.WCS.Mobox3.DSZSH.device;
-using HH.WCS.Mobox3.DSZSH.util;
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Sockets;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.device {
-    internal class TcpClient
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="ip">127.0.0.1</param>
-        /// <param name="port">8888</param>
-        /// <param name="hex">01 02 00 00 00 0C 78 0F</param>
-        /// <returns></returns>
-        private static string SendHexOnce(string ip, int port, string hex) {
-            var res = string.Empty;
-            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-            client.Connect(ip, port);
-            client.ReceiveTimeout = 2000;
-            if (client.Connected) {
-                client.Send(PlcHelper.Hex2Bytes(hex));
-                byte[] buffer = new byte[1024];
-                try {
-                    var length = client.Receive(buffer, SocketFlags.None);
-                    byte[] data = new byte[length];
-                    Array.Copy(buffer, data, length);
-                    res = BitConverter.ToString(data).Replace("-", "");
-                }
-                catch (Exception ex) {
-                    LogHelper.InfoEx(ex);
-                }
-                client.Disconnect(true);
-                client.Dispose();
-            }
-            client = null;
-            return res;
-        }
-
-        /// <summary>
-        /// 璇讳繚鎸佸瘎瀛樺櫒,modbus rtu鐨勫皝瑁�-        /// </summary>
-        /// <param name="address"></param>
-        /// <param name="qty"></param>
-        /// <param name="ip"></param>
-        /// <param name="port"></param>
-        /// <returns></returns>
-        internal int[] ReadInputRegistersRtu(int address, int qty, string ip, int port = 502) {
-            List<int> res = new List<int>();
-            var hex = $"0103{address.ToString("X4")}{qty.ToString("X4")}";
-            hex = hex + BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(hex))).Replace("-", "").Replace(" ", "");
-            var data = SendHexOnce(ip, port, hex);
-            if (!string.IsNullOrEmpty(data)) {
-                if (PlcHelper.CheckCRC(data)) {
-                    var lenght = Convert.ToInt16(data.Substring(4, 2), 16) / 2;
-                    for (int i = 0; i < lenght; i++) {
-                        res[i] = Convert.ToInt16(data.Substring(6 + 4 * 1, 4), 16);
-                    }
-                }
-            }
-            return res.ToArray();
-        }
-        /// <summary>
-        /// 鍐欏崟涓瘎瀛樺櫒
-        /// </summary>
-        /// <param name="address"></param>
-        /// <param name="value"></param>
-        /// <param name="ip"></param>
-        /// <param name="port"></param>
-        internal bool WriteSingleRegisterRtu(int address, int value, string ip, int port = 502) {
-            var res = false;
-            var hex = $"0106{address.ToString("X4")}{value.ToString("X4")}";
-            hex = hex + BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(hex))).Replace("-", "").Replace(" ", "");
-            var data = SendHexOnce(ip, port, hex);
-            if (!string.IsNullOrEmpty(data)) {
-                res = true;
-            }
-            return res;
-        }
-    }
-}
diff --git a/device/TcpServer.cs b/device/TcpServer.cs
deleted file mode 100644
index 3340cb5..0000000
--- a/device/TcpServer.cs
+++ /dev/null
@@ -1,252 +0,0 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.dispatch;
-using HH.WCS.Mobox3.DSZSH.util;
-
-using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Net.Sockets;
-using System.Text;
-
-namespace HH.WCS.Mobox3.DSZSH.device
-{
-    public class TcpServer
-    {
-        public TcpServer(string ip, int port)
-        {
-            Init(ip, port);
-        }
-        private void Init(string ip, int port)
-        {
-            //鍒涘缓涓�釜鏂扮殑Socket,杩欓噷鎴戜滑浣跨敤鏈�父鐢ㄧ殑鍩轰簬TCP鐨凷tream Socket (娴佸紡濂楁帴瀛� 
-            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-            try
-            {
-                //灏嗚socket缁戝畾鍒颁富鏈轰笂闈㈢殑鏌愪釜绔彛,绔彛搴旇鏀惧埌閰嶇疆鏂囦欢涓�-                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
-                Console.WriteLine(port);
-                //鍚姩鐩戝惉,骞朵笖璁剧疆涓�釜鏈�ぇ鐨勯槦鍒楅暱搴�-                socket.Listen(30);
-                //寮�鎺ュ彈瀹㈡埛绔繛鎺ヨ姹�-                socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine(e.Message);
-            }
-        }
-        public static Dictionary<string, Socket> clients = new Dictionary<string, Socket>();
-        public static Dictionary<string, byte[]> buffers = new Dictionary<string, byte[]>();
-        public static Dictionary<string,bool> isSend = new Dictionary<string, bool>();
-        public static Dictionary<string,bool> isCheck = new Dictionary<string, bool>();
-
-        public static Dictionary<string,int> saoMa = new Dictionary<string, int>();
-
-        public static void ClientAccepted(IAsyncResult ar)
-        {
-
-            var socket = ar.AsyncState as Socket;
-            var client = socket.EndAccept(ar);
-            string remote_ip = ((System.Net.IPEndPoint)client.RemoteEndPoint).Address.ToString();
-            if (clients.Keys.Contains(remote_ip))
-            {
-                clients[remote_ip] = client;
-            }
-            else
-            {
-                clients.Add(remote_ip, client);
-            }
-            if (!buffers.Keys.Contains(remote_ip))
-            {
-                buffers.Add(remote_ip, new byte[1024]);
-            }
-
-            if (!isSend.Keys.Contains(remote_ip))
-            {
-                isSend.Add(remote_ip, false);
-            }
-
-            if (!isCheck.Keys.Contains(remote_ip))
-            {
-                isCheck.Add(remote_ip, false);
-            }
-
-            //缁欏鎴风鍙戦�涓�釜娆㈣繋娑堟伅
-            //client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));
-            Console.WriteLine(remote_ip);
-
-            try
-            {
-                client.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine($"銆愭帴鏀跺鎴风鐨勬秷鎭紓甯搞�:" + ex.Message);
-            }
-            //鍑嗗鎺ュ彈涓嬩竴涓鎴风璇锋眰
-            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
-        }
-
-
-        public static void ReceiveMessage(IAsyncResult ar)
-        {
-            try
-            {
-                var socket = ar.AsyncState as Socket;
-                string remote_ip = ((System.Net.IPEndPoint)socket.RemoteEndPoint).Address.ToString();
-                var length = socket.EndReceive(ar);
-                if (length == 0)
-                {
-                    clients.Remove(remote_ip);
-                    buffers.Remove(remote_ip);
-                    isSend.Remove(remote_ip);
-                    isCheck.Remove(remote_ip);
-                    saoMa.Remove(remote_ip);
-                    return;
-                }
-                else
-                {
-                    if (!clients.Keys.Contains(remote_ip))
-                    {
-                        clients.Add(remote_ip, socket);
-                    }
-                    if (!buffers.Keys.Contains(remote_ip))
-                    {
-                        buffers.Add(remote_ip, new byte[1024]);
-                       
-                    }
-                    if (!isSend.Keys.Contains(remote_ip))
-                    {
-                        isSend.Add(remote_ip, false);
-                    }
-                    if (!isCheck.Keys.Contains(remote_ip))
-                    {
-                        isCheck.Add(remote_ip, false);
-                    }
-                    if (!saoMa.Keys.Contains(remote_ip))
-                    {
-                        saoMa.Add(remote_ip, 3);
-                    }
-                }
-
-                    //LogHelper.Info($"鎺ユ敹鍒颁俊鎭�IP:{remote_ip},MSG:{BitConverter.ToString(buffers[remote_ip])}");
-
-                    if (buffers.Keys.Contains(remote_ip))
-                    {
-                        var messageBytes = new byte[length];
-                        Array.Copy(buffers[remote_ip], 0, messageBytes, 0, length);
-
-                    try
-                    {
-                        //璇诲崱鍣ㄦ牎楠�-                        var message = BitConverter.ToString(messageBytes);
-
-                        if (!saoMa.ContainsKey(remote_ip))
-                        {
-                            saoMa.Add(remote_ip, 3);
-                        }
-                        if (messageBytes.Length <= 20 && messageBytes.Length > 0)
-                        {
-                            saoMa[remote_ip] = 3;//鏈壂鍒扮爜
-                        }
-
-                        if (messageBytes.Length >= 21 && isCheck[remote_ip])
-                        {
-                            byte[] rfid = new byte[12];
-                            Array.Copy(messageBytes, 9, rfid, 0, 12);
-
-                            string rfids16 = BitConverter.ToString(rfid);
-                            string rfids = Encoding.ASCII.GetString(rfid);
-                            //LogHelper.Info($"璇诲崱鍣ㄦ牎楠屽搴斿鍣ㄥ彿:{rfids},鍏�6杩涘埗褰㈠紡:{rfids16}");
-                            //if (ScanCodeHelper.Analysis(remote_ip, rfids))//鏍¢獙RFID
-                            //{
-                            //    isCheck[remote_ip] = false;
-                            //    saoMa[remote_ip] = 1;//鎵爜鍖归厤
-                            //}
-                            //else
-                            //{
-                            //    isCheck[remote_ip] = false;
-                            //    saoMa[remote_ip] = 2;//鎵爜涓嶅尮閰�-                            //}
-                        }
-                        else
-                        {
-                            LogHelper.Info($"涓嶆弧瓒宠鍗″櫒鏍¢獙瑙勫畾:IP:{remote_ip},MSG:{message}");
-                        }
-                    }
-                    catch(Exception ex)
-                    {
-                        LogHelper.Info($"鎵爜鏍¢獙鍙戠敓浜嗗紓甯�{ex.Message}");
-                        saoMa[remote_ip] = 4;//鎵爜寮傚父
-                    }
-
-                    try
-                    {
-                        
-                    }
-                    catch(Exception ex)
-                    {
-                        LogHelper.Info($"鍗峰笜闂ㄦ牎楠屽彂鐢熶簡寮傚父:{ex.Message}");
-                    }
-                        //TcpServerSend(remote_ip, System.Text.Encoding.Default.GetBytes(msgSend));
-                        Array.Clear(buffers[remote_ip], 0, buffers[remote_ip].Length);//娓呯┖褰撳墠IP Buffer
-                    }
-                    else
-                    {
-                        if (!buffers.Keys.Contains(remote_ip))
-                        {
-                            buffers.Add(remote_ip, new byte[1024]);
-                        }
-                    }
-  
-                //鎺ユ敹涓嬩竴涓秷鎭�鍥犱负杩欐槸涓�釜閫掑綊鐨勮皟鐢�鎵�互杩欐牱灏卞彲浠ヤ竴鐩存帴鏀舵秷鎭簡) 
-                socket.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
-            }
-            catch (Exception ex)
-            {
-                LogHelper.InfoEx(ex);
-            }
-        }
-
-        private static string GetHexString(byte[] buffer, int lenght)
-        {
-            return BitConverter.ToString(buffer, 0, lenght).Replace("-", string.Empty).ToLower();
-        }
-
-        public static bool TcpServerSend(string ip, byte[] msg)
-        {
-            if (clients.Keys.Contains(ip))
-            {
-                var client = clients[ip];
-                if (client.Connected)
-                {
-                    try
-                    {
-                        client.Send(msg);
-                        LogHelper.Info($"宸插彂閫佺粰璇GV鍦板潃{ip},{msg}");
-                        return true;
-                    }
-                    catch (SocketException ex)
-                    {
-                        LogHelper.Info(ex.Message, "Error");
-                        clients[ip].Close();
-                        clients.Remove(ip);
-                    }
-                }
-                else
-                {
-                    clients[ip].Close();
-                    clients.Remove(ip);
-                }
-            }
-            else
-            {
-                LogHelper.Info("鏈壘鍒拌璁惧,鏄惁宸茶繛鎺ワ紵");
-            }
-            return false;
-
-        }
-
-    }
-}
diff --git a/dispatch/GZRobot.cs b/dispatch/GZRobot.cs
index 0e58b2a..b684953 100644
--- a/dispatch/GZRobot.cs
+++ b/dispatch/GZRobot.cs
@@ -5,7 +5,6 @@
 using System.Collections.Generic;
 using System.Web.Caching;
 using HH.WCS.Mobox3.DSZSH.models;
-
 using HH.WCS.Mobox3.DSZSH.util;
 using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
 
diff --git a/dispatch/HanAo.cs b/dispatch/HanAo.cs
index 422f394..e865161 100644
--- a/dispatch/HanAo.cs
+++ b/dispatch/HanAo.cs
@@ -1,5 +1,4 @@
 锘縰sing HH.WCS.Mobox3.DSZSH.util;
-
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
diff --git a/dispatch/NDC.cs b/dispatch/NDC.cs
index 1974369..d0b34e9 100644
--- a/dispatch/NDC.cs
+++ b/dispatch/NDC.cs
@@ -1,15 +1,12 @@
 锘縰sing HH.WCS.Mobox3.DSZSH.util;
-
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml;
 
-namespace HH.WCS.Mobox3.DSZSH.dispatch
-{
-    public class NDC
-    {
+namespace HH.WCS.Mobox3.DSZSH.dispatch {
+    public class NDC {
         private static HostToAGV callClient = null;
         static NDC() {
             callClient = new HostToAGV();
@@ -70,8 +67,7 @@
             sb.Append("/></Req>");
             return sb.ToString();
         }
-        public static AGVResult AddNewOrder(int ts, Dictionary<string, string> param) 
-        {
+        public static AGVResult AddNewOrder(int ts, Dictionary<string, string> param) {
             //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
 
             var bufin = GetReqStr(ts, param);
@@ -152,12 +148,10 @@
             var json = JsonConvert.SerializeXmlNode(xml);
             return JsonConvert.DeserializeObject<AGVResult>(json);
         }
-        public class AGVResult
-        {
+        public class AGVResult {
             public Res Res { get; set; }
         }
-        public class Res
-        {
+        public class Res {
             public int ErrCode { get; set; }
             public string ErrInfo { get; set; }
         }
diff --git a/dispatch/NDCApi.cs b/dispatch/NDCApi.cs
index 559e4f5..5e6a7ee 100644
--- a/dispatch/NDCApi.cs
+++ b/dispatch/NDCApi.cs
@@ -1,28 +1,22 @@
 锘縰sing HH.WCS.Mobox3.DSZSH;
 using HH.WCS.Mobox3.DSZSH.util;
-
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml;
 
-namespace HH.WCS.Mobox3.DSZSH.dispatch
-{
+namespace HH.WCS.Mobox3.DSZSH.dispatch {
     /// <summary>
     /// NDC鐨凙PI鎺ュ彛,鐢ㄤ簬鏇夸唬鍘烴DC,NDCHelper鍜孒ostToAGV妯″潡
     /// </summary>
-    public class NDCApi
-    {
+    public class NDCApi {
         public static string NDCApiUrl { set; get; }
-        static NDCApi()
-        {
+        static NDCApi() {
             NDCApiUrl = Settings.NdcApiUrl;
         }
 
-
-        public static AgvApiResult AddOrderNew(int ts, int pri, string taskNo, List<param> param)
-        {
+        public static AgvApiResult AddOrderNew(int ts, int pri, string taskNo, List<param> param) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
             var model = new AddOrderNewModel();
@@ -30,8 +24,7 @@
             model.pri = pri;
             model.task_no = taskNo;
             model.param = param;
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"NDC浠诲姟涓嬪彂:{taskNo}\n\n{jsonInfo}\n", "NDC");
                 var result = httpH.WebPost(NDCApiUrl + "Add", jsonInfo);
@@ -39,8 +32,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"浠诲姟涓嬪彂澶辫触:res='{e.Message}'", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -48,13 +40,11 @@
             }
         }
 
-        public static AgvApiResult AddOrderNew(AddOrderNewModel model)
-        {
+        public static AgvApiResult AddOrderNew(AddOrderNewModel model) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
 
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"浠诲姟{model.task_no}涓嬪彂,{jsonInfo}", "NDC");
 
@@ -64,8 +54,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"浠诲姟涓嬪彂澶辫触 res={e.Message}", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -73,15 +62,13 @@
             }
         }
 
-        public static AgvApiResult CancelOrder(string tsNo, bool is_force = true)
-        {
+        public static AgvApiResult CancelOrder(string tsNo, bool is_force = true) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
             var model = new CancelOrderModel();
             model.task_no = tsNo;
             model.is_force = is_force;
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"浠诲姟{model.task_no}鍙栨秷,{jsonInfo}", "NDC");
 
@@ -91,8 +78,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"CancelOrder  res={e.Message}", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -100,12 +86,10 @@
             }
         }
 
-        public static AgvApiResult CancelOrder(CancelOrderModel model)
-        {
+        public static AgvApiResult CancelOrder(CancelOrderModel model) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"浠诲姟{model.task_no}鍙栨秷,{jsonInfo}", "NDC");
 
@@ -115,8 +99,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"CancelOrder  res={e.Message}", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -125,15 +108,13 @@
 
         }
 
-        public static AgvApiResult ChangeOrderPri(string taskNo, int newPri)
-        {
+        public static AgvApiResult ChangeOrderPri(string taskNo, int newPri) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
             var model = new ChangePriModel();
             model.task_no = taskNo;
             model.pri = newPri;
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"浠诲姟{model.task_no}浼樺厛绾ф洿鏀�{jsonInfo}", "NDC");
 
@@ -143,8 +124,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"ChangeOrderPri res={e.Message}", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -152,12 +132,10 @@
             }
         }
 
-        public static AgvApiResult ChangeOrderPri(ChangePriModel model)
-        {
+        public static AgvApiResult ChangeOrderPri(ChangePriModel model) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"浠诲姟{model.task_no}浼樺厛绾ф洿鏀�{jsonInfo}", "NDC");
 
@@ -167,8 +145,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"ChangeOrderPri res={e.Message}", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -176,16 +153,14 @@
             }
         }
 
-        public static AgvApiResult ChangeOrderParam(string taskNo, int paramNo, string paramStr)
-        {
+        public static AgvApiResult ChangeOrderParam(string taskNo, int paramNo, string paramStr) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
             var model = new ChangeParamModel();
             model.task_no = taskNo;
             model.param_no = paramNo;
             model.param = paramStr;
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"浠诲姟{model.task_no}鍙傛暟鏇存敼,{jsonInfo}", "NDC");
 
@@ -195,8 +170,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"ChangeOrderParam res={e.Message}", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -204,12 +178,10 @@
             }
         }
 
-        public static AgvApiResult ChangeOrderParam(ChangeParamModel model)
-        {
+        public static AgvApiResult ChangeOrderParam(ChangeParamModel model) {
             var httpH = new HttpHelper();
             var agvApiResult = new AgvApiResult();
-            try
-            {
+            try {
                 string jsonInfo = JsonConvert.SerializeObject(model);
                 LogHelper.Info($"浠诲姟{model.task_no}鍙傛暟鏇存敼,{jsonInfo}", "NDC");
 
@@ -219,8 +191,7 @@
                 agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                 return agvApiResult;
             }
-            catch (Exception e)
-            {
+            catch (Exception e) {
                 LogHelper.Info($"ChangeOrderParam res={e.Message}", "NDC");
                 agvApiResult.err_code = -1;
                 agvApiResult.err_msg = e.Message;
@@ -232,15 +203,13 @@
     /// <summary>
     /// 杩斿洖淇℃伅Model
     /// </summary>
-    public class AgvApiResult
-    {
+    public class AgvApiResult {
         public int err_code { set; get; }//寮傚父鐮�0 - 姝e父,鍏跺畠鍊间负寮傚父閿欒鐮�         public string err_msg { set; get; }//杩斿洖鐨勯敊璇弿杩�鍦�err_code <> 0 鏃惰繑鍥�         public object result { set; get; }//姝g‘杩斿洖鐨勭粨鏋滃唴瀹�鍦�err_code = 0 涓旀湁杩斿洖鍐呭鏃�     }
 
-    public class AddOrderNewModel
-    {
+    public class AddOrderNewModel {
         public int ts_no { set; get; }//TS 鍙�蹇呴』鏈夊�	
         public int pri { set; get; }//浼樺厛绾�         public string task_no { set; get; }//涓婃父浠诲姟缂栫爜,濡傛灉 no_feedback = 1 鏃�鍙互涓虹┖
@@ -248,27 +217,23 @@
     }
 
 
-    public class param
-    {
+    public class param {
         public string name { set; get; }//鍙傛暟鍚�         public string value { set; get; }//鍙傛暟鍊�     }
 
-    public class CancelOrderModel
-    {
+    public class CancelOrderModel {
         public string task_no { set; get; }//涓婃父浠诲姟缂栫爜
         public bool is_force { set; get; } = true;//鏄惁寮哄埗鍙栨秷,1 鈥�寮哄埗
     }
 
-    public class ChangeParamModel
-    {
+    public class ChangeParamModel {
         public string task_no { set; get; }//涓婃父浠诲姟缂栫爜
         public int param_no { set; get; }//鍙傛暟鍙�         public string param { set; get; }//鍙傛暟鍐呭,澶氫釜鍙傛暟浠ヨ嫳鏂囧垎鍙�;)鍒嗛殧
     }
 
-    public class ChangePriModel
-    {
+    public class ChangePriModel {
         public string task_no { set; get; }//涓婃父浠诲姟缂栫爜
         public int pri { set; get; }//鏂颁紭鍏堢骇
     }
diff --git a/dispatch/NDCHelper.cs b/dispatch/NDCHelper.cs
index 71d585e..f820ffe 100644
--- a/dispatch/NDCHelper.cs
+++ b/dispatch/NDCHelper.cs
@@ -2,10 +2,8 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HH.WCS.Mobox3.DSZSH.dispatch
-{
-    public class NDCHelper
-    {
+namespace HH.WCS.Mobox3.DSZSH.dispatch {
+    public class NDCHelper {
         public static void Test() {
             //dic.Add("Ext1", ""); dic.Add("Ext2", ""); dic.Add("N_CNTR_COUNT", "");
             //var r = callClient.AddNewOrderAsync(new AddNewOrderRequest() { bufin = "<Req><Order Pri='1' TS='1' From='1' To='2' No='123471118_1'  Ext1='1' Ext2='CALLADDAGV'  N_CNTR_COUNT='' /></Req>" });
diff --git a/process/DeviceProcess.cs b/process/DeviceProcess.cs
deleted file mode 100644
index dfce112..0000000
--- a/process/DeviceProcess.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.device;
-
-using HH.WCS.Mobox3.DSZSH.dispatch;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-
-namespace HH.WCS.Mobox3.DSZSH.process
-{
-    /// <summary>
-    /// 璁惧淇″彿澶勭悊,涓昏鏄痶cp淇″彿,鎴戜滑鍋歴erver琚姩鎺ユ敹淇″彿鏉ュ鐞�鏍规嵁椤圭洰瀹氬埗鐨�-    /// </summary>
-    internal class DeviceProcess
-    {
-        internal static void Analysis(string data, string ip) {
-            if (data.Length >= 6) {
-                //鍘绘帀娑堟伅澶�F 00
-                data = data.Substring(4);
-                //Console.WriteLine($"{ip}-{data}");
-            }
-        }
-    }
-}
diff --git a/util/Settings.cs b/util/Settings.cs
index b9eb8a7..a27282b 100644
--- a/util/Settings.cs
+++ b/util/Settings.cs
@@ -29,10 +29,12 @@
         public static void Init() {
             // 鍔犺浇閰嶇疆鏂囦欢
             LoadJson();
+
+            LoadProdLines();
         }
 
         private static void LoadJson() {
-            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 寮�");
+            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅:寮�!!");
             // JSON 鏂囦欢璺緞
             string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "./config/config.json");
 
@@ -43,49 +45,41 @@
                 // 鍙嶅簭鍒楀寲涓�Config 瀵硅薄
                 var root = JsonConvert.DeserializeObject<Config.Root>(jsonContent);
 
+                #region Config.Root 璧嬪�瀛楁閮ㄥ垎
                 WebApiUrl = root.WebApiUrl;
                 NdcApiUrl = root.NdcApiUrl;
                 ErpApiUrl = root.ErpApiUrl;
                 ErpRoute = root.ErpRoute;
-                TcpServerPort= root.TcpServerPort;
+                TcpServerPort = root.TcpServerPort;
                 DbConn = root.SqlServer;
                 //TcpServerIp = root.TcpServerIp;
                 //TcpServerPort = root.TcpServerPort;
                 ProductionLines = root.ProductionLines;
                 TaskInfos = root.TaskInfos;
-
-                for (var i = 0; i < ProductionLines.Count; i++) {
-                    if (ProductionLines[i].OnLoc == null) continue;
-                    foreach (var onLoc in ProductionLines[i].OnLoc) {
-                        LocProdIdMap.Add(onLoc, int.Parse(ProductionLines[i].Id));
-                    }
-                    foreach (var offLoc in ProductionLines[i].OffLoc) {
-                        LocProdIdMap.Add(offLoc, int.Parse(ProductionLines[i].Id));
-                    }
-                }
+                #endregion
             }   
             catch (FileNotFoundException) {
-                LogHelper.Info("JSON 鏂囦欢鏈壘鍒�);
+                LogHelper.Info("JSON鏂囦欢鏈壘鍒�!", "Exception");
             }
             catch (JsonException ex) {
-                LogHelper.Info($"JSON 瑙f瀽閿欒: {ex.Message}");
+                LogHelper.Info($"JSON瑙f瀽閿欒!!Error:{ex.Message}\n\n{ex.StackTrace}\n", "Exception");
             }
             catch (Exception ex) {
-                LogHelper.Info($"鍙戠敓閿欒: {ex.Message}");
+                LogHelper.InfoEx(ex, "Settings:");
             }
-            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 瀹屾垚");
+            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅:瀹屾垚!!");
         }
 
         private static void LoadProdLines() {
-            //var db = new SqlHelper<object>().GetInstance();
-            //for (int  i = 0;  i < ProductionLines.Count;  i++) {
-            //    var line = ProductionLines[i];
-            //    // 閫氳繃OnLoc OffLoc鎵惧埌AGVsite鐒跺悗鍐欏叆瀛楀吀
-            //}
-        }
-
-        public static Config.TaskInfo GetTaskInfo(ETask eTask) {
-            return TaskInfos[(int)eTask];
+            for (var i = 0; i < ProductionLines.Count; i++) {
+                if (ProductionLines[i].OnLoc == null) continue;
+                foreach (var onLoc in ProductionLines[i].OnLoc) {
+                    LocProdIdMap.Add(onLoc, int.Parse(ProductionLines[i].Id));
+                }
+                foreach (var offLoc in ProductionLines[i].OffLoc) {
+                    LocProdIdMap.Add(offLoc, int.Parse(ProductionLines[i].Id));
+                }
+            }
         }
     }
 
diff --git a/wms/DbTran.cs b/wms/DbTran.cs
index e5b0be1..0ca7eb8 100644
--- a/wms/DbTran.cs
+++ b/wms/DbTran.cs
@@ -94,6 +94,59 @@
                 return (true, $"鐢熸垚浠诲姟'{obj.TaskToInsert.S_TYPE}'鎴愬姛!!浠诲姟鍙�'{obj.TaskToInsert.S_CODE}',瀹瑰櫒鍙�'{obj.TaskToInsert.S_CNTR_CODE}',璧风偣='{obj.TaskToInsert.S_START_LOC}',缁堢偣='{obj.TaskToInsert.S_END_LOC}'");
             }
         }
+
+        /// <summary>
+        /// 鏁版嵁搴撲簨鍔�: 娑夊強鍗曟嵁鏄庣粏鏇存柊鐨勪换鍔″垱寤�+        /// </summary>
+        /// <param name="obj"></param>
+        /// <remarks><b>[ 瑕佹眰 ]</b> obj 鈮�null ; obj.TaskToInsert 鈮�null</remarks>
+        /// <returns></returns>
+        /// <exception cref="ArgumentException"></exception>
+        public static (bool, string) CreateTaskOrderObj(CreateTaskOrderObj obj) {
+            var db = new SqlHelper<object>().GetInstance();
+
+            using (var tran = db.Ado.UseTran()) {
+
+                if (obj.OutboundDetailToUpdate != null && db.Updateable(obj.OutboundDetailToUpdate).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    return (false, $"鏇存柊[鏄庣粏琛╙[鐘舵�]涓篬瀹屾垚]澶辫触!!鏁版嵁:\n\n{JsonConvert.SerializeObject(obj.OutboundDetailToUpdate)}\n");
+                }
+
+                if (obj.SpotCheckDetailToUpdate != null && db.Updateable(obj.SpotCheckDetailToUpdate).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    return (false, $"鏇存柊[鏄庣粏琛╙[鐘舵�]涓篬瀹屾垚]澶辫触!!鏁版嵁:\n\n{JsonConvert.SerializeObject(obj.SpotCheckDetailToUpdate)}\n");
+                }
+
+                if (obj.RelocationDetailToUpdate != null && db.Updateable(obj.RelocationDetailToUpdate).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    return (false, $"鏇存柊[鏄庣粏琛╙[鐘舵�]涓篬瀹屾垚]澶辫触!!鏁版嵁:\n\n{JsonConvert.SerializeObject(obj.RelocationDetailToUpdate)}\n");
+                }
+
+                #region 鍒涘缓浠诲姟 + 璐т綅閿�+                if (obj.StartLocToUpdate != null && db.Updateable(obj.StartLocToUpdate).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, it.N_CURRENT_NUM, }).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    return (false, $"鏇存柊[璧风偣璐т綅][閿佺姸鎬乚澶辫触!!璧风偣='{obj.StartLocToUpdate.S_CODE}',閿佺姸鎬�>'{obj.StartLocToUpdate.S_LOCK_STATE}'");
+                }
+                if (obj.EndLocToUpdate != null && db.Updateable(obj.EndLocToUpdate).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY, }).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    return (false, $"鏇存柊[缁堢偣璐т綅][閿佺姸鎬乚澶辫触!!缁堢偣='{obj.EndLocToUpdate.S_CODE}',閿佺姸鎬�>'{obj.EndLocToUpdate.S_LOCK_STATE}'");
+                }
+                if (obj.TaskToInsert == null) {
+                    tran.RollbackTran();
+                    throw new ArgumentException("鏁版嵁搴撲簨鍔″鐞�寰呮彃鍏ョ殑[浠诲姟]涓虹┖!!"); // 寰呮彃鍏ョ殑浠诲姟涓嶅瓨鍦�鐩存帴鎶涘嚭寮傚父
+                }
+                if (db.Insertable(obj.TaskToInsert).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    return (false, $"鐢熸垚浠诲姟'{obj.TaskToInsert.S_TYPE}'澶辫触!!浠诲姟鍙�'{obj.TaskToInsert.S_CODE}',瀹瑰櫒鍙�'{obj.TaskToInsert.S_CNTR_CODE}',璧风偣='{obj.TaskToInsert.S_START_LOC}',缁堢偣='{obj.TaskToInsert.S_END_LOC}'");
+                }
+                #endregion
+
+                // 鎻愪氦鏁版嵁搴撴洿鏀�+                tran.CommitTran();
+                return (true, $"鐢熸垚浠诲姟'{obj.TaskToInsert.S_TYPE}'鎴愬姛!!浠诲姟鍙�'{obj.TaskToInsert.S_CODE}',瀹瑰櫒鍙�'{obj.TaskToInsert.S_CNTR_CODE}',璧风偣='{obj.TaskToInsert.S_START_LOC}',缁堢偣='{obj.TaskToInsert.S_END_LOC}'");
+            }
+        }
+
     }
 
     public class CreateTaskObj {
@@ -119,8 +172,17 @@
         public TN_CG_Detail CgDetailToUpdate { get; set; } = null;
     }
 
-    public class DbTranObj {
-        public List<TN_Location> LocListToUpdate { get; set; }
+    public class CreateTaskOrderObj {
+
+        #region 璧风偣璐т綅 / 缁堢偣璐т綅 / 浠诲姟
+        public TN_Location StartLocToUpdate { get; set; } = null;
+        public TN_Location EndLocToUpdate { get; set; } = null;
+        public TN_Task TaskToInsert { get; set; } = null;
+        #endregion
+
+        public TN_Outbound_Detail OutboundDetailToUpdate { get; set; } = null;
+        public TN_SpotCheck_Detail SpotCheckDetailToUpdate { get; set; } = null;
+        public TN_RelocationList_Detail RelocationDetailToUpdate { get; set; } = null;
     }
 
 }
diff --git a/wms/LogMsg.cs b/wms/LogMsg.cs
index a0dd762..375220f 100644
--- a/wms/LogMsg.cs
+++ b/wms/LogMsg.cs
@@ -4,12 +4,10 @@
 using System.Linq.Expressions;
 using System.Text;
 using System.Threading.Tasks;
-
 using HH.WCS.Mobox3.DSZSH.models;
-
 using Newtonsoft.Json;
 
-namespace HH.WCS.Mobox3.DSZSH.util {
+namespace HH.WCS.Mobox3.DSZSH.wms {
     /// <summary>
     /// [ 鏃ュ織淇℃伅 ] 鏋勯�绫�     /// </summary>
diff --git a/wms/WCSHelper.cs b/wms/WCSHelper.cs
index 9962930..c18f8d9 100644
--- a/wms/WCSHelper.cs
+++ b/wms/WCSHelper.cs
@@ -51,47 +51,8 @@
             return loc == null ? "0" : loc.S_AGV_SITE;
         }
         #endregion
-
-        #region 浠诲姟鍒涘缓 / 涓嬪彂 / 鏌ヨ
-        internal static string GenerateTaskNo() {
-            //var id = SYSHelper.GetSerialNumber("浠诲姟鍙�, "TN");
-            //var date = DateTime.Now.ToString("yyMMdd");
-            //return $"TN{date}{id.ToString().PadLeft(4, '0')}";
-            return SYSHelper.GenerateSN("浠诲姟鍙�, "TN", "yyMMdd");
-        }
-
-        internal static bool UpdateTaskState(TN_Task task, string state) {
-            var res = false;
-            var db = new SqlHelper<TN_Task>().GetInstance();
-            task.S_B_STATE = state;
-            res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
-            return res;
-        }
-
-        internal static bool UpdateTaskState(TN_Task task) {
-            var res = false;
-            var db = new SqlHelper<TN_Task>().GetInstance();
-            task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
-            task.T_MODIFY = DateTime.Now;
-            res = db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand() > 0;
-            return res;
-        }
-
-        internal static bool UpdateEqTaskNo(TN_Task task) {
-            var res = false;
-            var db = new SqlHelper<TN_Task>().GetInstance();
-            task.T_MODIFY = DateTime.Now;
-            res = db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand() > 0;
-            return res;
-        }
-
-        internal static TN_Task GetTask(string taskNo) {
-            var db = new SqlHelper<TN_Task>().GetInstance();
-            var task = db.Queryable<TN_Task>().Where(a => a.S_CODE == taskNo).First();
-            return task;
-        } 
-        #endregion
-
+        
+        private const bool __瀹瑰櫒鏌ヨ缁戝畾妯″潡__ = false; // 浠呯敤浜庡垎娈�娌℃湁瀹炶川鎰忎箟
         #region 瀹瑰櫒鐩稿叧淇℃伅 鏌ヨ / 缁戝畾
         /// <summary>
         /// 鏍规嵁 [ 瀹瑰櫒鍙�] , 鏌ヨ褰撳墠瀹瑰櫒鍏宠仈鐨�[ 璐т綅 ] [ 璐т綅瀹瑰櫒 ] [ 瀹瑰櫒璐у搧 ] 淇℃伅 ( 鍙煡璇�1 鏉�)
@@ -171,9 +132,10 @@
             loc.T_MODIFY = DateTime.Now;
 
             return locCntrRel;
-        } 
+        }
         #endregion
 
+        private const bool __鍒涘缓浠诲姟妯″潡__ = false; // 浠呯敤浜庡垎娈�娌℃湁瀹炶川鎰忎箟
         #region 璧风偣 / 缁堢偣璐т綅閿�+ 鍒涘缓浠诲姟
         /// <summary>
         /// 璧风偣鍑哄簱閿�@@ -211,6 +173,17 @@
             loc.T_MODIFY = System.DateTime.Now;
 
             LogHelper.Info($"缁堢偣鍏ュ簱閿�缁堢偣璐т綅='{loc.S_CODE}',鏉ユ簮='{lockSource}'");
+        }
+
+        /// <summary>
+        /// 鐢熸垚浠诲姟鍙�閫氬父鍙BuildTask浣跨敤,鏁呰涓虹鏈�
+        /// </summary>
+        /// <returns></returns>
+        private static string GenerateTaskNo() {
+            //var id = SYSHelper.GetSerialNumber("浠诲姟鍙�, "TN");
+            //var date = DateTime.Now.ToString("yyMMdd");
+            //return $"TN{date}{id.ToString().PadLeft(4, '0')}";
+            return SYSHelper.GenerateSN("浠诲姟鍙�, "TN", "yyMMdd");
         }
 
         /// <summary>
@@ -254,7 +227,7 @@
         /// <param name="pri">浼樺厛绾�/param>
         /// <param name="agv">AGV 绫诲瀷</param>
         /// <returns></returns>
-        public static TN_Task BuildTaskWithLocLock(TN_Location startLoc, TN_Location endLoc, string cntId, string type, 
+        public static TN_Task BuildTaskAndLockLoc(TN_Location startLoc, TN_Location endLoc, string cntId, string type, 
             int pri = 3, int agv = 1) {
 
             var task = BuildTask(startLoc, endLoc, cntId, type, pri);
@@ -263,14 +236,44 @@
 
             return task;
         }
-
-        
         #endregion
 
+        private const bool __浠诲姟鍒嗗彂澶勭悊妯″潡__ = false; // 浠呯敤浜庡垎娈�娌℃湁瀹炶川鎰忎箟
         #region 浠诲姟鍒嗗彂 / 鎵ц / 璁板綍
         internal static bool CheckActionRecordExist(string no, int code) {
             var db = new SqlHelper<TN_Task_Action>().GetInstance();
             return db.Queryable<TN_Task_Action>().Count(a => a.S_TASK_CODE == no && a.N_ACTION_CODE == code) > 0;
+        }
+
+        internal static bool UpdateTaskState(TN_Task task, string state) {
+            var res = false;
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            task.S_B_STATE = state;
+            res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
+            return res;
+        }
+
+        internal static bool UpdateTaskState(TN_Task task) {
+            var res = false;
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
+            task.T_MODIFY = DateTime.Now;
+            res = db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand() > 0;
+            return res;
+        }
+
+        internal static bool UpdateEqTaskNo(TN_Task task) {
+            var res = false;
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            task.T_MODIFY = DateTime.Now;
+            res = db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand() > 0;
+            return res;
+        }
+
+        internal static TN_Task GetTask(string taskNo) {
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            var task = db.Queryable<TN_Task>().Where(a => a.S_CODE == taskNo).First();
+            return task;
         }
 
         internal static void SetTaskBegin(TN_Task task, string forklift_no) {
@@ -297,7 +300,7 @@
         internal static void SetTaskFail(TN_Task task) {
             var db = new SqlHelper<TN_Task>().GetInstance();
             if (task != null) {
-                //鍒ゆ柇鏈夋病鏈夊彇璐у畬鎴�娌℃湁灏卞彉鎴愬け璐ャ�鏈夊彇璐у畬鎴愰粯璁ゅ畬鎴愪簡 (璺熸嵁椤圭洰鑰屽畾,鏈変簺椤圭洰浜哄伐鎷夎蛋浜嗕篃娌℃湁鏀惧埌缁堢偣) 銆�+                //鍒ゆ柇鏈夋病鏈夊彇璐у畬鎴�娌℃湁灏卞彉鎴愬け璐�鏈夊彇璐у畬鎴愰粯璁ゅ畬鎴愪簡 (璺熸嵁椤圭洰鑰屽畾,鏈変簺椤圭洰浜哄伐鎷夎蛋浜嗕篃娌℃湁鏀惧埌缁堢偣)
                 task.N_B_STATE = 4;
                 task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
                 db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
diff --git a/wms/WMSHelper.cs b/wms/WMSHelper.cs
index c704164..e5eaf47 100644
--- a/wms/WMSHelper.cs
+++ b/wms/WMSHelper.cs
@@ -16,7 +16,7 @@
     /// </summary>
     public class WMSHelper {
         /// <summary>
-        /// 妫�煡瀹瑰櫒绫诲瀷
+        /// 妫�煡瀹瑰櫒绫诲瀷 ( 瀹瑰櫒琛�涓嶅瓨鍦�/ 绫诲瀷涓嶅尮閰�鏃�, 杩斿洖 false )
         /// </summary>
         /// <param name="cntrCode"></param>
         /// <param name="cntrType"></param>
@@ -35,21 +35,6 @@
             return (true, "妫�煡瀹瑰櫒绫诲瀷鎴愬姛!!");
         }
         /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="locCode"></param>
-        /// <param name="areas"></param>
-        /// <param name="startLoc"></param>
-        /// <returns></returns>
-        public static (bool, string) FindStartLocUnbind(string locCode, List<string> areas, out TN_Location startLoc) {
-            var db = new SqlHelper<object>().GetInstance();
-            startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(locCode, areas)).First();
-            if (startLoc == null) {
-                return (false, LogMsg.StartLocUnbindNotFound(locCode, areas));
-            }
-            return (true, "");
-        }
-        /// <summary>
         /// 鏍规嵁瀹瑰櫒鍙�, 鏌ユ壘鏃х殑璐т綅 / 璐т綅缁戝畾 / 鐗╂枡淇℃伅 ( 灏嗗緟鍒犻櫎 / 鏇存柊鏁版嵁鍐欏叆 obj )
         /// </summary>
         /// <remarks><code><![CDATA[obj.Old = oldLocCntrCg;]]></code></remarks>
@@ -57,13 +42,14 @@
         /// <param name="cntrCode"></param>
         /// <param name="skipCgDetail"></param>
         /// <returns></returns>
-        public static LocCntrCg FindCntrOldInfo(CreateTaskObj obj, string cntrCode, bool skipCgDetail = true) {
+        public static LocCntrCg FindOldCntrInfo(CreateTaskObj obj, string cntrCode, bool skipCgDetail = true) {
             var oldLocCntrCg = WCSHelper.GetLocCntrCg(cntrCode, skipCgDetail);
             obj.Old = oldLocCntrCg;
             return oldLocCntrCg;
         }
         /// <summary>
-        /// 缁戝畾璐т綅瀹瑰櫒 ( 淇敼 [ 璐т綅瀹瑰櫒琛�] [ 璐т綅绫诲瀷 ] = cntrType ; 灏�[ 寰呮彃鍏�] 璐т綅瀹瑰櫒鍏崇郴 鍔犲叆鍒�obj 涓�)
+        /// 缁戝畾璐т綅瀹瑰櫒 ( 淇敼 [ 璐т綅瀹瑰櫒琛�] [ 璐т綅绫诲瀷 ] = cntrType ; 灏�[ 寰呮彃鍏�] 璐т綅瀹瑰櫒鍏崇郴 鍔犲叆鍒�obj 涓�)<br/>
+        /// 璋冪敤 <see cref="WCSHelper.BindLocCntr"/> 璁剧疆 loc.N_CURRENT_NUM = 1
         /// </summary>
         /// <remarks><code><![CDATA[obj.New = new LocCntrCg { LocCntrRel = locCntrRel };]]></code></remarks>
         /// <param name="obj"></param>
@@ -107,5 +93,66 @@
 
             return task;
         }
+
+        private const bool __鏌ヨ璇彞灏佽__ = false; // 浠呯敤浜庡垎娈�娌℃湁瀹炶川鎰忎箟(VS2022 v17.4.3 鏂囨。澶х翰)
+        #region 鏌ヨ璇彞(鎼佺疆,璁句负绉佹湁,鏌ヨ闇�眰鍙樻洿澶�灏佽涓嶅鐏垫椿)
+        /// <summary>
+        /// 鏌ヨ [ 缁戝畾鍓�] 鐨勮捣鐐硅揣浣�+        /// </summary>
+        /// <example><code><![CDATA[
+        /// (ok, msg) = WMSHelper.FindStartLocUnbind(model.StartLoc, taskInfo.StartAreas, out var startLoc);
+        /// if (!ok) return NewSimpleResult(2, preLog + msg);
+        /// ]]></code></example>
+        /// <param name="locCode"></param>
+        /// <param name="areas"></param>
+        /// <param name="startLoc"></param>
+        /// <returns></returns>
+        private static (bool, string) FindStartLocUnbind(string locCode, List<string> areas, out TN_Location startLoc) {
+            var db = new SqlHelper<object>().GetInstance();
+            startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLocUnbind(locCode, areas)).First();
+            if (startLoc == null) {
+                return (false, LogMsg.StartLocUnbindNotFound(locCode, areas));
+            }
+            return (true, "");
+        }
+        /// <summary>
+        /// 鏌ヨ [ 缁戝畾鍚�] 鐨勮捣鐐硅揣浣�+        /// </summary>
+        /// <example><code><![CDATA[
+        /// (ok, msg) = WMSHelper.FindStartLoc(model.StartLoc, taskInfo.StartAreas, out var startLoc);
+        /// if (!ok) return NewSimpleResult(2, preLog + msg);
+        /// ]]></code></example>
+        /// <param name="locCode"></param>
+        /// <param name="areas"></param>
+        /// <param name="startLoc"></param>
+        /// <returns></returns>
+        private static (bool, string) FindStartLoc(string locCode, List<string> areas, out TN_Location startLoc) {
+            var db = new SqlHelper<object>().GetInstance();
+            startLoc = db.Queryable<TN_Location>().Where(DbExpr.StartLoc(locCode, areas)).First();
+            if (startLoc == null) {
+                return (false, LogMsg.StartLocNotFound(locCode, areas));
+            }
+            return (true, "");
+        }
+        /// <summary>
+        /// 鏌ヨ缁堢偣璐т綅
+        /// </summary>
+        /// <example><code><![CDATA[
+        /// (ok, msg) = WMSHelper.FindEndLoc(areas: taskInfo.EndAreas, out var endLoc);
+        /// if (!ok) return NewSimpleResult(3, preLog + msg);
+        /// ]]></code></example>
+        /// <param name="locCode"></param>
+        /// <param name="areas"></param>
+        /// <param name="endLoc"></param>
+        /// <returns></returns>
+        private static (bool, string) FindEndLoc(string locCode, List<string> areas, out TN_Location endLoc) {
+            var db = new SqlHelper<object>().GetInstance();
+            endLoc = db.Queryable<TN_Location>().Where(DbExpr.EndLoc(locCode, areas)).First();
+            if (endLoc == null) {
+                return (false, LogMsg.EndLocNotFound(locCode, areas));
+            }
+            return (true, "");
+        }
+        #endregion
     }
 }

--
Gitblit v1.9.1