From 1af49bdb3cdaa44a7e44ebdc843fb8180596365f Mon Sep 17 00:00:00 2001
From: kazelee <1847801760@qq.com>
Date: 星期四, 15 五月 2025 16:34:39 +0800
Subject: [PATCH] 尾箱回库、移库逻辑开发

---
 App_Start/Config.cs                        |    0 
 Dtos/Response/MoboxResponse.cs             |    3 
 swagger.js                                 |   21 
 /dev/null                                  |   82 ---
 App_Start/Settings.cs                      |    0 
 Controllers/DebugController.cs             |   52 --
 config/config.json                         |    2 
 Models/TN_Check_Order.cs                   |    2 
 App_Start/SwaggerConfig.cs                 |   47 +
 Dtos/Request/AgvRequest.cs                 |    2 
 HH.WCS.Mobox3.DSZSH.csproj                 |   20 
 Services/AgvService.cs                     |   10 
 packages.config                            |    1 
 ServiceCore/CheckCore.cs                   |    2 
 App_Start/SwaggerControllerDescProvider.cs |  237 +++++++++
 Consts/TaskName.cs                         |    3 
 Models/TN_Shift_Order.cs                   |   23 
 Models/TN_Check_Detail.cs                  |    5 
 Controllers/MoboxController.cs             |  241 ++++++---
 Services/MoboxService.cs                   |  173 ++++--
 Models/TN_CG_Detail.cs                     |    7 
 ServiceCore/ShiftCore.cs                   |  117 ++++
 Models/TN_Shift_Detail.cs                  |   25 +
 Dtos/Request/MoboxRequest.cs               |  311 ++++++++++--
 App_Start/Startup.cs                       |    4 
 25 files changed, 1,014 insertions(+), 376 deletions(-)

diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7725d916-1bef-44d2-8384-bfd94e8b6457.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7725d916-1bef-44d2-8384-bfd94e8b6457.vsidx
deleted file mode 100644
index 5569d0b..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7725d916-1bef-44d2-8384-bfd94e8b6457.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e39d6e75-9277-46f5-bff4-9390c52a26f9.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e39d6e75-9277-46f5-bff4-9390c52a26f9.vsidx
deleted file mode 100644
index 6b872b4..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e39d6e75-9277-46f5-bff4-9390c52a26f9.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e9728df6-3b77-4640-883e-78a872e2fb53.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e9728df6-3b77-4640-883e-78a872e2fb53.vsidx
deleted file mode 100644
index e14ea3e..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e9728df6-3b77-4640-883e-78a872e2fb53.vsidx
+++ /dev/null
Binary files differ
diff --git a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f2527103-d3d3-44d1-9a80-1e26bb5cf98f.vsidx b/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f2527103-d3d3-44d1-9a80-1e26bb5cf98f.vsidx
deleted file mode 100644
index 2faa040..0000000
--- a/.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f2527103-d3d3-44d1-9a80-1e26bb5cf98f.vsidx
+++ /dev/null
Binary files differ
diff --git a/AppStart/SwaggerControllerDescProvider.cs b/AppStart/SwaggerControllerDescProvider.cs
deleted file mode 100644
index 3db338d..0000000
--- a/AppStart/SwaggerControllerDescProvider.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-锘縰sing Swashbuckle.Swagger;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.IO;
-using System.Xml;
-
-namespace HH.WCS.Mobox3.DSZSH {
-    /// <summary>
-    /// Swagger 鏄剧ず鎺у埗鍣ㄧ殑鎻忚堪
-    /// </summary>
-    public class SwaggerCacheProvider : ISwaggerProvider
-    {
-        private readonly ISwaggerProvider _swaggerProvider;
-        private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
-        private readonly string _xmlPath;
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="swaggerProvider"></param>
-        /// <param name="xmlpath">xml鏂囨。璺緞</param>
-        public SwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xmlpath)
-        {
-            _swaggerProvider = swaggerProvider;
-            _xmlPath = xmlpath;
-        }
-
-        public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
-        {
-            var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
-            // 鍙鍙栦竴娆�-            if (!_cache.TryGetValue(cacheKey, out SwaggerDocument srcDoc))
-            {
-                srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
-
-                srcDoc.vendorExtensions = new Dictionary<string, object>
-            {
-                { "ControllerDesc", GetControllerDesc() }
-            };
-                _cache.TryAdd(cacheKey, srcDoc);
-            }
-            return srcDoc;
-        }
-
-        /// <summary>
-        /// 浠嶢PI鏂囨。涓鍙栨帶鍒跺櫒鎻忚堪
-        /// </summary>
-        /// <returns>鎵�湁鎺у埗鍣ㄦ弿杩�/returns>
-        public ConcurrentDictionary<string, string> GetControllerDesc()
-        {
-            ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
-            if (File.Exists(_xmlPath))
-            {
-                XmlDocument xmldoc = new XmlDocument();
-                xmldoc.Load(_xmlPath);
-
-                string[] arrPath;
-                int cCount = "Controller".Length;
-                foreach (XmlNode node in xmldoc.SelectNodes("//member"))
-                {
-                    string type = node.Attributes["name"].Value;
-                    if (type.StartsWith("T:"))
-                    {
-                        arrPath = type.Split('.');
-                        string controllerName = arrPath[arrPath.Length - 1];
-                        if (controllerName.EndsWith("Controller")) // 鎺у埗鍣�-                        {
-                            // 鑾峰彇鎺у埗鍣ㄦ敞閲�-                            XmlNode summaryNode = node.SelectSingleNode("summary");
-                            string key = controllerName.Remove(controllerName.Length - cCount, cCount);
-                            if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
-                            {
-                                controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
-                            }
-                        }
-                    }
-                }
-            }
-            return controllerDescDict;
-        }
-    }
-}
diff --git a/AppStart/Config.cs b/App_Start/Config.cs
similarity index 100%
rename from AppStart/Config.cs
rename to App_Start/Config.cs
diff --git a/AppStart/Settings.cs b/App_Start/Settings.cs
similarity index 100%
rename from AppStart/Settings.cs
rename to App_Start/Settings.cs
diff --git a/AppStart/Startup.cs b/App_Start/Startup.cs
similarity index 96%
rename from AppStart/Startup.cs
rename to App_Start/Startup.cs
index 373c710..16d4445 100644
--- a/AppStart/Startup.cs
+++ b/App_Start/Startup.cs
@@ -4,6 +4,8 @@
 using System.Threading.Tasks;
 using System.Web.Http;
 using Microsoft.Owin;
