From 5ad394cf1708a4629f90f40bfd9b48d9a9f6f0c8 Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期三, 21 五月 2025 16:55:18 +0800
Subject: [PATCH] 测试出库抽检流程,重构代码修复事务处理的问题

---
 device/S7Helper.cs                                                                  |    2 
 Models/TN_Container.cs                                                              |    2 
 Dispatch/NDCHelper.cs                                                               |    2 
 device/ProductionLineDevice.cs                                                      |    4 
 wms/WMSHelper.cs                                                                    |    4 
 Models/TN_Check_Order.cs                                                            |    2 
 api/ApiModel.cs                                                                     |  573 ++++++++
 HH.WCS.Mobox3.DSZSH.csproj                                                          |  133 -
 Dispatch/NDC.cs                                                                     |    5 
 device/OpcUaHelper.cs                                                               |    0 
 api/AgvController.cs                                                                |   12 
 Models/TN_Location.cs                                                               |    2 
 Models/TN_Shift_Order.cs                                                            |    2 
 wms/ContainerHelper.cs                                                              |   10 
 process/TaskProcess.cs                                                              |  196 ++
 wms/SYSHelper.cs                                                                    |    8 
 process/DeviceProcess.cs                                                            |    6 
 Models/TN_Outbound_Detail.cs                                                        |    4 
 api/ErpController.cs                                                                |    3 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/cfeb14b9-8063-424f-8831-ddd93cd9c6f5.vsidx |    0 
 Dispatch/GZRobot.cs                                                                 |   17 
 util/LogHelper.cs                                                                   |    2 
 Models/TN_Container_Item.cs                                                         |    2 
 util/Settings.cs                                                                    |  158 ++
 App_Start/SwaggerControllerDescProvider.cs                                          |  154 --
 api/ApiHelper.cs                                                                    | 1330 +++++++++++++++++++
 Models/TN_CAR_IN.cs                                                                 |    2 
 Models/TN_Shift_Detail.cs                                                           |    2 
 Models/TN_Outbound_Order.cs                                                         |    6 
 Program.cs                                                                          |   34 
 api/MesController.cs                                                                |    4 
 Models/BaseModel.cs                                                                 |    2 
 core/Monitor.cs                                                                     |  395 +++++
 Models/TN_Task.cs                                                                   |    2 
 Models/TN_Task_Action.cs                                                            |    2 
 App_Start/SwaggerConfig.cs                                                          |   47 
 wms/WCSHelper.cs                                                                    |  224 +++
 Models/TN_Order_Task.cs                                                             |    2 
 device/TcpServer.cs                                                                 |    3 
 device/TcpClient.cs                                                                 |    0 
 Models/TN_Inbound_Order.cs                                                          |    2 
 Models/TN_Check_Detail.cs                                                           |    2 
 Dispatch/NDCApi.cs                                                                  |    7 
 core/WMSCore.cs                                                                     |    4 
 Models/TN_Loc_Container.cs                                                          |    2 
 device/ModbusHelper.cs                                                              |    2 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/79fc4010-d1c2-42bb-9f8f-a7b972ec34f6.vsidx |    0 
 wms/LocationHelper.cs                                                               |   42 
 /dev/null                                                                           |   67 
 device/PlcHelper.cs                                                                 |    6 
 Models/TN_WorkOrder.cs                                                              |    2 
 core/WCSCore.cs                                                                     |  284 ++++
 util/SqlHelper.cs                                                                   |   63 
 api/DebugController.cs                                                              |  216 +++
 util/HttpHelper.cs                                                                  |    2 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/74bd051a-76c6-4faf-9203-3846175eb944.vsidx |    0 
 Models/TN_CG_Detail.cs                                                              |   10 
 .vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3f7a8a50-7623-4582-a788-1727f4b734e0.vsidx |    0 
 Dispatch/HanAo.cs                                                                   |    5 
 api/MoboxController.cs                                                              |   54 
 api/WMSController.cs                                                                |   12 
 61 files changed, 3,637 insertions(+), 503 deletions(-)

diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3f7a8a50-7623-4582-a788-1727f4b734e0.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3f7a8a50-7623-4582-a788-1727f4b734e0.vsidx
new file mode 100644
index 0000000..c9bf307
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3f7a8a50-7623-4582-a788-1727f4b734e0.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/74bd051a-76c6-4faf-9203-3846175eb944.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/74bd051a-76c6-4faf-9203-3846175eb944.vsidx
new file mode 100644
index 0000000..5dae330
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/74bd051a-76c6-4faf-9203-3846175eb944.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/79fc4010-d1c2-42bb-9f8f-a7b972ec34f6.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/79fc4010-d1c2-42bb-9f8f-a7b972ec34f6.vsidx
new file mode 100644
index 0000000..206014a
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/79fc4010-d1c2-42bb-9f8f-a7b972ec34f6.vsidx
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/cfeb14b9-8063-424f-8831-ddd93cd9c6f5.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/cfeb14b9-8063-424f-8831-ddd93cd9c6f5.vsidx
new file mode 100644
index 0000000..6aaf23d
--- /dev/null
+++ b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/cfeb14b9-8063-424f-8831-ddd93cd9c6f5.vsidx
Binary files differ
diff --git a/App_Start/Config.cs b/App_Start/Config.cs
deleted file mode 100644
index 5335b21..0000000
--- a/App_Start/Config.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-锘縰sing System.Collections.Generic;
-
-// 鏍规嵁 JSON 鏂囦欢 鐢熸垚瀵瑰簲鐨�C# 瀵硅薄锛涚綉鍧�細https://json2csharp.com/
-// 1. 灏�config.json 鏂囦欢澶嶅埗鍒扮綉鍧�腑
-// 2. 灏嗗緱鍒扮殑鍐呭澶嶅埗鍒�namespace HH.WCS.Mobox3.{椤圭洰浠e彿}.AppStart { } 澶ф嫭鍙峰唴閮紙C# 10 鎵嶆敮鎸�鏂囦欢鑼冨洿鍐呯殑鍛藉悕绌洪棿锛�-// 3. 灏�Root 鏇村悕涓�Config
-// 琛ュ厖锛氳繖绉嶆柟寮忔病娉曚繚鐣欐敞閲婏紝闇�鐔熸倝 Config 鏂囦欢鐨勫瓧娈靛惈涔夛紙鏆備笉鑰冭檻浠g爜鐢熸垚 Json 鏂囦欢锛�-
-namespace HH.WCS.Mobox3.DSZSH.AppStart {
-    // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
-    public class Area {
-        public string Name { get; set; }
-        public List<string> Codes { get; set; }
-    }
-
-    public class ProductionLine {
-        public string Id { get; set; }
-        public string Name { get; set; }
-        public string PlcIp { get; set; }
-        public int PlcPort { get; set; }
-        public int SlaveId { get; set; }
-        public List<string> OnLoc { get; set; }
-        public List<string> OffLoc { get; set; }
-    }
-
-    public class Config {
-        public string WebApiUrl { get; set; }
-        public string NdcApiUrl { get; set; }
-        public string SqlServer { get; set; }
-        public string TcpServerIp { get; set; }
-        public int TcpServerPort { get; set; }
-        public List<Area> Areas { get; set; }
-        public List<Task> Tasks { get; set; }
-        public List<ProductionLine> ProductionLines { get; set; }
-    }
-
-    public class Task {
-        public string Name { get; set; }
-        public List<string> StartAreas { get; set; }
-        public List<string> EndAreas { get; set; }
-    }
-
-
-}
diff --git a/App_Start/Settings.cs b/App_Start/Settings.cs
deleted file mode 100644
index 0e6e19e..0000000
--- a/App_Start/Settings.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.IO;
-
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-
-namespace HH.WCS.Mobox3.DSZSH.AppStart {
-    public class Settings
-    {
-        /// <summary>
-        /// 閰嶇疆鏂囦欢
-        /// </summary>
-        public static Config Config { get; set; }
-
-        /// <summary>
-        /// 搴撳尯瀛楀吀锛堝姞杞藉悗灏变笉鍙橈級
-        /// </summary>
-        public static Dictionary<string, List<string>> AreaMap { get; set; } = new Dictionary<string, List<string>>();
-
-        /// <summary>
-        /// 浠诲姟瀛楀吀锛堝姞杞藉悗灏变笉鍙橈級
-        /// </summary>
-        public static Dictionary<string, AppStart.Task> TaskMap { get; set; } = new Dictionary<string, AppStart.Task>();
-
-        public static void Init() {
-            // 鍔犺浇閰嶇疆鏂囦欢
-            LoadJson();
-
-            // 閽堝 Areas 杩涜杞崲锛氬皢 Config 鐨�List 鍔犺浇鍒�Dict 涓�-            LoadAreas();
-
-            // 閽堝 Tasks 杩涜杞崲
-            LoadTasks();
-        }
-
-        private static void LoadJson() {
-            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 寮�");
-            // JSON 鏂囦欢璺緞
-            string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "./config/config.json");
-
-            try {
-                // 璇诲彇 JSON 鏂囦欢鍐呭
-                string jsonContent = File.ReadAllText(filePath);
-
-                // 鍙嶅簭鍒楀寲涓�Config 瀵硅薄
-                Config = JsonConvert.DeserializeObject<Config>(jsonContent);
-            }
-            catch (FileNotFoundException) {
-                LogHelper.Info("JSON 鏂囦欢鏈壘鍒�);
-            }
-            catch (JsonException ex) {
-                LogHelper.Info($"JSON 瑙f瀽閿欒: {ex.Message}");
-            }
-            catch (Exception ex) {
-                LogHelper.Info($"鍙戠敓閿欒: {ex.Message}");
-            }
-            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 瀹屾垚");
-        }
-
-        private static void LoadAreas() {
-            foreach (var area in Config.Areas) {
-                AreaMap.Add(area.Name, area.Codes);
-            }
-        }
-
-        private static void LoadTasks() {
-            foreach (var task in Config.Tasks) {
-                TaskMap.Add(task.Name, task);
-            }
-        }
-    }
-}
diff --git a/App_Start/SwaggerConfig.cs b/App_Start/SwaggerConfig.cs
index 7d069fe..557097d 100644
--- a/App_Start/SwaggerConfig.cs
+++ b/App_Start/SwaggerConfig.cs
@@ -1,49 +1,14 @@
 using System.Web.Http;
 using WebActivatorEx;
-using HH.WCS.Mobox3.DSZSH;
+using HH.WCS.Mobox3.Template;
 using Swashbuckle.Application;
-using System.IO;
-using System.Reflection;
-using System;
-using Swashbuckle.Examples;
 
 [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]
 
-namespace HH.WCS.Mobox3.DSZSH
+namespace HH.WCS.Mobox3.Template
 {
     public class SwaggerConfig
     {
-        public static void Register(HttpConfiguration config) {
-            var thisAssembly = typeof(SwaggerConfig).Assembly;
-
-            config
-                .EnableSwagger(c => {
-                    c.SingleApiVersion("v1", "HH.WCS.Mobox3.DSZSH");
-
-                    // 璁剧疆 XML 娉ㄩ噴璺緞
-                    var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
-                    //var commentsFileName = Assembly.GetExecutingAssembly().GetName().Name + ".xml";
-                    var commentsFileName = "bin\\Debug\\HH.WCS.Mobox3.DSZSH.xml";
-                    var commentsFile = Path.Combine(baseDirectory, commentsFileName);
-
-                    if (File.Exists(commentsFile)) {
-                        c.IncludeXmlComments(commentsFile);
-                    }
-
-                    // 鍏朵粬閰嶇疆...
-                    c.UseFullTypeNameInSchemaIds();
-
-                    // 鍚敤绀轰緥鏁版嵁
-                    //c.DescribeAllEnumsAsStrings();
-                    //c.OperationFilter<ExamplesOperationFilter>();
-                    //c.ModelFilter<ExamplesModelFilter>();
-
-                })
-                .EnableSwaggerUi(c => {
-                    // UI 閰嶇疆
-                });
-        }
-
         public static void Register()
         {
             var thisAssembly = typeof(SwaggerConfig).Assembly;
@@ -67,7 +32,7 @@
                         // hold additional metadata for an API. Version and title are required but you can also provide
                         // additional fields by chaining methods off SingleApiVersion.
                         //
-                        c.SingleApiVersion("v1", "HH.WCS.Mobox3.DSZSH");
+                        c.SingleApiVersion("v1", "HH.WCS.Mobox3.Template");
 
                         // If you want the output Swagger docs to be indented properly, enable the "PrettyPrint" option.
                         //
@@ -96,7 +61,7 @@
                         //c.BasicAuth("basic")
                         //    .Description("Basic HTTP Authentication");
                         //
-                        // NOTE: You must also configure 'EnableApiKeySupport' below in the SwaggerUI section
+						// NOTE: You must also configure 'EnableApiKeySupport' below in the SwaggerUI section
                         //c.ApiKey("apiKey")
                         //    .Description("API Key Authentication")
                         //    .Name("apiKey")
@@ -137,10 +102,6 @@
                         // more Xml comment files.
                         //
                         //c.IncludeXmlComments(GetXmlCommentsPath());
-
-                        // 鍚敤 XML 娉ㄩ噴
-                        var xmlFile = $"{System.AppDomain.CurrentDomain.BaseDirectory}\\HH.WCS.Mobox3.DSZSH.xml";
-                        c.IncludeXmlComments(xmlFile);
 
                         // Swashbuckle makes a best attempt at generating Swagger compliant JSON schemas for the various types
                         // exposed in your API. However, there may be occasions when more control of the output is needed.
diff --git a/App_Start/SwaggerControllerDescProvider.cs b/App_Start/SwaggerControllerDescProvider.cs
index 74fd3f2..10f7f94 100644
--- a/App_Start/SwaggerControllerDescProvider.cs
+++ b/App_Start/SwaggerControllerDescProvider.cs
@@ -80,158 +80,4 @@
             return controllerDescDict;
         }
     }
-
-    /// <summary>
-    /// 澧炲己鐗圫wagger鎻愪緵绋嬪簭锛屾敮鎸佹樉绀烘帶鍒跺櫒鍜屾ā鍨嬬殑瀹屾暣鏂囨。娉ㄩ噴
-    /// </summary>
-    public class EnhancedSwaggerCacheProvider : ISwaggerProvider {
-        private readonly ISwaggerProvider _swaggerProvider;
-        private static readonly ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
-        private readonly string _xmlPath;
-
-        public EnhancedSwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xmlpath) {
-            _swaggerProvider = swaggerProvider;
-            _xmlPath = xmlpath;
-        }
-
-        public SwaggerDocument GetSwagger(string rootUrl, string apiVersion) {
-            var cacheKey = $"{rootUrl}_{apiVersion}";
-
-            return _cache.GetOrAdd(cacheKey, _ =>
-            {
-                var srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
-
-                // 娣诲姞鎺у埗鍣ㄦ弿杩�-                var (controllerDesc, modelDesc) = GetXmlComments();
-
-                srcDoc.vendorExtensions = new Dictionary<string, object>
-                {
-                { "ControllerDesc", controllerDesc },
-                { "ModelDesc", modelDesc }
-            };
-
-                // 涓烘ā鍨嬫坊鍔犳弿杩�-                EnhanceModelDescriptions(srcDoc, modelDesc);
-
-                return srcDoc;
-            });
-        }
-
-        /// <summary>
-        /// 浠嶺ML鏂囨。涓彁鍙栨帶鍒跺櫒鍜屾ā鍨嬫弿杩�-        /// </summary>
-        private (ConcurrentDictionary<string, string> controllerDesc,
-                 ConcurrentDictionary<string, string> modelDesc) GetXmlComments() {
-            var controllerDesc = new ConcurrentDictionary<string, string>();
-            var modelDesc = new ConcurrentDictionary<string, string>();
-
-            if (!File.Exists(_xmlPath)) return (controllerDesc, modelDesc);
-
-            var xmldoc = new XmlDocument();
-            xmldoc.Load(_xmlPath);
-
-            foreach (XmlNode node in xmldoc.SelectNodes("//member")) {
-                var type = node.Attributes?["name"]?.Value;
-                if (string.IsNullOrEmpty(type)) continue;
-
-                if (type.StartsWith("T:")) {
-                    var arrPath = type.Split('.');
-                    var typeName = arrPath[arrPath.Length - 1]; // 鑾峰彇鏈�悗涓�儴鍒�-
-                    // 澶勭悊鎺у埗鍣�-                    if (typeName.EndsWith("Controller")) {
-                        var summaryNode = node.SelectSingleNode("summary");
-                        if (summaryNode != null && !string.IsNullOrWhiteSpace(summaryNode.InnerText)) {
-                            //var key = typeName[..^"Controller".Length];
-
-                            string key = typeName;
-                            const string controllerSuffix = "Controller";
-                            if (typeName.EndsWith(controllerSuffix)) {
-                                key = typeName.Substring(0, typeName.Length - controllerSuffix.Length);
-                            }
-
-                            controllerDesc.TryAdd(key, summaryNode.InnerText.Trim());
-                        }
-                    }
-                    // 澶勭悊妯″瀷绫�-                    else if (IsModelType(node)) {
-                        var summaryNode = node.SelectSingleNode("summary");
-                        if (summaryNode != null && !string.IsNullOrWhiteSpace(summaryNode.InnerText)) {
-                            modelDesc.TryAdd(typeName, summaryNode.InnerText.Trim());
-                        }
-
-                        // 澶勭悊妯″瀷灞炴�
-                        EnhancePropertyDescriptions(node, modelDesc);
-                    }
-                }
-
-            }
-
-            return (controllerDesc, modelDesc);
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇鏄惁涓烘ā鍨嬬被鍨�-        /// </summary>
-        private bool IsModelType(XmlNode node) {
-            // 杩欓噷鍙互鏍规嵁瀹為檯闇�眰璋冩暣鍒ゆ柇閫昏緫
-            // 渚嬪锛氭帓闄ontroller銆佹帓闄ょ壒瀹氬懡鍚嶇┖闂寸瓑
-            var type = node.Attributes?["name"]?.Value ?? "";
-            return type.StartsWith("T:") &&
-                   !type.EndsWith("Controller") &&
-                   !type.Contains(".Controllers.") &&
-                   !type.Contains(".Infrastructure.");
-        }
-
-        /// <summary>
-        /// 澧炲己妯″瀷灞炴�鐨勬弿杩�-        /// </summary>
-        private void EnhancePropertyDescriptions(XmlNode typeNode, ConcurrentDictionary<string, string> modelDesc) {
-            var typeName = typeNode.Attributes?["name"]?.Value?.Split('.')?.LastOrDefault()?.Substring(2);
-            if (string.IsNullOrEmpty(typeName)) return;
-
-            foreach (XmlNode propNode in typeNode.SelectNodes("field|property")) {
-                var propName = propNode.Attributes?["name"]?.Value;
-                if (string.IsNullOrEmpty(propName)) continue;
-
-                var summaryNode = propNode.SelectSingleNode("summary");
-                var exampleNode = propNode.SelectSingleNode("example");
-
-                if (summaryNode != null && !string.IsNullOrWhiteSpace(summaryNode.InnerText)) {
-                    var fullPropKey = $"{typeName}.{propName}";
-                    var description = summaryNode.InnerText.Trim();
-
-                    if (exampleNode != null && !string.IsNullOrWhiteSpace(exampleNode.InnerText)) {
-                        description += $"\n\n绀轰緥: {exampleNode.InnerText.Trim()}";
-                    }
-
-                    modelDesc.TryAdd(fullPropKey, description);
-                }
-            }
-        }
-
-        /// <summary>
-        /// 澧炲己Swagger鏂囨。涓殑妯″瀷鎻忚堪
-        /// </summary>
-        private void EnhanceModelDescriptions(SwaggerDocument swaggerDoc, ConcurrentDictionary<string, string> modelDesc) {
-            if (swaggerDoc.definitions == null) return;
-
-            foreach (var definition in swaggerDoc.definitions) {
-                // 澶勭悊妯″瀷绫绘湰韬弿杩�-                if (modelDesc.TryGetValue(definition.Key, out var classDesc)) {
-                    definition.Value.description = classDesc;
-                }
-
-                // 澶勭悊妯″瀷灞炴�鎻忚堪
-                if (definition.Value.properties != null) {
-                    foreach (var property in definition.Value.properties) {
-                        var fullPropKey = $"{definition.Key}.{property.Key}";
-                        if (modelDesc.TryGetValue(fullPropKey, out var propDesc)) {
-                            property.Value.description = propDesc;
-                        }
-                    }
-                }
-            }
-        }
-    }
 }
diff --git a/Consts/AgvStateCode.cs b/Consts/AgvStateCode.cs
deleted file mode 100644
index 3c0eab5..0000000
--- a/Consts/AgvStateCode.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Consts {
-    public class AgvStateCode {
-        public const int 绛夊緟 = 0;
-        public const int 鎵ц = 1;
-        public const int 瀹屾垚 = 2;
-        public const int 寮�鍙栬揣 = 3;
-        public const int 鍙栬揣瀹屾垚 = 4;
-        public const int 寮�鍗歌揣 = 5;
-        public const int 鍗歌揣瀹屾垚 = 6;
-        public const int 寮傚父 = 7;
-    }
-}
diff --git a/Consts/AgvStateName.cs b/Consts/AgvStateName.cs
deleted file mode 100644
index 5d524e5..0000000
--- a/Consts/AgvStateName.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Consts {
-    public class AgvStateName {
-        public const string 鎵ц = "鎵ц";
-        public const string 瀹屾垚 = "瀹屾垚";
-        public const string 寮�鍙栬揣 = "寮�鍙栬揣";
-        public const string 鍙栬揣瀹屾垚 = "鍙栬揣瀹屾垚";
-        public const string 寮�鍗歌揣 = "寮�鍗歌揣";
-        public const string 鍗歌揣瀹屾垚 = "鍗歌揣瀹屾垚";
-        public const string 寮傚父 = "寮傚父";
-    }
-}
diff --git a/Consts/AreaName.cs b/Consts/AreaName.cs
deleted file mode 100644
index 06dfb06..0000000
--- a/Consts/AreaName.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Consts {
-    public class AreaName {
-        public const string 鍖呰鍖�= "鍖呰鍖�;
-        public const string 鎿嶄綔鍖�= "鎿嶄綔鍖�;
-        
-        public const string 绌烘墭瀛樻斁鍖�= "绌烘墭瀛樻斁鍖�;
-
-        public const string 璐ф灦鍖�= "璐ф灦鍖�;
-        public const string 绌虹瀛樻斁鍖�= "绌虹瀛樻斁鍖�;
-        public const string 婊℃墭瀛樻斁鍖�= "婊℃墭瀛樻斁鍖�;
-        public const string 婊$瀛樻斁鍖�= "婊$瀛樻斁鍖�;
-
-        public const string 浜哄伐_AGV鎺ラ┏鍖�= "浜哄伐-AGV鎺ラ┏鍖�;
-        public const string 绌烘墭鐩樻帴椹冲尯 = "绌烘墭鐩樻帴椹冲尯";
-        public const string 绌虹鎺ラ┏鍖�= "绌虹鎺ラ┏鍖�;
-    }
-}
diff --git a/Consts/LockStateCode.cs b/Consts/LockStateCode.cs
deleted file mode 100644
index c9eef27..0000000
--- a/Consts/LockStateCode.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Consts {
-    public class LockStateCode {
-        public const int 鏃�= 0;
-        public const int 鍏ュ簱閿�= 1;
-        public const int 鍑哄簱閿�= 2;
-        public const int 鍏朵粬閿�= 3;
-    }
-}
diff --git a/Consts/LockStateName.cs b/Consts/LockStateName.cs
deleted file mode 100644
index 5b4e967..0000000
--- a/Consts/LockStateName.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Consts {
-    /// <summary>
-    /// 銆愭鏋躲�浣嶇疆閿佸悕绉�瀛楃涓插父閲�-    /// </summary>
-    public class LockStateName {
-        public const string 鏃�= "鏃�;
-        public const string 鍏ュ簱閿�= "鍏ュ簱閿�;
-        public const string 鍑哄簱閿�= "鍑哄簱閿�;
-        public const string 鍏朵粬閿�= "鍏朵粬閿�;
-    }
-}
diff --git a/Consts/SpotStateCode.cs b/Consts/SpotStateCode.cs
deleted file mode 100644
index acbeaad..0000000
--- a/Consts/SpotStateCode.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Consts {
-    /// <summary>
-    /// 鍗曟嵁浠诲姟鐘舵�
-    /// </summary>
-    /// <remarks>
-    /// N_B_STATE<br/>
-    /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
-    /// </remarks>
-    public class SpotStateCode {
-        public const int 寰呮墽琛�= 0;
-        public const int 宸叉墽琛屽緟鐢熸垚浠诲姟 = 1;
-        /// <summary>
-        /// 瀵逛簬Order锛氭墍鏈塂etail閮藉垱寤轰簡浠诲姟锛屾墠杩涘叆姝ょ姸鎬�br/>
-        /// 瀵逛簬Detail锛氬彧瑕佸垱寤轰簡浠诲姟锛屽氨杩涘叆姝ょ姸鎬�-        /// </summary>
-        public const int 浠诲姟鎵ц涓�= 2;
-        public const int 浠诲姟鎵ц瀹屾垚 = 3;
-    }
-}
diff --git a/Consts/TaskName.cs b/Consts/TaskName.cs
deleted file mode 100644
index a30d2f3..0000000
--- a/Consts/TaskName.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Consts {
-    public class TaskName {
-        public const string 濂借繍绠盻婊$涓嬬嚎鍏ュ簱 = "濂借繍绠�婊$涓嬬嚎鍏ュ簱";
-        public const string 濂借繍绠盻绌虹涓婄嚎 = "濂借繍绠�绌虹涓婄嚎";
-        public const string 濂借繍绠盻绌虹鍏ュ簱 = "濂借繍绠�绌虹鍏ュ簱";
-        public const string 濂借繍绠盻绌虹缁戝畾 = "濂借繍绠�绌虹缁戝畾";
-        public const string 鎴愬搧鑳跺嚭搴�= "鎴愬搧鑳跺嚭搴�;
-        public const string 鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱 = "鎵樼洏-婊℃墭涓嬬嚎鍏ュ簱";
-        public const string 鎵樼洏_绌烘墭涓婄嚎 = "鎵樼洏-绌烘墭涓婄嚎";
-        public const string 鎵樼洏_绌烘墭鍏ュ簱 = "鎵樼洏-绌烘墭鍏ュ簱";
-        public const string 鎵樼洏_绌烘墭缁戝畾 = "鎵樼洏-绌烘墭缁戝畾";
-        public const string 鎶芥_涓嶅悎鏍肩Щ搴�= "鎶芥-涓嶅悎鏍肩Щ搴�;
-        public const string 鎶芥_鍑哄簱 = "鎶芥-鍑哄簱";
-        public const string 鎶芥_鍚堟牸鍥炲簱 = "鎶芥-鍚堟牸鍥炲簱";
-        public const string 绉诲簱 = "绉诲簱";
-        public const string 灏剧鍥炲簱 = "灏剧鍥炲簱";
-        
-    }
-}
diff --git a/Controllers/DebugController.cs b/Controllers/DebugController.cs
deleted file mode 100644
index a4b1496..0000000
--- a/Controllers/DebugController.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Web.Http;
-
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-using HH.WCS.Mobox3.DSZSH.Services;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.DebugRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.DebugResponse;
-
-namespace HH.WCS.Mobox3.DSZSH.Controllers {
-    /// <summary>
-    /// 娴嬭瘯鐢細濡傛灉椤圭洰涓鍜岃澶囧鎺ワ紝鍓嶆湡璁惧鏃犳硶娴嬭瘯锛岀敤鎺ュ彛妯℃嫙
-    /// </summary>
-    [RoutePrefix("api")]
-    public class DebugController : ApiController
-    {
-        /// <summary>
-        /// 妯℃嫙 AGV 澶氭鍥炴姤浠诲姟鐘舵�
-        /// </summary>
-        /// <param name="model">瀹瑰櫒鍙�/param>
-        /// <returns></returns>
-        [HttpPost]
-        [Route("AgvSeriesReports")]
-        public ReturnResults AgvSeriesReports(UpdateTaskState model)
-        {
-            return DebugService.AgvSeriesReports(model);
-        }
-
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹簱
-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        [Route("CreateDatabase")]
-        public string CreateDatabase(CoverInfo model) {
-            return DebugService.CreateDatabase(model.IsCover);
-        }
-
-        /// <summary>
-        /// DEBUG锛氭彃鍏ヨ揣浣嶃�瀹瑰櫒銆佽揣鍝佷俊鎭�-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        [Route("InsertLocCntrCg")]
-        public string InsertLocCntrCg() {
-            return DebugService.InsertLocCntrCg();
-        }
-    }
-}
diff --git a/Dispatch/GZRobot.cs b/Dispatch/GZRobot.cs
index 44a5ef6..a5306ea 100644
--- a/Dispatch/GZRobot.cs
+++ b/Dispatch/GZRobot.cs
@@ -1,18 +1,15 @@
 锘縰sing HH.WCS.Mobox3.DSZSH.device;
-using HH.WCS.Mobox3.DSZSH.ServiceCore;
-using HH.WCS.Mobox3.DSZSH.AppStart;
+using HH.WCS.Mobox3.DSZSH.core;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Web.Caching;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Devices;
-using HH.WCS.Mobox3.DSZSH.Models;
-using HH.WCS.Mobox3.DSZSH.Services;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
+using HH.WCS.Mobox3.DSZSH.models;
 
