From 6a0661fa5924be38c1a2d7fa05ff8ffdcfcac940 Mon Sep 17 00:00:00 2001
From: pengmn <pmn@HanInfo>
Date: 星期三, 14 五月 2025 17:25:24 +0800
Subject: [PATCH] 杭氧

---
 HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs                                                           |  517 ++
 HH.WCS.Mobox3.HangYang/api/WmsController.cs                                                            |   81 
 HH.WCS.Mobox3.HangYang/dispatch/NDCHelper.cs                                                           |   81 
 HH.WCS.Mobox3.HangYang/models/SortingResult.cs                                                         |   32 
 HH.WCS.Mobox3.HangYang/models/Wcsmodel.cs                                                              |   21 
 HH.WCS.Mobox3.HangYang/device/TcpClient.cs                                                             |   85 
 HH.WCS.Mobox3.HangYang/models/TN_Material.cs                                                           |   66 
 HH.WCS.Mobox3.HangYang/models/AZInventory.cs                                                           |   27 
 HH.WCS.Mobox3.HangYang/models/CntrItemDetail.cs                                                        |   50 
 HH.WCS.Mobox3.HangYang/models/TN_ASN_Order.cs                                                          |   25 
 HH.WCS.Mobox3.HangYang/process/HttpModel.cs                                                            |  173 
 HH.WCS.Mobox3.HangYang/config/config.json                                                              |   59 
 HH.WCS.Mobox3.HangYang/models/SortingDetail.cs                                                         |   38 
 HH.WCS.Mobox3.HangYang/models/OutOrderDetail.cs                                                        |   55 
 HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/v17/DocumentLayout.json                                      |   12 
 HH.WCS.Mobox3.HangYang/models/TN_Check_List.cs                                                         |   35 
 HH.WCS.Mobox3.HangYang/.vs/HH.WCS.GuoXiang/FileContentIndex/e2cd9d58-a4ee-4f5a-8ab1-e2ef73c348e6.vsidx |    0 
 HH.WCS.Mobox3.HangYang/models/ShippingOrder.cs                                                         |   55 
 HH.WCS.Mobox3.HangYang/models/InOrder.cs                                                               |   50 
 HH.WCS.Mobox3.HangYang/util/Settings.cs                                                                |  172 
 HH.WCS.Mobox3.HangYang/App_Start/Startup.cs                                                            |   48 
 HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs                                                                |  258 +
 HH.WCS.Mobox3.HangYang/core/WCSCore.cs                                                                 |  181 
 HH.WCS.Mobox3.HangYang/models/TN_Business_Source.cs                                                    |   20 
 HH.WCS.Mobox3.HangYang/models/TN_Purchase_Order.cs                                                     |   18 
 HH.WCS.Mobox3.HangYang/models/OI_WMS_TASK_TYPE.cs                                                      |   14 
 HH.WCS.Mobox3.HangYang/models/PutawayDetail.cs                                                         |   64 
 HH.WCS.Mobox3.HangYang/models/TN_Factory.cs                                                            |   17 
 HH.WCS.Mobox3.HangYang/models/TN_Inspect_Record.cs                                                     |   23 
 HH.WCS.Mobox3.HangYang/models/TaskAction.cs                                                            |   23 
 HH.WCS.Mobox3.HangYang/device/S7Helper.cs                                                              |  289 +
 HH.WCS.Mobox3.HangYang/Properties/AssemblyInfo.cs                                                      |   36 
 HH.WCS.Mobox3.HangYang/models/TN_Check_Detail.cs                                                       |   37 
 HH.WCS.Mobox3.HangYang/core/WMSCore.cs                                                                 |  145 
 HH.WCS.Mobox3.HangYang/models/ZoneCls.cs                                                               |   19 
 HH.WCS.Mobox3.HangYang/models/Area.cs                                                                  |   32 
 HH.WCS.Mobox3.HangYang/models/Container.cs                                                             |   42 
 HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs                                                                | 1241 +++++
 HH.WCS.Mobox3.HangYang/models/Location.cs                                                              |   74 
 HH.WCS.Mobox3.HangYang/dispatch/HostToAGV.cs                                                           |  550 ++
 HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs                                                           |   83 
 HH.WCS.Mobox3.HangYang/models/TN_Warehouse.cs                                                          |   21 
 HH.WCS.Mobox3.HangYang/util/StrHelper.cs                                                               |   31 
 HH.WCS.Mobox3.HangYang/models/SortingOrder.cs                                                          |   57 
 HH.WCS.Mobox3.HangYang/models/WCSTask.cs                                                               |   84 
 HH.WCS.Mobox3.HangYang/device/TcpServer.cs                                                             |  143 
 HH.WCS.Mobox3.HangYang/api/LiKuController.cs                                                           |   16 
 HH.WCS.Mobox3.HangYang/models/OutOrder.cs                                                              |   55 
 HH.WCS.Mobox3.HangYang/config/configDesc.txt                                                           |    7 
 HH.WCS.Mobox3.HangYang/api/ApiModel.cs                                                                 |  400 +
 HH.WCS.Mobox3.HangYang/models/TN_Supplier.cs                                                           |   28 
 HH.WCS.Mobox3.HangYang/models/ZoneLoc.cs                                                               |   19 
 HH.WCS.Mobox3.HangYang/dispatch/HanAo.cs                                                               |  161 
 HH.WCS.Mobox3.HangYang/models/TN_Receipt_Detail.cs                                                     |   36 
 HH.WCS.Mobox3.HangYang/models/other/ManualTaskSwitch.cs                                                |   17 
 HH.WCS.Mobox3.HangYang/models/TN_ASN_Detail.cs                                                         |   31 
 HH.WCS.Mobox3.HangYang/packages.config                                                                 |   54 
 HH.WCS.Mobox3.HangYang/models/TN_Equipment.cs                                                          |   26 
 HH.WCS.Mobox3.HangYang/device/PlcHelper.cs                                                             |   99 
 HH.WCS.Mobox3.HangYang/models/BaseModel.cs                                                             |   24 
 HH.WCS.Mobox3.HangYang/models/TN_Loc_EQ_Link.cs                                                        |   17 
 HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction.cs                                                        |   25 
 HH.WCS.Mobox3.HangYang/models/ShippingDetail.cs                                                        |   49 
 HH.WCS.Mobox3.HangYang/util/HttpHelper.cs                                                              |  179 
 HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/FileContentIndex/faa4a5bc-d614-4b2f-94ef-554dca2088fa.vsidx  |    0 
 HH.WCS.Mobox3.HangYang/HH.WCS.HangYang.csproj                                                          |  316 +
 HH.WCS.Mobox3.HangYang/models/PutawayOrder.cs                                                          |   39 
 HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction_Msg.cs                                                    |   25 
 HH.WCS.Mobox3.HangYang/models/Zone.cs                                                                  |   48 
 HH.WCS.Mobox3.HangYang/models/OI_WMS_SCHEDULE_TYPE.cs                                                  |   26 
 HH.WCS.Mobox3.HangYang/models/WHInventory.cs                                                           |   28 
 HH.WCS.Mobox3.HangYang/device/ModbusHelper.cs                                                          |  234 +
 HH.WCS.Mobox3.HangYang/models/OI_WMS_OP_DEF.cs                                                         |   33 
 HH.WCS.Mobox3.HangYang/models/TN_WMS_Const.cs                                                          |   19 
 HH.WCS.Mobox3.HangYang/App_Start/SwaggerControllerDescProvider.cs                                      |   82 
 HH.WCS.Mobox3.HangYang/models/TN_Outbound_Order.cs                                                     |   22 
 HH.WCS.Mobox3.HangYang/util/SqlHelper.cs                                                               |  140 
 HH.WCS.Mobox3.HangYang/models/TN_LC_Log.cs                                                             |   23 
 HH.WCS.Mobox3.HangYang/models/TN_Inspect_Order.cs                                                      |   27 
 HH.WCS.Mobox3.HangYang/models/LocCntrRel.cs                                                            |   35 
 HH.WCS.Mobox3.HangYang/dispatch/GZRobot.cs                                                             |  321 +
 HH.WCS.Mobox3.HangYang/models/TN_Inspect_Detail.cs                                                     |   36 
 HH.WCS.Mobox3.HangYang/api/MesController.cs                                                            |   16 
 HH.WCS.Mobox3.HangYang/Program.cs                                                                      |  232 +
 HH.WCS.Mobox3.HangYang/core/Monitor.cs                                                                 |  116 
 HH.WCS.Mobox3.HangYang/App.config                                                                      |   67 
 HH.WCS.Mobox3.HangYang/util/ExpressionHelper.cs                                                        |   45 
 HH.WCS.Mobox3.HangYang/wms/App.config                                                                  |   67 
 HH.WCS.Mobox3.HangYang/wms/SYSHelper.cs                                                                |   43 
 HH.WCS.Mobox3.HangYang/models/SortingCompose.cs                                                        |   37 
 HH.WCS.Mobox3.HangYang/dispatch/NDC.cs                                                                 |  164 
 HH.WCS.Mobox3.HangYang/api/MoboxController.cs                                                          |  153 
 HH.WCS.Mobox3.HangYang/models/TN_OOS_Detail.cs                                                         |   25 
 HH.WCS.Mobox3.HangYang/models/TN_Receipt_Order.cs                                                      |   32 
 HH.WCS.Mobox3.HangYang/models/TN_Purchase_Detail.cs                                                    |   21 
 HH.WCS.Mobox3.HangYang/models/WMSTask.cs                                                               |   79 
 HH.WCS.Mobox3.HangYang/Oracle.ManagedDataAccess.Client.Configuration.Section.xsd                       |  221 +
 HH.WCS.Mobox3.HangYang/swagger.js                                                                      |  110 
 HH.WCS.Mobox3.HangYang/models/FunctionArea.cs                                                          |   30 
 HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs                                                          |  606 ++
 HH.WCS.Mobox3.HangYang/Oracle.DataAccess.Common.Configuration.Section.xsd                              |  138 
 HH.WCS.Mobox3.HangYang/api/DebugController.cs                                                          |   44 
 HH.WCS.Mobox3.HangYang/readme.txt                                                                      |    1 
 HH.WCS.Mobox3.HangYang/App_Start/SwaggerConfig.cs                                                      |  255 +
 HH.WCS.Mobox3.HangYang/models/TN_OnOff_Shelves.cs                                                      |   39 
 HH.WCS.Mobox3.HangYang/util/LogHelper.cs                                                               |  146 
 HH.WCS.Mobox3.HangYang/models/DistributionCntrDetail.cs                                                |  196 
 HH.WCS.Mobox3.HangYang/models/TN_Outbound_Detail.cs                                                    |   29 
 HH.WCS.Mobox3.HangYang/models/DistributionCntr.cs                                                      |  131 
 HH.WCS.Mobox3.HangYang/util/STAttribute.cs                                                             |   23 
 HH.WCS.Mobox3.HangYang/models/TN_Check_Order.cs                                                        |   21 
 HH.WCS.Mobox3.HangYang/models/InOrderDetail.cs                                                         |   52 
 HH.WCS.Mobox3.HangYang/models/TN_OOS_Order.cs                                                          |   19 
 HH.WCS.Mobox3.HangYang/process/DeviceProcess.cs                                                        |   26 
 HH.WCS.Mobox3.HangYang/api/ApiHelper.cs                                                                |  336 +
 HH.WCS.Mobox3.HangYang/process/TaskProcess.cs                                                          | 1196 +++++
 HH.WCS.Mobox3.HangYang/api/AgvController.cs                                                            |   46 
 HH.WCS.Mobox3.HangYang/models/TN_Lock.cs                                                               |   23 
 HH.WCS.Mobox3.sln                                                                                      |   25 
 119 files changed, 12,691 insertions(+), 0 deletions(-)

diff --git a/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.GuoXiang/FileContentIndex/e2cd9d58-a4ee-4f5a-8ab1-e2ef73c348e6.vsidx b/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.GuoXiang/FileContentIndex/e2cd9d58-a4ee-4f5a-8ab1-e2ef73c348e6.vsidx
new file mode 100644
index 0000000..3b7cce7
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.GuoXiang/FileContentIndex/e2cd9d58-a4ee-4f5a-8ab1-e2ef73c348e6.vsidx
Binary files differ
diff --git a/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/FileContentIndex/faa4a5bc-d614-4b2f-94ef-554dca2088fa.vsidx b/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/FileContentIndex/faa4a5bc-d614-4b2f-94ef-554dca2088fa.vsidx
new file mode 100644
index 0000000..546508a
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/FileContentIndex/faa4a5bc-d614-4b2f-94ef-554dca2088fa.vsidx
Binary files differ
diff --git a/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/v17/DocumentLayout.json b/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/v17/DocumentLayout.json
new file mode 100644
index 0000000..03f0e76
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/.vs/HH.WCS.JiaTong/v17/DocumentLayout.json
@@ -0,0 +1,12 @@
+{
+  "Version": 1,
+  "WorkspaceRootPath": "D:\\WCS\\HH.WCS.Mobox3\\HH.WCS.Mobox3.GuoXiang\\",
+  "Documents": [],
+  "DocumentGroupContainers": [
+    {
+      "Orientation": 0,
+      "VerticalTabListWidth": 256,
+      "DocumentGroups": []
+    }
+  ]
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HangYang/App.config b/HH.WCS.Mobox3.HangYang/App.config
new file mode 100644
index 0000000..29106d9
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/App.config
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+	<configSections>
+		<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
+	</configSections>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
+	</startup>
+	<runtime>
+		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+			<dependentAssembly>
+				<assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.122.21.1" newVersion="4.122.21.1"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-8.0.0.3" newVersion="8.0.0.3"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
+			</dependentAssembly>
+		</assemblyBinding>
+	</runtime>
+	<system.data>
+		<DbProviderFactories>
+			<remove invariant="Oracle.ManagedDataAccess.Client"/>
+			<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
+		</DbProviderFactories>
+	</system.data>
+</configuration>
diff --git a/HH.WCS.Mobox3.HangYang/App_Start/Startup.cs b/HH.WCS.Mobox3.HangYang/App_Start/Startup.cs
new file mode 100644
index 0000000..1cdf7bb
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/App_Start/Startup.cs
@@ -0,0 +1,48 @@
+锘縰sing System;
+using System.Linq;
+using System.Net.Http.Formatting;
+using System.Threading.Tasks;
+using System.Web.Http;
+using Microsoft.Owin;
+using Owin;
+using Swashbuckle.Application;
+
+[assembly: OwinStartup(typeof(HH.WCS.HangYang.Startup))]
+
+namespace HH.WCS.HangYang {
+    public class Startup {
+        public void Configuration(IAppBuilder app) {
+            // 鏈夊叧濡備綍閰嶇疆搴旂敤绋嬪簭鐨勮缁嗕俊鎭紝璇疯闂�https://go.microsoft.com/fwlink/?LinkID=316888
+            HttpConfiguration config = new HttpConfiguration();
+            config.Routes.MapHttpRoute(
+                name: "DefaultApi",
+                routeTemplate: "api/{controller}/{action}/{id}",
+                defaults: new { id = RouteParameter.Optional }
+                );
+            // Web API routes
+            //config.MapHttpAttributeRoutes();
+            //config.EnableSwagger(c => c.SingleApiVersion("v1", "hh wms api"))
+            //    .EnableSwaggerUi();
+            //config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
+            //config.Formatters.Add(new JsonMediaTypeFormatter());
+
+
+            //WebApiConfig.Register(config);
+            // Web API routes
+            config.MapHttpAttributeRoutes();
+            config.EnableSwagger(c => {
+                c.SingleApiVersion("v1", "hh wms api");
+                c.IncludeXmlComments(System.AppDomain.CurrentDomain.BaseDirectory + "\\HH.WCS.HangYang.LISTA.xml");
+                c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, $@"{System.AppDomain.CurrentDomain.BaseDirectory}\\HH.WCS.HangYang.xml"));
+                c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
+            }
+            ).EnableSwaggerUi(c => {
+                c.InjectJavaScript(System.Reflection.Assembly.GetExecutingAssembly(), "swagger.js");
+            });
+            config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
+            config.Formatters.Add(new JsonMediaTypeFormatter());
+
+            app.UseWebApi(config);
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/App_Start/SwaggerConfig.cs b/HH.WCS.Mobox3.HangYang/App_Start/SwaggerConfig.cs
new file mode 100644
index 0000000..557097d
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/App_Start/SwaggerConfig.cs
@@ -0,0 +1,255 @@
+using System.Web.Http;
+using WebActivatorEx;
+using HH.WCS.Mobox3.Template;
+using Swashbuckle.Application;
+
+[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]
+
+namespace HH.WCS.Mobox3.Template
+{
+    public class SwaggerConfig
+    {
+        public static void Register()
+        {
+            var thisAssembly = typeof(SwaggerConfig).Assembly;
+
+            GlobalConfiguration.Configuration
+                .EnableSwagger(c =>
+                    {
+                        // By default, the service root url is inferred from the request used to access the docs.
+                        // However, there may be situations (e.g. proxy and load-balanced environments) where this does not
+                        // resolve correctly. You can workaround this by providing your own code to determine the root URL.
+                        //
+                        //c.RootUrl(req => GetRootUrlFromAppConfig());
+
+                        // If schemes are not explicitly provided in a Swagger 2.0 document, then the scheme used to access
+                        // the docs is taken as the default. If your API supports multiple schemes and you want to be explicit
+                        // about them, you can use the "Schemes" option as shown below.
+                        //
+                        //c.Schemes(new[] { "http", "https" });
+
+                        // Use "SingleApiVersion" to describe a single version API. Swagger 2.0 includes an "Info" object to
+                        // 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");
+
+                        // If you want the output Swagger docs to be indented properly, enable the "PrettyPrint" option.
+                        //
+                        //c.PrettyPrint();
+
+                        // If your API has multiple versions, use "MultipleApiVersions" instead of "SingleApiVersion".
+                        // In this case, you must provide a lambda that tells Swashbuckle which actions should be
+                        // included in the docs for a given API version. Like "SingleApiVersion", each call to "Version"
+                        // returns an "Info" builder so you can provide additional metadata per API version.
+                        //
+                        //c.MultipleApiVersions(
+                        //    (apiDesc, targetApiVersion) => ResolveVersionSupportByRouteConstraint(apiDesc, targetApiVersion),
+                        //    (vc) =>
+                        //    {
+                        //        vc.Version("v2", "Swashbuckle Dummy API V2");
+                        //        vc.Version("v1", "Swashbuckle Dummy API V1");
+                        //    });
+
+                        // You can use "BasicAuth", "ApiKey" or "OAuth2" options to describe security schemes for the API.
+                        // See https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md for more details.
+                        // NOTE: These only define the schemes and need to be coupled with a corresponding "security" property
+                        // at the document or operation level to indicate which schemes are required for an operation. To do this,
+                        // you'll need to implement a custom IDocumentFilter and/or IOperationFilter to set these properties
+                        // according to your specific authorization implementation
+                        //
+                        //c.BasicAuth("basic")
+                        //    .Description("Basic HTTP Authentication");
+                        //
+						// NOTE: You must also configure 'EnableApiKeySupport' below in the SwaggerUI section
+                        //c.ApiKey("apiKey")
+                        //    .Description("API Key Authentication")
+                        //    .Name("apiKey")
+                        //    .In("header");
+                        //
+                        //c.OAuth2("oauth2")
+                        //    .Description("OAuth2 Implicit Grant")
+                        //    .Flow("implicit")
+                        //    .AuthorizationUrl("http://petstore.swagger.wordnik.com/api/oauth/dialog")
+                        //    //.TokenUrl("https://tempuri.org/token")
+                        //    .Scopes(scopes =>
+                        //    {
+                        //        scopes.Add("read", "Read access to protected resources");
+                        //        scopes.Add("write", "Write access to protected resources");
+                        //    });
+
+                        // Set this flag to omit descriptions for any actions decorated with the Obsolete attribute
+                        //c.IgnoreObsoleteActions();
+
+                        // Each operation be assigned one or more tags which are then used by consumers for various reasons.
+                        // For example, the swagger-ui groups operations according to the first tag of each operation.
+                        // By default, this will be controller name but you can use the "GroupActionsBy" option to
+                        // override with any value.
+                        //
+                        //c.GroupActionsBy(apiDesc => apiDesc.HttpMethod.ToString());
+
+                        // You can also specify a custom sort order for groups (as defined by "GroupActionsBy") to dictate
+                        // the order in which operations are listed. For example, if the default grouping is in place
+                        // (controller name) and you specify a descending alphabetic sort order, then actions from a
+                        // ProductsController will be listed before those from a CustomersController. This is typically
+                        // used to customize the order of groupings in the swagger-ui.
+                        //
+                        //c.OrderActionGroupsBy(new DescendingAlphabeticComparer());
+
+                        // If you annotate Controllers and API Types with
+                        // Xml comments (http://msdn.microsoft.com/en-us/library/b2s063f7(v=vs.110).aspx), you can incorporate
+                        // those comments into the generated docs and UI. You can enable this by providing the path to one or
+                        // more Xml comment files.
+                        //
+                        //c.IncludeXmlComments(GetXmlCommentsPath());
+
+                        // 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:
+                        //
+                        // Use the "MapType" option to override the Schema generation for a specific type.
+                        // It should be noted that the resulting Schema will be placed "inline" for any applicable Operations.
+                        // While Swagger 2.0 supports inline definitions for "all" Schema types, the swagger-ui tool does not.
+                        // It expects "complex" Schemas to be defined separately and referenced. For this reason, you should only
+                        // use the "MapType" option when the resulting Schema is a primitive or array type. If you need to alter a
+                        // complex Schema, use a Schema filter.
+                        //
+                        //c.MapType<ProductType>(() => new Schema { type = "integer", format = "int32" });
+
+                        // If you want to post-modify "complex" Schemas once they've been generated, across the board or for a
+                        // specific type, you can wire up one or more Schema filters.
+                        //
+                        //c.SchemaFilter<ApplySchemaVendorExtensions>();
+
+                        // In a Swagger 2.0 document, complex types are typically declared globally and referenced by unique
+                        // Schema Id. By default, Swashbuckle does NOT use the full type name in Schema Ids. In most cases, this
+                        // works well because it prevents the "implementation detail" of type namespaces from leaking into your
+                        // Swagger docs and UI. However, if you have multiple types in your API with the same class name, you'll
+                        // need to opt out of this behavior to avoid Schema Id conflicts.
+                        //
+                        //c.UseFullTypeNameInSchemaIds();
+
+                        // Alternatively, you can provide your own custom strategy for inferring SchemaId's for
+                        // describing "complex" types in your API.
+                        //
+                        //c.SchemaId(t => t.FullName.Contains('`') ? t.FullName.Substring(0, t.FullName.IndexOf('`')) : t.FullName);
+
+                        // Set this flag to omit schema property descriptions for any type properties decorated with the
+                        // Obsolete attribute
+                        //c.IgnoreObsoleteProperties();
+
+                        // In accordance with the built in JsonSerializer, Swashbuckle will, by default, describe enums as integers.
+                        // You can change the serializer behavior by configuring the StringToEnumConverter globally or for a given
+                        // enum type. Swashbuckle will honor this change out-of-the-box. However, if you use a different
+                        // approach to serialize enums as strings, you can also force Swashbuckle to describe them as strings.
+                        //
+                        //c.DescribeAllEnumsAsStrings();
+
+                        // Similar to Schema filters, Swashbuckle also supports Operation and Document filters:
+                        //
+                        // Post-modify Operation descriptions once they've been generated by wiring up one or more
+                        // Operation filters.
+                        //
+                        //c.OperationFilter<AddDefaultResponse>();
+                        //
+                        // If you've defined an OAuth2 flow as described above, you could use a custom filter
+                        // to inspect some attribute on each action and infer which (if any) OAuth2 scopes are required
+                        // to execute the operation
+                        //
+                        //c.OperationFilter<AssignOAuth2SecurityRequirements>();
+
+                        // Post-modify the entire Swagger document by wiring up one or more Document filters.
+                        // This gives full control to modify the final SwaggerDocument. You should have a good understanding of
+                        // the Swagger 2.0 spec. - https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md
+                        // before using this option.
+                        //
+                        //c.DocumentFilter<ApplyDocumentVendorExtensions>();
+
+                        // In contrast to WebApi, Swagger 2.0 does not include the query string component when mapping a URL
+                        // to an action. As a result, Swashbuckle will raise an exception if it encounters multiple actions
+                        // with the same path (sans query string) and HTTP method. You can workaround this by providing a
+                        // custom strategy to pick a winner or merge the descriptions for the purposes of the Swagger docs
+                        //
+                        //c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
+
+                        // Wrap the default SwaggerGenerator with additional behavior (e.g. caching) or provide an
+                        // alternative implementation for ISwaggerProvider with the CustomProvider option.
+                        //
+                        //c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider));
+                    })
+                .EnableSwaggerUi(c =>
+                    {
+                        // Use the "DocumentTitle" option to change the Document title.
+                        // Very helpful when you have multiple Swagger pages open, to tell them apart.
+                        //
+                        //c.DocumentTitle("My Swagger UI");
+
+                        // Use the "InjectStylesheet" option to enrich the UI with one or more additional CSS stylesheets.
+                        // The file must be included in your project as an "Embedded Resource", and then the resource's
+                        // "Logical Name" is passed to the method as shown below.
+                        //
+                        //c.InjectStylesheet(containingAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testStyles1.css");
+
+                        // Use the "InjectJavaScript" option to invoke one or more custom JavaScripts after the swagger-ui
+                        // has loaded. The file must be included in your project as an "Embedded Resource", and then the resource's
+                        // "Logical Name" is passed to the method as shown above.
+                        //
+                        //c.InjectJavaScript(thisAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testScript1.js");
+
+                        // The swagger-ui renders boolean data types as a dropdown. By default, it provides "true" and "false"
+                        // strings as the possible choices. You can use this option to change these to something else,
+                        // for example 0 and 1.
+                        //
+                        //c.BooleanValues(new[] { "0", "1" });
+
+                        // By default, swagger-ui will validate specs against swagger.io's online validator and display the result
+                        // in a badge at the bottom of the page. Use these options to set a different validator URL or to disable the
+                        // feature entirely.
+                        //c.SetValidatorUrl("http://localhost/validator");
+                        //c.DisableValidator();
+
+                        // Use this option to control how the Operation listing is displayed.
+                        // It can be set to "None" (default), "List" (shows operations for each resource),
+                        // or "Full" (fully expanded: shows operations and their details).
+                        //
+                        //c.DocExpansion(DocExpansion.List);
+
+                        // Specify which HTTP operations will have the 'Try it out!' option. An empty paramter list disables
+                        // it for all operations.
+                        //
+                        //c.SupportedSubmitMethods("GET", "HEAD");
+
+                        // Use the CustomAsset option to provide your own version of assets used in the swagger-ui.
+                        // It's typically used to instruct Swashbuckle to return your version instead of the default
+                        // when a request is made for "index.html". As with all custom content, the file must be included
+                        // in your project as an "Embedded Resource", and then the resource's "Logical Name" is passed to
+                        // the method as shown below.
+                        //
+                        //c.CustomAsset("index", containingAssembly, "YourWebApiProject.SwaggerExtensions.index.html");
+
+                        // If your API has multiple versions and you've applied the MultipleApiVersions setting
+                        // as described above, you can also enable a select box in the swagger-ui, that displays
+                        // a discovery URL for each version. This provides a convenient way for users to browse documentation
+                        // for different API versions.
+                        //
+                        //c.EnableDiscoveryUrlSelector();
+
+                        // If your API supports the OAuth2 Implicit flow, and you've described it correctly, according to
+                        // the Swagger 2.0 specification, you can enable UI support as shown below.
+                        //
+                        //c.EnableOAuth2Support(
+                        //    clientId: "test-client-id",
+                        //    clientSecret: null,
+                        //    realm: "test-realm",
+                        //    appName: "Swagger UI"
+                        //    //additionalQueryStringParams: new Dictionary<string, string>() { { "foo", "bar" } }
+                        //);
+
+                        // If your API supports ApiKey, you can override the default values.
+                        // "apiKeyIn" can either be "query" or "header"
+                        //
+                        //c.EnableApiKeySupport("apiKey", "header");
+                    });
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/App_Start/SwaggerControllerDescProvider.cs b/HH.WCS.Mobox3.HangYang/App_Start/SwaggerControllerDescProvider.cs
new file mode 100644
index 0000000..0f4d57f
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/App_Start/SwaggerControllerDescProvider.cs
@@ -0,0 +1,82 @@
+锘縰sing Swashbuckle.Swagger;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml;
+
+namespace HH.WCS.HangYang {
+    /// <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/HH.WCS.Mobox3.HangYang/HH.WCS.HangYang.csproj b/HH.WCS.Mobox3.HangYang/HH.WCS.HangYang.csproj
new file mode 100644
index 0000000..431c469
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/HH.WCS.HangYang.csproj
@@ -0,0 +1,316 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{0D76040B-45FB-EB89-2535-E32E957D1429}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>HH.WCS.HangYang.LISTA</RootNamespace>
+    <AssemblyName>HH.WCS.HangYang.LISTA</AssemblyName>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Debug\HH.WCS.HangYang.LISTA.xml</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="BouncyCastle.Crypto, Version=1.8.6.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
+      <HintPath>..\packages\Portable.BouncyCastle.1.8.6\lib\net40\BouncyCastle.Crypto.dll</HintPath>
+    </Reference>
+    <Reference Include="EasyModbus">
+      <HintPath>..\packages\EasyModbusTCP.5.6.0\lib\net40\EasyModbus.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Owin.4.2.2\lib\net45\Microsoft.Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin.Host.HttpListener, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Owin.Host.HttpListener.4.2.2\lib\net45\Microsoft.Owin.Host.HttpListener.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin.Hosting, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Owin.Hosting.4.2.2\lib\net45\Microsoft.Owin.Hosting.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
+      <HintPath>..\packages\NLog.5.1.1\lib\net45\NLog.dll</HintPath>
+    </Reference>
+    <Reference Include="Opc.UaFx.Client, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0220af0d33d50236, processorArchitecture=MSIL">
+      <HintPath>..\packages\Opc.UaFx.Client.2.42.0\lib\net46\Opc.UaFx.Client.dll</HintPath>
+    </Reference>
+    <Reference Include="Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL">
+      <HintPath>..\packages\Oracle.ManagedDataAccess.21.15.0\lib\net462\Oracle.ManagedDataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
+      <HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="S7.Net">
+      <HintPath>..\packages\S7netplus.0.20.0\lib\net452\S7.Net.dll</HintPath>
+    </Reference>
+    <Reference Include="SqlSugar, Version=5.1.3.46, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\SqlSugar.5.1.3.47\lib\SqlSugar.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <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="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.Configuration" />
+    <Reference Include="System.Configuration.Install" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Diagnostics.DiagnosticSource, Version=6.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Diagnostics.DiagnosticSource.6.0.1\lib\net461\System.Diagnostics.DiagnosticSource.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Formats.Asn1, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Formats.Asn1.8.0.0\lib\net462\System.Formats.Asn1.dll</HintPath>
+    </Reference>
+    <Reference Include="System.IdentityModel" />
+    <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
+      <Private>True</Private>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Management" />
+    <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
+      <Private>True</Private>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System.Net.Http.Formatting, Version=5.2.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Net.Http.Formatting.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Numerics" />
+    <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
+      <Private>True</Private>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net461\System.Security.Cryptography.Algorithms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.ServiceModel.Primitives, Version=4.5.0.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.ServiceModel.Primitives.4.5.3\lib\net461\System.ServiceModel.Primitives.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ServiceProcess" />
+    <Reference Include="System.Text.Encodings.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Text.Json, Version=8.0.0.3, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Text.Json.8.0.3\lib\net462\System.Text.Json.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\System.Web.Http.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web.Http.Owin, Version=5.2.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Web.Http.Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="Topshelf, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b, processorArchitecture=MSIL">
+      <HintPath>..\packages\Topshelf.4.3.0\lib\net452\Topshelf.dll</HintPath>
+    </Reference>
+    <Reference Include="Topshelf.NLog, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b, processorArchitecture=MSIL">
+      <HintPath>..\packages\Topshelf.NLog.4.3.0\lib\net452\Topshelf.NLog.dll</HintPath>
+    </Reference>
+    <Reference Include="WebActivatorEx, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4, processorArchitecture=MSIL">
+      <HintPath>..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="api\LiKuController.cs" />
+    <Compile Include="api\MesController.cs" />
+    <Compile Include="api\MoboxController.cs" />
+    <Compile Include="api\AgvController.cs" />
+    <Compile Include="api\ApiModel.cs" />
+    <Compile Include="api\DebugController.cs" />
+    <Compile Include="App_Start\SwaggerControllerDescProvider.cs" />
+    <Compile Include="core\WMSCore.cs" />
+    <Compile Include="device\ModbusHelper.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="core\Monitor.cs" />
+    <Compile Include="models\BaseModel.cs" />
+    <Compile Include="models\Area.cs" />
+    <Compile Include="models\CntrItemDetail.cs" />
+    <Compile Include="models\DistributionCntr.cs" />
+    <Compile Include="models\DistributionCntrDetail.cs" />
+    <Compile Include="models\InOrder.cs" />
+    <Compile Include="models\InOrderDetail.cs" />
+    <Compile Include="models\OI_WMS_OP_DEF.cs" />
+    <Compile Include="models\OI_WMS_SCHEDULE_TYPE.cs" />
+    <Compile Include="models\OI_WMS_TASK_TYPE.cs" />
+    <Compile Include="models\other\ManualTaskSwitch.cs" />
+    <Compile Include="models\OutOrder.cs" />
+    <Compile Include="models\OutOrderDetail.cs" />
+    <Compile Include="models\PutawayDetail.cs" />
+    <Compile Include="models\PutawayOrder.cs" />
+    <Compile Include="models\TN_ASN_Detail.cs" />
+    <Compile Include="models\TN_ASN_Order.cs" />
+    <Compile Include="models\AZInventory.cs" />
+    <Compile Include="models\TN_Business_Source.cs" />
+    <Compile Include="models\TN_Check_Detail.cs" />
+    <Compile Include="models\TN_Check_List.cs" />
+    <Compile Include="models\TN_Check_Order.cs" />
+    <Compile Include="models\Container.cs" />
+    <Compile Include="models\TN_Equipment.cs" />
+    <Compile Include="models\TN_Factory.cs" />
+    <Compile Include="models\FunctionArea.cs" />
+    <Compile Include="models\TN_Inspect_Detail.cs" />
+    <Compile Include="models\TN_Inspect_Order.cs" />
+    <Compile Include="models\TN_Inspect_Record.cs" />
+    <Compile Include="models\TN_LC_Log.cs" />
+    <Compile Include="models\Location.cs" />
+    <Compile Include="models\TN_Lock.cs" />
+    <Compile Include="models\LocCntrRel.cs" />
+    <Compile Include="models\TN_Loc_EQ_Link.cs" />
+    <Compile Include="models\TN_Material.cs" />
+    <Compile Include="models\TN_MQ_EQAction.cs" />
+    <Compile Include="models\TN_MQ_EQAction_Msg.cs" />
+    <Compile Include="models\TN_OnOff_Shelves.cs" />
+    <Compile Include="models\TN_OOS_Detail.cs" />
+    <Compile Include="models\TN_OOS_Order.cs" />
+    <Compile Include="models\Wcsmodel.cs" />
+    <Compile Include="models\WHInventory.cs" />
+    <Compile Include="models\TN_WMS_Const.cs" />
+    <Compile Include="models\wms\Algorit.cs" />
+    <Compile Include="models\Zone.cs" />
+    <Compile Include="models\ZoneCls.cs" />
+    <Compile Include="models\ZoneLoc.cs" />
+    <Compile Include="models\WMSTask.cs" />
+    <Compile Include="models\TN_Outbound_Detail.cs" />
+    <Compile Include="models\TN_Outbound_Order.cs" />
+    <Compile Include="models\TN_Purchase_Detail.cs" />
+    <Compile Include="models\TN_Purchase_Order.cs" />
+    <Compile Include="models\TN_Receipt_Detail.cs" />
+    <Compile Include="models\TN_Receipt_Order.cs" />
+    <Compile Include="models\ShippingDetail.cs" />
+    <Compile Include="models\ShippingOrder.cs" />
+    <Compile Include="models\SortingCompose.cs" />
+    <Compile Include="models\SortingDetail.cs" />
+    <Compile Include="models\SortingOrder.cs" />
+    <Compile Include="models\SortingResult.cs" />
+    <Compile Include="models\TN_Supplier.cs" />
+    <Compile Include="models\WCSTask.cs" />
+    <Compile Include="models\TaskAction.cs" />
+    <Compile Include="models\TN_Warehouse.cs" />
+    <Compile Include="process\DeviceProcess.cs" />
+    <Compile Include="core\WCSCore.cs" />
+    <Compile Include="api\WmsController.cs" />
+    <Compile Include="api\ApiHelper.cs" />
+    <Compile Include="dispatch\HostToAGV.cs" />
+    <Compile Include="process\HttpModel.cs" />
+    <Compile Include="process\TaskProcess.cs" />
+    <Compile Include="util\ExpressionHelper.cs" />
+    <Compile Include="util\LogHelper.cs" />
+    <Compile Include="util\StrHelper.cs" />
+    <Compile Include="util\STAttribute.cs" />
+    <Compile Include="wms\ContainerHelper.cs" />
+    <Compile Include="wms\LocationHelper.cs" />
+    <Compile Include="wms\WMSHelper.cs" />
+    <Compile Include="wms\SYSHelper.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="util\Settings.cs" />
+    <Compile Include="util\SqlHelper.cs" />
+    <Compile Include="App_Start\Startup.cs" />
+    <Compile Include="dispatch\NDCHelper.cs" />
+    <Compile Include="util\HttpHelper.cs" />
+    <Compile Include="wms\WCSHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="config\config.json">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="Oracle.DataAccess.Common.Configuration.Section.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Oracle.ManagedDataAccess.Client.Configuration.Section.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="packages.config" />
+    <None Include="wms\App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="config\configDesc.txt" />
+    <Content Include="readme.txt" />
+    <EmbeddedResource Include="swagger.js">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HangYang/Oracle.DataAccess.Common.Configuration.Section.xsd b/HH.WCS.Mobox3.HangYang/Oracle.DataAccess.Common.Configuration.Section.xsd
new file mode 100644
index 0000000..eee2d5c
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/Oracle.DataAccess.Common.Configuration.Section.xsd
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:simpleType name="parameterDirection">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="Output"/>
+      <xs:enumeration value="InputOutput"/>
+      <xs:enumeration value="ReturnValue"/>
+      <xs:enumeration value="Implicit"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="customBoolean">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="true"/>
+      <xs:enumeration value="false"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="ONSParameters">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="nodeList"/>
+      <!--<xs:enumeration value="walletFile"/>
+      <xs:enumeration value="walletPassword"/>-->
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="ONSModeValues">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="local"/>
+      <xs:enumeration value="remote"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="datatype">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="System.Binary"/>
+      <xs:enumeration value="System.Boolean"/>
+      <xs:enumeration value="System.Byte"/>
+      <xs:enumeration value="System.Byte[]"/>
+      <xs:enumeration value="System.Char"/>
+      <xs:enumeration value="System.DateTime"/>
+      <xs:enumeration value="System.DateTimeOffset"/>
+      <xs:enumeration value="System.Decimal"/>
+      <xs:enumeration value="System.Double"/>
+      <xs:enumeration value="System.Guid"/>
+      <xs:enumeration value="System.Int16"/>
+      <xs:enumeration value="System.Int32"/>
+      <xs:enumeration value="System.Int64"/>
+      <xs:enumeration value="System.SByte"/>
+      <xs:enumeration value="System.Single"/>
+      <xs:enumeration value="System.String"/>
+      <xs:enumeration value="System.TimeSpan"/>
+      <xs:enumeration value="System.UInt16"/>
+      <xs:enumeration value="System.UInt32"/>
+      <xs:enumeration value="System.UInt64"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="providerType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="BFile"/>
+      <xs:enumeration value="BinaryFloat"/>
+      <xs:enumeration value="BinaryDouble"/>
+      <xs:enumeration value="Blob"/>
+      <xs:enumeration value="Byte"/>
+      <xs:enumeration value="Char"/>
+      <xs:enumeration value="Clob"/>
+      <xs:enumeration value="Date"/>
+      <xs:enumeration value="Decimal"/>
+      <xs:enumeration value="Double"/>
+      <xs:enumeration value="Int16"/>
+      <xs:enumeration value="Int32"/>
+      <xs:enumeration value="Int64"/>
+      <xs:enumeration value="IntervalDS"/>
+      <xs:enumeration value="IntervalYM"/>
+      <xs:enumeration value="Long"/>
+      <xs:enumeration value="LongRaw"/>
+      <xs:enumeration value="NChar"/>
+      <xs:enumeration value="NClob"/>
+      <xs:enumeration value="NVarchar2"/>
+      <xs:enumeration value="Object"/>
+      <xs:enumeration value="Raw"/>
+      <xs:enumeration value="Single"/>
+      <xs:enumeration value="TimeStamp"/>
+      <xs:enumeration value="TimeStampLTZ"/>
+      <xs:enumeration value="TimeStampTZ"/>
+      <xs:enumeration value="Varchar2"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="nativeDataType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="BFile"/>
+      <xs:enumeration value="Binary_Float"/>
+      <xs:enumeration value="Binary_Double"/>
+      <xs:enumeration value="Blob"/>
+      <xs:enumeration value="Char"/>
+      <xs:enumeration value="Clob"/>
+      <xs:enumeration value="Date"/>
+      <xs:enumeration value="Number"/>
+      <xs:enumeration value="Interval Day To Second"/>
+      <xs:enumeration value="Interval Year To Month"/>
+      <xs:enumeration value="Long"/>
+      <xs:enumeration value="Long Raw"/>
+      <xs:enumeration value="NChar"/>
+      <xs:enumeration value="NClob"/>
+      <xs:enumeration value="NVarchar2"/>
+      <xs:enumeration value="Raw"/>
+      <xs:enumeration value="Rowid"/>
+      <xs:enumeration value="Timestamp"/>
+      <xs:enumeration value="Timestamp With Local Time Zone"/>
+      <xs:enumeration value="Timestamp With Time Zone"/>
+      <xs:enumeration value="URowid"/>
+      <xs:enumeration value="UserDefinedType"/>
+      <xs:enumeration value="Varchar2"/>
+      <xs:enumeration value="XmlType"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="providerDBType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="AnsiString"/>
+      <xs:enumeration value="AnsiStringFixedLength"/>
+      <xs:enumeration value="Binary"/>
+      <xs:enumeration value="Byte"/>
+      <xs:enumeration value="Date"/>
+      <xs:enumeration value="DateTime"/>
+      <xs:enumeration value="DateTimeOffset"/>
+      <xs:enumeration value="Decimal"/>
+      <xs:enumeration value="Double"/>
+      <xs:enumeration value="Int16"/>
+      <xs:enumeration value="Int32"/>
+      <xs:enumeration value="Int64"/>
+      <xs:enumeration value="Object"/>
+      <xs:enumeration value="Single"/>
+      <xs:enumeration value="String"/>
+      <xs:enumeration value="StringFixedLength"/>
+      <xs:enumeration value="Time"/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>
diff --git a/HH.WCS.Mobox3.HangYang/Oracle.ManagedDataAccess.Client.Configuration.Section.xsd b/HH.WCS.Mobox3.HangYang/Oracle.ManagedDataAccess.Client.Configuration.Section.xsd
new file mode 100644
index 0000000..70935a1
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/Oracle.ManagedDataAccess.Client.Configuration.Section.xsd
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+  <xs:include schemaLocation="Oracle.DataAccess.Common.Configuration.Section.xsd"/>
+  <xs:element name="oracle.manageddataaccess.client" >
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element name="version" type="odpmversiontype" minOccurs="0" />
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <xs:complexType name="odpmversiontype">
+    <xs:complexContent>
+      <xs:extension base="odpmparameters">
+        <xs:attribute name="number" type="xs:string" use="required" />
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="odpmparameters">
+    <xs:all>
+      <xs:element minOccurs="0" name="settings">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="setting">
+              <xs:complexType>
+                <xs:attribute name="name" type="xs:string" use="required" />
+                <xs:attribute name="value" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element minOccurs="0" name="udtMappings">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="udtMapping">
+              <xs:complexType>
+                <xs:attribute name="typeName" type="xs:string" use="required" />
+                <xs:attribute name="factoryName" type="xs:string" use="required" />
+                <xs:attribute name="dataSource" type="xs:string" use="required" />
+                <xs:attribute name="schemaName" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element minOccurs="0" name="LDAPsettings">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="LDAPsetting">
+              <xs:complexType>
+                <xs:attribute name="name" type="xs:string" use="required" />
+                <xs:attribute name="value" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element minOccurs="0" name="distributedTransaction">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="setting">
+              <xs:complexType>
+                <xs:attribute name="name" type="xs:string" use="required" />
+                <xs:attribute name="value" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element minOccurs="0" name="dataSources">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="dataSource">
+              <xs:complexType>
+                <xs:attribute name="alias" type="xs:string" use="required" />
+                <xs:attribute name="descriptor" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+
+      <xs:element minOccurs="0" name="connectionPools">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="connectionPool">
+              <xs:complexType>
+                <xs:attribute name="connectionString" type="xs:string" use="required" />
+                <xs:attribute name="poolName" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+
+
+      <xs:element minOccurs="0" name="edmMappings">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" maxOccurs="unbounded" name="edmMapping">
+              <xs:complexType>
+                <xs:sequence>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" name="add">
+                    <xs:complexType>
+                      <xs:attribute name="name" type="xs:string" use="required" />
+                      <xs:attribute name="precision" type="xs:int" use="required" />
+                    </xs:complexType>
+                  </xs:element>
+                </xs:sequence>
+                <xs:attribute name="dataType" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+            <xs:element minOccurs="0" maxOccurs="unbounded" name="edmNumberMapping">
+              <xs:complexType>
+                <xs:sequence>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" name="add">
+                    <xs:complexType>
+                      <xs:attribute name="NETType" type="xs:string" use="required" />
+                      <xs:attribute name="MinPrecision" type="xs:int" use="required" />
+                      <xs:attribute name="MaxPrecision" type="xs:int" use="required" />
+                      <xs:attribute name="DBType" type="xs:string" use="required" />
+                    </xs:complexType>
+                  </xs:element>
+                </xs:sequence>
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element minOccurs="0" name="implicitRefCursor">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" minOccurs="0" name="storedProcedure">
+              <xs:complexType>
+                <xs:sequence>
+                  <xs:element maxOccurs="unbounded" minOccurs="1" name="refCursor">
+                    <xs:complexType>
+                      <xs:sequence>
+                        <xs:element maxOccurs="1" minOccurs="1" name="bindInfo">
+                          <xs:complexType>
+                            <xs:attribute name="mode" type="parameterDirection" use="required" />
+                          </xs:complexType>
+                        </xs:element>
+                        <xs:element maxOccurs="unbounded" minOccurs="0" name="metadata">
+                          <xs:complexType>
+                            <xs:attribute name="columnOrdinal" type="xs:int" use="required" />
+                            <xs:attribute name="columnName" type="xs:string" use="required" />
+                            <xs:attribute name="baseColumnName" type="xs:string" use="optional" />
+                            <xs:attribute name="baseSchemaName" type="xs:string" use="optional" />
+                            <xs:attribute name="baseTableName" type="xs:string" use="optional" />
+                            <xs:attribute name="providerType" type="providerType" use="optional" />
+                            <xs:attribute name="columnSize" type="xs:int" use="optional" />
+                            <xs:attribute name="numericPrecision" type="xs:int" use="optional" />
+                            <xs:attribute name="numericScale" type="xs:int" use="optional" />
+                            <xs:attribute name="isUnique" type="customBoolean" use="optional" />
+                            <xs:attribute name="isKey" type="customBoolean" use="optional" />
+                            <xs:attribute name="isRowID" type="customBoolean" use="optional" />
+                            <xs:attribute name="dataType" type="datatype" use="optional" />
+                            <xs:attribute name="allowDBNull" type="customBoolean" use="optional" />
+                            <xs:attribute name="isAliased" type="customBoolean" use="optional" />
+                            <xs:attribute name="isByteSemantic" type="customBoolean" use="optional" />
+                            <xs:attribute name="isExpression" type="customBoolean" use="optional" />
+                            <xs:attribute name="isHidden" type="customBoolean" use="optional" />
+                            <xs:attribute name="isReadOnly" type="customBoolean" use="optional" />
+                            <xs:attribute name="isLong" type="customBoolean" use="optional" />
+                            <xs:attribute name="udtTypeName" type="xs:string" use="optional" />
+                            <xs:attribute name="nativeDataType" type="nativeDataType" use="optional" />
+                            <xs:attribute name="providerDBType" type="providerDBType" use="optional" />
+                            <xs:attribute name="objectName" type="xs:string" use="optional" />
+                          </xs:complexType>
+                        </xs:element>
+                      </xs:sequence>
+                      <xs:attribute name="name" type="xs:string" use="optional" />
+                      <xs:attribute name="position" type="xs:int" use="optional" />
+                    </xs:complexType>
+                  </xs:element>
+                </xs:sequence>
+                <xs:attribute name="schema" type="xs:string" use="optional" />
+                <xs:attribute name="name" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+      <xs:element minOccurs="0" name="onsConfig">
+        <xs:complexType>
+          <xs:sequence>
+ 		    <xs:element minOccurs="0" name="settings">
+				<xs:complexType>
+				  <xs:sequence>
+					<xs:element maxOccurs="2" minOccurs="0" name="setting">
+					  <xs:complexType>
+						<xs:attribute name="name" type="xs:string" use="required" />
+						<xs:attribute name="value" type="xs:string" use="required" />
+					  </xs:complexType>
+					</xs:element>
+				  </xs:sequence>
+				</xs:complexType>
+			</xs:element>
+            <xs:element minOccurs="0" maxOccurs="unbounded" name="ons">
+              <xs:complexType>
+                <xs:sequence>
+                  <xs:element maxOccurs="3" minOccurs="1" name="add">
+                    <xs:complexType>
+                      <xs:attribute name="name" type="ONSParameters" use="required" />
+                      <xs:attribute name="value" type="xs:string" use="required" />
+                    </xs:complexType>
+                  </xs:element>
+                </xs:sequence>
+                <xs:attribute name="database" type="xs:string" use="required" />
+              </xs:complexType>
+            </xs:element>
+          </xs:sequence>
+          <xs:attribute name="configFile" type="xs:string" use="optional" />
+          <xs:attribute name="mode" type="ONSModeValues" use="required" />
+        </xs:complexType>
+      </xs:element>
+    </xs:all>
+  </xs:complexType>
+</xs:schema>
diff --git a/HH.WCS.Mobox3.HangYang/Program.cs b/HH.WCS.Mobox3.HangYang/Program.cs
new file mode 100644
index 0000000..bc97fc6
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/Program.cs
@@ -0,0 +1,232 @@
+锘縰sing HH.WCS.HangYang.api;
+using HH.WCS.HangYang.core;
+using HH.WCS.HangYang.device;
+using HH.WCS.HangYang.process;
+using HH.WCS.HangYang.util;
+using HH.WCS.HangYang.wms;
+using Microsoft.Owin.Hosting;
+using NLog;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Topshelf;
+using Monitor = HH.WCS.HangYang.core.Monitor;
+
+namespace HH.WCS.HangYang
+{
+    internal class Program
+    {
+        static void Main(string[] args)
+        {
+
+
+            Settings.Init();
+            //1.0 寮�惎api
+            Startup();
+            //2.0 寮�惎tcp
+            StartTcp();
+            //3.0 寮�惎绾跨▼
+            var rc = HostFactory.Run(x =>
+            {
+                using (var worker = new WorkThread())
+                {
+                    worker.Start();
+
+                    // 涓荤嚎绋嬬瓑寰呴�鍑轰俊鍙�+                    Console.CancelKeyPress += (s, e) => worker.Stop();
+                    Thread.Sleep(Timeout.Infinite);
+                }
+                x.RunAsLocalSystem();
+
+                x.SetDescription("hh123");
+                x.SetDisplayName("hh123.wms");
+                x.SetServiceName("hh123.wms");
+            });
+
+            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
+            Environment.ExitCode = exitCode;
+        }
+
+        private static void Startup()
+        {
+            Console.WriteLine("Startup ApiController");
+            Task.Run(() =>
+            {
+                //var url = "http://192.168.1.87:8901";//{SettingHelper.port}
+                var url = $"http://+:{Settings.port}";//
+                Console.WriteLine(url);
+                using (WebApp.Start<Startup>(url))
+                {
+                    Console.WriteLine("Running on {0}", url);
+                    Console.ReadLine();
+                }
+            });
+        }
+        private static void StartTcp()
+        {
+            //new TcpServer("192.168.1.87");
+            var host = Dns.GetHostEntry(Dns.GetHostName());
+            foreach (var ip in host.AddressList)
+            {
+                if (ip.AddressFamily == AddressFamily.InterNetwork)
+                {
+                    Console.WriteLine($"ip= {ip.ToString()}");
+                    new TcpServer(ip.ToString());
+                }
+            }
+        }
+
+
+        public class WorkThread : IDisposable
+        {
+            private readonly List<Task> _tasks = new List<Task>();
+            private readonly CancellationTokenSource _cts = new CancellationTokenSource();
+            private bool _disposed;
+
+            private readonly Dictionary<string, Action> _taskRegistry = new Dictionary<string, Action>
+            {
+                {"寰幆浣滀笟鍒涘缓浠诲姟", WCSCore.ExecuteJob},
+                {"寰幆鍏ュ簱鏆傚瓨鍖虹敓鎴愬叆搴撲换鍔�, WCSCore.ProcessZoneInventoryCycle},
+                {"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔�, WCSCore.GenerateFromPicking},
+
+            };
+
+
+            private readonly List<(string Name, Action Action, Task Task)> _taskInfoList = new List<(string, Action, Task)>();
+
+            public void Start()
+            {
+
+                // 鍒涘缓鎵�湁浠诲姟
+                foreach (var task in _taskRegistry)
+                {
+                    var managedTask = CreateManagedTask(task.Value, task.Key, _cts.Token);
+                    _taskInfoList.Add((task.Key, task.Value, managedTask));
+                    _tasks.Add(managedTask);
+                }
+
+                // 鍚姩鍋ュ悍鐩戞帶
+                _tasks.Add(StartHealthMonitor());
+
+                LogHelper.Info($"宸ヤ綔绾跨▼宸插惎鍔紝鍏�{_tasks.Count} 涓换鍔�);
+
+            }
+            public void Stop()
+            {
+                if (_cts.IsCancellationRequested) return;
+
+                LogHelper.Info("姝e湪鍋滄宸ヤ綔绾跨▼...");
+                _cts.Cancel();
+
+                Task.WhenAll(_tasks)
+                    .ContinueWith(t =>
+                    {
+                        _tasks.Clear();
+                        LogHelper.Info("鎵�湁宸ヤ綔绾跨▼宸插仠姝�);
+                    });
+            }
+            private Task CreateManagedTask(Action action, string taskName, CancellationToken ct)
+            {
+                int retryCount = 0;
+
+                return Task.Run(async () =>
+                {
+                    LogHelper.Info($"浠诲姟 [{taskName}] 鍚姩");
+
+                    while (!ct.IsCancellationRequested)
+                    {
+                        try
+                        {
+                            var stopwatch = Stopwatch.StartNew();
+                            action();
+                            stopwatch.Stop();
+
+                            if (stopwatch.ElapsedMilliseconds > 10000)
+                            {
+                                LogHelper.Info($"浠诲姟 [{taskName}] 鎵ц鏃堕棿杩囬暱: {stopwatch.ElapsedMilliseconds}ms");
+                            }
+                        }
+                        catch (OperationCanceledException)
+                        {
+                            LogHelper.Info($"浠诲姟 [{taskName}] 宸插彇娑�);
+                            break;
+                        }
+                        catch (Exception ex)
+                        {
+                            LogHelper.Error($"浠诲姟 [{taskName}] 鎵ц澶辫触: {ex.Message}", ex);
+                            var delay = Math.Min(30000, 1000 * (int)Math.Pow(2, retryCount));
+                            await Task.Delay(delay, ct);
+                            retryCount++;
+                        }
+
+                        await Task.Delay(3000, ct);
+                    }
+
+                    LogHelper.Info($"浠诲姟 [{taskName}] 宸查�鍑�);
+                }, ct);
+            }
+            public void Dispose()
+            {
+                if (_disposed) return;
+
+                Stop();
+                _cts.Dispose();
+                _disposed = true;
+                GC.SuppressFinalize(this);
+            }
+
+            private Task StartHealthMonitor()
+            {
+                return Task.Run(async () =>
+                {
+                    while (!_cts.IsCancellationRequested)
+                    {
+                        var faultedTasks = _taskInfoList.Where(x => x.Task.IsFaulted).ToList();
+                        foreach (var (name, action, task) in faultedTasks)
+                        {
+                            LogHelper.Info($"妫�祴鍒板け璐ヤ换鍔� {name}");
+
+                            // 绉婚櫎鏃т换鍔�+                            _taskInfoList.Remove((name, action, task));
+                            _tasks.Remove(task);
+
+                            // 鍒涘缓鏂颁换鍔�+                            var newTask = CreateManagedTask(action, name, _cts.Token);
+                            _taskInfoList.Add((name, action, newTask));
+                            _tasks.Add(newTask);
+                        }
+
+                        await Task.Delay(10000, _cts.Token);
+                    }
+                }, _cts.Token);
+            }
+
+
+            private Task GetTask(Action action)
+            {
+                var task = Task.Run(() =>
+                {
+                    while (true)
+                    {
+                        try
+                        {
+                            action();
+                        }
+                        catch (Exception ex)
+                        {
+                            LogHelper.Error(ex.Message, ex);
+                        }
+                        Thread.Sleep(3000);
+                    }
+                });
+                return task;
+            }
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/Properties/AssemblyInfo.cs b/HH.WCS.Mobox3.HangYang/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0a9e751
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�埇淇℃伅鐢变互涓�+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�鍙慨鏀�+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭�
+[assembly: AssemblyTitle("HH.WCS.HangYang")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HH.WCS.HangYang")]
+[assembly: AssemblyCopyright("Copyright 漏  2023")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏�ComVisible 璁剧疆涓�false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵�COM 缁勪欢涓嶅彲瑙併�濡傛灉闇�浠�COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�璁剧疆涓�true銆�+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("8e589c0d-7d65-474d-8ced-e34e087126a1")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�缁勬垚: 
+//
+//      涓荤増鏈�+//      娆$増鏈�+//      鐢熸垚鍙�+//      淇鍙�+//
+//鍙互鎸囧畾鎵�湁杩欎簺鍊硷紝涔熷彲浠ヤ娇鐢ㄢ�鐢熸垚鍙封�鍜屸�淇鍙封�鐨勯粯璁ゅ�
+//閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/HH.WCS.Mobox3.HangYang/api/AgvController.cs b/HH.WCS.Mobox3.HangYang/api/AgvController.cs
new file mode 100644
index 0000000..5d3bba5
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/AgvController.cs
@@ -0,0 +1,46 @@
+锘縰sing HH.WCS.HangYang.core;
+using HH.WCS.HangYang.dispatch;
+using HH.WCS.HangYang.process;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Web.Http;
+using static HH.WCS.HangYang.api.ApiModel;
+
+namespace HH.WCS.HangYang.api
+{
+    /// <summary>
+    /// 璁惧淇℃伅涓婃姤锛坔osttoagv涓婃姤銆佹澀濂ュ爢鍨涙満銆佸浗鑷猘gv锛�+    /// </summary>
+    //[RoutePrefix("agv")]
+    public class AgvController : System.Web.Http.ApiController
+    {
+        /// <summary>
+        /// ndc agv浠诲姟鐘舵�鍥炴姤
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        //[Route("AGVCallbackState")]
+        public ReturnResult AGVCallbackState(AgvTaskState model) {
+            LogHelper.Info("AGVCallbackState Request锛� + JsonConvert.SerializeObject(model), "HosttoagvTask");
+            WCSCore.OperateAgvTaskStatus(model);
+            return new ReturnResult();
+        }
+
+        /// <summary>
+        /// 鍥借嚜浠诲姟鐘舵�鍥炴姤
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        //[Route("AGVDeviceReceive")]
+        public GzResult orderStatusReport(orderStatusReportParme model) {
+            LogHelper.Info("orderStatusReport 鍙傛暟锛� + JsonConvert.SerializeObject(model), "API");
+            return GZRobot.orderStatusReport(model);
+        }
+
+        
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/api/ApiHelper.cs b/HH.WCS.Mobox3.HangYang/api/ApiHelper.cs
new file mode 100644
index 0000000..511bfb6
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/ApiHelper.cs
@@ -0,0 +1,336 @@
+锘縰sing HH.WCS.HangYang.device;
+
+using HH.WCS.HangYang.process;
+using HH.WCS.HangYang.util;
+using HH.WCS.HangYang.wms;
+using Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using static HH.WCS.HangYang.api.ApiModel;
+using static HH.WCS.HangYang.api.OtherModel;
+
+namespace HH.WCS.HangYang.api
+{
+    /// <summary>
+    /// api鎺ュ彛杈呭姪绫�+    /// </summary>
+    public class ApiHelper
+    {
+        static ApiHelper()
+        {
+
+        }
+
+        /// <summary>
+        /// 鎵剧粓鐐圭┖璐т綅
+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindEndcolByLocList(List<Location> locations, string itemcode)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                Location end = null;
+                //鏍规嵁缁堢偣璐т綅鎵剧┖闂茶揣浣�+                var rows = locations.Select(a => a.N_COL).Distinct().ToList();
+                for (int i = 0; i < rows.Count; i++)
+                {
+                    var rowList = locations.Where(r => r.N_COL == rows[i]).ToList();
+                    if (rowList.Count(a => a.N_CURRENT_NUM == 0) > 0)
+                    {
+                        Location other = null;
+                        //褰撳墠鎺掓病鏈夐攣骞朵笖鏈夌┖浣嶇疆
+                        //鍏堟壘婊′綅锛岀劧鍚庡悗闈竴灞傝涔堟槸绌猴紝瑕佷箞涓嶅瓨鍦�+                        other = rowList.OrderByDescending(a => a.N_LAYER).Where(a => a.N_CURRENT_NUM == 0).FirstOrDefault();
+                        //if (full == null)
+                        //{
+                        //    //娌℃湁婊′綅锛岄偅灏辨壘鏈�皬鐨勭┖浣�+                        //    other = rowList.OrderBy(a => a.N_LAYER).FirstOrDefault();
+                        //}
+                        //else
+                        //{
+                        //    other = rowList.OrderBy(a => a.N_LAYER).Where(a => a.N_LAYER > full.N_LAYER).FirstOrDefault();
+                        //}
+                        //if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "绂佺敤"))
+                        //{
+                        //    //绂佺敤浜嗛�鎷╁悗闈竴涓揣浣�+                        //    other = db.Queryable<Location>().OrderBy(a => a.N_LAYER).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "绂佺敤") && a.S_AREA_CODE == other.S_AREA_CODE && a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First();
+
+                        //    //LogHelper.Info($"绂佺敤閫夋嫨鍚庝竴涓揣浣峽result}", "鎴愬搧");
+                        //}
+                        if (other != null)
+                        {
+                            end = other;
+                            break;
+
+                        }
+
+                    }
+                }
+                return end;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+        /// <summary>
+        /// 鎵捐捣鐐规弧璐т綅
+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindStartcolByLoclist(List<Location> locations)
+        {
+            try
+            {
+                Location start = null;
+                var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList();
+                for (int i = 0; i < rowsStart.Count; i++)
+                {
+                    var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL);
+                    //褰撳墠鎺掓病鏈夐攣骞朵笖鏈夋弧璐т綅
+                    if (rowList.Count(a => a.S_LOCK_STATE.Trim() != "鏃�) == 0 && rowList.Count(a => a.N_CURRENT_NUM == 1) > 0)
+                    {
+                        Location other = null;
+
+                        //鎵惧埌鏈�ぇ鐨勬弧浣嶏紝濡傛灉鏈夊氨鐩存帴鍑�+                        var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault();
+                        if (full != null)
+                        {
+                            other = full;
+                        }
+
+                        if (other != null)
+                        {
+                            start = other;
+                            break;
+                        }
+                    }
+                }
+                return start;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+        private static int GetLocTrayNum(List<LocCntrRel> locNum, int num)
+        {
+            int trayNum = locNum.Count();
+            switch (trayNum)
+            {
+                case 0:
+                    num = 0;
+                    break;
+                case 1:
+                    num = 1;
+                    break;
+                case 2:
+                    num = 1;
+                    break;
+                case 3:
+                    num = 2;
+                    break;
+                case 4:
+                    num = 2;
+                    break;
+            }
+
+            return num;
+        }
+        internal static SimpleResult ShippingOrderExecute(ShippingOrderCheck model)
+        {
+            var result = new SimpleResult();
+            //妫�煡搴撳瓨锛屾洿鏂板彂璐у崟锛岀敓鎴愬垎鎷e崟锛岃嚜鍔ㄥ悎骞舵尝娆�+            //杩欎釜鍚庡彴鍋氭瘮杈冮夯鐑︼紝mobox3搴撳瓨鍦ㄥ唴瀛樹腑锛屼换鍔″畬鎴愮殑鏃跺�鏃犳硶澧炲姞锛岃繕鏄敤c#鐩存帴绠″唴瀛橈紝璁$畻姣旇緝鏂逛究
+            WMSHelper.CreateSortingOrder(model.out_nos.Split(',').ToList());
+            return result;
+        }
+
+        /// <summary>
+        /// 鍚庨潰瑕佹妸鏂规硶鏀惧埌wmsHelper涓�+        /// </summary>
+        /// <param name="models"></param>
+        /// <returns></returns>
+        internal static SimpleResult SortingResultCheck(List<SortingResultCheck> models)
+        {
+            //鐢熸垚鍒嗘嫞缁撴灉锛屾洿鏂板垎鎷f槑缁嗙姸鎬�+            var result = new SimpleResult();
+            WMSHelper.SortingConfrim(models);
+            return result;
+        }
+
+
+
+        /// <summary>
+        /// 鍚庨潰瑕佹妸鏂规硶鏀惧埌wmsHelper涓�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResult Instock(InstockInfo model)
+        {
+            var result = new SimpleResult();
+            //pda鍏ュ簱锛岀洰鍓嶄汉宸ユ斁璐у湪宸烽亾鍙o紝鎵墭鐩橈紝鍚庡彴鍙兘璁$畻褰撳墠宸烽亾鐨勭粓鐐癸紝鍗曟繁浣嶇珛搴�+            //1锛屽垽鏂墭鐩樹俊鎭紝涓�鏄爜鐩樺悗鐨勶紝榛樿enable鏄疦锛屽彟涓�鏄垎鎷e洖鐨�+            var cntr = ContainerHelper.GetCntr(model.cntr);
+            if (cntr != null)
+            {
+                var sortingInfo = WMSHelper.GetSortingDetailByCntr(model.cntr);
+                if (cntr.C_ENABLE == "Y" && sortingInfo != null && sortingInfo.Count > 0)
+                {
+                    result.resultCode = 2;
+                    result.resultMsg = $"鎵樼洏{model.cntr}鏈垎鎷e畬鎴�;
+                }
+            }
+            else
+            {
+                result.resultCode = 1;
+                result.resultMsg = $"鎵樼洏{model.cntr}涓嶅瓨鍦�;
+            }
+            if (result.resultCode == 0)
+            {
+                //鑾峰彇鎺ラ┏浣嶆墍鍦ㄧ殑宸烽亾, 鏌ユ壘鍔熻兘鍖猴紝鍏ュ簱鎺ラ┏浣嶆壘閫昏緫搴撳尯锛堟瘡涓贩閬撲竴涓�杈戝簱鍖猴級
+                var fa = LocationHelper.GetFunctionAreaByCode(model.start, 2, 10);
+                if (fa != null)
+                {
+                    //鍒涘缓鍏ュ簱浣滀笟锛岀畝鍗曞垽鏂竴涓嬫槸鍚︽湁鍙叆璐т綅锛屽鏋滀笉鍒ゆ柇锛屼汉宸ヨ揣鏀句笂鍘讳竴鐩翠笉鑳藉叆锛屼篃涓嶇煡閬撳師鍥�+                    var end = LocationHelper.GetZoneLoc(fa.S_MASTER_CODE);
+                    if (end != null)
+                    {
+                        //鍒ゆ柇鎵樼洏鏄惁宸茬粡鐢熸垚浠诲姟锛屽鏋滄病鏈夊垯鐢熸垚
+                        var wmsTask = WMSHelper.GetWmsTaskByCntr(model.cntr);
+                        if (wmsTask != null)
+                        {
+                            result.resultCode = 3;
+                            result.resultMsg = $"璧风偣{model.start} 鎵樼洏{model.cntr}宸茬粡鍒涘缓浠诲姟锛岃鍕块噸澶嶇敵璇�;
+                        }
+                        else
+                        {
+                            wmsTask = new WMSTask
+                            {
+                                S_CNTR_CODE = model.cntr,
+                                S_CODE = WMSHelper.GenerateTaskNo(),
+                                S_START_LOC = model.start,
+                                S_END_LOC = end.S_LOC_CODE,
+                                N_TYPE = 1,
+                                S_TYPE = WMSTask.GetTypeStr(1),
+                                S_OP_DEF_CODE = "",
+                                S_OP_DEF_NAME = "pda鍏ョ珛搴�
+                            };
+                            if (WMSHelper.CreateWmsTask(wmsTask))
+                            {
+                                LocationHelper.LockLoc(end.S_LOC_CODE, 1);
+                                result.resultMsg = $"鍒涘缓浣滀笟鎴愬姛锛屼綔涓氬彿{wmsTask.S_CODE}";
+                            }
+                        }
+
+                    }
+                    else
+                    {
+                        result.resultCode = 3;
+                        result.resultMsg = $"璧风偣{model.start}瀵瑰簲鐨勯�杈戝簱鍖簕fa.S_MASTER_CODE}娌℃湁鍙敤璐т綅锛岃鏇存崲宸烽亾";
+                    }
+                }
+                else
+                {
+                    result.resultCode = 3;
+                    result.resultMsg = $"璧风偣{model.start}娌℃湁瀵瑰簲鐨勯�杈戝簱鍖猴紝璇峰湪閫昏緫搴撳尯璁剧疆鍔熻兘鍖�鍏ュ簱鎺ラ┏浣�;
+                }
+            }
+            return result;
+        }
+
+        internal static SimpleResult SortingOrderExecute(SortingOrderCheck model)
+        {
+            var result = new SimpleResult();
+            //鍒嗘嫞鍗曢厤璐ф墽琛�+            WMSHelper.CreateSortingOrderDetail(model.s_no);
+            return result;
+        }
+
+
+        internal static SimpleResult CheckSortingWholeCntr(CheckSortingWholeCntr model)
+        {
+            var result = new SimpleResult();
+            if (WMSHelper.CheckSortingWholeCntr(model.cntr, model.autoSort == 1))
+            {
+                result.resultCode = 1;
+                result.resultMsg = "鏁存墭鍒嗘嫞";
+            }
+            return result;
+        }
+        internal static CodeInfo GetCodeInfo(string code, string org)
+        {
+            //return new CodeInfo {  Fitemid_XK=code, FSourceNo="123456"};
+            CodeInfo result = null;
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance(Settings.SqlServer1);
+                var nameP = new SugarParameter("@FBarCode", code);
+                var orgP = new SugarParameter("@Forg", org);
+                //var ageP = new SugarParameter("@age", null, true);//璁剧疆涓簅utput
+                //var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school", nameP, ageP);//杩斿洖dt
+                result = db.Ado.UseStoredProcedure().SqlQuery<CodeInfo>("WMS_FBarCode", nameP, orgP).First();//杩斿洖List
+                Console.WriteLine($"璇诲瓨鍌ㄨ繃绋嬫垚鍔�result={result}");
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+            }
+            return result;
+        }
+        public class AddTaskModel
+        {
+            public string From { get; set; }
+            public string To { get; set; }
+            public string No { get; set; }
+        }
+        public class TN_LocationModel
+        {
+            public string TN_Location { get; set; }
+        }
+        public class CodeInfo
+        {
+            /// <summary>
+            /// 鐢熶骇璁㈠崟鍐呯爜
+            /// </summary>
+            public string FInterID { get; set; }
+            /// <summary>
+            /// 鐢熶骇璁㈠崟缂栧彿
+            /// </summary>
+            public string FSourceNo { get; set; }
+            /// <summary>
+            /// 鎵瑰彿
+            /// </summary>
+            public string FGMPBatchNo { get; set; }
+            public string FState { get; set; }
+            /// <summary>
+            /// 鐗╂枡缂栫爜锛堝唴鐮佸氨鏄紪鐮侊級
+            /// </summary>
+            public string Fitemid_XK { get; set; }
+            /// <summary>
+            /// 鍒嗗綍id
+            /// </summary>
+            public string Fentryid { get; set; }
+        }
+        public class NoteInfo : CodeInfo
+        {
+            public string WmsBillNo { get; set; }
+        }
+
+        #region 鏉哀mobox鎺ュ彛
+
+
+        #endregion
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/api/ApiModel.cs b/HH.WCS.Mobox3.HangYang/api/ApiModel.cs
new file mode 100644
index 0000000..d813311
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/ApiModel.cs
@@ -0,0 +1,400 @@
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.api
+{
+    /// <summary>
+    /// 閫氱敤model
+    /// </summary>
+    public class ApiModel
+    {
+        #region hosttoagv 鐩稿叧
+        /// <summary>
+        /// 杩斿洖缁檋osttoagv
+        /// </summary>
+        public class ReturnResult
+        {
+            public int ResultCode { get; set; }
+            public string ResultMsg { get; set; }
+
+        }
+        /// <summary>
+        /// hosttoagv涓婃姤浠诲姟鐘舵�
+        /// </summary>
+        public class AgvTaskState
+        {
+            public int State { get; set; }
+            public string No { get; set; }
+            public string ForkliftNo { get; set; }
+            public string ErrCode { get; set; }
+            public string LockNo { get; set; }
+            public string Ext1 { get; set; }
+            public string Ext2 { get; set; }
+            public string N_CNTR_COUNT { get; set; }
+            public string ExtData { get; set; }
+        }
+        /// <summary>
+        /// hosttoagv涓婃姤杞﹁締鐘舵�锛堝弬鏁板湪hosttoagv鏈嶅姟閰嶇疆锛屽彲淇敼锛�+        /// </summary>
+        public class AgvDeviceStatus
+        {
+            public string forkliftNo { get; set; }
+
+            public string errCode { get; set; }
+
+            public string errCode2 { get; set; }
+
+            public string faildCode { get; set; }
+
+            public string xPos { get; set; }
+
+            public string yPos { get; set; }
+            public string battery { get; set; }
+            public string detail { get; set; }
+            public string infoType { get; set; }
+            public string inMapRoute { get; set; }
+            public string CumInfo { get; set; }
+        }
+        /// <summary>
+        /// osttoagv涓婃姤鍏跺畠浜嬩欢淇℃伅
+        /// </summary>
+        public class AgvEventInfo
+        {
+            public int Code { get; set; }
+            public string CarID { get; set; }
+            public string Param1 { get; set; }
+            public string Param2 { get; set; }
+            public string Param3 { get; set; }
+
+        }
+
+        #endregion
+
+        #region mobox 鐩稿叧
+        /// <summary>
+        /// mobox 鍙栨秷浠诲姟銆佹爣璁板畬鎴愪换鍔�+        /// </summary>
+        public class MoboxTaskBase
+        {
+            public string TaskNo { get; set; }
+        }
+        /// <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>
+        /// 鍒嗘嫞纭
+        /// </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; }
+        }
+        public class InstockInfo
+        {
+            /// <summary>
+            /// 璧风偣
+            /// </summary>
+            public string start { get; set; }
+            /// <summary>
+            /// 鎵樼洏鍙�+            /// </summary>
+            public string cntr { 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 CreateTask
+        {
+
+            public string TaskType { get; set; }//鍒涘缓浠诲姟 1鍒涘缓鍙栨墭鐩樹换鍔�2鍒涘缓鍙栫墿鏂欎换鍔�3鍒涘缓閫佹弧鎷栦换鍔�4鍒涘缓鍑哄簱浠诲姟
+
+            public string startBit { get; set; }
+            public string endBit { get; set; }
+            public string ItemCode { get; set; }
+
+        }
+
+        public class BindCntr
+        {
+
+            public string LocCode { get; set; }
+
+            public string ItemCode { get; set; }
+            public int number { get; set; }
+
+
+        }
+
+        public class UntieCntr
+        {
+            public string LocCode { get; set; }
+
+            public string CntrCode { get; set; }
+
+        }
+        #endregion
+    }
+
+    /// <summary>
+    /// 椤圭洰璁㈠埗model
+    /// </summary>
+    public class OtherModel
+    {
+        /// <summary>
+        /// mobox3鎺ュ彛鏇夸唬锛屽叆搴撳崟淇℃伅
+        /// </summary>
+        public class Putaway_Order_In
+        {
+            public DataInfo Data { get; set; }
+
+            public class DataInfo
+            {
+                /// <summary>
+                /// 鍏ュ簱鍗曞彿(鍞竴)
+                /// </summary>
+                public string arrival_no { get; set; }
+                /// <summary>
+                /// 鍗曟嵁绫诲瀷
+                /// </summary>
+                public string op_type { get; set; }
+                public List<Detail> items { get; set; }
+            }
+            public class Detail
+            {
+
+                public string item_code { get; set; }
+                /// <summary>
+                /// 淇濈暀4浣嶅皬鏁�+                /// </summary>
+                public float qty { get; set; }
+                public string batch_no { get; set; }
+            }
+        }
+
+        public class OutboundOrder
+        {
+            public DataInfo1 Data { get; set; }
+            public class DataInfo1
+            {
+                /// <summary>
+                /// 鍑哄簱鍗曞彿(鍞竴)
+                /// </summary>
+                public string out_no { get; set; }
+                /// <summary>
+                /// 鍗曟嵁绫诲瀷
+                /// </summary>
+                public string op_type { get; set; }
+                /// <summary>
+                /// 鐢熶骇鍑哄簱鐨勯渶瑕佹寚瀹氱嚎杈瑰簱鍖�+                /// </summary>
+                public string line_area { get; set; }
+                public List<Detail1> items { get; set; }
+            }
+            public class Detail1
+            {
+
+                public string item_code { get; set; }
+                /// <summary>
+                /// 淇濈暀4浣嶅皬鏁�+                /// </summary>
+                public float qty { get; set; }
+                public string batch_no { get; set; }
+            }
+        }
+        public class ApiBaseModel
+        {
+            public string Name { get; set; }
+            public string Source { 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; }
+    }
+
+    /// <summary>
+    /// 鍙栨秷浠诲姟鍙傛暟
+    /// </summary>
+    public class cancleTaskParme
+    {
+        /// <summary>
+        /// 浠诲姟鍙峰敮涓�爣璇�+        /// </summary>
+        public string taskNo { get; set; }
+    }
+
+    public class moboxParam
+    {
+        /// <summary>
+        /// 璧风偣璐т綅锛堝叆搴擄級|| 缁堢偣璐т綅锛堝嚭搴擄級
+        /// </summary>
+        public string S_LOC_CODE { get; set; }
+
+        /// <summary>
+        /// 浠诲姟绫诲瀷
+        /// </summary>
+        public string S_TASK_TYPE { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+
+        /// <summary>
+        /// 浠诲姟鍙�+        /// </summary>
+        public string S_TASK_NO { get; set; }
+
+        /// <summary>
+        /// 绌烘墭杞繍璧风偣
+        /// </summary>
+        public string S_START_LOC { get; set; }
+
+        /// <summary>
+        /// 缁堢偣搴撳尯 
+        /// </summary>
+        public string S_END_AREA { get; set; }
+    }
+    #region 鎺ュ彛杩斿洖
+    /// <summary>
+    /// 鎺ュ彛杩斿洖
+    /// </summary>
+    public class Result
+    {
+        /// <summary>
+        /// 閿欒璇存槑锛屽綋success涓篎alse鏃讹紝errCode鏈夊�
+        /// </summary>
+        public object errMsg { get; set; }
+        /// <summary>
+        /// 鎺ュ彛璋冪敤缁撴灉 true鎴愬姛 false澶辫触
+        /// </summary>
+        public bool success { get; set; }
+        /// <summary>
+        /// 鎺ュ彛鍙嶉鐮�鏃犻敊璇负0
+        /// </summary>
+        public int errCode { get; set; }
+    }
+    #endregion
+
+}
diff --git a/HH.WCS.Mobox3.HangYang/api/DebugController.cs b/HH.WCS.Mobox3.HangYang/api/DebugController.cs
new file mode 100644
index 0000000..5a326d1
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/DebugController.cs
@@ -0,0 +1,44 @@
+锘�+using HH.WCS.HangYang.device;
+using Newtonsoft.Json;
+using System.Web.Http;
+using static HH.WCS.HangYang.api.ApiHelper;
+using static HH.WCS.HangYang.api.ApiModel;
+using static HH.WCS.HangYang.api.OtherModel;
+using static HH.WCS.HangYang.device.S7Helper;
+
+namespace HH.WCS.HangYang.api {
+    /// <summary>
+    /// 娴嬭瘯鐢紝濡傛灉椤圭洰涓鍜岃澶囧鎺ワ紝鍓嶆湡璁惧鏃犳硶娴嬭瘯锛岀敤鎺ュ彛妯℃嫙
+    /// </summary>
+    [RoutePrefix("api")]
+    public class DebugController : System.Web.Http.ApiController {
+
+
+        [HttpPost]
+        [Route("s7SetInt")]
+        public SimpleResult s7SetInt(DBWModel model) {
+            S7Helper.s7SetInt(model);
+            return new SimpleResult();
+
+        }
+
+
+        [HttpPost]
+        [Route("s7SetBit")]
+        public SimpleResult s7SetBit(DBXModel model) {
+            S7Helper.s7SetBit(model);
+            return new SimpleResult();
+
+        }
+        [HttpPost]
+        [Route("s7SetString")]
+        public SimpleResult s7SetString(DBBModel model) {
+            S7Helper.s7SetStr(model);
+            return new SimpleResult();
+
+        }
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/api/LiKuController.cs b/HH.WCS.Mobox3.HangYang/api/LiKuController.cs
new file mode 100644
index 0000000..9135b0e
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/LiKuController.cs
@@ -0,0 +1,16 @@
+锘縰sing HH.WCS.HangYang.api;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+
+namespace HH.WCS.HangYang.LISTA.api
+{
+    public class LiKuController : System.Web.Http.ApiController
+    {
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/api/MesController.cs b/HH.WCS.Mobox3.HangYang/api/MesController.cs
new file mode 100644
index 0000000..94984b1
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/MesController.cs
@@ -0,0 +1,16 @@
+锘縰sing HH.WCS.HangYang.api;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+
+namespace HH.WCS.HangYang.LISTA.api
+{
+    public class MesController : System.Web.Http.ApiController
+    {
+       
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/api/MoboxController.cs b/HH.WCS.Mobox3.HangYang/api/MoboxController.cs
new file mode 100644
index 0000000..0a8df63
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/MoboxController.cs
@@ -0,0 +1,153 @@
+锘縰sing HH.WCS.HangYang.dispatch;
+using HH.WCS.HangYang.process;
+using HH.WCS.HangYang.wms;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using System.Web.Http;
+using static HH.WCS.HangYang.api.ApiModel;
+using static HH.WCS.HangYang.api.OtherModel;
+
+namespace HH.WCS.HangYang.api
+{
+    /// <summary>
+    /// mobox3璋冪敤锛岃剼鏈腑璋冪敤
+    /// </summary>
+    public class MoboxController : System.Web.Http.ApiController
+    {
+
+        /// <summary>
+        /// 浠诲姟鏆傚仠鐨勮姹�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SimpleResult PauseTask()
+        {
+            var result = new SimpleResult();
+            //ManualTaskSwitch [{"Area":"AAA","State":0}]
+            //鍑嗗涓�釜鏁版嵁妯″瀷锛屼綔涓哄紑鍏筹紝鏀跺埌鏆傚仠璇锋眰鍚庯紝鎵撳紑锛屽悗缁浉鍏虫祦绋嬬殑浠诲姟涓嶅啀鎺ㄩ�
+            //鍚屾椂浣犺鏌ヨ宸茬粡鎺ㄩ�鐨勪换鍔★紝濡傛灉鍏ㄩ儴瀹屾垚浜嗘垨鑰呭彇娑堜簡锛屾壘涓嶅埌鎵ц涓殑锛岃繑鍥炴垚鍔�+            //鏀跺埌鏆傚仠璇锋眰鍚庯紝
+            return result;
+        }
+        public SimpleResult RecoverTask()
+        {
+            var result = new SimpleResult();
+            //ManualTaskSwitch [{"Area":"AAA","State":0}]
+
+            return result;
+        }
+
+        /// <summary>
+        /// 浠诲姟鍙栨秷锛堢洰鍓嶆敮鎸乶dc锛�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SimpleResult CancelTask(MoboxTaskBase model)
+        {
+            var result = new SimpleResult();
+            var task = WCSHelper.GetTask(model.TaskNo);
+            if (task != null)
+            {
+                if (task.N_B_STATE == 0)
+                {
+                    //绛夊緟鐩存帴淇敼鐘舵�涓哄彇娑�+                    WCSHelper.UpdateStatus(model.TaskNo, 4);
+                    result.resultMsg = "浠诲姟绛夊緟锛岀洿鎺ュ彇娑�;
+                }
+                else if (task.N_B_STATE != 3 && task.N_B_STATE != 4)
+                {
+                    //宸叉帹閫佷絾鏄病鏈夊畬鎴愭垨鑰呭彇娑堬紝閫氱煡hosttoagv
+                    NDCHelper.Cancel(task.S_CODE.Trim());
+                    result.resultMsg = "浠诲姟鍙栨秷宸茬粡鍙戦�缁欏皬杞�;
+                }
+                else
+                {
+                    result.resultCode = 1;
+                    result.resultMsg = "浠诲姟宸茬粨鏉�;
+                }
+            }
+            else
+            {
+                result.resultCode = 1;
+                result.resultMsg = "浠诲姟涓嶅瓨鍦�;
+            }
+            return result;
+        }
+        /// <summary>
+        /// 浠诲姟寮哄埗瀹屾垚锛堢洰鍓嶆敮鎸乶dc锛�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SimpleResult CompleteTask(MoboxTaskBase model)
+        {
+            var result = new SimpleResult();
+            return result;
+        }
+
+
+        /// <summary>
+        /// pda鍏ュ簱鐢宠
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public SimpleResult Instock(InstockInfo model)
+        {
+            return ApiHelper.Instock(model);
+
+        }
+
+        /// <summary>
+        /// 鍙戣揣鍗曟墽琛�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SimpleResult ShippingOrderExecute(ShippingOrderCheck model)
+        {
+            return ApiHelper.ShippingOrderExecute(model);
+
+        }
+        /// <summary>
+        /// 鍒嗘嫞鍗曟墽琛�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SimpleResult SortingOrderExecute(SortingOrderCheck model)
+        {
+            return ApiHelper.SortingOrderExecute(model);
+
+        }
+        /// <summary>
+        /// 鍒嗘嫞缁撴灉纭锛堝墠绔嫤鎴暟閲忎笉鍙互瓒呰繃鍒嗘嫞鏄庣粏涓�F_QTY-F_ACC_SR_QTY鐨勬暟閲忥級
+        /// </summary>
+        /// <returns></returns>
+        public SimpleResult SortingResultCheck(List<SortingResultCheck> models)
+        {
+            return ApiHelper.SortingResultCheck(models);
+
+        }
+        /// <summary>
+        /// 鍒ゆ柇鏄惁鏄暣鎵樺垎鎷�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public SimpleResult CheckSortingWholeCntr(CheckSortingWholeCntr model)
+        {
+            return ApiHelper.CheckSortingWholeCntr(model);
+
+        }
+
+        #region 鏉哀PDA鎺ュ彛
+
+
+
+
+        #endregion
+    }
+
+
+}
diff --git a/HH.WCS.Mobox3.HangYang/api/WmsController.cs b/HH.WCS.Mobox3.HangYang/api/WmsController.cs
new file mode 100644
index 0000000..21f77d0
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/api/WmsController.cs
@@ -0,0 +1,81 @@
+锘�+using HH.WCS.HangYang.LISTA.models;
+using HH.WCS.HangYang.process;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using System.Web.Http;
+using static HH.WCS.HangYang.api.ApiHelper;
+using static HH.WCS.HangYang.api.ApiModel;
+using static HH.WCS.HangYang.api.OtherModel;
+
+namespace HH.WCS.HangYang.api
+{
+    /// <summary>
+    /// 绗笁鏂硅皟鐢ㄧ殑鎺ュ彛
+    /// </summary>
+    [RoutePrefix("api")]
+    public class WmsController : System.Web.Http.ApiController
+    {
+
+        /// <summary>
+        /// 鏉哀鐗╂枡涓绘暟鎹柊澧炴帴鍙�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public Result GetMaterialData(List<MES_Material> model)
+        {
+            LogHelper.Info("GetMaterialData 鍙傛暟锛� + JsonConvert.SerializeObject(model), "WMSAPI");
+            var res = TaskProcess.GetMaterialData(model);
+            LogHelper.Info("GetMaterialData 杩斿洖锛� + JsonConvert.SerializeObject(res), "WMSAPI");
+            return res;
+        }
+
+        /// <summary>
+        /// 鏉哀鍏ュ簱鍗曟柊澧炴帴鍙�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public Result InboundOrder(InOrder model)
+        {
+            LogHelper.Info("GetInboundOrder 鍙傛暟锛� + JsonConvert.SerializeObject(model), "WMSAPI");
+            var res = TaskProcess.GetInboundOrder(model);
+            LogHelper.Info("GetInboundOrder 杩斿洖锛� + JsonConvert.SerializeObject(res), "WMSAPI");
+            return res;
+        }
+
+        /// <summary>
+        /// 鏉哀鍑哄簱鍗曟柊澧炴帴鍙�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public Result OutboundOrder(OutOrder model)
+        {
+            LogHelper.Info("OutOutboundOrder 鍙傛暟锛� + JsonConvert.SerializeObject(model), "WMSAPI");
+            var res = TaskProcess.GetOutboundOrder(model);
+            LogHelper.Info("OutOutboundOrder 杩斿洖锛� + JsonConvert.SerializeObject(res), "WMSAPI");
+            return res;
+        }
+
+
+        #region 涓婁笅娓稿鎺�+        /// <summary>
+        /// 鏉哀WCS璋冪敤璁惧淇″彿鍙嶉
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<Result> notifyDeviceSignal(List<Wcsmodel> model)
+        {
+            LogHelper.Info("notifyDeviceSignal 鍙傛暟锛� + JsonConvert.SerializeObject(model), "WMSAPI");
+            var res = await TaskProcess.notifyDeviceSignal(model);
+            LogHelper.Info("notifyDeviceSignal 杩斿洖锛� + JsonConvert.SerializeObject(res), "WMSAPI");
+            return res;
+        }
+        #endregion
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/config/config.json b/HH.WCS.Mobox3.HangYang/config/config.json
new file mode 100644
index 0000000..ca6dc48
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/config/config.json
@@ -0,0 +1,59 @@
+{
+  "HostToAgvServerUrl": "http://192.168.1.146:9988/HostToAGV.cgi",
+  "HASeverUrl": "http://172.16.10.41",
+  "GZSeverUrl": "http://192.192.209.241",
+
+
+
+  "SqlServer": "Data Source=192.168.1.144;Initial Catalog=hyMobox;User ID=sa;Password=Am123123",
+
+  "ApiPort": 7801,
+  "FacCode": "HY",
+  "WHCode": "HYCK",
+
+
+  "ReservoirArea": [
+    {
+      "areaName": "鍚堟墭鍖�,
+      "areaCode": "HTQ"
+    },
+    {
+      "areaName": "鍏ュ簱缂撳瓨鍖�,
+      "areaCode": "RKHCQ"
+    },
+    {
+      "areaName": "鍏ュ簱鎺ラ┏浣�,
+      "areaCode": "AGVJB"
+    },
+    {
+      "areaName": "鎵樼洏绔嬪簱鍖�,
+      "areaCode": "TPLKQ"
+    },
+    {
+      "areaName": "鏂欑鍏ュ簱缂撳瓨浣�,
+      "areaCode": "LXRKHCQ"
+    },
+    {
+      "areaName": "鏂欑鐮佺洏鍖�,
+      "areaCode": "SSX"
+    }
+  ],
+  "Relevancy": [
+    {
+      "InLoc": "HTQ-01-01",
+      "OutLoc": "HTCKQ-01"
+    },
+    {
+      "InLoc": "HTQ-02-01",
+      "OutLoc": "HTCKQ-02"
+    },
+    {
+      "InLoc": "HTQ-03-01",
+      "OutLoc": "HTCKQ-03"
+    }
+  ],
+  "CompleteTask": {
+    "taskType": [ "鏂欑缂撳瓨浣嶅叆搴�, "鐮佺洏鍚堟墭鍏ュ簱", "鎵樼洏鍏ュ簱", "鏂欑鍏ュ簱", "浜烘満鎺ラ┏鍏ュ簱", "鏂欑鍑哄簱" ]
+  }
+
+}
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HangYang/config/configDesc.txt b/HH.WCS.Mobox3.HangYang/config/configDesc.txt
new file mode 100644
index 0000000..142de57
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/config/configDesc.txt
@@ -0,0 +1,7 @@
+锘块厤缃鏄庯紙json閰嶇疆閲岄潰涓嶈兘鍔犳敞閲婏紝鍗曠嫭鍐欎釜璇存槑鏂囦欢锛�+TableUrl锛坕d鍖哄垎璁块棶鎺ュ彛锛�+id锛� (浠诲姟涓婃姤鎺ュ彛)
+    2锛堝畨鍏ㄨ姹傛帴鍙o級
+    3锛堝彔鐩樻満绌烘墭杩斿洖鎺ュ彛锛�+    4 mes鍥炴姤鎺ュ彛
+    5 鐗╂枡鍒颁綅杩斿洖鎺ュ彛
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HangYang/core/Monitor.cs b/HH.WCS.Mobox3.HangYang/core/Monitor.cs
new file mode 100644
index 0000000..18dd659
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/core/Monitor.cs
@@ -0,0 +1,116 @@
+锘縰sing HH.WCS.HangYang.device;
+using HH.WCS.HangYang.models.other;
+using HH.WCS.HangYang.process;
+using HH.WCS.HangYang.util;
+using HH.WCS.HangYang.wms;
+using Opc.UaFx;
+using Opc.UaFx.Client;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.core {
+    /// <summary>
+    /// 瀹氭椂杞浠诲姟
+    /// </summary>
+    internal class Monitor {
+        internal static void CheckThirdOutWork() {
+            //绗笁鏂硅涓棿琛�+            //var db= new SqlHelper<object>().GetInstance("涓棿琛ㄧ殑sql杩炴帴瀛楃涓�);
+            // db.Queryable<object>
+
+            //璇诲埌浜嗗嚭搴撳崟锛屾彃鍏ュ埌鎴戜滑鐨勮〃
+
+
+        }
+
+        internal static void CheckOutWork() {
+            //璇昏嚜宸辩殑涓棿琛紝鎴戜滑鑷繁鐨勮〃鏈夎〃鏈変釜瀛楁璁℃暟锛岃鏁板皬浜庢渶澶у�锛岀户缁嚭搴擄紝涓�鐢熸垚涓�潯浠诲姟
+
+        }
+
+
+        internal static void CheckDevice() {
+            //妫�祴杈撻�绾跨姸鎬�+
+            //S7Helper.ReadStr("plc1", 100, 1, 8);
+            //S7Helper.ReadBit("plc1", 101, 1, 2);
+            //S7Helper.ReadInt("plc1", 102, 1, 6);
+
+            //璇诲彇olma鐨勪俊鎭�+            using (var client = new OpcClient("opc.tcp://localhost:4840/")) {
+                //client.Security.UserIdentity = new OpcClientIdentity("userName", "password");
+                client.Connect();
+                var temperature = client.ReadNode("ns=2;s=Temperature");
+                //temperature.Value
+
+                // Your code to interact with the server.
+
+                OpcReadNode[] commands = new OpcReadNode[] {new OpcReadNode("ns=2;s=Olma_Agv/Compoent_Nr"),
+                                                            new OpcReadNode("ns=2;s=Olma_Agv/Quantity"),
+                                                            new OpcReadNode("ns=2;s=Olma_Agv/Carriage_Selected"),
+                                                            new OpcReadNode("ns=2;s=Olma_Agv/Carriage_in_Position"),
+                                                            new OpcReadNode("ns=2;s=Olma_Agv/Request")};
+
+                OpcValue[] job = client.ReadNodes(commands).ToArray();
+                //鏍规嵁璇锋眰鍒涘缓鍒涘缓浠诲姟
+                var item = job[0].Value.ToString();
+                var qty = (int)job[1].Value;
+                var bit = (int)job[2].Value;
+                var loc = bit == 1 ? "" : "";
+                var req = (int)job[4].Value;
+                if (req == 1) {
+                    //鍙枡load璇锋眰锛岃幏鍙栭渶瑕佺殑鐗╂枡淇℃伅鍜屾暟閲忋�缁堢偣锛屽垽鏂粓鐐规槸鍚︽湁浠诲姟锛屾病鏈変换鍔″噯澶囧垱寤轰换鍔★紝鍘诲師鏉愭枡搴撴煡鎵捐捣鐐�+                }
+                if (req == 2) {
+                    //unload璇锋眰锛岀┖鎵樺拰浣欐枡鍥炵殑璇锋眰锛岀┖鎵樺垽鏂┖鎵樼殑灏哄锛岀粓鐐规槸绌烘墭搴撳尯鍫嗗彔锛屼綑鏂欐牴鎹昂瀵稿叆鍘熸潗鏂欏簱
+                }
+
+
+
+
+
+
+                //鍐欐暟鎹�+                //OpcStatus result = client.WriteNode("ns=2;s=Machine/Job/Cancel", true);
+                /*OpcWriteNode[] commands = new OpcWriteNode[] {
+    new OpcWriteNode("ns=2;s=Machine/Job/Number", "0002"),
+    new OpcWriteNode("ns=2;s=Machine/Job/Name", "MAN_F01_78910"),
+    new OpcWriteNode("ns=2;s=Machine/Job/Speed", 1220.5)
+};
+ 
+OpcStatusCollection results = client.WriteNodes(commands);*/
+            }
+        }
+
+        internal static void AutoTask() {
+            //鑷姩灏嗕汉宸ュ嵏璐у尯鐨勭墿鏂欒浆杩愬埌鍘熸潗鏂欏簱 lmbda
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<ManualTaskSwitch>().Where(a => a.Area == "浜哄伐鍗歌揣鍖�).First();
+            if (model != null && model.State == 0) {
+                //鍙互鑷姩杞繍锛屽苟涓旀绫诲瀷鐨勪换鍔℃暟閲忓皬浜�鏉★紝鍑嗗鍒涘缓浠诲姟
+                if (db.Queryable<WCSTask>().Count(a => a.S_TYPE == "鑷姩杞繍" && a.N_B_STATE < 3) < 3) {
+                    //璧风偣搴撳尯鎵惧埌涓�釜鎵樼洏
+                    var start = db.Queryable<Location>().Where(a => a.S_AREA_CODE == "浜哄伐鍗歌揣鍖� && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0).Includes(a => a.LocCntrRel, b => b.Container).First();
+                    //鏍规嵁璐т綅鎵炬墭鐩橈紝鎵惧埌鎵樼洏鍚庡垽鏂墭鐩樼被鍨�+                    //鎵剧粓鐐癸紝鍘熸潗鏂欏簱鐨勭粓鐐�+                    if (start != null) {
+                        //S_LOC_RULE
+                        var zone = db.Queryable<Zone>().Where(a => a.S_AREA_CODE == "鍘熸潗鏂欏簱" && a.S_LOC_RULE == start.LocCntrRel.Container.S_SPEC).First(); ;
+                        if (zone != null) {
+                            var endLoc = db.Queryable<ZoneLoc>().Includes(a => a.Loc).Where(a => a.S_ZONE_CODE == zone.S_CODE && a.Loc.N_LOCK_STATE == 0 && a.Loc.N_CURRENT_NUM == 0).First();
+                            if (endLoc != null) {
+                                var end = endLoc.Loc;
+                                WCSHelper.CreateTask(DateTime.Now.Ticks.ToString(), start, end, "鑷姩杞繍", 3, 1, start.LocCntrRel.S_CNTR_CODE);
+                            }
+                        }
+                    }
+                }
+            }
+
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/core/WCSCore.cs b/HH.WCS.Mobox3.HangYang/core/WCSCore.cs
new file mode 100644
index 0000000..472b915
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/core/WCSCore.cs
@@ -0,0 +1,181 @@
+锘縰sing HH.WCS.HangYang.dispatch;
+using HH.WCS.HangYang.process;
+using HH.WCS.HangYang.util;
+using HH.WCS.HangYang.wms;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using static HH.WCS.HangYang.api.ApiModel;
+
+namespace HH.WCS.HangYang.core
+{
+    internal class WCSCore
+    {
+        public static void OperateAgvTaskStatus(AgvTaskState model)
+        {
+            var TN_Task = WCSHelper.GetTask(model.No);
+            if (TN_Task != null)
+            {
+                if (model.State <= 7)
+                {
+
+                    //鏈変换鍔″彿璇锋眰
+                    switch (model.State)
+                    {
+                        case 1:
+                            WCSHelper.Begin(TN_Task);
+                            break;
+                        #region MyRegion
+                        case 3:
+                            WCSHelper.UpdateStatus(TN_Task, "寮�鍙栬揣");
+                            break;
+                        case 4:
+                            WCSHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚");
+                            TaskProcess.OperateStatus(TN_Task, 4);
+                            break;
+                        case 5:
+                            WCSHelper.UpdateStatus(TN_Task, "寮�鍗歌揣");
+                            break;
+                        case 6:
+                            WCSHelper.UpdateStatus(TN_Task, "鍗歌揣瀹屾垚");
+                            TaskProcess.OperateStatus(TN_Task, 6);
+                            break;
+                        #endregion
+                        case 2:
+                            WCSHelper.End(TN_Task);
+                            //鏍规嵁浠诲姟绫诲瀷鏇存柊浣滀笟鐘舵�鍜岀粓鐐�+                            var taskList = Settings.CompleteTasks;
+                            if (taskList.taskType.Contains(TN_Task.S_TYPE))
+                            {
+                                //瀹屾垚浣滀笟
+                                WMSHelper.UpdateWmsTask(TN_Task, 3);
+
+                            }
+                            break;
+                        case 7:
+                            TaskProcess.OperateStatus(TN_Task, 7);
+                            WCSHelper.Fail(TN_Task);
+                            break;
+                    }
+                    WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
+
+                }
+
+            }
+        }
+
+        /// <summary>
+        /// 浠诲姟鍒嗗彂锛屾牴鎹皟搴︾被鍨嬪彂缁欎笉鍚岀殑璋冨害绯荤粺
+        /// </summary>
+        internal static void Dispatch()
+        {
+            //鏌ヨ浠诲姟
+            //鑾峰彇鎵�湁绛夊緟鐨勪换鍔�+            var list = WCSHelper.GetTaskListByState("绛夊緟"); ;
+            if (list.Count > 0)
+            {
+                list.ForEach(task =>
+                {
+                    //浣跨敤鑷畾涔変换鍔℃帹閫�+                    TaskProcess.SendGZTask(task);
+                });
+            }
+        }
+
+
+        #region 鏉哀浠诲姟鏈嶅姟
+        /// <summary>
+        /// 寰幆浣滀笟鐢熸垚浠诲姟
+        /// </summary>
+        internal static void ExecuteJob()
+        {
+            try
+            {
+                //鏌ヨ浠诲姟
+                //鑾峰彇鎵�湁绛夊緟鐨勪綔涓�+                var list = WMSHelper.GetWmsTaskListByState("绛夊緟"); ;
+                if (list.Count > 0)
+                {
+
+                    list.ForEach(task =>
+                    {
+                        //鐢熸垚鍏ュ簱浠诲姟
+                        TaskProcess.CreateInTask(task);
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"CreateInTask鑾峰彇浣滀笟鍒涘缓鍏ュ簱浠诲姟鍑虹幇閿欒锛侊紒", ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+            }
+
+        }
+
+
+        /// <summary>
+        /// 寰幆鎺ラ┏浣嶇敓鎴愬叆搴撲换鍔�+        /// </summary>
+        private static readonly object _inventoryLock = new object();
+        internal static void ProcessZoneInventoryCycle()
+        {
+            try
+            {
+                lock (_inventoryLock)  // 鍔犻攣纭繚鍚屼竴鏃堕棿鍙湁涓�釜绾跨▼鎵ц
+                {
+                    //寰幆鍏ュ簱鏆傚瓨鍖虹敓鎴愬悎鎵樻垨鍏ュ簱浠诲姟
+                    TaskProcess.BatchInWork();
+                }
+            }
+            catch (Exception ex)
+            {
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"寰幆鎺ラ┏浣嶇敓鎴愬叆搴撲换鍔★紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+            }
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔�+        /// </summary>
+        internal static void GenerateFromPicking()
+        {
+            try
+            {
+                //鏌ヨ宸查厤鐩樼殑閰嶇洏鍗�+                var list = WMSHelper.GetPickingListByState("閰嶈揣瀹屾垚");
+                if (list.Count > 0)
+                {
+                    TaskProcess.GenerateFromPicking(list);
+                }
+            }
+            catch (Exception ex)
+            {
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔★紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+            }
+        }
+        #endregion
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/core/WMSCore.cs b/HH.WCS.Mobox3.HangYang/core/WMSCore.cs
new file mode 100644
index 0000000..b8c3a87
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/core/WMSCore.cs
@@ -0,0 +1,145 @@
+锘縰sing HH.WCS.HangYang.wms;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.core {
+    internal class WMSCore {
+        /// <summary>
+        /// 閬嶅巻瀹氱増鐨勫彂璐у崟锛岀敓浜у垎鎷e崟涓昏〃鍜屽瓙琛紙涔熷彲浠ユ墜鍔ㄨ皟鎺ュ彛瑙﹀彂锛�+        /// </summary>
+        internal static void CheckShippingOrder() {
+            //1.0銆佽幏鍙栧凡缁忓畾鐗堢殑鍙戣揣鍗曪紝鐢熶骇鍒嗘嫞鍗曞瓙琛ㄥ拰涓昏〃锛岃缃�鍙戣揣鍗曘�鐨勪笟鍔$姸鎬�N_B_STATE = 1锛堝緟鍒嗘嫞锛�+            //2.0銆佸鏋滃彂璐у崟C_AUTO_SORTING=Y锛屽垯鑷姩灏嗗垎鎷e崟鐘舵�璁剧疆涓哄紑濮嬮厤璐�+
+        }
+        /// <summary>
+        /// 寮�閰嶈揣鍒涘缓鍒嗘嫞鍗曟槑缁�鏀规垚璋冩帴鍙hЕ鍙�
+        /// </summary>
+        internal static void CheckSortingOrder() {
+            //new SortingOrder().N_B_STATE
+            //1.0銆佽幏鍙�N_B_STATE = 1 (寮�閰嶈揣)鐘舵�鐨勫垎鎷e崟
+            //2.0銆侀亶鍘嗗垎鎷e崟瀛愯〃锛屽垱寤哄垎鎷e崟鏄庣粏锛屾洿鏂板垎鎷e崟瀛愯〃鐨勬槑缁嗘眹鎬籉_ACC_S_QTY
+            //3.0銆佸叏閮ㄥ垎鎷e崟瀛愯〃鐨勬槑缁嗗垱寤哄畬姣曪紝瀛愯〃鏄庣粏姹囨�鍜屽瓙琛ㄦ暟閲忎竴鑷达紝鏇存柊鍒嗘嫞鍗曠姸鎬侊紝N_B_STATE = 2閰嶈揣瀹屾垚
+            //4.0銆佸鏋滃垎鎷e崟鏄嚜鍔ㄤ綔涓氾紝灏辩洿鎺ユ洿鏂板埌 N_B_STATE = 3寮�浣滀笟
+            //WMSHelper.GetWaitingSortingOrderList();
+
+        }
+
+        /// <summary>
+        /// 閬嶅巻鍒嗘嫞鍗曟槑缁嗗垱寤哄嚭搴撲綔涓�+        /// </summary>
+        internal static void CheckSortingTask() {
+            //new SortingOrder().N_B_STATE
+            //閬嶅巻N_B_STATE = 3鐨勫垎鎷e崟鍒涘缓浣滀笟
+            //鎴�閬嶅巻鍒嗘嫞鍗曟槑缁嗗垱寤哄垎鎷d綔涓氾紝鍥犱负涓�釜鍒嗘嫞鍗曢噷闈㈢殑鏄庣粏閮芥槸鎵归噺鐢熸垚鐨�+            var list = WMSHelper.GetWaitingSortingOperationList();
+            if (list.Count > 0) {
+                list.ForEach(a => {
+                    if (a.Details != null) {
+                        WMSHelper.CreateSortingOperation(a);
+                    }
+                });
+            }
+           
+
+        }
+
+        /// <summary>
+        /// 浣滀笟鍚姩锛屽垱寤哄瓙浠诲姟
+        /// </summary>
+        internal static void Start() {
+
+            List<WMSTask> list = WMSHelper.GetWaitingOperationList();
+            if (list.Count > 0) {
+                //濡傛灉鏄嚭搴撶殑浣滀笟閿佸畾鎵樼洏鐨勬椂鍊欏凡缁忔槑纭捣鐐逛簡锛屽鏋滃彂璐у崟鎴栧垎鎷e崟鎸囧畾浜嗙粓鐐癸紝
+                //濡傛灉娌℃湁浣滀笟銆佷换鍔$殑椤哄簭闄愬埗灏卞彲浠ュ惎鍔紝鍒涘缓瀛愪换鍔′簡
+                list.ForEach(a => {
+                    if (a.N_TYPE == 1) {
+                        //鍏ュ簱鏈夌粓鐐瑰氨鍙互鎵ц
+                        if (string.IsNullOrEmpty(a.S_END_LOC)) {
+                            //璁$畻缁堢偣
+                            Location end = WMSHelper.GetEnd(a);
+                            if (end != null) {
+                                a.S_END_LOC = end.S_CODE;
+                                WMSHelper.UpdateTaskEnd(a);
+                                LocationHelper.LockLoc(end.S_CODE, 1);
+                            }
+                        }
+                        if (!string.IsNullOrEmpty(a.S_END_LOC)) {
+                            //鍒涘缓wcs浠诲姟
+                            var wcsTask = new WCSTask
+                            {
+                                S_OP_CODE = a.S_CODE,
+                                S_OP_NAME = "鍏ュ簱",
+                                S_CODE = WCSHelper.GenerateTaskNo(),
+                                S_TYPE = "鍫嗗灈鏈哄叆搴�,
+                                S_START_LOC = a.S_START_LOC,
+                                S_END_LOC = a.S_END_LOC,
+                                S_SCHEDULE_TYPE = "鏉ゥ",
+                                
+                                S_CNTR_CODE = a.S_CNTR_CODE,
+
+                            };
+                            if (WCSHelper.CreateTask(wcsTask)) {
+                                //鏇存柊浣滀笟鐘舵�涓烘墽琛�+                                a.N_B_STATE = 1;
+                                a.S_B_STATE = "鎵ц";
+                                WMSHelper.UpdateTaskState(a);
+                            }
+                        }
+                    }
+                    else if (a.N_TYPE == 2) {
+                        //鍑哄簱鏈夎捣鐐瑰氨鍙互鎵ц
+                        if (string.IsNullOrEmpty(a.S_END_LOC)) {
+                            //棣栧厛鑾峰彇璧风偣鐨勯�杈戝簱鍖猴紝鎵惧埌閫昏緫搴撳尯鐨勫姛鑳藉尯
+                            FunctionArea fa = null;
+                            var zones = LocationHelper.GetZoneByLoc(a.S_START_LOC);
+                            for (int i = 0; i < zones.Count; i++) {
+                                fa = LocationHelper.GetFunctionAreas("Zone", zones[i].S_ZONE_CODE, 11).FirstOrDefault();
+                                if (fa != null) {
+                                    break;
+                                }
+                            }
+                            if (fa != null) {
+                                var loc = LocationHelper.GetLoc(fa.S_FA_CODE);
+                                if (loc != null) {
+                                    a.S_END_LOC = loc.S_CODE;
+                                    WMSHelper.UpdateTaskEnd(a);
+                                    LocationHelper.LockLoc(loc.S_CODE, 1);
+                                }
+                            }
+                            if (!string.IsNullOrEmpty(a.S_END_LOC)) {
+                                //鍒涘缓wcs浠诲姟
+                                var wcsTask = new WCSTask
+                                {
+                                    S_OP_CODE = a.S_CODE,
+                                    S_OP_NAME = "鍑哄簱",
+                                    S_CODE = WCSHelper.GenerateTaskNo(),
+                                    S_TYPE = "鍫嗗灈鏈哄嚭搴�,
+                                    S_START_LOC = a.S_START_LOC,
+                                    S_END_LOC = a.S_END_LOC,
+                                    S_SCHEDULE_TYPE = "鏉ゥ",
+                                  
+                                    S_CNTR_CODE = a.S_CNTR_CODE,
+
+                                };
+                                if (WCSHelper.CreateTask(wcsTask)) {
+                                    //鏇存柊浣滀笟鐘舵�涓烘墽琛�+                                    a.N_B_STATE = 1;
+                                    a.S_B_STATE = "鎵ц";
+                                    WMSHelper.UpdateTaskState(a);
+                                }
+
+                            }
+                        }
+                    }
+                });
+
+            }
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/device/ModbusHelper.cs b/HH.WCS.Mobox3.HangYang/device/ModbusHelper.cs
new file mode 100644
index 0000000..d0527af
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/device/ModbusHelper.cs
@@ -0,0 +1,234 @@
+锘縰sing EasyModbus;
+using HH.WCS.HangYang;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.device
+{
+    /// <summary>
+    /// modbus tcp 鐢ㄧ涓夋柟鐨勫寘
+    /// </summary>
+    internal static class ModbusHelper
+    {
+        private static Dictionary<string, ModbusClient> clients = new Dictionary<string, ModbusClient>();
+
+        /// <summary>
+        /// 璇荤嚎鍦�+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal static bool[] ReadCoils(int address, int qty, string ip, int port = 502) {
+            bool[] res = new bool[0];
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    res = client.ReadCoils(address, qty);
+                }
+                catch (Exception ex) {
+                    //LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 璇荤鏁h緭鍏�+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal static bool[] ReadDiscreteInputs(int address, int qty, string ip, int port = 502) {
+            bool[] res = new bool[0];
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    res = client.ReadDiscreteInputs(address, qty);
+                }
+                catch (Exception ex) {
+                    //LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 璇讳繚鎸佸瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal static int[] ReadHoldingRegisters(int address, int qty, string ip, int port = 502) {
+            int[] res = new int[0];
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    //涓�釜瀵勫瓨鍣ㄦ槸16浣嶏紝杩斿洖2涓猧nt绫诲瀷
+                    res = client.ReadHoldingRegisters(address, qty);
+                    if (res != null) {
+                        Console.WriteLine($"璇诲瘎瀛樺櫒{ip},address={address},qty={qty},length={res.Length},res={string.Join(",", res)}");
+                    }
+                    else {
+                        Console.WriteLine($"璇诲瘎瀛樺櫒{ip},address={address},qty={qty},澶辫触");
+                    }
+                }
+                catch (Exception ex) {
+                    Console.WriteLine("ReadHoldingRegisters:err=" + ex.Message);
+                }
+            }
+            else {
+                Console.WriteLine($"{ip}杩炴帴宸茬粡鏂紑");
+            }
+            return res;
+        }
+        /// <summary>
+        /// 璇昏緭鍏ュ瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal static int[] ReadInputRegisters(int address, int qty, string ip, int port = 502) {
+            int[] res = new int[0];
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    res = client.ReadInputRegisters(address, qty);
+                }
+                catch (Exception ex) {
+                    //LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 鍐欏崟涓嚎鍦�+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="value"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        internal static bool WriteSingleCoil(int address, bool value, string ip, int port = 502) {
+            var res = false;
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteSingleCoil(address, value);
+                    res = true;
+                }
+                catch (Exception ex) {
+                    //LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 鍐欏涓嚎鍦�+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="values"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        internal static bool WriteMultipleCoils(int address, bool[] values, string ip, int port = 502) {
+            var res = false;
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteMultipleCoils(address, values);
+                    res = true;
+                }
+                catch (Exception ex) {
+                    //LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 鍐欏崟涓瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="value"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        internal static bool WriteSingleRegister(int address, int value, string ip, int port = 502) {
+            var res = false;
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteSingleRegister(address, value);
+                    res = true;
+                    Console.WriteLine($"鍐欏瘎瀛樺櫒{ip},address={address},value={value},鎴愬姛");
+
+                }
+                catch (Exception ex) {
+                    Console.WriteLine(ex.Message);
+                    Console.WriteLine($"鍐欏瘎瀛樺櫒{ip},address={address},value={value},澶辫触");
+                }
+            }
+            return res;
+        }
+        /// <summary>
+        /// 鍐欏涓瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="values"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        internal static bool WriteMultipleRegisters(int address, int[] values, string ip, int port = 502) {
+            var res = false;
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteMultipleRegisters(address, values);
+                    res = true;
+                }
+                catch (Exception ex) {
+                    //LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+        }
+        private static ModbusClient GetClient(string ip, int port) {
+            ModbusClient client = null;
+            if (!clients.ContainsKey(ip)) {
+                client = new ModbusClient(ip, port);
+                try {
+                    client.Connect();
+                    clients[ip] = client;
+                }
+                catch (Exception ex) {
+                    //LogHelper.Error(ex.Message, ex);
+                    Console.WriteLine($"杩炴帴plc澶辫触{ip},err=" + ex.Message);
+                }
+            }
+            else {
+                client = clients[ip];
+                if (!clients[ip].Connected) {
+                    try {
+                        clients[ip].Connect();
+
+                    }
+                    catch (Exception ex) {
+                        //LogHelper.Error(ex.Message, ex);
+                        Console.WriteLine($"杩炴帴plc澶辫触{ip},err=" + ex.Message);
+                    }
+                }
+
+            }
+            return client;
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/device/PlcHelper.cs b/HH.WCS.Mobox3.HangYang/device/PlcHelper.cs
new file mode 100644
index 0000000..30aa63a
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/device/PlcHelper.cs
@@ -0,0 +1,99 @@
+锘縰sing HH.WCS.HangYang.process;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.device
+{
+    internal class PlcHelper
+    {
+        internal static void Receive(string ip, string msg) {
+            //澶勭悊璁惧淇″彿
+            DeviceProcess.Analysis(msg, ip);
+        }
+        internal static bool SendHex(string ip, string msg) {
+            return TcpServer.TcpServerSend(ip, Hex2Bytes(msg));
+
+        }
+        internal static void SendAscii(string ip, string msg) {
+            TcpServer.TcpServerSend(ip, Encoding.ASCII.GetBytes(msg));
+        }
+
+        internal static byte[] Hex2Bytes(string hexString) {
+            hexString = hexString.Replace(" ", "");
+            if ((hexString.Length % 2) != 0)
+                hexString += " ";
+            byte[] returnBytes = new byte[hexString.Length / 2];
+            for (int i = 0; i < returnBytes.Length; i++)
+                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
+
+            return returnBytes;
+        }
+        internal static string Hex2Ascii(string hexString) {
+            hexString = hexString.Replace(" ", "");
+            if ((hexString.Length % 2) != 0)
+                hexString += " ";
+            byte[] returnBytes = new byte[hexString.Length / 2];
+            for (int i = 0; i < returnBytes.Length; i++)
+                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
+
+            return Encoding.ASCII.GetString(returnBytes);
+        }
+
+        #region 杩涘埗杞崲+CRC
+        internal static bool CheckCRC(string hex) {
+            var result = false;
+            var data = hex.Replace(" ", "");
+            if (data.Length % 2 == 0) {
+                var code1 = data.Substring(data.Length - 4, 4).ToLower();
+                var code2 = BitConverter.ToString(CRC16LH(Hex2Bytes(data.Substring(0, data.Length - 4)))).Replace("-", "").Replace(" ", "").ToLower();
+                result = code1 == code2;
+            }
+            return result;
+        }
+        internal static byte[] CRC16LH(byte[] pDataBytes) {
+            ushort crc = 0xffff;
+            ushort polynom = 0xA001;
+
+            for (int i = 0; i < pDataBytes.Length; i++) {
+                crc ^= pDataBytes[i];
+                for (int j = 0; j < 8; j++) {
+                    if ((crc & 0x01) == 0x01) {
+                        crc >>= 1;
+                        crc ^= polynom;
+                    }
+                    else {
+                        crc >>= 1;
+                    }
+                }
+            }
+
+            byte[] result = BitConverter.GetBytes(crc);
+            return result;
+        }
+        internal static byte[] CRC16HL(byte[] pDataBytes) {
+            ushort crc = 0xffff;
+            ushort polynom = 0xA001;
+
+            for (int i = 0; i < pDataBytes.Length; i++) {
+                crc ^= pDataBytes[i];
+                for (int j = 0; j < 8; j++) {
+                    if ((crc & 0x01) == 0x01) {
+                        crc >>= 1;
+                        crc ^= polynom;
+                    }
+                    else {
+                        crc >>= 1;
+                    }
+                }
+            }
+
+            byte[] result = BitConverter.GetBytes(crc).Reverse().ToArray();
+            return result;
+        }
+
+        #endregion
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/device/S7Helper.cs b/HH.WCS.Mobox3.HangYang/device/S7Helper.cs
new file mode 100644
index 0000000..5d629a2
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/device/S7Helper.cs
@@ -0,0 +1,289 @@
+锘縰sing HH.WCS.HangYang.api;
+using Newtonsoft.Json.Linq;
+using S7.Net;
+using S7.Net.Types;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Services.Description;
+
+namespace HH.WCS.HangYang.device {
+
+    /// <summary>
+    /// 瑗块棬瀛恜lc
+    /// </summary>
+    public class S7Helper {
+        private static bool debug = true;
+        private static S7.Net.Plc plc = null;
+        static S7Helper() {
+            Init();
+        }
+        private static Dictionary<string, Plc> plcDic = new Dictionary<string, Plc>();
+        private static void Init() {
+            //閰嶇疆鏂囦欢璇诲彇鎵�湁鐨刾lc杩涜鍒濆鍖�+            try {
+                var plc1 = new Plc(CpuType.S71500, "", 0, 1);
+                plcDic.Add("plc1", plc1);
+                Link(plc1);
+            }
+            catch (Exception ex) {
+
+                Console.WriteLine("S7Helper Init err=" + ex.Message);
+            }
+        }
+        private static Plc GetPlc(string plc) {
+            if (plcDic.ContainsKey(plc)) {
+                return plcDic[plc];
+            }
+            else {
+                return null;
+            }
+        }
+        public static Dictionary<string, string> s7TestData = new Dictionary<string, string>();
+        private static void Link(Plc plc) {
+            try {
+                //if (!plc.IsConnected) {
+                plc.Close();
+                plc.Open();
+                if (plc.IsConnected) {
+                    Console.WriteLine($"宸茶繛鎺ュ埌plc{plc.IP}");
+                }
+                else {
+                    Console.WriteLine($"plc{plc.IP}杩炴帴澶辫触");
+                    LogHelper.Info($"plc{plc.IP}杩炴帴澶辫触", "Plc");
+                }
+
+                //}
+            }
+            catch (Exception ex) {
+                Console.WriteLine($"plc{plc.IP}杩炴帴澶辫触锛宔rr={ex.Message}");
+                LogHelper.Info($"plc{plc.IP}杩炴帴澶辫触锛宔rr={ex.Message}");
+                //Init();
+            }
+
+        }
+        //https://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/SmartSMS/060.html
+        //https://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/07-Program/02-basic/01-Data_Type/09-String.html
+
+
+
+        internal static short[] ReadInt(string device, int db, int byteAddr, int count) {
+            short[] result = null;
+            try {
+                if (debug) {
+                    var s7Key = $"int_{db}_{byteAddr}_{count}";
+                    if (s7TestData.ContainsKey(s7Key)) {
+                        var data = s7TestData[s7Key].Split(',');
+                        if (data.Length == count) {
+                            result = Array.ConvertAll(data, s => short.Parse(s));
+                        }
+                        else {
+                            result = new short[count];
+                            s7TestData[s7Key] = string.Join(",", result);
+                        }
+                        Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛� addr={byteAddr} data={string.Join(",", result)}");
+                    }
+                }
+                else {
+                    var plc = GetPlc(device);
+                    if (plc != null) {
+                        if (plc.IsConnected) {
+                            result = (short[])plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, count, 0);
+                            Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛宨p={plc.IP}  addr={byteAddr} data={string.Join(",", result)}");
+                            if (result.Length == 0) {
+                                Console.WriteLine($"plc {device}鍑嗗閲嶆柊杩炴帴");
+                                Link(plc);
+                            }
+                        }
+                        else {
+                            Console.WriteLine($"鍑嗗杩炴帴plc {device}");
+                            Link(plc);
+                        }
+                    }
+                    else {
+                        Console.WriteLine($"plc {device}涓嶅瓨鍦�);
+                    }
+
+                }
+
+            }
+            catch (Exception ex) {
+                Console.WriteLine($"ReadInt锛宒evice={device}  addr={byteAddr} count={count} err={ex.Message}");
+                LogHelper.Error($"ReadInt锛宒evice={device}  addr={byteAddr}  count={count} err={ex.Message}", ex);
+            }
+            return result;
+        }
+
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="db"></param>
+        /// <param name="byteAddr"></param>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        internal static bool WriteInt(int db, int byteAddr, short data) {
+            var result = false;
+            try {
+                if (plc.IsConnected) {
+                    plc.Write(DataType.DataBlock, db, byteAddr, data);
+                    Console.WriteLine($"鍐欏叆plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} ");
+                    LogHelper.Info($"鍐欏叆plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} ");
+                    if (result) {
+                        //鍐欏畬鍐嶈涓�纭
+                        var readData = (short)plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, 1, 0);
+                        Console.WriteLine($"璇诲彇plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} res={string.Join(", ", readData)}");
+                        LogHelper.Info($"璇诲彇plc淇℃伅锛宨p={plc.IP} addr={byteAddr} data={data} res={string.Join(", ", readData)}", "PLC");
+                        result = readData == data;
+                    }
+
+
+                }
+                else {
+                    Console.WriteLine("鍑嗗杩炴帴plc1");
+                    Link(plc);
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"鍐欏叆plc1淇℃伅澶辫触锛宨p={plc.IP} addr={byteAddr} data={data} err={ex.Message}", ex);
+            }
+            return result;
+        }
+        public static object ReadBit(string device, int db, int byteAddr, byte bitAddr) {
+            object result = null;
+            try {
+                if (debug) {
+                    var s7Key = $"bit_{db}_{byteAddr}_{bitAddr}";
+                    if (s7TestData.ContainsKey(s7Key)) {
+                        var data = s7TestData[s7Key];
+                        if (data == "1") {
+                            result = true;
+                        }
+                        else { result = false; }
+                        Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛� addr={byteAddr} data={result.ToString()}");
+                    }
+                }
+                else {
+                    var plc = GetPlc(device);
+                    if (plc != null) {
+                        if (plc.IsConnected) {
+                            result = plc.Read(DataType.DataBlock, db, byteAddr, VarType.Int, 1, bitAddr);
+                            Console.WriteLine($"璇诲彇plc {device}淇℃伅鎴愬姛锛宨p={plc.IP}  addr={byteAddr} data={result.ToString()}");
+                        }
+                        else {
+                            Console.WriteLine($"鍑嗗杩炴帴plc {device}");
+                            Link(plc);
+                        }
+                    }
+                    else {
+                        Console.WriteLine($"plc {device}涓嶅瓨鍦�);
+                    }
+                }
+            }
+            catch (Exception ex) {
+                Console.WriteLine($"ReadBit锛宒evice={device}  addr={byteAddr} bit={bitAddr} err={ex.Message}");
+                LogHelper.Error($"ReadBit锛宒evice={device}  addr={byteAddr} bit={bitAddr} err={ex.Message}", ex);
+            }
+            return result;
+        }
+        public static string ReadStr(string device, int db, int byteAddr, int count) {
+            string result = string.Empty;
+            try {
+                if (debug) {
+                    var s7Key = $"str_{db}_{byteAddr}_{count}";
+                    if (s7TestData.ContainsKey(s7Key)) {
+                        var data = s7TestData[s7Key];
+                        if (data.Length == count) {
+                            result = data;
+                            Console.WriteLine($"ReadStr 鎴愬姛锛�addr={byteAddr}  res={result}");
+                        }
+                    }
+                }
+                else {
+                    if (plc.IsConnected) {
+                        result = plc.Read(DataType.DataBlock, 100, byteAddr, VarType.String, count, 0).ToString();
+                        Console.WriteLine($"ReadStr 鎴愬姛锛宨p={plc.IP} addr={byteAddr}  res={result}");
+                        if (result.Length == 0) {
+                            Link(plc);
+                        }
+                    }
+                    else {
+                        Console.WriteLine("鍑嗗杩炴帴plc");
+                        Link(plc);
+                    }
+                }
+            }
+            catch (Exception ex) {
+                Console.WriteLine($"ReadStr锛宒evice={device}  addr={byteAddr}  count={count} err={ex.Message}");
+                LogHelper.Error($"ReadStr锛宒evice={device}  addr={byteAddr}  count={count} err={ex.Message}", ex);
+            }
+            return result;
+        }
+
+
+        #region 鐢ㄤ簬妯℃嫙娴嬭瘯
+        /// <summary>
+        /// short绫诲瀷锛屼竴涓崰2涓猙yte
+        /// </summary>
+        public class DBWModel {
+            public int db { get; set; }
+            public int byteAddr { get; set; }
+            /// <summary>
+            /// int绫诲瀷闇�鐢ㄩ�鍙峰垎寮�紝string涓嶉渶瑕�+            /// </summary>
+            public string value { get; set; }
+        }
+        /// <summary>
+        /// 瀛楃涓茬被鍨嬶紝涓�釜鍗�涓猙yte
+        /// </summary>
+        public class DBBModel {
+            public int db { get; set; }
+            public int byteAddr { get; set; }
+            public string value { get; set; }
+        }
+        public class DBXModel {
+            public int db { get; set; }
+            public int byteAddr { get; set; }
+            public int bitAddr { get; set; }
+            /// <summary>
+            /// 1:true 0:false
+            /// </summary>
+            public int value { get; set; }
+        }
+        public static void s7SetInt(DBWModel model) {
+            var data = model.value.Replace(",", "");
+            var s7Key = $"int_{model.db}_{model.byteAddr}_{data.Length}";
+            if (s7TestData.ContainsKey(s7Key)) {
+                s7TestData[s7Key] = model.value;
+            }
+            else {
+                s7TestData.Add(s7Key, model.value);
+            }
+        }
+
+        internal static void s7SetBit(DBXModel model) {
+            var s7Key = $"bit_{model.db}_{model.byteAddr}_{model.bitAddr}";
+            var value = model.value == 1 ? "1" : "0";
+            if (s7TestData.ContainsKey(s7Key)) {
+                s7TestData[s7Key] = value;
+            }
+            else {
+                s7TestData.Add(s7Key, value);
+            }
+        }
+
+        internal static void s7SetStr(DBBModel model) {
+            var s7Key = $"str_{model.db}_{model.byteAddr}_{model.value.Length}";
+            if (s7TestData.ContainsKey(s7Key)) {
+                s7TestData[s7Key] = model.value;
+            }
+            else {
+                s7TestData.Add(s7Key, model.value);
+            }
+        }
+    }
+    #endregion
+}
diff --git a/HH.WCS.Mobox3.HangYang/device/TcpClient.cs b/HH.WCS.Mobox3.HangYang/device/TcpClient.cs
new file mode 100644
index 0000000..4e074c1
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/device/TcpClient.cs
@@ -0,0 +1,85 @@
+锘縰sing HH.WCS.HangYang;
+using HH.WCS.HangYang.device;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.device {
+    internal class TcpClient
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="ip">127.0.0.1</param>
+        /// <param name="port">8888</param>
+        /// <param name="hex">01 02 00 00 00 0C 78 0F</param>
+        /// <returns></returns>
+        private static string SendHexOnce(string ip, int port, string hex) {
+            var res = string.Empty;
+            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+            client.Connect(ip, port);
+            client.ReceiveTimeout = 2000;
+            if (client.Connected) {
+                client.Send(PlcHelper.Hex2Bytes(hex));
+                byte[] buffer = new byte[1024];
+                try {
+                    var length = client.Receive(buffer, SocketFlags.None);
+                    byte[] data = new byte[length];
+                    Array.Copy(buffer, data, length);
+                    res = BitConverter.ToString(data).Replace("-", "");
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+                client.Disconnect(true);
+                client.Dispose();
+            }
+            client = null;
+            return res;
+        }
+
+        /// <summary>
+        /// 璇讳繚鎸佸瘎瀛樺櫒锛宮odbus rtu鐨勫皝瑁�+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal int[] ReadInputRegistersRtu(int address, int qty, string ip, int port = 502) {
+            List<int> res = new List<int>();
+            var hex = $"0103{address.ToString("X4")}{qty.ToString("X4")}";
+            hex = hex + BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(hex))).Replace("-", "").Replace(" ", "");
+            var data = SendHexOnce(ip, port, hex);
+            if (!string.IsNullOrEmpty(data)) {
+                if (PlcHelper.CheckCRC(data)) {
+                    var lenght = Convert.ToInt16(data.Substring(4, 2), 16) / 2;
+                    for (int i = 0; i < lenght; i++) {
+                        res[i] = Convert.ToInt16(data.Substring(6 + 4 * 1, 4), 16);
+                    }
+                }
+            }
+            return res.ToArray();
+        }
+        /// <summary>
+        /// 鍐欏崟涓瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="value"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        internal bool WriteSingleRegisterRtu(int address, int value, string ip, int port = 502) {
+            var res = false;
+            var hex = $"0106{address.ToString("X4")}{value.ToString("X4")}";
+            hex = hex + BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(hex))).Replace("-", "").Replace(" ", "");
+            var data = SendHexOnce(ip, port, hex);
+            if (!string.IsNullOrEmpty(data)) {
+                res = true;
+            }
+            return res;
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/device/TcpServer.cs b/HH.WCS.Mobox3.HangYang/device/TcpServer.cs
new file mode 100644
index 0000000..c7bb112
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/device/TcpServer.cs
@@ -0,0 +1,143 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+
+namespace HH.WCS.HangYang.device
+{
+    public class TcpServer
+    {
+        public TcpServer(string ip) {
+            Init(ip);
+        }
+        private void Init(string ip) {
+            //鍒涘缓涓�釜鏂扮殑Socket,杩欓噷鎴戜滑浣跨敤鏈�父鐢ㄧ殑鍩轰簬TCP鐨凷tream Socket锛堟祦寮忓鎺ュ瓧锛�+            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+            try {
+                //灏嗚socket缁戝畾鍒颁富鏈轰笂闈㈢殑鏌愪釜绔彛锛岀鍙e簲璇ユ斁鍒伴厤缃枃浠朵腑
+                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), 2023));
+                Console.WriteLine(2023);
+                //鍚姩鐩戝惉锛屽苟涓旇缃竴涓渶澶х殑闃熷垪闀垮害
+                socket.Listen(30);
+                //寮�鎺ュ彈瀹㈡埛绔繛鎺ヨ姹�+                socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
+            }
+            catch (Exception e) {
+                Console.WriteLine(e.Message);
+            }
+        }
+        public static Dictionary<string, Socket> clients = new Dictionary<string, Socket>();
+        public static Dictionary<string, byte[]> buffers = new Dictionary<string, byte[]>();
+        public static void ClientAccepted(IAsyncResult ar) {
+
+            var socket = ar.AsyncState as Socket;
+            var client = socket.EndAccept(ar);
+            string remote_ip = ((System.Net.IPEndPoint)client.RemoteEndPoint).Address.ToString();
+            if (clients.Keys.Contains(remote_ip)) {
+                clients[remote_ip] = client;
+            }
+            else {
+                clients.Add(remote_ip, client);
+            }
+            if (!buffers.Keys.Contains(remote_ip)) {
+                buffers.Add(remote_ip, new byte[1024]);
+            }
+            //缁欏鎴风鍙戦�涓�釜娆㈣繋娑堟伅
+            //client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));
+            Console.WriteLine(remote_ip);
+
+            try {
+                client.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
+            }
+            catch (Exception ex) {
+                Console.WriteLine($"銆愭帴鏀跺鎴风鐨勬秷鎭紓甯搞�锛� + ex.Message);
+            }
+            //鍑嗗鎺ュ彈涓嬩竴涓鎴风璇锋眰
+            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
+        }
+
+
+        public static void ReceiveMessage(IAsyncResult ar) {
+            try {
+                var socket = ar.AsyncState as Socket;
+                string remote_ip = ((System.Net.IPEndPoint)socket.RemoteEndPoint).Address.ToString();
+                var length = socket.EndReceive(ar);
+                if (length == 0) {
+                    clients.Remove(remote_ip);
+                    buffers.Remove(remote_ip);
+                    return;
+                }
+                else {
+                    if (!clients.Keys.Contains(remote_ip)) {
+                        clients.Add(remote_ip, socket);
+                    }
+                    if (!buffers.Keys.Contains(remote_ip)) {
+                        buffers.Add(remote_ip, new byte[1024]);
+                    }
+                }
+                try {
+                    if (buffers.Keys.Contains(remote_ip)) {
+                        //璇诲彇鍑烘潵娑堟伅鍐呭
+                        var message = GetHexString(buffers[remote_ip], length);//16   10
+                        Console.WriteLine(message);
+                        if (message.Substring(0, 4) == "3f00" && message.Substring(message.Length - 4) == "0d0a") {
+                            //鏄剧ず娑堟伅
+                            string msg = message.Replace(@"0d", "").Replace(@"0a", "").Replace(@"0d0a", "").Trim();
+                            PlcHelper.Receive(remote_ip, msg);
+                            Array.Clear(buffers[remote_ip], 0, buffers[remote_ip].Length);//娓呯┖褰撳墠IP Buffer
+                        }
+                        else {
+                            Console.WriteLine($"銆怲CP淇℃伅鍗忚寮傚父銆戯細IP锛歿remote_ip},MSG锛歿message}");
+                        }
+
+                    }
+                    else {
+                        if (!buffers.Keys.Contains(remote_ip)) {
+                            buffers.Add(remote_ip, new byte[1024]);
+                        }
+                    }
+                }
+                catch (Exception ex) {
+                    Console.WriteLine($"銆愬鐞嗗鎴风鐨勬秷鎭紓甯搞�锛� + ex.Message);
+                }
+                //鎺ユ敹涓嬩竴涓秷鎭�鍥犱负杩欐槸涓�釜閫掑綊鐨勮皟鐢紝鎵�互杩欐牱灏卞彲浠ヤ竴鐩存帴鏀舵秷鎭簡锛�+                socket.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
+            }
+            catch (Exception ex) {
+                Console.WriteLine(ex.Message);
+            }
+        }
+
+        private static string GetHexString(byte[] buffer, int lenght) {
+            return BitConverter.ToString(buffer, 0, lenght).Replace("-", string.Empty).ToLower();
+        }
+
+        public static bool TcpServerSend(string ip, byte[] msg) {
+            if (clients.Keys.Contains(ip)) {
+                var client = clients[ip];
+                if (client.Connected) {
+                    try {
+                        client.Send(msg);
+                        return true;
+                    }
+                    catch (SocketException ex) {
+                        Console.WriteLine(ex.Message);
+                        clients[ip].Close();
+                        clients.Remove(ip);
+                    }
+                }
+                else {
+                    clients[ip].Close();
+                    clients.Remove(ip);
+                }
+            }
+            else {
+                Console.WriteLine("鏈壘鍒拌澶囩殑閾炬帴锛� + ip);
+            }
+            return false;
+
+        }
+       
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/dispatch/GZRobot.cs b/HH.WCS.Mobox3.HangYang/dispatch/GZRobot.cs
new file mode 100644
index 0000000..7281b70
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/dispatch/GZRobot.cs
@@ -0,0 +1,321 @@
+锘縰sing HH.WCS.HangYang.api;
+using HH.WCS.HangYang.core;
+using HH.WCS.HangYang.util;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using static HH.WCS.HangYang.api.ApiModel;
+
+namespace HH.WCS.HangYang.dispatch
+{
+    /// <summary>
+    /// 鍥借嚜璋冨害杈呭姪绫�+    /// </summary>
+    public class GZRobot
+    {
+        private static readonly HttpHelper apiHelper = new HttpHelper();
+        private static readonly string baseUrl = Settings.GZSeverUrl;
+        //private static readonly string logName = "guozi";
+        public static List<IOState> GetIO() {
+            var result = apiHelper.Get(baseUrl + "api/engine/view/iostates/");
+            var data = JsonConvert.DeserializeObject<gzResult<IOState>>(result);
+            return data.data;
+        }
+        public static void UpdateIOState() {
+            var data = new { data = new List<IOSateInfo>() };
+            var result = apiHelper.Post(baseUrl + "api/engine/tasks/iostates/", JsonConvert.SerializeObject(data));
+            var dataResult = JsonConvert.DeserializeObject<gzResult<IOStatesInfoResult>>(result);
+        }
+
+        public static int CreateOrder(string taskNo, int priority, string param, string ts = "p2p") {
+            var msg = "";
+            var orderId = 0;
+            var data = new OrderInfo() { order_name = taskNo, priority = priority, dead_line = DateTime.Now, ts_name = ts, parameters = param };
+            var request = JsonConvert.SerializeObject(data);
+            var response = apiHelper.Post(baseUrl + "api/om/order/", request);
+            msg = $"[guozi-CreateOrder] request={request} response={response}";
+            Console.WriteLine(msg);
+            if (response != "") {
+                try {
+                    var dataResult = JsonConvert.DeserializeObject<gzResult<OrderInfoResult>>(response);
+                    if (dataResult.code == 0) {
+                        orderId = dataResult.data[0].in_order_id;
+                    }
+                }
+                catch (Exception ex) {
+                }
+            }
+            else {
+                msg = "[guozi-CreateOrder]鍒涘缓璁㈠崟澶辫触";
+                Console.WriteLine(msg);
+            }
+
+
+            return orderId;
+        }
+        public static bool CancelOrder(int orderId) {
+            bool result = false;
+            string msg = "";
+            var request = new CancelOrderInfo() { order_list = new List<int>(orderId) };
+            var response = apiHelper.Post(baseUrl + "api/om/order/cancel/", JsonConvert.SerializeObject(request));
+            msg = $"[guozi-CancelOrder] request={request};response={response}";
+            Console.WriteLine(msg);
+            if (response != "") {
+                var dataResult = JsonConvert.DeserializeObject<gzResult<CancelOrderInfoResult>>(response);
+                if (dataResult.code == 0) {
+                    result = true;
+                }
+            }
+            else {
+                msg = "[guozi-CancelOrder]鍙栨秷璁㈠崟澶辫触";
+                Console.WriteLine(msg);
+            }
+            return result;
+        }
+        public static QueryOrderResult QueryOrder(int id) {
+            //
+            var result = new QueryOrderResult() { agv_list = new List<int> { 0 } };
+            string msg = "";
+            var response = apiHelper.Get(baseUrl + $"/api/om/order/{id}/");
+            msg = $"[guozi-QueryOrderResult] request={id};response={response}";
+            Console.WriteLine(msg);
+            if (response != "") {
+                var data = JsonConvert.DeserializeObject<gzResult<QueryOrderResult>>(response);
+                result = data.data[0];
+            }
+            else {
+                msg = "[guozi-QueryOrderResult]鏌ヨ璁㈠崟淇℃伅澶辫触";
+                Console.WriteLine(msg);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 鑾峰彇浜や簰淇℃伅
+        /// </summary>
+        /// <param name="typeId">1浠诲姟鐘舵�  2寮�棬鎴栦氦绠� 3鐩殑鐐�/param>
+        /// <param name="status"></param>
+        /// <returns></returns>
+        public static List<InteractInfoResult> QueryInteractInfo(int typeId, string status = "active") {
+
+            //string aaa = "{\"app_name\": \"Gouzi client\", \"version\": \"1.0.0\", \"code\": 0, \"msg\": \"success\", \"data\": [{\"interaction_info_id\": 233, \"interaction_info_name\": \"TN2012030001\", \"interaction_info_desp\": null, \"interaction_info_type_id\": 3, \"value_json\": {\"state\": \"4\"}, \"info_status\": \"active\", \"return_value\": null}]}";
+            //var data = JsonConvert.DeserializeObject<gzResult<InteractInfoResult>>(aaa);
+            var list = new List<InteractInfoResult>();
+            string msg = "";
+            var result = apiHelper.Get(baseUrl + $"api/om/interaction_info/find_by_type/?type_id={typeId}&info_status={status}");
+            if (!string.IsNullOrEmpty(result)) {
+                Console.WriteLine(result);
+                // {"app_name": "Gouzi client", "version": "1.0.0", "code": 0, "msg": "success", "data": [{"interaction_info_id": 230, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "4"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 231, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "6"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 232, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "2"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 233, "interaction_info_name": "TN2012030001", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "4"}, "info_status": "active", "return_value": null}]}
+                try {
+                    var data = JsonConvert.DeserializeObject<gzResult<InteractInfoResult>>(result);
+                    if (data.data != null) {
+                        list = data.data;
+                    }
+
+                }
+                catch (Exception ex) {
+                    Console.WriteLine(ex.Message);
+                }
+
+            }
+            else {
+                msg = "[guozi-QueryInteractInfo]璇诲彇浜や簰淇℃伅澶辫触";
+                Console.WriteLine(msg);
+            }
+            return list;
+        }
+        public static bool UpdateInteractInfo(UpdateInteractInfo interactInfo) {
+            string msg = "";
+            var result = false;
+            var request = JsonConvert.SerializeObject(interactInfo);
+            var response = apiHelper.Post(baseUrl + "api/om/interaction_info/update/", request);
+            msg = $"[mes-UpdateInteractInfo] request={request};response={response}";
+            if (response != "") {
+                var dataResult = JsonConvert.DeserializeObject<gzResult<object>>(response);
+                result = dataResult.code == 0;
+            }
+            else {
+                msg = "[guozi-UpdateInteractInfo]鏇存柊浜や簰淇℃伅澶辫触";
+                Console.WriteLine(msg);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 璁㈠崟鐘舵�鍙嶉
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public static GzResult orderStatusReport(orderStatusReportParme model)
+        {
+            GzResult result = new GzResult();
+            AgvTaskState agv = new AgvTaskState();
+
+            if (model == null)
+            {
+                result.resultCode = 1;
+                result.orderID = 0;
+                result.msg = "杩斿洖璁㈠崟鐘舵�澶辫触,鍙傛暟涓虹┖";
+            }
+
+            switch (model.orderStatus)
+            {
+                case "active":
+                    agv.State = 1;
+                    break;
+                case "source_finish":
+                    //鍙栬揣瀹屾垚
+                    agv.State = 4;
+                    break;
+                case "dest_finish":
+                    //鍗歌揣瀹屾垚
+                    agv.State = 6;
+                    break;
+                case "finish":
+                    agv.State = 2;
+                    break;
+                case "manually_finish":
+                    agv.State = 2;
+                    break;
+                case "cancel_finish":
+                    agv.State = 7;
+                    break;
+                case "error":
+                    agv.State = 7;
+                    break;
+                default:
+                    agv.State = 0;
+                    break;
+            }
+            if (agv.State != 0)
+            {
+                agv.No = model.orderName;
+                agv.ForkliftNo = model.agvIDList;
+                WCSCore.OperateAgvTaskStatus(agv);
+            }
+
+            result.resultCode = 0;
+            result.msg = "杩斿洖璁㈠崟鐘舵�鎴愬姛";
+            result.orderID = model.orderID;
+            LogHelper.Info("orderStatusReport 杩斿洖" + JsonConvert.SerializeObject(result), "API");
+            return result;
+        }
+    }
+    public class gzResult<T>
+    {
+        public string app_name { get; set; }
+        public string version { get; set; }
+        public int code { get; set; }
+        public string msg { get; set; }
+        public List<T> data { get; set; }
+    }
+    public class IOState
+    {
+        public int io_id { get; set; }
+        public string io_name { get; set; }
+        public string io_type_id { get; set; }
+        public string io_type { get; set; }
+        public int io_status_id { get; set; }
+        public string io_status_type { get; set; }
+        public string parameter_definition_int4_1 { get; set; }
+        public int io_value_int4_1 { get; set; }
+        public string parameter_definition_int4_2 { get; set; }
+        public int io_value_int4_2 { get; set; }
+        public string parameter_definition_int4_3 { get; set; }
+        public int io_value_int4_3 { get; set; }
+        public string parameter_definition_int4_4 { get; set; }
+        public int io_value_int4_4 { get; set; }
+        public string parameter_definition_json { get; set; }
+        public string io_value_json { get; set; }
+    }
+    public class IOSateInfo
+    {
+        public int io_id { get; set; }
+        public int io_status_id { get; set; }
+        public int io_value_int4_1 { get; set; }
+        public int io_value_int4_2 { get; set; }
+        public int io_value_int4_3 { get; set; }
+        public int io_value_int4_4 { get; set; }
+        public string io_value_json { get; set; }
+    }
+    public class IOStatesInfoResult
+    {
+        public List<ResultInfo> success_list { get; set; }
+        public List<ResultInfo> error_list { get; set; }
+        public class ResultInfo { public int io_id { get; set; } }
+    }
+    public class OrderInfo
+    {
+        public string order_name { get; set; }
+        public int priority { get; set; }
+        public DateTime dead_line { get; set; }
+        public string ts_name { get; set; }
+        public string parameters { get; set; }//{\"dock\":1}
+    }
+    public class OrderInfoResult
+    {
+        public int in_order_id { get; set; }
+    }
+    public class CancelOrderInfo
+    {
+        public List<int> order_list { get; set; }
+    }
+    public class CancelOrderInfoResult
+    {
+        public List<ResultInfo> success_list { get; set; }
+        public List<ResultInfo> error_list { get; set; }
+        public class ResultInfo { public int order_id { get; set; } }
+    }
+    public class QueryOrderResult
+    {
+        public int order_id { get; set; }
+        public string order_name { get; set; }
+        public int priority { get; set; }
+        public DateTime dead_line { get; set; }
+        public string ts_id { get; set; }
+        public string parameters { get; set; }//{"TN_LocationName":"3-2-B", "PalletType":1}",
+        public string trigger { get; set; }
+        public string command { get; set; }
+        public string status { get; set; }
+        public List<int> agv_list { get; set; }
+        public string current_task { get; set; }
+        public string current_dest { get; set; }
+        public string current_opt { get; set; }
+        public string current_omi { get; set; }
+        public DateTime create_time { get; set; }
+        public DateTime? active_time { get; set; }
+        public DateTime? finished_time { get; set; }
+        public DateTime? cancel_time { get; set; }
+        public string response_timespan { get; set; }
+        public string execute_timespa { get; set; }
+        public string total_timespan { get; set; }
+    }
+    public class InteractInfoResult
+    {
+        public int interaction_info_id { get; set; }
+        public string interaction_info_name { get; set; }
+        public string interaction_info_desp { get; set; }
+        public int interaction_info_type_id { get; set; }
+        public object value_json { get; set; }//{"dock": 1},
+        public string info_status { get; set; }
+        public string return_value { get; set; }
+    }
+    public class UpdateInteractInfo
+    {
+        public int interaction_info_id { get; set; }
+        public string info_status { get; set; }
+        public string return_value { get; set; }
+    }
+    public class interaction_state
+    {
+        public string state { get; set; }
+    }
+    public class interaction_door
+    {
+        public string door { get; set; }
+    }
+    public class interaction_bit
+    {
+        public string order { get; set; }
+    }
+}
+
diff --git a/HH.WCS.Mobox3.HangYang/dispatch/HanAo.cs b/HH.WCS.Mobox3.HangYang/dispatch/HanAo.cs
new file mode 100644
index 0000000..e0d5f71
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/dispatch/HanAo.cs
@@ -0,0 +1,161 @@
+锘縰sing HH.WCS.HangYang.util;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Web.Services.Description;
+
+namespace HH.WCS.HangYang.dispatch {
+    /// <summary>
+    /// 鍥借嚜璋冨害杈呭姪绫�+    /// </summary>
+    public class HanAo {
+        private static readonly HttpHelper apiHelper = new HttpHelper();
+        private static readonly string baseUrl = Settings.HASeverUrl;
+        //private static readonly string logName = "hanao";
+
+
+        public static bool CreateOrder(TaskInfoModel model) {
+            var msg = "";
+            var result = true;
+            var request = JsonConvert.SerializeObject(model);
+            var response = apiHelper.Post(baseUrl + ":9001/wcs-admin/api/receive", request);
+            msg = $"[hanao-CreateOrder] request={request} response={response}";
+            Console.WriteLine(msg);
+            if (response != "") {
+                try {
+                    var dataResult = JsonConvert.DeserializeObject<HAResult>(response);
+                    if (dataResult.code == "0") {
+                        result = true;
+                    }
+                }
+                catch (Exception ex) {
+                    Console.WriteLine(ex.Message);
+                }
+            }
+            else {
+                msg = "[hanao-CreateOrder]鍒涘缓璁㈠崟澶辫触";
+                Console.WriteLine(msg);
+            }
+
+            LogHelper.Info(msg,"鏉ゥ");
+            return result;
+        }
+        public static bool CancelOrder(CancelModel model) {
+            bool result = false;
+            string msg = "";
+            var request = JsonConvert.SerializeObject(model);
+            var response = apiHelper.Post(baseUrl + ":9002/wcs-admin/api/cancel", request);
+            msg = $"[hanao-CancelOrder] request={request};response={response}";
+            Console.WriteLine(msg);
+            if (response != "") {
+                var dataResult = JsonConvert.DeserializeObject<HAResult>(response);
+                if (dataResult.code == "0") {
+                    result = true;
+                }
+            }
+            else {
+                msg = "[hanao-CancelOrder]鍙栨秷璁㈠崟澶辫触";
+                Console.WriteLine(msg);
+            }
+            LogHelper.Info(msg, "鏉ゥ");
+            return result;
+        }
+        public static bool QueryDevice(DeviceInfoModel model) {
+            bool result = false;
+            string msg = "";
+            var request = JsonConvert.SerializeObject(model);
+            var response = apiHelper.Get(baseUrl + ":9003//wcs-admin/api/dvc-state/", request);
+            msg = $"[hanao-QueryDeviceResult] request={request};response={response}";
+            Console.WriteLine(msg);
+            if (response != "") {
+                var dataResult = JsonConvert.DeserializeObject<HAResult>(response);
+                if (dataResult.code == "0") {
+                    result = true;
+                }
+            }
+            else {
+                msg = "[hanao-QueryOrderResult]鏌ヨ璁㈠崟淇℃伅澶辫触";
+                Console.WriteLine(msg);
+            }
+            LogHelper.Info(msg, "鏉ゥ");
+            return result;
+        }
+
+
+        public class TaskInfoModel {
+            /// <summary>
+            /// 璇锋眰pk
+            /// </summary>
+            public string requestPk { get; set; }
+            /// <summary>
+            /// 鎵樼洏鏉$爜
+            /// </summary>
+            public string contNo { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷
+            /// </summary>
+            public string contType { get; set; } = "";
+            /// <summary>
+            /// 浠诲姟绫诲瀷  1-鍏ュ簱 2-鍑哄簱 3-绉诲簱 
+            /// </summary>
+            public string trkType { get; set; }
+            /// <summary>
+            /// 1-999锛堝�瓒婂ぇ浼樺厛绾ц秺楂橈級
+            /// </summary>
+            public string trkPrty { get; set; } = "1";
+            public string frmPos { get; set; }
+            public string toPos { get; set; }
+            public string noticeInfo { get; set; } = "";
+            /// <summary>
+            /// 0-绌烘墭鐩�1-瀹炵墿
+            /// </summary>
+            public string isFull { get; set; } = "0";
+            public string groupNo { get; set; } = "";
+            public string clientCode { get; set; } = "WMS";
+            /// <summary>
+            /// 鏍煎紡锛�022-11-11 11:32:08
+            /// </summary>
+            public string reqTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+
+        }
+        public class HAResult {
+            public string code { get; set; }
+            public string msg { get; set; }
+            public string requestPk { get; set; }
+        }
+        public class CancelModel {
+            public string requestPk { get; set; }
+            public string contNo { get; set; }
+            public string clientCode { get; set; }
+            public string reqTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+        }
+        public class DeviceInfoModel {
+            public string requestPk { get; set; }
+            public string dvcNo { get; set; }
+            public string clientCode { get; set; }
+            public string reqTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+        }
+        public class TaskStateInfoModel {
+            public string requestPk { get; set; }
+            public string contNo { get; set; }
+            /// <summary>
+            /// 鍙屾柟绯荤粺鍏卞悓瀹氫箟 1-鍏ュ簱 2-鍑哄簱 3-绉诲簱 锛堝悗缁鏈夊鍔犲啀鍗忓畾锛�+            /// </summary>
+            public string noticeType { get; set; }
+            public string curPos { get; set; }
+            public string noticeInfo { get; set; }
+            /// <summary>
+            /// 0-鎴愬姛 锛堝叆搴撲笂鏋跺畬鎴�鍑哄簱涓嬫灦瀹屾垚/搴撳唴绉诲簱瀹屾垚锛氱Щ搴撳彧涓婃姤鏈�粓绉诲簱涓婃灦锛�鎴�鍏朵粬-寮傚父鐮�鍙嶉鐩稿叧缁撴灉鍘熷洜锛學MS鏍规嵁鎯呭喌澶勭悊 
+            /// 1-鍏ュ簱鏈夎揣 2-鍏ヨ繙杩戞湁璐�3-鍑哄簱鏃犺揣 4-鍑鸿繙杩戞湁璐�
+            /// </summary>
+            public string code { get; set; }
+            public string result { get; set; }
+            public string clientCode { get; set; }
+            public string reqTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+        }
+
+    }
+
+
+}
+
diff --git a/HH.WCS.Mobox3.HangYang/dispatch/HostToAGV.cs b/HH.WCS.Mobox3.HangYang/dispatch/HostToAGV.cs
new file mode 100644
index 0000000..1583115
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/dispatch/HostToAGV.cs
@@ -0,0 +1,550 @@
+锘�/------------------------------------------------------------------------------
+// <auto-generated>
+//     姝や唬鐮佺敱宸ュ叿鐢熸垚銆�+//     杩愯鏃剁増鏈�4.0.30319.42000
+//
+//     瀵规鏂囦欢鐨勬洿鏀瑰彲鑳戒細瀵艰嚧涓嶆纭殑琛屼负锛屽苟涓斿鏋�+//     閲嶆柊鐢熸垚浠g爜锛岃繖浜涙洿鏀瑰皢浼氫涪澶便�
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Web.Services;
+using System.Web.Services.Protocols;
+using System.Xml.Serialization;
+
+// 
+// 姝ゆ簮浠g爜鐢�wsdl 鑷姩鐢熸垚, Version=4.6.1055.0銆�+// 
+
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+[System.Web.Services.WebServiceBindingAttribute(Name="HostToAGV", Namespace="http://127.0.0.1:9988/HostToAGV.wsdl")]
+public  class HostToAGV : System.Web.Services.Protocols.SoapHttpClientProtocol {
+    
+    private System.Threading.SendOrPostCallback StartNewOrderWithQCmdOperationCompleted;
+    
+    private System.Threading.SendOrPostCallback AddNewOrderOperationCompleted;
+    
+    private System.Threading.SendOrPostCallback CancelOrderOperationCompleted;
+    
+    private System.Threading.SendOrPostCallback ChangeOrderOperationCompleted;
+    
+    private System.Threading.SendOrPostCallback QueryOrderOperationCompleted;
+    
+    private System.Threading.SendOrPostCallback OrderAddOperationCompleted;
+    
+    private System.Threading.SendOrPostCallback OrderChangeParamOperationCompleted;
+    
+    /// <remarks/>
+    public HostToAGV() {
+        this.Url = "http://127.0.0.1:9988/HostToAGV.cgi";
+    }
+    
+    /// <remarks/>
+    public event StartNewOrderWithQCmdCompletedEventHandler StartNewOrderWithQCmdCompleted;
+    
+    /// <remarks/>
+    public event AddNewOrderCompletedEventHandler AddNewOrderCompleted;
+    
+    /// <remarks/>
+    public event CancelOrderCompletedEventHandler CancelOrderCompleted;
+    
+    /// <remarks/>
+    public event ChangeOrderCompletedEventHandler ChangeOrderCompleted;
+    
+    /// <remarks/>
+    public event QueryOrderCompletedEventHandler QueryOrderCompleted;
+    
+    /// <remarks/>
+    public event OrderAddCompletedEventHandler OrderAddCompleted;
+    
+    /// <remarks/>
+    public event OrderChangeParamCompletedEventHandler OrderChangeParamCompleted;
+    
+    /// <remarks/>
+    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="urn:HostToAGV", ResponseNamespace="urn:HostToAGV", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+    [return: System.Xml.Serialization.XmlElementAttribute("bufout", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+    public string StartNewOrderWithQCmd([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string bufin) {
+        object[] results = this.Invoke("StartNewOrderWithQCmd", new object[] {
+                    bufin});
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public System.IAsyncResult BeginStartNewOrderWithQCmd(string bufin, System.AsyncCallback callback, object asyncState) {
+        return this.BeginInvoke("StartNewOrderWithQCmd", new object[] {
+                    bufin}, callback, asyncState);
+    }
+    
+    /// <remarks/>
+    public string EndStartNewOrderWithQCmd(System.IAsyncResult asyncResult) {
+        object[] results = this.EndInvoke(asyncResult);
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public void StartNewOrderWithQCmdAsync(string bufin) {
+        this.StartNewOrderWithQCmdAsync(bufin, null);
+    }
+    
+    /// <remarks/>
+    public void StartNewOrderWithQCmdAsync(string bufin, object userState) {
+        if ((this.StartNewOrderWithQCmdOperationCompleted == null)) {
+            this.StartNewOrderWithQCmdOperationCompleted = new System.Threading.SendOrPostCallback(this.OnStartNewOrderWithQCmdOperationCompleted);
+        }
+        this.InvokeAsync("StartNewOrderWithQCmd", new object[] {
+                    bufin}, this.StartNewOrderWithQCmdOperationCompleted, userState);
+    }
+    
+    private void OnStartNewOrderWithQCmdOperationCompleted(object arg) {
+        if ((this.StartNewOrderWithQCmdCompleted != null)) {
+            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+            this.StartNewOrderWithQCmdCompleted(this, new StartNewOrderWithQCmdCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+        }
+    }
+    
+    /// <remarks/>
+    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="urn:HostToAGV", ResponseNamespace="urn:HostToAGV", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+    [return: System.Xml.Serialization.XmlElementAttribute("bufout", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+    public string AddNewOrder([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string bufin) {
+        object[] results = this.Invoke("AddNewOrder", new object[] {
+                    bufin});
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public System.IAsyncResult BeginAddNewOrder(string bufin, System.AsyncCallback callback, object asyncState) {
+        return this.BeginInvoke("AddNewOrder", new object[] {
+                    bufin}, callback, asyncState);
+    }
+    
+    /// <remarks/>
+    public string EndAddNewOrder(System.IAsyncResult asyncResult) {
+        object[] results = this.EndInvoke(asyncResult);
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public void AddNewOrderAsync(string bufin) {
+        this.AddNewOrderAsync(bufin, null);
+    }
+    
+    /// <remarks/>
+    public void AddNewOrderAsync(string bufin, object userState) {
+        if ((this.AddNewOrderOperationCompleted == null)) {
+            this.AddNewOrderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddNewOrderOperationCompleted);
+        }
+        this.InvokeAsync("AddNewOrder", new object[] {
+                    bufin}, this.AddNewOrderOperationCompleted, userState);
+    }
+    
+    private void OnAddNewOrderOperationCompleted(object arg) {
+        if ((this.AddNewOrderCompleted != null)) {
+            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+            this.AddNewOrderCompleted(this, new AddNewOrderCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+        }
+    }
+    
+    /// <remarks/>
+    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="urn:HostToAGV", ResponseNamespace="urn:HostToAGV", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+    [return: System.Xml.Serialization.XmlElementAttribute("bufout", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+    public string CancelOrder([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string bufin) {
+        object[] results = this.Invoke("CancelOrder", new object[] {
+                    bufin});
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public System.IAsyncResult BeginCancelOrder(string bufin, System.AsyncCallback callback, object asyncState) {
+        return this.BeginInvoke("CancelOrder", new object[] {
+                    bufin}, callback, asyncState);
+    }
+    
+    /// <remarks/>
+    public string EndCancelOrder(System.IAsyncResult asyncResult) {
+        object[] results = this.EndInvoke(asyncResult);
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public void CancelOrderAsync(string bufin) {
+        this.CancelOrderAsync(bufin, null);
+    }
+    
+    /// <remarks/>
+    public void CancelOrderAsync(string bufin, object userState) {
+        if ((this.CancelOrderOperationCompleted == null)) {
+            this.CancelOrderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCancelOrderOperationCompleted);
+        }
+        this.InvokeAsync("CancelOrder", new object[] {
+                    bufin}, this.CancelOrderOperationCompleted, userState);
+    }
+    
+    private void OnCancelOrderOperationCompleted(object arg) {
+        if ((this.CancelOrderCompleted != null)) {
+            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+            this.CancelOrderCompleted(this, new CancelOrderCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+        }
+    }
+    
+    /// <remarks/>
+    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="urn:HostToAGV", ResponseNamespace="urn:HostToAGV", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+    [return: System.Xml.Serialization.XmlElementAttribute("bufout", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+    public string ChangeOrder([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string bufin) {
+        object[] results = this.Invoke("ChangeOrder", new object[] {
+                    bufin});
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public System.IAsyncResult BeginChangeOrder(string bufin, System.AsyncCallback callback, object asyncState) {
+        return this.BeginInvoke("ChangeOrder", new object[] {
+                    bufin}, callback, asyncState);
+    }
+    
+    /// <remarks/>
+    public string EndChangeOrder(System.IAsyncResult asyncResult) {
+        object[] results = this.EndInvoke(asyncResult);
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public void ChangeOrderAsync(string bufin) {
+        this.ChangeOrderAsync(bufin, null);
+    }
+    
+    /// <remarks/>
+    public void ChangeOrderAsync(string bufin, object userState) {
+        if ((this.ChangeOrderOperationCompleted == null)) {
+            this.ChangeOrderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnChangeOrderOperationCompleted);
+        }
+        this.InvokeAsync("ChangeOrder", new object[] {
+                    bufin}, this.ChangeOrderOperationCompleted, userState);
+    }
+    
+    private void OnChangeOrderOperationCompleted(object arg) {
+        if ((this.ChangeOrderCompleted != null)) {
+            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+            this.ChangeOrderCompleted(this, new ChangeOrderCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+        }
+    }
+    
+    /// <remarks/>
+    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="urn:HostToAGV", ResponseNamespace="urn:HostToAGV", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+    [return: System.Xml.Serialization.XmlElementAttribute("bufout", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+    public string QueryOrder([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string bufin) {
+        object[] results = this.Invoke("QueryOrder", new object[] {
+                    bufin});
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public System.IAsyncResult BeginQueryOrder(string bufin, System.AsyncCallback callback, object asyncState) {
+        return this.BeginInvoke("QueryOrder", new object[] {
+                    bufin}, callback, asyncState);
+    }
+    
+    /// <remarks/>
+    public string EndQueryOrder(System.IAsyncResult asyncResult) {
+        object[] results = this.EndInvoke(asyncResult);
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public void QueryOrderAsync(string bufin) {
+        this.QueryOrderAsync(bufin, null);
+    }
+    
+    /// <remarks/>
+    public void QueryOrderAsync(string bufin, object userState) {
+        if ((this.QueryOrderOperationCompleted == null)) {
+            this.QueryOrderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnQueryOrderOperationCompleted);
+        }
+        this.InvokeAsync("QueryOrder", new object[] {
+                    bufin}, this.QueryOrderOperationCompleted, userState);
+    }
+    
+    private void OnQueryOrderOperationCompleted(object arg) {
+        if ((this.QueryOrderCompleted != null)) {
+            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+            this.QueryOrderCompleted(this, new QueryOrderCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+        }
+    }
+    
+    /// <remarks/>
+    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestElementName="Order-Add", RequestNamespace="urn:HostToAGV", ResponseElementName="Order-AddResponse", ResponseNamespace="urn:HostToAGV", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+    [return: System.Xml.Serialization.XmlElementAttribute("pszResponse", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+    public string OrderAdd([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string pszRequest) {
+        object[] results = this.Invoke("OrderAdd", new object[] {
+                    pszRequest});
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public System.IAsyncResult BeginOrderAdd(string pszRequest, System.AsyncCallback callback, object asyncState) {
+        return this.BeginInvoke("OrderAdd", new object[] {
+                    pszRequest}, callback, asyncState);
+    }
+    
+    /// <remarks/>
+    public string EndOrderAdd(System.IAsyncResult asyncResult) {
+        object[] results = this.EndInvoke(asyncResult);
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public void OrderAddAsync(string pszRequest) {
+        this.OrderAddAsync(pszRequest, null);
+    }
+    
+    /// <remarks/>
+    public void OrderAddAsync(string pszRequest, object userState) {
+        if ((this.OrderAddOperationCompleted == null)) {
+            this.OrderAddOperationCompleted = new System.Threading.SendOrPostCallback(this.OnOrderAddOperationCompleted);
+        }
+        this.InvokeAsync("OrderAdd", new object[] {
+                    pszRequest}, this.OrderAddOperationCompleted, userState);
+    }
+    
+    private void OnOrderAddOperationCompleted(object arg) {
+        if ((this.OrderAddCompleted != null)) {
+            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+            this.OrderAddCompleted(this, new OrderAddCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+        }
+    }
+    
+    /// <remarks/>
+    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestElementName="Order-ChangeParam", RequestNamespace="urn:HostToAGV", ResponseElementName="Order-ChangeParamResponse", ResponseNamespace="urn:HostToAGV", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+    [return: System.Xml.Serialization.XmlElementAttribute("pszResponse", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+    public string OrderChangeParam([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] string pszRequest) {
+        object[] results = this.Invoke("OrderChangeParam", new object[] {
+                    pszRequest});
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public System.IAsyncResult BeginOrderChangeParam(string pszRequest, System.AsyncCallback callback, object asyncState) {
+        return this.BeginInvoke("OrderChangeParam", new object[] {
+                    pszRequest}, callback, asyncState);
+    }
+    
+    /// <remarks/>
+    public string EndOrderChangeParam(System.IAsyncResult asyncResult) {
+        object[] results = this.EndInvoke(asyncResult);
+        return ((string)(results[0]));
+    }
+    
+    /// <remarks/>
+    public void OrderChangeParamAsync(string pszRequest) {
+        this.OrderChangeParamAsync(pszRequest, null);
+    }
+    
+    /// <remarks/>
+    public void OrderChangeParamAsync(string pszRequest, object userState) {
+        if ((this.OrderChangeParamOperationCompleted == null)) {
+            this.OrderChangeParamOperationCompleted = new System.Threading.SendOrPostCallback(this.OnOrderChangeParamOperationCompleted);
+        }
+        this.InvokeAsync("OrderChangeParam", new object[] {
+                    pszRequest}, this.OrderChangeParamOperationCompleted, userState);
+    }
+    
+    private void OnOrderChangeParamOperationCompleted(object arg) {
+        if ((this.OrderChangeParamCompleted != null)) {
+            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+            this.OrderChangeParamCompleted(this, new OrderChangeParamCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+        }
+    }
+    
+    /// <remarks/>
+    public new void CancelAsync(object userState) {
+        base.CancelAsync(userState);
+    }
+}
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+public delegate void StartNewOrderWithQCmdCompletedEventHandler(object sender, StartNewOrderWithQCmdCompletedEventArgs e);
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+public  class StartNewOrderWithQCmdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+    
+    private object[] results;
+    
+    internal StartNewOrderWithQCmdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+            base(exception, cancelled, userState) {
+        this.results = results;
+    }
+    
+    /// <remarks/>
+    public string Result {
+        get {
+            this.RaiseExceptionIfNecessary();
+            return ((string)(this.results[0]));
+        }
+    }
+}
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+public delegate void AddNewOrderCompletedEventHandler(object sender, AddNewOrderCompletedEventArgs e);
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+public  class AddNewOrderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+    
+    private object[] results;
+    
+    internal AddNewOrderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+            base(exception, cancelled, userState) {
+        this.results = results;
+    }
+    
+    /// <remarks/>
+    public string Result {
+        get {
+            this.RaiseExceptionIfNecessary();
+            return ((string)(this.results[0]));
+        }
+    }
+}
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+public delegate void CancelOrderCompletedEventHandler(object sender, CancelOrderCompletedEventArgs e);
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+public  class CancelOrderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+    
+    private object[] results;
+    
+    internal CancelOrderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+            base(exception, cancelled, userState) {
+        this.results = results;
+    }
+    
+    /// <remarks/>
+    public string Result {
+        get {
+            this.RaiseExceptionIfNecessary();
+            return ((string)(this.results[0]));
+        }
+    }
+}
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+public delegate void ChangeOrderCompletedEventHandler(object sender, ChangeOrderCompletedEventArgs e);
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+public  class ChangeOrderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+    
+    private object[] results;
+    
+    internal ChangeOrderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+            base(exception, cancelled, userState) {
+        this.results = results;
+    }
+    
+    /// <remarks/>
+    public string Result {
+        get {
+            this.RaiseExceptionIfNecessary();
+            return ((string)(this.results[0]));
+        }
+    }
+}
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+public delegate void QueryOrderCompletedEventHandler(object sender, QueryOrderCompletedEventArgs e);
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+public  class QueryOrderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+    
+    private object[] results;
+    
+    internal QueryOrderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+            base(exception, cancelled, userState) {
+        this.results = results;
+    }
+    
+    /// <remarks/>
+    public string Result {
+        get {
+            this.RaiseExceptionIfNecessary();
+            return ((string)(this.results[0]));
+        }
+    }
+}
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+public delegate void OrderAddCompletedEventHandler(object sender, OrderAddCompletedEventArgs e);
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+public  class OrderAddCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+    
+    private object[] results;
+    
+    internal OrderAddCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+            base(exception, cancelled, userState) {
+        this.results = results;
+    }
+    
+    /// <remarks/>
+    public string Result {
+        get {
+            this.RaiseExceptionIfNecessary();
+            return ((string)(this.results[0]));
+        }
+    }
+}
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+public delegate void OrderChangeParamCompletedEventHandler(object sender, OrderChangeParamCompletedEventArgs e);
+
+/// <remarks/>
+[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
+[System.Diagnostics.DebuggerStepThroughAttribute()]
+[System.ComponentModel.DesignerCategoryAttribute("code")]
+public  class OrderChangeParamCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+    
+    private object[] results;
+    
+    internal OrderChangeParamCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+            base(exception, cancelled, userState) {
+        this.results = results;
+    }
+    
+    /// <remarks/>
+    public string Result {
+        get {
+            this.RaiseExceptionIfNecessary();
+            return ((string)(this.results[0]));
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/dispatch/NDC.cs b/HH.WCS.Mobox3.HangYang/dispatch/NDC.cs
new file mode 100644
index 0000000..2b28d57
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/dispatch/NDC.cs
@@ -0,0 +1,164 @@
+锘縰sing HH.WCS.HangYang.util;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HH.WCS.HangYang.dispatch
+{
+    public class NDC
+    {
+        private static HostToAGV callClient = null;
+        static NDC() {
+            callClient = new HostToAGV();
+            //callClient.Url = "http://192.168.1.146:9988/HostToAGV.cgi";
+            callClient.Url = Settings.HostToAgvServerUrl;
+        }
+        private static string GetReqStrNew(int ts, int pri, string taskNo, Dictionary<string, string> param) {
+            /*<Req>
+              <Order TS='5' Pri='80' No='666' NoCallback='0' Ext1='' Ext2='' Ext3=''>
+                <Param Name='From' Value='10' />
+                <Param Name='To' Value='20' />
+                <Param Name='Func' Value='1' />
+                <Param Name='Data' Value='7' />
+                <Param Name='ItemHeight' Value='1' />
+                <Param Name='CntrType' Value='12' />
+                <Param Name='FromCol' Value='2' />
+                <Param Name='ToCol' Value='111' />
+              </Order>
+            </Req>*/
+            var sb = new StringBuilder();
+            sb.Append($"<Req><Order TS='{ts}' Pri='{pri}' No='{taskNo}'>");
+
+            foreach (var kv in param) {
+                sb.Append($"<Param Name='{kv.Key}' Value='{kv.Value}'/>");
+            }
+            sb.Append("</Order></Req>");
+            return sb.ToString();
+        }
+        public AGVResult AddNewOrderNew(int ts, int pri, string taskNo, Dictionary<string, string> param) {
+            //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
+
+            var bufin = GetReqStrNew(ts, pri, taskNo, param);
+
+            try {
+
+                var result = callClient.OrderAdd(bufin);
+                LogHelper.Info($"浠诲姟涓嬪彂缁撴灉 OrderAdd req={bufin} res={result}", "NDC");
+                Console.WriteLine($"浠诲姟涓嬪彂缁撴灉 OrderAdd req={bufin} res={result}");
+                //LogHelper.Info(result.bufout, "ts");
+                return GetResult(result);
+            }
+            catch (Exception e) {
+                LogHelper.Info($"浠诲姟涓嬪彂澶辫触 OrderAdd req={bufin} res={e.Message}", "NDC");
+                //Console.WriteLine($"浠诲姟涓嬪彂澶辫触 AddNewOrder req={bufin} res={e.Message}");
+                return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
+            }
+
+        }
+        private static string GetReqStr(int ts, Dictionary<string, string> param) {
+            //< Order  TS = '60'  Pri = '" + mst.CN_N_PRIORITY.ToString() + "' From = '" + start.CN_N_AGV_TN_Location + "' To = '" + end.CN_N_AGV_TN_Location + "'  No = '" + mst.S_CODE + "_1' Ext1 = '1' Ext2 = '" + Constants.TN_MID_COMMANDEQ_CALLAGVOrderCommandType + "'  N_CNTR_COUNT = ''   FRow = '" + sFloor + "'  TRow = '" + eFloor + "' />
+            var sb = new StringBuilder();
+            sb.Append($"<Req><Order ");
+            if (ts != 0) {
+                sb.Append($"TS='{ts}'");
+            }
+            foreach (var kv in param) {
+                sb.Append($" {kv.Key}='{kv.Value}'");
+            }
+            sb.Append("/></Req>");
+            return sb.ToString();
+        }
+        public static AGVResult AddNewOrder(int ts, Dictionary<string, string> param) {
+            //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
+
+            var bufin = GetReqStr(ts, param);
+
+            try {
+
+                var result = callClient.AddNewOrder(bufin);
+                LogHelper.Info($"AddNewOrder req={bufin} res={result}", "NDC");
+                return GetResult(result);
+            }
+            catch (Exception e) {
+                LogHelper.Info($"AddNewOrder req={bufin} res={e.Message}", "NDC");
+                return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
+            }
+
+        }
+        public static AGVResult CancelOrder(int ts, Dictionary<string, string> param) {
+            //< Req >< Order No = 'TN2302020001' >< Param Name = 'IsForce' Value = '1' /></ Order ></ Req >
+            var bufin = GetReqStr(ts, param);
+            try {
+                var result = callClient.CancelOrder(bufin);
+                LogHelper.Info($"CancelOrder req={bufin} res={result}", "NDC");
+                return GetResult(result);
+            }
+            catch (Exception e) {
+                LogHelper.Info($"CancelOrder req={bufin} res={e.Message}", "NDC");
+                return new AGVResult {
+                    Res = new Res {
+                        ErrCode = -1,
+                        ErrInfo = e.Message
+                    }
+                };
+            }
+
+        }
+        public static AGVResult StartNewOrderWithQCmd(int ts, Dictionary<string, string> param) {
+            //lpn:      <Order TS='41' Pri='' ExtDeviceNo='{0}' CtrlVal='{1}' DispInfo='{2}' No='{3}' Ext1='' Ext2='' N_CNTR_COUNT='' />
+            //traccif:  <Order TS='164' From='2' To='2' ExtDeviceNo='" + lockNo + "' No='" + DateTime.Now.Ticks.ToString() + "' />
+            //lock:     <Order TS='170'  CtrlVal='" + CtrlVal + "' ExtDeviceNo='" + roadway + "' No='" + DateTime.Now.Ticks.ToString() + "' />
+            var bufin = GetReqStr(ts, param);
+            try {
+                var r = callClient.StartNewOrderWithQCmd(bufin);
+                LogHelper.Info($"StartNewOrderWithQCmd req={bufin} res={r}", "NDC");
+                return GetResult(r);
+            }
+            catch (Exception e) {
+                LogHelper.Info($"StartNewOrderWithQCmd req={bufin} res={e.Message}", "NDC");
+                return new AGVResult {
+                    Res = new Res {
+                        ErrCode = -1,
+                        ErrInfo = e.Message
+                    }
+                };
+            }
+        }
+        public static AGVResult ChangeOrder(Dictionary<string, string> param) {
+            //< Req >< Order No = 'TN2302020002' ParamNo = '18' Param1 = '12' /></ Req >
+            var bufin = GetReqStr(0, param);
+            try {
+                var r = callClient.ChangeOrder(bufin);
+                LogHelper.Info($"ChangeOrder req={bufin} res={r}", "NDC");
+                return GetResult(r);
+            }
+            catch (Exception e) {
+                LogHelper.Info($"ChangeOrder req={bufin} res={e.Message}", "NDC");
+                return new AGVResult {
+                    Res = new Res {
+                        ErrCode = -1,
+                        ErrInfo = e.Message
+                    }
+                };
+            }
+        }
+        private static AGVResult GetResult(string bufout) {
+            //<Res><ErrCode>0</ErrCode><Result>11</Result></Res>
+            XmlDocument xml = new XmlDocument();
+            xml.LoadXml(bufout);
+            var json = JsonConvert.SerializeXmlNode(xml);
+            return JsonConvert.DeserializeObject<AGVResult>(json);
+        }
+        public class AGVResult
+        {
+            public Res Res { get; set; }
+        }
+        public class Res
+        {
+            public int ErrCode { get; set; }
+            public string ErrInfo { get; set; }
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/dispatch/NDCHelper.cs b/HH.WCS.Mobox3.HangYang/dispatch/NDCHelper.cs
new file mode 100644
index 0000000..b9896ec
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/dispatch/NDCHelper.cs
@@ -0,0 +1,81 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HH.WCS.HangYang.dispatch
+{
+    public class NDCHelper
+    {
+        public static void Test() {
+            //dic.Add("Ext1", ""); dic.Add("Ext2", ""); dic.Add("N_CNTR_COUNT", "");
+            //var r = callClient.AddNewOrderAsync(new AddNewOrderRequest() { bufin = "<Req><Order Pri='1' TS='1' From='1' To='2' No='123471118_1'  Ext1='1' Ext2='CALLADDAGV'  N_CNTR_COUNT='' /></Req>" });
+            //r.Wait();
+
+            var dic = new Dictionary<string, string>();
+            dic.Add("Pri", "1"); dic.Add("From", "1"); dic.Add("To", "1"); dic.Add("No", "12311411718_2");// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", "");
+            var result = NDC.AddNewOrder(1, dic);
+
+            var dic1 = new Dictionary<string, string>();
+            var no = "3454566666";
+            dic1.Add("From", "1"); dic1.Add("To", "0"); dic1.Add("No", no);
+            result = NDC.AddNewOrder(101, dic1);
+
+            var dic2 = new Dictionary<string, string>();
+            dic2.Add("ExtDeviceNo", "1"); dic2.Add("From", "2"); dic2.Add("To", "2"); dic2.Add("No", DateTime.Now.Ticks.ToString()); dic2.Add("CtrlVal", "1");
+            result = NDC.AddNewOrder(39, dic2);
+
+            var dic3 = new Dictionary<string, string>();
+            dic3.Add("From", "1"); dic3.Add("To", "9"); dic3.Add("No", no);
+            result = NDC.CancelOrder(101, dic3);
+
+            var dic4 = new Dictionary<string, string>();
+            dic4.Add("ExtDeviceNo", "1"); dic4.Add("CtrlVal", "1"); dic4.Add("DispInfo", "AAAAAAAA"); dic4.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.StartNewOrderWithQCmd(41, dic4);
+
+            var dic5 = new Dictionary<string, string>();
+            dic5.Add("ExtDeviceNo", "1"); dic5.Add("CtrlVal", "1"); dic5.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.StartNewOrderWithQCmd(170, dic5);
+
+            var dic6 = new Dictionary<string, string>();
+            dic6.Add("ExtDeviceNo", "11"); dic6.Add("From", "2"); dic6.Add("To", "2"); dic6.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.StartNewOrderWithQCmd(164, dic6);
+
+            var dic7 = new Dictionary<string, string>();
+            dic7.Add("Param1", "50"); dic7.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.ChangeOrder(dic7);
+        }
+
+        public static bool ChangeParam(string taskNo, int param1, int paramNo = 0) {
+            bool bResult = false;
+            var dic = new Dictionary<string, string>();
+            dic.Add("No", taskNo);
+            if (paramNo >= 0) {
+                dic.Add("ParamNo", paramNo.ToString());
+            }
+            dic.Add("Param1", param1.ToString());
+            var result = NDC.ChangeOrder(dic);
+            return bResult;
+        }
+
+        public static bool Traffic(string lockNo) {
+            bool bResult = false;
+            var dic = new Dictionary<string, string>();
+            dic.Add("ExtDeviceNo", lockNo);
+            dic.Add("From", "2");
+            dic.Add("To", "2"); dic.Add("No", DateTime.Now.Ticks.ToString());
+
+            var result = NDC.StartNewOrderWithQCmd(164, dic);
+            return bResult;
+        }
+
+        public static bool Cancel(string taskNo) {
+            bool bResult = false;
+            var dic = new Dictionary<string, string>();
+            dic.Add("No", taskNo);
+            dic.Add("IsForce", "1");
+
+            var result = NDC.CancelOrder(1, dic);
+            return bResult;
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/AZInventory.cs b/HH.WCS.Mobox3.HangYang/models/AZInventory.cs
new file mode 100644
index 0000000..be75d03
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/AZInventory.cs
@@ -0,0 +1,27 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_AZ_Inventory")]
+    public  class AZInventory : BaseModel
+    {
+       
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public float F_QTY { get; set; }
+        public string S_AREA_CODE { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string C_IS_LOGIC_AREA { get; set; } = "N";
+        public string S_END_USER { get; set; }
+        public string S_ITEM_STATE { get; set; } = "合格";
+        public string S_ITEM_ROUTE { get; set; } = "";
+        public string S_ITEM_SPEC { get; set; }
+        public string S_STATE_PRE { get; set; } = "";
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public int N_ITEM_STATE { get; set; }
+        public float F_ALLOC_QTY { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/Area.cs b/HH.WCS.Mobox3.HangYang/models/Area.cs
new file mode 100644
index 0000000..a1d32a1
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/Area.cs
@@ -0,0 +1,32 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    [SugarTable("TN_Area")]
+    public class Area : BaseModel
+    {
+
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_CODE { get; set; }
+        public string S_NOTE { get; set; }
+        public int N_FLOOR { get; set; }
+        public string S_EXT_DATA { get; set; }
+        public string S_LOC_TYPE { get; set; }
+        public string S_NAME { get; set; }
+        public int N_LOC_TYPE { get; set; }
+        public int N_TYPE { get; set; }
+        public string S_TYPE { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public int N_DEVICE_TYPE { get; set; }
+        public string S_DEVICE_TYPE { get; set; }
+        public string S_DEVICE_NO { get; set; }
+        public string C_VISUAL { get; set; }
+        public string S_GROUP { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/BaseModel.cs b/HH.WCS.Mobox3.HangYang/models/BaseModel.cs
new file mode 100644
index 0000000..7c30286
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/BaseModel.cs
@@ -0,0 +1,24 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.models
+{
+    public class BaseModel
+    {
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_ID { get; set; } = Guid.NewGuid().ToString("D");
+        public string S_CREATOR_ID { get; set; } = "sa";
+        public string S_CREATOR_NAME { get; set; } = "瓒呯骇鐢ㄦ埛";
+        public DateTime T_CREATE { get; set; } = DateTime.Now;
+        public DateTime T_MODIFY { get; set; } = DateTime.Now;
+        /// <summary>
+        /// 缂栬緫銆佸畾鐗�+        /// </summary>
+        public string S_STATE { get; set; } = "缂栬緫";
+        //public string G_SOURCE_OBJ { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/CntrItemDetail.cs b/HH.WCS.Mobox3.HangYang/models/CntrItemDetail.cs
new file mode 100644
index 0000000..c4b1036
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/CntrItemDetail.cs
@@ -0,0 +1,50 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    //CntrItemRel
+    [SugarTable("TN_CG_Detail")]
+    public class CntrItemDetail : BaseModel
+    {
+       
+        
+        public string S_CG_ID { get; set; }
+    
+        public string S_SERIAL_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; } = "";
+        public string S_ITEM_SPEC { get; set; }
+        public string S_ITEM_STATE { get; set; } = "合格";
+        /// <summary>
+        /// 1:合格 2:不合格 
+        /// </summary>
+        public int N_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_END_USER { get; set; } = "";
+        public string S_OWNER { get; set; }
+        public string S_SUPPLIER_NO { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; } = "kg";
+        public string S_CNTR_CODE { get; set; }
+        public string S_BS_TYPE { get; set; } = "";
+        public string S_BS_NO { get; set; } = "";
+        public float F_NET_WEIGHT { get; set; }
+        public float F_GROSS_WEIGHT { get; set; }
+        public string S_WU { get; set; } = "kg";
+        /// <summary>
+        /// 分配量,被其它
+        /// </summary>
+        public float F_ALLOC_QTY { get; set; }
+        public string C_ITEM_MERGE { get; set; } = "N";
+
+        /// <summary>
+        /// 反向映射
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_CNTR_CODE), nameof(Container.S_CODE))]
+        public Container Cntr { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/Container.cs b/HH.WCS.Mobox3.HangYang/models/Container.cs
new file mode 100644
index 0000000..b3cf3ef
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/Container.cs
@@ -0,0 +1,42 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+
+namespace HH.WCS.HangYang {
+    [SugarTable("TN_Container")]
+    public class Container : BaseModel {
+
+
+        public string S_CODE { get; set; }
+        public string S_TYPE { get; set; }
+        public string S_SPEC { get; set; }
+        public float F_WEIGHT { get; set; }
+        public float F_LOAD_WEIGHT { get; set; }
+        public float F_MAX_WEIGHT { get; set; }
+        public int N_LENGTH { get; set; }
+        public int N_WIDTH { get; set; }
+        public int N_HEIGHT { get; set; }
+        public string C_IS_VIRTUAL { get; set; } = "N";
+        public int N_TYPE { get; set; }
+        public string C_ENABLE { get; set; } = "Y";
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+
+        public int N_DETAIL_COUNT { get; set; }
+        public int N_B_STATE { get; set; }
+        public string S_LOCK_OP_CODE { get; set; }
+        public string S_LOCK_STATE { get; set; }
+        public int N_LOCK_STATE { get; set; }
+        /// <summary>
+        /// 码盘时候标记
+        /// </summary>
+        public string S_SRC { get; internal set; }
+        public string S_DEST { get; internal set; }
+
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany, nameof(CntrItemDetail.S_CNTR_CODE), nameof(S_CODE))]
+        public List<CntrItemDetail> CntrItemRels { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/DistributionCntr.cs b/HH.WCS.Mobox3.HangYang/models/DistributionCntr.cs
new file mode 100644
index 0000000..8fcfa10
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/DistributionCntr.cs
@@ -0,0 +1,131 @@
+锘縰sing HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    /// <summary>
+    /// 閰嶇洏鍗�+    /// </summary>
+    [SugarTable("TN_Distribution_CNTR")]
+    public class DistributionCntr : BaseModel
+    {
+        /// <summary>
+        /// 閰嶇洏鍙�+        /// </summary>
+        public string S_DC_NO { get; set; }
+
+        /// <summary>
+        /// 浠撳簱缂栫爜
+        /// </summary>
+        public string S_WH_CODE { get; set; }
+
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+
+        /// <summary>
+        /// 璐т綅缂栫爜
+        /// </summary>
+        public string S_LOC_CODE { get; set; }
+
+        /// <summary>
+        /// 涓氬姟鐘舵�
+        /// </summary>
+        public int N_B_STATE { get; set; }
+
+        /// <summary>
+        /// 鏂欑缂栫爜
+        /// </summary>
+        public string S_CNTR_CODE { get; set; }
+
+        /// <summary>
+        /// 鍑哄簱鍙e尯鍩熺紪鐮�+        /// </summary>
+        public string S_EXIT_AREA_CODE { get; set; }
+
+        /// <summary>
+        /// 鍑哄簱鍙h揣浣嶇紪鐮�+        /// </summary>
+        public string S_EXIT_LOC_CODE { get; set; }
+
+        /// <summary>
+        /// 浼樺厛绾�+        /// </summary>
+        public int N_PRIORITY { get; set; }
+
+        /// <summary>
+        /// 浣滀笟缂栫爜
+        /// </summary>
+        public string S_OP_CODE { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮涓氬姟绫诲瀷
+        /// </summary>
+        public string S_BS_TYPE { get; set; }
+
+        /// <summary>
+        ///鏉ユ簮涓氬姟缂栫爜
+        /// </summary>
+        public string S_BS_NO { get; set; }
+
+        /// <summary>
+        /// 鑷姩鐢熸垚浣滀笟
+        /// </summary>
+        public string C_AUTO_OP { get; set; }
+
+        /// <summary>
+        /// 浣滀笟绫诲瀷
+        /// </summary>
+        public string S_OP_TYPE { get; set; }
+
+        /// <summary>
+        /// 鏁存嫋鍑哄簱
+        /// </summary>
+        public string C_WHOLE_OUT { get; set; }
+
+        /// <summary>
+        /// 閿欒鍓嶄笟鍔$姸鎬�+        /// </summary>
+        public int N_PRE_B_STATE { get; set; }
+
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        public string S_ERR { get; set; }
+
+        /// <summary>
+        /// 涓氬姟鐘舵�鍚嶇О
+        /// </summary>
+        public string S_B_STATE { get; set; }
+
+        /// <summary>
+        /// 鍒嗘嫞绔欏彴
+        /// </summary>
+        public string S_STATION_NO { get; set; }
+
+        /// <summary>
+        /// 鍑哄簱浣滀笟缂栫爜
+        /// </summary>
+        public string S_OUT_OP_NO { get; set; }
+
+        /// <summary>
+        /// 鍥炲簱浣滀笟缂栫爜
+        /// </summary>
+        public string S_BACK_OP_NO { get; set; }
+
+
+        /// <summary>
+        /// 鍙嶅悜鏄犲皠
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_DC_NO), nameof(DistributionCntrDetail.S_DC_NO))]
+        public DistributionCntrDetail CntrDetail { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/DistributionCntrDetail.cs b/HH.WCS.Mobox3.HangYang/models/DistributionCntrDetail.cs
new file mode 100644
index 0000000..2e42880
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/DistributionCntrDetail.cs
@@ -0,0 +1,196 @@
+锘縰sing HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    /// <summary>
+    /// 閰嶇洏鍗曟槑缁�+    /// </summary>
+    [SugarTable("TN_Distribution_CNTR_Detail")]
+    public class DistributionCntrDetail : BaseModel
+    {
+        /// <summary>
+        /// 閰嶇洏鍙�+        /// </summary>
+        public string S_DC_NO { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡瑙勬牸
+        /// </summary>
+        public string S_ITEM_SPEC { get; set; }
+
+        /// <summary>
+        /// 涓氬姟鐘舵�
+        /// </summary>
+        public int N_B_STATE { get; set; }
+
+        /// <summary>
+        /// 瀹瑰櫒缂栫爜
+        /// </summary>
+        public string S_CNTR_CODE { get; set; }
+
+        /// <summary>
+        /// S_BATCH_NO
+        /// </summary>
+        public string S_BATCH_NO { get; set; }
+
+        /// <summary>
+        /// 鍟嗗搧鐘舵�
+        /// </summary>
+        public int N_ITEM_STATE { get; set; }
+
+        /// <summary>
+        /// 鍟嗗搧鐘舵�鍚嶇О
+        /// </summary>
+        public string S_ITEM_STATE { get; set; }
+
+        /// <summary>
+        /// 绯诲垪鍙�+        /// </summary>
+        public string S_SERIAL_NO { get; set; }
+
+        /// <summary>
+        /// 閰嶈揣鏁伴噺
+        /// </summary>
+        public float F_QTY { get; set; }
+
+        /// <summary>
+        /// 绱鎷h揣鏁伴噺
+        /// </summary>
+        public float F_ACC_P_QTY { get; set; }
+
+        /// <summary>
+        /// 鍗曚綅
+        /// </summary>
+        public string S_UOM { get; set; }
+
+        /// <summary>
+        /// 浣跨敤鑰�+        /// </summary>
+        public string S_END_USER { get; set; }
+
+        /// <summary>
+        /// 璐т富缂栫爜
+        /// </summary>
+        public string S_OWNER { get; set; }
+
+        /// <summary>
+        /// 渚涘簲鍟嗙紪鐮�+        /// </summary>
+        public string S_SUPPLIER_NO { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮涓氬姟绫诲瀷
+        /// </summary>
+        public string S_BS_TYPE { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮涓氬姟缂栫爜
+        /// </summary>
+        public string S_BS_NO { get; set; }
+
+        /// <summary>
+        /// 涓氬姟鏉ユ簮琛屽彿
+        /// </summary>
+        public int N_BS_ROW_NO { get; set; }
+
+        /// <summary>
+        /// 鏂欑鍟嗗搧鏄庣粏鏍囪瘑
+        /// </summary>
+        public string G_CG_DETAIL_ID { get; set; }
+
+        /// <summary>
+        /// 浠撳簱缂栫爜
+        /// </summary>
+        public string S_WH_CODE { get; set; }
+
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+
+        /// <summary>
+        /// 娉㈡鍙�+        /// </summary>
+        public string S_WAVE_NO { get; set; }
+
+        /// <summary>
+        /// 娉㈡鏁版嵁绫绘爣璇�+        /// </summary>
+        public string S_WAVE_CLS_ID { get; set; }
+
+        /// <summary>
+        /// 鍒嗘嫞绔欏彴
+        /// </summary>
+        public string S_STATION_NO { get; set; }
+
+        /// <summary>
+        /// 绔欑偣鍑哄簱浠诲姟鍙�+        /// </summary>
+        public string S_SOT_CODE { get; set; }
+
+        /// <summary>
+        /// 璐т綅缂栫爜
+        /// </summary>
+        public string S_LOC_CODE { get; set; }
+
+        /// <summary>
+        /// 璐ч殧鍙�+        /// </summary>
+        public string S_CELL_NO { get; set; }
+
+        /// <summary>
+        /// 鎷f枡绠辩紪鐮�+        /// </summary>
+        public string S_PICK_BOX_CODE { get; set; }
+
+        /// <summary>
+        /// ERP浠撳簱
+        /// </summary>
+        public string S_ERP_WH_CODE { get; set; }
+
+        /// <summary>
+        /// 鎵╁睍灞炴�1
+        /// </summary>
+        public string S_EXT_ATTR1 { get; set; }
+
+        /// <summary>
+        /// 鎵╁睍灞炴�2
+        /// </summary>
+        public string S_EXT_ATTR2 { get; set; }
+
+        /// <summary>
+        /// 鎵╁睍灞炴�3
+        /// </summary>
+        public string S_EXT_ATTR3 { get; set; }
+
+        /// <summary>
+        /// 鎵╁睍灞炴�4
+        /// </summary>
+        public string S_EXT_ATTR4 { get; set; }
+
+        /// <summary>
+        /// 鎵╁睍灞炴�5
+        /// </summary>
+        public string S_EXT_ATTR5 { get; set; }
+
+
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/FunctionArea.cs b/HH.WCS.Mobox3.HangYang/models/FunctionArea.cs
new file mode 100644
index 0000000..251c23c
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/FunctionArea.cs
@@ -0,0 +1,30 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+    [SugarTable("TN_Function_Area")]
+    public class FunctionArea : BaseModel {
+
+        
+        /// <summary>
+        /// Area、Zone、Warehouse、Location
+        /// </summary>
+        public string S_MASTER_CLS { get; set; }
+        public string S_MASTER_CODE { get; set; }
+        /// <summary>
+        /// 0 – 无 1 – 收货 2 – 检验 3 – 理货 4 – 分拣 5 – 发货
+        /// 6 – 不合格品
+        /// 10 – 入库接驳 11 – 出库接驳
+        /// </summary>
+        public int N_TYPE { get; set; }
+        public int N_PRIORITY { get; set; }
+        public string S_TYPE { get; set; }
+        /// <summary>
+        /// 0 – 库区 1 – 货位 2 – 逻辑库区
+        /// </summary>
+        public int N_FA_TYPE { get; set; }
+        public string S_FA_CODE { get; set; }
+        public string S_FA_NAME { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/InOrder.cs b/HH.WCS.Mobox3.HangYang/models/InOrder.cs
new file mode 100644
index 0000000..8908977
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/InOrder.cs
@@ -0,0 +1,50 @@
+锘縰sing HH.WCS.HangYang.models;
+using HH.WCS.HangYang;
+using Opc.Ua;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    [SugarTable("TN_Inbound_Order")]
+    public class InOrder : BaseModel
+    {
+        public string S_NO { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮鍗曞彿
+        /// </summary>
+        public string S_BS_NO { get; set; }
+
+        /// <summary>
+        /// 涓氬姟绫诲瀷
+        /// </summary>
+        public string S_OP_TYPE { get; set; }
+
+        /// <summary>
+        /// 涓氬姟鏉ユ簮
+        /// </summary>
+        public string S_BS_TYPE { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string S_NOTE { get; set; }
+
+        /// <summary>
+        /// 0 --鏈墽琛�1 缁勭洏 2 鈥�缁勭洏瀹屾垚 3 -- 鍏ュ簱瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; }
+        
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany, nameof(S_NO))]
+        public List<InOrderDetail> InOrderDetail { get; set; }
+
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/InOrderDetail.cs b/HH.WCS.Mobox3.HangYang/models/InOrderDetail.cs
new file mode 100644
index 0000000..c61d980
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/InOrderDetail.cs
@@ -0,0 +1,52 @@
+锘縰sing HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    [SugarTable("TN_Inbound_Detail")]
+    public class InOrderDetail : BaseModel
+    {
+        /// <summary>
+        /// 鍏ュ簱鍗曞彿
+        /// </summary>
+        public string S_IO_NO { get; set; }
+
+        public string S_BS_NO { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮鍗曡鍙�+        /// </summary>
+        public string N_BS_ROW_NO { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡灞炴�
+        /// </summary>
+        public string S_EXT_ATTR1 { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+
+        /// <summary>
+        /// 鏁伴噺
+        /// </summary>
+        public int F_QTY { get; set; }
+
+        /// <summary>
+        /// 宸茬粦瀹氭暟閲�+        /// </summary>
+        public int F_ACC_B_QTY { get; set; }
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/LocCntrRel.cs b/HH.WCS.Mobox3.HangYang/models/LocCntrRel.cs
new file mode 100644
index 0000000..d784bb6
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/LocCntrRel.cs
@@ -0,0 +1,35 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+
+namespace HH.WCS.HangYang
+{
+    //TN_Loc_Container
+    //LocCntrRel
+    [SugarTable("TN_Loc_Container")]
+    public class LocCntrRel : BaseModel
+    {
+        
+        
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_LOC_CODE { get; set; }
+        public string S_CNTR_CODE { get; set; }
+        public string S_ACTION_SRC { get; set; }
+        public string S_BINDING_METHOD { get; set; }
+        public int N_BINDING_METHOD { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public int N_BIND_ORDER { get; set; }
+
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany, nameof(S_CNTR_CODE))]
+        public List<CntrItemDetail> CntrItemRels { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_CNTR_CODE))]
+        public Container Container { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/Location.cs b/HH.WCS.Mobox3.HangYang/models/Location.cs
new file mode 100644
index 0000000..e069532
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/Location.cs
@@ -0,0 +1,74 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+
+    [SugarTable("TN_Location")]
+    public class Location : BaseModel {
+
+
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        
+        public string S_CODE { get; set; }
+        public string S_NAME { get; set; }
+        public string S_AREA_CODE { get; set; }
+        public int N_CAPACITY { get; set; }
+        public string S_AGV_SITE { get; set; }
+        public int N_CURRENT_NUM { get; set; }
+        public DateTime? T_EMPTY_TIME { get; set; }
+        public DateTime? T_FULL_TIME { get; set; }
+        public string S_NOTE { get; set; }
+        public int N_LENGTH { get; set; }
+        public int N_WIDTH { get; set; }
+        public int N_HEIGHT { get; set; }
+        public int N_AGV_SITE_LAYER { get; set; }
+        public int N_ROADWAY { get; set; }
+        public int N_ROW { get; set; }
+        public int N_COL { get; set; }
+        public int N_LAYER { get; set; }
+        public string S_TYPE { get; set; }
+
+        /// <summary>
+        /// 0鏃�1鍏ュ簱閿�2鍑哄簱閿�3鍏跺畠閿�+        /// </summary>
+        public string S_LOCK_STATE { get; set; }
+        public int N_TYPE { get; set; }
+        /// <summary>
+        ///  0鏃�1鍏ュ簱閿�2鍑哄簱閿�3鍏跺畠閿�+        /// </summary>
+        public int N_LOCK_STATE { get; set; }
+        public int N_PURPOSE { get; set; }
+        public string S_PURPOSE { get; set; }
+        public string C_ENABLE { get; set; }
+        public string C_SAME_GOOD { get; set; }
+        public string C_SAME_BATCH { get; set; }
+        public string C_SPECIFY_ITEM { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_LOCK_OP { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        /// <summary>
+        /// 鎺掔粍
+        /// </summary>
+        public int N_ROW_GROUP { get; set; }
+        public int N_POS { get; set; }
+        public string S_GROUP { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany, nameof(S_CODE))]
+        public LocCntrRel LocCntrRel { get; set; }
+
+        internal static string GetLockStateStr(int lockState) {
+            var str = "";
+            switch (lockState) {
+                case 0: str = "鏃�; break;
+                case 1: str = "鍏ュ簱閿�; break;
+                case 2: str = "鍑哄簱閿�; break;
+                case 3: str = "鍏跺畠閿�; break;
+            }
+            return str;
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/OI_WMS_OP_DEF.cs b/HH.WCS.Mobox3.HangYang/models/OI_WMS_OP_DEF.cs
new file mode 100644
index 0000000..662092c
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/OI_WMS_OP_DEF.cs
@@ -0,0 +1,33 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//    姝や唬鐮佹槸鏍规嵁妯℃澘鐢熸垚鐨勩�
+//
+//    鎵嬪姩鏇存敼姝ゆ枃浠跺彲鑳戒細瀵艰嚧搴旂敤绋嬪簭涓彂鐢熷紓甯歌涓恒�
+//    濡傛灉閲嶆柊鐢熸垚浠g爜锛屽垯灏嗚鐩栧姝ゆ枃浠剁殑鎵嬪姩鏇存敼銆�+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace ConsoleApp1
+{
+    using System;
+    using System.Collections.Generic;
+    
+    public partial class OI_WMS_OP_DEF
+    {
+        public string G_ID { get; set; }
+        public string S_FACTORY { get; set; }
+        public string S_OP_CODE { get; set; }
+        public string S_OP_NAME { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_START_WH { get; set; }
+        public string S_START_AREA { get; set; }
+        public string S_START_LOC { get; set; }
+        public string S_END_WH { get; set; }
+        public string S_END_AREA { get; set; }
+        public string S_END_LOC { get; set; }
+        public int N_PRIORITY { get; set; }
+        public short N_WORK_MODE { get; set; }
+        public short N_OP_TYPE { get; set; }
+        public string C_ENABLE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/OI_WMS_SCHEDULE_TYPE.cs b/HH.WCS.Mobox3.HangYang/models/OI_WMS_SCHEDULE_TYPE.cs
new file mode 100644
index 0000000..4f8476e
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/OI_WMS_SCHEDULE_TYPE.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//    姝や唬鐮佹槸鏍规嵁妯℃澘鐢熸垚鐨勩�
+//
+//    鎵嬪姩鏇存敼姝ゆ枃浠跺彲鑳戒細瀵艰嚧搴旂敤绋嬪簭涓彂鐢熷紓甯歌涓恒�
+//    濡傛灉閲嶆柊鐢熸垚浠g爜锛屽垯灏嗚鐩栧姝ゆ枃浠剁殑鎵嬪姩鏇存敼銆�+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace ConsoleApp1
+{
+    using System;
+    using System.Collections.Generic;
+    
+    public partial class OI_WMS_SCHEDULE_TYPE
+    {
+        public string G_ID { get; set; }
+        public string S_FACTORY { get; set; }
+        public string S_SCHEDULE_TYPE { get; set; }
+        public short N_ORDER { get; set; }
+        public string S_IP { get; set; }
+        public Nullable<int> N_PORT { get; set; }
+        public short N_SCHEDULE_TYPE { get; set; }
+        public int N_INTERVAL { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/OI_WMS_TASK_TYPE.cs b/HH.WCS.Mobox3.HangYang/models/OI_WMS_TASK_TYPE.cs
new file mode 100644
index 0000000..03287d4
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/OI_WMS_TASK_TYPE.cs
@@ -0,0 +1,14 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+    [SugarTable("OI_WMS_TASK_TYPE")]
+    public partial class TaskType  {
+        public string G_ID { get; set; } = Guid.NewGuid().ToString("D");
+        public string S_FACTORY { get; set; }
+        public string S_TASK_TYPE { get; set; }
+        public short N_ORDER { get; set; }
+        public short N_TASK_TYPE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/OutOrder.cs b/HH.WCS.Mobox3.HangYang/models/OutOrder.cs
new file mode 100644
index 0000000..1603475
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/OutOrder.cs
@@ -0,0 +1,55 @@
+锘縰sing HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    [SugarTable("TN_Outbound_Order")]
+    public class OutOrder : BaseModel
+    {
+        /// <summary>
+        /// 鍑哄簱鍗曞彿
+        /// </summary>
+        public string S_NO { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮鍗曞彿
+        /// </summary>
+        public string S_BS_NO { get; set; }
+
+        /// <summary>
+        /// 涓氬姟绫诲瀷
+        /// </summary>
+        public string S_OP_TYPE { get; set; }
+
+        /// <summary>
+        /// 鍑哄簱鏂瑰悜
+        /// </summary>
+        public string S_OUT_TO { get; set; }
+
+        /// <summary>
+        /// 浼樺厛绾�+        /// </summary>
+        public int N_PRIORITY { get; set; }
+        
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string S_NOTE { get; set; }
+
+        /// <summary>
+        /// 0 鈥�鏈厤璐�1鈥�宸查厤璐э紙鐢熸垚閰嶈揣琛ㄧ洏锛�2鈥�浣滀笟涓紝鍚庡彴绾跨▼璁剧疆 3 鈥�鍑哄簱瀹屾垚
+        /// </summary>
+        public int N_B_STATE { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany, nameof(S_NO))]
+        public List<OutOrderDetail> OutOrderDetail { get; set; }
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/OutOrderDetail.cs b/HH.WCS.Mobox3.HangYang/models/OutOrderDetail.cs
new file mode 100644
index 0000000..68a0408
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/OutOrderDetail.cs
@@ -0,0 +1,55 @@
+锘縰sing HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    [SugarTable("TN_Outbound_Detail")]
+    public class OutOrderDetail : BaseModel
+    {
+        /// <summary>
+        /// 鍑哄簱鍗曞彿
+        /// </summary>
+        public string S_OO_NO { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮鍗曞彿
+        /// </summary>
+        public string S_BS_NO { get; set; }
+
+        /// <summary>
+        /// 鏉ユ簮鍗曡鍙�+        /// </summary>
+        public string N_BS_ROW_NO { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡灞炴�
+        /// </summary>
+        public string S_EXT_ATTR1 { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+
+        /// <summary>
+        /// 鏁伴噺
+        /// </summary>
+        public int F_QTY { get; set; }
+
+        /// <summary>
+        /// ERP浠撳簱
+        /// </summary>
+        public string S_ERP_WH_CODE { get; set; }
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/PutawayDetail.cs b/HH.WCS.Mobox3.HangYang/models/PutawayDetail.cs
new file mode 100644
index 0000000..02f3577
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/PutawayDetail.cs
@@ -0,0 +1,64 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_Putaway_Detail")]
+    public  class PutawayDetail : BaseModel
+    {
+       
+        
+        public int N_ROW_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        /// <summary>
+        /// 0/1-合格/2-待检/3-丌合格
+        /// </summary>
+        public string S_ITEM_STATE { get; set; } = "合格";
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        /// <summary>
+        /// 唯一码
+        /// </summary>
+        public string S_SERIAL_NO { get; set; } = "";
+        public string D_PRD_DATE { get; set; }
+        public string D_EXP_DATE { get; set; }
+        public string S_NOTE { get; set; }
+        public float F_QTY { get; set; }
+        /// <summary>
+        /// 计量单位 
+        /// </summary>
+        public string S_UOM { get; set; } = "";
+        /// <summary>
+        /// 累计关闭数量
+        /// </summary>
+        public float F_ACC_C_QTY { get; set; }
+        public string S_PUTAWAY_NO { get; set; }
+        /// <summary>
+        /// 0/1-合格/2-待检/3-丌合格
+        /// </summary>
+        public int N_ITEM_STATE { get; set; } = 1;
+        /// <summary>
+        /// 累计绑定数量
+        /// </summary>
+        public float F_ACC_B_QTY { get; set; }
+        public int N_B_STATE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_BS_NO { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_ITEM_ROUTE { get; set; } = "";
+        public float F_NET_WEIGHT { get; set; }
+        public float F_GROSS_WEIGHT { get; set; }
+        /// <summary>
+        /// 重量单位 
+        /// </summary>
+        public string S_WU { get; set; } = "kg";
+        /// <summary>
+        /// 分配量 
+        /// </summary>
+        public float F_ALLOC_QTY { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/PutawayOrder.cs b/HH.WCS.Mobox3.HangYang/models/PutawayOrder.cs
new file mode 100644
index 0000000..a78d23e
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/PutawayOrder.cs
@@ -0,0 +1,39 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_Putaway_Order")]
+    public  class PutawayOrder : BaseModel
+    {
+       
+        
+        public string S_NO { get; set; }
+        public string S_SUPPLIER_NO { get; set; }
+        public string S_SUPPLIER_NAME { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_END_USER { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_NOTE { get; set; }
+        public string S_AUDIT_INFO { get; set; }
+        public string S_AUDIT_RESULT { get; set; }
+        public string S_RECEIPT_NO { get; set; }
+        public string S_AREA_CODE { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_BS_NO { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        /// <summary>
+        /// 当审核定版后,这个状态=1 表示执行 2 – 表示完成 默讣=0
+        /// </summary>
+        public int N_B_STATE { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany,nameof(PutawayDetail.S_PUTAWAY_NO), nameof(S_NO))]
+        public List<PutawayDetail> Details { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/ShippingDetail.cs b/HH.WCS.Mobox3.HangYang/models/ShippingDetail.cs
new file mode 100644
index 0000000..58b192d
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/ShippingDetail.cs
@@ -0,0 +1,49 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_Shipping_Detail")]
+    public  class ShippingDetail : BaseModel
+    {
+        /// <summary>
+        /// 不要设置主键
+        /// </summary>
+        public string S_SHIPPING_NO { get; set; }
+        public int N_ROW_NO { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; } = "合格";
+        public string S_ITEM_SPEC { get; set; }
+        public string S_SERIAL_NO { get; set; } = "";
+        public float F_QTY { get; set; }
+        public float F_OOS_QTY { get; set; }
+        public string S_OOS_REASON { get; set; } = "";
+        public string S_UOM { get; set; } = "kg";
+        public string S_NOTE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public string S_ITEM_ROUTE { get; set; } = "";
+        /// <summary>
+        /// 累计配货数量
+        /// </summary>
+        public float F_ACC_D_QTY { get; set; }
+        /// <summary>
+        /// 用处不大(分拣结果生成下架单数量,根据项目而定,如果是分拣确定一次就回报一次那和累计分拣数量就没有区别)
+        /// </summary>
+        //public float F_ACC_O_QTY { get; set; }
+
+        /// <summary>
+        /// 累计分拣数量(分拣结果累计)
+        /// </summary>
+        public float F_ACC_S_QTY { get; set; }
+        /// <summary>
+        /// 累计关闭数量
+        /// </summary>
+        public float F_ACC_C_QTY { get; set; }
+        public float F_ACC_NC_QTY { get; set; }
+       
+        public int N_ITEM_STATE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/ShippingOrder.cs b/HH.WCS.Mobox3.HangYang/models/ShippingOrder.cs
new file mode 100644
index 0000000..9499cc8
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/ShippingOrder.cs
@@ -0,0 +1,55 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Reflection.Emit;
+
+namespace HH.WCS.HangYang {
+    /// <summary>
+    ///发货单需要有定版后事件(S_STATE=定版),在这个事件中,系统会创建触发一个名为"创建分拣单"的发货单事件,由这个脚本来【分拣单/分拣单子表】,在创建分拣单时需要判断仓库里是否有足够数量的货品,如果没有足够数量的货品生成缺货单,并且 设置【发货单】的业务状态 N_B_STATE = 1(待分拣)。 这个状态说明分拣单、分拣单子表已经创建。等待生成分拣明细(分拣明细需要具体到某个容器)
+    ///在分拣单里已经明确了出货的仓库、库区,并且在仓库、库区加上分配量
+    /// </summary>
+    [SugarTable("TN_Shipping_Order")]
+    public class ShippingOrder : BaseModel {
+
+        public string S_NO { get; set; }
+        public string S_TYPE { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string D_OP_DATE { get; set; }
+        public string D_PLAN_DATE { get; set; }
+        public string D_LATEST_DATE { get; set; }
+        public int N_PRIORITY { get; set; }
+        /// <summary>
+        /// 波次单,默认就用分拣单单号
+        /// </summary>
+        public string S_WAVE_CODE { get; set; } = "";
+        public string S_AUDIT_INFO { get; set; } = "";
+        public string S_AUDIT_RESULT { get; set; }
+        public string S_BS_TYPE { get; set; } = "";
+        public string S_BS_NO { get; set; } = "";
+        public string S_STATE_PRE { get; set; }
+  
+        /// <summary>
+        ///0 – 未生成分拣单
+        ///1 待分拣(分拣单及分拣单子表已经创建) 2- 分拣中(生成
+        ///分拣单明细)– 3 -分拣完成 4 – 发货完成 (分拣结果)5 – 缺件
+        /// </summary>
+        public int N_B_STATE { get; set; }
+        public string S_ERR { get; set; }
+        public string C_AUTO_SORTING { get; set; } = "N";
+        public string C_SHIPPING_FIRST { get; set; } = "";
+        public string S_END_USER { get; set; } = "";
+
+        //public string S_SORTING_AREA { get; set; }
+        //public string S_SORTING_LOC { get; set; }
+        /// <summary>
+        /// 反向映射,不要初始化,子表不要设置外键
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany,nameof(ShippingDetail.S_SHIPPING_NO),nameof(S_NO))]
+        public List<ShippingDetail> Details { get; set; }
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/SortingCompose.cs b/HH.WCS.Mobox3.HangYang/models/SortingCompose.cs
new file mode 100644
index 0000000..8eefe1f
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/SortingCompose.cs
@@ -0,0 +1,37 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+    [SugarTable("TN_Sorting_Compose")]
+    public class SortingCompose : BaseModel {
+
+
+        public string S_SORTING_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        /// <summary>
+        /// 0 未知/1-待检/2-合格/3-不合格
+        /// </summary>
+        public string S_ITEM_STATE { get; set; } = "合格";
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_SERIAL_NO { get; set; } = "";
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; } = "kg";
+        public string S_NOTE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        /// <summary>
+        /// 0 未知/1-待检/2-合格/3-不合格
+        /// </summary>
+        public int N_ITEM_STATE { get; set; } = 2;
+        public int N_ROW_NO { get; set; }
+        /// <summary>
+        /// 分拣单明细数量汇总
+        /// </summary>
+        public float F_ACC_S_QTY { get; set; }
+
+        public string S_ITEM_ROUTE { get; set; } = "";
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/SortingDetail.cs b/HH.WCS.Mobox3.HangYang/models/SortingDetail.cs
new file mode 100644
index 0000000..5a01006
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/SortingDetail.cs
@@ -0,0 +1,38 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+    [SugarTable("TN_Sorting_Detail")]
+    public class SortingDetail : BaseModel {
+
+
+        public string S_SORTING_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; } = "";
+        public string S_BATCH_NO { get; set; }
+        public string S_SERIAL_NO { get; set; } = "";
+        public string S_ITEM_SPEC { get; set; }
+        public string S_CNTR_CODE { get; set; }
+        public string S_GRID_NO { get; set; } = "";
+        public float F_QTY { get; set; }
+        /// <summary>
+        /// 累计分拣数量(分拣结果的累计)
+        /// </summary>
+        //public float F_ACC_SR_QTY { get; set; }
+        public string S_UOM { get; set; } = "kg";
+        public string S_NOTE { get; set; } = "";
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+
+        public string S_ITEM_ROUTE { get; set; } = "";
+        public int N_ITEM_STATE { get; set; }
+        public int N_ROW_NO { get; set; }
+        /// <summary>
+        /// 0 – 待执行 1 – 执行 2 – 完成 3 – 错误
+        /// </summary>
+        public int N_B_STATE { get; set; }
+        public string S_OP_CODE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/SortingOrder.cs b/HH.WCS.Mobox3.HangYang/models/SortingOrder.cs
new file mode 100644
index 0000000..7060a2e
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/SortingOrder.cs
@@ -0,0 +1,57 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_Sorting_Order")]
+    public  class SortingOrder : BaseModel
+    {
+
+
+        public string S_NO { get; set; } = "";
+        public string S_SHIPPING_NO { get; set; } = "";
+        /// <summary>
+        ///  生产出库/销售出库/退库/
+        /// </summary>
+        public string S_TYPE { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_AREA_CODE { get; set; }
+        public string S_SORTING_AREA { get; set; }
+        public string S_SORTING_LOC { get; set; }
+        public string D_OP_DATE { get; set; }
+        public string S_NOTE { get; set; }
+        /// <summary>
+        /// 从发货单继承的属性
+        /// </summary>
+        public string S_BS_TYPE { get; set; }
+        /// <summary>
+        /// 从发货单继承的属性
+        /// </summary>
+        public string S_BS_NO { get; set; }
+        public string S_STATE_PRE { get; set; } = "";
+        public int N_REVIEW_RESULT { get; set; }
+        
+        /// <summary>
+        /// 1 开始配货(自动开始配货或者人工按钮开始配合) 2- 配货完成 3 – 开始作业 4 – 作业已创建 10 –分拣完成 20 – 错误 21 – 暂停
+        /// </summary>
+        public int N_B_STATE { get; set; }
+        public string S_END_USER { get; set; }
+        public string S_ERR { get; set; }
+        public DateTime? T_LAST_PROC { get; set; }
+        public int N_PROC_COUNT { get; set; }
+        public int N_LASTE_B_STATE { get; set; }
+        /// <summary>
+        /// Y = 配货完成后马上安排作业开始搬运
+        /// </summary>
+        //public string C_AUTO_OP { get; set; } = "N";
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany, nameof(SortingCompose.S_SORTING_NO), nameof(S_NO))]
+        public List<SortingCompose> Composes { get; set; }
+
+        [Navigate(NavigateType.OneToMany, nameof(SortingDetail.S_SORTING_NO), nameof(S_NO))]
+        public List<SortingDetail> Details { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/SortingResult.cs b/HH.WCS.Mobox3.HangYang/models/SortingResult.cs
new file mode 100644
index 0000000..56daa12
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/SortingResult.cs
@@ -0,0 +1,32 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_Sorting_Result")]
+    public  class SortingResult : BaseModel
+    {
+       
+        
+        public string S_SORTING_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; } = "";
+        public string S_BATCH_NO { get; set; } = "";
+        public string S_ITEM_SPEC { get; set; } = "";
+        public string S_SERIAL_NO { get; set; } = "";
+        public string S_CNTR_CODE { get; set; }
+        public string S_LOC_CODE { get; set; }
+        public string S_GRID_NO { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; } = "kg";
+        public string S_NOTE { get; set; } = "";
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_ITEM_ROUTE { get; set; } = "";
+        public int N_ITEM_STATE { get; set; } = 2;
+        public int N_ROW_NO { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_ASN_Detail.cs b/HH.WCS.Mobox3.HangYang/models/TN_ASN_Detail.cs
new file mode 100644
index 0000000..306ee3d
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_ASN_Detail.cs
@@ -0,0 +1,31 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public class TN_ASN_Detail : BaseModel
+    {
+      
+        public string S_ASN_NO { get; set; }
+        public int N_ROW_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_NOTE { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; }
+        public float F_ACC_C_QTY { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public float F_ACC_R_QTY { get; set; }
+        public float F_ACC_UNQ_QTY { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_ITEM_ROUTE { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_BS_NO { get; set; }
+        public string S_BS_ROW_NO { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_ASN_Order.cs b/HH.WCS.Mobox3.HangYang/models/TN_ASN_Order.cs
new file mode 100644
index 0000000..16d5b14
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_ASN_Order.cs
@@ -0,0 +1,25 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_ASN_Order : BaseModel
+    {
+     
+        public string S_NO { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string D_OP_DATE { get; set; }
+        public string D_PLAN_DATE { get; set; }
+        public string D_LATEST_DATE { get; set; }
+        public int N_PRIORITY { get; set; }
+        public string S_SUPPLIER_NO { get; set; }
+        public string S_SUPPLIER_NAME { get; set; }
+        public string S_END_USER { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public int N_B_STATE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Business_Source.cs b/HH.WCS.Mobox3.HangYang/models/TN_Business_Source.cs
new file mode 100644
index 0000000..10e43b5
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Business_Source.cs
@@ -0,0 +1,20 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Business_Source : BaseModel
+    {
+
+        
+        public string S_BS_TYPE { get; set; }
+        public int N_ID { get; set; }
+        public string C_UNINSPECTED { get; set; }
+        public string S_SOURCE { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Check_Detail.cs b/HH.WCS.Mobox3.HangYang/models/TN_Check_Detail.cs
new file mode 100644
index 0000000..d3c6376
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Check_Detail.cs
@@ -0,0 +1,37 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Check_Detail : BaseModel
+    {
+       
+       
+        public string S_CHECK_NO { get; set; }
+        public int N_ROW_NO { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_AREA_CODE { get; set; }
+        public string S_LOC_CODE { get; set; }
+        public int N_ROADWAY { get; set; }
+        public int N_ROW { get; set; }
+        public int N_COL { get; set; }
+        public int N_LAYER { get; set; }
+        public string S_CNTR_CODE { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_END_USER { get; set; }
+        public string S_OWNER { get; set; }
+        public string S_SUPPLIER_NO { get; set; }
+        public string S_UOM { get; set; }
+        public float F_QTY { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_ITEM_ROUTE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Check_List.cs b/HH.WCS.Mobox3.HangYang/models/TN_Check_List.cs
new file mode 100644
index 0000000..2338194
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Check_List.cs
@@ -0,0 +1,35 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Check_List : BaseModel
+    {
+       
+        
+        public string S_CHECK_NO { get; set; }
+        public int N_ROW_NO { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_AREA_CODE { get; set; }
+        public string S_LOC_CODE { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_END_USER { get; set; }
+        public string S_OWNER { get; set; }
+        public string S_SUPPLIER_NO { get; set; }
+        public string S_UOM { get; set; }
+        public string F_QTY { get; set; }
+        public float F_CHECK_QTY { get; set; }
+        public string C_EXCESS_STOCK { get; set; }
+        public string C_CHECKED { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_ITEM_ROUTE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Check_Order.cs b/HH.WCS.Mobox3.HangYang/models/TN_Check_Order.cs
new file mode 100644
index 0000000..77bed18
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Check_Order.cs
@@ -0,0 +1,21 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Check_Order : BaseModel
+    {
+        
+        
+        public string S_NO { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_OPERATOR { get; set; }
+        public string S_OPERATOR_NAME { get; set; }
+        public string S_NOTE { get; set; }
+        public int N_TYPE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Equipment.cs b/HH.WCS.Mobox3.HangYang/models/TN_Equipment.cs
new file mode 100644
index 0000000..aa04bd0
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Equipment.cs
@@ -0,0 +1,26 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Equipment : BaseModel
+    {
+       
+        
+        public string S_CODE { get; set; }
+        public string S_NAME { get; set; }
+        public int N_TYPE { get; set; }
+        public string S_TYPE { get; set; }
+        public int N_B_STATE { get; set; }
+        public string S_B_STATE { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_IP { get; set; }
+        public int S_PORT1 { get; set; }
+        public int S_PORT2 { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_EXT_DATA { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Factory.cs b/HH.WCS.Mobox3.HangYang/models/TN_Factory.cs
new file mode 100644
index 0000000..a43fb6a
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Factory.cs
@@ -0,0 +1,17 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    public  class TN_Factory : BaseModel
+    {
+        
+        
+        public string S_CODE { get; set; }
+        public string S_NAME { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Detail.cs b/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Detail.cs
new file mode 100644
index 0000000..3650a4b
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Detail.cs
@@ -0,0 +1,36 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Inspect_Detail : BaseModel
+    {
+        
+        
+        public string S_INSPECT_NO { get; set; }
+        public int N_ROW_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_SERIAL_NO { get; set; }
+        public string D_PRD_DATE { get; set; }
+        public string D_EXP_DATE { get; set; }
+        public string S_NOTE { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; }
+        public float F_ACC_INSPECT_QTY { get; set; }
+        public float F_ACC_Q_QTY { get; set; }
+        public float F_ACC_UNQ_QTY { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_ITEM_ROUTE { get; set; }
+        public float F_NET_WEIGHT { get; set; }
+        public float F_GROSS_WEIGHT { get; set; }
+        public string S_WU { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Order.cs b/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Order.cs
new file mode 100644
index 0000000..f24b793
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Order.cs
@@ -0,0 +1,27 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Inspect_Order : BaseModel
+    {
+       
+        
+        public string S_NO { get; set; }
+        public int N_INSPECT_TYPE { get; set; }
+        public string S_INSPECT_TYPE { get; set; }
+        public string D_INSPECT { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_WMS_OP_NO { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_AREA_CODE { get; set; }
+        public string S_NC_AREA_CODE { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_BS_NO { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Record.cs b/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Record.cs
new file mode 100644
index 0000000..0df0bc5
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Inspect_Record.cs
@@ -0,0 +1,23 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Inspect_Record : BaseModel
+    {
+      
+        
+        public string S_INSPECT_NO { get; set; }
+        public int N_ROW_NO { get; set; }
+        public string S_INSPECTOR { get; set; }
+        public string S_INSPECTOR_NAME { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; }
+        public float F_QUALIFIED_QTY { get; set; }
+        public float F_UN_QUALIFIED_QTY { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_LC_Log.cs b/HH.WCS.Mobox3.HangYang/models/TN_LC_Log.cs
new file mode 100644
index 0000000..8e772d3
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_LC_Log.cs
@@ -0,0 +1,23 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_LC_Log : BaseModel
+    {
+       
+        
+        public string S_LOC_CODE { get; set; }
+        public string S_CNTR_CODE { get; set; }
+        public string S_ACTION_SRC { get; set; }
+        public string S_BINDING_METHOD { get; set; }
+        public int N_BINDING_METHOD { get; set; }
+        public int N_ACTION_TYPE { get; set; }
+        public string S_ACTION_TYPE { get; set; }
+        public int N_DEEP { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Loc_EQ_Link.cs b/HH.WCS.Mobox3.HangYang/models/TN_Loc_EQ_Link.cs
new file mode 100644
index 0000000..fb140e8
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Loc_EQ_Link.cs
@@ -0,0 +1,17 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Loc_EQ_Link : BaseModel
+    {
+        
+        
+        public string S_LOC_CODE { get; set; }
+        public string S_EQ_CODE { get; set; }
+        public string S_EQ_TYPE { get; set; }
+        public string S_SEG_CODE { get; set; }
+        public string S_ACTION { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Lock.cs b/HH.WCS.Mobox3.HangYang/models/TN_Lock.cs
new file mode 100644
index 0000000..be2fa69
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Lock.cs
@@ -0,0 +1,23 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    /// <summary>
+    /// 閿佺姸鎬佽〃锛岀洿鎺ョ湅璐т綅琛ㄥ氨鍙互锛岃繖閲屽彧鏄妸鎵�湁鐨勯攣鏀惧埌涓�捣浜嗭紝璐т綅瑙i攣浜嗭紝杩欒竟闇�鍒犻櫎
+    /// </summary>
+    public  class TN_Lock : BaseModel
+    {
+      
+        
+        public int N_OBJ_TYPE { get; set; }
+        public string S_OBJ_CODE { get; set; }
+        public int N_TYPE { get; set; }
+        public string S_TASK_CODE { get; set; }
+        public string S_OP_CODE { get; set; }
+        public string S_OP_NAME { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_AREA_CODE { get; set; }
+        public string S_OBJ_NAME { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction.cs b/HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction.cs
new file mode 100644
index 0000000..5cf6443
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction.cs
@@ -0,0 +1,25 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_MQ_EQAction : BaseModel
+    {
+        
+        
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_ACTION { get; set; }
+        public string S_EQ_CODE { get; set; }
+        public int N_EQ_TYPE { get; set; }
+        public string S_EQ_TYPE { get; set; }
+        public string S_DATA { get; set; }
+        public string S_TASK_CODE { get; set; }
+        public string N_B_STATE { get; set; }
+        public string S_ERR { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public int N_ACTION_CODE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction_Msg.cs b/HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction_Msg.cs
new file mode 100644
index 0000000..d4b545e
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_MQ_EQAction_Msg.cs
@@ -0,0 +1,25 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_MQ_EQAction_Msg : BaseModel
+    {
+      
+        
+        public string S_ACTION_CODE { get; set; }
+        public string S_ACTION { get; set; }
+        public string S_EQ_CODE { get; set; }
+        public string S_EQ_TYPE { get; set; }
+        public string S_DATA { get; set; }
+        public int N_ERR_CODE { get; set; }
+        public string S_MSG { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public int N_EQ_TYPE { get; set; }
+        public string S_TASK_CODE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Material.cs b/HH.WCS.Mobox3.HangYang/models/TN_Material.cs
new file mode 100644
index 0000000..fd6f280
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Material.cs
@@ -0,0 +1,66 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_Material")]
+    public  class TN_Material : BaseModel
+    {
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_MP_TYPE { get; set; }
+        public string S_ITEM_TYPE { get; set; }
+        public Nullable<float> F_WEIGHT { get; set; }
+        public string S_MATERIAL { get; set; }
+        public string S_IDCODE { get; set; }
+        public string S_SERIES { get; set; }
+        public string S_STORE { get; set; }
+        public string S_CONTROL { get; set; }
+        public string S_BOM_TYPE { get; set; }
+        public int N_BOM_MOD { get; set; }
+        public DateTime? T_DBOM_UPDATE { get; set; }
+        public DateTime? T_EBOM_UPDATE { get; set; }
+        public DateTime? T_PBOM_UPDATE { get; set; }
+        public string C_MULTI_ROUTE { get; set; }
+        public string S_ROUTE_MAKE { get; set; }
+        public string S_ROUTE_ASSEMBLY { get; set; }
+        public string S_DMODE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        public float F_MAX_QTY { get; set; }
+    }
+
+    public class MES_Material
+    {
+        /// <summary>
+        /// 物料编码
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+        /// <summary>
+        /// 物料名称
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+        /// <summary>
+        /// 存储库区
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 规格型号
+        /// </summary>
+        public string S_MATERIAL_SPEC { get; set; }
+        /// <summary>
+        /// 材质
+        /// </summary>
+        public string S_MATERIAL { get; set; }
+        /// <summary>
+        /// 库存单位
+        /// </summary>
+        public string S_UOM { get; set; }
+        /// <summary>
+        /// 是否清洗
+        /// </summary>
+        public string C_CLEAN { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_OOS_Detail.cs b/HH.WCS.Mobox3.HangYang/models/TN_OOS_Detail.cs
new file mode 100644
index 0000000..cad8f8b
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_OOS_Detail.cs
@@ -0,0 +1,25 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_OOS_Detail : BaseModel
+    {
+        
+        
+        public string S_OOS_NO { get; set; }
+        public string S_SERIAL_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_ITEM_ROUTE { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; }
+        public string S_NOTE { get; set; }
+        public int N_ROW_NO { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_OOS_Order.cs b/HH.WCS.Mobox3.HangYang/models/TN_OOS_Order.cs
new file mode 100644
index 0000000..4b8fdb7
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_OOS_Order.cs
@@ -0,0 +1,19 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_OOS_Order : BaseModel
+    {
+        
+        
+        public string S_NO { get; set; }
+        public string S_SHIPPING_NO { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string D_OP_DATE { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_BS_NO { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_OnOff_Shelves.cs b/HH.WCS.Mobox3.HangYang/models/TN_OnOff_Shelves.cs
new file mode 100644
index 0000000..25d0fd4
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_OnOff_Shelves.cs
@@ -0,0 +1,39 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_OnOff_Shelves : BaseModel
+    {
+        
+        
+        public int N_ACTION { get; set; }
+        public string S_ACTION { get; set; }
+        public string S_LOC_CODE { get; set; }
+        public string S_CNTR_CODE { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_AREA_CODE { get; set; }
+        public string S_GRID_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_SERIAL_NO { get; set; }
+        public string D_PRD_DATE { get; set; }
+        public string D_EXP_DATE { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_PACK_TYPE { get; set; }
+        public float F_PACK_QTY { get; set; }
+        public string S_OP_TYPE { get; set; }
+        public string S_SOURCE_TYPE { get; set; }
+        public string S_SOURCE_NO { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_ITEM_ROUTE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Outbound_Detail.cs b/HH.WCS.Mobox3.HangYang/models/TN_Outbound_Detail.cs
new file mode 100644
index 0000000..36af60c
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Outbound_Detail.cs
@@ -0,0 +1,29 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    using System.Collections.Generic;
+    
+    public  class TN_Outbound_Detail : BaseModel
+    {
+      
+        
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_SERIAL_NO { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_ITEM_ROUTE { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public string S_OUT_NO { get; set; }
+        public int N_ROW_NO { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Outbound_Order.cs b/HH.WCS.Mobox3.HangYang/models/TN_Outbound_Order.cs
new file mode 100644
index 0000000..674ae0d
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Outbound_Order.cs
@@ -0,0 +1,22 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    public  class TN_Outbound_Order : BaseModel
+    {
+       
+        
+        public string S_NO { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_SHIPPING_TYPE { get; set; }
+        public string D_OP_DATE { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_BS_NO { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public string S_SHIPPING_NO { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Purchase_Detail.cs b/HH.WCS.Mobox3.HangYang/models/TN_Purchase_Detail.cs
new file mode 100644
index 0000000..cca8b43
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Purchase_Detail.cs
@@ -0,0 +1,21 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    public  class TN_Purchase_Detail : BaseModel
+    {
+       
+        
+        public string S_PO_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_UOM { get; set; }
+        public float F_QTY { get; set; }
+        public int N_ROW_NO { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Purchase_Order.cs b/HH.WCS.Mobox3.HangYang/models/TN_Purchase_Order.cs
new file mode 100644
index 0000000..4c92951
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Purchase_Order.cs
@@ -0,0 +1,18 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    public  class TN_Purchase_Order : BaseModel
+    {
+       
+        
+        public string S_NO { get; set; }
+        public string D_ARRIVAL { get; set; }
+        public string S_SUPPLIER_NO { get; set; }
+        public string S_SUPPLIER_NAME { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Receipt_Detail.cs b/HH.WCS.Mobox3.HangYang/models/TN_Receipt_Detail.cs
new file mode 100644
index 0000000..42a96c7
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Receipt_Detail.cs
@@ -0,0 +1,36 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Receipt_Detail : BaseModel
+    {
+      
+        
+        public int N_ROW_NO { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_SERIAL_NO { get; set; }
+        public string D_PRD_DATE { get; set; }
+        public string D_EXP_DATE { get; set; }
+        public string S_NOTE { get; set; }
+        public float F_QTY { get; set; }
+        public string S_UOM { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public float F_ACC_PUT_QTY { get; set; }
+        public float F_ACC_UNQ_QTY { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public float F_ACC_C_QTY { get; set; }
+        public string S_RECEIPT_NO { get; set; }
+        public string S_ITEM_ROUTE { get; set; }
+        public string S_WU { get; set; }
+        public float F_NET_WEIGHT { get; set; }
+        public float F_GROSS_WEIGHT { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Receipt_Order.cs b/HH.WCS.Mobox3.HangYang/models/TN_Receipt_Order.cs
new file mode 100644
index 0000000..8f7ad9e
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Receipt_Order.cs
@@ -0,0 +1,32 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Receipt_Order : BaseModel
+    {
+      
+        
+        public string S_NO { get; set; }
+        public string S_ASN_NO { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string S_SUPPLIER_NO { get; set; }
+        public string S_SUPPLIER_NAME { get; set; }
+        public string S_END_USER { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public string S_DELIVERY_NO { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_AUDIT_INFO { get; set; }
+        public string S_AUDIT_RESULT { get; set; }
+        public string S_AREA_CODE { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_BS_NO { get; set; }
+        public string C_INSPECTION { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public int N_B_STATE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Supplier.cs b/HH.WCS.Mobox3.HangYang/models/TN_Supplier.cs
new file mode 100644
index 0000000..a87ca36
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Supplier.cs
@@ -0,0 +1,28 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Supplier : BaseModel
+    {
+       
+        
+        public string S_NO { get; set; }
+        public string S_NAME { get; set; }
+        public string S_TYPE { get; set; }
+        public string C_UNINSPECTED { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_CONTACT_PERSON { get; set; }
+        public string S_TEL { get; set; }
+        public string S_PHONE { get; set; }
+        public string S_EMAIL { get; set; }
+        public string S_PROVINCE { get; set; }
+        public string S_CITY { get; set; }
+        public string S_ZONE { get; set; }
+        public string S_ADDRESS { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_WMS_Const.cs b/HH.WCS.Mobox3.HangYang/models/TN_WMS_Const.cs
new file mode 100644
index 0000000..879cb19
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_WMS_Const.cs
@@ -0,0 +1,19 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang {
+
+    public class TN_WMS_Const : BaseModel
+    {
+        
+        
+        public string S_NAME { get; set; }
+        public string S_VALUE { get; set; }
+        public string S_GROUP { get; set; }
+        public string C_SYS { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_STATE_PRE { get; set; }
+       
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TN_Warehouse.cs b/HH.WCS.Mobox3.HangYang/models/TN_Warehouse.cs
new file mode 100644
index 0000000..a5b81e1
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TN_Warehouse.cs
@@ -0,0 +1,21 @@
+using HH.WCS.HangYang.models;
+using System;
+
+namespace HH.WCS.HangYang
+{
+
+    public  class TN_Warehouse : BaseModel
+    {
+       
+        
+        public string S_CODE { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_EXT_DATA { get; set; }
+        public string S_NAME { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string C_IN_INSPECTION { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/TaskAction.cs b/HH.WCS.Mobox3.HangYang/models/TaskAction.cs
new file mode 100644
index 0000000..361df24
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/TaskAction.cs
@@ -0,0 +1,23 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang
+{
+    [SugarTable("TN_Task_Action")]
+    public  class TaskAction : BaseModel
+    {
+      
+        
+        public string S_EQ_TYPE { get; set; }
+        public string S_DATA { get; set; }
+        public string S_ACTION { get; set; }
+        public string S_TASK_CODE { get; set; }
+        public string S_EQ_CODE { get; set; }
+        public string S_VALUE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+        
+        public int N_ACTION_CODE { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/WCSTask.cs b/HH.WCS.Mobox3.HangYang/models/WCSTask.cs
new file mode 100644
index 0000000..497d54a
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/WCSTask.cs
@@ -0,0 +1,84 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+
+    [SugarTable("TN_Task")]
+    public class WCSTask : BaseModel {
+
+
+        public string S_DATA { get; set; }
+        public int N_SORT_NO { get; set; }
+        public string S_START_AREA { get; set; }
+        public string S_END_AREA { get; set; }
+        public string S_START_LOC { get; set; }
+        public string S_END_LOC { get; set; }
+        public string S_NOTE { get; set; }
+        public DateTime? T_START_TIME { get; set; }
+        public DateTime? T_END_TIME { get; set; }
+        public string S_EQ_NO { get; set; }
+        public string S_TYPE { get; set; }
+        public string S_B_STATE { get; set; } = "绛夊緟";
+        /// <summary>
+        /// 0绛夊緟	1宸叉帹閫�    2鎵ц    3瀹屾垚    4閿欒
+        /// </summary>
+        public int N_B_STATE { get; set; }
+        public string S_START_WH { get; set; }
+        public string S_END_WH { get; set; }
+        public string S_START_SITE { get; set; }
+        public int S_START_SITE_LAYER { get; set; }
+        public string S_END_SITE { get; set; }
+        public int S_END_SITE_LAYER { get; set; }
+        /// <summary>
+        ///0鏃�1NDC 2澶╃洰 3鍥借嚜 4PLC 5鏉ゥ
+        /// </summary>
+        public int N_SCHEDULE_TYPE { get; set; }
+        public string S_SCHEDULE_TYPE { get; set; }
+        public int N_TYPE { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public int N_PRIORITY { get; set; }
+        public string S_ERR { get; set; }
+        public string S_OP_CODE { get; set; }
+        public string S_CODE { get; set; }
+        public int N_ERR { get; set; }
+        public string S_EQ_TASK_CODE { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+
+        public string S_CNTR_CODE { get; set; }
+        public string S_OP_NAME { get; set; }
+        public string S_WORKSHOP_NO { get; set; }
+        public string S_WORKSHOP_NAME { get; set; }
+        public int N_START_LAYER { get; internal set; }
+        public int N_END_LAYER { get; internal set; }
+        public int N_CNTR_COUNT { get; internal set; }
+
+        internal static string GetSchedule(int scheduleType) {
+            //0鏃�1NDC 2澶╃洰 3鍥借嚜 4杈撻�鏈�5绔嬪簱
+            var scheduleTypeName = "";
+            switch (scheduleType) {
+                case 0: scheduleTypeName = "鏃�; break;
+                case 1: scheduleTypeName = "NDC"; break;
+                case 2: scheduleTypeName = "澶╃洰"; break;
+                case 3: scheduleTypeName = "鍥借嚜"; break;
+                case 4: scheduleTypeName = "PLC"; break;
+                case 5: scheduleTypeName = "鏉ゥ"; break;
+            }
+            return scheduleTypeName;
+        }
+
+        internal static string GetStateStr(int state) {
+            //0绛夊緟	  1宸叉帹閫�    2鎵ц    3瀹屾垚    4閿欒
+            var status = "";
+            switch (state) {
+                case 0: status = "绛夊緟"; break;
+                case 1: status = "宸叉帹閫�; break;
+                case 2: status = "鎵ц"; break;
+                case 3: status = "瀹屾垚"; break;
+                case 4: status = "閿欒"; break;
+            }
+            return status;
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/WHInventory.cs b/HH.WCS.Mobox3.HangYang/models/WHInventory.cs
new file mode 100644
index 0000000..0825991
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/WHInventory.cs
@@ -0,0 +1,28 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+
+    [SugarTable("TN_WH_Inventory")]
+    public class WHInventory : BaseModel {
+
+        public string S_ITEM_CODE { get; set; }
+        public string S_ITEM_NAME { get; set; }
+        public string S_WH_CODE { get; set; } = util.Settings.WHCode;
+        public float F_QTY { get; set; }
+        public string S_ITEM_SPEC { get; set; }
+        public string S_END_USER { get; set; }
+        public string S_ITEM_STATE { get; set; } = "合格";
+        public string S_ITEM_ROUTE { get; set; } = "";
+        /// <summary>
+        /// 分配量
+        /// </summary>
+        public float F_ALLOC_QTY { get; set; }
+        public float F_ORDER_QTY { get; set; }
+        public int N_ITEM_STATE { get; set; }
+        public string S_STATE_PRE { get; set; } = "";
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/WMSTask.cs b/HH.WCS.Mobox3.HangYang/models/WMSTask.cs
new file mode 100644
index 0000000..ed5c7f5
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/WMSTask.cs
@@ -0,0 +1,79 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+    [SugarTable("TN_Operation")]
+    public class WMSTask : BaseModel {
+
+        public string S_CODE { get; set; }
+        public string S_TYPE { get; set; }
+        public string S_NOTE { get; set; }
+        public DateTime? T_START_TIME { get; set; }
+        public DateTime? T_END_TIME { get; set; }
+        public string S_CNTR_CODE { get; set; }
+        /// <summary>
+        /// 0 等待/1 执行/2 完成/3 错误/4 启劢失败 /5 暂停启劢
+        /// </summary>
+        public int N_B_STATE { get; set; }
+        public string S_ERR { get; set; }
+        public string S_EXT_DATA { get; set; }
+        /// <summary>
+        /// 需要根据常量自动转换
+        /// </summary>
+        public string S_B_STATE { get; set; } = "等待";
+        /// <summary>
+        /// 1入库 2出库
+        /// </summary>
+        public int N_TYPE { get; set; }
+        public string S_OP_DEF_NAME { get; set; }
+        /// <summary>
+        /// 应该根据货位查找仓库对应的工厂
+        /// </summary>
+        public string S_FACTORY { get; set; } = util.Settings.FacCode;
+        public int N_PRIORITY { get; set; }
+        public string S_OP_DEF_CODE { get; set; }
+        public string S_START_WH { get; set; }
+        public string S_START_AREA { get; set; }
+        public string S_START_LOC { get; set; }
+        public string S_END_WH { get; set; }
+        public string S_END_AREA { get; set; }
+        public string S_END_LOC { get; set; }
+        public string S_BS_TYPE { get; set; }
+        public string S_BS_NO { get; set; }
+        public string S_STATE_PRE { get; set; }
+        public int N_REVIEW_RESULT { get; set; }
+
+        public int N_LASTE_B_STATE { get; set; }
+        public string C_NEED_SORTING { get; set; } = "N";
+        public int N_FAIL_COUNT { get; set; }
+        public int N_FAIL_MAX { get; set; }
+        public DateTime? T_LAST_FAIL { get; set; }
+
+        /// <summary>
+        /// 0 等待/1 执行/2 完成/3 错误/4 启劢失败 /5 暂停启劢
+        /// </summary>
+        /// <returns></returns>
+        internal static string GetStateStr(int state) {
+            var status = "";
+            switch (state) {
+                case 0: status = "等待"; break;
+                case 1: status = "执行"; break;
+                case 2: status = "完成"; break;
+                case 3: status = "错误"; break;
+                case 4: status = "启动失败"; break;
+                case 5: status = "暂停失败"; break;
+            }
+            return status;
+        }
+
+        internal static string GetTypeStr(int v) {
+            var str = "";
+            switch (v) {
+                case 1: str = "入库"; break;
+                case 2: str = "出库"; break;
+            }
+            return str;
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/Wcsmodel.cs b/HH.WCS.Mobox3.HangYang/models/Wcsmodel.cs
new file mode 100644
index 0000000..c2a0470
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/Wcsmodel.cs
@@ -0,0 +1,21 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    public class Wcsmodel
+    {
+        /// <summary>
+        /// 璐т綅鐮�+        /// </summary>
+        public string loc { get; set; }
+
+        /// <summary>
+        /// 鎵樼洏鐮�+        /// </summary>
+        public string cntrNo { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/Zone.cs b/HH.WCS.Mobox3.HangYang/models/Zone.cs
new file mode 100644
index 0000000..31c28a9
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/Zone.cs
@@ -0,0 +1,48 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+
+namespace HH.WCS.HangYang {
+
+    [SugarTable("TN_Zone")]
+    public class Zone : BaseModel
+    {
+       
+        
+        public string S_NAME { get; set; }
+        public string S_NOTE { get; set; }
+        public string S_WH_CODE { get; set; }=util.Settings.WHCode;
+        public int N_EMPTY_MIN { get; set; }
+        public int N_EMPTY_MAX { get; set; }
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_CODE { get; set; }
+        public string S_AREA_CODE { get; set; }
+        public string S_LOC_RULE { get; set; }
+        public string S_ZONE_CLS_CODE { get; set; }
+        public int N_AVAILABLE_IN { get; set; }
+        public int N_TYPE { get; set; }
+        public string S_TYPE { 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_ITEM_CATEGORY { get; set; }
+        public string S_OWNER_CODE { get; set; }
+        public string S_SUPPLIER_CODE { get; set; }
+        public int N_CONNECT_TYPE { get; set; }
+        public string S_CONNECT_TYPE { get; set; }
+        public int N_LOCK_STATE { get; set; }
+        public string S_LOCK_STATE { get; set; }
+        public string S_OWNER_NAME { get; set; }
+        public string S_SUPPLIER_NAME { get; set; }
+        public int N_STORE_MAX { get; set; }
+        public string S_STATE_PRE { get; set; }
+        
+        public string C_IS_AREA { get; set; }
+        public string S_GROUP { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToMany, nameof(S_CODE), nameof(ZoneLoc.S_LOC_CODE))]
+        public List<ZoneLoc> ZoneLocs { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/ZoneCls.cs b/HH.WCS.Mobox3.HangYang/models/ZoneCls.cs
new file mode 100644
index 0000000..48ad674
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/ZoneCls.cs
@@ -0,0 +1,19 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+
+    [SugarTable("TN_Zone_Cls")]
+    public class ZoneCls : BaseModel
+    {
+        
+        
+        public string S_CODE { get; set; }
+        public string S_NAME { get; set; }
+        public string S_FACTORY { get; set; }=util.Settings.FacCode;
+        public string S_STATE_PRE { get; set; }
+       
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/ZoneLoc.cs b/HH.WCS.Mobox3.HangYang/models/ZoneLoc.cs
new file mode 100644
index 0000000..a27e281
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/ZoneLoc.cs
@@ -0,0 +1,19 @@
+using HH.WCS.HangYang.models;
+using SqlSugar;
+using System;
+
+namespace HH.WCS.HangYang {
+
+    [SugarTable("TN_Zone_Loc")]
+    public class ZoneLoc : BaseModel
+    {
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_LOC_CODE { get; set; }
+        public string S_ZONE_CODE { get; set; }
+        public string S_STATE_PRE { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_LOC_CODE), nameof(Location.S_CODE))]
+        public Location Loc { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/other/ManualTaskSwitch.cs b/HH.WCS.Mobox3.HangYang/models/other/ManualTaskSwitch.cs
new file mode 100644
index 0000000..9f0fb31
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/other/ManualTaskSwitch.cs
@@ -0,0 +1,17 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.models.other {
+    [SugarTable("TN_ManualTaskSwitch")]
+    internal class ManualTaskSwitch : BaseModel {
+        public string Area { get; set; }
+        /// <summary>
+        /// 0琛ㄧず鍙互鑷姩浠庝汉宸ュ嵏璐у尯鍒涘缓浠诲姟鍒板師鏉愭枡瀛樺偍鍖�+        /// </summary>
+        public int State { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs b/HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs
new file mode 100644
index 0000000..2c9b720
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/models/wms/Algorit.cs
@@ -0,0 +1,83 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.models
+{
+    /// <summary>
+    /// 绔嬪簱鍏ュ簱鍙傛暟
+    /// </summary>
+    public class Inbound
+    {
+        /// <summary>
+        /// 搴撳尯
+        /// </summary>
+        public string areaCode { get; set; }
+        /// <summary>
+        /// 宸烽亾
+        /// </summary>
+        public int roadWay { get; set; }
+    }
+
+    /// <summary>
+    /// 绔嬪簱鍑哄簱鍙傛暟
+    /// </summary>
+    public class Outbound
+    {
+
+
+        /// <summary>
+        /// 搴撳尯
+        /// </summary>
+        public string areaCode { get; set; }
+        /// <summary>
+        /// 鎵樼洏鍙�+        /// </summary>
+        public string trayCode { get; set; }
+        /// <summary>
+        /// 鍑哄簱璐т綅鍙�+        /// </summary>
+        public string locCode { get; set; }
+        /// <summary>
+        /// 缁堢偣搴撳尯
+        /// </summary>
+        public string endArea { get; set; }
+        /// <summary>
+        /// 缁堢偣璐т綅
+        /// </summary>
+        public string endBit { get; set; }
+
+        /// <summary>
+        /// 浠诲姟绫诲瀷
+        /// </summary>
+        public string taskType { get; set; }
+        /// <summary>
+        /// 浣滀笟浠诲姟鍙�+        /// </summary>
+        public string opCode { get; set; }
+
+
+
+
+    }
+
+    public class LocationParams
+    {
+        public int Row { get; set; }
+        public int Column { get; set; }
+        public int Layer { get; set; }
+        public int roadWay { get; set; }
+        public string loationCode { get; set; }
+        public int Depth { get; set; } // 0=澶栦晶/鍓嶆繁浣� 1=娣变綅(鍚庢繁浣�
+        public bool IsOccupied { get; set; }
+        public string ItemCode { get; set; }
+        //閿�+        public bool HasOutboundLock { get; set; }
+        //澶栦晶
+        public bool IsOuterPosition { get; set; }
+        //娣变綅
+        public bool IsStorageDepth { get; set; }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/packages.config b/HH.WCS.Mobox3.HangYang/packages.config
new file mode 100644
index 0000000..e921e75
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/packages.config
@@ -0,0 +1,54 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="EasyModbusTCP" version="5.6.0" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.OwinSelfHost" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.30506.0" targetFramework="net461" />
+  <package id="Microsoft.Bcl.AsyncInterfaces" version="8.0.0" targetFramework="net48" />
+  <package id="Microsoft.Extensions.Configuration" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Extensions.Configuration.Abstractions" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Extensions.Configuration.FileExtensions" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Extensions.Configuration.Json" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Extensions.FileProviders.Abstractions" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Extensions.FileProviders.Physical" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Extensions.FileSystemGlobbing" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Extensions.Primitives" version="7.0.0" targetFramework="net461" requireReinstallation="true" />
+  <package id="Microsoft.Owin" version="4.2.2" targetFramework="net461" />
+  <package id="Microsoft.Owin.Host.HttpListener" version="4.2.2" targetFramework="net461" />
+  <package id="Microsoft.Owin.Hosting" version="4.2.2" targetFramework="net461" />
+  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net461" />
+  <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net462" />
+  <package id="NLog" version="5.1.1" targetFramework="net452" requireReinstallation="true" />
+  <package id="Opc.UaFx.Client" version="2.42.0" targetFramework="net462" requireReinstallation="true" />
+  <package id="Oracle.ManagedDataAccess" version="21.15.0" targetFramework="net462" />
+  <package id="Owin" version="1.0" targetFramework="net461" />
+  <package id="Portable.BouncyCastle" version="1.8.6" targetFramework="net462" />
+  <package id="S7netplus" version="0.1.9" targetFramework="net462" />
+  <package id="SqlSugar" version="5.1.3.47" targetFramework="net461" />
+  <package id="Swashbuckle" version="5.6.0" targetFramework="net461" />
+  <package id="Swashbuckle.Core" version="5.6.0" targetFramework="net461" />
+  <package id="System.Buffers" version="4.5.1" targetFramework="net461" />
+  <package id="System.Diagnostics.DiagnosticSource" version="6.0.1" targetFramework="net48" />
+  <package id="System.Formats.Asn1" version="8.0.0" targetFramework="net48" />
+  <package id="System.IO" version="4.3.0" targetFramework="net48" />
+  <package id="System.Memory" version="4.5.5" targetFramework="net461" />
+  <package id="System.Net.Http" version="4.3.4" targetFramework="net48" />
+  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net461" />
+  <package id="System.Runtime" version="4.3.0" targetFramework="net48" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net461" />
+  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net452" />
+  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net462" requireReinstallation="true" />
+  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net462" />
+  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net462" />
+  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net462" />
+  <package id="System.ServiceModel.Primitives" version="4.5.3" targetFramework="net462" />
+  <package id="System.Text.Encodings.Web" version="8.0.0" targetFramework="net48" />
+  <package id="System.Text.Json" version="8.0.3" targetFramework="net48" />
+  <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net461" />
+  <package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
+  <package id="Topshelf" version="4.3.0" targetFramework="net452" />
+  <package id="Topshelf.NLog" version="4.3.0" targetFramework="net452" />
+  <package id="WebActivatorEx" version="2.0" targetFramework="net461" />
+</packages>
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HangYang/process/DeviceProcess.cs b/HH.WCS.Mobox3.HangYang/process/DeviceProcess.cs
new file mode 100644
index 0000000..7e8a5ca
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/process/DeviceProcess.cs
@@ -0,0 +1,26 @@
+锘縰sing HH.WCS.HangYang.api;
+using HH.WCS.HangYang.device;
+using HH.WCS.HangYang.dispatch;
+using HH.WCS.HangYang.util;
+using HH.WCS.HangYang.wms;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using static HH.WCS.HangYang.LISTA.process.HttpModel;
+
+namespace HH.WCS.HangYang.process
+{
+    /// <summary>
+    /// 璁惧淇″彿澶勭悊锛屼富瑕佹槸tcp淇″彿锛屾垜浠仛server琚姩鎺ユ敹淇″彿鏉ュ鐞嗭紝鏍规嵁椤圭洰瀹氬埗鐨�+    /// </summary>
+    internal class DeviceProcess
+    {
+        internal static void Analysis(string data, string ip)
+        {
+            
+        }
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/process/HttpModel.cs b/HH.WCS.Mobox3.HangYang/process/HttpModel.cs
new file mode 100644
index 0000000..b377cf1
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/process/HttpModel.cs
@@ -0,0 +1,173 @@
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.LISTA.process
+{
+    public class HttpModel
+    {
+        /// <summary>
+        /// 浠诲姟涓婃姤
+        /// </summary>
+        public class Reportback
+        {
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string taskNum { get; set; }
+
+            /// <summary>
+            /// 鍗曞彿
+            /// </summary>
+            public string orderNum { get; set; }
+            /// <summary>
+            /// 浠诲姟鐘舵�
+            /// </summary>
+            public int taskStatus { get; set; }
+        }
+        /// <summary>
+        /// 瀹夊叏璇锋眰
+        /// </summary>
+        public class TaskAccess
+        {
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string taskNum { get; set; }
+            /// <summary>
+            /// 鍗曞彿
+            /// </summary>
+            public string orderNum { get; set; }
+            /// <summary>
+            /// 鐐逛綅
+            /// </summary>
+            public string station { get; set; }
+            /// <summary>
+            /// 绫诲瀷
+            /// </summary>
+            public int type { get; set; }
+            /// <summary>
+            /// 浠诲姟鐘舵�
+            /// </summary>
+            public int taskStatus { get; set; }
+        }
+        /// <summary>
+        /// 绌烘墭杩斿洖
+        /// </summary>
+        public class Traystacker
+        {
+            /// <summary>
+            /// 璐т綅缂栫爜锛岃捣鐐逛綅缃紪鐮�+            /// </summary>
+            public string LocationCode { get; set; }
+
+            /// <summary>
+            /// 鐗╂枡鍙�+            /// </summary>
+            public string PartNumber { get; set; }
+
+            /// <summary>
+            /// 鏁伴噺
+            /// </summary>
+            public int Qty { get; set; }
+        }
+
+     
+
+        /// <summary>
+        /// mes浠诲姟鍥炴姤
+        /// </summary>
+        public partial class StatusArrive
+        {
+            /// <summary>
+            /// 搴撲綅缂栧彿
+            /// </summary>
+            [JsonProperty("locationNum")]
+            public string LocationNum { get; set; }
+
+            /// <summary>
+            /// 鍙栨秷淇℃伅
+            /// </summary>
+            [JsonProperty("message")]
+            public string Message { get; set; }
+
+            /// <summary>
+            /// 鐘舵�
+            /// </summary>
+            [JsonProperty("status")]
+            public string Status { get; set; }
+
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            [JsonProperty("taskNumber")]
+            public string TaskNumber { get; set; }
+
+            /// <summary>
+            /// 鐘舵�鍙樻洿鏃堕棿
+            /// </summary>
+            [JsonProperty("time")]
+            public string Time { get; set; }
+        }
+
+        public partial class iteminfoArrive
+        {
+            /// <summary>
+            /// 鍒拌揣鏃堕棿
+            /// </summary>
+            [JsonProperty("arricalTime")]
+            public string ArricalTime { get; set; }
+
+            /// <summary>
+            /// 搴撲綅缂栧彿
+            /// </summary>
+            [JsonProperty("locationNum")]
+            public string LocationNum { get; set; }
+
+            [JsonProperty("lotList")]
+            public LotList[] LotList { get; set; }
+
+            /// <summary>
+            /// 鐗╂枡鎻忚堪
+            /// </summary>
+            [JsonProperty("partDesc")]
+            public string PartDesc { get; set; }
+
+            /// <summary>
+            /// 鐗╂枡缂栧彿
+            /// </summary>
+            [JsonProperty("partNumber")]
+            public string PartNumber { get; set; }
+
+            /// <summary>
+            /// 宸ヨ缂栧彿
+            /// </summary>
+            [JsonProperty("rfid")]
+            public string Rfid { get; set; }
+
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            [JsonProperty("taskNumber")]
+            public string TaskNumber { get; set; }
+        }
+
+        public partial class LotList
+        {
+            /// <summary>
+            /// 鐗╂枡鎵规淇℃伅
+            /// </summary>
+            [JsonProperty("lotNumber")]
+            public string LotNumber { get; set; }
+
+            /// <summary>
+            /// 閲嶉噺
+            /// </summary>
+            [JsonProperty("weight")]
+            public double? Weight { get; set; }
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
new file mode 100644
index 0000000..2cf2ffd
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
@@ -0,0 +1,1196 @@
+锘縰sing HH.WCS.HangYang.api;
+using HH.WCS.HangYang.core;
+using HH.WCS.HangYang.dispatch;
+using HH.WCS.HangYang.LISTA.models;
+using HH.WCS.HangYang.LISTA.process;
+using HH.WCS.HangYang.util;
+using HH.WCS.HangYang.wms;
+using Newtonsoft.Json;
+using NLog.Fluent;
+using Opc.Ua;
+using SqlSugar;
+using Swashbuckle.Swagger;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Security.Cryptography;
+using System.Threading.Tasks;
+using static HH.WCS.HangYang.LISTA.process.HttpModel;
+using static HH.WCS.HangYang.wms.WMSHelper;
+using static System.Runtime.CompilerServices.RuntimeHelpers;
+
+namespace HH.WCS.HangYang.process
+{
+    internal class TaskProcess
+    {
+        #region 浠诲姟鐩稿叧
+        //--------------------------------------------------浠诲姟鐩稿叧--------------------------------------------------
+        /// <summary>
+        /// 鍙栬揣鍗歌揣瀹屾垚锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="v"></param>
+        internal static void CacheBitUpdate(WCSTask mst, bool load)
+        {
+            var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
+            if (load)
+            {
+                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
+            {
+
+                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(),mst.S_NOTE);
+            }
+
+        }
+
+        /// <summary>
+        /// 浠诲姟鍙栨秷锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static void CacheBitCancelUpdate(WCSTask 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="task"></param>
+        /// <returns></returns>
+        internal static bool Intercept(WCSTask mst)
+        {
+            var result = false;
+           
+            return result;
+        }
+
+        /// <summary>
+        /// 浠诲姟鐘舵�鏇存柊澶勭悊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="state"></param>
+        internal static void OperateStatus(WCSTask mst, int state)
+        {
+            if (state == 4)
+            {
+                CacheBitUpdate(mst, true);
+            }
+            if (state == 6)//鍗歌揣瀹屾垚
+            {
+                CacheBitUpdate(mst, false);
+            }
+            if (state == 7)
+            {
+                CacheBitCancelUpdate(mst);
+            }
+        }
+
+        /// <summary>
+        /// 鎺ㄩ�浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static bool SendTask(WCSTask 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)
+            {
+                start = LocationHelper.GetAgvSite(mst.S_START_LOC);
+                end = LocationHelper.GetAgvSite(mst.S_END_LOC);
+
+
+                Console.WriteLine($"SendTask {mst.S_CODE}");
+                Console.WriteLine("start=" + start);
+                Console.WriteLine("end= " + end);
+                var dic = new Dictionary<string, string>();
+                dic.Add("Pri", mst.N_PRIORITY.ToString());
+                dic.Add("From", start.ToString());
+                dic.Add("To", end.ToString());
+                dic.Add("No", mst.S_CODE.Trim());// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", "");
+                var res = NDC.AddNewOrder(5, dic);
+                if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009))
+                {
+                    //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
+                    mst.N_B_STATE = 1;
+                    WCSHelper.UpdateStatus(mst);
+                    result = true;
+                }
+            }
+            //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);
+            //    }
+            //}
+            //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);
+
+            //    }
+            //}
+
+            //}
+            return result;
+        }
+
+        /// <summary>
+        /// 鍥借嚜鎺ㄩ�浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static bool SendGZTask(WCSTask mst)
+        {
+            var result = false;
+            var taskState = mst.S_B_STATE.Trim();
+            if (taskState == "绛夊緟")
+            {
+                Console.WriteLine($"浠诲姟mst {JsonConvert.SerializeObject(mst)}");
+                LogHelper.Info($"浠诲姟mst {JsonConvert.SerializeObject(mst)}", "浠诲姟");
+                var startLoc = LocationHelper.GetLoc(mst.S_START_LOC);
+                var endLoc = LocationHelper.GetLoc(mst.S_END_LOC);
+                if (startLoc != null && endLoc != null)
+                {
+                    //"parameters": "{\"src\":\"a\",\"dst\":\"b\",\" carcode \":\"aaaaa\",\" orderid \":1}"
+                    //src:璧风偣, dst:缁堢偣锛宑arcode:杞﹀彿锛宱rderid:
+                    string src = $"\"src\":\"{startLoc.S_AGV_SITE}\","; ;
+                    string dst = $"\"dst\":\"{endLoc.S_AGV_SITE}\"";
+                    string parmeS = "{";
+                    string parmeD = "}";
+                    string parme = parmeS + src + dst + parmeD;
+                    LogHelper.Info($"鎺ㄩ�浠诲姟鍙傛暟{parme}", "浠诲姟");
+                    var res = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, parme);
+                    if (res > 0)
+                    {
+                        //鏇存柊浠诲姟鐘舵�
+                        mst.N_B_STATE = 1;
+                        mst.S_EQ_TASK_CODE = res.ToString();
+                        WCSHelper.UpdateStatus(mst);
+                        WCSHelper.UpdateEQNo(mst);
+
+                        ////鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔$姸鎬�+                        //TaskHelper.UpdateStatus(mst, "宸叉帹閫�);
+                        ////鎺ㄩ�鎴愬姛锛屼慨鏀瑰浗鑷狪D
+                        //TaskHelper.UpdateGzId(mst, res);
+                        LogHelper.Info($"浠诲姟mst {mst.S_CODE}鎺ㄩ�鎴愬姛", "浠诲姟");
+                        result = true;
+                    }
+                }
+
+
+            }
+            else { result = true; }
+            return result;
+        }
+
+
+        /// <summary>
+        /// 鍒涘缓鎼繍浠诲姟
+        /// </summary>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="taskType"></param>
+        /// <param name="cntrs"></param>
+        /// <param name="startLayer"></param>
+        /// <param name="endLayer"></param>
+        /// <param name="trayCarryCount"></param>
+        /// <param name="priority"></param>
+        /// <returns></returns>
+        public static bool CreateTransport(string start, string end, string taskType, List<string> cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1)
+        {
+            var result = false;
+            //鎵规鍙峰瓨鎵樼洏鍙凤紝1~3涓墭鐩�+            var trayCodes = string.Join(",", cntrs);
+            var taskNo = DateTime.Now.Ticks.ToString();
+
+
+            var res = WCSHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer);
+            if (res)
+            {
+                result = true;
+                //浠诲姟鍒涘缓鎴愬姛锛岃捣鐐硅揣浣嶅嚭搴撻攣瀹氾紝缁堢偣璐т綅鍏ュ簱閿佸畾
+                LocationHelper.LockLoc(start, 2);
+                LocationHelper.LockLoc(end, 1);
+            }
+            return result;
+        }
+
+
+        public static bool CreateTransport(string start, string end, string taskType, List<string> cntrs, int priority = 1)
+        {
+            var result = false;
+            //鎵规鍙峰瓨鎵樼洏鍙凤紝1~3涓墭鐩�+            var trayCodes = string.Join(",", cntrs);
+            var taskNo = DateTime.Now.Ticks.ToString();
+
+
+            var res = WCSHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, 1, 1, 1);
+            if (res)
+            {
+                result = true;
+                LocationHelper.LockLoc(start, 2);
+                LocationHelper.LockLoc(end, 1);
+
+            }
+            return result;
+        }
+
+        internal static Result cancelTask1(cancleTaskParme model)
+        {
+            var result = new Result();
+            LogHelper.Info("cancelTask1鍙栨秷浠诲姟淇℃伅锛� + JsonConvert.SerializeObject(model), "API");
+            if (model == null)
+            {
+
+                result.success = false;
+                result.errMsg = "鍙傛暟涓簄ull";
+                result.errCode = 1;
+                return result;
+            }
+            var task = WCSHelper.GetTask(model.taskNo);
+            if (task != null)
+            {
+                if (task.S_B_STATE.Trim() == "鏈墽琛�)
+                {
+                    //鏈墽琛岀洿鎺ヤ慨鏀圭姸鎬佷负鍙栨秷
+                    TaskProcess.OperateStatus(task, 7);
+                    WCSHelper.UpdateStatus(task, "鍙栨秷");
+                    result.success = true;
+                    result.errMsg = "鍙栨秷浠诲姟鎴愬姛";
+                    result.errCode = 0;
+                }
+                else if (task.S_B_STATE.Trim() != "鍙栨秷" && task.S_B_STATE.Trim() != "瀹屾垚")
+                {
+
+                    if (GZRobot.CancelOrder(int.Parse(task.S_EQ_TASK_CODE)))
+                    {
+                        TaskProcess.OperateStatus(task, 7);
+                        WCSHelper.Fail(task);
+                        result.success = true;
+                        result.errMsg = "鍥借嚜鍙栨秷浠诲姟鎴愬姛";
+                        result.errCode = 0;
+                    }
+                    else
+                    {
+                        result.success = false;
+                        result.errMsg = "鍥借嚜鍙栨秷浠诲姟澶辫触";
+                        result.errCode = 1;
+                    }
+
+                }
+                else
+                {
+                    result.success = false;
+                    result.errMsg = "浠诲姟宸茬粡缁撴潫";
+                    result.errCode = 1;
+                }
+            }
+            else
+            {
+                result.success = false;
+                result.errMsg = "浠诲姟涓嶅瓨鍦�;
+                result.errCode = 1;
+            }
+            LogHelper.Info("cancelTask1鍙栨秷浠诲姟杩斿洖缁撴灉锛� + JsonConvert.SerializeObject(result), "API");
+            return result;
+        }
+
+
+        #endregion
+
+        #region 鏉哀
+        /// <summary>
+        /// 鏉哀鍒涘缓鎼繍浠诲姟
+        /// </summary>
+        /// <param name="start">璧风偣</param>
+        /// <param name="end">缁堢偣</param>
+        /// <param name="taskType">浠诲姟绫诲瀷</param>
+        /// <param name="cntrs">鎵樼洏鍙�/param>
+        /// <param name="priority">浼樺厛绾�/param>
+        /// <param name="taskNo">浣滀笟缂栫爜</param>
+        /// <returns></returns>
+        public static bool HYCreateTransport(string start, string end, string taskType, string cntrs, string taskNo = "", int priority = 1)
+        {
+            var result = false;
+            //鎵规鍙峰瓨鎵樼洏鍙凤紝1~3涓墭鐩�+            var trayCodes = string.Join(",", cntrs);
+            //var taskNo = DateTime.Now.Ticks.ToString();
+
+
+            var res = WCSHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes);
+            if (res)
+            {
+                result = true;
+                //浠诲姟鍒涘缓鎴愬姛锛岃捣鐐硅揣浣嶅嚭搴撻攣瀹氾紝缁堢偣璐т綅鍏ュ簱閿佸畾
+                LocationHelper.LockLoc(start, 2);
+                LocationHelper.LockLoc(end, 1);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鍏ュ簱鍗曟柊澧�+        /// </summary>
+        /// <param name="model">鍏ュ簱鍗�/param>
+        /// <returns></returns>
+        public static Result GetMaterialData(List<MES_Material> model)
+        {
+            Result result = new Result() { success = false, };
+            try
+            {
+                if (model == null)
+                {
+                    result.errMsg = "鍏ュ簱鍗曚笉鍙负绌哄�锛�;
+                    return result;
+                }
+
+                //foreach (var item in model.InOrderDetail)
+                //{
+                //    var itemType = WMSHelper.GetItemType(item.S_ITEM_CODE);
+                //    if (itemType == null)
+                //    {
+                //        result.errMsg = $"鏈煡璇㈠埌鐗╂枡{item.S_ITEM_CODE}鐨勭墿鏂欏睘鎬э紒";
+                //        return result;
+                //    }
+                //    item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE;
+                //}
+
+                //var groupedInOrders = model.InOrderDetail
+                //                      .GroupBy(detail => detail.S_EXT_ATTR1) // 鎸夌墿鏂欏睘鎬у垎缁�+                //                      .Select((group, index) => new InOrder
+                //                      {
+                //                          S_NO = $"{model.S_BS_NO}_{index + 1}", // 鎷兼帴鏉ユ簮鍗曞彿
+                //                          S_BS_NO = model.S_BS_NO,
+                //                          S_OP_TYPE = model.S_OP_TYPE,
+                //                          S_BS_TYPE = model.S_BS_TYPE,
+                //                          S_NOTE = model.S_NOTE,
+                //                          InOrderDetail = group.Select(detail =>
+                //                          {
+                //                              // 淇敼 group 涓殑 S_IO_NO 瀛楁涓�S_NO 鐨勫�
+                //                              detail.S_IO_NO = $"{model.S_BS_NO}_{index + 1}";
+                //                              detail.S_BS_NO = model.S_BS_NO;
+                //                              return detail;
+                //                          }).ToList() // 鍒嗙粍鍚庣殑鏄庣粏
+                //                      })
+                //                      .ToList();
+                //var res = WMSHelper.CreateOrderIn(groupedInOrders);
+                //if (res)
+                //{
+                //    result.success = true;
+                //}
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.success = false;
+                result.errMsg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"GetInboundOrder鍏ュ簱鍗曟柊澧炲嚭鐜伴敊璇紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+
+        }
+
+        /// <summary>
+        /// 鍏ュ簱鍗曟柊澧�+        /// </summary>
+        /// <param name="model">鍏ュ簱鍗�/param>
+        /// <returns></returns>
+        public static Result GetInboundOrder(InOrder model)
+        {
+            Result result = new Result() { success = false, };
+            try
+            {
+                if (model == null || !model.InOrderDetail.Any())
+                {
+                    result.errMsg = "鍏ュ簱鍗曚笉鍙负绌哄�锛�;
+                    return result;
+                }
+
+                foreach (var item in model.InOrderDetail)
+                {
+                    var itemType = WMSHelper.GetItemType(item.S_ITEM_CODE);
+                    if (itemType == null)
+                    {
+                        result.errMsg = $"鏈煡璇㈠埌鐗╂枡{item.S_ITEM_CODE}鐨勭墿鏂欏睘鎬э紒";
+                        return result;
+                    }
+                    item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE;
+                }
+
+                var groupedInOrders = model.InOrderDetail
+                                      .GroupBy(detail => detail.S_EXT_ATTR1) // 鎸夌墿鏂欏睘鎬у垎缁�+                                      .Select((group, index) => new InOrder
+                                      {
+                                          S_NO = $"{model.S_BS_NO}_{index + 1}", // 鎷兼帴鏉ユ簮鍗曞彿
+                                          S_BS_NO = model.S_BS_NO,
+                                          S_OP_TYPE = model.S_OP_TYPE,
+                                          S_BS_TYPE = model.S_BS_TYPE,
+                                          S_NOTE = model.S_NOTE,
+                                          InOrderDetail = group.Select(detail =>
+                                          {
+                                              // 淇敼 group 涓殑 S_IO_NO 瀛楁涓�S_NO 鐨勫�
+                                              detail.S_IO_NO = $"{model.S_BS_NO}_{index + 1}";
+                                              detail.S_BS_NO = model.S_BS_NO;
+                                              return detail;
+                                          }).ToList() // 鍒嗙粍鍚庣殑鏄庣粏
+                                      })
+                                      .ToList();
+                var res = WMSHelper.CreateOrderIn(groupedInOrders);
+                if (res)
+                {
+                    result.success = true;
+                }
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.success = false;
+                result.errMsg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"GetInboundOrder鍏ュ簱鍗曟柊澧炲嚭鐜伴敊璇紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+
+        }
+
+        /// <summary>
+        /// 鍑哄簱鍗曟柊澧�+        /// </summary>
+        /// <param name="model">鍏ュ簱鍗�/param>
+        /// <returns></returns>
+        public static Result GetOutboundOrder(OutOrder model)
+        {
+            Result result = new Result() { success = false, };
+            try
+            {
+                if (model == null || !model.OutOrderDetail.Any())
+                {
+                    result.errMsg = "鍑哄簱鍗曚笉鍙负绌哄�锛�;
+                    return result;
+                }
+
+                foreach (var item in model.OutOrderDetail)
+                {
+                    var itemType = WMSHelper.GetItemType(item.S_ITEM_CODE);
+                    if (itemType == null)
+                    {
+                        result.errMsg = $"鏈煡璇㈠埌鐗╂枡{item.S_ITEM_CODE}鐨勭墿鏂欏睘鎬э紒";
+                        return result;
+                    }
+                    item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE;
+                }
+
+                var groupedInOrders = model.OutOrderDetail
+                                      .GroupBy(detail => detail.S_EXT_ATTR1) // 鎸夌墿鏂欏睘鎬у垎缁�+                                      .Select((group, index) => new OutOrder
+                                      {
+                                          S_NO = $"{model.S_BS_NO}_{index + 1}", // 鎷兼帴鏉ユ簮鍗曞彿
+                                          S_BS_NO = model.S_BS_NO,
+                                          S_OP_TYPE = model.S_OP_TYPE,
+                                          S_NOTE = model.S_NOTE,
+                                          OutOrderDetail = group.Select(detail =>
+                                          {
+                                              // 淇敼 group 涓殑 S_IO_NO 瀛楁涓�S_NO 鐨勫�
+                                              detail.S_OO_NO = $"{model.S_BS_NO}_{index + 1}";
+                                              detail.S_BS_NO = model.S_BS_NO;
+                                              return detail;
+                                          }).ToList() // 鍒嗙粍鍚庣殑鏄庣粏
+                                      })
+                                      .ToList();
+                var res = WMSHelper.CreateOrderOut(groupedInOrders);
+                if (res)
+                {
+                    result.success = true;
+                }
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.success = false;
+                result.errMsg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"GetInboundOrder鍏ュ簱鍗曟柊澧炲嚭鐜伴敊璇紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇浣滀笟鍒涘缓鍏ュ簱浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <returns></returns>
+        internal static bool CreateInTask(WMSTask mst)
+        {
+            try
+            {
+                var result = false;
+                var taskState = mst.S_B_STATE.Trim();
+                if (taskState == "绛夊緟")
+                {
+                    if (!string.IsNullOrEmpty(mst.S_START_LOC))
+                    {
+                        //鏉哀鎵�湁搴撳尯
+                        var reservoirs = Settings.ReservoirAreas.ToList();
+                        if (!reservoirs.Any() || reservoirs == null)
+                        {
+                            LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鏉哀鐨勫簱鍖猴紒", "鏉哀");
+                            return false;
+                        }
+                        if (mst.S_TYPE == "鎵樼洏杞繍")
+                        {
+                            var lxAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "鏂欑鍏ュ簱缂撳瓨浣�).FirstOrDefault().areaCode);
+                            if (lxAnyLoc.Any())
+                            {
+
+                                var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, lxAnyLoc.FirstOrDefault().S_CODE, "鏂欑缂撳瓨浣嶅叆搴�, mst.S_CNTR_CODE, mst.S_CODE);
+                                if (!res)
+                                {
+                                    LogHelper.Info("鏂欑缂撳瓨浣嶅叆搴撲换鍔″垱寤哄け璐ワ紒", "鏉哀");
+                                    return false;
+                                }
+                                WMSHelper.UpdateStatus(mst, 1);
+                            }
+                            else
+                            {
+                                var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "鍏ュ簱缂撳瓨鍖�).FirstOrDefault().areaCode);
+                                if (rkAnyLoc.Any())
+                                {
+                                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "鏂欑鐮佺洏缂撳瓨鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                    if (!res)
+                                    {
+                                        LogHelper.Info("鐮佺洏缂撳瓨鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                        return false;
+                                    }
+                                    WMSHelper.UpdateStatus(mst, 1);
+                                    //鏍囪涓哄悎鎵�+                                    ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "鏂欑鍚堟墭");
+                                }
+                                else
+                                {
+                                    LogHelper.Info("鍏ュ簱缂撳瓨鍖烘病鏈夌┖璐т綅锛�, "鏉哀");
+                                    return false;
+                                }
+                            }
+                        }
+                        if (mst.S_TYPE == "鎵樼洏鍏ュ簱")
+                        {
+                            //1.鏌ヨ涓嬩笅搴撻噷闈㈡槸鍚︽湁瑕佸悎鎵樼殑鎵樼洏
+                            var locMerge = WMSHelper.GetLocMerge(mst.S_CNTR_CODE);
+                            if (locMerge != null)
+                            {
+                                //锛�.1锛夊鏋滄湁瑕佸悎鎵樼殑鎵樼洏灏卞幓鍒ゆ柇涓�笅鍚堟墭宸ヤ綅鏄惁涓虹┖
+                                var anyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "鍚堟墭鍖�).FirstOrDefault().areaCode);
+                                if (anyLoc.Any())
+                                {
+                                    
+                                    //鐢熸垚涓�潯鍑哄簱鐨勪换鍔�+                                    var relevancys = Settings.Relevancys.Where(s => s.InLoc == anyLoc.FirstOrDefault().S_CODE).FirstOrDefault();
+                                    if (relevancys == null)
+                                    {
+                                        LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍚堟墭鍏ュ簱浣嶅搴旂殑鍑哄簱浣嶏紒", "鏉哀");
+                                        return false;
+                                    }
+                                    //鐢熸垚鍒板悎鎵樺尯鐨勪换鍔�+                                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鐮佺洏鍚堟墭鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                    if (!res)
+                                    {
+                                        LogHelper.Info("鐮佺洏鍚堟墭鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                        return false;
+                                    }
+                                    res = TaskProcess.HYCreateTransport(locMerge.S_LOC_CODE, relevancys.OutLoc, "鐮佺洏鍚堟墭鍑哄簱", locMerge.S_CNTR_CODE, mst.S_CODE);
+                                    if (!res)
+                                    {
+                                        LogHelper.Info("鐮佺洏鍚堟墭鍑哄簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                        return false;
+                                    }
+                                    //锛�.2锛夊鏋滃悎鎵樺伐浣嶄负绌哄氨鐩存帴鍚堟墭鍒板悎鎵樺伐浣嶉噷闈紝鍚屾椂鐢熸垚涓�釜鍑哄簱浠诲姟鎶婅鍚堟墭鐨勬墭鐩樺嚭鍑烘潵锛堟爣璁颁负瑕佸悎鎵橈級
+                                    ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "鍚堟墭");
+
+                                    WMSHelper.UpdateStatus(mst, 1);
+                                }
+                                else
+                                {
+                                    //锛�.3锛夊鏋滃悎鎵樺伐浣嶄笉涓虹┖灏卞幓鍏ュ簱缂撳瓨鍖猴紙鏍囪涓鸿鍚堟墭锛�+                                    //鐢熸垚鍒板叆搴撶紦瀛樺尯鐨勪换鍔�+                                    var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "鍏ュ簱缂撳瓨鍖�).FirstOrDefault().areaCode);
+                                    if (rkAnyLoc.Any())
+                                    {
+                                        var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "鐮佺洏缂撳瓨鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                        if (!res)
+                                        {
+                                            LogHelper.Info("鐮佺洏缂撳瓨鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                            return false;
+                                        }
+                                        WMSHelper.UpdateStatus(mst, 1);
+                                        //鏍囪涓哄悎鎵�+                                        ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "鍚堟墭");
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info("鍏ュ簱缂撳瓨鍖烘病鏈夌┖璐т綅锛�, "鏉哀");
+                                        return false;
+                                    }
+                                }
+
+                            }
+                            else
+                            {
+                                //2.濡傛灉娌℃湁瑕佸悎鎵樼殑鎵樼洏
+                                var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault();
+                                if (area == null)
+                                {
+                                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀");
+                                    return false;
+                                }
+                                //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+                                var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                                if (anyLoc.Any())
+                                {
+                                    //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鐮佺洏鎺ラ┏鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                    if (!res)
+                                    {
+                                        LogHelper.Info("鐮佺洏鎺ラ┏鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                        return false;
+                                    }
+                                    WMSHelper.UpdateStatus(mst, 1);
+                                }
+                                else
+                                {
+                                    //(2.2)濡傛灉鍏ュ簱鎺ラ┏浣嶄笉涓虹┖锛屽垯鐢熸垚鍒板叆搴撶紦瀛樺尯鐨勪换鍔★紙鏍囪涓轰笉鍚堟墭锛�+                                    //鐢熸垚鍒板叆搴撶紦瀛樺尯鐨勪换鍔�+                                    var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "鍏ュ簱缂撳瓨鍖�).FirstOrDefault().areaCode);
+                                    if (rkAnyLoc.Any())
+                                    {
+                                        var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "鐮佺洏缂撳瓨鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                        if (!res)
+                                        {
+                                            LogHelper.Info("鐮佺洏缂撳瓨鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                            return false;
+                                        }
+                                        WMSHelper.UpdateStatus(mst, 1);
+                                        //鏍囪涓轰笉鍚堟墭
+                                        ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "涓嶅悎鎵�);
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info("鍏ュ簱缂撳瓨鍖烘病鏈夌┖璐т綅锛�, "鏉哀");
+                                        return false;
+                                    }
+
+                                }
+
+                            }
+                        }
+                        if (mst.S_TYPE == "鍚堟墭鍥炲簱")
+                        {
+                            var trayLst = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE);
+                            if (trayLst.Any())
+                            {
+                                //婊℃墭鍥炲簱
+                                var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault();
+                                if (area == null)
+                                {
+                                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀");
+                                    return false;
+                                }
+                                //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+                                var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                                if (anyLoc.Any())
+                                {
+                                    //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鐮佺洏鎺ラ┏鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                    if (!res)
+                                    {
+                                        LogHelper.Info("鐮佺洏鎺ラ┏鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                        return false;
+                                    }
+                                    WMSHelper.UpdateStatus(mst, 1);
+                                }
+                                else
+                                {
+                                    //(2.2)濡傛灉鍏ュ簱鎺ラ┏浣嶄笉涓虹┖锛屽垯鐢熸垚鍒板叆搴撶紦瀛樺尯鐨勪换鍔★紙鏍囪涓轰笉鍚堟墭锛�+                                    //鐢熸垚鍒板叆搴撶紦瀛樺尯鐨勪换鍔�+                                    var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "鍏ュ簱缂撳瓨鍖�).FirstOrDefault().areaCode);
+                                    if (rkAnyLoc.Any())
+                                    {
+                                        var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "鐮佺洏缂撳瓨鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                        if (!res)
+                                        {
+                                            LogHelper.Info("鐮佺洏缂撳瓨鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                            return false;
+                                        }
+                                        WMSHelper.UpdateStatus(mst, 1);
+                                        //鏍囪涓轰笉鍚堟墭
+                                        ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "涓嶅悎鎵�);
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info("鍏ュ簱缂撳瓨鍖烘病鏈夌┖璐т綅锛�, "鏉哀");
+                                        return false;
+                                    }
+
+                                }
+                            }
+                            else
+                            {
+                                //绌烘墭鍥炲簱
+                                var area = reservoirs.Where(s => s.areaName == "浜烘満鎺ラ┏浣�绌烘墭浣�).FirstOrDefault();
+                                if (area == null)
+                                {
+                                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀");
+                                    return false;
+                                }
+                                //(2.1)鍏堟煡璇汉鏈烘帴椹充綅-绌烘墭浣嶆槸鍚︿负绌猴紝濡傛灉涓虹┖鐩存帴鐢熸垚鍒板叆搴撶殑浠诲姟
+                                var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                                if (anyLoc.Any())
+                                {
+                                    //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                                    var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "浜烘満鎺ラ┏鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                    if (!res)
+                                    {
+                                        LogHelper.Info("鐮佺洏鎺ラ┏鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                        return false;
+                                    }
+                                    WMSHelper.UpdateStatus(mst, 1);
+                                }
+                                else
+                                {
+                                    //鐢熸垚鍒板叆搴撶紦瀛樺尯鐨勪换鍔�+                                    var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "鍏ュ簱缂撳瓨鍖�).FirstOrDefault().areaCode);
+                                    if (rkAnyLoc.Any())
+                                    {
+                                        var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "鐮佺洏缂撳瓨鍏ュ簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                        if (!res)
+                                        {
+                                            LogHelper.Info("鐮佺洏缂撳瓨鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                            return false;
+                                        }
+                                        //鏍囪涓轰笉鍚堟墭
+                                        ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "涓嶅悎鎵�);
+                                        WMSHelper.UpdateStatus(mst, 1);
+
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info("鍏ュ簱缂撳瓨鍖烘病鏈夌┖璐т綅锛�, "鏉哀");
+                                        return false;
+                                    }
+                                }
+                            }
+                        }
+                        if (mst.S_TYPE == "鏂欑鍑哄簱")
+                        {
+
+                            //婊℃墭鍥炲簱
+                            var area = reservoirs.Where(s => s.areaName == "鏂欑鐮佺洏鍖�).FirstOrDefault();
+                            if (area == null)
+                            {
+                                LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鏂欑鐮佺洏鍖猴紒", "鏉哀");
+                                return false;
+                            }
+                            //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+                            var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                            if (anyLoc.Any())
+                            {
+                                //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                                var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鏂欑鍑哄簱", mst.S_CNTR_CODE, mst.S_CODE);
+                                if (!res)
+                                {
+                                    LogHelper.Info("鏂欑鍑哄簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                    return false;
+                                }
+                                WMSHelper.UpdateStatus(mst, 1);
+                            }
+                            else
+                            {
+                                LogHelper.Info("鏂欑鐮佺洏鍖烘湭鏈夊彲鐢ㄨ揣浣嶏紒", "鏉哀");
+                            }
+                        }
+                    }
+                }
+                else { result = true; }
+                return result;
+            }
+            catch (Exception ex)
+            {
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"CreateInTask鑾峰彇浣滀笟鍒涘缓鍏ュ簱浠诲姟鍑虹幇閿欒锛侊紒", ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return false;
+            }
+
+        }
+
+        /// <summary>
+        /// 寰幆鍏ュ簱缂撳瓨鍖烘煡璇㈠悎鎵樺伐浣嶅拰鍏ュ簱鎺ラ┏浣嶆槸鍚︽湁绌鸿揣浣嶏紙鍒涘缓浠诲姟锛�+        /// </summary>
+        /// <returns></returns>
+        internal static bool BatchInWork()
+        {
+            try
+            {
+                bool res = false;
+                //鏉哀鎵�湁搴撳尯
+                var reservoirs = Settings.ReservoirAreas.ToList();
+                if (!reservoirs.Any() || reservoirs == null)
+                {
+                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鐨勬澀姘у簱鍖猴紒", "鏉哀");
+                    return false;
+                }
+
+                var rkAnyLoc = reservoirs.Where(s => s.areaName == "鍏ュ簱缂撳瓨鍖�).FirstOrDefault();
+                if (rkAnyLoc == null)
+                {
+                    LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱缂撳瓨鍖猴紒", "鏉哀");
+                    return false;
+                }
+
+                //鍚堟墭閫昏緫
+                var cntrAbouts = ContainerHelper.GetCntrAbouts(rkAnyLoc.areaCode, "鍚堟墭").FirstOrDefault();
+                if (cntrAbouts != null)
+                {
+                    var area = reservoirs.Where(s => s.areaName == "鍚堟墭鍖�).FirstOrDefault();
+                    if (area != null)
+                    {
+                        //1.鏌ヨ鍚堟墭宸ヤ綅鐨勭姸鎬�+                        var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                        if (anyLoc.Any())
+                        {
+                            var list = WMSHelper.GetWmsTaskList("鎵ц", cntrAbouts.S_CNTR_CODE);
+                            if (list == null)
+                            {
+                                LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{cntrAbouts.S_CNTR_CODE}锛�, "鏉哀");
+                                return false;
+                            }
+                            //1.2鍒涘缓鐮佺洏鍚堟墭鍏ュ簱鐨勪换鍔★紝鍚屾椂鐢熸垚涓�釜鐮佺洏鍚堟墭鍑哄簱鐨勪换鍔�+                            //鏌ヨ涓嬭鍑哄簱鍚堟墭鐨勬墭鐩�+                            var locMerge = WMSHelper.GetLocMerge(cntrAbouts.S_CNTR_CODE);
+                            if (locMerge == null)
+                            {
+                                return false;
+                            }
+                           
+                            //鐢熸垚涓�潯鍑哄簱鐨勪换鍔�+                            var relevancys = Settings.Relevancys.Where(s => s.InLoc == anyLoc.FirstOrDefault().S_CODE).FirstOrDefault();
+                            if (relevancys == null)
+                            {
+                                LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍚堟墭鍏ュ簱浣嶅搴旂殑鍑哄簱浣嶏紒", "鏉哀");
+                                return false;
+                            }
+                            //鐢熸垚鍒板悎鎵樺尯鐨勪换鍔�+                            res = TaskProcess.HYCreateTransport(cntrAbouts.S_LOC_CODE, anyLoc.FirstOrDefault().S_CODE, "鐮佺洏鍚堟墭鍏ュ簱", cntrAbouts.S_CNTR_CODE, list.S_CODE);
+                            if (!res)
+                            {
+                                LogHelper.Info("鐮佺洏鍚堟墭鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                return false;
+                            }
+                            res = TaskProcess.HYCreateTransport(locMerge.S_LOC_CODE, relevancys.OutLoc, "鐮佺洏鍚堟墭鍑哄簱", locMerge.S_CNTR_CODE, list.S_CODE);
+                            if (!res)
+                            {
+                                LogHelper.Info("鐮佺洏鍚堟墭鍑哄簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                return false;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍚堟墭鍖猴紒", "鏉哀");
+                        return false;
+                    }
+                }
+                
+                //涓嶅悎鎵橀�杈�+                var noCntrAbouts = ContainerHelper.GetCntrAbouts(rkAnyLoc.areaCode, "涓嶅悎鎵�).FirstOrDefault();
+                if (noCntrAbouts != null)
+                {
+                    //2.鏌ヨ鍏ュ簱鎺ラ┏浣嶇殑鐘舵�
+                    var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault();
+                    if (area != null)
+                    {
+                        var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                        if (anyLoc.Any())
+                        {
+                            var list = WMSHelper.GetWmsTaskList("鎵ц", noCntrAbouts.S_CNTR_CODE);
+                            if (list == null)
+                            {
+                                LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{noCntrAbouts.S_CNTR_CODE}锛�, "鏉哀");
+                                return false;
+                            }
+                            //2.2濡傛灉鍏ュ簱鎺ラ┏浣嶄负绌哄垱寤虹爜鐩樻帴椹冲叆搴撶殑浠诲姟
+                            //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                            res = TaskProcess.HYCreateTransport(noCntrAbouts.S_LOC_CODE, anyLoc.FirstOrDefault().S_CODE, "鐮佺洏鎺ラ┏鍏ュ簱", noCntrAbouts.S_CNTR_CODE,list.S_CODE);
+                            if (!res)
+                            {
+                                LogHelper.Info("鐮佺洏鎺ラ┏鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                return false;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀");
+                        return false;
+                    }
+                }
+
+                //鏂欑鍚堟墭閫昏緫
+                var lxCntrAbouts = ContainerHelper.GetCntrAbouts(rkAnyLoc.areaCode, "鏂欑鍚堟墭").FirstOrDefault();
+                if (lxCntrAbouts != null)
+                {
+                    //2.鏌ヨ鍏ュ簱鎺ラ┏浣嶇殑鐘舵�
+                    var area = reservoirs.Where(s => s.areaName == "鏂欑鍏ュ簱缂撳瓨浣�).FirstOrDefault();
+                    if (area != null)
+                    {
+                        var anyLoc = LocationHelper.GetLocAreaList(area.areaCode);
+                        if (anyLoc.Any())
+                        {
+                            var list = WMSHelper.GetWmsTaskList("鎵ц", lxCntrAbouts.S_CNTR_CODE);
+                            if (list == null)
+                            {
+                                LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{lxCntrAbouts.S_CNTR_CODE}锛�, "鏉哀");
+                                return false;
+                            }
+                            //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+                            res = TaskProcess.HYCreateTransport(lxCntrAbouts.S_LOC_CODE, anyLoc.FirstOrDefault().S_CODE, "鏂欑缂撳瓨鍏ュ簱", lxCntrAbouts.S_CNTR_CODE, list.S_CODE);
+                            if (!res)
+                            {
+                                LogHelper.Info("鏂欑缂撳瓨鍏ュ簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀");
+                                return false;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鏂欑鍏ュ簱缂撳瓨浣嶏紒", "鏉哀");
+                        return false;
+                    }
+                }
+
+                return res;
+            }
+            catch (Exception ex)
+            {
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"BatchInWork寰幆鍏ュ簱缂撳瓨鍖哄嚭鐜伴敊璇紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return false;
+            }
+
+        }
+
+        /// <summary>
+        /// WCS璋冪敤璁惧淇″彿鍙嶉
+        /// </summary>
+        /// <param name="model">璇锋眰鍙傛暟</param>
+        /// <returns></returns>
+        public static async Task<Result> notifyDeviceSignal(List<Wcsmodel> model)
+        {
+            Result result = new Result() { success = false, };
+            try
+            {
+                foreach (var item in model)
+                {
+                    if (string.IsNullOrEmpty(item.cntrNo))
+                    {
+                        result.errMsg = "鎵樼洏鍙蜂负绌猴紒";
+                        return result;
+                    }
+                    var list = WMSHelper.GetWmsTaskList("绛夊緟", item.cntrNo);
+                    if (list == null)
+                    {
+                        list = WMSHelper.GetWmsTaskList("鎵ц", item.cntrNo);
+                    }
+                    if (list == null)
+                    {
+                        result.errMsg = "鏈煡璇㈠埌鍦ㄧ瓑寰呬腑鐨勪綔涓氾紒";
+                        return result;
+                    }
+
+                    var inbound = new Inbound()
+                    {
+                        areaCode = list.S_END_AREA
+                    };
+                    var wh = new Warehouse(inbound);
+                    var stored = await wh.StoreItemAsync();
+                    if (stored == null)
+                    {
+                        result.errMsg = "绔嬪簱鍖烘湭鏌ヨ鍒板彲鐢ㄨ揣浣嶏紒";
+                        return result;
+                    }
+
+                    var startLoc = ContainerHelper.GetCntrLoc(list.S_CNTR_CODE);
+                    if (startLoc == null)
+                    {
+                        result.errMsg = $"鏈煡璇㈠埌鎵樼洏{list.S_CNTR_CODE}鎵�湪鐨勮揣浣嶏紒";
+                        return result;
+                    }
+                    var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, stored.loationCode, list.S_B_STATE == "绛夊緟" ? "鏂欑鍏ュ簱" : "鎵樼洏鍏ュ簱", list.S_CNTR_CODE, list.S_CODE);
+                    if (!res)
+                    {
+                        result.errMsg = "鍏ュ簱浠诲姟鍒涘缓澶辫触锛�;
+                        return result;
+                    }
+                    WMSHelper.UpdateTaskStatus(list.S_CODE, 1);
+                    ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, "");
+                }
+                
+
+                result.success = true;
+                return result;
+            }
+            catch (Exception ex)
+            {
+                result.success = false;
+                result.errMsg = ex.Message;
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"notifyDeviceSignalWCS璋冪敤璁惧淇″彿鍙嶉鍑虹幇閿欒锛侊紒", ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return result;
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔�+        /// </summary>
+        /// <param name="distributionCntr">閰嶇洏鍗�/param>
+        /// <returns></returns>
+        internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntr)
+        {
+            try
+            {
+                // 鍒涘缓璋冨害鍣�+                var scheduler =  new DoubleDeepOutboundScheduler(distributionCntr);
+
+                var listOut = new List<Outbound>();
+                foreach (var item in distributionCntr)
+                {
+                    listOut.Add(new Outbound
+                    {
+                        locCode = item.S_LOC_CODE,
+                        areaCode = item.S_AREA_CODE,
+                        endArea = item.S_EXIT_AREA_CODE,
+                        endBit = item.S_EXIT_LOC_CODE,
+                        trayCode = item.S_CNTR_CODE,
+                        taskType = "閰嶇洏鍑哄簱"
+                    });
+                }
+                // 璇锋眰鍑哄簱
+                var tasks = scheduler.GenerateOutboundTasks(listOut);
+                foreach (var item in tasks)
+                {
+                    // 鍒涘缓鍑哄簱浠诲姟
+                    var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, item.S_OP_CODE);
+                    UpdateDistributionCntrState("浣滀笟涓�, item.S_CNTR_CODE);
+                    if (!res)
+                    {
+                        LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�);
+                        return false;
+                    }
+                }
+                return true;
+            }
+            catch (Exception ex)
+            {
+                var st = new System.Diagnostics.StackTrace(ex, true);
+                var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚
+                if (frame != null)
+                {
+                    LogHelper.Error($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔★紒锛�, ex);
+                    LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex);
+                    LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex);
+                    LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex);
+                }
+                return false;
+            }
+
+        }
+
+        #endregion
+
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/readme.txt b/HH.WCS.Mobox3.HangYang/readme.txt
new file mode 100644
index 0000000..e02abfc
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/readme.txt
@@ -0,0 +1 @@
+锘�diff --git a/HH.WCS.Mobox3.HangYang/swagger.js b/HH.WCS.Mobox3.HangYang/swagger.js
new file mode 100644
index 0000000..aed0f8c
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/swagger.js
@@ -0,0 +1,110 @@
+'use strict';
+window.SwaggerTranslator = {
+    _words: [],
+
+    translate: function ()
+    {
+        var $this = this;
+        $('[data-sw-translate]').each(function ()
+        {
+            $(this).html($this._tryTranslate($(this).html()));
+            $(this).val($this._tryTranslate($(this).val()));
+            $(this).attr('title', $this._tryTranslate($(this).attr('title')));
+        });
+    },
+
+    setControllerSummary: function ()
+    {
+        $.ajax({
+            type: "get",
+            async: true,
+            url: $("#input_baseUrl").val(),
+            dataType: "json",
+            success: function (data)
+            {
+                var summaryDict = data.ControllerDesc;
+                var id, controllerName, strSummary;
+                $("#resources_container .resource").each(function (i, item)
+                {
+                    id = $(item).attr("id");
+                    if (id)
+                    {
+                        controllerName = id.substring(9);
+                        strSummary = summaryDict[controllerName];
+                        if (strSummary)
+                        {
+                            $(item).children(".heading").children(".options").first().prepend('<li class="controller-summary" title="' + strSummary + '">' + strSummary + '</li>');
+                        }
+                    }
+                });
+            }
+        });
+    },
+    _tryTranslate: function (word)
+    {
+        return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;
+    },
+
+    learn: function (wordsMap)
+    {
+        this._words = wordsMap;
+    }
+};
+
+
+/* jshint quotmark: float */
+window.SwaggerTranslator.learn({
+    "Warning: Deprecated": "警告:已过时",
+    "Implementation Notes": "实现备注",
+    "Response Class": "响应类",
+    "Status": "状态",
+    "Parameters": "参数",
+    "Parameter": "参数",
+    "Value": "值",
+    "Description": "描述",
+    "Parameter Type": "参数类型",
+    "Data Type": "数据类型",
+    "Response Messages": "响应消息",
+    "HTTP Status Code": "HTTP 状态码",
+    "Reason": "原因",
+    "Response Model": "响应模型",
+    "Request URL": "请求 URL",
+    "Response Body": "响应体",
+    "Response Code": "响应码",
+    "Response Headers": "响应头",
+    "Hide Response": "隐藏响应",
+    "Headers": "头",
+    "Try it out!": "试一下!",
+    "Show/Hide": "显示/隐藏",
+    "List Operations": "显示操作",
+    "Expand Operations": "展开操作",
+    "Raw": "原始",
+    "can't parse JSON.  Raw result": "无法解析 JSON。原始结果",
+    "Model Schema": "模型架构",
+    "Model": "模型",
+    "apply": "应用",
+    "Username": "用户名",
+    "Password": "密码",
+    "Terms of service": "服务条款",
+    "Created by": "创建者",
+    "See more at": "查看更多:",
+    "Contact the developer": "联系开发者",
+    "api version": "api 版本",
+    "Response Content Type": "响应 Content Type",
+    "fetching resource": "正在获取资源",
+    "fetching resource list": "正在获取资源列表",
+    "Explore": "浏览",
+    "Show Swagger Petstore Example Apis": "显示 Swagger Petstore 示例 Apis",
+    "Can't read from server.  It may not have the appropriate access-control-origin settings.": "无法从服务器读取。可能没有正确设置 access-control-origin。",
+    "Please specify the protocol for": "请指定协议:",
+    "Can't read swagger JSON from": "无法读取 swagger JSON于",
+    "Finished Loading Resource Information. Rendering Swagger UI": "已加载资源信息。正在渲染 Swagger UI",
+    "Unable to read api": "无法读取 api",
+    "from path": "从路径",
+    "server returned": "服务器返回"
+});
+$(function ()
+{
+    window.SwaggerTranslator.translate();
+    window.SwaggerTranslator.setControllerSummary();
+});
\ No newline at end of file
diff --git a/HH.WCS.Mobox3.HangYang/util/ExpressionHelper.cs b/HH.WCS.Mobox3.HangYang/util/ExpressionHelper.cs
new file mode 100644
index 0000000..1613526
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/util/ExpressionHelper.cs
@@ -0,0 +1,45 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.util {
+    internal static class ExpressionHelper {
+        public static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right) {
+            var invokedExpr = Expression.Invoke(right, left.Parameters);
+            return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(left.Body, invokedExpr), left.Parameters);
+        }
+        public class Person {
+            public string Name { get; set; }
+            public int Age { get; set; }
+        }
+        public static   void test() {
+            var list=new List<Person>();
+            list.Add(new Person {Age=1, Name="111" });
+            list.Add(new Person { Age = 1, Name = "222" });
+            list.Add(new Person { Age = 1, Name = "333" });
+            list.Add(new Person { Age = 2, Name = "111" });
+            list.Add(new Person { Age = 2, Name = "222" });
+            list.Add(new Person { Age = 2, Name = "333" });
+            list.Add(new Person { Age = 3, Name = "111" });
+            list.Add(new Person { Age = 3, Name = "222" });
+            list.Add(new Person { Age = 3, Name = "333" });
+
+
+            Expression<Func<Person, bool>> expression = x => x.Age >= 2;
+
+            expression = expression.AndAlso(x => x.Name =="111").AndAlso(x => x.Age == 3);
+
+            var data=list.Where(expression.Compile()).ToList();
+            var name = "";
+            var exp = Expressionable.Create<Person>();
+            exp.AndIF(!string.IsNullOrEmpty(name), it => it.Age == 1);
+            //exp.OrIF(!string.IsNullOrEmpty(name), it => it.Age == 1);//.OrIf 鏄潯浠舵垚绔嬫墠浼氭嫾鎺R
+            exp.Or(it => it.Name.Contains("jack"));//鎷兼帴OR
+            var people = new SqlHelper<object>().GetInstance().Queryable<Person>().Where(exp.ToExpression()).ToList();
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/util/HttpHelper.cs b/HH.WCS.Mobox3.HangYang/util/HttpHelper.cs
new file mode 100644
index 0000000..56bbfa2
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/util/HttpHelper.cs
@@ -0,0 +1,179 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text;
+
+namespace HH.WCS.HangYang.util {
+    public class HttpHelper {
+        public string WebPost(string url, string postData, string cotentType = "application/json") {
+            Console.WriteLine(url);
+            WebRequest request = WebRequest.Create(url);
+            request.Method = "POST";
+            //string postData = JsonConvert.SerializeObject(data); ;
+            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
+            request.ContentType = cotentType;
+            request.ContentLength = byteArray.Length;
+            request.Timeout = 3000;
+
+            try {
+                Stream dataStream = request.GetRequestStream();
+                dataStream.Write(byteArray, 0, byteArray.Length);
+                dataStream.Close();
+                WebResponse response = request.GetResponse();
+                //Console.WriteLine(((HttpWebResponse)response).StatusDescription);
+                dataStream = response.GetResponseStream();
+                StreamReader reader = new StreamReader(dataStream, Encoding.UTF8);
+                string responseFromServer = reader.ReadToEnd();
+                reader.Close();
+                dataStream.Close();
+                response.Close();
+                return responseFromServer;
+            }
+            catch (Exception e) {
+                Console.WriteLine(e.Message);
+                return "";
+            }
+        }
+
+        public string WebGet(string url) {
+            //using (var client = new HttpClient()) {
+            //	//璇锋眰缁撴灉
+            //	string result = client.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
+
+            //	Console.WriteLine(result);
+            //	return result;
+
+            //}
+            //Console.WriteLine(url);
+            WebRequest request = WebRequest.Create(url);
+            request.Timeout = 6000;
+            request.Method = "GET";
+
+            try {
+                WebResponse response = request.GetResponse();
+                Stream dataStream = response.GetResponseStream();
+                StreamReader reader = new StreamReader(dataStream);
+                string responseFromServer = reader.ReadToEnd();
+
+                reader.Close();
+                dataStream.Close();
+                response.Close();
+                Console.WriteLine(responseFromServer);
+                return responseFromServer;
+            }
+            catch (Exception e) {
+                return "";
+            }
+        }
+
+        public string Get(string url, string contentType = "application/x-www-form-urlencoded") {
+            WebRequest request = WebRequest.Create(url);
+            request.Method = "Get";
+            request.ContentType = contentType;
+            StreamReader reader = null;
+            Stream stream = null;
+            WebResponse rsp = null;
+            try {
+
+                rsp = request.GetResponse();
+                stream = rsp.GetResponseStream();
+                reader = new StreamReader(stream);
+                return reader.ReadToEnd();
+            }
+            catch {
+                return "";
+            }
+            finally {
+                // 閲婃斁璧勬簮
+                if (reader != null) reader.Close();
+                if (stream != null) stream.Close();
+                if (rsp != null) rsp.Close();
+            }
+
+        }
+
+        public string Post(string url, string postData, string contentType = "application/json", string sessionId = "") {
+            Console.WriteLine(url);
+            WebRequest request = WebRequest.Create(url);
+            request.Method = "POST";
+            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
+            request.ContentType = contentType;
+            request.ContentLength = byteArray.Length;
+            request.Timeout = 3000;
+            if (sessionId != "") {
+                request.Headers.Set("ASP.NET_SessionId", sessionId);
+            }
+            StreamReader reader = null;
+            Stream stream = null;
+            WebResponse rsp = null;
+            try {
+                stream = request.GetRequestStream();
+                stream.Write(byteArray, 0, byteArray.Length);
+                stream.Close();
+                rsp = request.GetResponse();
+                stream = rsp.GetResponseStream();
+                reader = new StreamReader(stream);
+                return reader.ReadToEnd();
+            }
+            catch (Exception ex) {
+                Console.WriteLine($"{url} err={ex.Message}");
+                return "";
+            }
+            finally {
+                // 閲婃斁璧勬簮
+                if (reader != null) reader.Close();
+                if (stream != null) stream.Close();
+                if (rsp != null) rsp.Close();
+            }
+
+        }
+
+
+        public string Post(string url, Dictionary<string, string> dic) {
+            var param = dic.Select(a => { return string.Format("{0}={1}", a.Key, a.Value); }).ToList();
+            return Post(url, string.Join("&", param), "application/x-www-form-urlencoded");
+
+        }
+
+        public string PostWithCookie(string url, string sessinId) {
+            return PostWithCookie(url, "", "", sessinId);
+        }
+        public string PostWithCookie(string url, string postData, string contentType = "application/json", string sessionId = "") {
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
+            request.Method = "POST";
+            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
+            request.ContentType = contentType;
+            request.ContentLength = byteArray.Length;
+            if (sessionId != "") {
+                request.CookieContainer = new CookieContainer();
+                request.CookieContainer.SetCookies(new Uri("http://" + request.RequestUri.Authority), "ASP.NET_SessionId=" + sessionId);
+            }
+            StreamReader reader = null;
+            Stream stream = null;
+            WebResponse rsp = null;
+            try {
+                stream = request.GetRequestStream();
+                stream.Write(byteArray, 0, byteArray.Length);
+                stream.Close();
+                rsp = request.GetResponse();
+                stream = rsp.GetResponseStream();
+                reader = new StreamReader(stream);
+                return reader.ReadToEnd();
+            }
+            catch {
+                return "";
+            }
+            finally {
+                // 閲婃斁璧勬簮
+                if (reader != null) reader.Close();
+                if (stream != null) stream.Close();
+                if (rsp != null) rsp.Close();
+            }
+
+        }
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/util/LogHelper.cs b/HH.WCS.Mobox3.HangYang/util/LogHelper.cs
new file mode 100644
index 0000000..f7778be
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/util/LogHelper.cs
@@ -0,0 +1,146 @@
+锘縰sing NLog;
+using NLog.Common;
+using NLog.Config;
+using NLog.Targets;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang
+{
+
+    public class LogHelper
+    {
+        public static Dictionary<string, ILogger> loggers = new Dictionary<string, ILogger>();
+
+        public static void Debug(string message, string name = "") {
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name)) {
+                logger = loggers[name];
+            }
+            else {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null) {
+                    loggers.Add(name, logger);
+                }
+                else {
+                    logger = LogFactory.CreateLogger("console");
+                }
+            }
+            if (logger != null) {
+                logger.Debug(message);
+            }
+        }
+
+
+
+        public static void Info(string message, string name = "") {
+            //logger.Info(message);
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name)) {
+                logger = loggers[name];
+            }
+            else {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null) {
+                    loggers.Add(name, logger);
+                }
+                else {
+                    logger = LogFactory.CreateLogger("infoFile");
+                }
+            }
+            if (logger != null) {
+                logger.Info(message);
+            }
+        }
+
+        public static void Error(string message, Exception ex, string name = "") {
+            //logger.Error(ex, message);
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name)) {
+                logger = loggers[name];
+            }
+            else {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null) {
+                    loggers.Add(name, logger);
+                }
+                else {
+                    logger = LogFactory.CreateLogger("errorFile");
+                }
+            }
+            if (logger != null) {
+                logger.Error($"{message}{ex.StackTrace}");
+            }
+        }
+
+
+    }
+
+    internal class LogFactory
+    {
+        /// <summary>
+        /// 閫氳繃閰嶇疆鏂囦欢閰嶇疆鏃ュ織
+        /// </summary>
+        static LogFactory() {
+            var loggerNames = new List<string>() { "HosttoagvTask", "HosttoagvCar", "NDC", "鏉ゥWCS","WMSAPI","鏉哀" };
+            LogManager.Configuration = DefaultConfig(loggerNames);
+        }
+        public static ILogger CreateLogger(string name) {
+            var logger = LogManager.GetLogger(name);
+            return logger;
+        }
+
+        public static LoggingConfiguration DefaultConfig(List<string> loggerNames) {
+            var config = new LoggingConfiguration();
+            loggerNames.ForEach(a => {
+                var target = new FileTarget();
+                target.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+                target.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+                target.ArchiveFileName = @"${basedir}/Logs/" + a + "/{####}.txt";
+                target.FileName = @"${basedir}/Logs/" + a + "/${shortdate}.txt";//褰撳墠鏂囦欢璺緞
+                target.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+                config.AddTarget(a, target);
+                config.AddRuleForOneLevel(LogLevel.Info, target, a);
+            });
+
+
+            // 娣诲姞target-console
+            var consoleTarget = new ColoredConsoleTarget();
+            consoleTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("console", consoleTarget);
+            config.AddRule(LogLevel.Debug, LogLevel.Fatal, consoleTarget);
+
+            //娣诲姞target-info
+            var infoFileTarget = new FileTarget();
+            infoFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+            infoFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+            infoFileTarget.ArchiveFileName = @"${basedir}/Logs/Info/{####}.txt";
+            infoFileTarget.FileName = @"${basedir}/Logs/Info/${shortdate}.txt";//褰撳墠鏂囦欢璺緞
+            infoFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("infoFile", infoFileTarget);
+            config.AddRuleForOneLevel(LogLevel.Info, infoFileTarget);//INFO鍐欏湪Info鏂囦欢
+
+            //娣诲姞target-err
+            var errorFileTarget = new FileTarget();
+            errorFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+            errorFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+            errorFileTarget.ArchiveFileName = @"${basedir}/Logs/Error/{####}.txt";
+            errorFileTarget.FileName = @"${basedir}/Logs/Error/${shortdate}.txt";
+            errorFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("errorFile", errorFileTarget);
+            config.AddRule(LogLevel.Error, LogLevel.Fatal, errorFileTarget);
+
+
+            return config;
+        }
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/util/STAttribute.cs b/HH.WCS.Mobox3.HangYang/util/STAttribute.cs
new file mode 100644
index 0000000..66a11f0
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/util/STAttribute.cs
@@ -0,0 +1,23 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.util
+{
+   
+    [AttributeUsage(AttributeTargets.Class, Inherited = true)]
+    class STAttribute : SugarTable
+    {
+        public static Dictionary<string, string> attributes = new Dictionary<string, string>();
+        public STAttribute(string tableName) : base(tableName)
+        {
+            string value = "";
+            if (attributes.TryGetValue(TableName, out value))
+                TableName = value.ToUpper();
+        }
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/util/Settings.cs b/HH.WCS.Mobox3.HangYang/util/Settings.cs
new file mode 100644
index 0000000..5e552a3
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/util/Settings.cs
@@ -0,0 +1,172 @@
+锘縰sing Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Text.Json.Nodes;
+
+namespace HH.WCS.HangYang.util
+{
+    public class Settings
+    {
+        public static string HostToAgvServerUrl { get; set; }
+        public static string HASeverUrl { get; set; }
+        public static string GZSeverUrl { get; set; }
+        public static string SqlServer { get; set; }
+        public static string SqlServer1 { get; set; }
+        public static List<deviceInfo> deviceInfos { get; set; }
+        public static List<TableUrl> tableUrls { get; set; }
+        public static List<LocArea> LocAreas { get; set; }
+        public static int port { get; set; }
+        public static string WHCode { get; set; }
+        public static string FacCode { get; set; }
+        public static string OLMA_Adress { get; set; }
+        public static string[] OLMA_LOC { get; set; }
+
+        #region 鏉哀Setting瀹炰綋
+        public static List<ReservoirArea> ReservoirAreas { get; set; }
+        public static List<Relevancy> Relevancys { get; set; }
+        public static CompleteTask CompleteTasks { get; set; }
+
+        #endregion
+
+
+        public static void Init()
+        {
+            LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 寮�");
+            try
+            {
+                var jsonFile = System.AppDomain.CurrentDomain.BaseDirectory + "/config/config.json";
+                using (System.IO.StreamReader file = System.IO.File.OpenText(jsonFile))
+                {
+                    using (JsonTextReader reader = new JsonTextReader(file))
+                    {
+                        JObject o = (JObject)JToken.ReadFrom(reader);
+                        foreach (Newtonsoft.Json.Linq.JProperty keyValue in o.Properties())
+                        {
+                            Console.WriteLine(keyValue.Name);
+                            if (keyValue.Name == "HostToAgvServerUrl")
+                            {
+                                HostToAgvServerUrl = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "HASeverUrl")
+                            {
+                                HASeverUrl = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "GZSeverUrl")
+                            {
+                                GZSeverUrl = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "SqlServer")
+                            {
+                                SqlServer = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "SqlServer1")
+                            {
+                                SqlServer1 = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "WHCode")
+                            {
+                                WHCode = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "FacCode")
+                            {
+                                FacCode = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "ApiPort")
+                            {
+                                port = int.Parse(keyValue.Value.ToString());
+                            }
+                            if (keyValue.Name == "OLMA_Adress")
+                            {
+                                OLMA_Adress = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "OLMA_LOC")
+                            {
+                                OLMA_LOC = JsonConvert.DeserializeObject<string[]>(keyValue.Value.ToString());
+                            }
+                            if (keyValue.Name == "DeviceInfo")
+                            {
+                                deviceInfos = JsonConvert.DeserializeObject<List<deviceInfo>>(keyValue.Value.ToString());
+                            }
+                            if (keyValue.Name == "TableUrl")
+                            {
+                                tableUrls = JsonConvert.DeserializeObject<List<TableUrl>>(keyValue.Value.ToString());
+                            }
+                            if (keyValue.Name == "LocArea")
+                            {
+                                LocAreas = JsonConvert.DeserializeObject<List<LocArea>>(keyValue.Value.ToString());
+                            }
+                            if (keyValue.Name == "ReservoirArea")
+                            {
+                                ReservoirAreas = JsonConvert.DeserializeObject<List<ReservoirArea>>(keyValue.Value.ToString());
+                            }
+                            if (keyValue.Name == "Relevancy")
+                            {
+                                Relevancys = JsonConvert.DeserializeObject<List<Relevancy>>(keyValue.Value.ToString());
+                            }
+                            if (keyValue.Name == "CompleteTask")
+                            {
+                                CompleteTasks = JsonConvert.DeserializeObject<CompleteTask>(keyValue.Value.ToString());
+                            }
+                        }
+                    }
+                }
+                LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 瀹屾垚");
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error("鍔犺浇閰嶇疆鏂囦欢澶辫触锛� + ex.Message, ex);
+            }
+
+        }
+
+        public class deviceInfo
+        {
+            public string address { get; set; }
+            public string deviceName { get; set; }
+            public string[] deviceNo { get; set; }
+            public string[] TN_Location { get; set; }
+
+            public int deviceType { get; set; }
+            public int enable { get; set; }
+        }
+        public class TableName
+        {
+            public string name { get; set; }
+            public string code { get; set; }
+        }
+        public class TableUrl
+        {
+            public int id { get; set; }
+            public string url { get; set; }
+        }
+
+        public class LocArea
+        {
+            public string startBit { get; set; }
+            public string endArea { get; set; }
+            public string endBit { get; set; }
+            public string startArea { get; set; }
+        }
+
+        #region 鏉哀Setting閰嶇疆绫�+        public class ReservoirArea
+        {
+            public string areaName { get; set; }
+            public string areaCode { get; set; }
+        }
+
+        public class Relevancy
+        {
+            public string InLoc { get; set; }
+            public string OutLoc { get; set; }
+        }
+
+        public class CompleteTask
+        {
+            public string[] taskType { get; set; }
+        }
+        #endregion
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/util/SqlHelper.cs b/HH.WCS.Mobox3.HangYang/util/SqlHelper.cs
new file mode 100644
index 0000000..d361db3
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/util/SqlHelper.cs
@@ -0,0 +1,140 @@
+锘縰sing Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace HH.WCS.HangYang.util {
+    //https://www.donet5.com/Home/Doc
+    public class SqlHelper<T> where T : class, new() {
+        public bool ExecuteSql(string sql) {
+            try {
+                var code = GetInstance().Ado.ExecuteCommand(sql);
+                return code > 1;
+            }
+            catch (Exception ex) {
+                return false;
+            }
+        }
+
+        public bool Update(T model, string[] cols) {
+            var db = GetInstance();
+            return db.Updateable<T>(model).UpdateColumns(cols).ExecuteCommand() > 0;
+        }
+        public List<T> GetList(Expression<Func<T, bool>> where = null) {
+            var db = GetInstance();
+            if (where == null) {
+                return db.Queryable<T>().ToList();
+            }
+            else {
+                return db.Queryable<T>().Where(where).ToList();
+            }
+        }
+        public T Get(Expression<Func<T, bool>> where, Expression<Func<T, object>> order, bool asc = false) {
+            SqlSugarClient db = GetInstance();
+            if (order == null) {
+                return db.Queryable<T>().Where(where).Single();
+            }
+            else {
+                return db.Queryable<T>().Where(where).OrderBy(order, asc ? OrderByType.Asc : OrderByType.Desc).First();
+            }
+        }
+        public T Get(Expression<Func<T, bool>> where, Expression<Func<T, object>> orderBy = null) {
+            try {
+                var db = GetInstance();
+                T model = null;
+                if (orderBy != null) {
+                    model = db.Queryable<T>().Where(where).OrderBy(orderBy, OrderByType.Desc).First();//鏌ヨ琛ㄧ殑鎵�湁
+                }
+                else {
+                    model = db.Queryable<T>().Where(where).First();
+                }
+                return model;
+            }
+            catch (Exception ex) {
+                Console.WriteLine(ex.Message);
+                return default(T);
+            }
+        }
+        public bool Update(T model) {
+            var db = GetInstance();
+            return db.Updateable<T>(model).ExecuteCommand() > 0;
+        }
+        public bool Insert(T model) {
+            try {
+                var db = GetInstance();
+                return db.Insertable<T>(model).ExecuteCommand() > 0;
+            }
+            catch (Exception ex) {
+                return false;
+            }
+        }
+
+        //鍒犻櫎鎸囧畾鏉′欢鏁版嵁
+        public bool Deleteable(Expression<Func<T, bool>> where) {
+            try {
+                var db = GetInstance();
+                return db.Deleteable<T>().Where(where).ExecuteCommand() > 0;
+            }
+            catch (Exception ex) {
+                return false;
+            }
+        }
+
+        /// <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=192.168.1.144)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=JTMobox)));User Id=system;Password=Hh123321;",
+                //DbType = DbType.Oracle,
+                IsAutoCloseConnection = true,
+                InitKeyType = InitKeyType.Attribute//浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�+            });
+            //
+            //db.MappingTables.Add("","");
+
+            //鐩戞帶鎵�湁瓒呰繃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;
+                    //db.Ado.SqlStackTrace.MyStackTraceList[1].xxx 鑾峰彇涓婂眰鏂规硶鐨勪俊鎭�+                }
+                //鐩稿綋浜嶦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/HH.WCS.Mobox3.HangYang/util/StrHelper.cs b/HH.WCS.Mobox3.HangYang/util/StrHelper.cs
new file mode 100644
index 0000000..3468e08
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/util/StrHelper.cs
@@ -0,0 +1,31 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.util
+{
+    internal class StrHelper
+    {
+        /// <summary>
+        /// 鑾峰彇闅忔満瀛楃涓�+        /// </summary>
+        /// <param name="prefix"></param>
+        /// <param name="Length"></param>
+        /// <returns></returns>
+        public static string StrRandom(string prefix, int Length) {
+            byte[] b = new byte[32];
+            RandomNumberGenerator.Create().GetBytes(b);
+            Random random = new Random(BitConverter.ToInt32(b, 0));
+            string str = "0123456789"; //abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+            string returnStr = string.Empty;
+            for (int i = 0; i < Length; i++) {
+                returnStr += str.Substring(random.Next(0, str.Length - 1), 1);
+            }
+            var cntrCode = prefix + returnStr;
+            return cntrCode;
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/wms/App.config b/HH.WCS.Mobox3.HangYang/wms/App.config
new file mode 100644
index 0000000..29106d9
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/wms/App.config
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+	<configSections>
+		<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
+	</configSections>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
+	</startup>
+	<runtime>
+		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+			<dependentAssembly>
+				<assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.122.21.1" newVersion="4.122.21.1"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-8.0.0.3" newVersion="8.0.0.3"/>
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
+			</dependentAssembly>
+		</assemblyBinding>
+	</runtime>
+	<system.data>
+		<DbProviderFactories>
+			<remove invariant="Oracle.ManagedDataAccess.Client"/>
+			<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.21.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
+		</DbProviderFactories>
+	</system.data>
+</configuration>
diff --git a/HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs b/HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs
new file mode 100644
index 0000000..6492804
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/wms/ContainerHelper.cs
@@ -0,0 +1,606 @@
+锘�+using HH.WCS.HangYang.models.other;
+using HH.WCS.HangYang.util;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using static HH.WCS.HangYang.dispatch.NDC;
+
+namespace HH.WCS.HangYang.wms
+{
+    /// <summary>
+    /// 瀹瑰櫒甯姪绫�+    /// </summary>
+    internal class ContainerHelper
+    {
+        internal static string GenerateCntrNo()
+        {
+            var id = SYSHelper.GetSerialNumber("鎵樼洏鍙�, "TP");
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"TP{date}{id.ToString().PadLeft(4, '0')}";
+        }
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒绫诲瀷銆佺洰鐨勫湴銆佺姸鎬佹煡璇㈠鍣�+        /// </summary>
+        /// <param name="dest"></param>
+        /// <param name="cntrType"></param>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<Container> GetCntrListByPurpose(string dest, string cntrType, int state)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Container>().Where(a => a.S_DEST == dest && a.S_TYPE == cntrType && a.N_B_STATE == state).ToList();
+            return list;
+
+        }
+        /// <summary>
+        /// 鍒涘缓鎵樼洏鐗╂枡缁戝畾鍏崇郴
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntr"></param>
+        /// <param name="itemcode"></param>
+        /// <returns></returns>
+        internal static bool CreateCntrItem(string loc, string cntr, string itemcode, string itemname, string itemtype, string cntrtype, string batch, int weight, string unit)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                var location = db.Queryable<Location>().Where(a => a.S_CODE == loc).First();
+                if (location != null)
+                {
+                    LogHelper.Info($"鎵樼洏{cntr}锛氭坊鍔犺揣浣峽loc}缁戝畾鍏崇郴锛屾坊鍔犲鍣ㄨ揣鍝佽〃");
+                    db.BeginTran();
+                    var con = db.Queryable<Container>().Where(a => a.S_CODE.Trim() == cntr).First();
+                    if (con == null)
+                    {
+                        var container = new Container { S_CODE = cntr, S_TYPE = cntrtype };
+                        db.Insertable<Container>(container).ExecuteCommand();
+                    }
+
+                    var cntritem = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr).First();
+                    if (cntritem == null)
+                    {
+                        var cir = new CntrItemDetail { S_CNTR_CODE = cntr, S_ITEM_CODE = itemcode, S_ITEM_NAME = itemname, S_ITEM_SPEC = itemtype, S_WU = unit, F_NET_WEIGHT = weight, S_BATCH_NO = batch };
+                        db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
+                    }
+
+                    var loctp = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntr };
+
+
+                    db.Insertable<LocCntrRel>(loctp).ExecuteCommand();
+                    location.N_CURRENT_NUM = location.N_CURRENT_NUM + 1;
+
+
+                    db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
+                    db.Ado.CommitTran();
+                    res = true;
+                }
+
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"CreateCntrItem => erro锛氭墭鐩榹cntr}娣诲姞澶辫触" + ex.Message.ToString());
+                db.Ado.RollbackTran();
+            }
+
+            return res;
+        }
+
+        /// <summary>
+        /// 鍒涘缓鎵樼洏鐗╂枡缁戝畾鍏崇郴
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntr"></param>
+        /// <param name="itemcode"></param>
+        /// <returns></returns>
+        internal static bool CreateCntrItem(string cntr, string itemcode, string itemname, string batch, string weight)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                LogHelper.Info($"鎵樼洏{cntr}锛氭坊鍔犵墿鏂檣itemcode}缁戝畾鍏崇郴");
+                db.BeginTran();
+                var cntritem = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr).First();
+                if (cntritem == null)
+                {
+                    var cir = new CntrItemDetail { S_CNTR_CODE = cntr, S_ITEM_CODE = itemcode, S_ITEM_NAME = itemname, F_NET_WEIGHT = float.Parse(weight), S_BATCH_NO = batch };
+                    db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
+                }
+                else
+                {
+                    cntritem.S_ITEM_CODE = itemcode;
+                    cntritem.S_ITEM_NAME = itemname;
+                    cntritem.F_NET_WEIGHT = float.Parse(weight);
+                    cntritem.S_BATCH_NO = batch;
+                    db.Updateable<CntrItemDetail>(cntritem).ExecuteCommand();
+                }
+                var con = db.Queryable<Container>().Where(a => a.S_CODE.Trim() == cntr).First();
+                if (con == null)
+                {
+                    var container = new Container { S_CODE = cntr };
+                    db.Insertable<Container>(container).ExecuteCommand();
+                }
+                db.Ado.CommitTran();
+                res = true;
+
+
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"CreateCntrItem => erro锛氭墭鐩榹cntr}娣诲姞澶辫触" + ex.Message.ToString());
+                db.Ado.RollbackTran();
+            }
+
+            return res;
+        }
+        /// <summary>
+        /// TN_ContainerHelper.test("4L澶╃劧姘寸瑁�鍏�, 50, "335ml涓滄柟鏍戝彾15鍏�, 30);
+        /// </summary>
+        /// <param name="item1"></param>
+        /// <param name="qty1"></param>
+        /// <param name="item2"></param>
+        /// <param name="qty2"></param>
+        //internal static void test(string item1, int qty1, string item2, int qty2) {
+        //    var db = new SqlHelper<object>().GetInstance();
+        //    var cntr = db.Queryable<TN_Container>().Includes(a => a.CntrItemRelList).
+        //        Where(a => a.CntrItemRelList.Count(b => b.S_ITEM_CODE == item1 && int.Parse(b.F_QTY) > qty1) > 0
+        //        && a.CntrItemRelList.Count(b => b.S_ITEM_CODE == item2 && int.Parse(b.F_QTY) > qty2) > 0).First();
+        //}
+
+        /// <summary>
+        /// 鍒ゆ柇瀹瑰櫒鏄惁鏈夌墿鏂欎俊鎭�+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static bool CheckEmpty(string cntr)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<LocCntrRel>().Count(a => a.S_LOC_CODE.Trim() == cntr) == 0;
+
+        }
+
+        internal static bool AddCntr(string cntrCode, string itemCode)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var TN_Container = new Container { S_CODE = cntrCode };
+            var cntrItemRel = new CntrItemDetail { S_CNTR_CODE = cntrCode, S_ITEM_CODE = itemCode };
+            try
+            {
+                db.BeginTran();
+
+                db.Insertable<Container>(TN_Container).ExecuteCommand();
+                db.Insertable<CntrItemDetail>(cntrItemRel).ExecuteCommand();
+
+                db.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                db.RollbackTran();
+
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒鍙疯幏鍙栧鍣ㄤ俊鎭�+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static Container GetCntr(string cntr, bool create = false)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var old = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
+            if (old == null && create)
+            {
+                var model = new Container { S_CODE = cntr };
+                if (db.Insertable(model).ExecuteCommand() > 0)
+                {
+                    old = model;
+                }
+            }
+            return old;
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒鑾峰彇鐗╂枡淇℃伅
+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static List<CntrItemDetail> GetCntrItemRel(string cntr)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr).ToList();
+            return list;
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐗╂枡鑾峰彇瀹瑰櫒淇℃伅
+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static List<CntrItemDetail> GetItemCntrRel(string itemcode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<CntrItemDetail>().Where(a => a.S_ITEM_CODE.Trim() == itemcode.Trim()).ToList();
+            return list;
+        }
+
+        /// <summary>
+        /// 鐗╂枡淇℃伅缁戝畾鍒版弧瀹瑰櫒涓�+        /// </summary>
+        /// <param name="cntrCode"></param>
+        /// <param name="itemCode"></param>
+        /// <param name="batchNo"></param>
+        /// <param name="qty"></param>
+        /// <param name="purpose">瀹瑰櫒鐢ㄩ�锛岀敤浜庡摢涓嚎杈硅繕鏄洰鐨勭偣</param>
+        /// <returns></returns>
+        internal static bool BindCntrItemSingle(Container cntr, string itemCode, string batchNo, float qty)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                db.BeginTran();
+                db.Updateable(cntr).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
+                //1.灏嗗師鏈夊鍣ㄧ墿鏂欎俊鎭垹闄�+                db.Deleteable<CntrItemDetail>().Where(it => it.S_CNTR_CODE == cntr.S_CODE.Trim()).ExecuteCommand();
+                //2.鎻掑叆鏂扮殑瀹瑰櫒鐗╂枡淇℃伅锛堝鍣ㄥ彿涓嶅彉锛�+                var cir = new CntrItemDetail { S_CNTR_CODE = cntr.S_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode };
+                db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
+
+                db.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                db.RollbackTran();
+            }
+
+            return res;
+        }
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒鏉ユ簮鍜岀姸鎬佽幏鍙栨墭鐩�+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<Container> GetCntr(string dest, int state, string cntrType = "")
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            if (cntrType == "")
+            {
+                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state).ToList();
+            }
+            else
+            {
+                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
+            }
+        }
+        internal static bool UpdateCntr(List<string> cntrs, string dest, int state)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
+            if (models.Count > 0)
+            {
+                models.ForEach(a =>
+                {
+                    a.S_DEST = dest; a.N_B_STATE = state;
+                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+        internal static bool UpdateCntrDest(List<string> cntrs, string dest)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
+            if (models.Count > 0)
+            {
+                models.ForEach(a =>
+                {
+                    a.S_DEST = dest;
+                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+        /// <summary>
+        /// 鏇存柊鎵樼洏鏉ユ簮
+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <param name="src"></param>
+        /// <returns></returns>
+        internal static bool UpdateCntrSrc(string cntr, string src)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
+            if (model != null)
+            {
+                model.S_SRC = src;
+                model.T_MODIFY = DateTime.Now;
+                res = db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.T_MODIFY }).ExecuteCommand() > 0;
+            }
+            return res;
+        }
+        internal static bool UpdateCntrState(List<string> cntrs, int state)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
+            if (models.Count > 0)
+            {
+                models.ForEach(a =>
+                {
+                    a.N_B_STATE = state;
+                    db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+
+        internal static bool UpdateCntr(List<string> cntrs, string src, string dest, int state)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
+            if (models.Count > 0)
+            {
+                models.ForEach(a =>
+                {
+                    a.S_DEST = dest; a.N_B_STATE = state; a.S_SRC = src;
+                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE, it.S_SRC }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+        public static bool ClearCntrInfo(string cntr)
+        {
+
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
+            if (model != null)
+            {
+                model.S_SRC = "";
+                model.S_DEST = "";
+                model.N_B_STATE = 0;
+                model.T_MODIFY = DateTime.Now;
+
+            }
+            db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.S_DEST, it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+            return db.Deleteable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == cntr.Trim()).ExecuteCommand() > 0;
+        }
+        internal static List<Container> GetCntrBySrc(string src, int state, string cntrType = "")
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            if (cntrType == "")
+            {
+                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state).ToList();
+            }
+            else
+            {
+                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
+            }
+        }
+        /// <summary>
+        /// enable 璁╂墭鐩樺厑璁歌鍑哄簱璁$畻鍒帮紝鍚屾椂澧炲姞閲忚〃鏁版嵁
+        /// </summary>
+        /// <param name="cntr"></param>
+        internal static void Enable(string cntr, string loc)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var cntrInfo = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
+            //鑾峰彇浠撳簱閲忚〃
+            //鑾峰彇鐗╃悊搴撳尯
+            //鑾峰彇閫昏緫搴撳尯
+            if (cntrInfo != null)
+            {
+                try
+                {
+                    db.BeginTran();
+                    //闃叉鎺ュ彛閲嶅璋冪敤锛岄噺琛ㄩ噸澶嶅鍔�+                    if (cntrInfo.C_ENABLE == "N")
+                    {
+                        cntrInfo.C_ENABLE = "Y";
+                        db.Updateable(cntrInfo).UpdateColumns(a => new { a.C_ENABLE, a.T_MODIFY }).ExecuteCommand();
+                        var cirList = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE == cntr).ToList();
+                        if (cirList.Count > 0)
+                        {
+                            cirList.ForEach(a =>
+                            {
+                                var wh = db.Queryable<WHInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE).First();
+                                if (wh != null)
+                                {
+                                    //鏇存柊浠撳簱閲忚〃
+                                    wh.F_QTY += a.F_QTY;
+                                    wh.T_MODIFY = DateTime.Now;
+                                    db.Updateable(wh).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
+                                }
+                                else
+                                {
+                                    //鏂板浠撳簱閲忚〃
+                                    wh = new WHInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE };
+                                    db.Insertable(wh).ExecuteCommand();
+                                }
+                                //鍐欏叆绗笁鏂逛腑闂磋〃
+                                //濡傛灉瑕佺粺璁″垎鎷d腑锛屽垎鎷e洖鐨勯噺锛屾棤娉曡窡韪墭鐩橈紝闄ら潪瀵规墭鐩樺姞鏍囪瘑锛屽睘浜庡摢涓簱鍖恒�
+                                //鍙﹀鍒嗘嫞鍥炲彲鑳藉幓鍒殑宸烽亾锛屽埆鐨勯�杈戝簱鍖猴紝閫昏緫搴撳尯鐨勯噺鎺у埗鏇村鏉傦紝涓嶈兘璁$畻鍒嗘嫞涓拰鍒嗘嫞鍥炪�鎵�互搴撳尯閲忚〃鏈」鐩殏涓嶈�铏�+                                /*
+                                //鑾峰彇璐т綅鐨勭墿鐞嗗簱鍖哄拰鎵�湁閫昏緫搴撳尯
+                                var location = db.Queryable<Location>().Where(l => l.S_CODE == loc).First();
+                                if (location != null) {
+                                    var az = db.Queryable<AZInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == location.S_AREA_CODE).First();
+                                    if (az != null) {
+                                        //鏇存柊搴撳尯閲忚〃
+                                        az.F_QTY += a.F_QTY;
+                                        az.T_MODIFY = DateTime.Now;
+                                        db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
+                                    }
+                                    else {
+                                        //鏂板搴撳尯閲忚〃
+                                        az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = location.S_AREA_CODE };
+                                        db.Insertable(az).ExecuteCommand();
+                                    }
+
+                                }
+                                //閫昏緫搴撳尯鐨勯噺琛�+                                var zoneList = db.Queryable<ZoneLoc>().Where(l => l.S_LOC_CODE == loc).ToList();
+                                if (zoneList.Count > 0) {
+                                    zoneList.ForEach(z => {
+                                        var az = db.Queryable<AZInventory>().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == z.S_ZONE_CODE).First();
+                                        if (az != null) {
+                                            //鏇存柊搴撳尯閲忚〃
+                                            az.F_QTY += a.F_QTY;
+                                            az.T_MODIFY = DateTime.Now;
+                                            db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
+                                        }
+                                        else {
+                                            //鏂板搴撳尯閲忚〃
+                                            az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = z.S_ZONE_CODE, C_IS_LOGIC_AREA = "Y" };
+                                            db.Insertable(az).ExecuteCommand();
+                                        }
+                                    });
+                                }
+                                */
+
+                            });
+                        }
+                    }
+                    db.CommitTran();
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message);
+                    db.RollbackTran();
+
+                }
+            }
+        }
+
+        /// <summary>
+        /// 缁戝畾璐т綅瀹瑰櫒琛�+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static bool BindLocCntrs(string loc, string cntr, string itemCode, string itemName)
+        {
+            bool result = true;
+            List<string> list = new List<string>(cntr.Split(','));
+            var db = new SqlHelper<object>().GetInstance();
+            for (int i = 0; i < list.Count; i++)
+            {
+                if (!string.IsNullOrEmpty(list[i]))
+                {
+                    string cntrCode = list[i];
+                    if (db.Queryable<LocCntrRel>().Count(a => a.S_CNTR_CODE.Trim() == cntrCode) == 0)
+                    {
+                        var cir = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntrCode };
+                        var con = new Container { S_CODE = cntrCode,N_DETAIL_COUNT = 1 };
+                        db.Insertable<LocCntrRel>(cir).ExecuteCommand();
+                        db.Insertable<Container>(con).ExecuteCommand();
+                        if (!string.IsNullOrEmpty(itemCode))
+                        {
+                            ContainerHelper.BindCntrItem(cntrCode, itemCode, itemName);
+                        }
+                    }
+                }
+            }
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            return result;
+        }
+
+        /// <summary>
+        /// 缁戝畾瀹瑰櫒鐗╂枡琛�+        /// </summary>
+        /// <param name="itemCode"></param>
+        /// <param name="batchNo"></param>
+        /// <param name="qty"></param>
+        /// <returns></returns>
+        internal static bool BindCntrItem(string trayCode, string itemCode, string itemName)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                db.BeginTran();
+                var cir = new CntrItemDetail { S_CNTR_CODE = trayCode, S_ITEM_CODE = itemCode, S_ITEM_NAME = itemName };
+                db.Insertable<CntrItemDetail>(cir).ExecuteCommand();
+
+                db.Ado.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                db.Ado.RollbackTran();
+            }
+            return res;
+        }
+
+        #region 鏉哀璐т綅瀹瑰櫒鐗╂枡甯姪鏂规硶
+
+        /// <summary>
+        /// 淇敼瀹瑰櫒琛ㄥ鍣ㄥ幓鍚戝瓧娈�+        /// </summary>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <param name="abouts">瀹瑰櫒鍘诲悜</param>
+        /// <returns></returns>
+        internal static bool UpdateCntrAbouts(string trayCode, string abouts)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == trayCode).First();
+            if (model != null)
+            {
+                model.S_ACTION_SRC = abouts;
+                model.T_MODIFY = DateTime.Now;
+                res = db.Updateable(model).UpdateColumns(it => new { it.S_ACTION_SRC, it.T_MODIFY }).ExecuteCommand() > 0;
+            }
+            return res;
+        }
+
+
+        /// <summary>
+        /// 鏌ヨ琚爣璁扮殑鎵樼洏
+        /// </summary>
+        /// <param name="areaCode">搴撳尯</param>
+        /// <param name="abouts">鏍囪</param>
+        /// <returns></returns>
+        internal static List<LocCntrRel> GetCntrAbouts(string areaCode, string abouts)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Location>().LeftJoin<LocCntrRel>((p, m) => p.S_CODE == m.S_LOC_CODE)
+                .Where((p,m)=>p.S_AREA_CODE == areaCode && p.S_LOCK_STATE == "鏃�)
+                .Where((p,m)=>m.S_ACTION_SRC == abouts)
+                .Select((p,m)=>m)
+                .ToList();
+            return model;
+        }
+
+        internal static LocCntrRel GetCntrLoc(string trayCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<LocCntrRel>().Where(s=>s.S_CNTR_CODE == trayCode).First();
+            return model;
+        }
+
+        #endregion
+
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs b/HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs
new file mode 100644
index 0000000..d5e7524
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/wms/LocationHelper.cs
@@ -0,0 +1,517 @@
+锘縰sing HH.WCS.HangYang.util;
+using Newtonsoft.Json;
+using NLog.Fluent;
+using Org.BouncyCastle.Bcpg;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.wms
+{
+    internal class LocationHelper
+    {
+        public class LocationExt
+        {
+            public string S_PICKUP_POINT { get; internal set; }
+            public string S_LOC_CODE { get; internal set; }
+            public string S_AGV_SITE { get; internal set; }
+        }
+        private static Dictionary<string, Location> Locations = null;
+        private static Dictionary<string, LocationExt> LocationExts = null;
+
+        static LocationHelper()
+        {
+            try
+            {
+                //鍒濆鍖朙ocation鍔犲叆鍒板瓧鍏哥紦瀛�+                Locations = new Dictionary<string, Location>();
+                var list = GetAllLocList();
+                if (list.Count > 0)
+                {
+                    list.ForEach(a =>
+                    {
+                        if (!Locations.ContainsKey(a.S_CODE))
+                        {
+                            Locations.Add(a.S_CODE, a);
+                        }
+                    });
+                }
+                //鍒濆鍖朙ocationExt鍔犲叆鍒伴泦鍚堢紦瀛�+                //LocationExts = new Dictionary<string, LocationExt>();
+                //var exts = GetAllLocExtList();
+                //if (exts.Count > 0) {
+                //    exts.ForEach(a => {
+                //        LocationExts.Add($"{a.S_LOC_CODE.Trim()}_{a.S_PICKUP_POINT.Trim()}", a);
+                //    });
+                //}
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+            }
+        }
+
+        internal static bool CheckExist(string loc)
+        {
+            return Locations.Keys.Contains(loc);
+        }
+        internal static Location GetLocation(string loc)
+        {
+            if (CheckExist(loc.Trim()))
+            {
+                return Locations[loc.Trim()];
+            }
+            return null;
+        }
+        internal static List<FunctionArea> GetFunctionAreas(string masterCls, string msterCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<FunctionArea>().Where(a => a.S_MASTER_CLS == masterCls && a.S_MASTER_CODE == msterCode).ToList();
+        }
+        internal static List<FunctionArea> GetFunctionAreas(string masterCls, string msterCode, int nType)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<FunctionArea>().Where(a => a.S_MASTER_CLS == masterCls && a.S_MASTER_CODE == msterCode && a.N_TYPE == nType).ToList();
+        }
+        internal static FunctionArea GetFunctionAreaByCode(string faCode, int faType, int nType)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            // && a.N_FA_TYPE == faType 
+            return db.Queryable<FunctionArea>().Where(a => a.S_FA_CODE == faCode && a.N_TYPE == nType).First();
+        }
+        /// <summary>
+        /// 鑾峰彇璐т綅绔欑偣淇℃伅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static string GetAgvSite(string loc)
+        {
+            var site = "0";
+            if (Locations.Keys.Contains(loc.Trim()))
+            {
+                var Location = Locations[loc.Trim()];
+                site = Location.S_AGV_SITE;
+            }
+            else
+            {
+                var Location = GetLoc(loc.Trim());
+                if (Location != null)
+                {
+                    Locations.Add(loc.Trim(), Location);
+                    site = Location.S_AGV_SITE;
+                }
+            }
+            return site;
+        }
+
+        internal static int GetAgvSite(string loc, string actionType)
+        {
+            var site = 0;
+            var key = $"{loc.Trim()}_{actionType.Trim()}";
+            if (LocationExts.Keys.Contains(loc.Trim()))
+            {
+                var Location = LocationExts[loc.Trim()];
+                site = int.Parse(Location.S_AGV_SITE);
+            }
+            return site;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎵�湁璐т綅淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        internal static List<Location> GetAllLocList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().ToList();
+        }
+        internal static Location GetLoc(string code)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(a => a.S_CODE.Trim() == code).First();
+        }
+
+        /// <summary>
+        ///鑾峰彇鎵�湁璐т綅鎵╁睍淇℃伅 
+        /// </summary>
+        /// <returns></returns>
+        internal static List<LocationExt> GetAllLocExtList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<LocationExt>().ToList();
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇娌℃湁鍏ュ簱閿佸拰鍑哄簱閿�+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        internal static bool CheckLocFree(string code)
+        {
+            var result = false;
+            var loc = GetLoc(code);
+            if (loc != null)
+            {
+                result = loc.S_LOCK_STATE.Trim() == "鏃�;
+            }
+            return result;
+        }
+        internal static List<LocCntrRel> GetLocCntr(string loc)
+        {
+            var result = new List<LocCntrRel>();
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == loc.Trim()).OrderBy(a => a.T_CREATE).ToList();
+            if (list.Count > 0)
+            {
+                list.ForEach(a =>
+                {
+                    //鑾峰彇瀹瑰櫒淇℃伅
+                    var cntr = db.Queryable<Container>().Where(b => b.S_CODE == a.S_CNTR_CODE).First();
+                    if (cntr != null)
+                    {
+                        a.Container = cntr;
+                        result.Add(a);
+                    }
+                });
+            }
+            return result;
+
+        }
+        internal static List<LocCntrRel> GetLocCntrRel(string loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var result = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == loc.Trim()).ToList();
+            return result;
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁璐т綅闆嗗悎鑾峰彇鏈夊鍣ㄧ殑璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocList(List<string> loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM > 0).ToList();
+            return list;
+
+        }
+
+
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒闆嗗悎鑾峰彇璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<LocCntrRel> GetLocListBycntrs(List<string> cntrs)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<LocCntrRel>().Where(a => cntrs.Contains(a.S_CNTR_CODE)).ToList();
+            return list;
+
+        }
+
+        /// <summary>
+        /// 璐т綅闆嗗悎鑾峰彇璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocListByloc(List<string> loc, string Areacode)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE) && a.S_AREA_CODE.Trim() == Areacode.Trim()).ToList();
+            return list;
+
+        }
+
+        internal static List<Location> GetLocListBytype(List<string> loc, string type)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE) && a.S_PURPOSE.Trim() == type).ToList();
+            return list;
+
+        }
+        /// <summary>
+        /// 鏍规嵁璐т綅缂栫爜鑾峰彇璐т綅淇℃伅锛屼笉绠℃湁娌℃湁瀹瑰櫒
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocListAny(List<string> loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE)).ToList();
+            return list;
+
+        }
+        /// <summary>
+        /// 鏍规嵁搴撳尯缂栫爜鑾峰彇璐т綅闆嗗悎
+        /// </summary>
+        /// <param name="area"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocListAny(string area)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == area).ToList();
+                return list;
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine(ex.Message);
+                throw ex;
+            }
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁璐т綅闆嗗悎鑾峰彇鏈夊鍣�娌℃湁閿佺殑璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocListFree(List<string> loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE.Trim() == "鏃�).ToList();
+            return list;
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍥哄畾鏁伴噺瀹瑰櫒 娌℃湁閿佺殑璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="current"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocListFree(List<string> loc, int current)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM == current && a.S_LOCK_STATE.Trim() == "鏃�).ToList();
+            return list;
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏁伴噺澶т簬绛変簬鍥哄畾鏁伴噺瀹瑰櫒 娌℃湁閿佺殑璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="current"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocList(List<string> loc, int current)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM >= current && a.S_LOCK_STATE.Trim() == "鏃�).ToList();
+            return list;
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁璐т綅闆嗗悎鑾峰彇 娌℃湁瀹瑰櫒 娌℃湁閿佺殑璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocListEmptyFree(List<string> loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_CODE) && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).ToList();
+            return list;
+
+        }
+
+        /// <summary>
+        /// 鍏ュ簱閿佸畾缁堢偣锛屽嚭搴撻攣瀹氳捣鐐�+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="lockState">1:鍏ュ簱閿併�2:鍑哄簱閿併�2:鍏跺畠閿�/param>
+        /// <returns></returns>
+        public static bool LockLoc(string loc, int lockState)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Location>().Where(a => a.S_CODE == loc).First();
+            if (model != null && model.S_LOCK_STATE.Trim() == "鏃�)
+            {
+                model.N_LOCK_STATE = lockState;
+                model.S_LOCK_STATE = Location.GetLockStateStr(lockState);
+                res = db.Updateable(model).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand() > 0;
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 鍙栬揣瀹岃В閿佽捣鐐癸紝鍗歌揣瀹岃В閿佺粓鐐癸紝鍙楠岄攣鐨勬潵婧愶紝涔熷彲浠ヤ笉鏍¢獙
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        public static bool UnLockLoc(string loc)
+        {
+            LogHelper.Info("UnLockLoc:" + loc);
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Location>().Where(a => a.S_CODE == loc).First();
+            if (model != null)
+            {
+                model.S_LOCK_STATE = "鏃�;
+                model.N_LOCK_STATE = 0;
+                res = db.Updateable(model).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand() > 0;
+                LogHelper.Info("UnLockLoc:瑙i攣缁撴灉" + res);
+            }
+            else
+            {
+                LogHelper.Info("UnLockLoc 澶辫触");
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 鍒犻櫎璐т綅瀹瑰櫒琛ㄨ褰�淇敼璐т綅瀹瑰櫒鏁伴噺
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static bool UnBindingLoc(string loc, List<string> cntrs)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var location = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == loc).First();
+            try
+            {
+                db.BeginTran();
+                var lcrList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == loc).ToList();
+                var count = db.Deleteable<LocCntrRel>().Where(it => cntrs.Contains(it.S_CNTR_CODE.Trim()) && it.S_LOC_CODE.Trim() == loc).ExecuteCommand();
+                location.N_CURRENT_NUM = lcrList.Count - count;
+                location.S_LOCK_STATE = "鏃�;
+                location.N_LOCK_STATE = 0;
+                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE,it.N_LOCK_STATE }).ExecuteCommand();
+                db.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                db.RollbackTran();
+            }
+            return res;
+        }
+        /// <summary>
+        /// 璐т綅缁戝畾瀹瑰櫒
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <param name="actionSrc"></param>
+        /// <returns></returns>
+        public static bool BindingLoc(string loc, List<string> cntrs,string actionSrc)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var location = db.Queryable<Location>().Where(a => a.S_CODE.Trim() == loc).First();
+            try
+            {
+                var lcrList = db.Queryable<LocCntrRel>().Includes(a => a.Container).Where(a => a.S_LOC_CODE.Trim() == loc).ToList();
+                db.BeginTran();
+                int count = 0;
+                cntrs.ForEach(a =>
+                {
+                    if (lcrList.Count(b => b.S_CNTR_CODE.Trim() == a) == 0)
+                    {
+                        db.Insertable<LocCntrRel>(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = a ,S_ACTION_SRC = actionSrc }).ExecuteCommand();
+                        count++;
+                    }
+                });
+                location.N_CURRENT_NUM = lcrList.Count + count;
+                location.N_LOCK_STATE = 0;
+                location.S_LOCK_STATE = "鏃�;
+
+                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE,it.N_LOCK_STATE }).ExecuteCommand();
+
+                db.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                db.RollbackTran();
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇閫昏緫搴撳尯鏄惁鏈夊彲鐢ㄨ揣浣�+        /// </summary>
+        /// <param name="zone"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        internal static bool CheckZoneFree(string zone)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var count = db.Queryable<ZoneLoc>().Includes(a => a.Loc).Where(a => a.S_ZONE_CODE == zone && a.Loc.N_LOCK_STATE == 0).Count();
+            return count > 0;
+        }
+        internal static ZoneLoc GetZoneLoc(string zone)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<ZoneLoc>().Includes(a => a.Loc).Where(a => a.S_ZONE_CODE == zone && a.Loc.N_LOCK_STATE == 0 && a.Loc.N_CURRENT_NUM == 0).First();
+
+        }
+        internal static List<ZoneLoc> GetZoneByLoc(string loc)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<ZoneLoc>().Where(a => a.S_LOC_CODE == loc).ToList();
+
+        }
+        
+        internal static void Test()
+        {
+            //澶氭煡璇竴娆′篃鏄彲浠ョ殑锛屽厛鏌ュ嚭鍙敤鐨勮揣浣嶇粍锛岀劧鍚庨�鎷╄揣浣嶇粍涓垪姣旇緝澶х殑锛屾垨鑰呭垪姣旇緝灏忕殑
+            var availableRowGroups = new List<Location>().GroupBy(l => l.N_ROW_GROUP).Where(g => !g.Any(l => l.N_LOCK_STATE != 0)).Select(g => g.Key);
+
+            var db = new SqlHelper<object>().GetInstance();
+            //db.Queryable<Location>().Where(a => a.S_AREA_CODE == "11").Where(a => SqlFunc.Subqueryable<Location>().Where(b => b.)).GroupBy(z => z.N_ROW_GROUP).ToList();
+        }
+
+        #region 鏉哀璐т綅甯姪Helper
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鏌ヨ鍙敤璐т綅
+        /// </summary>
+        /// <param name="area">搴撳瓨缂栫爜</param>
+        /// <returns></returns>
+        internal static List<Location> GetLocAreaList(string area)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == area && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).ToList();
+                return list;
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine(ex.Message);
+                throw ex;
+            }
+
+        }
+
+        
+
+
+
+
+
+        #endregion
+
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/wms/SYSHelper.cs b/HH.WCS.Mobox3.HangYang/wms/SYSHelper.cs
new file mode 100644
index 0000000..e0d01a6
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/wms/SYSHelper.cs
@@ -0,0 +1,43 @@
+锘縰sing HH.WCS.HangYang.util;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.wms
+{
+    internal class SYSHelper
+    {
+        private static object locker = new object();
+        internal static int GetSerialNumber(string snType, string prefix) {
+            int result = 0;
+            lock (locker) {
+                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++;
+                    if (db.Ado.ExecuteCommand($"update OI_SYS_MAXID set CN_N_MAX={sId.CN_N_MAX} where CN_S_TYPE='{snType}' and CN_S_PRE='{prefix}' ") > 0) {
+                        result = sId.CN_N_MAX;
+                    }
+                }
+                else {
+                    //鎻掑叆琛�+                    sId = new OI_SYS_MAXID { CN_S_TYPE = snType, CN_S_PRE = prefix, CN_N_MAX = 1 };
+                    result = db.Insertable<OI_SYS_MAXID>(sId).ExecuteCommand() > 0 ? 1 : 0;
+
+                }
+            }
+            return result;
+        }
+
+        [SugarTable("OI_SYS_MAXID")]
+        public class OI_SYS_MAXID
+        {
+            public string CN_S_TYPE { get; set; }
+            public string CN_S_PRE { get; set; }
+            public int CN_N_MAX { get; set; }
+        }
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs b/HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs
new file mode 100644
index 0000000..c909a2e
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/wms/WCSHelper.cs
@@ -0,0 +1,258 @@
+锘縰sing HH.WCS.HangYang.util;
+using NLog.Fluent;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.HangYang.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(WCSTask task, string status)
+        {
+            var res = false;
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            var lcrList = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE.Trim() == task.S_CNTR_CODE).First();
+            task.S_B_STATE = status;
+            task.S_NOTE = lcrList == null ? task.S_NOTE : lcrList.S_ACTION_SRC;
+            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE,it.S_NOTE }).ExecuteCommand();
+            return res;
+        }
+        internal static bool UpdateStatus(WCSTask task)
+        {
+            var res = false;
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            task.S_B_STATE = WCSTask.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(WCSTask task)
+        {
+            var res = false;
+            var db = new SqlHelper<WCSTask>().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 bool UpdateInfo(WCSTask task, string sourceNo, string endBit, string status)
+        {
+            var res = false;
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            task.S_B_STATE = status;
+            task.S_OP_CODE = sourceNo;
+            task.S_END_LOC = endBit;
+            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.S_OP_CODE, it.S_END_LOC }).ExecuteCommand();
+            return res;
+        }
+        internal static WCSTask GetTask(string no)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            var task = db.Queryable<WCSTask>().Where(a => a.S_CODE.Trim() == no).First();
+            return task;
+        }
+
+       
+        internal static List<WCSTask> GetTaskBycntrcode(string no)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            var task = db.Queryable<WCSTask>().Where(a => a.S_CNTR_CODE.Trim() == no && a.S_B_STATE.Trim() == "瀹屾垚").ToList();
+            return task;
+        }
+        internal static WCSTask GetTaskBySrcNo(string no)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == no).First();
+            return task;
+        }
+        internal static List<WCSTask> GetTaskByStart(string bit)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            var task = db.Queryable<WCSTask>().Where(a => a.S_START_LOC == bit).ToList();
+            return task;
+        }
+        internal static List<WCSTask> GetTaskByEnd(string bit)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            var task = db.Queryable<WCSTask>().Where(a => a.S_END_LOC == bit).ToList();
+            return task;
+        }
+        internal static List<WCSTask> GetTaskByType(string taskType)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            return db.Queryable<WCSTask>().Where(a => a.S_TYPE == taskType).ToList();
+        }
+        internal static bool CreateTask(string no, string from, string to, string taskType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1)
+        {
+            var fromLoc = LocationHelper.GetLocation(from);
+            var endLoc = LocationHelper.GetLocation(to);
+            WCSTask TN_Task = new WCSTask()
+            {
+                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,
+                S_OP_CODE = no,
+                N_PRIORITY = pri,
+                N_SCHEDULE_TYPE = 1,
+                N_B_STATE = 0,
+                S_B_STATE = WCSTask.GetStateStr(0),
+                S_CNTR_CODE = cntrInfo,
+                N_START_LAYER = startLayer,
+                N_END_LAYER = endLayer,
+                N_CNTR_COUNT = cntrCount
+
+            };
+
+            return CreateTask(TN_Task);
+        }
+        internal static bool CreateTask(string no, Location from, Location to, string taskType, int scheduleType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1)
+        {
+            WCSTask TN_Task = new WCSTask()
+            {
+                S_CODE = GenerateTaskNo(),
+                S_START_AREA = from.S_AREA_CODE,
+                S_END_AREA = to.S_AREA_CODE,
+                S_START_LOC = from.S_CODE,
+                S_END_LOC = to.S_CODE,
+                S_TYPE = taskType,
+                S_OP_CODE = no,
+                N_PRIORITY = pri,
+                N_SCHEDULE_TYPE = scheduleType,
+                S_B_STATE = WCSTask.GetStateStr(0),
+                S_SCHEDULE_TYPE = WCSTask.GetSchedule(scheduleType),
+                S_CNTR_CODE = cntrInfo,
+                N_START_LAYER = startLayer,
+                N_END_LAYER = endLayer,
+                N_CNTR_COUNT = cntrCount
+
+            };
+            return CreateTask(TN_Task);
+        }
+        internal static bool CheckExist(string no)
+        {
+            return GetTask(no) != null;
+        }
+        internal static bool UpdateStatus(string no, int state)
+        {
+            var res = false;
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            var task = db.Queryable<WCSTask>().Where(a => a.S_CODE == no).First();
+            if (task != null)
+            {
+                task.N_B_STATE = state;
+                task.S_B_STATE = WCSTask.GetStateStr(state);
+                //闇�鍒ゆ柇浠诲姟鏄惁澶辫触鎴栬�宸插畬鎴愶紝涓嶅厑璁稿啀淇敼
+                res = db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand() > 0;
+            }
+            return res;
+        }
+        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData)
+        {
+            var db = new SqlHelper<TaskAction>().GetInstance();
+            var action = new TaskAction()
+            {
+                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 bool CheckActionRecordExist(string no, int code)
+        {
+            var db = new SqlHelper<TaskAction>().GetInstance();
+            return db.Queryable<TaskAction>().Count(a => a.S_TASK_CODE == no && a.N_ACTION_CODE == code) > 0;
+        }
+        internal static void Begin(WCSTask task)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            if (task != null)
+            {
+                if (task.N_B_STATE == 1)
+                {
+                    task.N_B_STATE = 2;
+                    task.S_B_STATE = WCSTask.GetStateStr(task.N_B_STATE);
+                    task.T_START_TIME = DateTime.Now;
+                    db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME }).ExecuteCommand();
+                }
+
+            }
+        }
+        internal static void End(WCSTask task)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            if (task != null)
+            {
+                task.N_B_STATE = 3;
+                task.S_B_STATE = WCSTask.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(WCSTask task)
+        {
+            var db = new SqlHelper<WCSTask>().GetInstance();
+            if (task != null)
+            {
+                //鍒ゆ柇鏈夋病鏈夊彇璐у畬鎴愶紝娌℃湁灏卞彉鎴愬け璐ャ�鏈夊彇璐у畬鎴愰粯璁ゅ畬鎴愪簡锛堣窡鎹」鐩�瀹氾紝鏈変簺椤圭洰浜哄伐鎷夎蛋浜嗕篃娌℃湁鏀惧埌缁堢偣锛夈�
+                task.N_B_STATE = 4;
+                task.S_B_STATE = WCSTask.GetStateStr(task.N_B_STATE);
+                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
+            }
+        }
+        internal static bool CreateTask(WCSTask TN_Task)
+        {
+            try
+            {
+                var db = new SqlHelper<WCSTask>().GetInstance();
+                return db.Insertable(TN_Task).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                throw;
+            }
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁浠诲姟鐘舵�鑾峰彇浠诲姟
+        /// </summary>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<WCSTask> GetTaskListByState(string status)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WCSTask>().Where(a => a.S_B_STATE.Trim() == status).OrderBy(s=>s.T_CREATE).ToList();
+
+        }
+
+        
+
+        internal static List<WCSTask> GetTaskListByState(int state)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WCSTask>().Where(a => a.N_B_STATE == state).ToList();
+        }
+        internal static List<WCSTask> GetWaitingTaskList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WCSTask>().Where(a => a.N_B_STATE == 0).ToList();
+        }
+
+        
+    }
+}
diff --git a/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
new file mode 100644
index 0000000..099bb7f
--- /dev/null
+++ b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
@@ -0,0 +1,1241 @@
+锘縰sing HH.WCS.HangYang.api;
+using HH.WCS.HangYang.LISTA.models;
+using HH.WCS.HangYang.models.other;
+using HH.WCS.HangYang.util;
+using Newtonsoft.Json;
+using NLog;
+using NLog.Fluent;
+using Opc.Ua;
+using SqlSugar;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Runtime.Remoting.Messaging;
+using System.Security.Cryptography.X509Certificates;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using static HH.WCS.HangYang.api.ApiModel;
+
+namespace HH.WCS.HangYang.wms
+{
+    /// <summary>
+    /// wms绠″埌浣滀笟
+    /// </summary>
+    internal class WMSHelper
+    {
+        internal static string GenerateTaskNo()
+        {
+            var id = SYSHelper.GetSerialNumber("浣滀笟鍙�, "OP");
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"OP{date}{id.ToString().PadLeft(4, '0')}";
+        }
+        internal static string GenerateSortingNo()
+        {
+            var id = SYSHelper.GetSerialNumber("鍒嗘嫞鍗�, "SO");
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"SO{date}{id.ToString().PadLeft(4, '0')}";
+        }
+        internal static List<WMSTask> GetOperationListByState(string state)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.S_B_STATE == state).ToList();
+        }
+        internal static List<WMSTask> GetOperationListByState(int state)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == state).ToList();
+        }
+        internal static List<WMSTask> GetWaitingOperationList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == 0 || a.N_B_STATE == 3).ToList();
+        }
+        internal static PutawayOrder GetPutawayOrder(string no)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<PutawayOrder>().Where(a => a.S_NO == no).First();
+        }
+        internal static bool CreatePutawayOrder(PutawayOrder model)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = db.Insertable<PutawayOrder>(model).ExecuteCommand() > 0;
+            db.Insertable<PutawayDetail>(model.Details).ExecuteCommand();
+            return result;
+        }
+
+        internal static PutawayDetail GetPutawayOrderDetail(string no, string item_code)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<PutawayDetail>().Where(a => a.S_PUTAWAY_NO == no && a.S_ITEM_CODE == item_code).First();
+        }
+        internal static PutawayDetail GetPutawayOrderDetail(string item_code)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<PutawayDetail>().Where(a => a.S_ITEM_CODE == item_code && a.F_QTY - a.F_ACC_B_QTY > 0).OrderByDescending(a => a.T_CREATE).First();
+        }
+
+        internal static void UpdatePutawayOrderDetailQty(PutawayDetail model)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            db.Updateable(model).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand();
+        }
+
+
+        internal static ShippingOrder GetShippingOrder(string no)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<ShippingOrder>().Includes(a => a.Details).Where(a => a.S_NO == no).First();
+        }
+        internal static bool CreateShippingOrder(ShippingOrder model)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = db.Insertable<ShippingOrder>(model).ExecuteCommand() > 0;
+            db.Insertable<ShippingDetail>(model.Details).ExecuteCommand();
+            return result;
+        }
+
+        internal static bool CreateSortingOrder(List<string> list)
+        {
+            var res = false;
+            //閬嶅巻鑾峰彇鍙戣揣鍗曪紝鐒跺悗鍒ゆ柇搴撳瓨锛屽鏋滃叏閮芥病搴撳瓨锛屽垯涓嶇敓鎴愬垎鎷e崟锛屽鏋滄湁鐢熸垚鍒嗘嫞鍗�+            //鏇存柊娉㈡鍗曪紝鍗充娇鍙湁涓�釜鍙戣揣鍗曚篃鏇存柊娉㈡鍗�+            var db = new SqlHelper<object>().GetInstance();
+            var sortingOrderNo = "";
+            SortingOrder sortingOrder = null;
+            try
+            {
+                db.BeginTran();
+                list.ForEach(a =>
+                {
+                    var so = db.Queryable<ShippingOrder>().Includes(s => s.Details).Where(s => s.S_NO == a).First();
+                    //鍒ゆ柇搴撳瓨锛屽彧鏈夊凡缁忓叆搴撶殑鎵嶅彲浠ヨ绠楋紝鐮佺洏鐨勪笉绠楋紝鍏ュ簱鍚庡嚭搴撻�涓殑涔熻璁$畻锛岀爜鐩樺悗榛樿鍙緟鍏ュ簱锛屽叆搴撳悗鍙甯�+                    //鐢熸垚鍑哄簱浠诲姟锛屽彧鏈夋墭鐩樹綅缃湪绔嬪簱鎵嶉渶瑕佸垱寤哄嚭搴撲换鍔★紙鍏堝啓姝荤珛搴擄級
+                    //鍙湁鍏ㄩ儴鍒嗘嫞瀹屾垚鎵嶅厑璁稿洖搴擄紙涓�釜鎵樼洏鍙兘瀵瑰簲澶氫釜鍒嗘嫞鏄庣粏锛�+
+                    //鏌ユ壘浠撳簱閲忚〃鍜屽簱鍖洪噺琛紝鍑哄簱鍗曢渶瑕佸畾浣嶄粨搴撳拰搴撳尯浜嗭紝鍑哄簱瀹氫綅鐗╃悊搴撳尯灏辫锛屽叆搴撳彲鑳界墿鏂欏簱鍖鸿繕瑕佸尯鍒嗛�杈戝簱鍖�+
+                    //鏆傛椂鍙煡浠撳簱閲忚〃锛堥噺琛ㄥ浣曢噸缃紝鏌ユ壘鎵�湁鏌ユ壘C_ENABLE=N鐨勶紝鍒ゆ柇濡傛灉鍦ㄤ粨搴撲腑锛屾敼鎴怸锛岀劧鍚庣粺璁★級
+
+                    //鐢熸垚鍒嗘嫞鍗曟椂鍊欏鍔犱粨搴撻噺琛ㄥ垎閰嶉噺锛岀敓鎴愬垎鎷e崟鏄庣粏鏃跺�锛屽鍔犲簱鍖洪噺琛ㄥ垎閰嶉噺
+                    if (so != null && so.Details.Count > 0)
+                    {
+                        var fail = true;
+                        for (int i = 0; i < so.Details.Count; i++)
+                        {
+                            var whi = db.Queryable<WHInventory>().Where(w => w.S_ITEM_CODE == so.Details[i].S_ITEM_CODE).First();
+                            if (whi != null && whi.F_QTY - whi.F_ALLOC_QTY > 0)
+                            {
+                                //鏈夎揣灏卞嚭
+                                float qty = whi.F_QTY - whi.F_ALLOC_QTY > so.Details[i].F_QTY ? so.Details[i].F_QTY : whi.F_QTY - whi.F_ALLOC_QTY;
+                                fail = false;
+                                //鏈夊彲鐢ㄥ簱瀛橈紝鐢熸垚鍒嗘嫞鍗�+                                if (sortingOrderNo == "")
+                                {
+                                    sortingOrderNo = GenerateSortingNo();
+                                    sortingOrder = new SortingOrder
+                                    {
+                                        S_NO = sortingOrderNo,
+                                        S_SHIPPING_NO = so.S_NO,
+                                        Composes = new List<SortingCompose>()
+                                    };
+                                    //鍒涘缓鍒嗘嫞鍗�+                                    db.Insertable(sortingOrder).ExecuteCommand();
+                                }
+                                else
+                                {
+                                    //鑾峰彇鏈�柊鍒嗘嫞鍗�+                                    sortingOrder = db.Queryable<SortingOrder>().Includes(s => s.Composes).Where(s => s.S_NO == sortingOrderNo).First();
+                                    //鏇存柊鍒嗘嫞鍗曚腑鐨勫彂璐у崟鍗曞彿
+                                    sortingOrder.S_SHIPPING_NO = sortingOrder.S_SHIPPING_NO + ";" + so.S_NO;
+                                    sortingOrder.T_MODIFY = DateTime.Now;
+                                    db.Updateable(sortingOrder).UpdateColumns(it => new { it.S_SHIPPING_NO, it.T_MODIFY }).ExecuteCommand();
+                                }
+                                //鏌ヨ鍒嗘嫞鍗曞瓙琛紙姝e父鎯呭喌杩橀渶瑕佸鍔犳壒娆″垽鏂級
+                                var soc = db.Queryable<SortingCompose>().Where(s => s.S_ITEM_CODE == so.Details[i].S_ITEM_CODE && s.S_SORTING_NO == sortingOrder.S_NO).First();
+                                if (soc == null)
+                                {
+                                    soc = new SortingCompose
+                                    {
+                                        S_ITEM_CODE = so.Details[i].S_ITEM_CODE,
+                                        S_SORTING_NO = sortingOrder.S_NO,
+                                        F_QTY = qty,
+                                        N_ROW_NO = sortingOrder.Composes.Count() + 1,
+                                        S_BATCH_NO = so.Details[i].S_BATCH_NO
+                                    };
+
+                                    //鍒涘缓鍒嗘嫞鍗曞瓙琛�+                                    db.Insertable(soc).ExecuteCommand();
+                                }
+                                else
+                                {
+                                    soc.F_QTY += qty;
+                                    soc.T_MODIFY = DateTime.Now;
+                                    //鏇存柊鍒嗘嫞鍗曞瓙琛�+                                    db.Updateable(soc).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
+                                }
+                                //鏇存柊浠撳簱閲忚〃鍒嗛厤閲�+                                whi.F_ALLOC_QTY += qty;
+                                whi.T_MODIFY = DateTime.Now;
+                                db.Updateable(whi).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
+                                //璺熸柊鍙戣揣鍗曞瓙琛ㄩ厤璐ф暟閲�+                                so.Details[i].F_ACC_D_QTY += qty;
+                                so.Details[i].T_MODIFY = DateTime.Now;
+                                db.Updateable(so.Details[i]).UpdateColumns(it => new { it.F_ACC_D_QTY, it.T_MODIFY }).ExecuteCommand();
+                            }
+
+                        }
+                        //鏇存柊鍙戣揣鍗曠姸鎬�+                        so.N_B_STATE = fail ? 5 : 1;
+                        if (fail)
+                        {
+                            so.S_NOTE = "娌℃湁搴撳瓨";
+                        }
+                        so.S_WAVE_CODE = sortingOrderNo;
+                        so.T_MODIFY = DateTime.Now;
+                        db.Updateable(so).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY, it.S_WAVE_CODE, it.S_NOTE }).ExecuteCommand();
+
+                    }
+
+
+                    //鏌ユ壘搴撳尯鍐呮墭鐩樼敓鎴愭墭鐩樻槑缁嗭紙鍖呮嫭鍒嗘嫞涓級鎬庝箞鍒ゆ柇搴撳唴锛熸煡鎵捐揣浣嶇粦瀹氾紵杩樻槸鎵樼洏涓婂姞鏍囪瘑姣旇緝濂斤紝濡傛灉鏄暣鎵樺嚭鐨勶紝鍒嗘嫞纭鍚庡幓鎺夊垎鎷f爣璇嗐�
+                    //1銆佸彧鏈夌爜鐩樺叆搴撳悗鐨勬墠闇�鍔犳爣璇嗭紝鍒嗘嫞鍥炵殑涓嶇敤锛屽垎鎷e洖鐨勬爣璇嗚繕鍦紝娌℃湁鍙樸�鍐欐鐮佺洏鍏ョ殑瀹屾垚鍚庡姞鏍囪瘑锛屾暣鎵樺垎鎷g殑鍘绘帀鏍囪瘑锛岄槻姝㈠悗闈㈤噸鏂扮爜鐩樿剰鏁版嵁
+                    //2銆佹垨鑰呭叧鑱旀煡璇㈠簱鍐呯殑锛屽彧缁欏垎鎷e嚭鐨勫姞鏍囪瘑锛屾瘡娆″垎鎷e洖鍐嶆妸鏍囪瘑娓呴櫎浜嗭紙濡傛灉涓嶆竻闄ゅ甫鏍囪瘑鐨勪細寰堝锛岃繕涓嶅鍏ㄩ儴鍔犳爣璇嗭級锛屾暣鎵樼殑娓呴櫎銆�+                    //缁煎悎閫夋嫨杩樻槸鏂规1锛岃繖鏍峰垱寤哄垎鎷f槑缁嗭紝鍙渶瑕佹墭鐩樼墿鏂欎袱琛ㄦ煡璇㈠氨鑳藉畾浣嶆墭鐩橈紙濡傛灉淇℃伅涓嶅噯锛屽彲浠ラ噸缃級锛屾柟妗�闇�璐т綅銆佹墭鐩樸�鐗╂枡涓夎〃鑱旀煡
+
+                    //鏆傛椂涓嶈搴撳尯锛屾爣璇嗙敤瀹瑰櫒琛�C_ENABLE 鏉ュ垽鏂紝琛ㄧず鑳戒笉鑳藉嚭搴�+
+                    //鎵ц鍒嗘嫞鍒涘缓浠诲姟锛岄亶鍘嗗垎鎷f槑缁嗕腑鐨勬墭鐩橈紝濡傛灉鍦ㄤ粨搴撳氨鍑哄簱锛屽鏋滀笉鍦ㄥ氨涓嶇敤鍑哄簱
+
+
+                });
+                //鍏ㄩ儴鍒嗘嫞鍗曠敓鎴愪箣鍚庡皢鍒嗘嫞鍗曠姸鎬佽缃负寮�閰嶈揣,娉㈡鍙蜂负鍙戣揣鍗�+                sortingOrder = db.Queryable<SortingOrder>().Where(s => s.S_NO == sortingOrderNo).First();
+                sortingOrder.N_B_STATE = 1;
+                sortingOrder.T_MODIFY = DateTime.Now;
+                db.Updateable(sortingOrder).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+                db.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                db.RollbackTran();
+            }
+            return res;
+
+        }
+
+        internal static List<SortingDetail> GetSortingDetailByCntr(string cntr)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = db.Queryable<SortingDetail>().Where(a => a.S_CNTR_CODE == cntr && a.N_B_STATE != 2).ToList();
+            return result;
+        }
+
+        internal static bool CreateWmsTask(WMSTask wmsTask)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                return db.Insertable<WMSTask>(wmsTask).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                throw;
+            }
+        }
+
+        internal static WMSTask GetWmsTaskByCntr(string cntr, bool active = true)
+        {
+            WMSTask result = null;
+            var db = new SqlHelper<object>().GetInstance();
+            if (active)
+            {
+                result = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Contains(cntr) && a.N_B_STATE < 2).First();
+            }
+            else
+            {
+                result = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Contains(cntr)).First();
+            }
+            return result;
+        }
+
+        internal static Location GetEnd(WMSTask a)
+        {
+            throw new NotImplementedException();
+        }
+
+        internal static Location GetStart(WMSTask a)
+        {
+            throw new NotImplementedException();
+        }
+
+        internal static void UpdateTaskState(WMSTask task)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            task.T_MODIFY = DateTime.Now;
+            task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
+            db.Updateable<WMSTask>(task).UpdateColumns(a => new { a.N_B_STATE, a.S_B_STATE, a.T_MODIFY }).ExecuteCommand();
+        }
+
+        internal static bool UpdateTaskEnd(WMSTask a)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            a.T_MODIFY = DateTime.Now;
+            return db.Updateable<WMSTask>(a).UpdateColumns(it => new { it.S_END_LOC, it.T_MODIFY }).ExecuteCommand() > 0;
+        }
+
+        internal static WMSTask GetWmsTask(string code)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.S_CODE == code).First();
+        }
+
+        internal static void CreateSortingOrderDetail(string so_no)
+        {
+            //鍒嗘嫞鍗曢厤璐�+            var db = new SqlHelper<object>().GetInstance();
+            var so = db.Queryable<SortingOrder>().Includes(a => a.Composes).Where(a => a.S_NO == so_no && (a.N_B_STATE == 1 || a.N_B_STATE == 20)).First();// 
+            if (so != null && so.Composes.Count > 0)
+            {
+                db.BeginTran();
+                try
+                {
+                    int rowNo = 1;
+                    so.Composes.ForEach(a =>
+                    {
+                        //鎸夊垎鎷e崟瀛愯〃鍘婚厤璐э紝鏌ユ壘鍙敤鎵樼洏(鍏堟煡鎵�湁绗﹀悎鐨勶紝鍚庨潰鍐嶄紭鍖�
+                        int param1 = 10;
+                        int param2 = 20;
+
+                        Expression<Func<int, bool>> exp = x => x > param1;
+
+                        var cirList = db.Queryable<CntrItemDetail>().Includes(c => c.Cntr).Where(c => c.Cntr.C_ENABLE == "Y" && c.S_ITEM_CODE == a.S_ITEM_CODE && (c.F_QTY - c.F_ALLOC_QTY) > 0).OrderBy(c => c.T_CREATE).ToList();
+                        for (int i = 0; i < cirList.Count; i++)
+                        {
+                            var cir = cirList[i];
+                            var sd = new SortingDetail
+                            {
+                                N_ROW_NO = rowNo,
+                                S_BATCH_NO = a.S_BATCH_NO,
+                                S_ITEM_CODE = a.S_ITEM_CODE,
+                                S_CNTR_CODE = cir.S_CNTR_CODE,
+                                S_SORTING_NO = a.S_SORTING_NO
+                            };
+                            bool needBreak = false;
+                            if (cir.F_QTY - cir.F_ALLOC_QTY >= (a.F_QTY - a.F_ACC_S_QTY))
+                            {
+                                //瀹瑰櫒鍙敤鏁伴噺澶т簬鍒嗘嫞鍗曞瓙琛ㄨ姹傜殑鏁伴噺锛岀敓鎴愬垎鎷f槑缁嗭紝鐒跺悗璺冲嚭寰幆
+                                sd.F_QTY = a.F_QTY - a.F_ACC_S_QTY;
+                                needBreak = true;
+                            }
+                            else
+                            {
+                                //鐢熸垚鍒嗘嫞鏄庣粏锛岀户缁垱寤�+                                sd.F_QTY = cir.F_QTY - cir.F_ALLOC_QTY;
+                            }
+                            db.Insertable(sd).ExecuteCommand();
+                            rowNo++;
+                            //鏇存柊瀹瑰櫒璐у搧琛ㄥ垎閰嶉噺
+                            cir.F_ALLOC_QTY += sd.F_QTY;
+                            cir.T_MODIFY = DateTime.Now;
+                            db.Updateable(cir).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
+                            //鏇存柊鍒嗘嫞鍗曞瓙琛ㄧ殑閲�+                            a.F_ACC_S_QTY += sd.F_QTY;
+                            a.T_MODIFY = DateTime.Now;
+                            db.Updateable(cir).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
+                            if (needBreak)
+                            {
+                                break;
+                            }
+                        }
+                    });
+                    //鍏ㄩ儴鍒嗘嫞鍗曞瓙琛ㄧ敓鎴愬垎鎷f槑缁嗭紝淇敼鍒嗘嫞鍗曠姸鎬佷负閰嶈揣瀹屾垚(鍙嶆浠撳簱鐨勮揣鑳介厤鐨勯兘閰嶅畬浜嗭紝闄ら潪鏁版嵁鏈夊紓甯�
+                    so.N_B_STATE = 2;
+                    so.T_MODIFY = DateTime.Now;
+                    db.Updateable(so).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+                    db.CommitTran();
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message);
+                    db.RollbackTran();
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇寮�閰嶈揣鐨勫垎鎷e崟锛屼竴娆℃�鐢熸垚鍒嗘嫞鏄庣粏锛岄伩鍏嶇敓鎴愪竴鍗婂啀鐢熸垚锛屾墍浠ュ垱寤哄垎鎷f槑缁嗙殑鏃跺�鍔犱笂浜嬪姟
+        /// </summary>
+        /// <returns></returns>
+        internal static List<SortingOrder> GetWaitingSortingOrderList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<SortingOrder>().Includes(a => a.Composes).Where(a => a.N_B_STATE == 1 || a.N_B_STATE == 20).ToList();
+        }
+        /// <summary>
+        /// 鑾峰彇閰嶈揣瀹屾垚鐨勫垎鎷e崟锛屾瘡涓垎鎷e崟鍗曠嫭鍒涘缓鍒嗘嫞浣滀笟
+        /// </summary>
+        /// <returns></returns>
+        internal static List<SortingOrder> GetWaitingSortingOperationList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<SortingOrder>().Includes(a => a.Details).Where(a => a.N_B_STATE == 2 || a.N_B_STATE == 3).ToList();
+        }
+
+        /// <summary>
+        ///鍗曚釜鍒嗘嫞鍗曠殑鍒嗘嫞鏄庣粏鍒涘缓浣滀笟
+        /// </summary>
+        internal static void CreateSortingOperation(SortingOrder so)
+        {
+            var list = so.Details.Where(a => a.N_B_STATE == 0).ToList();
+            var db = new SqlHelper<object>().GetInstance();
+            if (list.Count > 0)
+            {
+                try
+                {
+                    db.BeginTran();
+                    list.GroupBy(g => g.S_CNTR_CODE).ToList().ForEach(g =>
+                    {
+                        var cntr = g.Key;
+                        var sdList = g.ToList();
+                        //鏌ヨ鎵樼洏璐т綅锛屾煡鍒颁簡鍒涘缓浠诲姟锛屾煡涓嶅埌璇存槑鍦ㄥ埆鐨勫垎鎷d綔涓氫腑锛屼笉鍒涘缓浠诲姟锛岄渶瑕佸洖搴撳悗閲嶆柊鍒涘缓
+                        var lcr = db.Queryable<LocCntrRel>().Where(c => c.S_CNTR_CODE == cntr).First();
+                        if (lcr != null)
+                        {
+                            //鍒ゆ柇鎵樼洏鏄惁宸茬粡鍒涘缓浠诲姟浜嗭紝鍙兘澶氫釜鍒嗘嫞鏄庣粏鏄悓涓�釜鎵樼洏锛屽鏋滃垱寤轰换鍔′簡锛屽叾瀹冨垎鎷g殑瑕佺◢鍚庯紝鍙嚭涓�浜哄伐浼氭悶涓嶆竻妤氭槸鍝釜鍒嗘嫞鍗曠殑
+                            var wmsTask = db.Queryable<WMSTask>().Where(op => op.S_CNTR_CODE.Contains(cntr) && op.N_B_STATE < 2).First();
+                            if (wmsTask == null)
+                            {
+                                wmsTask = new WMSTask
+                                {
+                                    S_CNTR_CODE = cntr,
+                                    S_CODE = WMSHelper.GenerateTaskNo(),
+                                    S_START_LOC = lcr.S_LOC_CODE,
+                                    S_END_LOC = "",
+                                    N_TYPE = 2,
+                                    S_TYPE = WMSTask.GetTypeStr(2),
+                                    S_OP_DEF_CODE = "",
+                                    S_OP_DEF_NAME = "鍒嗘嫞鍑虹珛搴�
+                                };
+                                if (db.Insertable(wmsTask).ExecuteCommand() > 0)
+                                {
+                                    LocationHelper.LockLoc(lcr.S_LOC_CODE, 2);
+                                }
+
+                                sdList.ForEach(a =>
+                                {
+                                    a.N_B_STATE = 1;
+                                    a.T_MODIFY = DateTime.Now;
+                                    db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+                                });
+                            }
+                        }
+                        //淇敼鍒嗘嫞鍗曠姸鎬佷负寮�浣滀笟锛堜笉浠h〃浣滀笟鍏ㄩ儴鍒涘缓浜嗭紝鍥犱负鏈夌殑鎵樼洏鍙兘宸茬粡琚崰鐢ㄤ簡锛�+                        so.N_B_STATE = 3;
+                        //濡傛灉鎵�湁鐨勪綔涓氶兘宸茬粡鍒涘缓浜嗭紝灏辫缃负浣滀笟宸茬粡鍒涘缓
+                        if (so.Details.Count(s => s.N_B_STATE == 0) == 0)
+                        {
+                            so.N_B_STATE = 4;
+                        }
+                        so.T_MODIFY = DateTime.Now;
+                        db.Updateable(so).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+
+                    });
+                    db.CommitTran();
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message);
+                    db.RollbackTran();
+                }
+
+            }
+        }
+        internal static void SortingConfrim(List<SortingResultCheck> models)
+        {
+            if (models.Count > 0)
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                try
+                {
+                    db.BeginTran();
+                    //鍏堟煡瀵昏鍒嗘嫞鍗曟墍鏈夋墽琛屼腑鐨勫垎鎷f槑缁�+                    var sdList = db.Queryable<SortingDetail>().Where(a => a.S_SORTING_NO == models[0].sortNo).ToList();
+                    var soList = db.Queryable<ShippingOrder>().Includes(a => a.Details).Where(a => a.S_WAVE_CODE == models[0].sortNo).ToList();
+                    //鏌ュ嚭鎵�湁鍏宠仈鐨勫彂璐у崟
+                    models.ForEach(a =>
+                    {
+                        //鏍规嵁鏉$洰淇敼绱鍒嗘嫞鏁伴噺锛屾坊鍔犲垎鎷g粨鏋滆〃锛屽悓鏃舵壒鍒嗗埌鍙戣揣鍗曚腑
+                        var sd = sdList.Where(b => b.S_ITEM_CODE == a.itemCode).First();
+                        //绠�崟涓�偣锛岃姹備汉宸ュ繀椤讳竴娆℃�鍒嗘嫞瀹岋紝鍒嗘嫞鏁伴噺鍜屽垎鎷f槑缁嗕腑涓�嚧鎵嶅垱寤哄垎鎷g粨鏋滐紝涓嶆敮鎸佷竴鏉″垎鎷f槑缁嗗娆″垎鎷o紝澶氭潯鍒嗘嫞缁撴灉
+                        //(sd.F_QTY - sd.F_ACC_SR_QTY) == a.qty
+                        if (sd != null && sd.F_QTY == a.qty)
+                        {
+                            //鏌ヨ鍒嗘嫞缁撴灉鏄惁宸茬粡瀛樺湪锛屽瓨鍦ㄥ氨绱姞
+                            //鍒嗘嫞鍗曠粨鏋�+                            var sdr = new SortingResult
+                            {
+                                S_SORTING_NO = models[0].sortNo,
+                                F_QTY = a.qty,
+                                N_ROW_NO = sd.N_ROW_NO,
+                                S_ITEM_CODE = sd.S_ITEM_CODE,
+                                S_ITEM_NAME = "",
+                                S_BATCH_NO = sd.S_BATCH_NO,
+                                S_CNTR_CODE = a.cntrCode
+                            };
+                            db.Insertable(sdr).ExecuteCommand();
+                            //sd.F_ACC_SR_QTY += a.qty;
+                            sd.N_B_STATE = 2;
+                            sd.T_MODIFY = DateTime.Now;
+                            db.Updateable(sd).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+                            //鎵瑰垎鍒板彂璐у崟涓�+                            var dList = soList.SelectMany(s => s.Details).Where(d => d.S_ITEM_CODE == a.itemCode && (d.F_QTY - d.F_ACC_S_QTY) > 0).ToList();
+                            var qty = a.qty;
+                            for (int i = 0; i < dList.Count; i++)
+                            {
+                                var d = dList[i];
+                                //鍙戣揣淇℃伅涓棿琛�+
+                                if (d.F_QTY - d.F_ACC_S_QTY >= a.qty)
+                                {
+                                    //鍙戣揣鍗曟暟閲忚秴杩囨墭鐩樺垎鎷f暟閲忥紝鎵瑰垎qty
+                                    d.F_ACC_S_QTY += a.qty;
+                                    qty = 0;
+                                }
+                                else
+                                {
+                                    // 鍙戣揣鍗曟暟閲忓皬浜庢墭鐩樺垎鎷f暟閲�+                                    d.F_ACC_S_QTY = d.F_QTY;
+                                    qty -= (d.F_QTY - d.F_ACC_S_QTY);
+                                }
+                                d.T_MODIFY = DateTime.Now;
+                                db.Updateable(d).UpdateColumns(it => new { it.F_ACC_S_QTY, it.T_MODIFY }).ExecuteCommand();
+                                //鎻掑叆鍒板ぇ鍏冨嚭搴撲腑闂磋〃
+                                if (qty == 0)
+                                {
+                                    break;
+                                }
+
+                            }
+                            //鏇存柊鎵樼洏鏄庣粏琛�+                            var cir = db.Queryable<CntrItemDetail>().Where(c => c.S_CNTR_CODE == a.cntrCode && c.S_ITEM_CODE == a.itemCode).First();
+                            cir.F_QTY -= a.qty;
+                            cir.F_ALLOC_QTY -= a.qty;
+                            cir.T_MODIFY = DateTime.Now;
+                            db.Updateable(cir).UpdateColumns(it => new { it.F_QTY, it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
+                            //鏇存柊浠撳簱閲忚〃鍜屽簱鍖洪噺琛�+                            //鏌ヨ浠撳簱閲忚〃
+                            var wi = db.Queryable<WHInventory>().Where(i => i.S_ITEM_CODE == a.itemCode).First();
+                            if (wi != null)
+                            {
+                                wi.F_QTY -= a.qty;
+                                wi.F_ALLOC_QTY -= a.qty;
+                                wi.T_MODIFY = DateTime.Now;
+                                db.Updateable(wi).UpdateColumns(it => new { it.F_QTY, it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand();
+                            }
+                            //楹荤儲浜嗭紝鍒嗘嫞鏄庣粏鍙鎵樼洏锛屼笉璁颁綇璧风偣锛屽鏋滆缁熻搴撳尯閲忚〃锛屽繀椤诲鎵樼洏鍔犳爣璁帮紝璁板綍鎵樼洏鐨勬潵婧愬簱鍖猴紝鎵樼洏娓呯┖鍚庡啀娓呴櫎鏍囪
+
+                            //閫昏緫搴撳尯鏇翠笉闇�閲忚〃浜嗭紝鍥犱负浠庝竴涓�杈戝簱鍖哄嚭鏉ワ紝鍙兘鍥炲叾瀹冮�杈戝簱鍖猴紝閭e氨搴旇鐩存帴鍒犻櫎閫昏緫搴撳尯閲忚〃锛屽悗闈㈠啀鍔犲埌鍒殑閫昏緫搴撳尯涓�+                            //浣嗘槸浼氬甫鏉ユ柊鐨勯棶棰橈紝灏辨槸鍒嗘嫞鍥炵殑鎵樼洏涓嶅睘浜庝换浣曢�杈戝簱鍖虹殑閲忥紝鍙湁鍥炲簱浜嗘墠鑳借绠楀埌
+
+                            //var aziList = db.Queryable<AZInventory>().Where(i => i.S_ITEM_CODE == a.itemCode).ToList();
+                        }
+
+                        //
+                    });
+                    //鍒ゆ柇鍒嗘嫞鍗曟槸鍚﹀叏閮ㄥ畬鎴�+                    if (sdList.Count(sd => sd.N_B_STATE != 2) == 0)
+                    {
+                        var spo = db.Queryable<SortingOrder>().Where(s => s.S_NO == models[0].sortNo).First();
+                        if (spo != null)
+                        {
+                            spo.N_B_STATE = 10;
+                            spo.T_MODIFY = DateTime.Now;
+                            db.Updateable(spo).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+                        }
+                    }
+                    //鍒ゆ柇鍙戣揣鍗曢厤璐ф槸鍚﹀垎鎷e畬鎴�+                    soList.ForEach(s =>
+                    {
+                        if (s.Details.Count > 0 && s.Details.Count(sd => sd.F_ACC_D_QTY != sd.F_ACC_S_QTY) == 0)
+                        {
+                            //閰嶈揣鍗曠殑鏁伴噺绛変簬鍒嗘嫞鐨勬暟閲忥紝鍒嗘嫞瀹屾垚
+                            s.N_B_STATE = 3;
+                            s.T_MODIFY = DateTime.Now;
+                            db.Updateable(s).UpdateColumns(it => new { it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
+                        }
+                    });
+                    db.CommitTran();
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message);
+                    db.RollbackTran();
+                }
+            }
+        }
+        internal static bool CheckSortingWholeCntr(string cntr, bool autoSort)
+        {
+            var result = false;
+            //鍒ゆ柇鍒嗘嫞鏄庣粏鏄笉鏄彧鏈変竴涓墭鐩橈紝濡傛灉鏄紝鍒ゆ柇瀹瑰櫒璐у搧鏄庣粏鏄笉鏄拰鍒嗘嫞鏄庣粏瀹屽叏涓�牱
+            var db = new SqlHelper<object>().GetInstance();
+            var sdList = db.Queryable<SortingDetail>().Where(a => a.S_CNTR_CODE == cntr).ToList();
+            if (sdList.Count > 0)
+            {
+                var groups = sdList.GroupBy(a => a.S_SORTING_NO).ToList();
+                if (groups.Count == 1)
+                {
+                    var list = groups.ToList();
+                    //鍙湁涓�釜鍒嗘嫞鍗曠殑鎯呭喌涓�鍒嗛厤閲忓拰鎵樼洏閲忛兘鐩稿悓锛岃〃绀烘槸鏁存墭
+                    var cirList = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE == cntr).ToList();
+                    if (list.Count == cirList.Count && cirList.Count(c => c.F_QTY != c.F_ALLOC_QTY) == 0)
+                    {
+                        result = true;
+                        if (autoSort)
+                        {
+                            var data = sdList.Select(s => new SortingResultCheck { cntrCode = s.S_CNTR_CODE, itemCode = s.S_ITEM_CODE, qty = s.F_QTY, sortNo = s.S_SORTING_NO }).ToList();
+                            SortingConfrim(data);
+
+                        }
+                    }
+                }
+            }
+            return result;
+        }
+        #region 鏉哀WMS甯姪鏂规硶
+        /// <summary>
+        /// 鏂板鍏ュ簱鍗�+        /// </summary>
+        /// <param name="order"></param>
+        /// <returns></returns>
+        internal static bool CreateOrderIn(List<InOrder> order)
+        {
+            try
+            {
+                bool res = false;
+                var db = new SqlHelper<object>().GetInstance();
+                db.BeginTran();
+                foreach (var orderItem in order)
+                {
+                    db.Insertable(orderItem).ExecuteCommand();
+                    db.Insertable(orderItem.InOrderDetail).ExecuteCommand();
+                }
+                db.CommitTran();
+                res = true;
+                return res;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error("鍒涘缓鍏ュ簱鍗曞け璐�, ex, "鏉哀");
+                return false;
+            }
+
+        }
+
+        /// <summary>
+        /// 鏂板鍑哄簱鍗�+        /// </summary>
+        /// <param name="order"></param>
+        /// <returns></returns>
+        internal static bool CreateOrderOut(List<OutOrder> order)
+        {
+            try
+            {
+                bool res = false;
+                var db = new SqlHelper<object>().GetInstance();
+                db.BeginTran();
+                foreach (var orderItem in order)
+                {
+                    db.Insertable(orderItem).ExecuteCommand();
+                    db.Insertable(orderItem.OutOrderDetail).ExecuteCommand();
+                }
+                db.CommitTran();
+                res = true;
+                return res;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error("鍒涘缓鍑哄簱鍗曞け璐�, ex, "鏉哀");
+                return false;
+            }
+
+        }
+        #endregion
+
+        #region 鏉哀鐗规畩甯姪鏂规硶
+
+        /// <summary>
+        /// 鏌ヨ鐗╂枡鐨勫睘鎬�+        /// </summary>
+        /// <param name="itemCode"></param>
+        /// <returns></returns>
+        internal static TN_Material GetItemType(string itemCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var lcrItem = db.Queryable<TN_Material>().Where(a => a.S_ITEM_CODE.Trim() == itemCode).First();
+            if (lcrItem == null)
+            {
+                return null;
+            }
+            return lcrItem;
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇闇�鍚堟墭鐨勬墭鐩�+        /// </summary>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <returns></returns>
+        internal static LocCntrRel GetLocMerge(string trayCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "鎵樼洏绔嬪簱鍖�).FirstOrDefault();
+            if (reservoirs == null)
+            {
+                LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鏉哀鐨勬墭鐩樼珛搴撳尯锛�, "鏉哀");
+                return null;
+            }
+            var lcrItem = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE.Trim() == trayCode).First();
+            // 璁$畻鏃堕棿鑼冨洿锛氬墠涓�ぉ鍜屼粖澶╃殑 00:00:00 鍒�23:59:59
+            DateTime yesterdayStart = DateTime.Today.AddDays(-1);
+            DateTime yesterdayEnd = DateTime.Today.AddDays(-1).AddDays(1).AddSeconds(-1);
+            DateTime NowdayStart = DateTime.Now.AddDays(-1);
+            DateTime NowdayEnd = DateTime.Now.AddDays(-1).AddDays(1).AddSeconds(-1);
+            var locCntrs = db.Queryable<LocCntrRel>().LeftJoin<CntrItemDetail>((p, m) => p.S_CNTR_CODE == m.S_CNTR_CODE)
+                .LeftJoin<TN_Material>((p, m, s) => m.S_ITEM_CODE == s.S_ITEM_CODE)
+                .Where((p, m, s) => p.T_CREATE >= yesterdayStart && p.T_CREATE < yesterdayEnd || p.T_CREATE >= NowdayStart && p.T_CREATE < NowdayEnd) // 鍓嶄竴澶╂垨鑰呬粖澶╃殑鏁版嵁
+                .Where((p, m, s) => m.S_ITEM_CODE == lcrItem.S_ITEM_CODE)
+                .Where((p, m, s) => m.F_QTY < s.F_MAX_QTY)
+                .OrderBy((p, m, s) => p.T_CREATE)
+                .Select((p, m, s) => p) // 閫夋嫨鎵樼洏鐗╂枡琛ㄧ殑鏁版嵁
+                .ToList();
+            //鍙煡璇㈢珛搴撶殑璐т綅
+            var locList = db.Queryable<Location>().Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.S_LOCK_STATE == "鏃�).Select(s => s.S_CODE.Trim()).ToList();
+            locCntrs = locCntrs.Where(p => locList.Contains(p.S_LOC_CODE.Trim())).ToList();
+            if (!locCntrs.Any())
+            {
+                return null;
+            }
+            return locCntrs.FirstOrDefault();
+
+        }
+
+        /// <summary>
+        /// 浠诲姟鐘舵�杞崲
+        /// </summary>
+        /// <param name="state">鐘舵�鍙�/param>
+        /// <returns></returns>
+        internal static string GetStateStr(int state)
+        {
+            //0 绛夊緟/1 鎵ц/2 瀹屾垚/3 閿欒/4 鍚姠澶辫触 /5 鏆傚仠鍚姠
+            var status = "";
+            switch (state)
+            {
+                case 0: status = "绛夊緟"; break;
+                case 1: status = "鎵ц"; break;
+                case 2: status = "瀹屾垚"; break;
+                case 3: status = "閿欒"; break;
+                case 4: status = "鍚姠澶辫触"; break;
+                case 5: status = "鏆傚仠鍚姠"; break;
+            }
+            return status;
+        }
+
+        /// <summary>
+        /// 鏌ヨ閰嶇洏鍗�+        /// </summary>
+        /// <param name="state">閰嶇洏鍗曠姸鎬�/param>
+        /// <returns></returns>
+        internal static List<DistributionCntr> GetPickingListByState(string state)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.S_B_STATE.Trim() == state).ToList();
+            return distributionCntr;
+        }
+
+        /// <summary>
+        /// 淇敼閰嶇洏鍗曠姸鎬�+        /// </summary>
+        /// <param name="state">鐘舵�</param>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <returns></returns>
+        internal static bool UpdateDistributionCntrState(string state,string trayCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.S_B_STATE.Trim() == "閰嶈揣瀹屾垚" && a.S_CNTR_CODE == trayCode ).First();
+            if (distributionCntr != null)
+            {
+
+                distributionCntr.S_B_STATE = state;
+                distributionCntr.N_B_STATE = 2;
+                return db.Updateable<DistributionCntr>(distributionCntr).UpdateColumns(it => new { it.S_B_STATE, it.N_B_STATE }).ExecuteCommand() > 0;
+            }
+            return false;
+        }
+
+        #endregion
+
+        #region 鏉哀浣滀笟閫昏緫鏂规硶
+
+        /// <summary>
+        /// 鏍规嵁鐘舵�鏌ヨ浣滀笟
+        /// </summary>
+        /// <param name="status"></param>
+        /// <returns></returns>
+        internal static List<WMSTask> GetWmsTaskListByState(string status)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == status).OrderBy(s => s.T_CREATE).ToList();
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐘舵�鍜屾墭鐩樺彿鏌ヨ浣滀笟
+        /// </summary>
+        /// <param name="status"></param>
+        /// <param name="trayCode"></param>
+        /// <returns></returns>
+        internal static WMSTask GetWmsTaskList(string status, string trayCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE == trayCode && a.S_B_STATE == status).OrderBy(s => s.T_CREATE).First();
+        }
+
+        /// <summary>
+        /// 浣滀笟鐘舵�淇敼
+        /// </summary>
+        /// <param name="task">浠诲姟</param>
+        /// <param name="status">鐘舵�</param>
+        /// <returns></returns>
+        internal static bool UpdateStatus(WMSTask task, int status)
+        {
+            var res = false;
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            task.N_B_STATE = status;
+            task.S_B_STATE = GetStateStr(status);
+            db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
+            return res;
+        }
+
+        /// <summary>
+        /// 鏍规嵁浣滀笟缂栫爜淇敼鐘舵�
+        /// </summary>
+        /// <param name="taskNo">浠诲姟鍙�/param>
+        /// <param name="status">鐘舵�</param>
+        /// <returns></returns>
+        internal static bool UpdateTaskStatus(string taskNo, int status)
+        {
+            var res = false;
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_CODE == taskNo).First();
+            task.N_B_STATE = status;
+            task.S_B_STATE = GetStateStr(status);
+            db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
+            return res;
+        }
+
+        /// <summary>
+        /// 鏍规嵁浠诲姟鐨勪綔涓氱紪鐮佷慨鏀圭姸鎬佸拰缁堢偣
+        /// </summary>
+        /// <param name="wcsTask"></param>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static bool UpdateWmsTask(WCSTask wcsTask, int state)
+        {
+            var res = false;
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_CODE == wcsTask.S_OP_CODE).First();
+            if (task != null)
+            {
+                task.N_B_STATE = state;
+                task.S_B_STATE = GetStateStr(state);
+                task.S_END_AREA = wcsTask.S_END_AREA;
+                task.S_END_LOC = wcsTask.S_END_LOC;
+                //闇�鍒ゆ柇浠诲姟鏄惁澶辫触鎴栬�宸插畬鎴愶紝涓嶅厑璁稿啀淇敼
+                res = db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.S_END_LOC, it.S_END_AREA }).ExecuteCommand() > 0;
+            }
+            return res;
+        }
+
+
+        #endregion
+
+        #region 鏉哀绔嬪簱鍑哄叆搴撻�杈戠畻娉�+        
+        /// <summary>
+        /// 绔嬪簱鍏ュ簱灏佽绠楁硶
+        /// </summary>
+        public class Warehouse
+        {
+            private readonly List<LocationParams> _locations;
+
+            private readonly Dictionary<int, int> _depthOuterMap = new Dictionary<int, int>
+        {
+            { 1, 2 }, // 绗�鎺掓繁浣嶅搴旂2鎺掑渚�+            { 4, 3 }  // 绗�鎺掓繁浣嶅搴旂3鎺掑渚�+        };
+
+            public Warehouse(Inbound inbound)
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                var locations = db.Queryable<Location>().Where(a => a.S_AREA_CODE == inbound.areaCode).ToList();
+                if(!string.IsNullOrEmpty(inbound.roadWay.ToString()))
+                {
+                    locations.RemoveAll(s => s.N_ROADWAY != inbound.roadWay);
+                }
+                _locations = new List<LocationParams>();
+
+                // 鍒濆鍖栨墍鏈夎揣浣�+                for (int r = 0; r < locations.Count; r++)
+                {
+                    bool isDepthRow = _depthOuterMap.ContainsKey(locations[r].N_ROW);
+                    bool isOuterRow = _depthOuterMap.Values.Contains(locations[r].N_ROW);
+                    // 娣变綅鎺掓湁鍙屾繁浣�+                    if (isDepthRow)
+                    {
+                        _locations.Add(new LocationParams
+                        {
+                            Row = locations[r].N_ROW,
+                            Column = locations[r].N_COL,
+                            Layer = locations[r].N_LAYER,
+                            roadWay = locations[r].N_ROADWAY,
+                            loationCode = locations[r].S_CODE,
+                            IsOccupied = locations[r].N_CURRENT_NUM > 0 ? true : false,
+                            HasOutboundLock = locations[r].S_LOCK_STATE == "鏃� ? false : true,
+                            Depth = 1,
+                            IsStorageDepth = true,
+                            IsOuterPosition = false
+                        });
+                    }
+                    // 鍏朵粬鎺掑彧鏈夊崟娣变綅
+                    else
+                    {
+                        _locations.Add(new LocationParams
+                        {
+                            Row = locations[r].N_ROW,
+                            Column = locations[r].N_COL,
+                            Layer = locations[r].N_LAYER,
+                            roadWay = locations[r].N_ROADWAY,
+                            loationCode = locations[r].S_CODE,
+                            Depth = 0,
+                            IsStorageDepth = false,
+                            IsOuterPosition = isOuterRow
+                        });
+                    }
+
+                }
+            }
+            /// <summary>
+            /// 璐т綅閿佸畾锛堢畻娉曞唴閿佸畾涓嶅疄闄呴攣瀹氳揣浣嶏級
+            /// </summary>
+            /// <param name="row"></param>
+            /// <param name="col"></param>
+            /// <param name="layer"></param>
+            public void SetOutboundLock(int row, int col, int layer)
+            {
+                var loc = _locations.FirstOrDefault(l =>
+                    l.Row == row && l.Column == col &&
+                    l.Layer == layer && l.IsStorageDepth);
+                if (loc != null) loc.HasOutboundLock = true;
+            }
+
+            public LocationParams FindNextStorageLocation()
+            {
+                // 闃舵1: 鏌ユ壘鎵�湁鍙敤娣变綅(鍚庢繁浣�
+                var depthLocs = _locations
+                    .Where(l => l.IsStorageDepth && !l.IsOccupied && !l.HasOutboundLock)
+                    .OrderBy(l => l.Row)
+                    .ThenBy(l => l.Column)
+                    .ThenBy(l => l.Layer);
+
+                foreach (var loc in depthLocs)
+                {
+                    int outerRow = _depthOuterMap.First(x => x.Key == loc.Row).Value;
+                    // 妫�煡鍓嶆繁浣嶆槸鍚﹁鍗犵敤
+                    var frontLoc = _locations.FirstOrDefault(l =>
+                        l.Row == outerRow && l.Column == loc.Column &&
+                        l.Layer == loc.Layer && l.Depth == 0);
+
+                    if (frontLoc == null || !frontLoc.IsOccupied)
+                        return loc;
+                }
+
+                // 闃舵2: 鏌ユ壘鏅�鎺�闈炴繁浣嶉潪澶栦晶)
+                var normalLoc = _locations
+                    .FirstOrDefault(l => !l.IsOuterPosition && !l.IsStorageDepth &&
+                                       !l.IsOccupied && !_depthOuterMap.Values.Contains(l.Row));
+                if (normalLoc != null) return normalLoc;
+
+                // 闃舵3: 鏈�悗鏌ユ壘澶栦晶鎺�纭繚瀵瑰簲娣变綅鏃犻攣)
+                foreach (var outerRow in _depthOuterMap.Values.OrderBy(r => r))
+                {
+                    // 鏌ユ壘璇ュ渚ф帓鎵�湁鍙敤璐т綅锛堟寜宸烽亾鍧囪 鎺掑簭锛�+                    var availableOuterLocs = _locations
+                        .Where(l => l.IsOuterPosition &&
+                                   l.Row == outerRow &&
+                                   !l.IsOccupied)
+                        .GroupBy(l => l.roadWay)
+                        .SelectMany(g => g.OrderBy(l => l.Row)
+                                        .ThenBy(l => l.Column)
+                                        .ThenBy(l => l.Layer));
+
+                    foreach (var outerLoc in availableOuterLocs)
+                    {
+                        // 鑾峰彇瀵瑰簲鐨勬繁浣嶆帓锛堢1鎺掓垨绗�鎺掞級
+                        var depthRow = _depthOuterMap.First(x => x.Value == outerLoc.Row).Key;
+
+                        // 鏌ユ壘瀵瑰簲娣变綅璐т綅锛堢浉鍚屽垪鍜屽眰锛�+                        var depthLoc = _locations.FirstOrDefault(l =>
+                            l.Row == depthRow &&
+                            l.Column == outerLoc.Column &&
+                            l.Layer == outerLoc.Layer &&
+                            l.IsStorageDepth);
+
+                        // 鍙湁瀵瑰簲娣变綅娌℃湁鍑哄簱閿佹椂鎵嶄娇鐢ㄦ澶栦晶璐т綅
+                        if (depthLoc != null && !depthLoc.HasOutboundLock)
+                        {
+                            return outerLoc;
+                        }
+                    }
+                }
+                return null; // 鏃犲彲鐢ㄤ綅缃�+            }
+            private readonly ConcurrentDictionary<string, SemaphoreSlim> _locationLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
+            
+            public async Task<LocationParams> StoreItemAsync()
+            {
+                LocationParams location = null;
+                try
+                {
+                    // 1. 鏌ユ壘鍙敤璐т綅锛堜笉闇�閿侊級
+                    location = FindNextStorageLocation();
+                    if (location == null) return location;
+
+                    // 2. 鑾峰彇璇ヨ揣浣嶇殑涓撶敤閿�+                    var locationLock = _locationLocks.GetOrAdd(
+                        $"{location.loationCode}",
+                        _ => new SemaphoreSlim(1, 1));
+
+                    await locationLock.WaitAsync();
+
+                    // 3. 鎵ц鍏ュ簱
+                    location.IsOccupied = true;
+                    Console.WriteLine($"鍏ュ簱I:鎺掑彿{location.Row}锛屽垪鍙穥location.Column}锛屽眰鍙穥location.Layer},璐т綅{location.loationCode}");
+                    return location;
+                }
+                finally
+                {
+                    if (location != null)
+                    {
+                        var key = $"{location.loationCode}";
+                        if (_locationLocks.TryGetValue(key, out var locLock))
+                        {
+                            locLock.Release();
+                        }
+                    }
+                }
+            }
+
+        }
+
+        /// <summary>
+        /// 绔嬪簱鍑哄簱灏佽绠楁硶
+        /// </summary>
+        public class DoubleDeepOutboundScheduler
+        {
+            private readonly List<Location> _allLocations;// 鎵�湁璐т綅
+
+            public DoubleDeepOutboundScheduler(List<DistributionCntr> allLocations)
+            {
+
+                var db = new SqlHelper<object>().GetInstance();
+                //鏌ヨ杩欎釜搴撳尯鐨勮揣浣�+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == allLocations.First().S_AREA_CODE).ToList();
+                _allLocations = list;
+
+            }
+
+            // 鐢熸垚鍑哄簱浠诲姟闃熷垪锛堝惈绉诲簱浠诲姟锛�+            /// <summary>
+            /// 绔嬪簱WMS璐т綅鍑哄簱绠楁硶锛堣繍鐢ㄤ簬閰嶇洏鍗曞嚭搴撱�绌烘墭鍑哄簱锛�+            /// </summary>
+            /// <param name="outbound">鍑哄簱鍙傛暟</param>
+            /// <returns></returns>
+            public List<WCSTask> GenerateOutboundTasks(List<Outbound> outbound)
+            {
+                // 闃舵1: 鏍囪鏈潵闇�淇濈暀鐨勮揣浣�+                MarkReservedLocations(outbound);
+                var tasks = new List<WCSTask>();
+                foreach (var outboundItem in outbound)
+                {
+                    // 1. 鏌ユ壘鐩爣璐т綅
+                    var targetLoc = FindTargetLocation(outboundItem.locCode);
+                    if (targetLoc == null) continue;
+                    var wmsTask = WMSHelper.GetWmsTaskList("鎵ц", outboundItem.trayCode);
+                    if (wmsTask == null)
+                    {
+                        LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{outboundItem.trayCode}锛�, "鏉哀");
+                        outboundItem.opCode = "";
+                    }
+
+                    // 2. 澶勭悊鍙屾繁浣嶉�杈戯紙绗�鎺掓垨绗�鎺掞級
+                    if (IsDoubleDeepRow(targetLoc.N_ROW))
+                    {
+                        // 2.1 娣变綅鍑哄簱闇�厛绉诲嚭澶栦晶鐗╂枡
+                        var outerLoc = FindOuterLocation(targetLoc);
+                        //濡傛灉鎵句笉鍒帮紝鍒欒烦杩囨鏉″嚭搴撲换鍔�+                        if (outerLoc != null)
+                        {
+                            //濡傛灉璐т綅宸叉弧锛屽垯鐢熸垚绉诲簱浠诲姟
+                            if (outerLoc.N_CURRENT_NUM == outerLoc.N_CAPACITY)
+                            {
+                                // 浼樺厛绉诲埌娣变綅锛屽叾娆″渚�+                                var bestTarget = FindBestRelocationTarget(outerLoc);
+                                if (bestTarget != null)
+                                {
+                                    //璁$畻鍒颁簡澶栦晶鎶婂渚х殑璐т綅閿佸畾
+                                    _allLocations
+                                .Where(x => x.S_CODE == outerLoc.S_CODE)
+                                .ToList()
+                                .ForEach(x => x.N_LOCK_STATE = 3);
+                                    tasks.Add(new WCSTask
+                                    {
+                                        S_CODE = GenerateTaskNo(),
+                                        S_START_AREA = outerLoc.S_AREA_CODE,
+                                        S_END_AREA = bestTarget.S_AREA_CODE,
+                                        S_START_LOC = outerLoc.S_CODE,
+                                        S_END_LOC = bestTarget.S_CODE,
+                                        S_TYPE = "娣变綅绉诲簱",
+                                        S_OP_CODE = wmsTask.S_CODE,
+                                        N_PRIORITY = 1,
+                                        N_SCHEDULE_TYPE = 1,
+                                        N_B_STATE = 0,
+                                        S_B_STATE = WCSTask.GetStateStr(0),
+                                        S_CNTR_CODE = outboundItem.trayCode,
+                                        N_START_LAYER = 1,
+                                        N_END_LAYER = 1,
+                                        N_CNTR_COUNT = 1
+                                    });
+                                }
+                                else continue;
+
+                            }
+                            else
+                            {
+                                //璐т綅涓虹┖鐩存帴鐢熸垚鍑哄簱浠诲姟
+                                tasks.Add(CreateOutboundTask(targetLoc,outboundItem));
+                            }
+                        }
+                        else continue;
+
+                        // 2.2 鐢熸垚鍑哄簱浠诲姟锛堟繁浣嶏級
+                        tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
+                    }
+                    else
+                    {
+                        // 3. 闈炲弻娣变綅鐩存帴鍑哄簱
+                        tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
+                    }
+                }
+                // 4. 浠诲姟鎺掑簭锛氱Щ搴撲换鍔′紭鍏�+ 楂樹紭鍏堢骇浼樺厛
+                return tasks;
+            }
+
+            // 鍏抽敭杈呭姪鏂规硶
+            private Location FindTargetLocation(string code) =>
+                _allLocations.FirstOrDefault(loc =>
+                    loc.S_CODE == code && loc.N_LOCK_STATE == 0);
+
+            private bool IsDoubleDeepRow(int row) => row == 1 || row == 4;
+
+            //鏌ヨ娣变綅澶栦晶鐨勮揣浣�+            private Location FindOuterLocation(Location deepLoc) =>
+                _allLocations.FirstOrDefault(loc =>
+                    loc.N_ROW != deepLoc.N_ROW &&
+                    loc.N_ROADWAY == deepLoc.N_ROADWAY &&
+                    loc.N_COL == deepLoc.N_COL &&
+                    loc.N_LAYER == deepLoc.N_LAYER &&
+                    loc.N_LOCK_STATE == 0
+            );
+
+            private Location FindBestRelocationTarget(Location outerLoc)
+            {
+                  return _allLocations
+                        .Where(loc =>
+                            loc.N_ROADWAY == outerLoc.N_ROADWAY &&
+                            loc.N_LOCK_STATE == 0 &&
+                            loc.N_CURRENT_NUM == 0 &&
+                            loc.S_CODE != outerLoc.S_CODE)
+                        .OrderBy(loc => loc.N_ROW == outerLoc.N_ROW ? 1 : 0)
+                        .ThenBy(loc => loc.N_COL)
+                        .ThenBy(loc => Math.Abs(loc.N_LAYER - outerLoc.N_LAYER))
+                        .FirstOrDefault();
+            }
+
+            private WCSTask CreateOutboundTask(Location loc,Outbound outbound) =>
+                new WCSTask
+                {
+                    S_CODE = GenerateTaskNo(),
+                    S_START_AREA = loc.S_AREA_CODE,
+                    S_END_AREA = outbound.endArea,
+                    S_START_LOC = loc.S_CODE,
+                    S_END_LOC = outbound.endBit,
+                    S_TYPE = outbound.taskType,
+                    S_OP_CODE = outbound.opCode,
+                    N_PRIORITY = 1,
+                    N_SCHEDULE_TYPE = 1,
+                    N_B_STATE = 0,
+                    S_B_STATE = WCSTask.GetStateStr(0),
+                    S_CNTR_CODE = outbound.trayCode,
+                    N_START_LAYER = 1,
+                    N_END_LAYER = 1,
+                    N_CNTR_COUNT = 1
+                };
+
+
+            private void MarkReservedLocations(List<Outbound> outbound)
+            {
+                //鏌ヨ宸茬粡琚攣浣忕殑璐т綅
+                var lockLoc = _allLocations
+                    .Where(loc => loc.N_LOCK_STATE != 0)
+                    .ToList();
+                //鎶婇攣浣忕殑璐т綅鏍囪涓哄崰鐢�+                foreach (var item in lockLoc)
+                {
+                    if (IsDoubleDeepRow(item.N_ROW))
+                    {
+                        _allLocations
+                                .Where(x => x.S_CODE == item.S_CODE)
+                                .ToList()
+                                .ForEach(x => x.N_LOCK_STATE = 3);
+                    }
+                }
+                foreach (var item in outbound)
+                {
+                    var loc = FindTargetLocation(item.locCode);
+                    if (loc != null && IsDoubleDeepRow(loc.N_ROW))
+                    {
+                        // 鏍囪璇ユ繁浣嶅搴旂殑澶栦晶璐т綅锛堝鏋滃瓨鍦級
+                        var outerLoc = FindOuterLocation(loc);
+                        if (outerLoc != null)
+                        {
+                            // 鏍囪娣变綅鐨勫渚ц揣浣嶏紙閬垮厤琚Щ搴撳崰鐢級
+                            _allLocations
+                                .Where(x => x.S_CODE == outerLoc.S_CODE)
+                                .ToList()
+                                .ForEach(x => x.N_LOCK_STATE = 3);
+                        }
+                    }
+                }
+
+            }
+        }
+        #endregion
+    }
+}
diff --git a/HH.WCS.Mobox3.sln b/HH.WCS.Mobox3.sln
new file mode 100644
index 0000000..39ac3c0
--- /dev/null
+++ b/HH.WCS.Mobox3.sln
@@ -0,0 +1,25 @@
+锘�+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.2.32616.157
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HH.WCS.HangYang", "HH.WCS.Mobox3.HangYang\HH.WCS.HangYang.csproj", "{0D76040B-45FB-EB89-2535-E32E957D1429}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0D76040B-45FB-EB89-2535-E32E957D1429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0D76040B-45FB-EB89-2535-E32E957D1429}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0D76040B-45FB-EB89-2535-E32E957D1429}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0D76040B-45FB-EB89-2535-E32E957D1429}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {78525261-36D5-4CDA-A941-CA765183F130}
+	EndGlobalSection
+EndGlobal

--
Gitblit v1.9.1