+using Newtonsoft.Json;
+
 using Owin;
 using Swashbuckle.Application;
 
@@ -20,6 +22,8 @@
                 defaults: new { id = RouteParameter.Optional }
                 );
 
+            //SwaggerConfig.Register(config);
+
             // Web API routes
 
             //config.MapHttpAttributeRoutes();
diff --git a/AppStart/SwaggerConfig.cs b/App_Start/SwaggerConfig.cs
similarity index 90%
rename from AppStart/SwaggerConfig.cs
rename to App_Start/SwaggerConfig.cs
index 557097d..7d069fe 100644
--- a/AppStart/SwaggerConfig.cs
+++ b/App_Start/SwaggerConfig.cs
@@ -1,14 +1,49 @@
 using System.Web.Http;
 using WebActivatorEx;
-using HH.WCS.Mobox3.Template;
+using HH.WCS.Mobox3.DSZSH;
 using Swashbuckle.Application;
+using System.IO;
+using System.Reflection;
+using System;
+using Swashbuckle.Examples;
 
 [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]
 
-namespace HH.WCS.Mobox3.Template
+namespace HH.WCS.Mobox3.DSZSH
 {
     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;
@@ -32,7 +67,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.Template");
+                        c.SingleApiVersion("v1", "HH.WCS.Mobox3.DSZSH");
 
                         // If you want the output Swagger docs to be indented properly, enable the "PrettyPrint" option.
                         //
@@ -61,7 +96,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")
@@ -103,6 +138,10 @@
                         //
                         //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.
                         // This is supported through the "MapType" and "SchemaFilter" options:
diff --git a/App_Start/SwaggerControllerDescProvider.cs b/App_Start/SwaggerControllerDescProvider.cs
new file mode 100644
index 0000000..74fd3f2
--- /dev/null
+++ b/App_Start/SwaggerControllerDescProvider.cs
@@ -0,0 +1,237 @@
+锘縰sing Swashbuckle.Swagger;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Xml;
+
+namespace HH.WCS.Mobox3.DSZSH {
+    /// <summary>
+    /// Swagger 鏄剧ず鎺у埗鍣ㄧ殑鎻忚堪
+    /// </summary>
+    public class SwaggerCacheProvider : ISwaggerProvider
+    {
+        private readonly ISwaggerProvider _swaggerProvider;
+        private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
+        private readonly string _xmlPath;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="swaggerProvider"></param>
+        /// <param name="xmlpath">xml鏂囨。璺緞</param>
+        public SwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xmlpath)
+        {
+            _swaggerProvider = swaggerProvider;
+            _xmlPath = xmlpath;
+        }
+
+        public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
+        {
+            var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
+            // 鍙鍙栦竴娆�+            if (!_cache.TryGetValue(cacheKey, out SwaggerDocument srcDoc))
+            {
+                srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
+
+                srcDoc.vendorExtensions = new Dictionary<string, object>
+            {
+                { "ControllerDesc", GetControllerDesc() }
+            };
+                _cache.TryAdd(cacheKey, srcDoc);
+            }
+            return srcDoc;
+        }
+
+        /// <summary>
+        /// 浠嶢PI鏂囨。涓鍙栨帶鍒跺櫒鎻忚堪
+        /// </summary>
+        /// <returns>鎵�湁鎺у埗鍣ㄦ弿杩�/returns>
+        public ConcurrentDictionary<string, string> GetControllerDesc()
+        {
+            ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
+            if (File.Exists(_xmlPath))
+            {
+                XmlDocument xmldoc = new XmlDocument();
+                xmldoc.Load(_xmlPath);
+
+                string[] arrPath;
+                int cCount = "Controller".Length;
+                foreach (XmlNode node in xmldoc.SelectNodes("//member"))
+                {
+                    string type = node.Attributes["name"].Value;
+                    if (type.StartsWith("T:"))
+                    {
+                        arrPath = type.Split('.');
+                        string controllerName = arrPath[arrPath.Length - 1];
+                        if (controllerName.EndsWith("Controller")) // 鎺у埗鍣�+                        {
+                            // 鑾峰彇鎺у埗鍣ㄦ敞閲�+                            XmlNode summaryNode = node.SelectSingleNode("summary");
+                            string key = controllerName.Remove(controllerName.Length - cCount, cCount);
+                            if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
+                            {
+                                controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
+                            }
+                        }
+                    }
+                }
+            }
+            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/TaskName.cs b/Consts/TaskName.cs
index 1b8f206..a30d2f3 100644
--- a/Consts/TaskName.cs
+++ b/Consts/TaskName.cs
@@ -18,5 +18,8 @@
         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
index 90a1f58..f40ffe1 100644
--- a/Controllers/DebugController.cs
+++ b/Controllers/DebugController.cs
@@ -72,58 +72,6 @@
             return DebugService.InsertLocCntrCg();
         }
 
-        public string AddCgCntrLocRel(CgInfo model) {
-            var db = DbHelper.GetDbClient();
-
-            try {
-                using (var tran = db.Ado.UseTran()) {
-                    var loc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.LocId);
-                    if (loc == null) {
-                        var newLoc = new TN_Location { S_CODE = model.LocId, N_CURRENT_NUM = 1 };
-                        if (db.Insertable<TN_Location>(newLoc).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return $"鎻掑叆浣嶇疆{model.LocId}澶辫触";
-                        }
-                        loc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.LocId);
-                    }
-                    if (loc.N_CURRENT_NUM == 0) {
-                        loc.N_CURRENT_NUM = 1;
-                        if (db.Updateable<TN_Location>(loc).UpdateColumns(
-                            it => new { it.N_CURRENT_NUM, it.T_MODIFY }).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return $"淇敼浣嶇疆{model.LocId}澶辫触";
-                        }
-                    }
-
-                    var locCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.LocId && a.S_CNTR_CODE == model.CntId);
-                    if (locCntrRel == null) {
-                        var locList = new List<TN_Loc_Container>();
-                        locList.Add(new TN_Loc_Container { S_LOC_CODE = model.LocId, S_CNTR_CODE = model.CntId });
-                        if (db.Insertable<TN_Loc_Container>(locList).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return $"鎻掑叆浣嶇疆鎵樼洏鍏崇郴{model.LocId}-{model.CntId}澶辫触";
-                        }
-                    }
-
-                    var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == model.CntId && a.S_ITEM_CODE == model.ItemCode);
-                    if (cgDetail == null) {
-                        var locList = new List<TN_CG_Detail>();
-                        locList.Add(new TN_CG_Detail { S_CNTR_CODE = model.CntId, S_ITEM_CODE = model.ItemCode });
-                        if (db.Insertable<TN_CG_Detail>(locList).ExecuteCommand() <= 0) {
-                            tran.RollbackTran();
-                            return $"鎻掑叆鎵樼洏鐗╂枡鍏崇郴{model.CntId}-{model.ItemCode}澶辫触";
-                        }
-                    }
-
-                    tran.CommitTran();
-                }
-            }
-            catch (Exception ex) {
-                return $"鍑洪敊锛歿ex}";
-            }
-
-            return "success";
-        }
     }
 
     public class CgInfo {
diff --git a/Controllers/MoboxController.cs b/Controllers/MoboxController.cs
index 6b9b8fd..4bb42eb 100644
--- a/Controllers/MoboxController.cs
+++ b/Controllers/MoboxController.cs
@@ -25,47 +25,49 @@
         /// <param name="model"></param>
         /// <returns></returns>
         [HttpPost]
-        [Route("GoodpackOffline")]
+        [Route("goodpack-offline")]
         public SimpleResult GoodpackOffline(GoodpackOfflineInfo model) {
             LogHelper.InfoApi("濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)", model);
             return MoboxService.GoodpackOffline(model);
         }
 
-        /// <summary>
-        /// 绌烘墭/绌虹缁戝畾
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public SimpleResult EmptyBind(EmptyBindInfo model) {
-            LogHelper.InfoApi("绌烘墭/绌虹缁戝畾", model);
+        ///// <summary>
+        ///// 绌烘墭/绌虹鍏ュ簱缁戝畾(PDA)
+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //public SimpleResult EmptyBind(EmptyBindInfo model) {
+        //    LogHelper.InfoApi("绌烘墭/绌虹缁戝畾", model);
 
-            if (model.CntrType == "鎵樼洏") {
-                //LogHelper.Info($"瑙﹀彂API锛氱┖鎵樼粦瀹�" + JsonConvert.SerializeObject(model), "API");
-                return MoboxService.EmptyBindPallet(model);
-            }
-            else if (model.CntrType == "濂借繍绠�) {
-                //LogHelper.Info($"瑙﹀彂API锛氱┖绠辩粦瀹�" + JsonConvert.SerializeObject(model), "API");
-                return MoboxService.EmptyBindGoodpack(model);
-            }
-            else {
-                return BuildSimpleResult(-1, $"涓嶅悎娉曠殑瀹瑰櫒绫诲瀷锛�{model.CntrType}'");
-            }
-        }
+        //    if (model.CntrType == "鎵樼洏") {
+        //        //LogHelper.Info($"瑙﹀彂API锛氱┖鎵樼粦瀹�" + JsonConvert.SerializeObject(model), "API");
+        //        return MoboxService.EmptyBindPallet(model);
+        //    }
+        //    else if (model.CntrType == "濂借繍绠�) {
+        //        //LogHelper.Info($"瑙﹀彂API锛氱┖绠辩粦瀹�" + JsonConvert.SerializeObject(model), "API");
+        //        return MoboxService.EmptyBindGoodpack(model);
+        //    }
+        //    else {
+        //        return BuildSimpleResult(-1, $"涓嶅悎娉曠殑瀹瑰櫒绫诲瀷锛�{model.CntrType}'");
+        //    }
+        //}
 
         /// <summary>
         /// 绌烘墭/绌虹鍏ュ簱(PDA)
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
+        [HttpPost]
+        [Route("empty-inbound")]
         public SimpleResult EmptyInbound(EmptyInboundInfo model) {
             LogHelper.InfoApi("绌烘墭/绌虹鍏ュ簱", model);
 
             var db = DbHelper.GetDbClient();
             var locCntrRel = db.Queryable<TN_Loc_Container>()
-                .Where(lc => lc.S_LOC_CODE == model.LocCode).First();
+                .Where(lc => lc.S_CNTR_CODE == model.CntrCode).First();
 
             if (locCntrRel == null) {
-                return BuildSimpleResult(-1, $"涓嶅瓨鍦ㄥ凡缁戝畾瀹瑰櫒鐨勮揣浣嶅彿锛�{model.LocCode}'");
+                return BuildSimpleResult(-1, $"涓嶅瓨鍦ㄥ凡缁戝畾瀹瑰櫒鐨勮揣浣嶅彿锛�{model.CnteType}'");
             }
 
             if (locCntrRel.S_CNTR_TYPE == "鎵樼洏") {
@@ -87,95 +89,146 @@
             }
         }
 
-        /// <summary>
-        /// 绌烘墭/绌虹涓婄嚎(PDA)
-        /// </summary>
-        /// <returns>
-        /// 浜哄伐浣跨敤PDA鎵爜锛屾牴鎹墿鏂欑被鍨嬪垽鏂笂绾跨┖鎵�绌虹
-        /// </returns>
-        public SimpleResult EmptyOnline(EmptyOnlineInfo model) {
-            var db = DbHelper.GetDbClient();
-            var locCntrRel = db.Queryable<TN_Loc_Container>()
-                .LeftJoin<TN_CG_Detail>((lc, cd) => lc.S_CNTR_CODE == cd.S_CNTR_CODE)
-                .Where((lc, cd) => cd.S_ITEM_CODE == model.ItemCode)
-                .First();
+        ///// <summary>
+        ///// 绌烘墭/绌虹涓婄嚎(PDA)
+        ///// </summary>
+        ///// <returns>
+        ///// 浜哄伐浣跨敤PDA鎵爜锛屾牴鎹墿鏂欑被鍨嬪垽鏂笂绾跨┖鎵�绌虹
+        ///// </returns>
+        //public SimpleResult EmptyOnline(EmptyOnlineInfo model) {
+        //    var db = DbHelper.GetDbClient();
+        //    var locCntrRel = db.Queryable<TN_Loc_Container>()
+        //        .LeftJoin<TN_CG_Detail>((lc, cd) => lc.S_CNTR_CODE == cd.S_CNTR_CODE)
+        //        .Where((lc, cd) => cd.S_ITEM_CODE == model.ItemCode)
+        //        .First();
 
-            if (locCntrRel.S_CNTR_TYPE == "鎵樼洏") {
+        //    if (locCntrRel.S_CNTR_TYPE == "鎵樼洏") {
 
-                return MoboxService.EmptyOnlinePallet(new EmptyOnlinePalletInfo {
-                    CntId = locCntrRel.S_CNTR_CODE,
-                    EndLoc = model.EndLoc
-                });
-            }
-            else if (locCntrRel.S_CNTR_TYPE == "濂借繍绠�) {
+        //        return MoboxService.EmptyOnlinePallet(new EmptyOnlinePalletInfo {
+        //            CntId = locCntrRel.S_CNTR_CODE,
+        //            EndLoc = model.EndLoc
+        //        });
+        //    }
+        //    else if (locCntrRel.S_CNTR_TYPE == "濂借繍绠�) {
 
-                return MoboxService.EmptyOnlineGoodpack(new EmptyOnlineGoodpackInfo {
-                    CntId = locCntrRel.S_CNTR_CODE,
-                    EndLoc = model.EndLoc
-                });
-            }
-            else {
-                return BuildSimpleResult(-1, $"涓嶅悎娉曠殑瀹瑰櫒绫诲瀷锛�{locCntrRel.S_CNTR_CODE}'");
-            }
-        }
+        //        return MoboxService.EmptyOnlineGoodpack(new EmptyOnlineGoodpackInfo {
+        //            CntId = locCntrRel.S_CNTR_CODE,
+        //            EndLoc = model.EndLoc
+        //        });
+        //    }
+        //    else {
+        //        return BuildSimpleResult(-1, $"涓嶅悎娉曠殑瀹瑰櫒绫诲瀷锛�{locCntrRel.S_CNTR_CODE}'");
+        //    }
+        //}
 
         /// <summary>
-        /// 鍒涘缓鎶芥鍗�+        /// 鎵樼洏-绌烘墭涓婄嚎(PDA)
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
+        [HttpPost]
+        [Route("empty-online-pallet")]
+        public SimpleResult EmptyOnlinePallet(EmptyOnlinePalletInfo model) {
+            return MoboxService.EmptyOnlinePallet(model);
+        }
+
+        /// <summary>
+        /// 濂借繍绠�绌虹涓婄嚎(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("empty-online-goodpack")]
+        public SimpleResult EmptyOnlineGoodpack(EmptyOnlineGoodpackInfo model) {
+            return MoboxService.EmptyOnlineGoodpack(model);
+        }
+
+        ///// <summary>
+        ///// 鍚堟牸鍥炲簱/涓嶅悎鏍肩Щ搴�+        ///// </summary>
+        ///// <param name="model"></param>
+        ///// <returns></returns>
+        //[HttpPost]
+        //[Route("CheckShift")]
+        //public SimpleResult CheckShift(CheckShiftInfo model) {
+        //    LogHelper.InfoApi("鍚堟牸鍥炲簱/涓嶅悎鏍肩Щ搴�, model);
+
+        //    if (model.Qualified) {
+        //        return MoboxService.QualifiedBack(model);
+        //    }
+        //    else {
+        //        return MoboxService.UnqualifiedShift(model);
+        //    }
+        //}
+
+        /// <summary>
+        /// 鍚堟牸鍥炲簱(PDA)
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("qualified-back")]
+        public SimpleResult QualifiedBack(QualifiedBackInfo model) {
+            return MoboxService.QualifiedBack(model);
+        }
+
+        /// <summary>   
+        /// 涓嶅悎鏍肩Щ搴�PDA)
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("unqualified-shift")]
+        public SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
+            return MoboxService.UnqualifiedShift(model);
+        }
+
+        /// <summary>
+        /// 浣欐枡灏剧鍥炲簱(PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("rest-back")]
+        public SimpleResult RestBack(RestBackInfo model) {
+            return MoboxService.RestBack(model);
+        }
+        #endregion
+
+        #region Mobox 鎺ュ彛
+        /// <summary>
+        /// 鎴愬搧鑳跺嚭搴�PDA)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("finished-outbound")]
+        public SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
+            LogHelper.InfoApi("鎴愬搧鑳跺嚭搴�PDA)", model);
+            if (model.ForcedOut) {
+                return MoboxService.FinishedOutboundForce(model);
+            }
+            return MoboxService.FinishedOutbound(model);
+        }
+
+        /// <summary>
+        /// 鎶芥-鍒涘缓鎶芥鍗�WMS)
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("create-check-order")]
         public SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
             return MoboxService.CreateCheckOrder(model);
         }
 
         /// <summary>