-namespace HH.WCS.Mobox3.DSZSH.Dispatch
+using HH.WCS.Mobox3.DSZSH.util;
+using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
+
+namespace HH.WCS.Mobox3.DSZSH.dispatch
 {
     /// <summary>
     /// 鍥借嚜璋冨害杈呭姪绫�@@ -154,7 +151,7 @@
             if (agv.state != 0) {
                 agv.task_no = model.orderName;
                 agv.forklift_no = model.agvIDList;
-                AgvService.OperateAgvTaskStatus(agv);
+                WCSCore.OperateAgvTaskStatus(agv);
             }
 
             result.resultCode = 0;
diff --git a/Dispatch/HanAo.cs b/Dispatch/HanAo.cs
index 80664b5..848caa8 100644
--- a/Dispatch/HanAo.cs
+++ b/Dispatch/HanAo.cs
@@ -1,10 +1,11 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.AppStart;
+锘縰sing HH.WCS.Mobox3.DSZSH.util;
+
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Web.Services.Description;
 
-namespace HH.WCS.Mobox3.DSZSH.Dispatch {
+namespace HH.WCS.Mobox3.DSZSH.dispatch {
     /// <summary>
     /// 鍥借嚜璋冨害杈呭姪绫�     /// </summary>
diff --git a/Dispatch/NDC.cs b/Dispatch/NDC.cs
index 77e1153..9fee4d1 100644
--- a/Dispatch/NDC.cs
+++ b/Dispatch/NDC.cs
@@ -1,11 +1,10 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.AppStart;
-using Newtonsoft.Json;
+锘縰sing 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
 {
     public class NDC
     {
diff --git a/Dispatch/NDCApi.cs b/Dispatch/NDCApi.cs
index 15c4395..917704d 100644
--- a/Dispatch/NDCApi.cs
+++ b/Dispatch/NDCApi.cs
@@ -1,12 +1,13 @@
 锘縰sing HH.WCS.Mobox3.DSZSH;
-using HH.WCS.Mobox3.DSZSH.AppStart;
+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鎺ュ彛锛岀敤浜庢浛浠e師NDC銆丯DCHelper鍜孒ostToAGV妯″潡
@@ -17,7 +18,7 @@
         static NDCApi()
         {
 
-            NDCApiUrl = AppStart.Settings.Config.NdcApiUrl;
+            NDCApiUrl = Settings.NdcApiUrl;
         }
 
 
diff --git a/Dispatch/NDCHelper.cs b/Dispatch/NDCHelper.cs
index 63fe858..71d585e 100644
--- a/Dispatch/NDCHelper.cs
+++ b/Dispatch/NDCHelper.cs
@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 
-namespace HH.WCS.Mobox3.DSZSH.Dispatch
+namespace HH.WCS.Mobox3.DSZSH.dispatch
 {
     public class NDCHelper
     {
diff --git a/Dtos/Request/AgvRequest.cs b/Dtos/Request/AgvRequest.cs
deleted file mode 100644
index a8d6063..0000000
--- a/Dtos/Request/AgvRequest.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Request {
-    public class AgvRequest {
-        /// <summary>
-        /// HostToAGV 涓婃姤浠诲姟鐘舵�
-        /// </summary>
-        public class AgvTaskState {
-            /// <summary>
-            /// AGV 鍥炴姤鐘舵�鍙�-            /// </summary>
-            public int state { get; set; }
-            /// <summary>
-            /// 浠诲姟鍙�-            /// </summary>
-            public string task_no { get; set; }
-            /// <summary>
-            /// AGV 杞﹀彿
-            /// </summary>
-            public string forklift_no { get; set; }
-            /// <summary>
-            /// 瀹夊叏闂ㄧ紪鍙�-            /// </summary>
-            public string lock_no { get; set; }
-            /// <summary>
-            /// 闄勫姞淇℃伅
-            /// </summary>
-            public string ext_data { get; set; }
-        }
-
-        public class SafetyInteractionInfo {
-            
-            public int station_id { get; set; }
-
-            /// <summary>
-            /// 璇锋眰涓婄嚎/涓嬬嚎鐨勭殑绔欏彴搴撲綅鍚嶇О锛屼緥濡倃ork6銆亀ork8
-            /// </summary>
-            public string station_name { get; set; }
-
-            /// <summary>
-            /// 璇锋眰鐮�-            /// </summary>
-            public string apply_code { get; set; }
-            public string task_no { set; get; }
-        }
-    }
-}
diff --git a/Dtos/Request/DebugRequest.cs b/Dtos/Request/DebugRequest.cs
deleted file mode 100644
index b752402..0000000
--- a/Dtos/Request/DebugRequest.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using HH.WCS.Mobox3.DSZSH.Consts;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Request {
-    public class DebugRequest {
-        /// <summary>
-        /// 妯℃嫙 AGV 浼犻�淇″彿锛岀敤浜庢洿鏀逛换鍔$姸鎬�-        /// </summary>
-        public class UpdateTaskState {
-            /// <summary>
-            /// 浠诲姟ID
-            /// </summary>
-            public string TaskID { set; get; }
-            /// <summary>
-            /// AGV 灏忚溅鍙�-            /// </summary>
-            public string ForkliftNo { set; get; }
-            /// <summary>
-            /// AGV 涓嬩竴涓姸鎬�-            /// </summary>
-            public int NextState { set; get; }
-        }
-
-        public class CoverInfo {
-            public bool IsCover { set; get; } = false;
-        }
-    }
-}
diff --git a/Dtos/Request/MoboxRequest.cs b/Dtos/Request/MoboxRequest.cs
deleted file mode 100644
index 5f240a5..0000000
--- a/Dtos/Request/MoboxRequest.cs
+++ /dev/null
@@ -1,362 +0,0 @@
-锘縰sing System.ComponentModel.DataAnnotations;
-
-using Newtonsoft.Json;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Request {
-    public class MoboxRequest {
-
-        #region PDA 鏁版嵁
-        /// <summary>
-        /// 濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)鏁版嵁绫�-        /// </summary>
-        public class GoodpackOfflineInfo {
-            /// <summary>
-            /// 鐗╂枡缂栫爜
-            /// </summary>
-            [JsonProperty("s_item_code")]
-            public string ItemCode { get; set; }
-            ///// <summary>
-            ///// 鐗╂枡鍚嶇О
-            ///// </summary>
-            //[JsonProperty("item_name")]
-            //public string ItemName { get; set; }
-            /// <summary>
-            /// 鎵规鍙�-            /// </summary>
-            [JsonProperty("s_batch")]
-            public string BatchNo { get; set; }
-            /// <summary>
-            /// 鐗╂枡瑙勬牸
-            /// </summary>
-            [JsonProperty("s_spec")]
-            public string Spec { get; set; }
-            /// <summary>
-            /// 鏁伴噺
-            /// </summary>
-            [JsonProperty("n_num")]
-            public int Qty { get; set; }
-            /// <summary>
-            /// 璧风偣璐т綅淇℃伅
-            /// </summary>
-            [JsonProperty("s_start_loc")]
-            public string StartLoc { get; set; }
-        }
-        /// <summary>
-        /// 绌烘墭/绌虹鍏ュ簱缁戝畾(PDA)鏁版嵁绫�-        /// </summary>
-        public class EmptyBindInfo {
-            /// <summary>
-            /// 瀹瑰櫒缂栫爜
-            /// </summary>
-            
-            [JsonProperty("s_cntr_code")]
-            public string CntrCode { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒绫诲瀷
-            /// </summary>
-            
-            [JsonProperty("s_cntr_type")] 
-            public string CntrType { get; set; }
-            ///// <summary>
-            ///// 鎵樼洏鏁伴噺锛堜粎褰撳鍣ㄧ被鍨嬩负鎵樼洏鏃朵娇鐢級
-            ///// </summary>
-            //[JsonProperty("pallet_count", NullValueHandling = NullValueHandling.Ignore)]
-            //public int PalletCount { get; set; }
-            /// <summary>
-            /// 璐т綅缂栫爜
-            /// </summary>
-            [JsonProperty("s_loc_code")]
-            public string LocCode { get; set; }
-        }
-        /// <summary>
-        /// 绌烘墭缁戝畾
-        /// </summary>
-        public class EmptyBindPalletInfo {
-            /// <summary>
-            /// 瀹瑰櫒缂栫爜
-            /// </summary>
-            public string CntrCode { get; set; }
-
-            /// <summary>
-            /// 鎵樼洏鏁伴噺
-            /// </summary>
-            public int PalletCount { get; set; }
-
-            /// <summary>
-            /// 璐т綅缂栫爜
-            /// </summary>
-            public string LocCode { get; set; }
-        }
-        /// <summary>
-        /// 绌虹缁戝畾
-        /// </summary>
-        public class EmptyBindGoodpackInfo {
-            /// <summary>
-            /// 瀹瑰櫒缂栫爜
-            /// </summary>
-            public string CntrCode { get; set; }
-
-            /// <summary>
-            /// 璐т綅缂栫爜
-            /// </summary>
-            public string LocCode { get; set; }
-        }
-        /// <summary>
-        /// 绌烘墭/绌虹鍏ュ簱(PDA)鏁版嵁绫�-        /// </summary>
-        public class EmptyInboundInfo {
-            /// <summary>
-            /// 瀹瑰櫒缂栫爜
-            /// </summary>
-            [JsonProperty("cntr_code")]
-            public string CntrCode { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒绫诲瀷
-            /// </summary>
-            [JsonProperty("cntr_type")]
-            public string CntrType { get; set; }
-            /// <summary>
-            /// 缁堢偣搴撳尯缂栫爜
-            /// </summary>
-            [JsonProperty("end_area")]
-            public string EndArea { get; set; }
-            /// <summary>
-            /// 璧风偣璐т綅
-            /// </summary>
-            [JsonProperty("start_loc")]
-            public string StartLoc { get; set; }
-        }
-
-        public class EmptyInboundDetailInfo : StartCntInfo { }
-
-        //public class EmptyOnlineInfo {
-        //    public string ItemCode { get; set; }
-        //    public string ItemName { get; set; }
-        //    public string PatchNo { get; set; }
-        //    public string EndLoc { get; set; }
-        //}
-
-        public class EmptyOnlinePalletInfo {
-            /// <summary>
-            /// 鐗╂枡缂栫爜
-            /// </summary>
-            
-            [JsonProperty("item_code")]
-            public string ItemCode { get; set; }
-            ///// <summary>
-            ///// 鐗╂枡鍚嶇О
-            ///// </summary>
-            //
-            //[JsonProperty("item_name")]
-            //public string ItemName { get; set; }
-            /// <summary>
-            /// 鎵规鍙�-            /// </summary>
-            
-            [JsonProperty("batch_no")]
-            public string BatchNo { get; set; }
-            /// <summary>
-            /// 鐗╂枡瑙勬牸
-            /// </summary>
-            [JsonProperty("spe")]
-            public string Spe { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒缂栫爜
-            /// </summary>
-            [JsonProperty("cnt_id")]
-            public string CntId { get; set; }
-            // 瀹瑰櫒绫诲瀷 = 鎵樼洏
-        }
-
-        public class EmptyOnlineGoodpackInfo {
-            // 瀹瑰櫒绫诲瀷 = 濂借繍绠�-            /// <summary>
-            /// 瀹瑰櫒缂栫爜
-            /// </summary>
-            [JsonProperty("cnt_id")]
-            public string CntId { get; set; }
-        }
-
-        /// <summary>
-        /// 鎶芥-鍒涘缓鎶芥鍗�WMS)鏁版嵁绫�-        /// </summary>
-        public class CreateCheckOrderInfo {
-            /// <summary>
-            /// 鐗╂枡缂栫爜
-            /// </summary>
-            
-            [JsonProperty("item_code")]
-            public string ItemCode { get; set; }
-            ///// <summary>
-            ///// 鐗╂枡鍚嶇О
-            ///// </summary>
-            //
-            //[JsonProperty("item_name")]
-            //public string ItemName { get; set; }
-            /// <summary>
-            /// 鐗╂枡瑙勬牸
-            /// </summary>
-            [JsonProperty("spe")]
-            public string Spe { get; set; }
-            /// <summary>
-            /// 鎵规鍙�-            /// </summary>
-            
-            [JsonProperty("batch_no")]
-            public string BatchNo { get; set; }
-            /// <summary>
-            /// 闇�嚭搴撴暟閲�-            /// </summary>
-            [JsonProperty("qty")]
-            public int Qty { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒绫诲瀷
-            /// </summary>
-            
-            [JsonProperty("cntr_type")]
-            public string CntrType { get; set; }
-            /// <summary>
-            /// 鍑哄簱缁堢偣璐у尯
-            /// </summary>
-            
-            [JsonProperty("end_area")]
-            public string EndArea { get; set; }
-        }
-        /// <summary>
-        /// 鎶芥-鍚堟牸鍥炲簱(PDA) 鏁版嵁绫�-        /// </summary>
-        public class QualifiedBackInfo {
-            /// <summary>
-            /// 鐗╂枡缂栫爜
-            /// </summary>
-            [JsonProperty("item_code")]
-            public string ItemCode { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒缂栫爜
-            /// </summary>
-            [JsonProperty("cntr_code")]
-            public string CntrCode { get; set; }
-        }
-
-        public class UnqualifiedShiftInfo : QualifiedBackInfo {
-            /// <summary>
-            /// 涓嶅悎鏍肩Щ搴撶粓鐐瑰簱鍖�-            /// </summary>
-            [JsonProperty("end_area")]
-            public string EndArea { get; set; }
-        }
-
-        public class CheckShiftInfo : UnqualifiedShiftInfo {
-            public bool Qualified { get; set; }
-        }
-
-        #endregion
-
-        #region WMS 鏁版嵁
-        /// <summary>
-        /// 鎴愬搧鑳跺嚭搴�PDA)
-        /// </summary>
-        public class FinishedOutboundInfo {
-            /// <summary>
-            /// 鐗╂枡缂栫爜
-            /// </summary>
-            [JsonProperty("item_code")]
-            public string ItemCode { get; set; }
-            ///// <summary>
-            ///// 鐗╂枡鍚嶇О
-            ///// </summary>
-            //[JsonProperty("item_name")]
-            //public string ItemName { get; set; }
-            /// <summary>
-            /// 鐗╂枡瑙勬牸
-            /// </summary>
-            [JsonProperty("spe")]
-            public string Spe { get; set; }
-            /// <summary>
-            /// 鎵规鍙�-            /// </summary>
-            [JsonProperty("batch_no")]
-            public string BatchNo { get; set; }
-            /// <summary>
-            /// 闇�嚭搴撴暟閲�-            /// </summary>
-            [JsonProperty("qty")]
-            public int Qty { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒绫诲瀷
-            /// </summary>
-            [JsonProperty("cntr_type")]
-            public string CntrType { get; set; }
-            /// <summary>
-            /// 鍑哄簱缁堢偣璐у尯
-            /// </summary>
-            [JsonProperty("end_area")]
-            public string EndArea { get; set; }
-            /// <summary>
-            /// 鏄惁寮哄埗鍑哄簱
-            /// </summary>
-            [JsonProperty("force_out")]
-            public bool ForcedOut { get; set; }
-        }
-        /// <summary>
-        /// 绉诲簱-鍒涘缓绉诲簱浠诲姟鏁版嵁绫�-        /// </summary>
-        public class CreateShiftOrderInfo {
-            /// <summary>
-            /// 鐗╂枡缂栫爜
-            /// </summary>
-            
-            [JsonProperty("item_code")]
-            public string ItemCode { get; set; }
-            ///// <summary>
-            ///// 鐗╂枡鍚嶇О
-            ///// </summary>
-            //
-            //[JsonProperty("item_name")]
-            //public string ItemName { get; set; }
-            /// <summary>
-            /// 鎵规鍙�-            /// </summary>
-            
-            [JsonProperty("batch_no")]
-            public string BatchNo { get; set; }
-            /// <summary>
-            /// 绉诲簱缁堢偣璐у尯
-            /// </summary>
-            
-            [JsonProperty("end_area")]
-            public string EndArea { get; set; }
-        }
-
-        /// <summary>
-        /// 浣欐枡灏剧鍥炲簱(PDA)鏁版嵁绫�-        /// </summary>
-        public class RestBackInfo {
-            /// <summary>
-            /// 璧风偣璐т綅
-            /// </summary>
-            [JsonProperty("start_loc")]
-            public string StartLoc { get; set; }
-        }
-        #endregion
-
-        //------------------------------------------------------------------------------
-
-        #region 妯℃澘鏁版嵁
-        /// <summary>
-        /// 妯℃澘鎶借薄鏁版嵁绫伙細璧风偣璐т綅銆佸鍣ㄥ彿
-        /// </summary>
-        public abstract class StartCntInfo {
-            /// <summary>
-            /// 璧风偣璐т綅
-            /// </summary>
-            public string StartLoc { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒鍙�-            /// </summary>
-            public string CntId { get; set; }
-        }
-        #endregion
-
-    }
-}
diff --git a/Dtos/Request/WmsRequest.cs b/Dtos/Request/WmsRequest.cs
deleted file mode 100644
index 92e3e85..0000000
--- a/Dtos/Request/WmsRequest.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using Newtonsoft.Json;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Request {
-    public class WmsRequest {
-        /// <summary>
-        /// 鐗╂枡淇℃伅涓嬪彂鍚屾 鏁版嵁绫�-        /// </summary>
-        public class CgInfoSyncInfo {
-            /// <summary>
-            /// 鐗╂枡鍚嶇О
-            /// </summary>
-            [JsonProperty("itemName")]
-            public string ItemName { get; set; }
-
-            /// <summary>
-            /// 浜у搧鐗屽彿
-            /// </summary>
-            [JsonProperty("itemCode")]
-            public string ItemCode { get; set; }
-
-            /// <summary>
-            /// 鎵规鍙�-            /// </summary>
-            [JsonProperty("batchNo")]
-            public string BatchNo { get; set; }
-
-            /// <summary>
-            /// 鎵ц鏍囧噯
-            /// </summary>
-            [JsonProperty("standard")]
-            public string Standard { get; set; }
-
-            /// <summary>
-            /// 鍑�惈閲�-            /// </summary>
-            [JsonProperty("netWeight")]
-            public string NetWeight { get; set; }
-
-            /// <summary>
-            /// 璐ㄩ噺绛夌骇
-            /// </summary>
-            [JsonProperty("qualityGrade")]
-            public string QualityGrade { get; set; }
-        }
-    }
-}
diff --git a/Dtos/Response/AgvResponse.cs b/Dtos/Response/AgvResponse.cs
deleted file mode 100644
index 8da52dc..0000000
--- a/Dtos/Response/AgvResponse.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
-    public class AgvResponse {
-        /// <summary>
-        /// 杩斿洖缁�HostToAgv
-        /// </summary>
-        public class ReturnResult {
-            public int ResultCode { get; set; }
-            public string ResultMsg { get; set; }
-        }
-
-    }
-}
diff --git a/Dtos/Response/DebugResponse.cs b/Dtos/Response/DebugResponse.cs
deleted file mode 100644
index 3ae23e1..0000000
--- a/Dtos/Response/DebugResponse.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
-    public class DebugResponse {
-        /// <summary>
-        /// 
-        /// </summary>
-        public class ReturnResults {
-            public List<ReturnResult> ResultList { set; get; }
-        }
-    }
-}
diff --git a/Dtos/Response/MoboxResponse.cs b/Dtos/Response/MoboxResponse.cs
deleted file mode 100644
index a5068c7..0000000
--- a/Dtos/Response/MoboxResponse.cs
+++ /dev/null
@@ -1,245 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using Newtonsoft.Json;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
-    public class MoboxResponse {
-        /// <summary>
-        /// Mobox 鎺ュ彛杩斿洖鏁版嵁绫�-        /// </summary>
-        public class SimpleResult {
-
-            [JsonProperty("resultCode")]
-            public int Code { get; set; }
-
-            [JsonProperty("resultMsg")]
-            public string Message { get; set; }
-
-            [JsonProperty("result")]
-            public List<object> Results { get; set; } = new List<object>();
-        }
-
-        /// <summary>
-        /// 鏋勫缓 <see cref="SimpleResult"/> 杩斿洖鍊硷紝閫夋嫨鎵撳嵃鏃ュ織淇℃伅锛堥粯璁ゆ墦鍗帮級
-        /// </summary>
-        /// <param name="code"></param>
-        /// <param name="message"></param>
-        /// <param name="pringLog"></param>
-        /// <returns></returns>
-        public static SimpleResult BuildSimpleResult(int code, string message, bool pringLog = true) {
-            if (pringLog) {
-                LogHelper.Info(message);
-            }
-            return new SimpleResult { Code = code, Message = message };
-        }
-
-        /// <summary>
-        /// 鏋勫缓 <see cref="SimpleResult"/> 寮傚父杩斿洖鍊硷紝閫夋嫨鎵撳嵃寮傚父鏃ュ織淇℃伅锛堥粯璁ゆ墦鍗帮級
-        /// </summary>
-        /// <param name="ex"></param>
-        /// <param name="exCode"></param>
-        /// <param name="pringLog"></param>
-        /// <returns></returns>
-        public static SimpleResult BuildSimpleEx(Exception ex, int exCode = 1, bool pringLog = true) {
-            if (pringLog) {
-                LogHelper.InfoEx(ex);
-            }
-            return new SimpleResult { Code = exCode, Message = ex.Message };
-        }
-
-        /// <summary>
-        /// mobox 鍙栨秷浠诲姟銆佹爣璁板畬鎴愪换鍔�-        /// </summary>
-        public class MoboxTaskBase {
-            [JsonProperty("task_no")]
-            public string TaskNo { get; set; }
-        }
-
-        /// <summary>
-        /// 缁戝畾 鍙傛暟
-        /// </summary>
-        public class BindParme {
-            /// <summary>
-            /// 鎵樼洏缂栫爜
-            /// </summary>
-            public string CntrCode { get; set; }
-            /// <summary>
-            /// 鎵樼洏绫诲瀷
-            /// </summary>
-            public string CntrType { get; set; }
-            /// <summary>
-            /// 璐т綅缂栫爜
-            /// </summary>
-            public string LocCode { get; set; }
-            /// <summary>
-            /// 鐗╂枡缂栫爜
-            /// </summary>
-            public string ItemCode { get; set; }
-            /// <summary>
-            /// 鐗╂枡鏁伴噺
-            /// </summary>
-            public int ItemQuantity { get; set; }
-        }
-
-        /// <summary>
-        /// 瑙g粦 鍙傛暟
-        /// </summary>
-        public class UnBindParme {
-            /// <summary>
-            /// 鎵樼洏缂栫爜
-            /// </summary>
-            public string CntrCode { get; set; }
-
-        }
-
-        public class sendTask {
-
-            /// <summary>
-            /// 璁㈠崟鍚�-            /// </summary>
-            public string ts { get; set; }
-        }
-
-        /// <summary>
-        /// 鏇存柊琛ヨ揣鐘舵�鍙傛暟
-        /// </summary>
-        public class replenishmentParme {
-            /// <summary>
-            /// Y寮�浜哄伐琛ヨ揣杩涘叆浜ら�绠″埗,N琛ㄧず浜哄伐琛ヨ揣瀹屾垚鍙互寮�惎鑷姩杞繍
-            /// </summary>
-            public string stauts { get; set; }
-        }
-
-
-        public class orderStatusReportParme {
-            /// <summary>
-            /// 璁㈠崟ID
-            /// </summary>
-            public int orderID { get; set; }
-            /// <summary>
-            /// 璁㈠崟鍚�-            /// </summary>
-            public string orderName { get; set; }
-            /// <summary>
-            /// 璁㈠崟鐘舵�
-            /// </summary>
-            public string orderStatus { get; set; }
-            /// <summary>
-            /// agv杞﹀彿鍒楄〃
-            /// </summary>
-            public string agvIDList { get; set; }
-            /// <summary>
-            /// 浼樺厛绾�-            /// </summary>
-            public string priority { get; set; }
-            /// <summary>
-            /// 璁㈠崟褰撳墠鐨勭洰鐨勫湴
-            /// </summary>
-            public string currentDes { get; set; }
-
-
-            /// <summary>
-            /// 褰撳墠鎸囦护
-            /// </summary>
-            public string currentCmd { get; set; }
-
-            /// <summary>
-            /// 閿欒鐮�-            /// </summary>
-            public int errorCode { get; set; }
-
-            /// <summary>
-            /// 璁㈠崟鐨勬埅鑷虫椂闂�-            /// </summary>
-            public string deadLine { get; set; }
-
-            /// <summary>
-            /// 璁㈠崟鐨勫垱寤烘椂闂�-            /// </summary>
-            public string createdTime { get; set; }
-
-            /// <summary>
-            /// 棰濆淇℃伅1
-            /// </summary>
-            public string extraInfo1 { get; set; }
-
-            /// <summary>
-            /// 棰濆淇℃伅2
-            /// </summary>
-            public string extraInfo2 { get; set; }
-        }
-
-        /// <summary>
-        /// 鍒嗘嫞纭
-        /// </summary>
-        public class SortingResultCheck {
-            public string sortNo { get; set; }
-            public string cntrCode { get; set; }
-            public string itemCode { get; set; }
-            public float qty { get; set; }
-        }
-        public class CheckSortingWholeCntr {
-            public string cntr { get; set; }
-            /// <summary>
-            /// 榛樿0锛�琛ㄧず鑷姩鐢熸垚鍒嗘嫞缁撴灉
-            /// </summary>
-            public int autoSort { get; set; }
-        }
-
-        /// <summary>
-        /// lua 璋冪敤鎺ュ彛锛岀爜鐩樹俊鎭�-        /// </summary>
-        public class PalletSorting {
-            public string cntr_code { get; set; }
-            public string item_code { get; set; }
-            public float qty { get; set; }
-            public string arrival_no { get; set; }
-        }
-        public class PalletSorting1 {
-            public string cntr_code { get; set; }
-            public string bar_code { get; set; }
-            public string org { get; set; }
-            public float qty { get; set; }
-        }
-
-        public class ShippingOrderCheck {
-            /// <summary>
-            /// 澶氫釜鍙戣揣鍗曞彿
-            /// </summary>
-            public string out_nos { get; set; }
-        }
-        public class SortingOrderCheck {
-
-            public string s_no { get; set; }
-        }
-
-        public class ReturnResult1 {
-            public int code { get; set; }
-            public string msg { get; set; }
-
-        }
-
-        /// <summary>
-        /// 瀹夊叏浜や簰
-        /// </summary>
-        public class Interaction {
-            public string station_name { get; set; }
-            public string apply_code { get; set; }
-            public int orderid { get; set; }
-
-        }
-        /// <summary>
-        /// 杩斿洖缁橤Z
-        /// </summary>
-        public class GzResult {
-            
-            public int resultCode { get; set; }
-            public string msg { get; set; }
-            public int orderID { get; set; }
-        }
-    }
-}
diff --git a/Dtos/Response/WmsResponse.cs b/Dtos/Response/WmsResponse.cs
deleted file mode 100644
index 92d1bb6..0000000
--- a/Dtos/Response/WmsResponse.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using Newtonsoft.Json;
-
-namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
-    public class WmsResponse {
-        /// <summary>
-        /// MES API 鍝嶅簲缁撴灉绫�-        /// </summary>
-        public class WmsResult {
-            /// <summary>
-            /// 鎺ュ彛璋冪敤缁撴灉  1-鎴愬姛  0-澶辫触
-            /// </summary>
-            [JsonProperty("result")]
-            public int Result { get; set; }
-
-            /// <summary>
-            /// 鏄惁鎴愬姛 True-鎴愬姛锛孎alse锛氬け璐�-            /// </summary>
-            [JsonProperty("success")]
-            public bool Success { get; set; }
-
-            /// <summary>
-            /// 杩欓噷鏄痵tring绫诲瀷锛屽缁撴灉鐨勬弿杩�-            /// </summary>
-            [JsonProperty("data")]
-            public string Data { get; set; }
-        }
-
-        public static WmsResult MesResultBuilder(int code, string message = "", bool printLog = true) {
-            if (printLog && string.IsNullOrEmpty(message)) {
-                LogHelper.Info(message);
-            }
-            return new WmsResult {
-                Result = code,
-                Success = code == 0, // 浠呭綋code=0鏃讹紝success=true
-                Data = message,
-            };
-        }
-    }
-}
diff --git a/HH.WCS.Mobox3.DSZSH.csproj b/HH.WCS.Mobox3.DSZSH.csproj
index d552ec5..62b0e59 100644
--- a/HH.WCS.Mobox3.DSZSH.csproj
+++ b/HH.WCS.Mobox3.DSZSH.csproj
@@ -224,87 +224,63 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="App_Start\Config.cs" />
-    <Compile Include="App_Start\SwaggerConfig.cs" />
-    <Compile Include="Consts\AgvStateCode.cs" />
-    <Compile Include="Consts\AgvStateName.cs" />
-    <Compile Include="Consts\AreaName.cs" />
-    <Compile Include="Consts\LockStateCode.cs" />
-    <Compile Include="Consts\LockStateName.cs" />
-    <Compile Include="Consts\SpotStateCode.cs" />
-    <Compile Include="Consts\TaskName.cs" />
-    <Compile Include="Controllers\DebugController.cs" />
-    <Compile Include="Controllers\ErpController.cs" />
-    <Compile Include="Controllers\MesController.cs" />
-    <Compile Include="Controllers\MoboxController.cs" />
-    <Compile Include="Controllers\AgvController.cs" />
+    <Compile Include="api\ApiHelper.cs" />
+    <Compile Include="api\ApiModel.cs" />
+    <Compile Include="api\DebugController.cs" />
+    <Compile Include="api\ErpController.cs" />
+    <Compile Include="api\MesController.cs" />
+    <Compile Include="api\MoboxController.cs" />
+    <Compile Include="api\AgvController.cs" />
     <Compile Include="App_Start\SwaggerControllerDescProvider.cs" />
-    <Compile Include="Dtos\Request\WmsRequest.cs" />
-    <Compile Include="Dtos\Response\WmsResponse.cs" />
-    <Compile Include="Models\DebugModel.cs" />
-    <Compile Include="Dtos\Request\DebugRequest.cs" />
-    <Compile Include="Dtos\Response\DebugResponse.cs" />
-    <Compile Include="Helpers\AgvHelper.cs" />
-    <Compile Include="Helpers\ExprHelper.cs" />
-    <Compile Include="Helpers\PathHelper.cs" />
-    <Compile Include="Helpers\DbHelper.cs" />
-    <Compile Include="Models\TN_Container_Item.cs" />
-    <Compile Include="Models\TN_Check_Detail.cs" />
-    <Compile Include="Models\TN_Check_Order.cs" />
-    <Compile Include="Models\TN_Inbound_Order.cs" />
-    <Compile Include="Models\TN_Order_Task.cs" />
-    <Compile Include="Models\TN_Outbound_Order.cs" />
-    <Compile Include="Models\TN_Outbound_Detail.cs" />
-    <Compile Include="Models\TN_Shift_Detail.cs" />
-    <Compile Include="Models\TN_Shift_Order.cs" />
-    <Compile Include="ServiceCore\CheckCore.cs" />
-    <Compile Include="ServiceCore\DebugCore.cs" />
-    <Compile Include="ServiceCore\OutboundCore.cs" />
-    <Compile Include="ServiceCore\ShiftCore.cs" />
-    <Compile Include="Services\DebugService.cs" />
-    <Compile Include="Devices\ProductionLineDevice.cs" />
-    <Compile Include="Devices\ModbusHelper.cs" />
-    <Compile Include="Devices\OpcUaHelper.cs" />
-    <Compile Include="Devices\PlcHelper.cs" />
-    <Compile Include="Devices\S7Helper.cs" />
-    <Compile Include="Devices\TcpClient.cs" />
-    <Compile Include="Devices\TcpServer.cs" />
-    <Compile Include="Dispatch\GZRobot.cs" />
-    <Compile Include="Dispatch\HanAo.cs" />
-    <Compile Include="Dispatch\NDC.cs" />
-    <Compile Include="ServiceCore\OfflineCore.cs" />
-    <Compile Include="Dispatch\NDCApi.cs" />
-    <Compile Include="Dtos\Request\AgvRequest.cs" />
-    <Compile Include="Dtos\Request\MoboxRequest.cs" />
-    <Compile Include="Dtos\Response\AgvResponse.cs" />
-    <Compile Include="Dtos\Response\MoboxResponse.cs" />
-    <Compile Include="Models\BaseModel.cs" />
-    <Compile Include="Models\TN_CG_Detail.cs" />
-    <Compile Include="Models\TN_CAR_IN.cs" />
-    <Compile Include="Models\TN_Container.cs" />
-    <Compile Include="Models\TN_Location.cs" />
-    <Compile Include="Models\TN_Loc_Container.cs" />
-    <Compile Include="Models\TN_WorkOrder.cs" />
-    <Compile Include="Models\TN_Task.cs" />
-    <Compile Include="Models\TN_Task_Action.cs" />
-    <Compile Include="Helpers\DeviceProcess.cs" />
-    <Compile Include="ServiceCore\TaskCore.cs" />
-    <Compile Include="Controllers\WMSController.cs" />
-    <Compile Include="Dispatch\HostToAGV.cs" />
-    <Compile Include="Helpers\TaskHelper.cs" />
-    <Compile Include="Services\AgvService.cs" />
-    <Compile Include="Services\WmsService.cs" />
-    <Compile Include="Services\MoboxService.cs" />
-    <Compile Include="Helpers\LogHelper.cs" />
-    <Compile Include="Helpers\ContainerHelper.cs" />
-    <Compile Include="Helpers\LocationHelper.cs" />
-    <Compile Include="Helpers\SysHelper.cs" />
+    <Compile Include="core\Monitor.cs" />
+    <Compile Include="core\WCSCore.cs" />
+    <Compile Include="core\WMSCore.cs" />
+    <Compile Include="process\TaskProcess.cs" />
+    <Compile Include="util\SqlHelper.cs" />
+    <Compile Include="models\TN_Container_Item.cs" />
+    <Compile Include="models\TN_Check_Detail.cs" />
+    <Compile Include="models\TN_Check_Order.cs" />
+    <Compile Include="models\TN_Inbound_Order.cs" />
+    <Compile Include="models\TN_Order_Task.cs" />
+    <Compile Include="models\TN_Outbound_Order.cs" />
+    <Compile Include="models\TN_Outbound_Detail.cs" />
+    <Compile Include="models\TN_Shift_Detail.cs" />
+    <Compile Include="models\TN_Shift_Order.cs" />
+    <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" />
+    <Compile Include="dispatch\NDCApi.cs" />
+    <Compile Include="models\BaseModel.cs" />
+    <Compile Include="models\TN_CG_Detail.cs" />
+    <Compile Include="models\TN_CAR_IN.cs" />
+    <Compile Include="models\TN_Container.cs" />
+    <Compile Include="models\TN_Location.cs" />
+    <Compile Include="models\TN_Loc_Container.cs" />
+    <Compile Include="models\TN_WorkOrder.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" />
+    <Compile Include="wms\ContainerHelper.cs" />
+    <Compile Include="wms\LocationHelper.cs" />
+    <Compile Include="wms\SYSHelper.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="App_Start\Settings.cs" />
+    <Compile Include="util\Settings.cs" />
     <Compile Include="App_Start\Startup.cs" />
-    <Compile Include="Dispatch\NDCHelper.cs" />
-    <Compile Include="Helpers\HttpHelper.cs" />
+    <Compile Include="dispatch\NDCHelper.cs" />
+    <Compile Include="util\HttpHelper.cs" />
+    <Compile Include="wms\WCSHelper.cs" />
+    <Compile Include="wms\WMSHelper.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include=".editorconfig" />
@@ -312,12 +288,9 @@
     <None Include="config\config.json">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
-    <None Include="debug\loc_cntr_cg.csv" />
-    <None Include="debug\task.csv" />
     <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="debug\outbound_order.csv" />
     <Content Include="readme.md" />
     <EmbeddedResource Include="swagger.js">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
diff --git a/Helpers/AgvHelper.cs b/Helpers/AgvHelper.cs
deleted file mode 100644
index 28b1eab..0000000
--- a/Helpers/AgvHelper.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
-    public class AgvHelper {
-        /// <summary>
-        /// AGV 浠诲姟鐘舵�浼樺厛绾э細1->3->4->5->6->2
-        /// </summary>
-        private static readonly int[] _agvTaskStatePri = { 0, 1, 6, 2, 3, 4, 5 };
-
-        /// <summary>
-        /// AGV 鐘舵�鍙樺寲琛細1->3->4->5->6->2 | 0->0 | 2->0
-        /// </summary>
-        private static readonly int[] _agvNextState = new int[] { 0, 3, 0, 4, 5, 6, 2 };
-
-        /// <summary>
-        /// 鍒ゆ柇AGV鐘舵�鏄惁涓哄悎娉曠殑涓嬩釜鐘舵�锛堝寘鍚鏌ョ姸鎬佹槸鍚︿负浠诲姟鐘舵�锛�-        /// </summary>
-        /// <remarks>
-        /// 1. 鍓嶅悗鐘舵�鍙鏈変笉鍚堟硶閮戒細杩斿洖 <see langword="false"/><br/>
-        /// 2. nextState 鍙互涓�lastState 鐩稿悓
-        /// </remarks>
-        /// <param name="lastState"></param>
-        /// <param name="nextState"></param>
-        /// <returns></returns>
-        public static bool IsNextStateOk(int lastState, int nextState) {
-            var lastPri = GetPri(lastState);
-            var nextPri = GetPri(nextState);
-            return lastPri != 0 && nextPri != 0 && lastPri <= nextPri;
-        }
-
-        /// <summary>
-        /// 鑾峰彇AGV褰撳墠鐘舵�鐨勪笅涓姸鎬侊細涓嶅悎娉曟垨涓�2(瀹屾垚) 鏃惰繑鍥�0
-        /// </summary>
-        /// <param name="curState"></param>
-        /// <returns></returns>
-        public static int GetNextState(int curState) {
-            if (!IsTaskState(curState)) return 0;
-            return _agvNextState[curState];
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇 AGV 鐘舵�鏄惁涓烘甯哥殑鎵ц浠诲姟鐘舵�锛�34562
-        /// </summary>
-        /// <param name="state"></param>
-        /// <returns></returns>
-        private static bool IsTaskState(int state) {
-            return state > 0 && state < 7;
-        }
-
-        /// <summary>
-        /// GetTaskStatePri锛氳幏鍙�AGV 浠诲姟鐘舵�鐨勪紭鍏堢骇锛堝寘鍚鏌ョ姸鎬佹槸鍚︿负浠诲姟鐘舵�锛�-        /// </summary>
-        /// <param name="state"></param>
-        /// <returns></returns>
-        private static int GetPri(int state) {
-            if (!IsTaskState(state)) { return 0; }
-            return _agvTaskStatePri[state];
-        }
-    }
-}
diff --git a/Helpers/DbHelper.cs b/Helpers/DbHelper.cs
deleted file mode 100644
index da9acf3..0000000
--- a/Helpers/DbHelper.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-锘縰sing System;
-using System.Linq;
-
-using HH.WCS.Mobox3.DSZSH.AppStart;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-
-using SqlSugar;
-
-using Task = System.Threading.Tasks.Task;
-
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
-    // SqlSugar 鏁欑▼锛歨ttps://www.donet5.com/Home/Doc
-
-    /// <summary>
-    /// 鏁版嵁搴撳府鍔╃被锛氬寘鎷崟渚嬫ā寮忓拰鍒涘缓鏂拌繛鎺ョ殑鏂规硶
-    /// </summary>
-    public static class DbHelper {
-        private static readonly SqlSugarScope _sqlSugar;
-
-        static DbHelper() {
-            _sqlSugar = new SqlSugarScope(new ConnectionConfig() {
-                ConnectionString = Settings.Config.SqlServer,
-                DbType = DbType.SqlServer,
-                IsAutoCloseConnection = true,
-                InitKeyType = InitKeyType.Attribute // 浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�-            },
-            db => {
-                // 鐩戞帶鎵�湁瓒呰繃1绉掔殑Sql
-                db.Aop.OnLogExecuted = (sql, p) =>
-                {
-                    // 鎵ц鏃堕棿瓒呰繃1绉�-                    if (db.Ado.SqlExecutionTime.TotalSeconds > 1) {
-                        Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(p.ToDictionary(it => it.ParameterName, it => it.Value)));
-                        // 浠g爜CS鏂囦欢鍚�-                        var fileName = db.Ado.SqlStackTrace.FirstFileName;
-                        // 浠g爜琛屾暟
-                        var fileLine = db.Ado.SqlStackTrace.FirstLine;
-                        // 鏂规硶鍚�-                        var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
-                    }
-                    // 鐩稿綋浜嶦F鐨�PrintToMiniProfiler
-                };
-
-                // 姣忔璁剧疆鏁板�鏃堕兘鍘婚櫎鍓嶅鍚庡绌烘牸
-                db.Aop.DataExecuted = (value, entity) => {
-                    entity.EntityColumnInfos.ToList().ForEach(a => {
-                        var pvalue = entity.GetValue(a.PropertyName);
-                        if (pvalue != null && pvalue.GetType() == typeof(String)) {
-                            entity.SetValue(a.PropertyName, pvalue.ToString().Trim());
-                        }
-                    });
-                };
-
-                // 閰嶇疆AOP鏃ュ織
-                //db.Aop.OnLogExecuting = (sql, pars) => {
-                //    Console.WriteLine(sql); // 杈撳嚭绾疭QL璇彞
-                //};
-
-                // 姣廚灏忔椂娓呯悊涓�缂撳瓨
-                Task.Run(async () => {
-                    while (true) {
-                        await Task.Delay(TimeSpan.FromHours(2));
-                        db.QueryFilter.Clear();
-                    }
-                });
-            });
-        }
-
-        /// <summary>
-        /// 鑾峰彇鐢ㄤ簬鎿嶆帶鏁版嵁搴撶殑 SqlSugarClient 瀵硅薄
-        /// </summary>
-        /// <returns></returns>
-        public static SqlSugarScope GetDbClient() {
-            return _sqlSugar;
-        }
-
-        /// <summary>
-        /// 鐢熸垚鐢ㄤ簬鎿嶆帶鏁版嵁搴撶殑 SqlSugarClient 瀵硅薄
-        /// </summary>
-        /// <remarks>
-        /// 濡傛灉鐢�Oracle 鏁版嵁闇�鍖�Oracle.ManagedDataAccess/21.15.0锛岀幆澧�netframework 4.62锛屽お鏂颁簡 4.8 鏈夌殑鏈嶅姟鍣ㄥ畨瑁呬笉涓婂幓
-        /// </remarks>
-        /// <param name="url"></param>
-        /// <returns></returns>
-        public static SqlSugarClient NewDbClient(string url = "") {
-            // 鍒涘缓鏁版嵁搴撳璞�-            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() {
-                ConnectionString = string.IsNullOrEmpty(url) ? Settings.Config.SqlServer : url,
-                DbType = DbType.SqlServer,
-                IsAutoCloseConnection = true,
-                InitKeyType = InitKeyType.Attribute // 浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�-            });
-
-            // 鐩戞帶鎵�湁瓒呰繃1绉掔殑Sql
-            db.Aop.OnLogExecuted = (sql, p) => {
-                // 鎵ц鏃堕棿瓒呰繃1绉�-                if (db.Ado.SqlExecutionTime.TotalSeconds > 1) {
-                    Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(p.ToDictionary(it => it.ParameterName, it => it.Value)));
-                    // 浠g爜CS鏂囦欢鍚�-                    var fileName = db.Ado.SqlStackTrace.FirstFileName;
-                    // 浠g爜琛屾暟
-                    var fileLine = db.Ado.SqlStackTrace.FirstLine;
-                    // 鏂规硶鍚�-                    var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
-                }
-                // 鐩稿綋浜嶦F鐨�PrintToMiniProfiler
-            };
-
-            // 姣忔璁剧疆鏁板�鏃堕兘鍘婚櫎鍓嶅鍚庡绌烘牸
-            db.Aop.DataExecuted = (value, entity) => {
-                entity.EntityColumnInfos.ToList().ForEach(a => {
-                    var pvalue = entity.GetValue(a.PropertyName);
-                    if (pvalue != null && pvalue.GetType() == typeof(String)) {
-                        entity.SetValue(a.PropertyName, pvalue.ToString().Trim());
-                    }
-                });
-            };
-
-            // 鎹浆鎹�(ExecuteCommand 鎵嶄細鎷︽埅锛屾煡璇笉琛�
-            //db.Aop.DataExecuting = (value, entity) => {
-            //    //var val=entity.EntityColumnInfo
-            //    Console.WriteLine(entity.EntityName);
-            //};
-
-            // 鐢ㄤ簬鎵撳嵃 SqlSugar 瑙g爜鍚庣殑 SQL 璇彞
-            db.Aop.OnLogExecuting = (sql, pars) => {
-                Console.WriteLine(sql);
-            };
-
-            return db;
-        }
-    }
-}
diff --git a/Helpers/ExprHelper.cs b/Helpers/ExprHelper.cs
deleted file mode 100644
index 8918bd9..0000000
--- a/Helpers/ExprHelper.cs
+++ /dev/null
@@ -1,175 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-
-using HH.WCS.Mobox3.DSZSH.AppStart;
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
-    /// <summary>
-    /// ExpressionHelper锛氳〃杈惧紡宸ュ叿
-    /// </summary>
-    /// <remarks>
-    /// 瀹氫箟浜�鎵╁睍鏂规硶锛屽繀椤诲0鏄庝负 闈欐�绫�-    /// </remarks>
-    public static class ExprHelper {
-        /// <summary>
-        /// 绛涢�鍙敤璐т綅锛氭湭涓婇攣锛堟棤浠诲姟閿佸畾锛夈�宸插惎鐢�-        /// </summary>
-        public static Expression<Func<TN_Location, bool>> LocIsFree =
-            l => l.N_LOCK_STATE == LockStateCode.鏃�-            && l.S_LOCK_STATE == LockStateName.鏃�-            && l.C_ENABLE == "Y"; // 榛樿閮芥槸鍚敤
-
-        /// <summary>
-        /// 绛涢�绌鸿揣浣嶏細璐т綅褰撳墠瀹瑰櫒鏁伴噺涓�0
-        /// </summary>
-        public static Expression<Func<TN_Location, bool>> LocIsEmpty =
-            l => l.N_CURRENT_NUM == 0;
-
-        /// <summary>
-        /// 绛涢�婊¤揣浣嶏細璐т綅褰撳墠瀹瑰櫒鏁伴噺 = 璐т綅瀹瑰櫒瀹归噺
-        /// </summary>
-        public static Expression<Func<TN_Location, bool>> LocIsFull =
-            l => l.N_CURRENT_NUM == l.N_CAPACITY;
-
-        public static Expression<Func<TN_Location, bool>> LocCode(string locCode) =>
-            l => l.S_CODE == locCode;
-
-        /// <summary>
-        /// 閫氳繃璐т綅鎵�睘鍖哄煙绛涢�璐т綅
-        /// </summary>
-        /// <remarks>
-        /// 鍙傛暟 areaName 璇蜂娇鐢�AreaName 涓殑甯搁噺
-        /// </remarks>
-        /// <param name="areaName">鍖哄煙鍚嶇О锛堜笉鏄叿浣撶殑鍖哄煙鍙凤級</param>
-        /// <returns></returns>
-        public static Expression<Func<TN_Location, bool>> LocBelongsToArea(string areaName) =>
-            l => AppStart.Settings.AreaMap[areaName].Contains(l.S_AREA_CODE); // SqlSugar 鍙互瑙f瀽绯荤粺鏂规硶 Contains 涓�IN 琛ㄨ揪寮�-
-        /// <summary>
-        /// 绛涢�璐т綅瀹瑰櫒鍏崇郴锛氭煡璇㈡煇涓�璐т綅-瀹瑰櫒 鍏崇郴鏄惁瀛樺湪
-        /// </summary>
-        /// <param name="loc"></param>
-        /// <param name="cntr"></param>
-        /// <returns></returns>
-        public static Expression<Func<TN_Loc_Container, bool>> LocCntrIsBind(string loc, string cntr) =>
-            lc => lc.S_LOC_CODE == loc && lc.S_CNTR_CODE == cntr;
-
-        #region 鎷撳睍鏂规硶
-
-        /// <summary>
-        /// 鎷撳睍鏂规硶锛氬悎骞朵袱涓〃杈惧紡
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="expr1"></param>
-        /// <param name="expr2"></param>
-        /// <returns></returns>
-        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
-            Expression<Func<T, bool>> expr2) {
-            var parameter = expr1.Parameters[0]; // 閲嶇敤绗竴涓〃杈惧紡鐨勫弬鏁�-
-            var visitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
-            var left = expr1.Body;
-            var right = visitor.Visit(expr2.Body);
-
-            return Expression.Lambda<Func<T, bool>>(
-                Expression.AndAlso(left, right),
-                parameter);
-        }
-
-        /// <summary>
-        /// 杈呭姪绫伙細鏇挎崲琛ㄨ揪寮忓弬鏁�-        /// </summary>
-        class ReplaceExpressionVisitor : ExpressionVisitor {
-            private readonly Expression _oldValue;
-            private readonly Expression _newValue;
-
-            public ReplaceExpressionVisitor(Expression oldValue, Expression newValue) {
-                _oldValue = oldValue;
-                _newValue = newValue;
-            }
-
-            public override Expression Visit(Expression node) {
-                if (node == _oldValue)
-                    return _newValue;
-                return base.Visit(node);
-            }
-        }
-
-        /// <summary>
-        /// 鎷撳睍鏂规硶锛氬弽杞〃杈惧紡锛堢洿鎺ュ彇鍙嶏級
-        /// </summary>
-        /// <remarks>
-        /// 涓嶆帹鑽愪娇鐢�| 瀵硅繑鍥炵粨鏋滄暣浣撳彇鍙嶏紝绠�崟鍦烘櫙涓嬪彲浠ヤ娇鐢�-        /// </remarks>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="expr"></param>
-        /// <returns></returns>
-        static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expr) {
-            var parameter = expr.Parameters[0];
-            var body = Expression.Not(expr.Body);
-
-            return Expression.Lambda<Func<T, bool>>(body, parameter);
-        }
-
-        /// <summary>
-        /// 鎷撳睍鏂规硶锛氬弽杞〃杈惧紡锛堥拡瀵圭壒瀹氳繍绠楃杩涜鍙嶈浆锛�-        /// </summary>
-        /// <remarks>
-        /// 鎺ㄨ崘浣跨敤 | 瀵硅〃杈惧紡涓殑姣忎釜閫昏緫杩愮畻绗﹀彇鍙嶏紝澶嶆潅鍦烘櫙涓嬫洿鍚堥�锛岃兘鐢熸垚鏇翠紭鍖栫殑 SQL
-        /// </remarks>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="expr"></param>
-        /// <returns></returns>
-        public static Expression<Func<T, bool>> Negate<T>(this Expression<Func<T, bool>> expr) {
-            var visitor = new NegateExpressionVisitor();
-            var negatedExpr = (Expression<Func<T, bool>>)visitor.Visit(expr);
-            return negatedExpr;
-        }
-
-        /// <summary>
-        /// 杈呭姪绫伙細鍙嶈浆琛ㄨ揪寮忛�杈戣繍绠楃
-        /// </summary>
-        class NegateExpressionVisitor : ExpressionVisitor {
-            protected override Expression VisitBinary(BinaryExpression node) {
-                // 鍙嶈浆姣旇緝杩愮畻绗�-                if (node.NodeType == ExpressionType.Equal)
-                    return Expression.NotEqual(node.Left, node.Right);
-                if (node.NodeType == ExpressionType.NotEqual)
-                    return Expression.Equal(node.Left, node.Right);
-                if (node.NodeType == ExpressionType.GreaterThan)
-                    return Expression.LessThanOrEqual(node.Left, node.Right);
-                if (node.NodeType == ExpressionType.GreaterThanOrEqual)
-                    return Expression.LessThan(node.Left, node.Right);
-                if (node.NodeType == ExpressionType.LessThan)
-                    return Expression.GreaterThanOrEqual(node.Left, node.Right);
-                if (node.NodeType == ExpressionType.LessThanOrEqual)
-                    return Expression.GreaterThan(node.Left, node.Right);
-
-                // 澶勭悊閫昏緫涓�鎴�-                if (node.NodeType == ExpressionType.AndAlso)
-                    return Expression.OrElse(Visit(node.Left), Visit(node.Right));
-                if (node.NodeType == ExpressionType.OrElse)
-                    return Expression.AndAlso(Visit(node.Left), Visit(node.Right));
-
-                return base.VisitBinary(node);
-            }
-
-            protected override Expression VisitUnary(UnaryExpression node) {
-                // 澶勭悊鍙岄噸鍚﹀畾
-                if (node.NodeType == ExpressionType.Not)
-                    return node.Operand;
-
-                return base.VisitUnary(node);
-            }
-        }
-
-        #endregion
-
-    }
-}
diff --git a/Helpers/PathHelper.cs b/Helpers/PathHelper.cs
deleted file mode 100644
index 6c975b8..0000000
--- a/Helpers/PathHelper.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using Opc.Ua;
-
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
-    public class PathHelper {
-        /// <summary>
-        /// 椤圭洰鏂囦欢澶逛笌Debug/Release鏂囦欢鐨勭浉瀵硅矾寰勶紙绉佹湁甯搁噺锛�-        /// </summary>
-        const string RELATIVE_PATH = "../..";
-
-        /// <summary>
-        /// GetProjectDirectory锛氳幏鍙栭」鐩枃浠跺す璺緞
-        /// </summary>
-        public static string GetProjDir(string filepath = "./") {
-            return Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, RELATIVE_PATH, filepath));
-        }
-    }
-}
diff --git a/Helpers/TaskHelper.cs b/Helpers/TaskHelper.cs
deleted file mode 100644
index bbfca8e..0000000
--- a/Helpers/TaskHelper.cs
+++ /dev/null
@@ -1,381 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-
-using HH.WCS.Mobox3.DSZSH.Dispatch;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-using HH.WCS.Mobox3.DSZSH.Helper;
-
-using Newtonsoft.Json;
-
-using SqlSugar;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
-
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
-    /// <summary>
-    /// 浠诲姟甯姪绫�-    /// </summary>
-    public class TaskHelper {
-        /// <summary>
-        /// 鐢熸垚浠诲姟鍙�-        /// </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')}";
-        }
-
-        /// <summary>
-        /// 鍒涘缓鎼繍浠诲姟锛岃繑鍥炰换鍔℃槸鍚﹀垱寤烘垚鍔�-        /// </summary>
-        /// <remarks>
-        /// 涓嶄細妫�煡鍙傛暟鍚堟硶鎬э紝浣跨敤鍓嶈纭繚璐т綅鍙峰拰瀹瑰櫒鍙峰瓨鍦�-        /// </remarks>
-        /// <param name="from">璧风偣璐т綅鍙�/param>
-        /// <param name="cnt">瀹瑰櫒鍙�/param>
-        /// <param name="to">缁堢偣璐т綅鍙�/param>
-        /// <param name="type">浠诲姟绫诲瀷/鍚嶇О</param>
-        /// <param name="pri">浼樺厛绾�/param>
-        /// <returns></returns>
-        public static bool CreateTask(string from, string cnt, string to, string type, int pri = 3) {
-            var startLoc = LocationHelper.GetLocation(from);
-            var endLoc = LocationHelper.GetLocation(to);
-
-            TN_Task TN_Task = new TN_Task() {
-                S_CODE = GenerateTaskNo(),
-                S_START_AREA = startLoc?.S_AREA_CODE ?? "", // 濡傛灉涓簄ull杩斿洖绌哄瓧绗︿覆
-                S_END_AREA = endLoc?.S_AREA_CODE ?? "", // 濡傛灉涓簄ull杩斿洖绌哄瓧绗︿覆
-                S_START_LOC = from,
-                S_END_LOC = to,
-                S_TYPE = type,
-                N_PRIORITY = pri,
-                N_SCHEDULE_TYPE = 1,
-                N_B_STATE = 0,
-                S_CNTR_CODE = cnt,
-                T_START_TIME = DateTime.Now,
-                //T_END_TIME = null,
-                
-            };
-
-            var db = DbHelper.GetDbClient();
-            var log = JsonConvert.SerializeObject(TN_Task);
-            try {
-                // 鍐呴儴涓嶄娇鐢ㄤ簨鍔★紙鍙秹鍙婂崟涓彃鍏ユ搷浣滐級锛岀敱澶栭儴澹版槑浜嬪姟
-                var res = db.Insertable(TN_Task).ExecuteCommand() > 0;
-                if (res) {
-                    LogHelper.Info($"鎻掑叆浠诲姟鎴愬姛锛歿log}");
-                }
-                else {
-                    LogHelper.Info($"鎻掑叆浠诲姟澶辫触锛歿log}");
-                }
-                return res;
-            }
-            catch (Exception ex) {
-                LogHelper.InfoEx(ex);
-                return false;
-            }
-        }
-
-        /// <summary>
-        /// 鍒涘缓浠诲姟锛屽苟灏�鏄惁鍒涘缓鎴愬姛 鐨勪俊鎭�杩�<see cref="LogHelper.Info(string, string)"/> 鎵撳嵃鏃ュ織
-        /// </summary>
-        /// <param name="from">璧风偣璐т綅鍙�/param>
-        /// <param name="cnt">瀹瑰櫒鍙�/param>
-        /// <param name="to">缁堢偣璐т綅鍙�/param>
-        /// <param name="type">浠诲姟绫诲瀷/鍚嶇О</param>
-        /// <param name="pri">浼樺厛绾�/param>
-        /// <returns>鍒涘缓浠诲姟鏄惁鎴愬姛</returns>
-        public static bool LogCreateTask(string from, string cnt, string to, string type, int pri = 3) {
-            var db = DbHelper.GetDbClient();
-            using (var tran = db.Ado.UseTran()) {
-                if (TaskHelper.CreateTask(from, cnt, to, type, pri)) {
-                    LocationHelper.LockLoc(from, 2); // 璧风偣鍑哄簱閿侊紝
-                    LocationHelper.LockLoc(to, 1); // 缁堢偣鍏ュ簱閿�-                    tran.CommitTran();
-                    LogHelper.Info($"鐢熸垚 '{type}' 鎴愬姛锛屽鍣ㄥ彿 '{cnt}'锛岃捣鐐�'{from}'锛岀粓鐐�'{to}'");
-                    return true;
-                }
-                else {
-                    tran.RollbackTran();
-                    LogHelper.Info($"鐢熸垚 '{type}' 澶辫触锛屽鍣ㄥ彿 '{cnt}'锛岃捣鐐�'{from}'锛岀粓鐐�'{to}'");
-                    return false;
-                }
-            }
-        }
-
-        /// <summary>
-        /// 鍒涘缓浠诲姟锛屼娇鐢�<see cref="SimpleResult"/> 杩斿洖缁撴灉
-        /// </summary>
-        /// <param name="from">璧风偣璐т綅鍙�/param>
-        /// <param name="cnt">瀹瑰櫒鍙�/param>
-        /// <param name="to">缁堢偣璐т綅鍙�/param>
-        /// <param name="type">浠诲姟绫诲瀷/鍚嶇О</param>
-        /// <param name="pri">浼樺厛绾э紙榛樿涓�3锛�/param>
-        /// <param name="failCode">鍒涘缓澶辫触鏃惰繑鍥炵殑 result code</param>
-        /// <returns></returns>
-        public static SimpleResult SimpleCreateTask(string from, string cnt, string to, string type, int pri = 3, int failCode = 5) {
-            var db = DbHelper.GetDbClient();
-            using (var tran = db.Ado.UseTran()) {
-                if (TaskHelper.CreateTask(from, cnt, to, type, pri)) {
-                    LocationHelper.LockLoc(from, 2); // 璧风偣鍑哄簱閿侊紝
-                    LocationHelper.LockLoc(to, 1); // 缁堢偣鍏ュ簱閿�-                    return BuildSimpleResult(0, $"鐢熸垚 '{type}' 鎴愬姛锛屽鍣ㄥ彿 '{cnt}'锛岃捣鐐�'{from}'锛岀粓鐐�'{to}'");
-                }
-                else {
-                    return BuildSimpleResult(failCode, $"鐢熸垚 '{type}' 澶辫触锛屽鍣ㄥ彿 '{cnt}'锛岃捣鐐�'{from}'锛岀粓鐐�'{to}'");
-                } 
-            }
-        }
-
-        //public static SimpleResult SimpleService(string taskName) {
-        //    var db = DbHelper.GetDbClient();
-
-        //    try {
-                
-                
-        //    }
-        //    catch (Exception) {
-
-        //        throw;
-        //    }
-        //}
-
-        /// <summary>
-        /// 鍙栬揣鍗歌揣瀹屾垚锛岀紦瀛樹綅鐘舵�鏇存柊
-        /// </summary>
-        /// <param name="mst"></param>
-        /// <param name="load"></param>
-        internal static void CacheBitUpdate(TN_Task mst, bool load) {
-            var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
-            if (load) {
-                Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTR_CODE}");
-                LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTR_CODE}");
-                LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
-            }
-            else {
-                Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岀粓鐐圭粦瀹氬鍣▄mst.S_CNTR_CODE}");
-                LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岀粓鐐圭粦瀹氬鍣▄mst.S_CNTR_CODE}");
-                LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
-            }
-        }
-
-        /// <summary>
-        /// 浠诲姟鍙栨秷锛岀紦瀛樹綅鐘舵�鏇存柊
-        /// </summary>
-        /// <param name="mst"></param>
-        internal static void CacheBitCancelUpdate(TN_Task mst) {
-            //浠诲姟鍙栨秷锛屽彇璐у畬鎴愬墠鐨勶紝璧风偣鐨刲oadingCount鍜岀粓鐐箄nLoadingCount閮芥竻闄わ紝鍙栬揣瀹屾垚鐨勫彧澶勭悊缁堢偣
-            if (CheckActionRecordExist(mst.S_CODE, 4)) {
-                //鏍规嵁瀹㈡埛鐜板満瑕佹眰锛屽鏋滃彇璐у畬鎴愪换鍔″け璐ヤ汉宸ユ媺鍒扮粓鐐癸紝鎴戜滑灏卞綋鍗歌揣瀹屾垚澶勭悊锛涘鏋滄槸浜哄伐鎷夎蛋鍒板叾瀹冨尯鍩燂紝鎴戜滑灏辫В閿佺粓鐐癸紝鍒犻櫎鎵樼洏銆�-                //缁堢偣缁戝畾
-                CacheBitUpdate(mst, false);
-                LocationHelper.UnLockLoc(mst.S_END_LOC);
-            }
-            else {
-
-                //璧风偣缁堢偣瑙i攣
-                LocationHelper.UnLockLoc(mst.S_START_LOC);
-                LocationHelper.UnLockLoc(mst.S_END_LOC);
-
-            }
-
-        }
-
-        
-
-        /// <summary>
-        /// 浠诲姟鐘舵�鏇存柊澶勭悊
-        /// </summary>
-        /// <param name="mst"></param>
-        /// <param name="state"></param>
-        internal static void OperateStatus(TN_Task mst, int state) {
-            if (state == 4) 
-            {
-                CacheBitUpdate(mst, true);
-            }
-            if (state == 6)//鍗歌揣瀹屾垚
-            {
-                CacheBitUpdate(mst, false);
-            }
-            if (state == 7) {
-                CacheBitCancelUpdate(mst);
-            }
-        }
-
-        /// <summary>
-        /// 瀹夊叏璇锋眰
-        /// </summary>
-        /// <param name="no"></param>
-        /// <param name="state"></param>
-        /// <param name="forkliftNo"></param>
-        /// <param name="extData"></param>
-        internal static void OperateReq(string no, int state, string forkliftNo, string extData = "")
-        {
-            if (state == 1101)
-            {
-                //璇锋眰鍙栬揣锛�-
-            }
-            if (state == 1102)
-            {
-                //璇锋眰鍗歌揣锛�-                //鏍规嵁缁堢偣鍒ゆ柇锛屾槸cb02鐨勫叆鍙o紝鍒ゆ柇鍐呭瓨涓姸鎬侊紙瑕佺姸鎬佹椂闂达級锛屽厑璁稿嵏璐э紝閫氱煡agv鏀瑰弬鏁�-                var dic = new Dictionary<string, string>();
-                //< Req >< Order No = 'TN2302020002' ParamNo = '18' Param1 = '12' /></ Req >
-                dic.Add("No", no);
-                dic.Add("ParamNo", "8");
-                dic.Add("Param1", "1");
-                NDC.ChangeOrder(dic);
-                //鏀瑰畬鍙傛暟杞﹀瓙灏变細鑷繁鍗歌揣
-            }
-            if (state == 1103)
-            {
-                //澶ч搧妗嗗弶璧颁互鍚庨�鐭ワ紝鎴戜滑瑕侀�鐭ヨ緭閫佺嚎
-            }
-        }
-
-        private static object locLocker = new object();
-
-
-        
-
-
-        internal static bool UpdateStatus(TN_Task task, string status) {
-            var res = false;
-            var db = DbHelper.GetDbClient();
-            task.S_B_STATE = status;
-            res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
-            return res;
-        }
-
-
-        internal static bool UpdateStatus(TN_Task task) {
-            var res = false;
-            var db = DbHelper.GetDbClient();
-            task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
-            task.T_MODIFY = DateTime.Now;
-            db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand();
-            return res;
-        }
-
-        internal static bool UpdateEqNo(TN_Task task) {
-            var res = false;
-            var db = DbHelper.GetDbClient();
-            task.T_MODIFY = DateTime.Now;
-            db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand();
-            return res;
-        }
-
-        internal static TN_Task GetTask(string no) {
-            var db = DbHelper.GetDbClient();
-            var task = db.Queryable<TN_Task>().Where(a => a.S_CODE == no).First();
-            return task;
-        }
-
-        public static bool CreateTask(List<CreateTasks> modes) {
-            if (modes != null && modes.Count > 0) {
-                List<TN_Task> tN_Tasks = new List<TN_Task>();
-
-                foreach (var item in modes) {
-
-                    var fromLoc = LocationHelper.GetLocation(item.from);
-                    var endLoc = LocationHelper.GetLocation(item.to);
-
-                    tN_Tasks.Add(new TN_Task() {
-                        S_CODE = GenerateTaskNo(),
-                        S_START_AREA = fromLoc.S_AREA_CODE,
-                        S_END_AREA = endLoc.S_AREA_CODE,
-                        S_START_LOC = item.from,
-                        S_END_LOC = item.to,
-                        S_TYPE = item.taskType,
-                        N_PRIORITY = item.pri,
-                        N_SCHEDULE_TYPE = 1,
-                        N_B_STATE = 0,
-                        S_CNTR_CODE = item.cntrInfo,
-                    });
-                }
-                var log = JsonConvert.SerializeObject(tN_Tasks);
-                var db = DbHelper.GetDbClient();
-                var res = db.Insertable<TN_Task>(tN_Tasks).ExecuteCommand() > 0;
-                if (res) {
-                    LogHelper.Info($"鎻掑叆浠诲姟鎴愬姛锛寋log}");
-                }
-                else {
-                    LogHelper.Info($"鎻掑叆浠诲姟澶辫触锛寋log}");
-                }
-                return res;
-            }
-
-            return false;
-        }
-
-
-        internal static bool CheckActionRecordExist(string no, int code) {
-            var db = DbHelper.GetDbClient();
-            return db.Queryable<TN_Task_Action>().Count(a => a.S_TASK_CODE == no && a.N_ACTION_CODE == code) > 0;
-        }
-
-        internal static void Begin(TN_Task task, string forklift_no) {
-            var db = DbHelper.GetDbClient();
-            if (task != null) {
-                if (task.N_B_STATE == 1) {
-                    task.N_B_STATE = 2;
-                    task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
-                    task.T_START_TIME = System.DateTime.Now;
-                    task.S_EQ_NO = forklift_no;
-                    db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME, it.S_EQ_NO }).ExecuteCommand();
-                }
-
-            }
-        }
-
-        internal static void End(TN_Task task) {
-            var db = DbHelper.GetDbClient();
-            if (task != null) {
-                task.N_B_STATE = 3;
-                task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
-                task.T_END_TIME = DateTime.Now;
-                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_END_TIME }).ExecuteCommand();
-            }
-        }
-
-        internal static void Fail(TN_Task task) {
-            var db = DbHelper.GetDbClient();
-            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();
-            }
-        }
-
-        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData) {
-            var db = DbHelper.GetDbClient();
-            var action = new TN_Task_Action() {
-                N_ACTION_CODE = state,
-                S_TASK_CODE = no,
-                S_EQ_CODE = forkliftNo,
-                S_EQ_TYPE = "agv",
-                S_DATA = extData
-            };
-            return db.Insertable(action).ExecuteCommand() > 0;
-        }
-
-        internal static List<TN_Task> GetWaitingTaskList() {
-            var db = DbHelper.GetDbClient();
-            return db.Queryable<TN_Task>().Where(a => a.N_B_STATE == 0 && (a.S_B_STATE == "绛夊緟" || a.S_B_STATE == "寰呮帹閫�)).ToList();
-        }
-    }
-
-    public class CreateTasks {
-        public string from { set; get; }
-        public string to { set; get; }
-        public string taskType { set; get; }
-        public int pri { set; get; }
-        public string cntrInfo { set; get; }
-    }
-}
-
diff --git a/Models/BaseModel.cs b/Models/BaseModel.cs
index 54f31f6..0f17517 100644
--- a/Models/BaseModel.cs
+++ b/Models/BaseModel.cs
@@ -2,7 +2,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�妯℃澘鎶借薄绫伙細鍩烘湰琛ㄦ暟鎹ā鍨�     /// </summary>
diff --git a/Models/DebugModel.cs b/Models/DebugModel.cs
deleted file mode 100644
index 165388b..0000000
--- a/Models/DebugModel.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HH.WCS.Mobox3.DSZSH.Models {
-    public class DebugModel {
-        public class LocCntrCg {
-            public string Note { get; set; } // 浠呯敤浜庡娉�-
-            public string LocCode { get; set; }
-            public string LocArea { get; set; }
-            public string CntrCode { get; set; }
-            public string CntrType { get; set; }
-            public string ItemCode { get; set; }
-            public string BatchNo { get; set; }
-        }
-    }
-}
diff --git a/Models/TN_CAR_IN.cs b/Models/TN_CAR_IN.cs
index 9a2e55e..f299631 100644
--- a/Models/TN_CAR_IN.cs
+++ b/Models/TN_CAR_IN.cs
@@ -1,6 +1,6 @@
 锘縰sing SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�瀹瑰櫒鐢熶骇杞︽暟鍏宠仈瀛愯〃
     /// </summary>