-        /// 鍚堟牸鍥炲簱/涓嶅悎鏍肩Щ搴�+        /// 绉诲簱-鍒涘缓绉诲簱浠诲姟(WMS)
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
         [HttpPost]
-        [Route("CheckShift")]
-        public SimpleResult CheckShift(CheckShiftInfo model) {
-            LogHelper.InfoApi("鍚堟牸鍥炲簱/涓嶅悎鏍肩Щ搴�, model);
-
-            if (model.Qualified) {
-                return MoboxService.QualifiedBack(model);
-            }
-            else {
-                return MoboxService.UnqualifiedShift(model);
-            }
-        }
-
-        ///// <summary>
-        ///// 鍚堟牸鍥炲簱
-        ///// </summary>
-        ///// <returns></returns>
-        //public SimpleResult QualifiedBack(QualifiedBackInfo model) {
-        //    return new SimpleResult();
-        //}
-
-        ///// <summary>   
-        ///// 涓嶅悎鏍肩Щ搴�-        ///// </summary>
-        ///// <returns></returns>
-        //public SimpleResult UnqualifiedShift() {
-        //    return new SimpleResult();
-        //}
-
-        #endregion
-
-        #region Mobox 鎺ュ彛
-        /// <summary>
-        /// 鎴愬搧鑳跺嚭搴�WMS)
-        /// </summary>
-        /// <param name="model"></param>
-        /// <returns></returns>
-        public SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
-            LogHelper.InfoApi("鎴愬搧鑳跺嚭搴�WMS)", model);
-            if (model.ForcedOut) {
-                return MoboxService.FinishedOutboundForce(model);
-            }
-            return MoboxService.FinishedOutbound(model);
+        [Route("shift-storage")]
+        public SimpleResult CreateShiftOrder(CreateShiftOrderInfo model) {
+            return MoboxService.CreateShiftOrder(model);
         }
         #endregion
     }
diff --git a/Dtos/Request/AgvRequest.cs b/Dtos/Request/AgvRequest.cs
index 09db430..a63eb24 100644
--- a/Dtos/Request/AgvRequest.cs
+++ b/Dtos/Request/AgvRequest.cs
@@ -34,7 +34,7 @@
             /// 璇锋眰鐮�             /// </summary>
             public string apply_code { get; set; }
-            public string TaskNo { set; get; }
+            public string task_no { set; get; }
         }
     }
 }
diff --git a/Dtos/Request/MoboxRequest.cs b/Dtos/Request/MoboxRequest.cs
index e20bcd6..8417ed7 100644
--- a/Dtos/Request/MoboxRequest.cs
+++ b/Dtos/Request/MoboxRequest.cs
@@ -1,42 +1,79 @@
-锘縰sing Newtonsoft.Json;
+锘縰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 : StartCntInfo {
-            public string CgId { get; set; }
+        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_no")]
+            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>
-        /// API锛氱┖鎵�绌虹缁戝畾鏁版嵁绫�+        /// 绌烘墭/绌虹鍏ュ簱缁戝畾(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(NullValueHandling = NullValueHandling.Ignore)]
-            public int PalletCount { 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>
             /// 瀹瑰櫒缂栫爜
@@ -53,7 +90,9 @@
             /// </summary>
             public string LocCode { get; set; }
         }
-
+        /// <summary>
+        /// 绌虹缁戝畾
+        /// </summary>
         public class EmptyBindGoodpackInfo {
             /// <summary>
             /// 瀹瑰櫒缂栫爜
@@ -65,48 +104,141 @@
             /// </summary>
             public string LocCode { get; set; }
         }
-
+        /// <summary>
+        /// 绌烘墭/绌虹鍏ュ簱(PDA)鏁版嵁绫�+        /// </summary>
         public class EmptyInboundInfo {
             /// <summary>
-            /// 璐т綅缂栫爜
+            /// 瀹瑰櫒缂栫爜
             /// </summary>
-            public string LocCode { get; set; }
+            [JsonProperty("cntr_code")]
+            public string CntrCode { get; set; }
+            /// <summary>
+            /// 瀹瑰櫒绫诲瀷
+            /// </summary>
+            [JsonProperty("cntr_type")]
+            public string CnteType { get; set; }
+            /// <summary>
+            /// 缁堢偣搴撳尯缂栫爜
+            /// </summary>
+            [JsonProperty("end_area")]
+            public string EndArea { 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 EmptyOnlineInfo {
+        //    public string ItemCode { get; set; }
+        //    public string ItemName { get; set; }
+        //    public string PatchNo { get; set; }
+        //    public string EndLoc { get; set; }
+        //}
 
         public class EmptyOnlinePalletInfo {
-            public string CntId { get; set; }
-            public string EndLoc { get; set; }
-        }
-
-        public class EmptyOnlineGoodpackInfo : StartCntEndInfo { }
-
-        public class CreateCheckOrderInfo {
-            public string No { get; set; }
-            public string CgId { get; set; }
-            public string ItemName { get; set; }
+            /// <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>
-            public int N_QTY { get; set; }
+            [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; }
         }
 
         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; }
         }
 
@@ -118,49 +250,102 @@
 
         #region WMS 鏁版嵁
         /// <summary>
-        /// 鎴愬搧鑳舵墭鐩樺嚭搴撲俊鎭�+        /// 鎴愬搧鑳跺嚭搴�PDA)
         /// </summary>
         public class FinishedOutboundInfo {
-            //public string No { get; set; }
-
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            
+            [JsonProperty("item_code")]
             public string ItemCode { get; set; }
-            public string ItemName { 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; }
-            public float Qty { 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 StartCntEndInfo {
-            /// <summary>
-            /// 璧风偣璐т綅
-            /// </summary>
-            public string StartLoc { get; set; }
-            /// <summary>
-            /// 瀹瑰櫒鍙�-            /// </summary>
-            public string CntId { get; set; }
-            /// <summary>
-            /// 缁堢偣璐т綅
-            /// </summary>
-            public string EndLoc { get; set; }
-        }
-
         /// <summary>
         /// 妯℃澘鎶借薄鏁版嵁绫伙細璧风偣璐т綅銆佸鍣ㄥ彿
         /// </summary>
diff --git a/Dtos/Response/MoboxResponse.cs b/Dtos/Response/MoboxResponse.cs
index 94fc6e7..f404c20 100644
--- a/Dtos/Response/MoboxResponse.cs
+++ b/Dtos/Response/MoboxResponse.cs
@@ -9,9 +9,10 @@
 namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
     public class MoboxResponse {
         /// <summary>
-        /// Mobox 鎺ュ彛杩斿洖
+        /// Mobox 鎺ュ彛杩斿洖鏁版嵁绫�         /// </summary>
         public class SimpleResult {
+
             [JsonProperty("resultCode")]
             public int Code { get; set; }
 
diff --git a/HH.WCS.Mobox3.DSZSH.csproj b/HH.WCS.Mobox3.DSZSH.csproj
index 0667fa1..40f6db6 100644
--- a/HH.WCS.Mobox3.DSZSH.csproj
+++ b/HH.WCS.Mobox3.DSZSH.csproj
@@ -53,6 +53,10 @@
   <PropertyGroup>
     <StartupObject>HH.WCS.Mobox3.DSZSH.Program</StartupObject>
   </PropertyGroup>
+  <PropertyGroup>
+    <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <NoWarn>$(NoWarn);1591</NoWarn>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="BouncyCastle.Crypto, Version=1.9.0.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
       <HintPath>packages\Portable.BouncyCastle.1.9.0\lib\net40\BouncyCastle.Crypto.dll</HintPath>
@@ -129,11 +133,15 @@
     <Reference Include="Swashbuckle.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd1bb07a5ac7c7bc, processorArchitecture=MSIL">
       <HintPath>..\packages\Swashbuckle.Core.5.6.0\lib\net40\Swashbuckle.Core.dll</HintPath>
     </Reference>
+    <Reference Include="Swashbuckle.Examples, Version=4.1.0.0, Culture=neutral, PublicKeyToken=aa1e9c5053bfbe95, processorArchitecture=MSIL">
+      <HintPath>packages\Swashbuckle.Examples.4.1.0\lib\net40\Swashbuckle.Examples.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
     </Reference>
     <Reference Include="System.ComponentModel.Composition" />
+    <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Configuration.Install" />
     <Reference Include="System.Core" />
@@ -216,7 +224,8 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="AppStart\Config.cs" />
+    <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" />
@@ -228,7 +237,7 @@
     <Compile Include="Controllers\ErpController.cs" />
     <Compile Include="Controllers\MoboxController.cs" />
     <Compile Include="Controllers\AgvController.cs" />
-    <Compile Include="AppStart\SwaggerControllerDescProvider.cs" />
+    <Compile Include="App_Start\SwaggerControllerDescProvider.cs" />
     <Compile Include="Models\DebugModel.cs" />
     <Compile Include="Dtos\Request\DebugRequest.cs" />
     <Compile Include="Dtos\Response\DebugResponse.cs" />
@@ -244,8 +253,11 @@
     <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\OutboundCore.cs" />
+    <Compile Include="ServiceCore\ShiftCore.cs" />
     <Compile Include="Services\DebugService.cs" />
     <Compile Include="Devices\ProductionLineDevice.cs" />
     <Compile Include="Devices\ModbusHelper.cs" />
@@ -285,8 +297,8 @@
     <Compile Include="Helpers\SysHelper.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="AppStart\Settings.cs" />
-    <Compile Include="AppStart\Startup.cs" />
+    <Compile Include="App_Start\Settings.cs" />
+    <Compile Include="App_Start\Startup.cs" />
     <Compile Include="Dispatch\NDCHelper.cs" />
     <Compile Include="Helpers\HttpHelper.cs" />
   </ItemGroup>
diff --git a/Models/TN_CG_Detail.cs b/Models/TN_CG_Detail.cs
index 31acaf0..23e6b65 100644
--- a/Models/TN_CG_Detail.cs
+++ b/Models/TN_CG_Detail.cs
@@ -17,6 +17,11 @@
         public string S_ITEM_CODE { get; set; }
 
         /// <summary>
+        /// 鐗╂枡瑙勬牸
+        /// </summary>
+        public string S_SPE { get; set; }
+
+        /// <summary>
         /// 瀹瑰櫒缂栫爜
         /// </summary>
         public string S_CNTR_CODE { get; set; }
@@ -39,6 +44,6 @@
         /// <summary>
         /// 璐у搧鏁伴噺
         /// </summary>
-        public float F_QTY { get; set; }
+        public int N_QTY { get; set; }
     }
 }
diff --git a/Models/TN_Check_Detail.cs b/Models/TN_Check_Detail.cs
index 16e29d7..0d14c5f 100644
--- a/Models/TN_Check_Detail.cs
+++ b/Models/TN_Check_Detail.cs
@@ -14,8 +14,9 @@
     public class TN_Check_Detail : BaseModel {
         public string S_NO { get; set; }
 
-        public string S_CG_ID { get; set; }
-        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        //public string S_ITEM_NAME { get; set; }
+
         public string S_BATCH_NO { get; set; }
         public string S_END_AREA { get; set; }
         /// <summary>
diff --git a/Models/TN_Check_Order.cs b/Models/TN_Check_Order.cs
index 983aff1..52529c2 100644
--- a/Models/TN_Check_Order.cs
+++ b/Models/TN_Check_Order.cs
@@ -13,7 +13,7 @@
     [SugarTable("TN_Check_Order")]
     public class TN_Check_Order : BaseModel {
         public string S_NO { get; set; }
-        public string S_CG_ID { get; set; }
+        public string S_ITEM_CODE { get; set; }
         public string S_ITEM_NAME { get; set; }
         public string S_BATCH_NO { get; set; }
         public int N_COUNT { get; set; }
diff --git a/Models/TN_Shift_Detail.cs b/Models/TN_Shift_Detail.cs
new file mode 100644
index 0000000..b343e3e
--- /dev/null
+++ b/Models/TN_Shift_Detail.cs
@@ -0,0 +1,25 @@
+锘�+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.Mobox3.DSZSH.Models {
+    internal class TN_Shift_Detail : BaseModel {
+        public string S_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+
+        public string S_LOC_CODE { get; set; }
+
+        public string S_CNTR_CODE { get; set; }
+
+        public string S_BATCH_NO { get; set; }
+        public string S_END_AREA { get; set; }
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; } = 1; // 鍒涘缓鍗虫墽琛�+    }
+}
diff --git a/Models/TN_Shift_Order.cs b/Models/TN_Shift_Order.cs
new file mode 100644
index 0000000..0756b86
--- /dev/null
+++ b/Models/TN_Shift_Order.cs
@@ -0,0 +1,23 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.Mobox3.DSZSH.Models {
+    /// <summary>
+    /// 绉诲簱鍗�+    /// </summary>
+    public class TN_Shift_Order : BaseModel {
+        public string S_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public int N_COUNT { get; set; }
+        public string S_END_AREA { get; set; }
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�绛夊緟鎵ц 1宸叉墽琛屽緟鐢熸垚浠诲姟 2浠诲姟鎵ц涓�3浠诲姟瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; } = 0; // 鍒涘缓鍚庨渶瑕佺‘璁ゆ墽琛�+    }
+}
diff --git a/ServiceCore/CheckCore.cs b/ServiceCore/CheckCore.cs
index fec6b9e..d0a4747 100644
--- a/ServiceCore/CheckCore.cs
+++ b/ServiceCore/CheckCore.cs
@@ -30,7 +30,7 @@
                 foreach (var detail in detailList) {
                     var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail>
                         ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE)
-                        .Where((l, c, d) => d.S_ITEM_CODE == detail.S_CG_ID && d.S_BATCH_NO == detail.S_BATCH_NO)
+                        .Where((l, c, d) => d.S_ITEM_CODE == detail.S_ITEM_CODE && d.S_BATCH_NO == detail.S_BATCH_NO)
                         .Select((l, c) => c) // 閫夋嫨 LocCntrRel
                         .First(); // 闅忔満鎶芥锛屼笉鎺掑簭
 
diff --git a/ServiceCore/ShiftCore.cs b/ServiceCore/ShiftCore.cs
new file mode 100644
index 0000000..d74141e
--- /dev/null
+++ b/ServiceCore/ShiftCore.cs
@@ -0,0 +1,117 @@
+锘縰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("杞锛氭殏鏃犲緟鎵ц鐨勭Щ搴撳崟");
+                    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.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_Shift_Detail>()
+                .First(d => d.N_B_STATE == SpotStateCode.浠诲姟鎵ц涓�;
+
+            if (detail == null) {
+                LogHelper.Info("褰撳墠娌℃湁鎵ц涓殑绉诲簱鍗曟槑缁嗛」鐩�);
+                return;
+            }
+
+            using (var tran = db.Ado.UseTran()) {
+                detail.N_B_STATE = spotStateCode;
+                db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand();
+
+                if (db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 2) ==
+                    db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO)) {
+
+                    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("淇敼Order鐘舵�閿欒");
+                    }
+                }
+
+                tran.CommitTran();
+            }
+        }
+    }
+}
diff --git a/Services/AgvService.cs b/Services/AgvService.cs
index 8a98eaf..126abe7 100644
--- a/Services/AgvService.cs
+++ b/Services/AgvService.cs
@@ -19,8 +19,8 @@
             try {
                 switch (model.state) {
                     case 1023:
+                        break;
                     case 1025:
-
                         break;
                     case 1012:
                         break;
@@ -117,9 +117,7 @@
 
             return true;
         }
-
-
-
+    
         public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
             var gzResult = new ReturnResult();
             var db = DbHelper.GetDbClient();
@@ -134,9 +132,9 @@
                     LogHelper.Info("鍔犺浇璁惧淇℃伅澶辫触");
                 }
 
-                var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.TaskNo);
+                var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.task_no);
                 if (tn_task == null) {
-                    LogHelper.Info($"浠诲姟鍙�'{model.TaskNo}' 涓嶅瓨鍦�);
+                    LogHelper.Info($"浠诲姟鍙�'{model.task_no}' 涓嶅瓨鍦�);
                 }
 
                 // 寰呬慨鏀癸細琛ュ厖涓嶅悓鍒嗘敮AGV鍒ゆ柇
diff --git a/Services/MoboxService.cs b/Services/MoboxService.cs
index 8ad85b5..4ff7773 100644
--- a/Services/MoboxService.cs
+++ b/Services/MoboxService.cs
@@ -18,45 +18,6 @@
 namespace HH.WCS.Mobox3.DSZSH.Services {
     public class MoboxService {
 
-        #region 妯℃澘鍔熻兘
-        public static SimpleResult BaseBound(StartCntEndInfo model) {
-            var 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(ExprHelper.LocCntrIsBind(startLoc.S_CODE, model.CntId)).First();
-
-                if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{startLoc.S_CODE}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}'");
-                }
-
-                var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.EndLoc))
-                    .Where(ExprHelper.LocIsFree)
-                    .Where(ExprHelper.LocIsEmpty).First();
-
-                if (endLoc == null) {
-                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 '{model.EndLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
-                }
-
-                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
-            }
-            catch (Exception ex) {
-                return BuildSimpleEx(ex);
-            }
-        }
-        #endregion
-
         #region PDA 鍔熻兘
         /// <summary>
         /// 濂借繍绠�婊℃墭涓嬬嚎鍏ュ簱(PDA)