diff --git a/Models/TN_CG_Detail.cs b/Models/TN_CG_Detail.cs
index 0868e82..047d09d 100644
--- a/Models/TN_CG_Detail.cs
+++ b/Models/TN_CG_Detail.cs
@@ -1,12 +1,12 @@
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�鐗╂枡-瀹瑰櫒 鍏崇郴琛�     /// </summary>
     [SugarTable("TN_CG_Detail")]
     public class TN_CG_Detail : BaseModel {
-        #region 鍩烘湰灞炴�
+
         /// <summary>
         /// 鏂欑鍟嗗搧鏍囪瘑
         /// </summary>
@@ -28,7 +28,7 @@
         public string S_CNTR_CODE { get; set; }
 
         /// <summary>
-        /// 璐у搧鐘舵�锛�鍚堟牸 1寰呮 2涓嶅悎鏍�3姝e湪妫�獙锛涗笅绾垮嵆寰呮
+        /// 璐у搧鐘舵�锛�鍚堟牸 1寰呮 2涓嶅悎鏍�3鎶芥涓紱涓嬬嚎鍗冲緟妫�         /// </summary>
         public string S_ITEM_STATE { get; set; } = "寰呮";
 
@@ -51,10 +51,9 @@
         /// 鐗╂枡瑙勬牸
         /// </summary>
         public string S_ITEM_SPEC { get; set; } = string.Empty;
-        #endregion
 
+        // -------------------------------
 
-        #region 鎷撳睍
         /// <summary>
         /// 鎵ц鏍囧噯
         /// </summary>
@@ -74,6 +73,5 @@
         ///// 浜х嚎鍙�         ///// </summary>
         //public int N_PRODUCT_LINE { get; set; } = 0; // NOTE 鍚庣画MES鍙兘浼氭彁渚涳紝鍏堝垱寤�
-        #endregion
     }
 }
diff --git a/Models/TN_Check_Detail.cs b/Models/TN_Check_Detail.cs
index 8347a17..5ebb61f 100644
--- a/Models/TN_Check_Detail.cs
+++ b/Models/TN_Check_Detail.cs
@@ -6,7 +6,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 鎶芥鍗曟槑缁�     /// </summary>
diff --git a/Models/TN_Check_Order.cs b/Models/TN_Check_Order.cs
index 52529c2..ff0936b 100644
--- a/Models/TN_Check_Order.cs
+++ b/Models/TN_Check_Order.cs
@@ -6,7 +6,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 鎶芥鍗�     /// </summary>
diff --git a/Models/TN_Container.cs b/Models/TN_Container.cs
index e2a5f07..8805c0a 100644
--- a/Models/TN_Container.cs
+++ b/Models/TN_Container.cs
@@ -2,7 +2,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�瀹瑰櫒琛�     /// </summary>
diff --git a/Models/TN_Container_Item.cs b/Models/TN_Container_Item.cs
index def46ad..9870889 100644
--- a/Models/TN_Container_Item.cs
+++ b/Models/TN_Container_Item.cs
@@ -6,7 +6,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 瀹瑰櫒-鐗╂枡绫诲瀷 鍏崇郴琛�     /// </summary>
diff --git a/Models/TN_Inbound_Order.cs b/Models/TN_Inbound_Order.cs
index b1db2c2..a5dadaf 100644
--- a/Models/TN_Inbound_Order.cs
+++ b/Models/TN_Inbound_Order.cs
@@ -4,7 +4,7 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 鍑哄簱鍗�     /// </summary>
diff --git a/Models/TN_Loc_Container.cs b/Models/TN_Loc_Container.cs
index 94902d0..1ab382f 100644
--- a/Models/TN_Loc_Container.cs
+++ b/Models/TN_Loc_Container.cs
@@ -2,7 +2,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�璐т綅-瀹瑰櫒 鍏崇郴琛�     /// </summary>
diff --git a/Models/TN_Location.cs b/Models/TN_Location.cs
index f0a2b87..8c42873 100644
--- a/Models/TN_Location.cs
+++ b/Models/TN_Location.cs
@@ -2,7 +2,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�璐т綅琛�     /// </summary>
diff --git a/Models/TN_Order_Task.cs b/Models/TN_Order_Task.cs
index 9bbb09b..58e79b9 100644
--- a/Models/TN_Order_Task.cs
+++ b/Models/TN_Order_Task.cs
@@ -4,7 +4,7 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     public class TN_Order_Task {
 
     }
diff --git a/Models/TN_Outbound_Detail.cs b/Models/TN_Outbound_Detail.cs
index c678465..a2a1b21 100644
--- a/Models/TN_Outbound_Detail.cs
+++ b/Models/TN_Outbound_Detail.cs
@@ -1,6 +1,6 @@
 锘縰sing SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 鍑哄簱鍗曟槑缁�     /// </summary>
@@ -12,7 +12,7 @@
         public string S_OO_NO { get; set; }
 
         /// <summary>
-        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// 涓氬姟鐘舵�锛�寰呮墽琛�1宸蹭笅鍙�2鎵ц涓�3宸插畬鎴�         /// </summary>
         public int N_B_STATE { get; set; } = 1; // 鍒涘缓鍗虫墽琛� 
diff --git a/Models/TN_Outbound_Order.cs b/Models/TN_Outbound_Order.cs
index 00d394d..175fd0d 100644
--- a/Models/TN_Outbound_Order.cs
+++ b/Models/TN_Outbound_Order.cs
@@ -2,7 +2,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 鍑哄簱鍗�     /// </summary>
@@ -14,9 +14,9 @@
         public string S_NO { get; set; }
 
         /// <summary>
-        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// 涓氬姟鐘舵�锛�寰呮墽琛�1宸蹭笅鍙�2鎵ц涓�3宸插畬鎴�         /// </summary>
-        public int N_B_STATE { get; set; } = 1; // 鍒涘缓鍗虫墽琛�+        public int N_B_STATE { get; set; } = 1;
 
         /// <summary>
         /// 鐗╂枡鍙�diff --git a/Models/TN_Shift_Detail.cs b/Models/TN_Shift_Detail.cs