@@ -82,10 +43,9 @@
 
                 // 鏌ョ湅瀹瑰櫒涓庤捣鐐硅揣浣嶆槸鍚︾粦瀹�                 var locCntrRel = db.Queryable<TN_Loc_Container>().First(
-                    a => a.S_LOC_CODE == model.StartLoc
-                    && a.S_CNTR_CODE == model.CntId);
+                    a => a.S_LOC_CODE == startLoc.S_CODE);
                 if (locCntrRel == null) {
-                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 娌℃湁缁戝畾瀹瑰櫒 '{model.CntId}' 锛屾棤鍙嚭搴撶殑鐗╂枡");
+                    return BuildSimpleResult(3, $"璧风偣浣嶇疆 '{model.StartLoc}' 鏃犲彲鍑哄簱鐨勭墿鏂�);
                 }
 
                 // TODO 婊$鍏ュ簱绠楁硶寰呬紭鍖�@@ -133,7 +93,7 @@
                     return BuildSimpleResult(3, $"褰撳墠瀹瑰櫒 '{model.CntrCode}' 宸茬粡涓�'{locCntrRel.S_LOC_CODE}' 缁戝畾");
                 }
 
-                loc.N_CURRENT_NUM = model.PalletCount;
+                //loc.N_CURRENT_NUM = model.PalletCount;
 
                 locCntrRel = new TN_Loc_Container {
                     S_LOC_CODE = model.LocCode,
@@ -325,13 +285,13 @@
                 }
 
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.EndLoc))
+                    .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, $"缁堢偣浣嶇疆 '{model.EndLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
+                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
                 }
 
                 return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
@@ -371,13 +331,13 @@
                 }
 
                 var endLoc = db.Queryable<TN_Location>()
-                    .Where(ExprHelper.LocCode(model.EndLoc))
+                    .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, $"缁堢偣浣嶇疆 '{model.EndLoc}' 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
+                    return BuildSimpleResult(4, $"缁堢偣浣嶇疆 涓嶅瓨鍦ㄦ垨涓嶅叿澶囨斁璐ц姹�);
                 }
 
                 return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
@@ -399,11 +359,11 @@
                 using (var tran = db.Ado.UseTran()) {
 
                     var order = new TN_Check_Order {
-                        S_NO = model.No,
-                        S_CG_ID = model.CgId,
-                        S_ITEM_NAME = model.ItemName,
+                        S_NO = GenerateOrderNo("鎶芥鍗曞彿", "CN"),
+                        S_ITEM_CODE = model.ItemCode,
+                        //S_ITEM_NAME = model.ItemName,
                         S_BATCH_NO = model.BatchNo,
-                        N_COUNT = model.N_QTY,
+                        N_COUNT = model.Qty,
                         S_END_AREA = model.EndArea,
                     };
 
@@ -412,10 +372,10 @@
                         return BuildSimpleResult(2, "鐢熸垚 鎶芥鍗�澶辫触锛� + JsonConvert.SerializeObject(order));
                     }
 
-                    for (int i = 0; i < model.N_QTY; i++) {
+                    for (int i = 0; i < model.Qty; i++) {
                         var detail = new TN_Check_Detail {
-                            S_NO = model.No,
-                            S_CG_ID = model.CgId,
+                            S_NO = order.S_NO,
+                            S_ITEM_CODE = model.ItemCode,
                             S_BATCH_NO = model.BatchNo,
                             S_END_AREA = model.EndArea
                         };
@@ -428,7 +388,7 @@
 
                     tran.CommitTran();
                 }
-                return BuildSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛锛氬崟鍙�{model.No}");
+                return BuildSimpleResult(0, $"鍒涘缓 鎶芥鍗�鎴愬姛");
             }
             catch (Exception ex) {
                 return BuildSimpleEx(ex);
@@ -437,6 +397,7 @@
 
         public static SimpleResult QualifiedBack(QualifiedBackInfo model) {
             var db = DbHelper.GetDbClient();
+
             try {
 
                 var cgDetail = db.Queryable<TN_CG_Detail>()
@@ -549,6 +510,34 @@
             }
         }
 
+        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);
+            }
+        }
+
         #endregion
 
         #region Mobox 鍔熻兘