index ada808f..66c6ee2 100644
--- a/Models/TN_Shift_Detail.cs
+++ b/Models/TN_Shift_Detail.cs
@@ -5,7 +5,7 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 绉诲簱鍗曟槑缁�     /// </summary>
diff --git a/Models/TN_Shift_Order.cs b/Models/TN_Shift_Order.cs
index 0756b86..2a80962 100644
--- a/Models/TN_Shift_Order.cs
+++ b/Models/TN_Shift_Order.cs
@@ -4,7 +4,7 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 绉诲簱鍗�     /// </summary>
diff --git a/Models/TN_Task.cs b/Models/TN_Task.cs
index 25d04b1..7f2ed19 100644
--- a/Models/TN_Task.cs
+++ b/Models/TN_Task.cs
@@ -2,7 +2,7 @@
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�浠诲姟琛�     /// </summary>
diff --git a/Models/TN_Task_Action.cs b/Models/TN_Task_Action.cs
index e0bf19a..f617f62 100644
--- a/Models/TN_Task_Action.cs
+++ b/Models/TN_Task_Action.cs
@@ -1,6 +1,6 @@
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 銆愭鏋躲�浠诲姟鍔ㄤ綔琛�     /// </summary>
diff --git a/Models/TN_WorkOrder.cs b/Models/TN_WorkOrder.cs
index 0e37764..735abd8 100644
--- a/Models/TN_WorkOrder.cs
+++ b/Models/TN_WorkOrder.cs
@@ -1,6 +1,6 @@
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Models {
+namespace HH.WCS.Mobox3.DSZSH.models {
     /// <summary>
     /// 鐢熶骇宸ュ崟
     /// </summary>
diff --git a/Program.cs b/Program.cs
index d201d83..5f4e00f 100644
--- a/Program.cs
+++ b/Program.cs
@@ -1,17 +1,15 @@
 锘縰sing System;
 using System.Collections.Generic;
 using System.Threading;
-
-using HH.WCS.Mobox3.DSZSH.AppStart;
 using HH.WCS.Mobox3.DSZSH.device;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.ServiceCore;
+using HH.WCS.Mobox3.DSZSH.core;
 
 using Microsoft.Owin.Hosting;
 
 using Topshelf;
 
 using Task = System.Threading.Tasks.Task;
+using Monitor = HH.WCS.Mobox3.DSZSH.core.Monitor;
 
 namespace HH.WCS.Mobox3.DSZSH {
     internal class Program
@@ -26,7 +24,7 @@
             // 3.0 寮�惎S7
             StartS7();
             // 4.0 寮�惎Modbus
-            //StartModbus();
+            StartModbus();
 
             // 5.0 寮�惎绾跨▼
             var rc = HostFactory.Run(x => {
@@ -54,7 +52,7 @@
             Console.WriteLine("Startup ApiController");
             Task.Run(() =>
             {
-                var url = AppStart.Settings.Config.WebApiUrl; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
+                var url = Settings.WebApiUrl; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
                 Console.WriteLine(url);
                 using (WebApp.Start<Startup>(url))
                 {
@@ -69,8 +67,8 @@
         /// </summary>
         private static void StartTcp()
         {
-            var tcpServerIP = AppStart.Settings.Config.TcpServerIp; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
-            var tcpServerPort = AppStart.Settings.Config.TcpServerPort; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
+            var tcpServerIP = Settings.TcpServerIp; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
+            var tcpServerPort = Settings.TcpServerPort; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
             new TcpServer(tcpServerIP, tcpServerPort);
 
         }
@@ -91,18 +89,6 @@
             //        Console.WriteLine("S7ProductionLineHelper," + item.ProductionLine_IP);
             //    }
             //}
-
-            ////绉伴噸鐨凷7璁惧
-            //var weightPLCDevice = Settings.WeightDevices;
-
-            //if (weightPLCDevice.Count > 0)
-            //{
-            //    foreach (var item in weightPLCDevice)
-            //    {
-            //        new S7Helper(item.WeightDevice_IP, (short)item.WeightDevice_Rack, (short)item.WeightDevice_Slot);
-            //        Console.WriteLine("S7WeightDeviceHelper," + item.WeightDevice_Name);
-            //    }
-            //}
         }
 
         /// <summary>
@@ -111,7 +97,7 @@
         private static void StartModbus()
         {
             // 鎵�湁鐨凪odbus璁惧
-            var allPLCDevice = AppStart.Settings.Config.ProductionLines; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
+            var allPLCDevice = Settings.ProductionLines; // 杩愯鏃朵慨鏀�config.json 鏃犳晥
             
             if (allPLCDevice.Count > 0) {
                 foreach (var item in allPLCDevice) {
@@ -128,13 +114,13 @@
                 List<Task> tasks = new List<Task>();
 
                 // 杞锛氬嚭搴撳崟鐘舵�
-                tasks.Add(GetTask(OutboundCore.CheckOrderState));
+                tasks.Add(GetTask(Monitor.CheckOutboundOrder));
 
                 // 杞锛氭娊妫�崟鐘舵�
-                tasks.Add(GetTask(CheckCore.CheckOrderState));
+                tasks.Add(GetTask(Monitor.CheckCheckOrder));
 
                 // 杞锛氱Щ搴撳崟鐘舵�
-                tasks.Add(GetTask(ShiftCore.CheckOrderState));
+                tasks.Add(GetTask(Monitor.CheckShiftOrder));
 
                 Task.WaitAll(tasks.ToArray());
             }
diff --git a/ServiceCore/CheckCore.cs b/ServiceCore/CheckCore.cs
deleted file mode 100644
index eae3ca4..0000000
--- a/ServiceCore/CheckCore.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-锘縰sing System;
-
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
-    public class CheckCore {
-        public static void CheckOrderState() {
-
-            var db = DbHelper.GetDbClient();
-            try {
-                var order = db.Queryable<TN_Check_Detail>()
-                    .Where(c => c.N_B_STATE == SpotStateCode.宸叉墽琛屽緟鐢熸垚浠诲姟)
-                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc).First();
-
-                if (order == null) {
-                    LogHelper.Info("杞--鎶芥--鏆傛棤寰呮墽琛岀殑Order");
-                    return;
-                }
-
-                var detailList = db.Queryable<TN_Check_Detail>()
-                    .Where(d => d.S_NO == order.S_NO && d.N_B_STATE == SpotStateCode.宸叉墽琛屽緟鐢熸垚浠诲姟).ToList();
-
-                if (detailList.Count == 0) {
-                    order.N_B_STATE = SpotStateCode.浠诲姟鎵ц涓�
-                    db.Updateable<TN_Check_Order>(order).UpdateColumns(it => it.N_B_STATE).ExecuteCommand();
-                    return;
-                }
-
-                foreach (var detail in detailList) {
-
-                    var endLoc = db.Queryable<TN_Location>()
-                        .Where(l => l.S_AREA_CODE == detail.S_END_AREA)
-                        .Where(ExprHelper.LocIsFree)
-                        .Where(ExprHelper.LocIsEmpty).First();
-
-                    if (endLoc == null) {
-                        LogHelper.Info("杞--鎶芥锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛�);
-                        continue;
-                    }
-
-                    using (var tran = db.Ado.UseTran()) {
-                        detail.N_B_STATE = SpotStateCode.浠诲姟鎵ц涓�
-                        if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            LogHelper.Info($"杞--鎶芥锛氫慨鏀规娊妫�崟鏄庣粏琛ㄧ姸鎬佷负瀹屾垚--澶辫触锛�);
-                        }
-
-                        if (TaskHelper.LogCreateTask(detail.S_LOC_CODE, detail.S_CNTR_CODE,
-                            endLoc.S_CODE, TaskName.鎶芥_鍑哄簱)) {
-                            tran.CommitTran();
-                        }
-                        else {
-                            tran.RollbackTran();
-                        }
-                    }
-                }
-            }
-            catch (Exception ex) {
-                LogHelper.InfoEx(ex);
-            }
-        }
-
-        public static void UpdateTaskState(int spotStateCode) {
-
-            var db = DbHelper.GetDbClient();
-
-            var detail = db.Queryable<TN_Check_Detail>()
-                .First(d => d.N_B_STATE == SpotStateCode.浠诲姟鎵ц涓�;
-
-            if (detail == null) {
-                LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒");
-                return;
-            }
-
-            using (var tran = db.Ado.UseTran()) {
-                detail.N_B_STATE = spotStateCode;
-                if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                    tran.RollbackTran();
-                    LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
-                    return;
-                }
-
-                var finishedCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
-                var allCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO);
-
-                LogHelper.Info($"鎶芥--AGV浠诲姟瀹屾垚锛氱粺璁′换鍔″凡瀹屾垚锛歿finishedCount} / {allCount}");
-
-                if (finishedCount == allCount) { // 褰撳墠order涓嬬殑detail锛屼换鍔¢兘宸茬粡瀹屾垚
-
-                    if (db.Updateable<TN_Check_Order>().SetColumns(it => it.N_B_STATE == SpotStateCode.浠诲姟鎵ц瀹屾垚)
-                        .Where(it => it.S_NO == detail.S_NO)
-                        .ExecuteCommand() <= 0) {
-
-                        tran.RollbackTran();
-                        LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
-                        return;
-                    }
-                }
-
-                tran.CommitTran();
-            }
-        }
-
-    }
-}
diff --git a/ServiceCore/OfflineCore.cs b/ServiceCore/OfflineCore.cs
deleted file mode 100644
index 9fda54e..0000000
--- a/ServiceCore/OfflineCore.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-锘縰sing System;
-
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
-    /// <summary>
-    /// 瀹氭椂杞浠诲姟锛氭墭鐩樹笅绾夸换鍔℃牳蹇�-    /// </summary>
-    public class OfflineCore
-    {
-        /// <summary>
-        /// 鑾峰彇杈撻�绾垮彂閫佺殑鎴愬搧鑳朵笅绾胯姹�-        /// </summary>
-        /// <remarks>
-        /// 娴佺▼涓�鎴愬搧鑳朵笅绾�br/>
-        /// 4)	AMS鏀跺埌璇锋眰锛岀敓鎴愭垚鍝佷笅绾挎寚浠わ紝骞跺皢鎸囦护鍙戦�鍒癢MS绯荤粺
-        /// </remarks>
-        public static void CheckPlcOfflineRequest() {
-            try {
-                foreach (var prodLineInfo in AppStart.Settings.Config.ProductionLines) {
-                    var db = DbHelper.GetDbClient();
-
-                    // TODO 绛夊緟杈撻�绾垮崗璁畬鎴愬悗鍐嶈ˉ鍏呭叿浣撻�杈�-
-                    // 鍒ゆ柇杈撻�绾垮綋鍓嶆槸鍚︽湁涓嬬嚎淇″彿
-                    var readFlag = ModbusHelper.ReadHoldingRegisters(15, 1, prodLineInfo.PlcIp, prodLineInfo.PlcPort);
-                    if (readFlag[0] == 0) {
-
-                        continue;
-                    }
-
-                    // 璇诲彇杈撻�绾夸笅绾胯姹備俊鎭�-                    var cgId = ModbusHelper.ReadHoldingRegistersToString(20, 20, prodLineInfo.PlcIp, prodLineInfo.PlcPort);
-                    var cntrId = ModbusHelper.ReadHoldingRegistersToString(40, 20, prodLineInfo.PlcIp, prodLineInfo.PlcPort);
-
-                    var cgDetail = db.Queryable<TN_CG_Detail>()
-                        .Where(cd => cd.S_ITEM_CODE == cgId && cd.S_CNTR_CODE == cntrId).First();
-
-
-                    // 缁戝畾 鐗╂枡淇℃伅 鍜�瀹瑰櫒淇℃伅
-                    cgDetail = new TN_CG_Detail {
-                        S_ITEM_CODE = cgId,
-                        S_CNTR_CODE = cntrId,
-                    };
-
-                    if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() > 0) {
-                        LogHelper.Info($"缁戝畾鐗╂枡 '{cgId}' 涓庡鍣�'{cntrId}' 鎴愬姛");
-                    }
-                    else {
-                        LogHelper.Info($"缁戝畾鐗╂枡 '{cgId}' 涓庡鍣�'{cntrId}' 澶辫触");
-                    }
-                }
-            }
-            catch (Exception ex) {
-                LogHelper.InfoEx(ex);
-            }
-        }
-
-        /// <summary>
-        /// 杞鎵樼洏鍏ュ簱浠诲姟骞舵墽琛�-        /// </summary>
-        public static void CheckInboundTask() {
-            //var db = DbHelper.GetDbClient();
-            
-            //var inboundOrder = db.Queryable<TN_Inbound_Order>()
-            //    .Where(i => i.S_B_STATE == "绛夊緟鎵ц").First();
-
-            //TaskHelper.LogCreateTask()
-            
-        }
-
-        
-    }
-}
-
diff --git a/ServiceCore/OutboundCore.cs b/ServiceCore/OutboundCore.cs
deleted file mode 100644
index 488821a..0000000
--- a/ServiceCore/OutboundCore.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-锘縰sing System;
-
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-using Newtonsoft.Json;
-
-namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
-    public class OutboundCore {
-        public static void CheckOrderState() {
-            var db = DbHelper.GetDbClient();
-            try {
-                var order = db.Queryable<TN_Outbound_Order>()
-                    .Where(c => c.N_B_STATE == SpotStateCode.宸叉墽琛屽緟鐢熸垚浠诲姟) 
-                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc).First();
-
-                if (order == null) {
-                    LogHelper.Info("杞--鍑哄簱--鏆傛棤寰呮墽琛岀殑Order");
-                    return;
-                }
-
-                var lastDetail = db.Queryable<TN_Outbound_Detail>()
-                    .First(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == SpotStateCode.浠诲姟鎵ц涓�;
-
-                if (lastDetail != null) {
-                    LogHelper.Info($"杞--鍑哄簱--涓婁竴涓换鍔′粛鍦ㄨ繘琛屼腑锛� + JsonConvert.SerializeObject(lastDetail));
-                    return;
-                }
-
-                var detail = db.Queryable<TN_Outbound_Detail>()
-                    .Where(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == SpotStateCode.宸叉墽琛屽緟鐢熸垚浠诲姟)
-                    .OrderBy(d => d.T_CREATE, SqlSugar.OrderByType.Asc).First();
-
-                if (detail == null) {
-                    //order.N_B_STATE = SpotStateCode.浠诲姟鎵ц涓�
-
-                    LogHelper.Info($"杞--鍑哄簱--褰撳墠Order '{order.S_NO}' 鏆傛棤寰呮墽琛岀殑浠诲姟");
-                    return;
-                }
-
-                var startLocCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(c => c.S_CNTR_CODE == detail.S_CNTR_CODE)
-                    .First();
-
-                if (startLocCntrRel == null) {
-                    LogHelper.Info($"杞--鍑哄簱锛氭病鏈夋壘鍒板悎閫傜殑璧风偣璐т綅锛�);
-                    return;
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(l => l.S_AREA_CODE == detail.S_END_AREA)
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    LogHelper.Info($"杞--鍑哄簱锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛丼_NO涓�'{detail.S_OO_NO}'锛岃姹侫rea涓�'{detail.S_END_AREA}'");
-                    return;
-                }
-
-                using (var tran = db.Ado.UseTran()) {
-                    detail.N_B_STATE = SpotStateCode.浠诲姟鎵ц涓�
-                    if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        LogHelper.Info($"杞--鍑哄簱--淇敼鏄庣粏琛ㄧ姸鎬佷负瀹屾垚澶辫触锛�);
-                    }
-
-                    if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE,
-                        endLoc.S_CODE, TaskName.鎴愬搧鑳跺嚭搴�) {
-                        tran.RollbackTran();
-                    }
-
-                    tran.CommitTran();
-                }
-            }
-            catch (Exception ex) {
-                LogHelper.InfoEx(ex);
-            }
-        }
-
-        public static void UpdateTaskState(int spotStateCode) {
-            
-            var db = DbHelper.GetDbClient();
-
-            var detail = db.Queryable<TN_Outbound_Detail>()
-                .First(d => d.N_B_STATE == SpotStateCode.浠诲姟鎵ц涓�;
-
-            if (detail == null) {
-                LogHelper.Info("鍑哄簱--AGV鍙栬揣--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒");
-                return;
-            }
-
-            using (var tran = db.Ado.UseTran()) {
-                detail.N_B_STATE = spotStateCode;
-                if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                    tran.RollbackTran();
-                    LogHelper.Info("鍑哄簱--AGV鍙栬揣锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
-                    return;
-                }
-
-                var finishedCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO && d.N_B_STATE == 3);
-                var allCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO);
-
-                LogHelper.Info($"鍑哄簱--AGV鍙栬揣--缁熻浠诲姟宸插畬鎴愶細{finishedCount} / {allCount}");
-
-                if (finishedCount == allCount) { // 褰撳墠鍑哄簱鍗曚笅鐨勬墍鏈夋槑缁嗗崟锛屼换鍔¢兘宸茬粡瀹屾垚
-
-                    if (db.Updateable<TN_Outbound_Order>().SetColumns(it => it.N_B_STATE == SpotStateCode.浠诲姟鎵ц瀹屾垚)
-                        .Where(it => it.S_NO == detail.S_OO_NO)
-                        .ExecuteCommand() <= 0) {
-
-                        tran.RollbackTran();
-                        LogHelper.Info("鍑哄簱--AGV鍙栬揣--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
-                        return;
-                    }
-                }
-
-                tran.CommitTran();
-            }
-        }
-
-    }
-}
diff --git a/ServiceCore/ShiftCore.cs b/ServiceCore/ShiftCore.cs
deleted file mode 100644
index c8d47ec..0000000
--- a/ServiceCore/ShiftCore.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
-    /// <summary>
-    /// 绉诲簱涓氬姟鏍稿績
-    /// </summary>
-    internal class ShiftCore {
-        public static void CheckOrderState() {
-            var db = DbHelper.GetDbClient();
-
-            // 鐩墠鎸夊嚭搴撶殑閫昏緫锛氶�涓Щ搴�-            try {
-                var order = db.Queryable<TN_Shift_Order>()
-                    .Where(c => c.N_B_STATE == SpotStateCode.宸叉墽琛屽緟鐢熸垚浠诲姟)
-                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc).First();
-
-                if (order == null) {
-                    LogHelper.Info("杞--绉诲簱--鏆傛棤寰呮墽琛岀殑Order");
-                    return;
-                }
-
-                if (db.Queryable<TN_Shift_Detail>()
-                    .First(d => d.S_NO == order.S_NO && d.N_B_STATE == SpotStateCode.浠诲姟鎵ц涓� != null) {
-                    LogHelper.Debug("杞--绉诲簱--涓婁竴涓换鍔′粛鍦ㄨ繘琛屼腑");
-                    return;
-                }
-
-                var detail = db.Queryable<TN_Shift_Detail>()
-                    .Where(d => d.S_NO == order.S_NO && d.N_B_STATE == SpotStateCode.宸叉墽琛屽緟鐢熸垚浠诲姟)
-                    .OrderBy(d => d.T_CREATE, SqlSugar.OrderByType.Asc).First();
-
-                if (detail == null) {
-                    //order.N_B_STATE = SpotStateCode.浠诲姟鎵ц涓�
-
-                    LogHelper.Info("杞--绉诲簱--鏆傛棤寰呮墽琛岀殑浠诲姟");
-                    return;
-                }
-
-                var startLocCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(c => c.S_CNTR_CODE == detail.S_CNTR_CODE)
-                    .First();
-
-                if (startLocCntrRel == null) {
-                    LogHelper.Info("杞--绉诲簱锛氭病鏈夋壘鍒板悎閫傜殑璧风偣璐т綅锛�);
-                    return;
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(l => l.S_AREA_CODE == detail.S_END_AREA)
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    LogHelper.Info("杞--鍑哄簱锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛�);
-                    return;
-                }
-
-                using (var tran = db.Ado.UseTran()) {
-                    detail.N_B_STATE = SpotStateCode.浠诲姟鎵ц涓�
-                    if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        LogHelper.Info($"杞--鍑哄簱锛氫慨鏀规槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触锛�);
-                    }
-
-                    if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE,
-                        endLoc.S_CODE, TaskName.鎴愬搧鑳跺嚭搴�) {
-                        tran.RollbackTran();
-                    }
-
-                    tran.CommitTran();
-                }
-            }
-            catch (Exception ex) {
-                LogHelper.InfoEx(ex);
-            }
-        }
-
-        public static void UpdateTaskState(int spotStateCode) {
-
-            var db = DbHelper.GetDbClient();
-
-            var detail = db.Queryable<TN_Shift_Detail>()
-                .First(d => d.N_B_STATE == SpotStateCode.浠诲姟鎵ц涓�;
-
-            if (detail == null) {
-                LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒");
-                return;
-            }
-
-            using (var tran = db.Ado.UseTran()) {
-                detail.N_B_STATE = spotStateCode;
-                if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
-                    tran.RollbackTran();
-                    LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
-                    return;
-                }
-
-                var finishedCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
-                var allCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO);
-
-                LogHelper.Info($"绉诲簱--AGV浠诲姟瀹屾垚锛氱粺璁′换鍔″凡瀹屾垚锛歿finishedCount} / {allCount}");
-
-                if (finishedCount == allCount) { // 褰撳墠order涓嬬殑detail锛屼换鍔¢兘宸茬粡瀹屾垚
-
-                    if (db.Updateable<TN_Shift_Order>().SetColumns(it => it.N_B_STATE == SpotStateCode.浠诲姟鎵ц瀹屾垚)
-                        .Where(it => it.S_NO == detail.S_NO)
-                        .ExecuteCommand() <= 0) {
-
-                        tran.RollbackTran();
-                        LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
-                        return;
-                    }
-                }
-
-                tran.CommitTran();
-            }
-        }
-    }
-}
diff --git a/ServiceCore/TaskCore.cs b/ServiceCore/TaskCore.cs
deleted file mode 100644
index d3d0f92..0000000
--- a/ServiceCore/TaskCore.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-锘縰sing System.Collections.Generic;
-
-using HH.WCS.Mobox3.DSZSH.Dispatch;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-using Newtonsoft.Json;
-
-namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
-    internal class TaskCore {
-        /// <summary>
-        /// 浠诲姟鍒嗗彂锛屾牴鎹皟搴︾被鍨嬪彂缁欎笉鍚岀殑璋冨害绯荤粺
-        /// </summary>
-        internal static void Dispatch() {
-            // 鏌ヨ浠诲姟
-            // 鑾峰彇鎵�湁绛夊緟鐨勪换鍔�-            var list = TaskHelper.GetWaitingTaskList();
-            LogHelper.Info("绛夊緟浠诲姟淇℃伅" + JsonConvert.SerializeObject(list), "API");
-            if (list.Count > 0) {
-                list.ForEach(task => {
-                    // 浣跨敤鑷畾涔変换鍔℃帹閫�-                    SendTask(task); // 璋冨害NDC鎴栨澀濂ユ垨鍥借嚜璁惧
-                    //TaskProcess.SendGZTask(task); // 璋冨害鍥借嚜璁惧
-                });
-            }
-            else {
-                LogHelper.Info("鏆傛棤浠诲姟");
-            }
-        }
-
-        /// <summary>
-        /// 鎺ㄩ�浠诲姟
-        /// </summary>
-        /// <param name="mst"></param>
-        internal static bool SendTask(TN_Task mst) {
-            var result = false;
-            var start = "0"; var end = "0";
-            var taskType = mst.S_TYPE.Trim();
-            if (mst.N_B_STATE == 0) {
-                if (mst.N_SCHEDULE_TYPE == 1)//閫氳繃NDC锛宧osttoagv璋冨害璁惧
-                {
-                    start = LocationHelper.GetAgvSite(mst.S_START_LOC);
-                    end = LocationHelper.GetAgvSite(mst.S_END_LOC);
-
-                    if (mst.S_TYPE == "绌烘墭涓嬬嚎鍫嗗彔") {
-                        end = LocationHelper.GetAgvSite(mst.S_END_LOC, true);
-                    }
-
-                    LogHelper.Info($"NDC鎺ㄩ�浠诲姟 {mst.S_CODE};" + "start=" + start + "end= " + end);
-                    var startLoc = LocationHelper.GetLoc(mst.S_START_LOC);
-                    var endLoc = LocationHelper.GetLoc(mst.S_END_LOC);
-                    var dic = new List<param>();
-                    dic.Add(new param() { name = "IKey", value = "IKey" });
-                    dic.Add(new param() { name = "From", value = start.ToString() });
-                    dic.Add(new param() { name = "To", value = end.ToString() });
-                    dic.Add(new param() { name = "FUNC", value = startLoc.N_LAYER.ToString() });
-
-                    dic.Add(new param() { name = "Ctype", value = "0" });
-
-
-                    if (mst.S_TYPE == "浣欐枡涓嬬嚎鍏ュ簱" || mst.S_TYPE == "浜哄伐鎷嗙洏鍏ュ簱") {
-                        dic.Add(new param() { name = "DATA", value = "1024" });
-                    }
-                    else {
-                        dic.Add(new param() { name = "DATA", value = "0" });
-                    }
-
-                    var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//娣诲姞鏂板懡浠�-                    if (res != null && (res.err_code == 0 || res.err_code == 50009)) {
-                        //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
-                        mst.N_B_STATE = 1;
-                        mst.S_B_STATE = TN_Task.GetStateStr(1);
-                        TaskHelper.UpdateStatus(mst);//鏇存柊浠诲姟鐘舵�
-                        result = true;
-                        LogHelper.Info($"NDC鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
-                    }
-                    else {
-                        LogHelper.Info($"NDC鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
-                    }
-                }
-                else if (mst.N_SCHEDULE_TYPE == 5)//閫氳繃鏉ゥ璋冨害璁惧 
-                {
-                    //璋冪涓夋柟鎺ュ彛
-                    var model = new HanAo.TaskInfoModel {
-                        requestPk = mst.S_CODE,
-                        frmPos = mst.S_START_LOC,
-                        toPos = mst.S_END_LOC,
-                        trkType = mst.S_OP_NAME == "鍏ュ簱" ? "1" : "2",
-                        contNo = mst.S_CNTR_CODE
-                    };
-                    if (HanAo.CreateOrder(model)) {
-                        mst.N_B_STATE = 1;
-                        TaskHelper.UpdateStatus(mst);
-                        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + model.frmPos + "end= " + model.toPos);
-                    }
-                    else {
-                        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(model));
-                    }
-                }
-                else if (mst.N_SCHEDULE_TYPE == 3) //閫氳繃鍥借嚜璋冨害璁惧
-                {
-                    var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p");
-                    if (code > 0) {
-                        //鏇存柊浠诲姟鐘舵�
-                        mst.N_B_STATE = 1;
-                        mst.S_EQ_TASK_CODE = code.ToString();
-                        TaskHelper.UpdateStatus(mst);
-                        TaskHelper.UpdateEqNo(mst);
-                        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + mst.S_START_LOC + "end= " + mst.S_END_LOC);
-                    }
-                    else {
-                        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(mst));
-                    }
-                }
-
-            }
-            return result;
-        }
-    }
-}
diff --git a/Services/AgvService.cs b/Services/AgvService.cs
deleted file mode 100644
index 126abe7..0000000
--- a/Services/AgvService.cs
+++ /dev/null
@@ -1,159 +0,0 @@
-锘縰sing System;
-using System.Threading.Tasks;
-
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Devices;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-using HH.WCS.Mobox3.DSZSH.ServiceCore;
-
-using Newtonsoft.Json;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
-
-namespace HH.WCS.Mobox3.DSZSH.Services {
-    public class AgvService {
-        public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) {
-            var result = new ReturnResult();
-            try {
-                switch (model.state) {
-                    case 1023:
-                        break;
-                    case 1025:
-                        break;
-                    case 1012:
-                        break;
-                    case 1004:
-                        break;
-                    case 1103:
-                        break;
-                    default:
-                        // AGV 鎵ц浠诲姟鐨勯�杈戝鐞�-                        if (!AgvTaskProcessOk(model)) {
-                            // 鎵ц涓峅K锛岃鏄庢病鏈夋壘鍒颁换鍔�-                            result.ResultCode = 1;
-                            result.ResultMsg = $"鏍规嵁Model.No鏈壘鍒板搴旂殑浠诲姟锛寋model.task_no}";
-                            LogHelper.Info(result.ResultMsg, "API");
-                            return result;
-                        }
-                        break;
-                }
-
-                result.ResultCode = 0;
-                result.ResultMsg = "success";
-                LogHelper.Info(result.ResultMsg, "API");
-                return result;
-            }
-            catch (Exception ex) {
-                result.ResultCode = -1;
-                result.ResultMsg = $"鍙戠敓浜嗗紓甯革細+{ex.Message}";
-                LogHelper.Info(result.ResultMsg, "Error");
-                return result;
-            }
-
-        }
-
-        /// <summary>
-        /// 鎵ц AGV 浠诲姟锛屾煡璇笉鍒颁换鍔¤繑鍥�<see langword="false"/>
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        private static bool AgvTaskProcessOk(AgvTaskState model) {
-            var TN_Task = TaskHelper.GetTask(model.task_no); // 鏍规嵁褰撳墠model缂栧彿鏌ヨ浠诲姟
-            if (TN_Task == null) { return false; }
-
-            if (model.state > 7) {
-                //瀹夊叏璇锋眰绛�-                TaskHelper.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
-                return true;
-            }
-
-            // AGV 浠诲姟 134562(7) 鐘舵�澶勭悊
-            switch (model.state) {
-                case AgvStateCode.鎵ц:
-                    TaskHelper.Begin(TN_Task, model.forklift_no); // 宸叉帹閫佺殑浠诲姟鐨勭姸鎬佹敼鎴愭墽琛�-                    break;
-                case AgvStateCode.寮�鍙栬揣:
-                    TaskHelper.UpdateStatus(TN_Task, "寮�鍙栬揣"); // 浠诲姟鐘舵�鏀规垚寮�鍙栬揣
-                    break;
-                case AgvStateCode.鍙栬揣瀹屾垚:
-                    TaskHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚"); // 浠诲姟鐘舵�鏀规垚鍙栬揣瀹屾垚
-                    TaskHelper.OperateStatus(TN_Task, 4); // 璧风偣瀹瑰櫒璐т綅瑙g粦,瑙i攣璧风偣
-
-                    if (TN_Task.S_TYPE == TaskName.鎴愬搧鑳跺嚭搴� {
-                        var nextOutboundTask = Task.Run(() => {
-                            OutboundCore.UpdateTaskState(SpotStateCode.浠诲姟鎵ц瀹屾垚);
-                        });
-                    }
-
-                    break;
-                case AgvStateCode.寮�鍗歌揣:
-                    TaskHelper.UpdateStatus(TN_Task, "寮�鍗歌揣"); // 浠诲姟鐘舵�鏀规垚寮�鍗歌揣
-                    break;
-                case AgvStateCode.鍗歌揣瀹屾垚:
-                    TaskHelper.UpdateStatus(TN_Task, "鍗歌揣瀹屾垚"); // 浠诲姟鐘舵�鏀规垚鍗歌揣瀹屾垚
-                    TaskHelper.OperateStatus(TN_Task, 6); // 缁堢偣瀹瑰櫒璐т綅缁戝畾,瑙i攣缁堢偣
-                    break;
-                case AgvStateCode.瀹屾垚:
-                    TaskHelper.End(TN_Task); // 浠诲姟鐘舵�鏀规垚缁撴潫
-
-                    if (TN_Task.S_TYPE == TaskName.鎶芥_鍑哄簱) {
-                        var checkCompleteTask = Task.Run(() => {
-                            CheckCore.UpdateTaskState(SpotStateCode.浠诲姟鎵ц瀹屾垚);
-                        });
-                    }
-
-                    break;
-                case AgvStateCode.寮傚父:
-                    TaskHelper.OperateStatus(TN_Task, 7); // 寮傚父澶勭悊
-                    TaskHelper.Fail(TN_Task); // 浠诲姟鐘舵�鏀规垚閿欒
-                    break;
-            }
-
-            // 灏咥GV鎵ц鐘舵�锛屽姞鍏N_Task_Action琛ㄤ腑
-            TaskHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data);
-            //璋冪敤绗笁鏂规帴鍙o紙濡傛灉鏈夛級TaskProcess.ReportStatus锛屾坊鍔犱换鍔″姩浣滃叧绯昏〃
-
-            return true;
-        }
-    
-        public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
-            var gzResult = new ReturnResult();
-            var db = DbHelper.GetDbClient();
-            ModbusHelper.Relink();
-
-            try {
-                
-
-                var prodLineInfo = AppStart.Settings.Config.ProductionLines[0];
-                var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort);
-                if (!prodLineDevice.LoadDeviceStateOk()) {
-                    LogHelper.Info("鍔犺浇璁惧淇℃伅澶辫触");
-                }
-
-                var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.task_no);
-                if (tn_task == null) {
-                    LogHelper.Info($"浠诲姟鍙�'{model.task_no}' 涓嶅瓨鍦�);
-                }
-
-                // 寰呬慨鏀癸細琛ュ厖涓嶅悓鍒嗘敮AGV鍒ゆ柇
-                if (prodLineDevice.SystemState == 1) {
-                    if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱) {
-                        prodLineDevice.AgvPicking = 1;
-                    }
-                    if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_绌烘墭涓婄嚎) {
-                        prodLineDevice.AgvPlacingPallet = 1;
-                    }
-                }
-
-                LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented));
-                return gzResult;
-            }
-            catch (Exception ex) {
-                LogHelper.Info($"鍙戠敓浜嗗紓甯革細{ex.Message}");
-                return gzResult;
-            }
-        }
-    }
-}
diff --git a/Services/DebugService.cs b/Services/DebugService.cs
deleted file mode 100644
index 8537315..0000000
--- a/Services/DebugService.cs
+++ /dev/null
@@ -1,235 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-
-using CsvHelper;
-using CsvHelper.Configuration;
-
-using HH.WCS.Mobox3.DSZSH.Helper;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-using Newtonsoft.Json;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.DebugRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.DebugResponse;
-using static HH.WCS.Mobox3.DSZSH.Models.DebugModel;
-
-namespace HH.WCS.Mobox3.DSZSH.Services {
-    public class DebugService {
-
-        /// <summary>
-        /// 妯℃嫙 AGV 澶氭鍥炴姤浠诲姟鐘舵�
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static ReturnResults AgvSeriesReports(UpdateTaskState model) {
-            var returnResults = new ReturnResults();
-            returnResults.ResultList = new List<ReturnResult>();
-
-            //if (!AgvHelper.IsTaskState(model.NextState)) {
-            //    return returnResults;
-            //}
-
-            var agvCurrentState = 1; // 濡傛灉娌℃湁鎵惧埌鏈�柊鐨�TaskAction锛岄粯璁ゅ綋鍓嶇姸鎬佷负 1(鎵ц)  
-
-            // 鏌ヨ TaskAction 琛ㄤ腑涓庡綋鍓嶄换鍔″彿鍖归厤鐨勬渶鏂拌褰�-            var db = DbHelper.GetDbClient();
-            var taskAction = db.Queryable<TN_Task_Action>()
-                .Where(a => a.S_TASK_CODE == model.TaskID)
-                .OrderBy(a => a.T_CREATE, SqlSugar.OrderByType.Desc).First();
-
-            if (taskAction != null) {
-                // 濡傛灉鏈夊尮閰嶏紝灏嗗綋鍓嶄换鍔$姸鎬佽缃负琛ㄥ崟涓殑鏈�柊鐘舵�
-                agvCurrentState = taskAction.N_ACTION_CODE;
-            }
-
-            if (!AgvHelper.IsNextStateOk(agvCurrentState, model.NextState)) {
-                LogHelper.Info($"Debug: AGV 鐘舵� '{model.NextState}' 涓嶆槸 '{agvCurrentState}' 鐨�鍚堟硶涓嬩竴鐘舵�");
-                return returnResults;
-            }
-
-            var agvTaskState = new AgvTaskState() {
-                task_no = model.TaskID,
-                forklift_no = model.ForkliftNo,
-            };
-
-            var result = new ReturnResult();
-
-            // 褰撳墠鐘舵�娌℃湁杈惧埌鏈�粓鐘舵�鏃讹紝寰幆鍔犲叆杩斿洖鍒楄〃
-            while (agvCurrentState != model.NextState) {
-                agvTaskState.state = agvCurrentState;
-                result = AgvService.OperateAgvTaskStatus(agvTaskState);
-                returnResults.ResultList.Add(result);
-                agvCurrentState = AgvHelper.GetNextState(agvCurrentState);
-            }
-
-            // 灏嗗惊鐜病鏈夊埌杈剧殑鏈�粓鐘舵�锛屼篃鍔犲叆杩斿洖鍒楄〃
-            agvTaskState.state = model.NextState;
-            result = AgvService.OperateAgvTaskStatus(agvTaskState);
-            returnResults.ResultList.Add(result);
-
-            return returnResults;
-        }
-
-        /// <summary>
-        /// 鍒濆鏁版嵁搴撳缓绔�-        /// </summary>
-        /// <returns></returns>
-        public static string CreateDatabase(bool cover = false) {
-            try {
-                var db = DbHelper.GetDbClient();
-
-                var entityTypes = new Type[] { 
-                    //typeof(TN_CAR_IN),
-                    //typeof(TN_CG_Detail),
-                    //typeof(TN_Container),
-                    //typeof(TN_Loc_Container),
-                    //typeof(TN_Location),
-                    //typeof(TN_Task),
-                    //typeof(TN_Task_Action),
-                    //typeof(SysHelper.OI_SYS_MAXID),
-
-                    //typeof(TN_Inbound_Order),
-                    typeof(TN_Check_Detail),
-                    //typeof(TN_Check_Order),
-                    //typeof(TN_CNTR_ITEM),
-                    //typeof(TN_Outbound_Detail),
-                    //typeof(TN_Outbound_Order),
-                    //typeof(TN_Shift_Order),
-                    //typeof(TN_Shift_Detail)
-                };
-
-                using (var tran = db.Ado.UseTran()) {
-                    if (cover) {
-                        // 鍒犻櫎鎵�湁琛紙鎸変緷璧栧叧绯诲�搴忥級
-                        //var tables = db.DbMaintenance.GetTableInfoList();
-                        //foreach (var table in tables.OrderByDescending(t => t.Name)) {
-                        //    db.DbMaintenance.DropTable(table.Name);
-                        //}
-
-                        // 鍒涘缓鏂拌〃
-                        db.CodeFirst.InitTables(entityTypes);
-
-                        //db.CodeFirst.BackupTable().InitTables(entityTypes);
-                    }
-                    else {
-                        db.CodeFirst.InitTables(entityTypes);
-                    }
-
-                    tran.CommitTran();
-                }
-
-            }
-            catch (Exception ex) {
-                LogHelper.Info($"鍙戠敓浜嗗紓甯�);
-                return "鍒濆鍖栨暟鎹簱閿欒" + ex.Message;
-            }
-
-            return "鎴愬姛";
-        }
-
-        public static string InsertLocCntrCg() {
-            string filePath = PathHelper.GetProjDir("./debug/loc_cntr_cg.csv");
-            var db = DbHelper.GetDbClient();
-
-            try {
-                var configuration = new CsvConfiguration(CultureInfo.InvariantCulture) {
-                    // 閰嶇疆閫夐」
-                    Delimiter = ",",               // 鍒嗛殧绗�-                    HasHeaderRecord = true,        // 鏈夋爣棰樿
-                    MissingFieldFound = null,      // 蹇界暐缂哄け瀛楁
-                    HeaderValidated = null,        // 璺宠繃鏍囬楠岃瘉
-                    BadDataFound = context => { }  // 澶勭悊閿欒鏁版嵁
-                };
-
-                var locCntrCgList = new List<LocCntrCg>();
-
-                using (var reader = new StreamReader(filePath))
-                using (var csv = new CsvReader(reader, configuration)) {
-                    // 璇诲彇璁板綍
-                    locCntrCgList = csv.GetRecords<LocCntrCg>().ToList();
-                }
-
-                using (var tran = db.UseTran()) {
-                    foreach (var locCntrCg in locCntrCgList) {
-                        LogHelper.Info("LogCntrCg锛� + JsonConvert.SerializeObject(locCntrCg));
-                        if (string.IsNullOrEmpty(locCntrCg.LocCode)) break;
-
-                        var loc = db.Queryable<TN_Location>().First(a => a.S_CODE == locCntrCg.LocCode);
-                        if (loc == null) {
-                            var newLoc = new TN_Location {
-                                S_CODE = locCntrCg.LocCode,
-                                S_AREA_CODE = locCntrCg.LocArea ?? ""
-                            };
-
-                            if (db.Insertable<TN_Location>(newLoc).ExecuteCommand() <= 0) {
-                                tran.RollbackTran();
-                                LogHelper.Info($"鎻掑叆浣嶇疆{locCntrCg.LocCode}澶辫触");
-                                return "鎻掑叆澶辫触";
-                            }
-
-                            loc = newLoc;
-                        }
-
-                        if (string.IsNullOrEmpty(locCntrCg.CntrCode)) {
-                            LogHelper.Info("瀹瑰櫒鍙蜂负绌猴紝涓嶅啀璇诲彇鍚庨潰鐨勬暟鎹�);
-                            continue;
-                        }
-
-                        var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == locCntrCg.LocCode
-                            && a.S_CNTR_CODE == locCntrCg.CntrCode);
-
-                        if (locCntrRel == null) {
-                            var newLocCntrRel = new TN_Loc_Container {
-                                S_LOC_CODE = locCntrCg.LocCode,
-                                S_CNTR_CODE = locCntrCg.CntrCode,
-                                S_CNTR_TYPE = locCntrCg.CntrType ?? ""
-                            };
-
-                            loc.N_CURRENT_NUM = 1;
-
-                            if (db.Insertable<TN_Loc_Container>(newLocCntrRel).ExecuteCommand() <= 0
-                                && db.Updateable<TN_Location>(loc).UpdateColumns(c => c.N_CURRENT_NUM).ExecuteCommand() <= 0) {
-                                tran.RollbackTran();
-                                LogHelper.Info($"鎻掑叆浣嶇疆鎵樼洏鍏崇郴{locCntrCg.LocCode}-{locCntrCg.CntrCode}澶辫触");
-                                return "鎻掑叆澶辫触";
-                            }
-                        }
-
-                        if (string.IsNullOrEmpty(locCntrCg.ItemCode)) {
-                            LogHelper.Info("鐗╂枡鍙蜂负绌猴紝涓嶅啀璇诲彇鍚庨潰鐨勬暟鎹�);
-                            continue;
-                        }
-
-                        var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == locCntrCg.CntrCode
-                            && a.S_ITEM_CODE == locCntrCg.ItemCode);
-                        if (cgDetail == null) {
-                            var locList = new List<TN_CG_Detail>();
-                            locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_ITEM_CODE = locCntrCg.ItemCode, S_BATCH_NO = locCntrCg.BatchNo ?? "" });
-                            if (db.Insertable<TN_CG_Detail>(locList).ExecuteCommand() <= 0) {
-                                tran.RollbackTran();
-                                LogHelper.Info($"鎻掑叆鎵樼洏鐗╂枡鍏崇郴{locCntrCg.CntrCode}-{locCntrCg}澶辫触");
-                                return "鎻掑叆澶辫触";
-                            }
-                        }
-                    }
-                    tran.CommitTran();
-                }
-
-                return "鎻掑叆鏁版嵁鎴愬姛";
-                
-            }
-            catch (FileNotFoundException) {
-                return $"Error: File not found - {filePath}";
-            }
-            catch (Exception ex) {
-                return $"Error reading CSV file: {ex.Message}";
-            }
-        }
-    }
-}
diff --git a/Services/MoboxService.cs b/Services/MoboxService.cs
deleted file mode 100644
index 1e82ed8..0000000
--- a/Services/MoboxService.cs
+++ /dev/null
@@ -1,884 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Dispatch;
-using HH.WCS.Mobox3.DSZSH.Helper;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-using Newtonsoft.Json;
-
-using SqlSugar;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
-
-namespace HH.WCS.Mobox3.DSZSH.Services {
-    public class MoboxService {
-
-        #region PDA 鍔熻兘
-        /// <summary>
-        /// 濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult GoodpackOffline(GoodpackOfflineInfo model) {
-            var taskName = TaskName.濂借繍绠盻婊$涓嬬嚎鍏ュ簱; // 鐢ㄤ簬鐢熸垚浠诲姟绫诲瀷銆佹墦鍗版棩蹇椾俊鎭�-
-            var db = DbHelper.GetDbClient();
-
-            try {
-                // 灏哖DA鎻愪緵鐨勭墿鏂欑紪鐮佷笌璐存爣鏈虹殑淇℃伅姣斿
-                var cgDetail = db.Queryable<TN_CG_Detail>()
-                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo) // 鎸囧畾锛氱墿鏂欑紪鐮併�鎵规鍙�-                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮") // NOTE 鍐椾綑妫�煡锛氱墿鏂欑姸鎬佸簲璇ヤ负 1寰呮
-                    .First();
-
-                if (cgDetail == null) {
-                    return BuildSimpleResult(2, $"PDA鎵爜鐗╂枡淇℃伅涓庤创鏍囨満浼犻�鐨勪俊鎭笉涓�嚧锛� + JsonConvert.SerializeObject(model));
-                }
-
-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.StartLoc)) // 鎸囧畾锛氳捣鐐硅揣浣�-                    .Where(ExprHelper.LocIsFree)
-                    //.Where(ExprHelper.LocIsEmpty)
-                    .First();
-
-                if (startLoc == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
-                }
-
-                // 缁戝畾璐т綅鍜屽鍣ㄥ彿
-                var locCntrRel = new TN_Loc_Container {
-                    S_LOC_CODE = model.StartLoc,
-                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
-                    S_CNTR_TYPE = "濂借繍绠�,
-                };
-
-                if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
-                    return BuildSimpleResult(4, $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴澶辫触锛� + JsonConvert.SerializeObject(locCntrRel));
-                }
-
-                // TODO 婊$鍏ュ簱绠楁硶寰呬紭鍖�-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocBelongsToArea(AreaName.婊$瀛樻斁鍖�)
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty)
-                    .OrderBy(l => l.N_LAYER)
-                    .OrderBy(l => l.S_AREA_CODE).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(5, "婊$鍏ュ簱鏆傛椂娌℃湁鍚堥�鐨勮揣浣嶅彲浠ュ叆搴�);
-                }
-
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName, failCode: 6);
-            }
-            catch (Exception ex) {
-                return BuildSimpleResult(1, $"鍙戠敓浜嗗紓甯革細{ex.Message}");
-            }
-        }
-
-        ///// <summary>
-        ///// 绌烘墭鐩樼粦瀹�PDA)
-        ///// </summary>
-        ///// <param name="model"></param>
-        ///// <returns></returns>
-        //public static SimpleResult EmptyBindPallet(EmptyBindInfo model) {
-        //    var db = DbHelper.GetDbClient();
-
-        //    try {
-        //        var loc = db.Queryable<TN_Location>()
-        //            .Where(ExprHelper.LocCode(model.LocCode))
-        //            .Where(ExprHelper.LocBelongsToArea(AreaName.绌烘墭鐩樻帴椹冲尯))
-        //            .Where(ExprHelper.LocIsFree)
-        //            .Where(ExprHelper.LocIsEmpty).First();
-
-        //        if (loc == null) {
-        //            return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
-        //        }
-
-        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
-        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
-
-        //        if (locCntrRel != null) {
-        //            return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
-        //        }
-
-        //        //loc.N_CURRENT_NUM = model.PalletCount;
-
-        //        locCntrRel = new TN_Loc_Container {
-        //            S_LOC_CODE = model.LocCode,
-        //            S_CNTR_CODE = model.CntrCode
-        //        };
-
-        //        using (var tran = db.Ado.UseTran()) {
-        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
-        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
-        //                tran.CommitTran();
-        //                return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
-        //            }
-        //            else {
-        //                tran.RollbackTran();
-        //                return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
-        //            }
-        //        }
-        //    }
-        //    catch (Exception ex) {
-        //        return BuildSimpleEx(ex);
-        //    }
-        //}
-
-        ///// <summary>
-        ///// 绌虹缁戝畾(PDA)
-        ///// </summary>
-        ///// <param name="model"></param>
-        ///// <returns></returns>
-        //public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) {
-        //    var db = DbHelper.GetDbClient();
-
-        //    try {
-        //        var loc = db.Queryable<TN_Location>()
-        //            .Where(ExprHelper.LocCode(model.LocCode))
-        //            .Where(ExprHelper.LocBelongsToArea(AreaName.绌虹鎺ラ┏鍖�)
-        //            .Where(ExprHelper.LocIsFree)
-        //            .Where(ExprHelper.LocIsEmpty).First();
-
-        //        if (loc == null) {
-        //            return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
-        //        }
-
-        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
-        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
-
-        //        if (locCntrRel != null) {
-        //            return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
-        //        }
-
-        //        loc.N_CURRENT_NUM = 1; // 绌虹缁戝畾鏃跺鍣ㄦ暟蹇呯劧涓�1
-
-        //        locCntrRel = new TN_Loc_Container {
-        //            S_LOC_CODE = model.LocCode,
-        //            S_CNTR_CODE = model.CntrCode
-        //        };
-
-        //        using (var tran = db.Ado.UseTran()) {
-        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
-        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
-        //                tran.CommitTran();
-        //                return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
-        //            }
-        //            else {
-        //                tran.RollbackTran();
-        //                return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
-        //            }
-        //        }
-        //    }
-        //    catch (Exception ex) {
-        //        return BuildSimpleEx(ex);
-        //    }
-        //}
-
-        /// <summary>
-        /// 鎵樼洏-绌烘墭鍏ュ簱(PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult EmptyInboundPallet(EmptyInboundInfo model) {
-            var taskName = TaskName.鎵樼洏_绌烘墭鍏ュ簱;
-            var db = DbHelper.GetDbClient();
-
-            try {
-
-
-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.StartLoc))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty.Negate())
-                    .First();
-
-                if (startLoc == null) {
-                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
-                }
-
-                // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�-                var locCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
-                    .First();
-
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
-                }
-
-                // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocBelongsToArea(AreaName.绌烘墭瀛樻斁鍖�)
-                    .OrderBy(l => l.N_LAYER)
-                    .OrderBy(l => l.S_AREA_CODE).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(4, $"鏆傛椂娌℃湁绗﹀悎鏉′欢鐨勭粓鐐规斁璐т綅");
-                }
-
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        /// <summary>
-        /// 濂借繍绠�绌虹鍏ュ簱(PDA)
-        /// </summary>
-        /// <returns></returns>
-        public static SimpleResult EmptyInboundGoodpack(EmptyInboundInfo model) {
-            var taskName = TaskName.濂借繍绠盻绌虹鍏ュ簱;
-            var db = DbHelper.GetDbClient();
-
-            try {
-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.StartLoc))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
-
-                if (startLoc == null) {
-                    return BuildSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
-                }
-
-                // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�-                var locCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
-                    .First();
-
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
-                }
-
-                // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocBelongsToArea(AreaName.绌虹瀛樻斁鍖�)
-                    .OrderBy(l => l.N_LAYER)
-                    .OrderBy(l => l.S_AREA_CODE).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(4, $"鏆傛椂娌℃湁绗﹀悎鏉′欢鐨勭粓鐐规斁璐т綅");
-                }
-
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        /// <summary>
-        /// 鎵樼洏-绌烘墭涓婄嚎(PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult EmptyOnlinePallet(EmptyOnlinePalletInfo model) {
-            var taskName = TaskName.鎵樼洏_绌烘墭涓婄嚎;
-            var db = DbHelper.GetDbClient();
-            var taskInfo = AppStart.Settings.TaskMap[taskName];
-
-            try {
-                // TODO 绗﹀悎鐗╂枡淇℃伅鐨勮揣浣�-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
-
-                if (startLoc == null) {
-                    return BuildSimpleResult(2, $"娌℃湁鍚堥�鐨勮捣鐐逛綅缃�);
-                }
-
-                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
-                    a => a.S_LOC_CODE == startLoc.S_CODE
-                    && a.S_CNTR_CODE == model.CntId);
-
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{startLoc.S_CODE}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocBelongsToArea(AreaName.鍖呰鍖�)
-                    .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
-                }
-
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        /// <summary>
-        /// 濂借繍绠�绌虹涓婄嚎(PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult EmptyOnlineGoodpack(EmptyOnlineGoodpackInfo model) {
-            var taskName = TaskName.濂借繍绠盻绌虹涓婄嚎;
-            var db = DbHelper.GetDbClient();
-            var taskInfo = AppStart.Settings.TaskMap[taskName];
-
-            try {
-                // TODO 绗﹀悎鐗╂枡淇℃伅鐨勮揣浣�-                var startLoc = db.Queryable<TN_Location>()
-                    .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
-
-                if (startLoc == null) {
-                    return BuildSimpleResult(2, $"娌℃湁鍚堥�鐨勮捣鐐逛綅缃�);
-                }
-
-                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
-                    a => a.S_LOC_CODE == startLoc.S_CODE
-                    && a.S_CNTR_CODE == model.CntId);
-
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{startLoc.S_CODE}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocBelongsToArea(AreaName.鍖呰鍖�)
-                    .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
-                }
-
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        /// <summary>
-        /// 鍒涘缓鎶芥鍗�-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
-            var db = DbHelper.GetDbClient();
-            try {
-                var orderNo = GenerateOrderNo("鎶芥鍗曞彿", "CN");
-
-                // 缁戝畾鎿嶄綔锛氭彃鍏ュ嚭搴撳崟銆佹墍鏈夌殑鍑哄簱鍗曟槑缁�-                using (var tran = db.Ado.UseTran()) {
-
-                    var order = new TN_Check_Order {
-                        S_NO = orderNo,
-                        S_ITEM_CODE = model.ItemCode,
-                        //S_ITEM_NAME = model.ItemName,
-                        S_BATCH_NO = model.BatchNo,
-                        N_COUNT = model.Qty,
-                        S_END_AREA = model.EndArea,
-                    };
-
-                    if (db.Insertable<TN_Check_Order>(order).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(2, "鐢熸垚 鎶芥鍗�澶辫触锛� + JsonConvert.SerializeObject(order));
-                    }
-
-                    var cgDetailList = SelectCgByTotalQty(model);
-
-                    if (cgDetailList.Count == 0) {
-                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ユ娊妫�);
-                    }
-
-                    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,
-                            S_END_AREA = model.EndArea,
-                        };
-
-                        cgDetail.N_ITEM_STATE = 3;
-                        cgDetail.S_ITEM_STATE = "姝e湪妫�獙";
-
-                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0
-                            && db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
-                        }
-                        
-                        LogHelper.Debug("鍒涘缓鍑哄簱鍗曟槑缁嗘垚鍔燂細" + JsonConvert.SerializeObject(detail));
-                    }
-                    
-                    tran.CommitTran();
-                }
-                return BuildSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-        /// <summary>
-        /// 鎶芥-鍚堟牸鍥炲簱(PDA)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult QualifiedBack(QualifiedBackInfo model) {
-            var db = DbHelper.GetDbClient();
-
-            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 BuildSimpleResult(2, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡锛� + JsonConvert.SerializeObject(model));
-                }
-
-                cgDetail.N_ITEM_STATE = 0;
-                cgDetail.S_ITEM_STATE = "鍚堟牸";
-
-                var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container>
-                    ((l, c) => l.S_CODE == c.S_LOC_CODE)
-                    .Where((l, c) => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE) // 鎸囧畾瀹瑰櫒鍙�-                    .Where(ExprHelper.LocIsFree) // NOTE 妫�煡
-                    .Select((l, c) => c) // 绛涢� Loc_Container
-                    .First();
-
-                if (startLocCntrRel == null) {
-                    return BuildSimpleResult(0, "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�);
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocBelongsToArea(startLocCntrRel.S_CNTR_TYPE == "鎵樼洏" ? AreaName.婊℃墭瀛樻斁鍖�:
-                        startLocCntrRel.S_CNTR_TYPE == "濂借繍绠� ? AreaName.婊$瀛樻斁鍖�: ""))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅");
-                }
-
-                using (var tran = db.Ado.UseTran()) {
-                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => 
-                        new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(4, "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触");
-                    }
-                    
-                    if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE, 
-                        endLoc.S_CODE, TaskName.鎶芥_鍚堟牸鍥炲簱)) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(5, "鍒涘缓浠诲姟澶辫触", false);
-                    }
-
-                    tran.CommitTran();
-                }
-                return BuildSimpleResult(0, "鐗╂枡鍚堟牸鍥炲簱浠诲姟鍒涘缓鎴愬姛");
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-        public static SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
-            var db = DbHelper.GetDbClient();
-            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 BuildSimpleResult(2, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡");
-                }
-
-                cgDetail.N_ITEM_STATE = 2;
-                cgDetail.S_ITEM_STATE = "涓嶅悎鏍�;
-
-                var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container>
-                    ((l, c) => l.S_CODE == c.S_LOC_CODE)
-                    .Where(ExprHelper.LocIsFree)
-                    .Select((l, c) => c)
-                    .First();
-
-                if (startLocCntrRel == null) {
-                    return BuildSimpleResult(0, "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�);
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(l => l.S_AREA_CODE == model.EndArea)
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅");
-                }
-
-                using (var tran = db.Ado.UseTran()) {
-                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
-                        new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(4, "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触");
-                    }
-
-                    if (!TaskHelper.LogCreateTask(startLocCntrRel.S_LOC_CODE, startLocCntrRel.S_CNTR_CODE,
-                        endLoc.S_CODE, TaskName.鎶芥_涓嶅悎鏍肩Щ搴�) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(5, "鍒涘缓浠诲姟澶辫触", false);
-                    }
-
-                    tran.CommitTran();
-                }
-                return BuildSimpleResult(0, "鐗╂枡涓嶅悎鏍肩Щ搴撲换鍔″垱寤烘垚鍔�);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        public static SimpleResult RestBack(RestBackInfo model) {
-            var db = DbHelper.GetDbClient();
-
-            try {
-                var locCntrRel = db.Queryable<TN_Loc_Container>()
-                    .Where(c => c.S_LOC_CODE == model.StartLoc)
-                    .First();
-
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(2, $"璧风偣璐т綅 {model.StartLoc}");
-                }
-
-                var endLoc = db.Queryable<TN_Location, TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
-                    .Where((l, c) => c.S_CNTR_TYPE == locCntrRel.S_CNTR_TYPE)
-                    .First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(3, $"涓嶅瓨鍦ㄥ悎閫傜殑缁堢偣璐т綅鍙互鍥炲簱");
-                }
-
-                return TaskHelper.SimpleCreateTask(locCntrRel.S_LOC_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, TaskName.灏剧鍥炲簱);
-            }
-            catch (Exception ex) {
-
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        public static List<TN_CG_Detail> SelectCgByTotalQty(CreateCheckOrderInfo model) {
-            var db = DbHelper.GetDbClient();
-            var result = new List<TN_CG_Detail>();
-            var targetNum = model.Qty;
-
-            try {
-                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
-                && a.N_ITEM_NUM > targetNum).
-                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
-                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�-                {
-                    result.Add(targetCg);
-                    return result;
-                }
-
-                var sortedMaterials = new List<TN_CG_Detail>();
-
-                sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
-                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
-                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
-                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
-                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
-                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
-
-                if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�-                {
-                    return result;
-                }
-
-                int countNum = 0;
-                foreach (var mat in sortedMaterials) {
-                    countNum += mat.N_ITEM_NUM;
-                    result.Add(mat);
-                    if (countNum >= targetNum) {
-                        break;
-                    }
-                }
-                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
-                    return result;
-                }
-                else {
-                    result.Clear();
-                    return result;
-                }
-            }
-            catch (Exception ex) {
-                throw ex;
-            }
-        }
-
-        #endregion
-
-        #region Mobox 鍔熻兘
-        /// <summary>
-        /// 鎴愬搧鑳跺嚭搴�WMS)
-        /// </summary>
-        /// <remarks>
-        /// WMS鎻愪緵鍑哄簱鐨勭墿鏂欑被鍨嬩笌鏁伴噺锛岃皟鐢ㄦ帴鍙g敱WCS鐢熸垚鍏蜂綋鐨勫嚭搴撲换鍔★紝鐒跺悗WCS鍚庡彴杞澶勭悊
-        /// </remarks>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
-            var db = DbHelper.GetDbClient();
-            var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON");
-
-            try {
-                if (string.IsNullOrEmpty(orderNo)) {
-                    return BuildSimpleResult(2, "鍑哄簱鍗曞彿涓嶈兘涓虹┖");
-                }
-
-                using (var tran = db.Ado.UseTran()) {
-
-                    var cgDetailList = SelectCgByTotalQty(model);
-
-                    if (cgDetailList.Count == 0) {
-                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
-                    }
-
-                    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 = model.EndArea
-                        };
-
-                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
-                        }
-                    }
-
-                    var order = new TN_Outbound_Order {
-                        S_NO = orderNo,
-                        S_ITEM_CODE = model.ItemCode,
-                        S_BATCH = model.BatchNo,
-                        N_END_NUM = model.Qty,                        
-                        //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
-                        S_END_AREA = model.EndArea
-                    };
-
-                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
-                    }
-
-                    tran.CommitTran();
-                }
-
-                return BuildSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }   
-
-        /// <summary>
-        /// 鎴愬搧鑳跺己鍒跺嚭搴�WMS)
-        /// </summary>
-        /// <returns></returns>
-        public static SimpleResult FinishedOutboundForce(FinishedOutboundInfo model) {
-            var db = DbHelper.GetDbClient();
-            var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON");
-
-            try {
-                if (string.IsNullOrEmpty(orderNo)) {
-                    return BuildSimpleResult(2, "鍑哄簱鍗曞彿涓嶈兘涓虹┖");
-                }
-
-                using (var tran = db.Ado.UseTran()) {
-
-                    var cgDetailList = SelectCgByTotalQty(model);
-
-                    if (cgDetailList.Count == 0) {
-                        return BuildSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
-                    }
-
-                    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,
-                            S_END_AREA = model.EndArea
-                        };
-
-                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
-                        }
-                    }
-
-                    var order = new TN_Outbound_Order {
-                        S_NO = orderNo,
-                        S_ITEM_CODE = model.ItemCode,
-                        S_BATCH = model.BatchNo,
-                        N_END_NUM = model.Qty,
-                        //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
-                        S_END_AREA = model.EndArea
-                    };
-
-                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
-                    }
-
-                    tran.CommitTran();
-                }
-
-                return BuildSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        public static List<TN_CG_Detail> SelectCgByTotalQty(FinishedOutboundInfo model) {
-            var db = DbHelper.GetDbClient();
-            var result = new List<TN_CG_Detail>();
-            var targetNum = model.Qty;
-
-            try {
-                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
-                && a.N_ITEM_NUM > targetNum).
-                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
-                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�-                {
-                    result.Add(targetCg);
-                    return result;
-                }
-
-                // NOTE 鏍规嵁鎬婚噺閫塪etail鏃讹紝鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵
-
-                var sortedMaterials = new List<TN_CG_Detail>();
-
-                if (model.ForcedOut) {
-                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
-                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
-                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
-                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸"
-                             || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
-                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
-                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
-                }
-                else {
-                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
-                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
-                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
-                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
-                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
-                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
-                }
-                
-
-                if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�-                {
-                    return result;
-                }
-
-                int countNum = 0;
-                foreach (var mat in sortedMaterials) {
-                    countNum += mat.N_ITEM_NUM;
-                    result.Add(mat);
-                    if (countNum >= targetNum) {
-                        break;
-                    }
-                }
-                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
-                    return result;
-                }
-                else {
-                    result.Clear();
-                    return result;
-                }
-            }
-            catch (Exception ex) {
-                throw ex;
-            }
-        }
-
-        /// <summary>
-        /// 绉诲簱-鍒涘缓绉诲簱浠诲姟(WMS)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static SimpleResult CreateShiftOrder(CreateShiftOrderInfo model) {
-            var db = DbHelper.GetDbClient();
-            try {
-                var locCntrRelList = db.Queryable<TN_Loc_Container, TN_CG_Detail>((c, d) => c.S_CNTR_CODE == d.S_CNTR_CODE)
-                    .Where((c, d) => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.ItemCode)
-                    .ToList();
-
-                if (locCntrRelList.Count == 0) {
-                    return BuildSimpleResult(2, "娌℃湁鎵惧埌寰呯Щ搴撶殑鐗╂枡");
-                }
-
-                // 缁戝畾鎿嶄綔锛氭彃鍏ュ嚭搴撳崟銆佹墍鏈夌殑鍑哄簱鍗曟槑缁�-                using (var tran = db.Ado.UseTran()) {
-
-                    var order = new TN_Shift_Order {
-                        S_NO = GenerateOrderNo("绉诲簱鍗曞彿", "SN"),
-                        S_ITEM_CODE = model.ItemCode,
-                        //S_ITEM_NAME = model.ItemName,
-                        S_BATCH_NO = model.BatchNo,
-                        N_COUNT = locCntrRelList.Count,
-                        S_END_AREA = model.EndArea,
-                    };
-
-                    if (db.Insertable<TN_Shift_Order>(order).ExecuteCommand() <= 0) {
-                        tran.RollbackTran();
-                        return BuildSimpleResult(2, "鐢熸垚 绉诲簱鍗�澶辫触锛� + JsonConvert.SerializeObject(order));
-                    }
-
-                    foreach (var locCntrRel in locCntrRelList) {
-                        var detail = new TN_Shift_Detail {
-                            S_NO = order.S_NO,
-                            S_ITEM_CODE = model.ItemCode,
-                            S_LOC_CODE = locCntrRel.S_LOC_CODE,
-                            S_CNTR_CODE = locCntrRel.S_CNTR_CODE,
-                            S_BATCH_NO = model.BatchNo,
-                            S_END_AREA = model.EndArea
-                        };
-
-                        if (db.Insertable<TN_Shift_Detail>(detail).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return BuildSimpleResult(3, "鐢熸垚 绉诲簱鍗曟槑缁�澶辫触锛� + JsonConvert.SerializeObject(detail));
-                        }
-                    }
-
-                    tran.CommitTran();
-                }
-                return BuildSimpleResult(0, $"鍒涘缓 绉诲簱鍗�鎴愬姛");
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-
-        private static string GenerateOrderNo(string snType, string prefix) {
-            var id = SysHelper.GetSerialNumber(snType, prefix);
-            var date = DateTime.Now.ToString("yyMMdd");
-            return $"ON{date}{id.ToString().PadLeft(4, '0')}";
-        }
-
-        #endregion
-
-    }
-}
diff --git a/Services/WmsService.cs b/Services/WmsService.cs
deleted file mode 100644
index 6118018..0000000
--- a/Services/WmsService.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-using HH.WCS.Mobox3.DSZSH.AppStart;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-
-using Newtonsoft.Json;
-
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.WmsRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.WmsResponse;
-
-namespace HH.WCS.Mobox3.DSZSH.Services {
-    public class WmsService {
-        /// <summary>
-        /// 鍗氬疄鐗╂枡淇℃伅涓嬪彂鍚屾
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public static WmsResult CgInfoSync(CgInfoSyncInfo model) {
-            var db = DbHelper.GetDbClient();
-            var random = new Random();
-
-			try {
-                var detail = new TN_CG_Detail {
-                    S_ITEM_CODE = model.ItemCode,
-                    S_ITEM_NAME = model.ItemName,
-                    S_CNTR_CODE = Guid.NewGuid().ToString("D"), // NOTE 瀹瑰櫒鍙凤細鐩墠闅忔満锛堝悗鏈熷彲鑳戒細鎸囧畾锛屾垨鑰匬DA缁戝畾鏃跺啀濉叆锛�-                    S_BATCH_NO = model.BatchNo,
-                    S_STANDARD = model.Standard,
-                    S_NET_WEIGHT = model.NetWeight,
-                    S_QUALITY_GRADE = model.QualityGrade,
-                    //N_PRODUCT_LINE = random.Next(0, 3), // NOTE 浜х嚎鍙凤細鐩墠闅忔満锛堝悗鏈熷彲鑳戒細鎸囧畾锛屾垨鑰匬DA缁戝畾鏃跺啀濉叆锛�-                };
-
-                // 璐т綅瀹瑰櫒缁戝畾鐨勯�杈戯紝鍦ㄥソ杩愮涓嬬嚎PDA鐨勬祦绋嬩腑鎿嶄綔
-
-                //var locCntrRel = new TN_Loc_Container {
-                //    //S_LOC_CODE = Settings.Config.ProductionLines[detail.N_PRODUCT_LINE].OffLoc[0], // 濂借繍绠辩殑浣嶇疆鏄搷浣滃尯锛屼笉鏄骇绾�-                //    S_CNTR_CODE = detail.S_CNTR_CODE,
-                //    S_CNTR_TYPE = "濂借繍绠�, // 璐存爣鏈哄彧閽堝濂借繍绠�-                //};
-
-                //using (var tran = db.Ado.UseTran()) {
-                //    if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0
-                //        && db.Insertable<TN_Loc_Container>(detail).ExecuteCommand() <= 0) {
-                //        tran.RollbackTran();
-                //        return MesResultBuilder(2, "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail));
-                //    }
-                //    tran.CommitTran();
-                //}
-
-                if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0) {
-                    return MesResultBuilder(2, "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail));
-                }
-
-                return MesResultBuilder(0, "鎻掑叆鐗╂枡淇℃伅鎴愬姛");
-			}
-			catch (Exception ex) {
-                return MesResultBuilder(1, ex.Message);
-			}
-        }
-    }
-}
diff --git a/Controllers/AgvController.cs b/api/AgvController.cs
similarity index 75%
rename from Controllers/AgvController.cs
rename to api/AgvController.cs
index fd80ca8..3966bd6 100644
--- a/Controllers/AgvController.cs
+++ b/api/AgvController.cs
@@ -1,13 +1,13 @@
 锘縰sing System.Web.Http;
 
-using HH.WCS.Mobox3.DSZSH.Services;
+using HH.WCS.Mobox3.DSZSH.core;
 
 using Newtonsoft.Json;
 
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.AgvRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.AgvResponse;
+using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
 
-namespace HH.WCS.Mobox3.DSZSH.Controllers {
+
+namespace HH.WCS.Mobox3.DSZSH.api {
     /// <summary>
     /// 璁惧淇℃伅涓婃姤锛圚ostToAGV涓婃姤銆佹澀濂ュ爢鍨涙満銆佸浗鑷狝GV锛�     /// </summary>
@@ -24,7 +24,7 @@
         public ReturnResult AGVCallbackState(AgvTaskState model)
         {
             LogHelper.Info("NDC HostToAGV 浠诲姟鐘舵�鍥炴姤锛� + JsonConvert.SerializeObject(model), "HosttoagvTask");
-            return AgvService.OperateAgvTaskStatus(model);
+            return WCSCore.OperateAgvTaskStatus(model);
         }
 
         /// <summary>
@@ -35,7 +35,7 @@
         [HttpPost]
         [Route("SafetyInteraction")]
         public ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
-            return AgvService.SafetyInteraction(model);
+            return WCSCore.SafetyInteraction(model);
         }
     }
 }
diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
new file mode 100644
index 0000000..3c352ae
--- /dev/null
+++ b/api/ApiHelper.cs
@@ -0,0 +1,1330 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+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;
+using static HH.WCS.Mobox3.DSZSH.Config;
+
+
+namespace HH.WCS.Mobox3.DSZSH.api {
+    public class ApiHelper {
+        /// <summary>
+        /// 濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult GoodpackOffline(GoodpackOfflineInfo model) {
+            var taskName = TaskName.濂借繍绠盻婊$涓嬬嚎鍏ュ簱; // 鐢ㄤ簬鐢熸垚浠诲姟绫诲瀷銆佹墦鍗版棩蹇椾俊鎭�+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                // 灏哖DA鎻愪緵鐨勭墿鏂欑紪鐮佷笌璐存爣鏈虹殑淇℃伅姣斿
+                var cgDetail = db.Queryable<TN_CG_Detail>()
+                    .Where(d => d.S_ITEM_CODE == model.s_item_code && d.S_BATCH_NO == model.s_batch) // 鎸囧畾锛氱墿鏂欑紪鐮併�鎵规鍙�+                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮") // NOTE 鍐椾綑妫�煡锛氱墿鏂欑姸鎬佸簲璇ヤ负 1寰呮
+                    .First();
+
+                if (cgDetail == null) {
+                    info = $"PDA鎵爜鐗╂枡淇℃伅涓庤创鏍囨満浼犻�鐨勪俊鎭笉涓�嚧锛� + JsonConvert.SerializeObject(model);
+                    LogHelper.Info(info);
+                    return NewSimpleResult(1, info);
+                }
+
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(a => a.S_CODE == model.s_start_loc) // 鎸囧畾锛氳捣鐐硅揣浣嶅彿
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .First();
+
+                if (startLoc == null) {
+                    info = $"璧风偣浣嶇疆 '{model.s_start_loc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�;
+                    LogHelper.Info(info);
+                    return NewSimpleResult(3, info);
+                }
+
+                // 缁戝畾璐т綅鍜屽鍣ㄥ彿
+                var locCntrRel = new TN_Loc_Container {
+                    S_LOC_CODE = model.s_start_loc,
+                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                    S_CNTR_TYPE = "濂借繍绠�,
+                };
+
+                if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
+                    info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴澶辫触锛� + JsonConvert.SerializeObject(locCntrRel);
+                    LogHelper.Info(info);
+                    return NewSimpleResult(4, info);
+                }
+
+                // TODO 婊$鍏ュ簱绠楁硶寰呬紭鍖�+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(a => Settings.AreaMap[AreaName.婊℃墭瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
+                    .OrderBy(l => l.N_LAYER)
+                    .OrderBy(l => l.S_AREA_CODE).First();
+
+                if (endLoc == null) {
+                    info = "婊$鍏ュ簱鏆傛椂娌℃湁鍚堥�鐨勮揣浣嶅彲浠ュ叆搴�;
+                    LogHelper.Info(info);
+                    return NewSimpleResult(4, info);
+                }
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    tran.CommitTran();
+                    info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
+                }
+            }
+            catch (Exception ex) {
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.Info(info);
+                return NewSimpleResult(1, info);
+            }
+        }
+
+        ///// <summary>
+        ///// 绌烘墭鐩樼粦瀹�PDA)
+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //public static SimpleResult EmptyBindPallet(EmptyBindInfo model) {
+        //    var db = DbHelper.GetDbClient();
+
+        //    try {
+        //        var loc = db.Queryable<TN_Location>()
+        //            .Where(ExprHelper.LocCode(model.LocCode))
+        //            .Where(ExprHelper.LocBelongsToArea(AreaName.绌烘墭鐩樻帴椹冲尯))
+        //            .Where(ExprHelper.LocIsFree)
+        //            .Where(ExprHelper.LocIsEmpty).First();
+
+        //        if (loc == null) {
+        //            return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
+        //        }
+
+        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
+        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
+
+        //        if (locCntrRel != null) {
+        //            return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
+        //        }
+
+        //        //loc.N_CURRENT_NUM = model.PalletCount;
+
+        //        locCntrRel = new TN_Loc_Container {
+        //            S_LOC_CODE = model.LocCode,
+        //            S_CNTR_CODE = model.CntrCode
+        //        };
+
+        //        using (var tran = db.Ado.UseTran()) {
+        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
+        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
+        //                tran.CommitTran();
+        //                return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
+        //            }
+        //            else {
+        //                tran.RollbackTran();
+        //                return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
+        //            }
+        //        }
+        //    }
+        //    catch (Exception ex) {
+        //        return BuildSimpleEx(ex);
+        //    }
+        //}
+
+        ///// <summary>
+        ///// 绌虹缁戝畾(PDA)
+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) {
+        //    var db = DbHelper.GetDbClient();
+
+        //    try {
+        //        var loc = db.Queryable<TN_Location>()
+        //            .Where(ExprHelper.LocCode(model.LocCode))
+        //            .Where(ExprHelper.LocBelongsToArea(AreaName.绌虹鎺ラ┏鍖�)
+        //            .Where(ExprHelper.LocIsFree)
+        //            .Where(ExprHelper.LocIsEmpty).First();
+
+        //        if (loc == null) {
+        //            return BuildSimpleResult(2, $"褰撳墠璐т綅 '{model.LocCode}' 鏃犳硶鍐嶇粦瀹氬鍣�);
+        //        }
+
+        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
+        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
+
+        //        if (locCntrRel != null) {
+        //            return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
+        //        }
+
+        //        loc.N_CURRENT_NUM = 1; // 绌虹缁戝畾鏃跺鍣ㄦ暟蹇呯劧涓�1
+
+        //        locCntrRel = new TN_Loc_Container {
+        //            S_LOC_CODE = model.LocCode,
+        //            S_CNTR_CODE = model.CntrCode
+        //        };
+
+        //        using (var tran = db.Ado.UseTran()) {
+        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
+        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
+        //                tran.CommitTran();
+        //                return BuildSimpleResult(0, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 鎴愬姛");
+        //            }
+        //            else {
+        //                tran.RollbackTran();
+        //                return BuildSimpleResult(4, $"缁戝畾瀹瑰櫒 '{model.CntrCode}' 涓庤揣浣�'{model.LocCode}' 澶辫触");
+        //            }
+        //        }
+        //    }
+        //    catch (Exception ex) {
+        //        return BuildSimpleEx(ex);
+        //    }
+        //}
+
+        /// <summary>
+        /// 鎵樼洏-绌烘墭鍏ュ簱(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult EmptyInboundPallet(EmptyInboundInfo model) {
+            var taskName = TaskName.鎵樼洏_绌烘墭鍏ュ簱;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(a => a.S_CODE == model.StartLoc) // 鎸囧畾锛氳捣鐐硅揣浣�+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 1)
+                    .First();
+
+                if (startLoc == null) {
+                    return NewSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
+                }
+
+                // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
+                    .First();
+
+                if (locCntrRel == null) {
+                    return NewSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
+                }
+
+                // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(a => Settings.AreaMap[AreaName.绌烘墭瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                    .OrderBy(l => l.N_LAYER)
+                    .OrderBy(l => l.S_AREA_CODE).First();
+
+                if (endLoc == null) {
+                    return NewSimpleResult(4, $"鏆傛椂娌℃湁绗﹀悎鏉′欢鐨勭粓鐐规斁璐т綅");
+                }
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    tran.CommitTran();
+                    return NewSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.Info(info);
+                return NewSimpleResult(1, info);
+            }
+        }
+
+        /// <summary>
+        /// 濂借繍绠�绌虹鍏ュ簱(PDA)
+        /// </summary>
+        /// <returns></returns>
+        public static SimpleResult EmptyInboundGoodpack(EmptyInboundInfo model) {
+            var taskName = TaskName.濂借繍绠盻绌虹鍏ュ簱;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(a => a.S_CODE == model.StartLoc)
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 1) // 绛涢�锛氭湁璐ц揣浣�+                    .First();
+
+                if (startLoc == null) {
+                    return NewSimpleResult(2, $"璧风偣浣嶇疆 '{model.StartLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囧彇璐ц姹�);
+                }
+
+                // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
+                    .First();
+
+                if (locCntrRel == null) {
+                    return NewSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntrCode}'");
+                }
+
+                // TODO 鏆傚畾閫夋嫨鏈�綆灞傛寜鍖轰綅椤哄簭鍏ュ簱锛屽悗闈㈠緟淇敼
+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(a => Settings.AreaMap[AreaName.绌虹瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                    .OrderBy(l => l.N_LAYER)
+                    .OrderBy(l => l.S_AREA_CODE).First();
+
+                if (endLoc == null) {
+                    return NewSimpleResult(4, $"鏆傛椂娌℃湁绗﹀悎鏉′欢鐨勭粓鐐规斁璐т綅");
+                }
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    tran.CommitTran();
+                    return NewSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        /// <summary>
+        /// 鎵樼洏-绌烘墭涓婄嚎(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult EmptyOnlinePallet(EmptyOnlinePalletInfo model) {
+            var taskName = TaskName.鎵樼洏_绌烘墭涓婄嚎;
+            var db = new SqlHelper<object>().GetInstance();
+            var taskInfo = Settings.TaskMap[taskName];
+            var info = "";
+            try {
+                // TODO 绗﹀悎鐗╂枡淇℃伅鐨勮揣浣�+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE))
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 1) // 绛涢�锛氭湁璐ц揣浣�+                    .First();
+
+                if (startLoc == null) {
+                    return NewSimpleResult(2, $"娌℃湁鍚堥�鐨勮捣鐐逛綅缃�);
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
+                    a => a.S_LOC_CODE == startLoc.S_CODE
+                    && a.S_CNTR_CODE == model.CntId);
+
+                if (locCntrRel == null) {
+                    return NewSimpleResult(3, $"璧风偣浣嶇疆 '{startLoc.S_CODE}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
+                }
+
+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(a => Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(a.S_AREA_CODE))
+                    .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
+                    .First();
+
+                if (endLoc == null) {
+                    return NewSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
+                }
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    tran.CommitTran();
+                    return NewSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        /// <summary>
+        /// 濂借繍绠�绌虹涓婄嚎(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult EmptyOnlineGoodpack(EmptyOnlineGoodpackInfo model) {
+            var taskName = TaskName.濂借繍绠盻绌虹涓婄嚎;
+            var db = new SqlHelper<object>().GetInstance();
+            var taskInfo = Settings.TaskMap[taskName];
+            var info = "";
+            try {
+                // TODO 绗﹀悎鐗╂枡淇℃伅鐨勮揣浣�+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE))
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 1).First();
+
+                if (startLoc == null) {
+                    return NewSimpleResult(2, $"娌℃湁鍚堥�鐨勮捣鐐逛綅缃�);
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
+                    a => a.S_LOC_CODE == startLoc.S_CODE
+                    && a.S_CNTR_CODE == model.CntId);
+
+                if (locCntrRel == null) {
+                    return NewSimpleResult(3, $"璧风偣浣嶇疆 '{startLoc.S_CODE}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
+                }
+
+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(a => Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(a.S_AREA_CODE))
+                    .Where(l => taskInfo.EndAreas.Contains(l.S_AREA_CODE))
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 0)
+                    .First();
+
+                if (endLoc == null) {
+                    return NewSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
+                }
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE, it.S_LOCK_STATE, it.S_LOCK_OP, it.T_MODIFY }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(500,
+                            $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                    }
+
+                    tran.CommitTran();
+                    return NewSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        /// <summary>
+        /// 鍒涘缓鎶芥鍗�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
+            var billName = "鎶芥鍗�;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var orderNo = GenerateOrderNo("鎶芥鍗曞彿", "CN");
+
+                var order = new TN_Check_Order {
+                    S_NO = orderNo,
+                    S_ITEM_CODE = model.ItemCode,
+                    //S_ITEM_NAME = model.ItemName,
+                    S_BATCH_NO = model.BatchNo,
+                    N_COUNT = model.Qty,
+                    S_END_AREA = model.EndArea,
+                };
+
+                var cgDetailList = SelectCgByTotalQty(model);
+                if (cgDetailList.Count == 0) {
+                    return NewSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ユ娊妫�);
+                }
+
+                var detailList = new List<TN_Check_Detail>();
+                foreach (var cgDetail in cgDetailList) {
+                    var detail = new TN_Check_Detail {
+                        S_NO = orderNo,
+                        S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+                        S_BATCH_NO = cgDetail.S_BATCH_NO,
+                        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                        S_END_AREA = model.EndArea,
+                    };
+
+                    detailList.Add(detail);
+
+                    cgDetail.N_ITEM_STATE = 3;
+                    cgDetail.S_ITEM_STATE = "鎶介獙涓�;
+                }
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable<TN_Check_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚{billName}澶辫触锛� + JsonConvert.SerializeObject(order);
+                        LogHelper.Info(info);
+                        return NewSimpleResult(2, info);
+                    }
+
+                    if (db.Insertable<TN_Outbound_Detail>(detailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚{billName}鏄庣粏澶辫触";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_CG_Detail>(cgDetailList).UpdateColumns(it => new { 
+                        it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鏇存柊鐗╂枡鐘舵�澶辫触";
+
+                    }
+
+                    tran.CommitTran();
+                }
+                return NewSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+        /// <summary>
+        /// 鎶芥-鍚堟牸鍥炲簱(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult QualifiedBack(QualifiedBackInfo model) {
+            var taskName = TaskName.鎶芥_鍚堟牸鍥炲簱;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            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, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡锛� + JsonConvert.SerializeObject(model));
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE)
+                    .First();
+
+                //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 == cgDetail.S_CNTR_CODE) // 鎸囧畾瀹瑰櫒鍙�+                //    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                //    .First();
+
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(l => l.S_CODE == locCntrRel.S_LOC_CODE)
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .First();
+
+                if (startLoc == null) {
+                    info = "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�;
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
+                }
+
+                var endLoc = new TN_Location();
+                if (locCntrRel.S_CNTR_TYPE == "鎵樼洏") {
+                    endLoc = db.Queryable<TN_Location>()
+                        .Where(a => Settings.AreaMap[AreaName.婊℃墭瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅
+                        .First();
+                }
+                else if (locCntrRel.S_CNTR_TYPE == "濂借繍绠�) {
+                    endLoc = db.Queryable<TN_Location>()
+                        .Where(a => Settings.AreaMap[AreaName.婊$瀛樻斁鍖篯.Contains(a.S_AREA_CODE))
+                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                        .Where(a => a.N_CURRENT_NUM == 0)
+                        .First();
+                }
+                else {
+                    return NewSimpleResult(2, $"鎵樼洏绫诲瀷{locCntrRel.S_CNTR_TYPE}涓嶅悎娉曪細鎵樼洏鍙穥locCntrRel.S_CNTR_CODE}");
+                }
+
+
+                if (endLoc == null) {
+                    return NewSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅");
+                }
+
+                cgDetail.N_ITEM_STATE = 0;
+                cgDetail.S_ITEM_STATE = "鍚堟牸";
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
+                        new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    tran.CommitTran();
+                    return NewSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.Info(info);
+                return NewSimpleResult(1, info);
+            }
+        }
+        public static SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
+            var taskName = TaskName.鎶芥_涓嶅悎鏍肩Щ搴�
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            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, "娌℃湁鎵惧埌寰呭洖搴撶殑鎶芥鐗╂枡");
+                }
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE)
+                    .First();
+
+                //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 == cgDetail.S_CNTR_CODE) // 鎸囧畾瀹瑰櫒鍙�+                //    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                //    .First();
+
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(l => l.S_CODE == locCntrRel.S_LOC_CODE)
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .First();
+
+                if (startLoc == null) {
+                    info = "娌℃湁鎵惧埌鍚堥�鐨勮捣鐐硅揣浣�;
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
+                }
+
+                var endLoc = db.Queryable<TN_Location>()
+                    .Where(l => l.S_AREA_CODE == model.EndArea)
+                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣
+                    .Where(a => a.N_CURRENT_NUM == 0).First();
+
+                if (endLoc == null) {
+                    return NewSimpleResult(3, "鏌ヨ锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅");
+                }
+
+                cgDetail.N_ITEM_STATE = 2;
+                cgDetail.S_ITEM_STATE = "涓嶅悎鏍�;
+
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
+                        new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = "淇敼鐗╂枡鐘舵�涓哄悎鏍�澶辫触";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    tran.CommitTran();
+                    return NewSimpleResult(0,
+                        $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}");
+                }
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        public static SimpleResult RestBack(RestBackInfo model) {
+            var taskName = TaskName.灏剧鍥炲簱;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var startLoc = db.Queryable<TN_Location>()
+                    .Where(l => l.S_CODE == model.StartLoc)
+                    .First();
+
+                var locCntrRel = db.Queryable<TN_Loc_Container>()
+                    .Where(c => c.S_LOC_CODE == model.StartLoc)
+                    .First();
+
+                if (locCntrRel == null) {
+                    return NewSimpleResult(2, $"璧风偣璐т綅 {model.StartLoc}");
+                }
+
+                var endLoc = db.Queryable<TN_Location, TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
+                    .Where((l, c) => c.S_CNTR_TYPE == locCntrRel.S_CNTR_TYPE)
+                    .First();
+
+                if (endLoc == null) {
+                    return NewSimpleResult(3, $"涓嶅瓨鍦ㄥ悎閫傜殑缁堢偣璐т綅鍙互鍥炲簱");
+                }
+                var cntId = locCntrRel.S_CNTR_CODE;
+                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                        it.N_LOCK_STATE,
+                        it.S_LOCK_STATE,
+                        it.S_LOCK_OP,
+                        it.T_MODIFY
+                    }).ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    tran.CommitTran();
+                    info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣鏋�{endLoc.S_CODE}";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(0, info);
+                }
+            }
+            catch (Exception ex) {
+
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        public static List<TN_CG_Detail> SelectCgByTotalQty(CreateCheckOrderInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = new List<TN_CG_Detail>();
+            var targetNum = model.Qty;
+
+            try {
+                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
+                && a.N_ITEM_NUM > targetNum).
+                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
+                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�+                {
+                    result.Add(targetCg);
+                    return result;
+                }
+
+                var sortedMaterials = new List<TN_CG_Detail>();
+
+                sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+
+                if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�+                {
+                    return result;
+                }
+
+                int countNum = 0;
+                foreach (var mat in sortedMaterials) {
+                    countNum += mat.N_ITEM_NUM;
+                    result.Add(mat);
+                    if (countNum >= targetNum) {
+                        break;
+                    }
+                }
+                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
+                    return result;
+                }
+                else {
+                    result.Clear();
+                    return result;
+                }
+            }
+            catch (Exception ex) {
+                throw ex;
+            }
+        }
+
+        /// <summary>
+        /// 鎴愬搧鑳跺嚭搴�WMS)
+        /// </summary>
+        /// <remarks>
+        /// WMS鎻愪緵鍑哄簱鐨勭墿鏂欑被鍨嬩笌鏁伴噺锛岃皟鐢ㄦ帴鍙g敱WCS鐢熸垚鍏蜂綋鐨勫嚭搴撲换鍔★紝鐒跺悗WCS鍚庡彴杞澶勭悊
+        /// </remarks>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON");
+            var info = "";
+            try {
+                if (string.IsNullOrEmpty(orderNo)) {
+                    info = "鍑哄簱鍗曞彿涓嶈兘涓虹┖";
+                    LogHelper.Info(info);
+                    return NewSimpleResult(2, info);
+                }
+
+                var cgDetailList = SelectCgByTotalQty(model);
+
+                if (cgDetailList.Count == 0) {
+                    info = "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�;
+                    LogHelper.Info(info);
+                    return NewSimpleResult(3, info);
+                }
+
+                var order = new TN_Outbound_Order {
+                    S_NO = orderNo,
+                    S_ITEM_CODE = model.ItemCode,
+                    S_BATCH = model.BatchNo,
+                    N_END_NUM = model.Qty,
+                    //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
+                    S_END_AREA = model.EndArea
+                };
+
+                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 = model.EndArea
+                    };
+                    detailList.Add(detail);
+                }
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order);
+                        LogHelper.Info(info);
+                        return NewSimpleResult(2, info);
+                    }
+
+                    if (db.Insertable<TN_Outbound_Detail>(detailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐�;
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    tran.CommitTran();
+                }
+
+                return NewSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�);
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        /// <summary>
+        /// 鎴愬搧鑳跺己鍒跺嚭搴�WMS)
+        /// </summary>
+        /// <returns></returns>
+        public static SimpleResult FinishedOutboundForce(FinishedOutboundInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            var orderNo = GenerateOrderNo("鍑哄簱鍗曞彿", "ON");
+            var info = "";
+            try {
+                if (string.IsNullOrEmpty(orderNo)) {
+                    return NewSimpleResult(2, "鍑哄簱鍗曞彿涓嶈兘涓虹┖");
+                }
+
+                using (var tran = db.Ado.UseTran()) {
+
+                    var cgDetailList = SelectCgByTotalQty(model);
+
+                    if (cgDetailList.Count == 0) {
+                        return NewSimpleResult(3, "娌℃湁鍚堥�鐨勭墿鏂欏彲浠ュ嚭搴�);
+                    }
+
+                    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,
+                            S_END_AREA = model.EndArea
+                        };
+
+                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            return NewSimpleResult(4, "鐢熸垚鍑哄簱鍗曟槑缁嗗け璐ワ細" + JsonConvert.SerializeObject(detail));
+                        }
+                    }
+
+                    var order = new TN_Outbound_Order {
+                        S_NO = orderNo,
+                        S_ITEM_CODE = model.ItemCode,
+                        S_BATCH = model.BatchNo,
+                        N_END_NUM = model.Qty,
+                        //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
+                        S_END_AREA = model.EndArea
+                    };
+
+                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        return NewSimpleResult(5, "鐢熸垚鍑哄簱鍗曞け璐ワ細" + JsonConvert.SerializeObject(order));
+                    }
+
+                    tran.CommitTran();
+                }
+
+                return NewSimpleResult(0, "鐢熸垚鍑哄簱鍗曟垚鍔�);
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        public static List<TN_CG_Detail> SelectCgByTotalQty(FinishedOutboundInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = new List<TN_CG_Detail>();
+            var targetNum = model.Qty;
+            var info = "";
+            try {
+                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
+                && a.N_ITEM_NUM > targetNum).
+                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
+                if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�+                {
+                    result.Add(targetCg);
+                    return result;
+                }
+
+                // NOTE 鏍规嵁鎬婚噺閫塪etail鏃讹紝鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵
+
+                var sortedMaterials = new List<TN_CG_Detail>();
+
+                if (model.ForcedOut) {
+                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸"
+                             || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+                }
+                else {
+                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
+                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
+                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
+                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
+                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
+                }
+
+
+                if (sortedMaterials.Count == 0) //娌℃湁婊¤冻鏉′欢鐨�+                {
+                    return result;
+                }
+
+                int countNum = 0;
+                foreach (var mat in sortedMaterials) {
+                    countNum += mat.N_ITEM_NUM;
+                    result.Add(mat);
+                    if (countNum >= targetNum) {
+                        break;
+                    }
+                }
+                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
+                    return result;
+                }
+                else {
+                    result.Clear();
+                    return result;
+                }
+            }
+            catch (Exception ex) {
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.Info(info);
+                return result;
+            }
+        }
+
+        /// <summary>
+        /// 绉诲簱-鍒涘缓绉诲簱浠诲姟(WMS)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static SimpleResult CreateShiftOrder(CreateShiftOrderInfo model) {
+            var billName = "鎶芥鍗�;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var orderNo = GenerateOrderNo("鎶芥鍗曞彿", "CN");
+
+                var order = new TN_Check_Order {
+                    S_NO = orderNo,
+                    S_ITEM_CODE = model.ItemCode,
+                    //S_ITEM_NAME = model.ItemName,
+                    S_BATCH_NO = model.BatchNo,
+                    //N_COUNT = model.Qty,
+                    S_END_AREA = model.EndArea,
+                };
+
+                var cgDetailList = SelectShiftItem(model);
+                if (cgDetailList.Count == 0) {
+                    return NewSimpleResult(3, "娌℃湁绗﹀悎瑕佹眰鐨勭墿鏂欓渶瑕佺Щ搴�);
+                }
+
+                var detailList = new List<TN_Check_Detail>();
+                foreach (var cgDetail in cgDetailList) {
+                    var detail = new TN_Check_Detail {
+                        S_NO = orderNo,
+                        S_ITEM_CODE = cgDetail.S_ITEM_CODE,
+                        S_BATCH_NO = cgDetail.S_BATCH_NO,
+                        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
+                        S_END_AREA = model.EndArea,
+                    };
+
+                    detailList.Add(detail);
+
+                    cgDetail.N_ITEM_STATE = 3;
+                    cgDetail.S_ITEM_STATE = "鎶介獙涓�;
+                }
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (db.Insertable<TN_Check_Order>(order).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚{billName}澶辫触锛� + JsonConvert.SerializeObject(order);
+                        LogHelper.Info(info);
+                        return NewSimpleResult(2, info);
+                    }
+
+                    if (db.Insertable<TN_Outbound_Detail>(detailList).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鐢熸垚{billName}鏄庣粏澶辫触";
+                        LogHelper.Info(info);
+                        return NewSimpleResult(4, info);
+                    }
+
+                    if (db.Updateable<TN_CG_Detail>(cgDetailList).UpdateColumns(it => new { 
+                        it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
+                        tran.RollbackTran();
+                        info = $"鏇存柊鐗╂枡鐘舵�澶辫触";
+
+                    }
+
+                    tran.CommitTran();
+                }
+                return NewSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
+            }
+            catch (Exception ex) {
+                return BuildSimpleEx(ex);
+            }
+        }
+
+        public static List<TN_CG_Detail> SelectShiftItem(CreateShiftOrderInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = new List<TN_CG_Detail>();
+            var info = "";
+            try {
+                var targetItemList = db.Queryable<TN_CG_Detail>()
+                    .Where(a => a.S_ITEM_CODE == model.ItemCode)
+                    .Where(a => a.S_BATCH_NO == model.BatchNo)
+                    .Where(a => a.N_ITEM_STATE != 3 && a.S_ITEM_CODE != "鎶芥涓�)
+                    .OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc)
+                    .ToList();
+
+                return targetItemList;
+            }
+            catch (Exception ex) {
+                info = $"鍙戠敓浜嗗紓甯革細{ex.Message}";
+                LogHelper.Info(info);
+                return result;
+            }
+        }
+
+
+        private static string GenerateOrderNo(string snType, string prefix) {
+            var id = SYSHelper.GetSerialNumber(snType, prefix);
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"ON{date}{id.ToString().PadLeft(4, '0')}";
+        }
+
+        /// <summary>
+        /// 鍗氬疄鐗╂枡淇℃伅涓嬪彂鍚屾
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static WmsResult CgInfoSync(CgInfoSyncInfo model) {
+            var db = new SqlHelper<object>().GetInstance();
+            var random = new Random();
+
+            try {
+                var detail = new TN_CG_Detail {
+                    S_ITEM_CODE = model.ItemCode,
+                    S_ITEM_NAME = model.ItemName,
+                    S_CNTR_CODE = Guid.NewGuid().ToString("D"), // NOTE 瀹瑰櫒鍙凤細鐩墠闅忔満锛堝悗鏈熷彲鑳戒細鎸囧畾锛屾垨鑰匬DA缁戝畾鏃跺啀濉叆锛�+                    S_BATCH_NO = model.BatchNo,
+                    S_STANDARD = model.Standard,
+                    S_NET_WEIGHT = model.NetWeight,
+                    S_QUALITY_GRADE = model.QualityGrade,
+                    //N_PRODUCT_LINE = random.Next(0, 3), // NOTE 浜х嚎鍙凤細鐩墠闅忔満锛堝悗鏈熷彲鑳戒細鎸囧畾锛屾垨鑰匬DA缁戝畾鏃跺啀濉叆锛�+                };
+
+                // 璐т綅瀹瑰櫒缁戝畾鐨勯�杈戯紝鍦ㄥソ杩愮涓嬬嚎PDA鐨勬祦绋嬩腑鎿嶄綔
+
+                //var locCntrRel = new TN_Loc_Container {
+                //    //S_LOC_CODE = Settings.Config.ProductionLines[detail.N_PRODUCT_LINE].OffLoc[0], // 濂借繍绠辩殑浣嶇疆鏄搷浣滃尯锛屼笉鏄骇绾�+                //    S_CNTR_CODE = detail.S_CNTR_CODE,
+                //    S_CNTR_TYPE = "濂借繍绠�, // 璐存爣鏈哄彧閽堝濂借繍绠�+                //};
+
+                //using (var tran = db.Ado.UseTran()) {
+                //    if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0
+                //        && db.Insertable<TN_Loc_Container>(detail).ExecuteCommand() <= 0) {
+                //        tran.RollbackTran();
+                //        return MesResultBuilder(2, "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail));
+                //    }
+                //    tran.CommitTran();
+                //}
+
+                if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0) {
+                    return MesResultBuilder(2, "鎻掑叆鐗╂枡淇℃伅澶辫触锛� + JsonConvert.SerializeObject(detail));
+                }
+
+                return MesResultBuilder(0, "鎻掑叆鐗╂枡淇℃伅鎴愬姛");
+            }
+            catch (Exception ex) {
+                return MesResultBuilder(1, ex.Message);
+            }
+        }
+    }
+}
diff --git a/api/ApiModel.cs b/api/ApiModel.cs
new file mode 100644
index 0000000..9f65d18
--- /dev/null
+++ b/api/ApiModel.cs
@@ -0,0 +1,573 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Newtonsoft.Json;
+
+namespace HH.WCS.Mobox3.DSZSH.api {
+    public class ApiModel {
+        /// <summary>
+        /// Mobox 鎺ュ彛杩斿洖鏁版嵁绫�+        /// </summary>
+        public class SimpleResult {
+            public int resultCode { get; set; }
+            public string resultMsg { get; set; }
+            public List<object> result { get; set; } = new List<object>();
+        }
+
+        /// <summary>
+        /// 鏋勫缓 <see cref="SimpleResult"/> 杩斿洖鍊�+        /// </summary>
+        /// <param name="code"></param>
+        /// <param name="message"></param>
+        /// <returns></returns>
+        public static SimpleResult NewSimpleResult(int code, string message) {
+            return new SimpleResult { resultCode = code, resultMsg = message };
+        }
+
+        /// <summary>
+        /// 鏋勫缓 <see cref="SimpleResult"/> 寮傚父杩斿洖鍊硷紝閫夋嫨鎵撳嵃寮傚父鏃ュ織淇℃伅锛堥粯璁ゆ墦鍗帮級
+        /// </summary>
+        /// <param name="ex"></param>
+        /// <param name="exCode"></param>
+        /// <param name="pringLog"></param>
+        /// <returns></returns>
+        public static SimpleResult BuildSimpleEx(Exception ex, int exCode = 1, bool pringLog = true) {
+            if (pringLog) {
+                LogHelper.InfoEx(ex);
+            }
+            return new SimpleResult { resultCode = exCode, resultMsg = ex.Message };
+        }
+
+        /// <summary>
+        /// HostToAGV 涓婃姤浠诲姟鐘舵�
+        /// </summary>
+        public class AgvTaskState {
+            /// <summary>
+            /// AGV 鍥炴姤鐘舵�鍙�+            /// </summary>
+            public int state { get; set; }
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string task_no { get; set; }
+            /// <summary>
+            /// AGV 杞﹀彿
+            /// </summary>
+            public string forklift_no { get; set; }
+            /// <summary>
+            /// 瀹夊叏闂ㄧ紪鍙�+            /// </summary>
+            public string lock_no { get; set; }
+            /// <summary>
+            /// 闄勫姞淇℃伅
+            /// </summary>
+            public string ext_data { get; set; }
+        }
+
+        public class SafetyInteractionInfo {
+
+            public int station_id { get; set; }
+
+            /// <summary>
+            /// 璇锋眰涓婄嚎/涓嬬嚎鐨勭殑绔欏彴搴撲綅鍚嶇О锛屼緥濡倃ork6銆亀ork8
+            /// </summary>
+            public string station_name { get; set; }
+
+            /// <summary>
+            /// 璇锋眰鐮�+            /// </summary>
+            public string apply_code { get; set; }
+            public string task_no { set; get; }
+        }
+
+        /// <summary>
+        /// 杩斿洖缁�HostToAgv
+        /// </summary>
+        public class ReturnResult {
+            public int ResultCode { get; set; }
+            public string ResultMsg { get; set; }
+        }
+
+        public class orderStatusReportParme {
+            /// <summary>
+            /// 璁㈠崟ID
+            /// </summary>
+            public int orderID { get; set; }
+            /// <summary>
+            /// 璁㈠崟鍚�+            /// </summary>
+            public string orderName { get; set; }
+            /// <summary>
+            /// 璁㈠崟鐘舵�
+            /// </summary>
+            public string orderStatus { get; set; }
+            /// <summary>
+            /// agv杞﹀彿鍒楄〃
+            /// </summary>
+            public string agvIDList { get; set; }
+            /// <summary>
+            /// 浼樺厛绾�+            /// </summary>
+            public string priority { get; set; }
+            /// <summary>
+            /// 璁㈠崟褰撳墠鐨勭洰鐨勫湴
+            /// </summary>
+            public string currentDes { get; set; }
+
+
+            /// <summary>
+            /// 褰撳墠鎸囦护
+            /// </summary>
+            public string currentCmd { get; set; }
+
+            /// <summary>
+            /// 閿欒鐮�+            /// </summary>
+            public int errorCode { get; set; }
+
+            /// <summary>
+            /// 璁㈠崟鐨勬埅鑷虫椂闂�+            /// </summary>
+            public string deadLine { get; set; }
+
+            /// <summary>
+            /// 璁㈠崟鐨勫垱寤烘椂闂�+            /// </summary>
+            public string createdTime { get; set; }
+
+            /// <summary>
+            /// 棰濆淇℃伅1
+            /// </summary>
+            public string extraInfo1 { get; set; }
+
+            /// <summary>
+            /// 棰濆淇℃伅2
+            /// </summary>
+            public string extraInfo2 { get; set; }
+        }
+
+        /// <summary>
+        /// 杩斿洖缁橤Z
+        /// </summary>
+        public class GzResult {
+
+            public int resultCode { get; set; }
+            public string msg { get; set; }
+            public int orderID { get; set; }
+        }
+
+
+
+    }
+
+    public class OtherModel {
+        #region PDA 鏁版嵁
+        /// <summary>
+        /// 濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)鏁版嵁绫�+        /// </summary>
+        public class GoodpackOfflineInfo {
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string s_item_code { get; set; }
+            ///// <summary>
+            ///// 鐗╂枡鍚嶇О
+            ///// </summary>
+            //[JsonProperty("item_name")]
+            //public string ItemName { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string s_batch { get; set; }
+            /// <summary>
+            /// 鐗╂枡瑙勬牸
+            /// </summary>
+        
+            public string s_spec { get; set; }
+            /// <summary>
+            /// 鏁伴噺
+            /// </summary>
+            public int n_num { get; set; }
+            /// <summary>
+            /// 璧风偣璐т綅淇℃伅
+            /// </summary>
+            public string s_start_loc { get; set; }
+        }
+        /// <summary>
+        /// 绌烘墭/绌虹鍏ュ簱缁戝畾(PDA)鏁版嵁绫�+        /// </summary>
+        public class EmptyBindInfo {
+            /// <summary>
+            /// 瀹瑰櫒缂栫爜
+            /// </summary>
+
+            [JsonProperty("s_cntr_code")]
+            public string CntrCode { get; set; }
+            /// <summary>
+            /// 瀹瑰櫒绫诲瀷
+            /// </summary>
+
+            [JsonProperty("s_cntr_type")]
+            public string CntrType { get; set; }
+            ///// <summary>
+            ///// 鎵樼洏鏁伴噺锛堜粎褰撳鍣ㄧ被鍨嬩负鎵樼洏鏃朵娇鐢級
+            ///// </summary>
+            //[JsonProperty("pallet_count", NullValueHandling = NullValueHandling.Ignore)]
+            //public int PalletCount { get; set; }
+            /// <summary>
+            /// 璐т綅缂栫爜
+            /// </summary>
+            [JsonProperty("s_loc_code")]
+            public string LocCode { get; set; }
+        }
+        /// <summary>
+        /// 绌烘墭缁戝畾
+        /// </summary>
+        public class EmptyBindPalletInfo {
+            /// <summary>
+            /// 瀹瑰櫒缂栫爜
+            /// </summary>
+            public string CntrCode { get; set; }
+
+            /// <summary>
+            /// 鎵樼洏鏁伴噺
+            /// </summary>
+            public int PalletCount { get; set; }
+
+            /// <summary>
+            /// 璐т綅缂栫爜
+            /// </summary>
+            public string LocCode { get; set; }
+        }
+        /// <summary>
+        /// 绌虹缁戝畾
+        /// </summary>
+        public class EmptyBindGoodpackInfo {
+            /// <summary>
+            /// 瀹瑰櫒缂栫爜
+            /// </summary>
+            public string CntrCode { get; set; }
+
+            /// <summary>
+            /// 璐т綅缂栫爜
+            /// </summary>
+            public string LocCode { get; set; }
+        }
+        /// <summary>
+        /// 绌烘墭/绌虹鍏ュ簱(PDA)鏁版嵁绫�+        /// </summary>
+        public class EmptyInboundInfo {
+            /// <summary>
+            /// 瀹瑰櫒缂栫爜
+            /// </summary>
+            [JsonProperty("cntr_code")]
+            public string CntrCode { get; set; }
+            /// <summary>
+            /// 瀹瑰櫒绫诲瀷
+            /// </summary>
+            [JsonProperty("cntr_type")]
+            public string CntrType { get; set; }
+            /// <summary>
+            /// 缁堢偣搴撳尯缂栫爜
+            /// </summary>
+            [JsonProperty("end_area")]
+            public string EndArea { get; set; }
+            /// <summary>
+            /// 璧风偣璐т綅
+            /// </summary>
+            [JsonProperty("start_loc")]
+            public string StartLoc { get; set; }
+        }
+
+        public class EmptyInboundDetailInfo { }
+
+        //public class EmptyOnlineInfo {
+        //    public string ItemCode { get; set; }
+        //    public string ItemName { get; set; }
+        //    public string PatchNo { get; set; }
+        //    public string EndLoc { get; set; }
+        //}
+
+        public class EmptyOnlinePalletInfo {
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+
+            [JsonProperty("item_code")]
+            public string ItemCode { get; set; }
+            ///// <summary>
+            ///// 鐗╂枡鍚嶇О
+            ///// </summary>
+            //
+            //[JsonProperty("item_name")]
+            //public string ItemName { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+
+            [JsonProperty("batch_no")]
+            public string BatchNo { get; set; }
+            /// <summary>
+            /// 鐗╂枡瑙勬牸
+            /// </summary>
+            [JsonProperty("spe")]
+            public string Spe { get; set; }
+            /// <summary>
+            /// 瀹瑰櫒缂栫爜
+            /// </summary>
+            [JsonProperty("cnt_id")]
+            public string CntId { get; set; }
+            // 瀹瑰櫒绫诲瀷 = 鎵樼洏
+        }
+
+        public class EmptyOnlineGoodpackInfo {
+            // 瀹瑰櫒绫诲瀷 = 濂借繍绠�+            /// <summary>
+            /// 瀹瑰櫒缂栫爜
+            /// </summary>
+            [JsonProperty("cnt_id")]
+            public string CntId { get; set; }
+        }
+
+        /// <summary>
+        /// 鎶芥-鍒涘缓鎶芥鍗�WMS)鏁版嵁绫�+        /// </summary>
+        public class CreateCheckOrderInfo {
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+
+            [JsonProperty("item_code")]
+            public string ItemCode { get; set; }
+            ///// <summary>
+            ///// 鐗╂枡鍚嶇О
+            ///// </summary>
+            //
+            //[JsonProperty("item_name")]
+            //public string ItemName { get; set; }
+            /// <summary>
+            /// 鐗╂枡瑙勬牸
+            /// </summary>
+            [JsonProperty("spe")]
+            public string Spe { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+
+            [JsonProperty("batch_no")]
+            public string BatchNo { get; set; }
+            /// <summary>
+            /// 闇�嚭搴撴暟閲�+            /// </summary>
+            [JsonProperty("qty")]
+            public int Qty { get; set; }
+            /// <summary>
+            /// 瀹瑰櫒绫诲瀷
+            /// </summary>
+
+            [JsonProperty("cntr_type")]
+            public string CntrType { get; set; }
+            /// <summary>
+            /// 鍑哄簱缁堢偣璐у尯
+            /// </summary>
+
+            [JsonProperty("end_area")]
+            public string EndArea { get; set; }
+        }
+        /// <summary>
+        /// 鎶芥-鍚堟牸鍥炲簱(PDA) 鏁版嵁绫�+        /// </summary>
+        public class QualifiedBackInfo {
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            [JsonProperty("item_code")]
+            public string ItemCode { get; set; }
+            /// <summary>
+            /// 瀹瑰櫒缂栫爜
+            /// </summary>
+            [JsonProperty("cntr_code")]
+            public string CntrCode { get; set; }
+        }
+
+        public class UnqualifiedShiftInfo : QualifiedBackInfo {
+            /// <summary>
+            /// 涓嶅悎鏍肩Щ搴撶粓鐐瑰簱鍖�+            /// </summary>
+            [JsonProperty("end_area")]
+            public string EndArea { get; set; }
+        }
+
+        public class CheckShiftInfo : UnqualifiedShiftInfo {
+            public bool Qualified { get; set; }
+        }
+
+        #endregion
+
+        #region WMS 鏁版嵁
+        /// <summary>
+        /// 鎴愬搧鑳跺嚭搴�PDA)
+        /// </summary>
+        public class FinishedOutboundInfo {
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            [JsonProperty("item_code")]
+            public string ItemCode { get; set; }
+            ///// <summary>
+            ///// 鐗╂枡鍚嶇О
+            ///// </summary>
+            //[JsonProperty("item_name")]
+            //public string ItemName { get; set; }
+            /// <summary>
+            /// 鐗╂枡瑙勬牸
+            /// </summary>
+            [JsonProperty("spe")]
+            public string Spe { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            [JsonProperty("batch_no")]
+            public string BatchNo { get; set; }
+            /// <summary>
+            /// 闇�嚭搴撴暟閲�+            /// </summary>
+            [JsonProperty("qty")]
+            public int Qty { get; set; }
+            /// <summary>
+            /// 瀹瑰櫒绫诲瀷
+            /// </summary>
+            [JsonProperty("cntr_type")]
+            public string CntrType { get; set; }
+            /// <summary>
+            /// 鍑哄簱缁堢偣璐у尯
+            /// </summary>
+            [JsonProperty("end_area")]
+            public string EndArea { get; set; }
+            /// <summary>
+            /// 鏄惁寮哄埗鍑哄簱
+            /// </summary>
+            [JsonProperty("force_out")]
+            public bool ForcedOut { get; set; }
+        }
+        /// <summary>
+        /// 绉诲簱-鍒涘缓绉诲簱浠诲姟鏁版嵁绫�+        /// </summary>
+        public class CreateShiftOrderInfo {
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+
+            [JsonProperty("item_code")]
+            public string ItemCode { get; set; }
+            ///// <summary>
+            ///// 鐗╂枡鍚嶇О
+            ///// </summary>
+            //
+            //[JsonProperty("item_name")]
+            //public string ItemName { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+
+            [JsonProperty("batch_no")]
+            public string BatchNo { get; set; }
+            /// <summary>
+            /// 绉诲簱缁堢偣璐у尯
+            /// </summary>
+
+            [JsonProperty("end_area")]
+            public string EndArea { get; set; }
+        }
+
+        /// <summary>
+        /// 浣欐枡灏剧鍥炲簱(PDA)鏁版嵁绫�+        /// </summary>
+        public class RestBackInfo {
+            /// <summary>
+            /// 璧风偣璐т綅
+            /// </summary>
+            [JsonProperty("start_loc")]
+            public string StartLoc { get; set; }
+        }
+        #endregion
+
+        /// <summary>
+        /// 鐗╂枡淇℃伅涓嬪彂鍚屾 鏁版嵁绫�+        /// </summary>
+        public class CgInfoSyncInfo {
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            [JsonProperty("itemName")]
+            public string ItemName { get; set; }
+
+            /// <summary>
+            /// 浜у搧鐗屽彿
+            /// </summary>
+            [JsonProperty("itemCode")]
+            public string ItemCode { get; set; }
+
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            [JsonProperty("batchNo")]
+            public string BatchNo { get; set; }
+
+            /// <summary>
+            /// 鎵ц鏍囧噯
+            /// </summary>
+            [JsonProperty("standard")]
+            public string Standard { get; set; }
+
+            /// <summary>
+            /// 鍑�惈閲�+            /// </summary>
+            [JsonProperty("netWeight")]
+            public string NetWeight { get; set; }
+
+            /// <summary>
+            /// 璐ㄩ噺绛夌骇
+            /// </summary>
+            [JsonProperty("qualityGrade")]
+            public string QualityGrade { get; set; }
+        }
+
+        /// <summary>
+        /// MES API 鍝嶅簲缁撴灉绫�+        /// </summary>
+        public class WmsResult {
+            /// <summary>
+            /// 鎺ュ彛璋冪敤缁撴灉  1-鎴愬姛  0-澶辫触
+            /// </summary>
+            [JsonProperty("result")]
+            public int Result { get; set; }
+
+            /// <summary>
+            /// 鏄惁鎴愬姛 True-鎴愬姛锛孎alse锛氬け璐�+            /// </summary>
+            [JsonProperty("success")]
+            public bool Success { get; set; }
+
+            /// <summary>
+            /// 杩欓噷鏄痵tring绫诲瀷锛屽缁撴灉鐨勬弿杩�+            /// </summary>
+            [JsonProperty("data")]
+            public string Data { get; set; }
+        }
+
+        public static WmsResult MesResultBuilder(int code, string message = "", bool printLog = true) {
+            if (printLog && string.IsNullOrEmpty(message)) {
+                LogHelper.Info(message);
+            }
+            return new WmsResult {
+                Result = code,
+                Success = code == 0, // 浠呭綋code=0鏃讹紝success=true
+                Data = message,
+            };
+        }
+    }
+}
diff --git a/api/DebugController.cs b/api/DebugController.cs
new file mode 100644
index 0000000..2a5c8bd
--- /dev/null
+++ b/api/DebugController.cs
@@ -0,0 +1,216 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Runtime.ConstrainedExecution;
+using System.Web.Http;
+
+using HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.util;
+
+using Newtonsoft.Json;
+
+using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
+
+namespace HH.WCS.Mobox3.DSZSH.api {
+    /// <summary>
+    /// 娴嬭瘯鐢細濡傛灉椤圭洰涓鍜岃澶囧鎺ワ紝鍓嶆湡璁惧鏃犳硶娴嬭瘯锛岀敤鎺ュ彛妯℃嫙
+    /// </summary>
+    [RoutePrefix("api")]
+    public class DebugController : ApiController
+    {
+        /// <summary>
+        /// 妯℃嫙 AGV 澶氭鍥炴姤浠诲姟鐘舵�
+        /// </summary>
+        /// <param name="model">瀹瑰櫒鍙�/param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("AgvSeriesReports")]
+        public ReturnResults AgvSeriesReports(UpdateTaskState model)
+        {
+            return new ReturnResults();
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹簱
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("CreateDatabase")]
+        public string CreateDatabase(CoverInfo model) {
+            var cover = model.IsCover;
+            try {
+                var db = new SqlHelper<object>().GetInstance();
+
+                var entityTypes = new Type[] { 
+                    //typeof(TN_CAR_IN),
+                    //typeof(TN_CG_Detail),
+                    //typeof(TN_Container),
+                    //typeof(TN_Loc_Container),
+                    //typeof(TN_Location),
+                    //typeof(TN_Task),
+                    //typeof(TN_Task_Action),
+                    //typeof(SysHelper.OI_SYS_MAXID),
+
+                    //typeof(TN_Inbound_Order),
+                    typeof(TN_Check_Detail),
+                    //typeof(TN_Check_Order),
+                    //typeof(TN_CNTR_ITEM),
+                    //typeof(TN_Outbound_Detail),
+                    //typeof(TN_Outbound_Order),
+                    //typeof(TN_Shift_Order),
+                    //typeof(TN_Shift_Detail)
+                };
+
+                using (var tran = db.Ado.UseTran()) {
+                    if (cover) {
+                        // 鍒犻櫎鎵�湁琛紙鎸変緷璧栧叧绯诲�搴忥級
+                        //var tables = db.DbMaintenance.GetTableInfoList();
+                        //foreach (var table in tables.OrderByDescending(t => t.Name)) {
+                        //    db.DbMaintenance.DropTable(table.Name);
+                        //}
+
+                        // 鍒涘缓鏂拌〃
+                        db.CodeFirst.InitTables(entityTypes);
+
+                        //db.CodeFirst.BackupTable().InitTables(entityTypes);
+                    }
+                    else {
+                        db.CodeFirst.InitTables(entityTypes);
+                    }
+
+                    tran.CommitTran();
+                }
+
+            }
+            catch (Exception ex) {
+                LogHelper.Info($"鍙戠敓浜嗗紓甯�);
+                return "鍒濆鍖栨暟鎹簱閿欒" + ex.Message;
+            }
+
+            return "鎴愬姛";
+        }
+
+        /// <summary>
+        /// DEBUG锛氭彃鍏ヨ揣浣嶃�瀹瑰櫒銆佽揣鍝佷俊鎭�+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("InsertLocCntrCg")]
+        public string InsertLocCntrCg(LocCntrCg locCntrCg) {
+            var db = new SqlHelper<object>().GetInstance();
+
+            try {
+
+
+                using (var tran = db.UseTran()) {
+                    LogHelper.Info("LogCntrCg锛� + JsonConvert.SerializeObject(locCntrCg));
+                    if (string.IsNullOrEmpty(locCntrCg.LocCode)) return "";
+
+                    var loc = db.Queryable<TN_Location>().First(a => a.S_CODE == locCntrCg.LocCode);
+                    if (loc == null) {
+                        var newLoc = new TN_Location {
+                            S_CODE = locCntrCg.LocCode,
+                            S_AREA_CODE = locCntrCg.LocArea ?? ""
+                        };
+
+                        if (db.Insertable<TN_Location>(newLoc).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            LogHelper.Info($"鎻掑叆浣嶇疆{locCntrCg.LocCode}澶辫触");
+                            return "鎻掑叆澶辫触";
+                        }
+
+                        loc = newLoc;
+                    }
+
+                    if (string.IsNullOrEmpty(locCntrCg.CntrCode)) {
+                        LogHelper.Info("瀹瑰櫒鍙蜂负绌猴紝涓嶅啀璇诲彇鍚庨潰鐨勬暟鎹�);
+                        return "";
+                    }
+
+                    var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == locCntrCg.LocCode
+                        && a.S_CNTR_CODE == locCntrCg.CntrCode);
+
+                    if (locCntrRel == null) {
+                        var newLocCntrRel = new TN_Loc_Container {
+                            S_LOC_CODE = locCntrCg.LocCode,
+                            S_CNTR_CODE = locCntrCg.CntrCode,
+                            S_CNTR_TYPE = locCntrCg.CntrType ?? ""
+                        };
+
+                        loc.N_CURRENT_NUM = 1;
+
+                        if (db.Insertable<TN_Loc_Container>(newLocCntrRel).ExecuteCommand() <= 0
+                            && db.Updateable<TN_Location>(loc).UpdateColumns(c => c.N_CURRENT_NUM).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            LogHelper.Info($"鎻掑叆浣嶇疆鎵樼洏鍏崇郴{locCntrCg.LocCode}-{locCntrCg.CntrCode}澶辫触");
+                            return "鎻掑叆澶辫触";
+                        }
+                    }
+
+                    if (string.IsNullOrEmpty(locCntrCg.ItemCode)) {
+                        LogHelper.Info("鐗╂枡鍙蜂负绌猴紝涓嶅啀璇诲彇鍚庨潰鐨勬暟鎹�);
+                        return "";
+                    }
+
+                    var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == locCntrCg.CntrCode
+                        && a.S_ITEM_CODE == locCntrCg.ItemCode);
+                    if (cgDetail == null) {
+                        var locList = new List<TN_CG_Detail>();
+                        locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_ITEM_CODE = locCntrCg.ItemCode, S_BATCH_NO = locCntrCg.BatchNo ?? "" });
+                        if (db.Insertable<TN_CG_Detail>(locList).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            LogHelper.Info($"鎻掑叆鎵樼洏鐗╂枡鍏崇郴{locCntrCg.CntrCode}-{locCntrCg}澶辫触");
+                            return "鎻掑叆澶辫触";
+                        }
+                    }
+                    tran.CommitTran();
+                }
+
+                return "鎻掑叆鏁版嵁鎴愬姛";
+
+            }
+            catch (Exception ex) {
+                return $"Error reading CSV file: {ex.Message}";
+            }
+        }
+    }
+
+    /// <summary>
+    /// 妯℃嫙 AGV 浼犻�淇″彿锛岀敤浜庢洿鏀逛换鍔$姸鎬�+    /// </summary>
+    public class UpdateTaskState {
+        /// <summary>
+        /// 浠诲姟ID
+        /// </summary>
+        public string TaskID { set; get; }
+        /// <summary>
+        /// AGV 灏忚溅鍙�+        /// </summary>
+        public string ForkliftNo { set; get; }
+        /// <summary>
+        /// AGV 涓嬩竴涓姸鎬�+        /// </summary>
+        public int NextState { set; get; }
+    }
+
+    public class CoverInfo {
+        public bool IsCover { set; get; } = false;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public class ReturnResults {
+        public List<ReturnResult> ResultList { set; get; }
+    }
+
+    public class LocCntrCg {
+        public string Note { get; set; } // 浠呯敤浜庡娉�+
+        public string LocCode { get; set; }
+        public string LocArea { get; set; }
+        public string CntrCode { get; set; }
+        public string CntrType { get; set; }
+        public string ItemCode { get; set; }
+        public string BatchNo { get; set; }
+    }
+}
diff --git a/Controllers/ErpController.cs b/api/ErpController.cs
similarity index 75%
rename from Controllers/ErpController.cs
rename to api/ErpController.cs
index 7607f1f..1e46eb3 100644
--- a/Controllers/ErpController.cs
+++ b/api/ErpController.cs
@@ -1,11 +1,10 @@
 锘縰sing System;
-using HH.WCS.Mobox3.DSZSH.AppStart;
 using Newtonsoft.Json;
 using System.Collections.Generic;
 using System.Web.Http;
 
 
-namespace HH.WCS.Mobox3.DSZSH.Controllers {
+namespace HH.WCS.Mobox3.DSZSH.api {
     /// <summary>
     /// ERP 璋冪敤鐨勬帴鍙�     /// </summary>
diff --git a/Controllers/MesController.cs b/api/MesController.cs
similarity index 77%
rename from Controllers/MesController.cs
rename to api/MesController.cs
index 372a63b..dc8d3c2 100644
--- a/Controllers/MesController.cs
+++ b/api/MesController.cs
@@ -5,9 +5,7 @@
 using System.Threading.Tasks;
 using System.Web.Http;
 
-using HH.WCS.Mobox3.DSZSH.Services;
-
-namespace HH.WCS.Mobox3.DSZSH.Controllers {
+namespace HH.WCS.Mobox3.DSZSH.api {
     /// <summary>
     /// MES 璋冪敤鐨勬帴鍙�     /// </summary>
diff --git a/Controllers/MoboxController.cs b/api/MoboxController.cs
similarity index 77%
rename from Controllers/MoboxController.cs
rename to api/MoboxController.cs
index e50687c..a309518 100644
--- a/Controllers/MoboxController.cs
+++ b/api/MoboxController.cs
@@ -1,23 +1,18 @@
 锘縰sing System.Web.Http;
 
-using HH.WCS.Mobox3.DSZSH.Consts;
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
-using HH.WCS.Mobox3.DSZSH.Services;
+using HH.WCS.Mobox3.DSZSH.models;
 
 using Newtonsoft.Json;
 
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
+using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
+using static HH.WCS.Mobox3.DSZSH.api.OtherModel;
 
-namespace HH.WCS.Mobox3.DSZSH.Controllers {
+namespace HH.WCS.Mobox3.DSZSH.api {
     /// <summary>
     /// Mobox3 璋冪敤锛岃剼鏈腑璋冪敤锛堝寘鎷�PDA 鐨勬帴鍙o級
     /// </summary>
     [RoutePrefix("api")]
     public class MoboxController : ApiController {
-
-        #region PDA 鎺ュ彛
         /// <summary>
         /// 濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)
         /// </summary>
@@ -27,7 +22,7 @@
         [Route("goodpack-offline")]
         public SimpleResult GoodpackOffline(GoodpackOfflineInfo model) {
             LogHelper.InfoApi("濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)", model);
-            return MoboxService.GoodpackOffline(model);
+            return ApiHelper.GoodpackOffline(model);
         }
 
         ///// <summary>
@@ -40,11 +35,11 @@
 
         //    if (model.CntrType == "鎵樼洏") {
         //        //LogHelper.Info($"瑙﹀彂API锛氱┖鎵樼粦瀹�" + JsonConvert.SerializeObject(model), "API");
-        //        return MoboxService.EmptyBindPallet(model);
+        //        return ApiHelper.EmptyBindPallet(model);
         //    }
         //    else if (model.CntrType == "濂借繍绠�) {
         //        //LogHelper.Info($"瑙﹀彂API锛氱┖绠辩粦瀹�" + JsonConvert.SerializeObject(model), "API");
-        //        return MoboxService.EmptyBindGoodpack(model);
+        //        return ApiHelper.EmptyBindGoodpack(model);
         //    }
         //    else {
         //        return BuildSimpleResult(-1, $"涓嶅悎娉曠殑瀹瑰櫒绫诲瀷锛�{model.CntrType}'");
@@ -62,13 +57,13 @@
             LogHelper.InfoApi("绌烘墭/绌虹鍏ュ簱", model);
 
             if (model.CntrType == "鎵樼洏") {
-                return MoboxService.EmptyInboundPallet(model);
+                return ApiHelper.EmptyInboundPallet(model);
             }
             else if (model.CntrType == "濂借繍绠�) {
-                return MoboxService.EmptyInboundGoodpack(model);
+                return ApiHelper.EmptyInboundGoodpack(model);
             }
             else {
-                return BuildSimpleResult(-1, $"瀹瑰櫒绫诲瀷 '{model.CntrType}' 涓嶅悎娉曪細搴斾负 '鎵樼洏' 鎴�'濂借繍绠�");
+                return NewSimpleResult(-1, $"瀹瑰櫒绫诲瀷 '{model.CntrType}' 涓嶅悎娉曪細搴斾负 '鎵樼洏' 鎴�'濂借繍绠�");
             }
         }
 
@@ -87,14 +82,14 @@
 
         //    if (locCntrRel.S_CNTR_TYPE == "鎵樼洏") {
 
-        //        return MoboxService.EmptyOnlinePallet(new EmptyOnlinePalletInfo {
+        //        return ApiHelper.EmptyOnlinePallet(new EmptyOnlinePalletInfo {
         //            CntId = locCntrRel.S_CNTR_CODE,
         //            EndLoc = model.EndLoc
         //        });
         //    }
         //    else if (locCntrRel.S_CNTR_TYPE == "濂借繍绠�) {
 
-        //        return MoboxService.EmptyOnlineGoodpack(new EmptyOnlineGoodpackInfo {
+        //        return ApiHelper.EmptyOnlineGoodpack(new EmptyOnlineGoodpackInfo {
         //            CntId = locCntrRel.S_CNTR_CODE,
         //            EndLoc = model.EndLoc
         //        });
@@ -112,7 +107,7 @@
         [HttpPost]
         [Route("empty-online-pallet")]
         public SimpleResult EmptyOnlinePallet(EmptyOnlinePalletInfo model) {
-            return MoboxService.EmptyOnlinePallet(model);
+            return ApiHelper.EmptyOnlinePallet(model);
         }
 
         /// <summary>
@@ -123,7 +118,7 @@
         [HttpPost]
         [Route("empty-online-goodpack")]
         public SimpleResult EmptyOnlineGoodpack(EmptyOnlineGoodpackInfo model) {
-            return MoboxService.EmptyOnlineGoodpack(model);
+            return ApiHelper.EmptyOnlineGoodpack(model);
         }
 
         ///// <summary>
@@ -137,10 +132,10 @@
         //    LogHelper.InfoApi("鍚堟牸鍥炲簱/涓嶅悎鏍肩Щ搴�, model);
 
         //    if (model.Qualified) {
-        //        return MoboxService.QualifiedBack(model);
+        //        return ApiHelper.QualifiedBack(model);
         //    }
         //    else {
-        //        return MoboxService.UnqualifiedShift(model);
+        //        return ApiHelper.UnqualifiedShift(model);
         //    }
         //}
 
@@ -151,7 +146,7 @@
         [HttpPost]
         [Route("qualified-back")]
         public SimpleResult QualifiedBack(QualifiedBackInfo model) {
-            return MoboxService.QualifiedBack(model);
+            return ApiHelper.QualifiedBack(model);
         }
 
         /// <summary>   
@@ -161,7 +156,7 @@
         [HttpPost]
         [Route("unqualified-shift")]
         public SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
-            return MoboxService.UnqualifiedShift(model);
+            return ApiHelper.UnqualifiedShift(model);
         }
 
         /// <summary>
@@ -172,7 +167,7 @@
         [HttpPost]
         [Route("rest-back")]
         public SimpleResult RestBack(RestBackInfo model) {
-            return MoboxService.RestBack(model);
+            return ApiHelper.RestBack(model);
         }
 
         /// <summary>
@@ -186,15 +181,13 @@
             LogHelper.InfoApi("鎴愬搧鑳跺嚭搴�PDA)", model);
 
             if (model.ForcedOut) {
-                return MoboxService.FinishedOutboundForce(model);
+                return ApiHelper.FinishedOutboundForce(model);
             }
             else {
-                return MoboxService.FinishedOutbound(model);
+                return ApiHelper.FinishedOutbound(model);
             }
         }
-        #endregion
 
-        #region Mobox 鎺ュ彛
         /// <summary>
         /// 鎶芥-鍒涘缓鎶芥鍗�WMS)
         /// </summary>
@@ -203,7 +196,7 @@
         [HttpPost]
         [Route("create-check-order")]
         public SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
-            return MoboxService.CreateCheckOrder(model);
+            return ApiHelper.CreateCheckOrder(model);
         }
 
         /// <summary>
@@ -214,8 +207,7 @@
         [HttpPost]
         [Route("shift-storage")]
         public SimpleResult CreateShiftOrder(CreateShiftOrderInfo model) {
-            return MoboxService.CreateShiftOrder(model);
+            return ApiHelper.CreateShiftOrder(model);
         }
-        #endregion
     }
 }
diff --git a/Controllers/WmsController.cs b/api/WMSController.cs
similarity index 61%
rename from Controllers/WmsController.cs
rename to api/WMSController.cs
index 5ecedca..6a3ecb7 100644
--- a/Controllers/WmsController.cs
+++ b/api/WMSController.cs
@@ -1,14 +1,10 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.AppStart;
-using HH.WCS.Mobox3.DSZSH.Services;
-
-using Newtonsoft.Json;
+锘縰sing Newtonsoft.Json;
 using System.Collections.Generic;
 using System.Web.Http;
-using static HH.WCS.Mobox3.DSZSH.Dtos.Request.WmsRequest;
 
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.WmsResponse;
+using static HH.WCS.Mobox3.DSZSH.api.OtherModel;
 
-namespace HH.WCS.Mobox3.DSZSH.Controllers
+namespace HH.WCS.Mobox3.DSZSH.api
 {
     /// <summary>
     /// 绗笁鏂硅皟鐢ㄧ殑鎺ュ彛
@@ -23,7 +19,7 @@
         [HttpPost]
         //[Route("WMS/CgInfoSync")]
         public WmsResult CgInfoSync(CgInfoSyncInfo model) {
-            return WmsService.CgInfoSync(model);
+            return ApiHelper.CgInfoSync(model);
         }
     }
 }
diff --git a/core/Monitor.cs b/core/Monitor.cs
new file mode 100644
index 0000000..0dce8c5
--- /dev/null
+++ b/core/Monitor.cs
@@ -0,0 +1,395 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.util;
+using HH.WCS.Mobox3.DSZSH.wms;
+using Newtonsoft.Json;
+
+namespace HH.WCS.Mobox3.DSZSH.core {
+    public class Monitor {
+        public static void CheckOutboundOrder() {
+            var taskName = TaskName.鎴愬搧鑳跺嚭搴�
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+
+            try {
+                var orderList = db.Queryable<TN_Outbound_Order>()
+                    .Where(c => c.N_B_STATE == 1)
+                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
+                    .ToList();
+
+                if (orderList.Count == 0) {
+                    LogHelper.Info("杞--鍑哄簱--鏆傛棤寰呮墽琛岀殑Order");
+                    return;
+                }
+
+                var detailList = new List<TN_Outbound_Detail>();
+                foreach (var order in orderList) {
+                    var doingCount = db.Queryable<TN_Outbound_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�+                    var allCount = db.Queryable<TN_Outbound_Detail>()
+                        .Count(d => d.S_OO_NO == order.S_NO);
+                    LogHelper.Info($"杞--鍑哄簱--缁熻鍑哄簱鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
+
+                    if (doingCount == allCount) {
+                        order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
+                        db.Updateable<TN_Outbound_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                        continue;
+                    }
+
+                    var lastDetail = db.Queryable<TN_Outbound_Detail>()
+                        .Where(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == 2) // TODO 鎴栬�鏀规垚鏌ask
+                        .First();
+                    if (lastDetail != null) {
+                        LogHelper.Info($"杞--鍑哄簱--鍑哄簱鍗�{order.S_NO}'涓婁竴涓换鍔′粛鍦ㄨ繘琛屼腑锛� + JsonConvert.SerializeObject(lastDetail));
+                        continue;
+                    }
+
+                    var outboundDetail = db.Queryable<TN_Outbound_Detail>()
+                        .Where(a => a.S_OO_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�+                        .First();
+                    if (outboundDetail != null) {
+                        LogHelper.Info($"杞--鍑哄簱--");
+                        continue;
+                    }
+
+                    detailList.Add(outboundDetail);
+                }
+
+                if (detailList.Count == 0) {
+                    return;
+                }
+
+                var startLocList = new List<TN_Location>();
+                var endLocList = new List<TN_Location>();
+
+                var taskList = new List<TN_Task>();
+
+                foreach (var detail in detailList) {
+                    var startLoc = db.Queryable<TN_Location>()
+                        .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE)
+                        .Where((l, c) => c.S_CNTR_CODE == detail.S_CNTR_CODE)
+                        .First();
+
+                    if (startLoc == null) {
+                        LogHelper.Info($"杞--鍑哄簱锛氭病鏈夋壘鍒板悎閫傜殑璧风偣璐т綅锛�);
+                        continue;
+                    }
+
+                    var endLoc = db.Queryable<TN_Location>()
+                        .Where(a => a.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();
+
+                    if (endLoc == null) {
+                        LogHelper.Info($"杞--鍑哄簱锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛丼_NO涓�'{detail.S_OO_NO}'锛岃姹侫rea涓�'{detail.S_END_AREA}'");
+                        continue;
+                    }
+
+                    detail.N_B_STATE = 2;
+
+                    var cntId = detail.S_CNTR_CODE;
+                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                    LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                    LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                    using (var tran = db.Ado.UseTran()) {
+                        if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            LogHelper.Info($"杞--鍑哄簱--淇敼鏄庣粏琛ㄧ姸鎬佷负瀹屾垚澶辫触锛�);
+                        }
+
+                        if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        tran.CommitTran();
+                        info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        continue;
+                    }
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.InfoEx(ex);
+            }
+        }
+
+        public static void CheckCheckOrder() {
+            var taskName = TaskName.鎶芥_鍑哄簱;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var orderList = db.Queryable<TN_Check_Order>()
+                    .Where(c => c.N_B_STATE == 1)
+                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
+                    .ToList();
+
+                if (orderList.Count == 0) {
+                    LogHelper.Info($"杞--{taskName}--鏆傛棤寰呮墽琛岀殑{taskName}鍗�);
+                    return;
+                }
+
+                var detailList = new List<TN_Check_Detail>();
+                foreach (var order in orderList) {
+                    var doingCount = db.Queryable<TN_Check_Detail>()
+                        .Count(d => d.S_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�+                    var allCount = db.Queryable<TN_Check_Detail>()
+                        .Count(d => d.S_NO == order.S_NO);
+                    LogHelper.Info($"杞--{taskName}--缁熻{taskName}鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
+
+                    if (doingCount == allCount) {
+                        order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
+                        db.Updateable<TN_Check_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                        continue;
+                    }
+
+                    var checkDetailList = db.Queryable<TN_Check_Detail>()
+                        .Where(a => a.S_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�+                        .ToList();
+
+                    if (checkDetailList.Count == 0) {
+                        LogHelper.Info($"杞--");
+                        continue;
+                    }
+
+                    foreach (var checkDetail in checkDetailList) {
+                        detailList.Add(checkDetail);
+                    }
+                }
+
+                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)
+                        .First();
+
+                    if (startLoc == null) {
+                        LogHelper.Info($"杞--{taskName}锛氭病鏈夋壘鍒板悎閫傜殑璧风偣璐т綅锛�);
+                        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();
+
+                    if (endLoc == null) {
+                        LogHelper.Info($"杞--{taskName}锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛�);
+                        continue;
+                    }
+
+                    detail.N_B_STATE = 2;
+
+                    var cntId = detail.S_CNTR_CODE;
+                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                    LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                    LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                    using (var tran = db.Ado.UseTran()) {
+                        if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            LogHelper.Info($"杞--{taskName}锛氫慨鏀箋taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触锛�);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        tran.CommitTran();
+                        info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        continue;
+                    }
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.InfoEx(ex);
+            }
+        }
+
+        public static void CheckShiftOrder() {
+            var taskName = TaskName.绉诲簱;
+            var db = new SqlHelper<object>().GetInstance();
+            var info = "";
+            try {
+                var orderList = db.Queryable<TN_Shift_Order>()
+                    .Where(c => c.N_B_STATE == 1)
+                    .OrderBy(c => c.T_CREATE, SqlSugar.OrderByType.Asc)
+                    .ToList();
+
+                if (orderList.Count == 0) {
+                    LogHelper.Info($"杞--{taskName}--鏆傛棤寰呮墽琛岀殑{taskName}鍗�);
+                    return;
+                }
+
+                var detailList = new List<TN_Shift_Detail>();
+                foreach (var order in orderList) {
+                    var doingCount = db.Queryable<TN_Shift_Detail>()
+                        .Count(d => d.S_NO == order.S_NO && d.N_B_STATE >= 2); // 鎵ц涓�+                    var allCount = db.Queryable<TN_Shift_Detail>()
+                        .Count(d => d.S_NO == order.S_NO);
+                    LogHelper.Info($"杞--{taskName}--缁熻{taskName}鍗�{order.S_NO}'浠诲姟宸蹭笅鍙戯細{doingCount}/{allCount}");
+
+                    if (doingCount == allCount) {
+                        order.N_B_STATE = 2; // 鎵�湁浠诲姟閮藉凡鎵ц
+                        db.Updateable<TN_Shift_Order>(order).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                        continue;
+                    }
+
+                    var checkDetailList = db.Queryable<TN_Shift_Detail>()
+                        .Where(a => a.S_NO == order.S_NO && a.N_B_STATE == 1) // 宸蹭笅鍙�+                        .ToList();
+
+                    if (checkDetailList.Count == 0) {
+                        LogHelper.Info($"杞--");
+                        continue;
+                    }
+
+                    foreach (var checkDetail in checkDetailList) {
+                        detailList.Add(checkDetail);
+                    }
+                }
+
+                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)
+                        .First();
+
+                    if (startLoc == null) {
+                        LogHelper.Info($"杞--{taskName}锛氭病鏈夋壘鍒板悎閫傜殑璧风偣璐т綅锛�);
+                        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();
+
+                    if (endLoc == null) {
+                        LogHelper.Info($"杞--{taskName}锛氭病鏈夋壘鍒板悎閫傜殑缁堢偣璐т綅锛�);
+                        continue;
+                    }
+
+                    detail.N_B_STATE = 2;
+
+                    var cntId = detail.S_CNTR_CODE;
+                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
+
+                    LocationHelper.LockLoc(ref startLoc, 1); // 璧风偣鍑哄簱閿�+                    LocationHelper.LockLoc(ref endLoc, 2); // 缁堢偣鍏ュ簱閿�+
+                    using (var tran = db.Ado.UseTran()) {
+                        if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            LogHelper.Info($"杞--{taskName}锛氫慨鏀箋taskName}鍗曟槑缁嗚〃鐘舵�涓哄畬鎴�-澶辫触锛�);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
+                            it.N_LOCK_STATE,
+                            it.S_LOCK_STATE,
+                            it.S_LOCK_OP,
+                            it.T_MODIFY
+                        }).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
+                            tran.RollbackTran();
+                            info = $"鐢熸垚 {taskName} 澶辫触锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                            LogHelper.Info(info);
+                            continue;
+                        }
+
+                        tran.CommitTran();
+                        info = $"鐢熸垚 {taskName} 鎴愬姛锛屽鍣ㄥ彿 {cntId} 锛岃捣鐐�{startLoc.S_CODE} 锛岀粓鐐硅揣浣�{endLoc.S_CODE}";
+                        LogHelper.Info(info);
+                        continue;
+                    }
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.InfoEx(ex);
+            }
+        }
+    }
+}
diff --git a/core/WCSCore.cs b/core/WCSCore.cs
new file mode 100644
index 0000000..95eff3f
--- /dev/null
+++ b/core/WCSCore.cs
@@ -0,0 +1,284 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using HH.WCS.Mobox3.DSZSH.device;
+
+using HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.process;
+using HH.WCS.Mobox3.DSZSH.util;
+using HH.WCS.Mobox3.DSZSH.wms;
+
+using Newtonsoft.Json;
+
+using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
+
+
+namespace HH.WCS.Mobox3.DSZSH.core {
+    public class WCSCore {
+        public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) {
+            var result = new ReturnResult();
+            try {
+                switch (model.state) {
+                    case 1023:
+                        break;
+                    case 1025:
+                        break;
+                    case 1012:
+                        break;
+                    case 1004:
+                        break;
+                    case 1103:
+                        break;
+                    default:
+                        // AGV 鎵ц浠诲姟鐨勯�杈戝鐞�+                        if (!AgvTaskProcessOk(model)) {
+                            // 鎵ц涓峅K锛岃鏄庢病鏈夋壘鍒颁换鍔�+                            result.ResultCode = 1;
+                            result.ResultMsg = $"鏍规嵁Model.No鏈壘鍒板搴旂殑浠诲姟锛寋model.task_no}";
+                            LogHelper.Info(result.ResultMsg, "API");
+                            return result;
+                        }
+                        break;
+                }
+
+                result.ResultCode = 0;
+                result.ResultMsg = "success";
+                LogHelper.Info(result.ResultMsg, "API");
+                return result;
+            }
+            catch (Exception ex) {
+                result.ResultCode = -1;
+                result.ResultMsg = $"鍙戠敓浜嗗紓甯革細+{ex.Message}";
+                LogHelper.Info(result.ResultMsg, "Error");
+                return result;
+            }
+
+        }
+
+        /// <summary>
+        /// 鎵ц AGV 浠诲姟锛屾煡璇笉鍒颁换鍔¤繑鍥�<see langword="false"/>
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        private static bool AgvTaskProcessOk(AgvTaskState model) {
+            var TN_Task = WCSHelper.GetTask(model.task_no); // 鏍规嵁褰撳墠model缂栧彿鏌ヨ浠诲姟
+            if (TN_Task == null) { return false; }
+
+            if (model.state > 7) {
+                //瀹夊叏璇锋眰绛�+                TaskProcess.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
+                return true;
+            }
+
+            // AGV 浠诲姟 134562(7) 鐘舵�澶勭悊
+            switch (model.state) {
+                case 1: // 鎵ц
+                    WCSHelper.Begin(TN_Task, model.forklift_no); // 宸叉帹閫佺殑浠诲姟鐨勭姸鎬佹敼鎴愭墽琛�+                    break;
+                case 3: // 寮�鍙栬揣
+                    WCSHelper.UpdateStatus(TN_Task, "寮�鍙栬揣"); // 浠诲姟鐘舵�鏀规垚寮�鍙栬揣
+                    break;
+                case 4: // 鍙栬揣瀹屾垚
+                    WCSHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚"); // 浠诲姟鐘舵�鏀规垚鍙栬揣瀹屾垚
+                    TaskProcess.OperateStatus(TN_Task, 4); // 璧风偣瀹瑰櫒璐т綅瑙g粦,瑙i攣璧风偣
+
+                    if (TN_Task.S_TYPE == TaskName.鎴愬搧鑳跺嚭搴� {
+                        var nextOutboundTask = Task.Run(() => {
+                            UpdateOutboundTaskState(3);
+                        });
+                    }
+
+                    break;
+                case 5: // 寮�鍗歌揣
+                    WCSHelper.UpdateStatus(TN_Task, "寮�鍗歌揣"); // 浠诲姟鐘舵�鏀规垚寮�鍗歌揣
+                    break;
+                case 6: // 鍗歌揣瀹屾垚
+                    WCSHelper.UpdateStatus(TN_Task, "鍗歌揣瀹屾垚"); // 浠诲姟鐘舵�鏀规垚鍗歌揣瀹屾垚
+                    TaskProcess.OperateStatus(TN_Task, 6); // 缁堢偣瀹瑰櫒璐т綅缁戝畾,瑙i攣缁堢偣
+                    break;
+                case 2: // 瀹屾垚
+                    WCSHelper.End(TN_Task); // 浠诲姟鐘舵�鏀规垚缁撴潫
+
+                    if (TN_Task.S_TYPE == TaskName.鎶芥_鍑哄簱) {
+                        var checkCompleteTask = Task.Run(() => {
+                            UpdateCheckTaskState(3);
+                        });
+                    }
+
+                    break;
+                case 7: // 寮傚父
+                    TaskProcess.OperateStatus(TN_Task, 7); // 寮傚父澶勭悊
+                    WCSHelper.Fail(TN_Task); // 浠诲姟鐘舵�鏀规垚閿欒
+                    break;
+            }
+
+            // 灏咥GV鎵ц鐘舵�锛屽姞鍏N_Task_Action琛ㄤ腑
+            WCSHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data);
+            //璋冪敤绗笁鏂规帴鍙o紙濡傛灉鏈夛級TaskProcess.ReportStatus锛屾坊鍔犱换鍔″姩浣滃叧绯昏〃
+
+            return true;
+        }
+
+        public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
+            var gzResult = new ReturnResult();
+            var db = new SqlHelper<object>().GetInstance();
+            ModbusHelper.Relink();
+
+            try {
+
+
+                var prodLineInfo = Settings.ProductionLines[0];
+                var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort);
+                if (!prodLineDevice.LoadDeviceStateOk()) {
+                    LogHelper.Info("鍔犺浇璁惧淇℃伅澶辫触");
+                }
+
+                var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.task_no);
+                if (tn_task == null) {
+                    LogHelper.Info($"浠诲姟鍙�'{model.task_no}' 涓嶅瓨鍦�);
+                }
+
+                // 寰呬慨鏀癸細琛ュ厖涓嶅悓鍒嗘敮AGV鍒ゆ柇
+                if (prodLineDevice.SystemState == 1) {
+                    if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱) {
+                        prodLineDevice.AgvPicking = 1;
+                    }
+                    if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.鎵樼洏_绌烘墭涓婄嚎) {
+                        prodLineDevice.AgvPlacingPallet = 1;
+                    }
+                }
+
+                LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented));
+                return gzResult;
+            }
+            catch (Exception ex) {
+                LogHelper.Info($"鍙戠敓浜嗗紓甯革細{ex.Message}");
+                return gzResult;
+            }
+        }
+
+        public static void UpdateOutboundTaskState(int spotStateCode) {
+
+            var db = new SqlHelper<object>().GetInstance();
+
+            var detail = db.Queryable<TN_Outbound_Detail>()
+                .First(d => d.N_B_STATE == 2);
+
+            if (detail == null) {
+                LogHelper.Info("鍑哄簱--AGV鍙栬揣--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒");
+                return;
+            }
+
+            using (var tran = db.Ado.UseTran()) {
+                detail.N_B_STATE = spotStateCode;
+                if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    LogHelper.Info("鍑哄簱--AGV鍙栬揣锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
+                    return;
+                }
+
+                var finishedCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO && d.N_B_STATE == 3);
+                var allCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO);
+
+                LogHelper.Info($"鍑哄簱--AGV鍙栬揣--缁熻浠诲姟宸插畬鎴愶細{finishedCount} / {allCount}");
+
+                if (finishedCount == allCount) { // 褰撳墠鍑哄簱鍗曚笅鐨勬墍鏈夋槑缁嗗崟锛屼换鍔¢兘宸茬粡瀹屾垚
+
+                    if (db.Updateable<TN_Outbound_Order>().SetColumns(it => it.N_B_STATE == 3)
+                        .Where(it => it.S_NO == detail.S_OO_NO)
+                        .ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        LogHelper.Info("鍑哄簱--AGV鍙栬揣--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
+                        return;
+                    }
+                }
+
+                tran.CommitTran();
+            }
+        }
+
+        public static void UpdateCheckTaskState(int spotStateCode) {
+            var db = new SqlHelper<object>().GetInstance();
+
+            var detail = db.Queryable<TN_Check_Detail>()
+                .First(d => d.N_B_STATE == 2);
+
+            if (detail == null) {
+                LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒");
+                return;
+            }
+
+            using (var tran = db.Ado.UseTran()) {
+                detail.N_B_STATE = spotStateCode;
+                if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
+                    return;
+                }
+
+                var finishedCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
+                var allCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO);
+
+                LogHelper.Info($"鎶芥--AGV浠诲姟瀹屾垚锛氱粺璁′换鍔″凡瀹屾垚锛歿finishedCount} / {allCount}");
+
+                if (finishedCount == allCount) { // 褰撳墠order涓嬬殑detail锛屼换鍔¢兘宸茬粡瀹屾垚
+
+                    if (db.Updateable<TN_Check_Order>().SetColumns(it => it.N_B_STATE == 3)
+                        .Where(it => it.S_NO == detail.S_NO)
+                        .ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
+                        return;
+                    }
+                }
+
+                tran.CommitTran();
+            }
+        }
+
+        public static void UpdateShiftTaskState(int spotStateCode) {
+            var db = new SqlHelper<object>().GetInstance();
+
+            var detail = db.Queryable<TN_Shift_Detail>()
+                .First(d => d.N_B_STATE == 2);
+
+            if (detail == null) {
+                LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒");
+                return;
+            }
+
+            detail.N_B_STATE = spotStateCode;
+
+            var finishedCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
+            var allCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO);
+
+            LogHelper.Info($"绉诲簱--AGV浠诲姟瀹屾垚锛氱粺璁′换鍔″凡瀹屾垚锛歿finishedCount} / {allCount}");
+
+            using (var tran = db.Ado.UseTran()) {
+                if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
+                    tran.RollbackTran();
+                    LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
+                    return;
+                }
+
+                if (finishedCount == allCount) { // 褰撳墠order涓嬬殑detail锛屼换鍔¢兘宸茬粡瀹屾垚
+                    if (db.Updateable<TN_Shift_Order>().SetColumns(it => it.N_B_STATE == 3)
+                        .Where(it => it.S_NO == detail.S_NO)
+                        .ExecuteCommand() <= 0) {
+
+                        tran.RollbackTran();
+                        LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�);
+                        return;
+                    }
+                }
+
+                tran.CommitTran();
+            }
+        }
+    }
+}
diff --git a/ServiceCore/DebugCore.cs b/core/WMSCore.cs
similarity index 63%
rename from ServiceCore/DebugCore.cs
rename to core/WMSCore.cs
index 4d44786..11db3fd 100644
--- a/ServiceCore/DebugCore.cs
+++ b/core/WMSCore.cs
@@ -4,8 +4,8 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
-    public class DebugCore {
+namespace HH.WCS.Mobox3.DSZSH.core {
+    public class WMSCore {
 
     }
 }
diff --git a/Devices/ModbusHelper.cs b/device/ModbusHelper.cs
similarity index 99%
rename from Devices/ModbusHelper.cs
rename to device/ModbusHelper.cs
index 8408657..ff631e8 100644
--- a/Devices/ModbusHelper.cs
+++ b/device/ModbusHelper.cs
@@ -5,7 +5,7 @@
 
 using EasyModbus;
 
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
+namespace HH.WCS.Mobox3.DSZSH.device {
     /// <summary>
     /// modbus tcp 鐢ㄧ涓夋柟鐨勫寘
     /// </summary>
diff --git a/Devices/OpcUaHelper.cs b/device/OpcUaHelper.cs
similarity index 100%
rename from Devices/OpcUaHelper.cs
rename to device/OpcUaHelper.cs
diff --git a/Devices/PlcHelper.cs b/device/PlcHelper.cs
similarity index 98%
rename from Devices/PlcHelper.cs
rename to device/PlcHelper.cs
index be02f92..c25ed1d 100644
--- a/Devices/PlcHelper.cs
+++ b/device/PlcHelper.cs
@@ -1,9 +1,10 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.Helpers;
-using System;
+锘縰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
 {
@@ -15,7 +16,6 @@
         }
         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));
diff --git a/Devices/ProductionLineDevice.cs b/device/ProductionLineDevice.cs
similarity index 96%
rename from Devices/ProductionLineDevice.cs
rename to device/ProductionLineDevice.cs
index 29ffb03..d6d6b04 100644
--- a/Devices/ProductionLineDevice.cs
+++ b/device/ProductionLineDevice.cs
@@ -1,10 +1,8 @@
 锘縰sing System;
 
-using HH.WCS.Mobox3.DSZSH.Helpers;
-
 using Newtonsoft.Json;
 
-namespace HH.WCS.Mobox3.DSZSH.Devices {
+namespace HH.WCS.Mobox3.DSZSH.device {
     /// <summary>
     /// 杈撻�绾縋LC璁惧
     /// </summary>
diff --git a/Devices/S7Helper.cs b/device/S7Helper.cs
similarity index 99%
rename from Devices/S7Helper.cs
rename to device/S7Helper.cs
index 492db2c..9d176d9 100644
--- a/Devices/S7Helper.cs
+++ b/device/S7Helper.cs
@@ -1,4 +1,4 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.Controllers;
+锘縰sing HH.WCS.Mobox3.DSZSH.api;
 using Newtonsoft.Json.Linq;
 using S7.Net;
 using S7.Net.Types;
diff --git a/Devices/TcpClient.cs b/device/TcpClient.cs
similarity index 100%
rename from Devices/TcpClient.cs
rename to device/TcpClient.cs
diff --git a/Devices/TcpServer.cs b/device/TcpServer.cs
similarity index 98%
rename from Devices/TcpServer.cs
rename to device/TcpServer.cs
index e1f1fa4..5ee2f16 100644
--- a/Devices/TcpServer.cs
+++ b/device/TcpServer.cs
@@ -1,5 +1,4 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.Dispatch;
-using HH.WCS.Mobox3.DSZSH.AppStart;
+锘縰sing HH.WCS.Mobox3.DSZSH.dispatch;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
diff --git a/Helpers/DeviceProcess.cs b/process/DeviceProcess.cs
similarity index 80%
rename from Helpers/DeviceProcess.cs
rename to process/DeviceProcess.cs
index cb4c322..0aac18c 100644
--- a/Helpers/DeviceProcess.cs
+++ b/process/DeviceProcess.cs
@@ -1,14 +1,12 @@
 锘縰sing HH.WCS.Mobox3.DSZSH.device;
 
-using HH.WCS.Mobox3.DSZSH.Dispatch;
-using HH.WCS.Mobox3.DSZSH.AppStart;
-using HH.WCS.Mobox3.DSZSH.Helper;
+using HH.WCS.Mobox3.DSZSH.dispatch;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading;
 
-namespace HH.WCS.Mobox3.DSZSH.Helpers
+namespace HH.WCS.Mobox3.DSZSH.process
 {
     /// <summary>
     /// 璁惧淇″彿澶勭悊锛屼富瑕佹槸tcp淇″彿锛屾垜浠仛server琚姩鎺ユ敹淇″彿鏉ュ鐞嗭紝鏍规嵁椤圭洰瀹氬埗鐨�diff --git a/process/TaskProcess.cs b/process/TaskProcess.cs
new file mode 100644
index 0000000..1bb20f5
--- /dev/null
+++ b/process/TaskProcess.cs
@@ -0,0 +1,196 @@
+锘縰sing Newtonsoft.Json;
+using SqlSugar;
+using System.Collections.Generic;
+using System.Linq;
+using System;
+using HH.WCS.Mobox3.DSZSH.dispatch;
+using HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.wms;
+using HH.WCS.Mobox3.DSZSH;
+
+namespace HH.WCS.Mobox3.DSZSH.process {
+    internal class TaskProcess {
+        #region 浠诲姟鐩稿叧
+        //--------------------------------------------------浠诲姟鐩稿叧--------------------------------------------------
+        /// <summary>
+        /// 鍙栬揣鍗歌揣瀹屾垚锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="load"></param>
+        internal static void CacheBitUpdate(TN_Task mst, bool load) {
+            //var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
+            if (load) {
+                Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTR_CODE}");
+                LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTR_CODE}");
+                LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
+            }
+            else {
+                Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岀粓鐐圭粦瀹氬鍣▄mst.S_CNTR_CODE}");
+                LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岀粓鐐圭粦瀹氬鍣▄mst.S_CNTR_CODE}");
+                LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
+            }
+
+        }
+
+        /// <summary>
+        /// 浠诲姟鍙栨秷锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static void CacheBitCancelUpdate(TN_Task mst) {
+            //浠诲姟鍙栨秷锛屽彇璐у畬鎴愬墠鐨勶紝璧风偣鐨刲oadingCount鍜岀粓鐐箄nLoadingCount閮芥竻闄わ紝鍙栬揣瀹屾垚鐨勫彧澶勭悊缁堢偣
+            if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 4)) {
+                //鏍规嵁瀹㈡埛鐜板満瑕佹眰锛屽鏋滃彇璐у畬鎴愪换鍔″け璐ヤ汉宸ユ媺鍒扮粓鐐癸紝鎴戜滑灏卞綋鍗歌揣瀹屾垚澶勭悊锛涘鏋滄槸浜哄伐鎷夎蛋鍒板叾瀹冨尯鍩燂紝鎴戜滑灏辫В閿佺粓鐐癸紝鍒犻櫎鎵樼洏銆�+                //缁堢偣缁戝畾
+                CacheBitUpdate(mst, false);
+                LocationHelper.UnLockLoc(mst.S_END_LOC);
+            }
+            else {
+
+                //璧风偣缁堢偣瑙i攣
+                LocationHelper.UnLockLoc(mst.S_START_LOC);
+                LocationHelper.UnLockLoc(mst.S_END_LOC);
+
+            }
+
+        }
+
+        /// <summary>
+        /// 浠诲姟鐘舵�鏇存柊澶勭悊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="state"></param>
+        internal static void OperateStatus(TN_Task mst, int state) {
+            if (state == 4) {
+                CacheBitUpdate(mst, true);
+            }
+            if (state == 6)//鍗歌揣瀹屾垚
+            {
+                CacheBitUpdate(mst, false);
+            }
+            if (state == 7) {
+                CacheBitCancelUpdate(mst);
+            }
+        }
+
+        /// <summary>
+        /// 瀹夊叏璇锋眰
+        /// </summary>
+        /// <param name="no"></param>
+        /// <param name="state"></param>
+        /// <param name="forkliftNo"></param>
+        /// <param name="extData"></param>
+        internal static void OperateReq(string no, int state, string forkliftNo, string extData = "") {
+            if (state == 1101) {
+                //璇锋眰鍙栬揣锛�+            }
+            if (state == 1102) {
+                //璇锋眰鍗歌揣锛�+                //鏍规嵁缁堢偣鍒ゆ柇锛屾槸cb02鐨勫叆鍙o紝鍒ゆ柇鍐呭瓨涓姸鎬侊紙瑕佺姸鎬佹椂闂达級锛屽厑璁稿嵏璐э紝閫氱煡agv鏀瑰弬鏁�+                var dic = new Dictionary<string, string>();
+                //< Req >< Order No = 'TN2302020002' ParamNo = '18' Param1 = '12' /></ Req >
+                dic.Add("No", no);
+                dic.Add("ParamNo", "8");
+                dic.Add("Param1", "1");
+                NDC.ChangeOrder(dic);
+                //鏀瑰畬鍙傛暟杞﹀瓙灏变細鑷繁鍗歌揣
+            }
+            if (state == 1103) {
+                //澶ч搧妗嗗弶璧颁互鍚庨�鐭ワ紝鎴戜滑瑕侀�鐭ヨ緭閫佺嚎
+            }
+        }
+
+        private static object locLocker = new object();
+
+
+        /// <summary>
+        /// 鎺ㄩ�浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static bool SendTask(TN_Task mst) {
+
+            var result = false;
+            var start = "0"; var end = "0";
+            var taskType = mst.S_TYPE.Trim();
+            if (mst.N_B_STATE == 0) {
+                if (mst.N_SCHEDULE_TYPE == 1)//閫氳繃NDC锛宧osttoagv璋冨害璁惧
+                {
+                    start = LocationHelper.GetAgvSite(mst.S_START_LOC);
+                    end = LocationHelper.GetAgvSite(mst.S_END_LOC);
+
+                    //if (mst.S_TYPE == "绌烘墭涓嬬嚎鍫嗗彔") {
+                    //    end = LocationHelper.GetAgvSite(mst.S_END_LOC, true);
+                    //}
+
+                    LogHelper.Info($"NDC鎺ㄩ�浠诲姟 {mst.S_CODE};" + "start=" + start + "end= " + end);
+                    var startLoc = LocationHelper.GetLoc(mst.S_START_LOC);
+                    var endLoc = LocationHelper.GetLoc(mst.S_END_LOC);
+                    var dic = new List<param>();
+                    dic.Add(new param() { name = "IKey", value = "IKey" });
+                    dic.Add(new param() { name = "From", value = start.ToString() });
+                    dic.Add(new param() { name = "To", value = end.ToString() });
+                    dic.Add(new param() { name = "FUNC", value = startLoc.N_LAYER.ToString() });
+
+                    dic.Add(new param() { name = "Ctype", value = "0" });
+
+
+                    //if (mst.S_TYPE == "浣欐枡涓嬬嚎鍏ュ簱" || mst.S_TYPE == "浜哄伐鎷嗙洏鍏ュ簱") {
+                    //    dic.Add(new param() { name = "DATA", value = "1024" });
+                    //}
+                    //else {
+                    //    dic.Add(new param() { name = "DATA", value = "0" });
+                    //}
+
+                    var res = NDCApi.AddOrderNew(1, 1, mst.S_CODE, dic);//娣诲姞鏂板懡浠�+                    if (res != null && (res.err_code == 0 || res.err_code == 50009)) {
+                        //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
+                        mst.N_B_STATE = 1;
+                        mst.S_B_STATE = TN_Task.GetStateStr(1);
+                        WCSHelper.UpdateStatus(mst);//鏇存柊浠诲姟鐘舵�
+                        result = true;
+                        LogHelper.Info($"NDC鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
+                    }
+                    else {
+                        LogHelper.Info($"NDC鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};Res:" + JsonConvert.SerializeObject(res));
+                    }
+                }
+                else if (mst.N_SCHEDULE_TYPE == 5)//閫氳繃鏉ゥ璋冨害璁惧 
+                {
+                    //璋冪涓夋柟鎺ュ彛
+                    var model = new HanAo.TaskInfoModel {
+                        requestPk = mst.S_CODE,
+                        frmPos = mst.S_START_LOC,
+                        toPos = mst.S_END_LOC,
+                        trkType = mst.S_OP_NAME == "鍏ュ簱" ? "1" : "2",
+                        contNo = mst.S_CNTR_CODE
+                    };
+                    if (HanAo.CreateOrder(model)) {
+                        mst.N_B_STATE = 1;
+                        WCSHelper.UpdateStatus(mst);
+                        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + model.frmPos + "end= " + model.toPos);
+                    }
+                    else {
+                        LogHelper.Info($"鏉ゥ鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(model));
+                    }
+                }
+                else if (mst.N_SCHEDULE_TYPE == 3) //閫氳繃鍥借嚜璋冨害璁惧
+                {
+                    var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = mst.S_START_LOC, dst = mst.S_END_LOC }), "p2p");
+                    if (code > 0) {
+                        //鏇存柊浠诲姟鐘舵�
+                        mst.N_B_STATE = 1;
+                        mst.S_EQ_TASK_CODE = code.ToString();
+                        WCSHelper.UpdateStatus(mst);
+                        WCSHelper.UpdateEQNo(mst);
+                        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟鎴愬姛 {mst.S_CODE};" + "start=" + mst.S_START_LOC + "end= " + mst.S_END_LOC);
+                    }
+                    else {
+                        LogHelper.Info($"鍥借嚜鎺ㄩ�浠诲姟澶辫触 {mst.S_CODE};" + JsonConvert.SerializeObject(mst));
+                    }
+                }
+
+            }
+            return result;
+        }
+        #endregion
+    }
+}
diff --git a/Helpers/HttpHelper.cs b/util/HttpHelper.cs
similarity index 99%
rename from Helpers/HttpHelper.cs
rename to util/HttpHelper.cs
index 4cb41e4..d509893 100644
--- a/Helpers/HttpHelper.cs
+++ b/util/HttpHelper.cs
@@ -5,7 +5,7 @@
 using System.Net;
 using System.Text;
 