@@ -598,7 +587,7 @@
                         S_ITEM_CODE = model.ItemCode,
                         S_BATCH_NO = model.BatchNo,
                         F_QTY = model.Qty,
-                        F_OUT_QTY = cgDetailList.Sum(a => a.F_QTY),
+                        F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                         S_END_AREA = model.EndArea
                     };
 
@@ -659,7 +648,7 @@
                         S_ITEM_CODE = model.ItemCode,
                         S_BATCH_NO = model.BatchNo,
                         F_QTY = model.Qty,
-                        F_OUT_QTY = cgDetailList.Sum(a => a.F_QTY),
+                        F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                         S_END_AREA = model.EndArea
                     };
 
@@ -685,8 +674,8 @@
 
             try {
                 var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
-                && a.F_QTY > targetNum).
-                OrderBy(a => a.F_QTY, OrderByType.Asc).First();
+                && a.N_QTY > targetNum).
+                OrderBy(a => a.N_QTY, OrderByType.Asc).First();
                 if (targetCg != null) //鍒氬ソ鏈変竴琛屾弧瓒虫潯浠�                 {
                     result.Add(targetCg);
@@ -695,12 +684,12 @@
 
                 // NOTE 鏍规嵁鎬婚噺閫塪etail鏃讹紝鏄惁闇�鑰冭檻璐т綅鐨勯珮浣庯紵
                 var 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.F_QTY > 0)