-namespace HH.WCS.Mobox3.DSZSH.AppStart {
+namespace HH.WCS.Mobox3.DSZSH.util {
     public class HttpHelper {
         public string WebPost(string url, string postData, string cotentType = "application/json")
         {
diff --git a/Helpers/LogHelper.cs b/util/LogHelper.cs
similarity index 98%
rename from Helpers/LogHelper.cs
rename to util/LogHelper.cs
index fbf1233..7221e4e 100644
--- a/Helpers/LogHelper.cs
+++ b/util/LogHelper.cs
@@ -13,7 +13,6 @@
     {
         public static Dictionary<string, ILogger> loggers = new Dictionary<string, ILogger>();
 
-        #region 鏍囧噯鏂规硶(Debug/Info/Error)
         public static void Debug(string message, string name = "") {
             ILogger logger = null;
             if (loggers.Keys.Contains(name)) {
@@ -70,7 +69,6 @@
                 logger.Error($"{message}{ex.StackTrace}");
             }
         } 
-        #endregion
 
         #region 鑷畾涔夋柟娉�         public static void InfoEx(Exception ex) {
diff --git a/util/Settings.cs b/util/Settings.cs
new file mode 100644
index 0000000..aee5018
--- /dev/null
+++ b/util/Settings.cs
@@ -0,0 +1,158 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.IO;
+
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace HH.WCS.Mobox3.DSZSH {
+    public class Settings
+    {
+        public static string WebApiUrl { get; set; }
+        public static string NdcApiUrl { get; set; }
+        public static string SqlServer { get; set; }
+        public static string TcpServerIp { get; set; }
+        public static int TcpServerPort { get; set; }
+        public static List<Config.Area> Areas { get; set; }
+        public static List<Config.Task> Tasks { get; set; }
+        public static List<Config.ProductionLine> ProductionLines { get; set; }
+
+        /// <summary>
+        /// 搴撳尯瀛楀吀锛堝姞杞藉悗灏变笉鍙橈級
+        /// </summary>
+        public static Dictionary<string, List<string>> AreaMap { get; set; } = new Dictionary<string, List<string>>();
+
+        /// <summary>
+        /// 浠诲姟瀛楀吀锛堝姞杞藉悗灏变笉鍙橈級
+        /// </summary>
+        public static Dictionary<string, Config.Task> TaskMap { get; set; } = new Dictionary<string, Config.Task>();
+
+        public static void Init() {
+            // 鍔犺浇閰嶇疆鏂囦欢
+            LoadJson();
+
+            // 閽堝 Areas 杩涜杞崲锛氬皢 Config 鐨�List 鍔犺浇鍒�Dict 涓�+            LoadAreas();
+
+            // 閽堝 Tasks 杩涜杞崲
+            LoadTasks();
+        }
+
+        private static void LoadJson() {
+            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 寮�");
+            // JSON 鏂囦欢璺緞
+            string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "./config/config.json");
+
+            try {
+                // 璇诲彇 JSON 鏂囦欢鍐呭
+                string jsonContent = File.ReadAllText(filePath);
+
+                // 鍙嶅簭鍒楀寲涓�Config 瀵硅薄
+                var root = JsonConvert.DeserializeObject<Config.Root>(jsonContent);
+
+                WebApiUrl = root.WebApiUrl;
+                NdcApiUrl = root.NdcApiUrl;
+                SqlServer = root.SqlServer;
+                TcpServerIp = root.TcpServerIp;
+                TcpServerPort = root.TcpServerPort;
+                Areas = root.Areas;
+                Tasks = root.Tasks;
+                ProductionLines = root.ProductionLines;
+
+            }   
+            catch (FileNotFoundException) {
+                LogHelper.Info("JSON 鏂囦欢鏈壘鍒�);
+            }
+            catch (JsonException ex) {
+                LogHelper.Info($"JSON 瑙f瀽閿欒: {ex.Message}");
+            }
+            catch (Exception ex) {
+                LogHelper.Info($"鍙戠敓閿欒: {ex.Message}");
+            }
+            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 瀹屾垚");
+        }
+
+        private static void LoadAreas() {
+            foreach (var area in Areas) {
+                AreaMap.Add(area.Name, area.Codes);
+            }
+        }
+
+        private static void LoadTasks() {
+            foreach (var task in Tasks) {
+                TaskMap.Add(task.Name, task);
+            }
+        }
+    }
+
+    public class Config {
+
+        // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
+        public class Area {
+            public string Name { get; set; }
+            public List<string> Codes { get; set; }
+        }
+
+        public class ProductionLine {
+            public string Id { get; set; }
+            public string Name { get; set; }
+            public string PlcIp { get; set; }
+            public int PlcPort { get; set; }
+            public int SlaveId { get; set; }
+            public List<string> OnLoc { get; set; }
+            public List<string> OffLoc { get; set; }
+        }
+
+        public class Root {
+            public string WebApiUrl { get; set; }
+            public string NdcApiUrl { get; set; }
+            public string SqlServer { get; set; }
+            public string TcpServerIp { get; set; }
+            public int TcpServerPort { get; set; }
+            public List<Area> Areas { get; set; }
+            public List<Task> Tasks { get; set; }
+            public List<ProductionLine> ProductionLines { get; set; }
+        }
+
+        public class Task {
+            public string Name { get; set; }
+            public List<string> StartAreas { get; set; }
+            public List<string> EndAreas { get; set; }
+        }
+    }
+
+    public class AreaName {
+        public const string 鍖呰鍖�= "鍖呰鍖�;
+        public const string 鎿嶄綔鍖�= "鎿嶄綔鍖�;
+
+        public const string 绌烘墭瀛樻斁鍖�= "绌烘墭瀛樻斁鍖�;
+
+        public const string 璐ф灦鍖�= "璐ф灦鍖�;
+        public const string 绌虹瀛樻斁鍖�= "绌虹瀛樻斁鍖�;
+        public const string 婊℃墭瀛樻斁鍖�= "婊℃墭瀛樻斁鍖�;
+        public const string 婊$瀛樻斁鍖�= "婊$瀛樻斁鍖�;
+
+        public const string 浜哄伐_AGV鎺ラ┏鍖�= "浜哄伐-AGV鎺ラ┏鍖�;
+        public const string 绌烘墭鐩樻帴椹冲尯 = "绌烘墭鐩樻帴椹冲尯";
+        public const string 绌虹鎺ラ┏鍖�= "绌虹鎺ラ┏鍖�;
+    }
+
+    public class TaskName {
+        public const string 濂借繍绠盻婊$涓嬬嚎鍏ュ簱 = "濂借繍绠�婊$涓嬬嚎鍏ュ簱";
+        public const string 濂借繍绠盻绌虹涓婄嚎 = "濂借繍绠�绌虹涓婄嚎";
+        public const string 濂借繍绠盻绌虹鍏ュ簱 = "濂借繍绠�绌虹鍏ュ簱";
+        public const string 濂借繍绠盻绌虹缁戝畾 = "濂借繍绠�绌虹缁戝畾";
+        public const string 鎴愬搧鑳跺嚭搴�= "鎴愬搧鑳跺嚭搴�;
+        public const string 鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱 = "鎵樼洏-婊℃墭涓嬬嚎鍏ュ簱";
+        public const string 鎵樼洏_绌烘墭涓婄嚎 = "鎵樼洏-绌烘墭涓婄嚎";
+        public const string 鎵樼洏_绌烘墭鍏ュ簱 = "鎵樼洏-绌烘墭鍏ュ簱";
+        public const string 鎵樼洏_绌烘墭缁戝畾 = "鎵樼洏-绌烘墭缁戝畾";
+        public const string 鎶芥_涓嶅悎鏍肩Щ搴�= "鎶芥-涓嶅悎鏍肩Щ搴�;
+        public const string 鎶芥_鍑哄簱 = "鎶芥-鍑哄簱";
+        public const string 鎶芥_鍚堟牸鍥炲簱 = "鎶芥-鍚堟牸鍥炲簱";
+        public const string 绉诲簱 = "绉诲簱";
+        public const string 灏剧鍥炲簱 = "灏剧鍥炲簱";
+
+    }
+
+}
diff --git a/util/SqlHelper.cs b/util/SqlHelper.cs
new file mode 100644
index 0000000..f0f6028
--- /dev/null
+++ b/util/SqlHelper.cs
@@ -0,0 +1,63 @@
+锘縰sing System;
+using System.Linq;
+
+using SqlSugar;
+
+namespace HH.WCS.Mobox3.DSZSH.util {
+    //https://www.donet5.com/Home/Doc
+    public class SqlHelper<T> where T : class, new() {
+
+        /// <summary>
+        /// 濡傛灉鐢∣racle鏁版嵁闇�鍖匫racle.ManagedDataAccess/21.15.0锛岀幆澧僴etframework 4.62锛屽お鏂颁簡4.8鏈夌殑鏈嶅姟鍣ㄥ畨瑁呬笉涓婂幓
+        /// </summary>
+        /// <param name="url"></param>
+        /// <returns></returns>
+        public SqlSugarClient GetInstance(string url = "") {
+            //鍒涘缓鏁版嵁搴撳璞�+            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() {
+                ConnectionString = string.IsNullOrEmpty(url) ? Settings.SqlServer : url,
+                //ConnectionString = @"Data Source=192.168.1.198\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015",
+                DbType = DbType.SqlServer,
+                //ConnectionString = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=OIMobox)));User Id=system;Password=Am123123;",
+                //DbType = DbType.Oracle,
+                IsAutoCloseConnection = true,
+                InitKeyType = InitKeyType.Attribute//浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�+            });
+
+            //鐩戞帶鎵�湁瓒呰繃1绉掔殑Sql
+            db.Aop.OnLogExecuted = (sql, p) => {
+                //鎵ц鏃堕棿瓒呰繃1绉�+                if (db.Ado.SqlExecutionTime.TotalSeconds > 1) {
+                    Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(p.ToDictionary(it => it.ParameterName, it => it.Value)));
+                    //浠g爜CS鏂囦欢鍚�+                    var fileName = db.Ado.SqlStackTrace.FirstFileName;
+                    //浠g爜琛屾暟
+                    var fileLine = db.Ado.SqlStackTrace.FirstLine;
+                    //鏂规硶鍚�+                    var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
+                }
+                //鐩稿綋浜嶦F鐨�PrintToMiniProfiler
+            };
+
+            //姣忔璁剧疆鏁板�鏃堕兘鍘婚櫎鍓嶅鍚庡绌烘牸
+            db.Aop.DataExecuted = (value, entity) => {
+                entity.EntityColumnInfos.ToList().ForEach(a => {
+                    var pvalue = entity.GetValue(a.PropertyName);
+                    if (pvalue != null && pvalue.GetType() == typeof(String)) {
+                        entity.SetValue(a.PropertyName, pvalue.ToString().Trim());
+                    }
+                });
+            };
+
+            //鎹浆鎹�(ExecuteCommand鎵嶄細鎷︽埅锛屾煡璇笉琛�
+            //db.Aop.DataExecuting = (value, entity) => {
+            //    //var val=entity.EntityColumnInfo
+            //    Console.WriteLine(entity.EntityName);
+            //};
+
+            return db;
+        }
+
+    }
+
+}
diff --git a/Helpers/ContainerHelper.cs b/wms/ContainerHelper.cs
similarity index 95%
rename from Helpers/ContainerHelper.cs
rename to wms/ContainerHelper.cs
index 013be47..9023239 100644
--- a/Helpers/ContainerHelper.cs
+++ b/wms/ContainerHelper.cs
@@ -2,12 +2,12 @@
 using System.Collections.Generic;
 using System.Linq;
 
-using HH.WCS.Mobox3.DSZSH.Helpers;
-using HH.WCS.Mobox3.DSZSH.Models;
+using HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.util;
 
 using Newtonsoft.Json;
 
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
+namespace HH.WCS.Mobox3.DSZSH.wms {
     /// <summary>
     /// 瀹瑰櫒甯姪绫伙紙鍖呭惈瀹瑰櫒-璐у搧鍏崇郴鐨勫鐞嗭級
     /// </summary>
@@ -21,7 +21,7 @@
         /// <returns></returns>
         public static string BindingCG(string cnt, List<string> cGs)
         {
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             var logs = $"瀹瑰櫒锛歿cnt}锛岃揣鍝侊細{JsonConvert.SerializeObject(cGs)}";
             try
             {
@@ -86,7 +86,7 @@
         /// <returns></returns>
         public static string UnBindingCG(string cnt, List<string> cGs)
         {
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             var logs = $"瀹瑰櫒锛歿cnt}锛岃揣鍝侊細{JsonConvert.SerializeObject(cGs)}";
             try
             {
diff --git a/Helpers/LocationHelper.cs b/wms/LocationHelper.cs
similarity index 89%
rename from Helpers/LocationHelper.cs
rename to wms/LocationHelper.cs
index d2d14df..ef584a3 100644
--- a/Helpers/LocationHelper.cs
+++ b/wms/LocationHelper.cs
@@ -2,15 +2,14 @@
 using System.Collections.Generic;
 using System.Linq;
 
-using HH.WCS.Mobox3.DSZSH.Models;
+using HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.util;
 
 using Newtonsoft.Json;
 
 using SqlSugar;
 
-using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
-
-namespace HH.WCS.Mobox3.DSZSH.Helpers {
+namespace HH.WCS.Mobox3.DSZSH.wms {
     /// <summary>
     /// 璐т綅甯姪绫伙紙鍖呭惈璐т綅-瀹瑰櫒鍏崇郴鐨勫鐞嗭級
     /// </summary>
@@ -56,7 +55,7 @@
         /// <returns></returns>
         internal static List<TN_Location> GetAllLocList()
         {
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             return db.Queryable<TN_Location>().ToList();
         }
 
@@ -123,8 +122,31 @@
 
         internal static TN_Location GetLoc(string code)
         {
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             return db.Queryable<TN_Location>().Where(a => a.S_CODE.Trim() == code).First();
+        }
+
+        /// <summary>
+        /// 鍏ュ簱閿佸畾缁堢偣锛屽嚭搴撻攣瀹氳捣鐐�+        /// 浣犲垱寤轰换鍔¢攣瀹氳揣浣嶇殑鏃跺�锛屾妸閿佺殑鏉ユ簮灏辨槸浠诲姟鍙蜂篃鍐欎笂鍘伙紙鍔犻攣鐨勬柟娉曞姞涓弬鏁帮紝鍙┖鐨勫弬鏁帮級锛岃В閿佺殑鏃跺�鎶婃潵婧愮疆绌恒�
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="lockState">1:鍏ュ簱閿併�2:鍑哄簱閿併�2:鍏跺畠閿�/param>
+        /// <param name="lockSource">閿佺殑鏉ユ簮=浠诲姟鍙�/param>
+        /// <returns></returns>
+        public static bool LockLoc(ref TN_Location loc, int lockState, string lockSource = "") {
+            if (loc == null || loc.N_LOCK_STATE != 0) {
+                return false;
+            }
+
+            if (loc != null && loc.N_LOCK_STATE == 0) {
+                loc.N_LOCK_STATE = lockState;
+                loc.S_LOCK_STATE = TN_Location.GetLockStateStr(lockState);
+                loc.S_LOCK_OP = lockSource;
+                loc.T_MODIFY = System.DateTime.Now;
+            }
+
+            return true;
         }
 
         /// <summary>
@@ -140,7 +162,7 @@
         public static bool LockLoc(string loc, int lockState, string lockSource = "")
         {
             var res = false;
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             var model = db.Queryable<TN_Location>().Where(a => a.S_CODE == loc).First();
             LogHelper.Info($"閿佽揣浣峽loc},鐘舵�{lockState},淇℃伅" + JsonConvert.SerializeObject(model));
             if (model != null && model.N_LOCK_STATE == 0)
@@ -165,7 +187,7 @@
         {
             LogHelper.Info("UnLockLoc:" + loc);
             var res = false;
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             var model = db.Queryable<TN_Location>().Where(a => a.S_CODE == loc).First();
             if (model != null)
             {
@@ -191,7 +213,7 @@
         /// <returns></returns>
         public static string UnBindingLoc(string loc, List<string> cntrs)
         {
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             var logs = $"璐т綅锛歿loc}锛屽鍣細{JsonConvert.SerializeObject(cntrs)}";
             try
             {
@@ -264,7 +286,7 @@
         /// <returns></returns>
         public static string BindingLoc(string loc, List<string> cntrs)
         {
-            var db = DbHelper.GetDbClient();
+            var db = new SqlHelper<object>().GetInstance();
             var logs = $"璐т綅锛歿loc}锛屽鍣細{JsonConvert.SerializeObject(cntrs)}";
             try
             {
diff --git a/Helpers/SysHelper.cs b/wms/SYSHelper.cs
similarity index 90%
rename from Helpers/SysHelper.cs
rename to wms/SYSHelper.cs
index b163c71..b48f3fd 100644
--- a/Helpers/SysHelper.cs
+++ b/wms/SYSHelper.cs
@@ -1,19 +1,19 @@
-锘縰sing HH.WCS.Mobox3.DSZSH.Helpers;
+锘縰sing HH.WCS.Mobox3.DSZSH.util;
 
 using SqlSugar;
 
-namespace HH.WCS.Mobox3.DSZSH.Helper {
+namespace HH.WCS.Mobox3.DSZSH.wms {
     /// <summary>
     /// 鐢ㄤ簬鐢熸垚搴忓垪鍙凤紝骞剁鐞嗗簭鍒楀彿鍓嶇紑鐨勫伐鍏风被
     /// </summary>
-    internal class SysHelper
+    internal class SYSHelper
     {
         //浣跨敤闈欐� locker 瀵硅薄瀹炵幇绾跨▼鍚屾
         private static object locker = new object();
         internal static int GetSerialNumber(string snType, string prefix) {
             int result = 0;
             lock (locker) {
-                var db = DbHelper.GetDbClient();
+                var db = new SqlHelper<object>().GetInstance();
                 var sId = db.Queryable<OI_SYS_MAXID>().Where(a => a.CN_S_TYPE.Trim() == snType && a.CN_S_PRE.Trim() == prefix).First();
                 if (sId != null) {
                     sId.CN_N_MAX++;
diff --git a/wms/WCSHelper.cs b/wms/WCSHelper.cs
new file mode 100644
index 0000000..dddbe4a
--- /dev/null
+++ b/wms/WCSHelper.cs
@@ -0,0 +1,224 @@
+锘縰sing HH.WCS.Mobox3.DSZSH.models;
+using HH.WCS.Mobox3.DSZSH.util;
+using HH.WCS.Mobox3.DSZSH;
+
+using Newtonsoft.Json;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.Mobox3.DSZSH.wms {
+    internal class WCSHelper {
+        internal static string GenerateTaskNo() {
+            var id = SYSHelper.GetSerialNumber("浠诲姟鍙�, "TN");
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"TN{date}{id.ToString().PadLeft(4, '0')}";
+        }
+        internal static bool UpdateStatus(TN_Task task, string status) {
+            var res = false;
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            task.S_B_STATE = status;
+            res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
+            return res;
+        }
+        internal static bool UpdateStatus(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;
+            db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand();
+            return res;
+        }
+        internal static bool UpdateEQNo(TN_Task task) {
+            var res = false;
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            task.T_MODIFY = DateTime.Now;
+            db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand();
+            return res;
+        }
+
+        internal static TN_Task GetTask(string no) {
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            var task = db.Queryable<TN_Task>().Where(a => a.S_CODE == no).First();
+            return task;
+        }
+
+        public static TN_Task BuildTask(TN_Location startLoc, TN_Location endLoc, string cntId, string type) {
+            TN_Task TN_Task = new TN_Task() {
+                S_CODE = GenerateTaskNo(),
+                S_START_AREA = startLoc.S_AREA_CODE,
+                S_END_AREA = endLoc.S_AREA_CODE,
+                S_START_LOC = startLoc.S_CODE,
+                S_END_LOC = endLoc.S_CODE,
+                S_TYPE = type,
+                N_PRIORITY = 3, // 鍒濆浼樺厛绾ч粯璁や负锛�
+                N_SCHEDULE_TYPE = 3, // 鍥借嚜
+                N_B_STATE = 0,
+                S_CNTR_CODE = cntId,
+            };
+
+            return TN_Task;
+        }
+
+        public static TN_Task BuildTask(TN_Loc_Container locCntrRel, TN_Location endLoc, string cntId, string type) {
+            var fromLoc = LocationHelper.GetLocation(locCntrRel.S_LOC_CODE);
+
+            TN_Task TN_Task = new TN_Task() {
+                S_CODE = GenerateTaskNo(),
+                S_START_AREA = fromLoc.S_AREA_CODE,
+                S_END_AREA = endLoc.S_AREA_CODE,
+                S_START_LOC = fromLoc.S_CODE,
+                S_END_LOC = endLoc.S_CODE,
+                S_TYPE = type,
+                N_PRIORITY = 3, // 鍒濆浼樺厛绾ч粯璁や负锛�
+                N_SCHEDULE_TYPE = 3, // 鍥借嚜
+                N_B_STATE = 0,
+                S_CNTR_CODE = cntId,
+            };
+
+            return TN_Task;
+        }
+
+        /// <summary>
+        /// 鍒涘缓鎼�浠诲姟
+        /// </summary>
+        /// <param name="no">缂栧彿</param>
+        /// <param name="from">璧风偣</param>
+        /// <param name="to">缁堢偣</param>
+        /// <param name="taskType">浠诲姟绫诲瀷</param>
+        /// <param name="pri">浼樺厛绾�/param>
+        /// <param name="cntrInfo">瀹瑰櫒缂栫爜</param>
+        /// <returns></returns>
+        internal static bool CreateTask(string from, string to, string taskType, int pri, string cntrInfo) {
+            var fromLoc = LocationHelper.GetLocation(from);
+            var endLoc = LocationHelper.GetLocation(to);
+            TN_Task TN_Task = new TN_Task() {
+                S_CODE = GenerateTaskNo(),
+                S_START_AREA = fromLoc.S_AREA_CODE,
+                S_END_AREA = endLoc.S_AREA_CODE,
+                S_START_LOC = from,
+                S_END_LOC = to,
+                S_TYPE = taskType,
+                N_PRIORITY = pri,
+                N_SCHEDULE_TYPE = 1,
+                N_B_STATE = 0,
+                S_CNTR_CODE = cntrInfo,
+            };
+
+            var log = JsonConvert.SerializeObject(TN_Task);
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            var res = db.Insertable(TN_Task).ExecuteCommand() > 0;
+            if (res) {
+                LogHelper.Info($"鎻掑叆浠诲姟鎴愬姛锛寋log}");
+            }
+            else {
+                LogHelper.Info($"鎻掑叆浠诲姟澶辫触锛寋log}");
+            }
+            return res;
+
+        }
+
+        public static bool CreateTask(List<CreateTasks> modes) {
+            if (modes != null && modes.Count > 0) {
+                List<TN_Task> tN_Tasks = new List<TN_Task>();
+
+                foreach (var item in modes) {
+
+                    var fromLoc = LocationHelper.GetLocation(item.from);
+                    var endLoc = LocationHelper.GetLocation(item.to);
+
+                    tN_Tasks.Add(new TN_Task() {
+                        S_CODE = GenerateTaskNo(),
+                        S_START_AREA = fromLoc.S_AREA_CODE,
+                        S_END_AREA = endLoc.S_AREA_CODE,
+                        S_START_LOC = item.from,
+                        S_END_LOC = item.to,
+                        S_TYPE = item.taskType,
+                        N_PRIORITY = item.pri,
+                        N_SCHEDULE_TYPE = 1,
+                        N_B_STATE = 0,
+                        S_CNTR_CODE = item.cntrInfo,
+                    });
+                }
+                var log = JsonConvert.SerializeObject(tN_Tasks);
+                var db = new SqlHelper<object>().GetInstance();
+                var res = db.Insertable<TN_Task>(tN_Tasks).ExecuteCommand() > 0;
+                if (res) {
+                    LogHelper.Info($"鎻掑叆浠诲姟鎴愬姛锛寋log}");
+                }
+                else {
+                    LogHelper.Info($"鎻掑叆浠诲姟澶辫触锛寋log}");
+                }
+                return res;
+            }
+
+            return false;
+        }
+
+
+        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 void Begin(TN_Task task, string forklift_no) {
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            if (task != null) {
+                if (task.N_B_STATE == 1) {
+                    task.N_B_STATE = 2;
+                    task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
+                    task.T_START_TIME = System.DateTime.Now;
+                    task.S_EQ_NO = forklift_no;
+                    db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME, it.S_EQ_NO }).ExecuteCommand();
+                }
+
+            }
+        }
+        internal static void End(TN_Task task) {
+            var db = new SqlHelper<TN_Task>().GetInstance();
+            if (task != null) {
+                task.N_B_STATE = 3;
+                task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
+                task.T_END_TIME = DateTime.Now;
+                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_END_TIME }).ExecuteCommand();
+            }
+        }
+        internal static void Fail(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();
+            }
+        }
+
+        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData) {
+            var db = new SqlHelper<TN_Task_Action>().GetInstance();
+            var action = new TN_Task_Action() {
+                N_ACTION_CODE = state,
+                S_TASK_CODE = no,
+                S_EQ_CODE = forkliftNo,
+                S_EQ_TYPE = "agv",
+                S_DATA = extData
+            };
+            return db.Insertable(action).ExecuteCommand() > 0;
+        }
+
+        internal static List<TN_Task> GetWaitingTaskList() {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<TN_Task>().Where(a => a.N_B_STATE == 0 && (a.S_B_STATE == "绛夊緟" || a.S_B_STATE == "寰呮帹閫�)).ToList();
+        }
+    }
+
+    public class CreateTasks {
+        public string from { set; get; }
+        public string to { set; get; }
+        public string taskType { set; get; }
+        public int pri { set; get; }
+        public string cntrInfo { set; get; }
+    }
+}
diff --git a/ServiceCore/DebugCore.cs b/wms/WMSHelper.cs
similarity index 63%
copy from ServiceCore/DebugCore.cs
copy to wms/WMSHelper.cs
index 4d44786..6591b02 100644
--- a/ServiceCore/DebugCore.cs
+++ b/wms/WMSHelper.cs
@@ -4,8 +4,8 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
-    public class DebugCore {
+namespace HH.WCS.Mobox3.DSZSH.wms {
+    public class WMSHelper {
 
     }
 }

--
Gitblit v1.9.1