+                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_QTY > 0)
                     .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
                     .Where(d => (model.ForcedOut && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸")
                         || (!model.ForcedOut && (d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "鍚堟牸"
                         || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "寰呮")))
-                    .OrderBy(d => d.F_QTY, OrderByType.Desc)
+                    .OrderBy(d => d.N_QTY, OrderByType.Desc)
                     .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
 
                 if (sortedMaterials.Count == 0)//娌℃湁婊¤冻鏉′欢鐨�@@ -710,13 +699,13 @@
 
                 float countNum = 0;
                 foreach (var mat in sortedMaterials) {
-                    countNum += mat.F_QTY;
+                    countNum += mat.N_QTY;
                     result.Add(mat);
                     if (countNum >= targetNum) {
                         break;
                     }
                 }
-                if (result.Sum(a => a.F_QTY) >= targetNum) {
+                if (result.Sum(a => a.N_QTY) >= targetNum) {
                     return result;
                 }
                 else {
@@ -729,6 +718,64 @@
             }
         }
 
+        /// <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");
diff --git a/config/config.json b/config/config.json
index 4436b8f..bca70e9 100644
--- a/config/config.json
+++ b/config/config.json
@@ -1,5 +1,5 @@
 {
-    "WebApiUrl": "http://127.0.0.1:8901/",
+    "WebApiUrl": "http://192.168.1.141:8901/",
     "NdcApiUrl": "http://127.0.0.1:5201/api/order/",
     "SqlServer": "Data Source=(local);Initial Catalog=DSZSHTest;User ID=sa;Password=123456;",
     "TcpServerIp": "127.0.0.1",
diff --git a/packages.config b/packages.config
index a963eb7..466765f 100644
--- a/packages.config
+++ b/packages.config
@@ -33,6 +33,7 @@
   <package id="SqlSugar" version="5.1.4.169" targetFramework="net462" />
   <package id="Swashbuckle" version="5.6.0" targetFramework="net461" />
   <package id="Swashbuckle.Core" version="5.6.0" targetFramework="net461" />
+  <package id="Swashbuckle.Examples" version="4.1.0" targetFramework="net462" />
   <package id="System.Buffers" version="4.5.1" targetFramework="net461" />
   <package id="System.Diagnostics.DiagnosticSource" version="6.0.1" targetFramework="net462" />
   <package id="System.Formats.Asn1" version="8.0.1" targetFramework="net462" />
diff --git a/swagger.js b/swagger.js
index aed0f8c..aec2e15 100644
--- a/swagger.js
+++ b/swagger.js
@@ -40,6 +40,27 @@
             }
         });
     },
+
+    setModelDescriptions: function() {
+        $.ajax({
+            type: "get",
+            url: $("#input_baseUrl").val(),
+            dataType: "json",
+            success: function(data) {
+                var modelDesc = data.ModelDesc;
+                // 在模型展示区域添加描述
+                $(".model-box").each(function() {
+                    var modelName = $(this).find(".model-title").text();
+                    if (modelDesc[modelName]) {
+                        $(this).find(".model-description").remove();
+                        $(this).append(
+                            `<div class="model-description">${modelDesc[modelName]}</div>`
+                        );
+                    }
+                });
+            }
+        });
+    },
     _tryTranslate: function (word)
     {
         return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;

--
Gitblit v1.9.1