From 2c28bf13ba0b985f68deb94cd85d78f588eff8e0 Mon Sep 17 00:00:00 2001
From: 海波 张 <2956280567@qq.com>
Date: 星期五, 09 五月 2025 18:00:39 +0800
Subject: [PATCH] 金坛代码提交

---
 util/STAttribute.cs         |   23 
 Program.cs                  |  124 
 config/配置说明.txt             |    1 
 core/Monitor.cs             |   79 
 HH.WCS.ZhongCeJinTan.csproj |  179 
 core/TaskCore.cs            |  135 
 wms/WMSHelper.cs            |   57 
 config/config.json          |   97 
 api/Startup.cs              |   29 
 api/ApiModel.cs             | 1031 ++++
 HH.WCS.ZhongCeJinTan.sln    |   25 
 wms/NormalArea.cs           |   15 
 wms/WMSModel.cs             | 1353 +++++
 device/TcpServer.cs         |  158 
 packages.config             |   24 
 api/AgvController.cs        |  359 +
 wms/WcsModel.cs             |  139 
 dll/S7.Net.dll              |    0 
 wms/ContainerHelper.cs      |  105 
 process/TaskProcess.cs      | 1913 +++++++
 util/SYSHelper.cs           |   43 
 dispatch/NDCApi.cs          |  259 +
 device/ModbusHelper.cs      |  239 
 wms/TaskHelper.cs           |  800 +++
 process/DeviceProcess.cs    |  424 +
 Properties/AssemblyInfo.cs  |   36 
 wms/LocationHelper.cs       | 1294 +++++
 dispatch/HostToAGV.cs       |  550 ++
 dispatch/WcsTask.cs         | 1376 +++++
 util/LogHelper.cs           |  146 
 device/PlcHelper.cs         |   89 
 api/WmsController.cs        |  210 
 util/SqlHelper.cs           |  158 
 util/HttpHelper.cs          |  216 
 util/StrHelper.cs           |   31 
 dispatch/GZRobot.cs         |  520 ++
 util/Settings.cs            |  212 
 App.config                  |   30 
 util/TopSdk.dll             |    0 
 api/ApiHelper.cs            |   59 
 api/MoboxController.cs      |   91 
 util/DingTalk.cs            |  682 ++
 util/XmlHelper.cs           |   39 
 dll/S7.Net.xml              |  991 ++++
 44 files changed, 14,341 insertions(+), 0 deletions(-)

diff --git a/App.config b/App.config
new file mode 100644
index 0000000..9525822
--- /dev/null
+++ b/App.config
@@ -0,0 +1,30 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
+    </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.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>
diff --git a/HH.WCS.ZhongCeJinTan.csproj b/HH.WCS.ZhongCeJinTan.csproj
new file mode 100644
index 0000000..1db9c5d
--- /dev/null
+++ b/HH.WCS.ZhongCeJinTan.csproj
@@ -0,0 +1,179 @@
+锘�?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>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{8E589C0D-7D65-474D-8CED-E34E081926A1}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>HH.WCS.ZhongCeJinTan</RootNamespace>
+    <AssemblyName>HH.WCS.ZhongCeJinTan</AssemblyName>
+    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </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>
+  <PropertyGroup>
+    <StartupObject>
+    </StartupObject>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="BouncyCastle.Crypto, Version=1.9.0.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
+      <HintPath>packages\BouncyCastle.NetCoreSdk.1.9.0.1\lib\net452\BouncyCastle.Crypto.dll</HintPath>
+    </Reference>
+    <Reference Include="EasyModbus, Version=5.6.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>packages\EasyModbusTCP.5.6.0\lib\net40\EasyModbus.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="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="Newtonsoft.Json.Bson, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>packages\Newtonsoft.Json.Bson.1.0.2\lib\net45\Newtonsoft.Json.Bson.dll</HintPath>
+    </Reference>
+    <Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
+      <HintPath>packages\NLog.5.3.2\lib\net46\NLog.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, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d5812d469e84c693, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>dll\S7.Net.dll</HintPath>
+    </Reference>
+    <Reference Include="SqlSugar, Version=5.1.4.166, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>packages\SqlSugar.5.1.4.166\lib\SqlSugar.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\netstandard1.1\System.Buffers.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Configuration.Install" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Memory.4.5.5\lib\netstandard1.1\System.Memory.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Net" />
+    <Reference Include="System.Net.Http.Formatting, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>packages\Microsoft.AspNet.WebApi.Client.6.0.0\lib\net45\System.Net.Http.Formatting.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceProcess" />
+    <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\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.Http, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>packages\Microsoft.AspNet.WebApi.Core.5.3.0\lib\net45\System.Web.Http.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web.Http.Owin, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>packages\Microsoft.AspNet.WebApi.Owin.5.3.0\lib\net45\System.Web.Http.Owin.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.Net.Http" />
+    <Reference Include="System.Xml" />
+    <Reference Include="TopSdk, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>util\TopSdk.dll</HintPath>
+    </Reference>
+    <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>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="api\MoboxController.cs" />
+    <Compile Include="api\AgvController.cs" />
+    <Compile Include="api\ApiModel.cs" />
+    <Compile Include="api\WmsController.cs" />
+    <Compile Include="device\ModbusHelper.cs" />
+    <Compile Include="device\PlcHelper.cs" />
+    <Compile Include="device\TcpServer.cs" />
+    <Compile Include="dispatch\GZRobot.cs" />
+    <Compile Include="core\Monitor.cs" />
+    <Compile Include="core\TaskCore.cs" />
+    <Compile Include="api\ApiHelper.cs" />
+    <Compile Include="dispatch\HostToAGV.cs" />
+    <Compile Include="dispatch\NDCApi.cs" />
+    <Compile Include="dispatch\WcsTask.cs" />
+    <Compile Include="process\DeviceProcess.cs" />
+    <Compile Include="process\TaskProcess.cs" />
+    <Compile Include="util\DingTalk.cs" />
+    <Compile Include="util\LogHelper.cs" />
+    <Compile Include="util\STAttribute.cs" />
+    <Compile Include="util\StrHelper.cs" />
+    <Compile Include="wms\ContainerHelper.cs" />
+    <Compile Include="wms\LocationHelper.cs" />
+    <Compile Include="util\SYSHelper.cs" />
+    <Compile Include="wms\WcsModel.cs" />
+    <Compile Include="wms\WMSHelper.cs" />
+    <Compile Include="wms\WMSModel.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="util\Settings.cs" />
+    <Compile Include="util\SqlHelper.cs" />
+    <Compile Include="api\Startup.cs" />
+    <Compile Include="util\HttpHelper.cs" />
+    <Compile Include="util\XmlHelper.cs" />
+    <Compile Include="wms\NormalArea.cs" />
+    <Compile Include="wms\TaskHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="config\config.json">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="config\閰嶇疆璇存槑.txt" />
+    <Content Include="readme.txt" />
+    <Content Include="util\TopSdk.dll" />
+  </ItemGroup>
+  <ItemGroup>
+    <WCFMetadata Include="Connected Services\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/HH.WCS.ZhongCeJinTan.sln b/HH.WCS.ZhongCeJinTan.sln
new file mode 100644
index 0000000..ff9f74f
--- /dev/null
+++ b/HH.WCS.ZhongCeJinTan.sln
@@ -0,0 +1,25 @@
+锘�+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34728.123
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HH.WCS.ZhongCeJinTan", "HH.WCS.ZhongCeJinTan.csproj", "{8E589C0D-7D65-474D-8CED-E34E081926A1}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{8E589C0D-7D65-474D-8CED-E34E081926A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8E589C0D-7D65-474D-8CED-E34E081926A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8E589C0D-7D65-474D-8CED-E34E081926A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8E589C0D-7D65-474D-8CED-E34E081926A1}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {58318598-972A-4498-ACE6-6951DD5A701D}
+	EndGlobalSection
+EndGlobal
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..b713413
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,124 @@
+锘縰sing HH.WCS.ZhongCeJinTan.api;
+using HH.WCS.ZhongCeJinTan.core;
+using HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.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.ZhongCeJinTan.core.Monitor;
+
+namespace HH.WCS.ZhongCeJinTan
+{
+    internal class Program
+    {
+        static void Main(string[] args) {
+
+            //string currentProcessName = Process.GetCurrentProcess().ProcessName;
+            //Process[] processes = Process.GetProcessesByName(currentProcessName);
+            //if (processes.Length <= 1)
+            //{
+            //    Console.WriteLine("绋嬪簭姝e湪杩愯...");
+            //    Console.ReadLine();
+            //}
+            //else {
+            //    Console.WriteLine("绋嬪簭宸茬粡鍦ㄨ繍琛岋紝鏃犳硶寮�惎鏂扮殑瀹炰緥銆�);
+            //}
+
+
+            Settings.Init();
+            //3.0 寮�惎鏈嶅姟
+            var rc = HostFactory.Run(x => {
+                x.Service<WorkThread>(s => {
+                    s.ConstructUsing(name => new WorkThread());
+                    s.WhenStarted(tc => tc.Start());
+                    s.WhenStopped(tc => tc.Stop());
+                });
+                x.RunAsLocalSystem();
+                //x.RunAsLocalService();
+                x.SetDescription("hh");
+                x.SetDisplayName("hh.wms");
+                x.SetServiceName("hh.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.92:8801";//{SettingHelper.port}
+                var url = "http://+:8801";
+                using (WebApp.Start<Startup>(url))
+                {
+                    Console.WriteLine("Running on {0}", url);
+                    Console.ReadLine();
+                    while (true) { }
+                }
+            });
+        }
+        private static void StartTcp() {
+            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
+        {
+            public void Start() {
+                
+                //1.0 寮�惎api
+                Startup();
+                //2.0 寮�惎tcp
+                StartTcp();
+
+                List<Task> tasks = new List<Task>();
+                //娣诲姞agv浠诲姟鎺ㄩ�绾跨▼
+                tasks.Add(GetTask(TaskCore.Dispatch));
+
+                //娣诲姞wcs鍑哄簱浠诲姟鎺ㄩ�绾跨▼
+                tasks.Add(GetTask(TaskCore.Dispatch1));
+
+                // 鍒涘缓浠诲姟锛堟牴鎹湭鎵ц鐨勪綔涓氬垱寤哄搴斾换鍔★級
+                tasks.Add(GetTask(Monitor.CreateTask));
+
+                //淇敼浣滀笟鐘舵�(鏍规嵁浣滀笟瀵瑰簲浠诲姟鐨勭姸鎬�
+                tasks.Add(GetTask(Monitor.UpdateWorkState));
+
+
+
+            }
+            public void Stop() { Console.WriteLine("work stopped"); }
+            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/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..30f5d9d
--- /dev/null
+++ b/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�埇淇℃伅鐢变互涓�+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�鍙慨鏀�+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭�
+[assembly: AssemblyTitle("HH.WCS.ZhongCeJinTan")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HH.WCS.ZhongCeJinTan")]
+[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/api/AgvController.cs b/api/AgvController.cs
new file mode 100644
index 0000000..5020310
--- /dev/null
+++ b/api/AgvController.cs
@@ -0,0 +1,359 @@
+锘縰sing HanHe.Message;
+using HH.WCS.ZhongCeJinTan.core;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web.Http;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+
+namespace HH.WCS.ZhongCeJinTan.api
+{
+    //[RoutePrefix("Agv")]
+    public class AgvController : System.Web.Http.ApiController
+    {
+
+
+        [HttpPost]
+        public ReturnResult AGVCallbackState(AgvTaskState model)
+        {
+            LogHelper.Info("AGVCallbackState Request锛� + JsonConvert.SerializeObject(model), "HosttoagvTask");
+            try
+            {
+                TaskCore.OperateTaskStatus(model);
+                return new ReturnResult();
+            }
+            catch (Exception)
+            {
+                return new ReturnResult();
+            }
+        }
+
+
+        /// <summary>
+        /// 杞︿綋閿欒缂撳瓨
+        /// </summary>
+        public static Dictionary<string, AgvDeviceStatus> percentage = new Dictionary<string, AgvDeviceStatus>();
+        /// <summary>
+        /// 杞︿綋閿欒
+        /// </summary>
+        /// <param name="models"></param>鍗佽繘鍒惰浆浜岃繘鍒�灏忚溅鍙戝崄杩涘埗  閿欒鏂囨。鍒欐槸16杩涘埗
+        /// <returns></returns>
+        [HttpPost]
+        public ReturnResult AGVDeviceReceive(List<AgvDeviceStatus> models)
+        {
+            LogHelper.Info("AGVDeviceReceive 鍙傛暟淇℃伅锛� + JsonConvert.SerializeObject(models),"HosttoagvCar");
+            try
+            {
+                var chi = new SqlHelper<object>().GetInstance();
+                var newDb = chi.CopyNew();
+                var Alone = newDb.Queryable<S_AGV_TYPEEntitys>().Where(e => e.S_IS_OPEN == "Y").ToList();
+                List<S_AGV_CONDITIONEntitys> Conditions = new List<S_AGV_CONDITIONEntitys>();
+
+                foreach (var item in models)
+                {
+                    if (item.errCode != "0" || item.errCode2 != "0" || item.faildCode != "0")
+                    {
+                        LogHelper.Info($"errCode {item.errCode} errCode2 {item.errCode}","HosttoagvCar");
+                        if (percentage.ContainsKey(item.forkliftNo))
+                        {
+                            var Model = percentage[item.forkliftNo];
+                            double differenceInMinutes = (Model.Operattime - item.Operattime).TotalMinutes;
+                            if (differenceInMinutes > 5)
+                            {
+                                LogHelper.Info($" 杞︿綋閿欒缂撳瓨 {JsonConvert.SerializeObject(Model)}", "HosttoagvCar");
+                                if (Model.errCode != item.errCode || Model.errCode2 != item.errCode2 || Model.faildCode != item.faildCode)
+                                {
+                                    if (Model.errCode != item.errCode && item.errCode != "0")
+                                    {
+                                        if (differenceInMinutes > 5)
+                                        {
+                                            AgvCa(item, item.errCode, Alone, "1");
+                                        }
+                                    }
+                                    if (Model.errCode2 != item.errCode2 && item.errCode2 != "0")
+                                    {
+                                        if (differenceInMinutes > 5)
+                                        {
+                                            AgvCa(item, item.errCode2, Alone, "2");
+                                        }
+                                    }
+                                    if (Model.faildCode != item.faildCode && item.faildCode != "0")
+                                    {
+                                        if (differenceInMinutes > 5)
+                                        {
+                                            AgvCa(item, item.faildCode, Alone, "3");
+                                        }
+                                    }
+                                    if (differenceInMinutes > 5)
+                                    {
+                                        percentage[item.forkliftNo] = item;
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            percentage.Add(item.forkliftNo, item);
+                            if (item.errCode != "0")
+                            {
+                                AgvCa(item, item.errCode, Alone, "1");
+                            }
+                            if (item.errCode2 != "0")
+                            {
+                                AgvCa(item, item.errCode2, Alone, "2");
+                            }
+                            if (item.faildCode != "0")
+                            {
+                                AgvCa(item, item.faildCode, Alone, "3");
+                            }
+
+
+                        }
+                    }
+                    S_AGV_CONDITIONEntitys cond = new S_AGV_CONDITIONEntitys();
+                    //杞﹀彿
+                    cond.forkliftNo = item.forkliftNo;
+                    //鐢垫睜 
+                    string[] battery = item.battery.Split(',');
+                    cond.Battery_Soc = battery[0];
+                    cond.Battery_V = battery[1];
+                    cond.Battery_Amp = battery[2];
+                    cond.Battery_Temp = battery[3];
+                    cond.Battery_Prop = battery[4];
+                    //閲岀▼
+                    string[] mileage = item.mileage.Split(',');
+                    cond.Mileage_Km = mileage[0];
+                    cond.Mileage_m = mileage[1];
+                    //鐢垫満淇℃伅
+                    string[] motor = item.motor.Split(',');
+                    cond.Motor_Amp = motor[0];
+                    cond.Motor_Temp = motor[1];
+                    cond.Motor_Y_Amp = motor[2];
+                    cond.Motor_Y_Temp = motor[3];
+                    //浜ら�绠″埗淇℃伅
+                    string[] traffic = item.traffic.Split(',');
+                    cond.Traffic_Pt = traffic[0];
+                    cond.Traffic_Sec = traffic[1];
+                    cond.Traffic_Wire = traffic[2];
+                    cond.Traffic_Unit = traffic[3];
+                    cond.Traffic_Io = traffic[4];
+                    //寮�満鏃堕棿
+                    string[] time = item.time.Split(',');
+                    cond.Time_D = time[0];
+                    cond.time_H = time[1];
+                    //涓惧崌娆℃暟
+                    string[] lifts = item.lifts.Split(',');
+                    cond.Lifts_Kc = lifts[0];
+                    cond.Lifts_c = lifts[1];
+                    //鍏朵粬淇℃伅
+                    string[] pos = item.pos.Split(',');
+                    cond.Pos_X = pos[0];
+                    cond.Pos_Y = pos[1];
+                    cond.Pos_Z = pos[2];
+                    //杞悜瑙掑害
+                    cond.Angle_Deg = item.angle;
+                    switch (item.agvstate)
+                    {
+                        case "0":
+                            cond.Agvstate_s = "绌洪棽";
+                            break;
+                        case "1":
+                            cond.Agvstate_s = "琛屽姩涓�;
+                            break;
+                        case "2":
+                            cond.Agvstate_s = "鍏呯數鏈轰腑";
+                            break;
+                    }
+                    // cond.Agvstate_s = item.agvstate;
+                    Conditions.Add(cond);
+                }
+                //杞︿綋淇℃伅鎻掑叆
+                UpdateAgvState(Conditions);
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info("AGVDeviceReceive 寮傚父锛� + ex.Message, "HosttoagvCar");
+            }
+
+            return new ReturnResult();
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// 杞︿綋淇℃伅鎻掑叆鏁版嵁搴�+        /// </summary>
+        /// <param name="Conds"></param>
+        /// <returns></returns>
+        public void UpdateAgvState(List<S_AGV_CONDITIONEntitys> Conds)
+        {
+            var chi = new SqlHelper<object>().GetInstance();
+            var newDb = chi.CopyNew();
+            try
+            {
+                //鍏堟煡 鍦ㄤ慨鏀�褰撴煡璇笉鍒版椂娣诲姞鏁版嵁
+                var agv = chi.Queryable<S_AGV_CONDITIONEntitys>().Where(e => Conds.Select(c => c.forkliftNo).ToList().Contains(e.forkliftNo)).ToList();
+                newDb.BeginTran();
+                //淇敼
+                foreach (var item in Conds)
+                {
+                    var Up = agv.Find(e => e.forkliftNo == item.forkliftNo);
+                    if (Up != null)
+                    {
+                        var ffd = newDb.Updateable(item).UpdateColumns(it => new
+                        {
+                            it.Battery_Soc,
+                            it.Battery_V,
+                            it.Battery_Amp,
+                            it.Battery_Temp,
+                            it.Battery_Prop,
+                            it.Motor_Amp,
+                            it.Motor_Temp,
+                            it.Motor_Y_Amp,
+                            it.Motor_Y_Temp,
+                            it.Traffic_Pt,
+                            it.Traffic_Sec,
+                            it.Traffic_Wire,
+                            it.Traffic_Unit,
+                            it.Traffic_Io,
+                            it.Time_D,
+                            it.time_H,
+                            it.Mileage_Km,
+                            it.Mileage_m,
+                            it.Lifts_Kc,
+                            it.Lifts_c,
+                            it.Pos_X,
+                            it.Pos_Y,
+                            it.Pos_Z,
+                            it.Angle_Deg,
+                            it.Agvstate_s
+                        }).Where(a => a.forkliftNo == item.forkliftNo).ExecuteCommand();
+                    }
+                    else
+                    {
+                        newDb.Insertable(item).ExecuteCommand();
+                    }
+                }
+                newDb.CommitTran();
+              
+            }
+            catch (Exception ex)
+            {
+                newDb.RollbackTran();
+                LogHelper.Info("UpdateAgvState 寮傚父锛� + ex.Message, "HosttoagvCar");
+            }
+        }
+        public void AgvCa(AgvDeviceStatus item, string reeCode, List<S_AGV_TYPEEntitys> Alone, string ii)
+        {
+            try
+            {
+                var chi = new SqlHelper<object>().GetInstance();
+                var newDb = chi.CopyNew();
+                var transportTask = newDb.Queryable<WMSTask>().Where(e => e.S_B_STATE != "鍙栨秷" && e.S_B_STATE != "瀹屾垚" && e.S_SCHEDULE_TYPE == "agv" && e.S_EQ_NO == item.forkliftNo)?.First();
+                List<AgvErrorReportEntitys> AgbError = new List<AgvErrorReportEntitys>();
+                string MistakeNumber = Convert.ToString(int.Parse(reeCode), 2);//灏忚溅閿欒浜岃繘鍒�+                LogHelper.Info( $" 灏忚溅閿欒浜岃繘鍒�{MistakeNumber}","HosttoagvCar");
+                int[] MistakeArray = new int[MistakeNumber.Length]; // 鍒涘缓涓�釜闀垮害绛変簬浜岃繘鍒舵暟浣嶆暟鐨勬暟缁�+                for (int i = 0; i < MistakeNumber.Length; i++)
+                {
+                    MistakeArray[i] = int.Parse(MistakeNumber[i].ToString()); // 灏嗕簩杩涘埗鏁扮殑姣忎竴浣嶅瓨鍌ㄥ埌鏁扮粍涓�+                }
+                Array.Reverse(MistakeArray);//鏁扮粍鍙嶈浆
+                var indexes = Enumerable.Range(0, MistakeArray.Length).Where(i => MistakeArray[i] == 1);//鑾峰彇鏁扮粍涓�鎵�湪鐨勭储寮�+                LogHelper.Info($" 鑾峰彇鏁扮粍涓�鎵�湪鐨勭储寮�{JsonConvert.SerializeObject(indexes)}", "HosttoagvCar");
+
+                foreach (var Inde in indexes)
+                {
+                    //鍖归厤閿欒 骞朵笖璋冪敤閽夐拤
+                    var ffgh = "";
+                    var ggf = Alone.Find(e => e.S_AGV_TYPE == ii && e.N_CODE_1 == Inde + 1);
+                    if (ggf != null)
+                    {
+                        if (transportTask.S_TYPE.Contains("鍏ュ簱"))
+                        {
+                            ffgh = $"浠诲姟鍙� {transportTask.S_CODE} \n 搴撳尯:{transportTask.S_END_AREA} \n 杞﹀彿:{item.forkliftNo} \n 閿欒:{ggf?.S_AGV_NOTE}  鏃堕棿:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}";
+                            LogHelper.Info($"浠诲姟鍙� {transportTask.S_CODE}搴撳尯:{transportTask.S_END_AREA} 杞﹀彿:{item.forkliftNo}  閿欒:{ggf?.S_AGV_NOTE}  鏃堕棿:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}", "HosttoagvCar");
+                        }
+                        else
+                        {
+                            ffgh = $"浠诲姟鍙� {transportTask.S_CODE} \n 搴撳尯:{transportTask.S_START_AREA} \n 杞﹀彿:{item.forkliftNo}\n 閿欒:{ggf?.S_AGV_NOTE}  鏃堕棿:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}";
+                            LogHelper.Info($"浠诲姟鍙� {transportTask.S_CODE} 搴撳尯:{transportTask.S_START_AREA} 杞﹀彿:{item.forkliftNo} 閿欒:{ggf?.S_AGV_NOTE}  鏃堕棿:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}", "HosttoagvCar");
+                        }
+                    }
+                    else
+                    {
+                        ffgh = $"浠诲姟鍙� 搴撳尯: 杞﹀彿:{item.forkliftNo} 閿欒:{ggf?.S_AGV_NOTE}  鏃堕棿:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}";
+                        LogHelper.Info($"浠诲姟鍙� 搴撳尯: 杞﹀彿:{item.forkliftNo} 閿欒:{ggf?.S_AGV_NOTE}  鏃堕棿:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}", "HosttoagvCar");
+                    }
+                    if (!string.IsNullOrEmpty(ffgh))
+                    {
+                        var dd = new DingDingHelper();
+                        dd.button1_Click(ffgh);
+                    }
+                    AgbError.Add(new AgvErrorReportEntitys
+                    {
+                        AgvLicense = item.forkliftNo,
+                        AgvErrorMsg = ggf?.S_AGV_NOTE
+                    });
+                    //璁惧鎶ヨ鏁扮粺璁¤〃
+
+                }
+                //娣诲姞鍒拌〃
+                try
+                {
+                    newDb.BeginTran();
+                    var B = newDb.Insertable(AgbError).ExecuteCommand();
+                    newDb.CommitTran();
+                }
+                catch (Exception)
+                {
+
+                    newDb.RollbackTran();
+                }
+
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info("AGVDeviceReceive 寮傚父锛� + ex.Message, "HosttoagvCar");
+            }
+        }
+
+        /// <summary>
+        /// 淇敼浠诲姟浼樺厛绾�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public zcResult Task(taskParme model)
+        {
+            LogHelper.Info("task 鍙傛暟锛� + JsonConvert.SerializeObject(model), "API");
+            var res = TaskProcess.task1(model);
+            LogHelper.Info("task 杩斿洖锛� + JsonConvert.SerializeObject(res), "API");
+            return res;
+        }
+
+
+ 
+
+        /// <summary>
+        /// 寮哄埗瀹屾垚浠诲姟淇℃伅
+        /// </summary>
+        [HttpPost]
+        public Result CompleteTask(cancleTaskParme model)
+        {
+            LogHelper.Info("CompleteTask 鍙傛暟锛� + JsonConvert.SerializeObject(model), "API");
+            var res = TaskProcess.completeTask1(model);
+            LogHelper.Info("CompleteTask 杩斿洖锛� + JsonConvert.SerializeObject(res), "API");
+            return res;
+        }
+
+    }
+}
diff --git a/api/ApiHelper.cs b/api/ApiHelper.cs
new file mode 100644
index 0000000..d9df84a
--- /dev/null
+++ b/api/ApiHelper.cs
@@ -0,0 +1,59 @@
+锘縰sing HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+
+namespace HH.WCS.ZhongCeJinTan.api
+{
+    /// <summary>
+    /// api鎺ュ彛杈呭姪绫�+    /// </summary>
+    public class ApiHelper
+    {
+        static ApiHelper() {
+
+        }
+
+      
+
+       
+
+      
+
+
+
+
+        public class AddTaskModel
+        {
+            public string From { get; set; }
+            public string To { get; set; }
+            public string No { get; set; }
+        }
+        public class LocationModel
+        {
+            public string location { get; set; }
+        }
+        public class DeviceModel
+        {
+            /// <summary>
+            /// 鐡剁洊鏈哄悕绉�+            /// </summary>
+            public string deviceName { get; set; }
+            /// <summary>
+            /// 1 銆�
+            /// </summary>
+            public int order { get; set; }
+        }
+        public class RowInfo
+        {
+            public string area { get; set; }
+            public int row { get; set; }
+        }
+
+    }
+}
diff --git a/api/ApiModel.cs b/api/ApiModel.cs
new file mode 100644
index 0000000..bb25cbe
--- /dev/null
+++ b/api/ApiModel.cs
@@ -0,0 +1,1031 @@
+锘縰sing HH.WCS.ZhongCeJinTan.wms;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.ZhongCeJinTan.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; }
+
+        }
+
+        public class ReturnResult1
+        {
+            public int code { get; set; }
+            public string msg { get; set; }
+
+        }
+
+
+        /// <summary>
+        /// 鎸夐挳鐩掓帴鍙e弬鏁�+        /// </summary>
+        public class boxParme
+        {
+            public string location { get; set; }
+            public string taskNo { get; set; }
+            /// <summary>
+            /// 1-婊℃墭鐩樹綅璇锋眰鍏ュ簱2-绌烘墭鐩樹綅璇锋眰琛ヨ揣
+            /// </summary>
+            public string state { 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 Interaction
+        {
+            public string station_name { get; set; }
+            public string apply_code { get; set; }
+            public int orderid { get; set; }
+
+        }
+
+        /// <summary>
+        /// 闂ㄥ畨鍏ㄤ氦浜�+        /// </summary>
+        public class doorInteraction
+        {
+            public string doorname { get; set; }
+            public int apply_code { get; set; }
+        }
+
+
+
+
+        /// <summary>
+        /// hosttoagv涓婃姤浠诲姟鐘舵�
+        /// </summary>
+        public class AgvTaskState
+        {
+            public int state { get; set; }
+            public string task_no { get; set; }
+            public string forklift_no { get; set; }
+            public string ext_data { 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; }
+
+        }
+
+
+        public class ResetBase
+        {
+            public string S_PLineNo { 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>();
+        }
+        #endregion
+
+
+
+        /// <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; }
+        }
+
+
+        public class zcResult
+        {
+            /// <summary>
+            /// 閿欒璇存槑锛屽綋success涓篎alse鏃讹紝errCode鏈夊�
+            /// </summary>
+            public object errMsg { get; set; }
+            /// <summary>
+            /// 鎺ュ彛鍙嶉鐮�鏃犻敊璇负0
+            /// </summary>
+            public int errCode { get; set; }
+        }
+
+
+        public class data
+        {
+            /// <summary>
+            /// 璁㈠崟ID
+            /// </summary>
+            public string orderID { get; set; }
+            /// <summary>
+            /// 璁㈠崟鍚�+            /// </summary>
+            public string orderName { get; set; }
+            /// <summary>
+            /// 璁㈠崟鐘舵�
+            /// </summary>
+            public string orderStatus { get; set; }
+            /// <summary>
+            /// agv杞﹀彿鍒楄〃
+            /// </summary>
+            public int[] 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; }
+        }
+
+        public class replenishmentParme
+        {
+            /// <summary>
+            /// Y寮�浜哄伐琛ヨ揣杩涘叆浜ら�绠″埗,N琛ㄧず浜哄伐琛ヨ揣瀹屾垚鍙互寮�惎鑷姩杞繍
+            /// </summary>
+            public string stauts { get; set; }
+        }
+
+        public class orderStatusReportParme
+        {
+            /// <summary>
+            /// 璁㈠崟ID
+            /// </summary>
+            public int orderID { get; set; }
+            /// <summary>
+            /// 璁㈠崟鍚�+            /// </summary>
+            public string orderName { get; set; }
+            /// <summary>
+            /// 璁㈠崟鐘舵�
+            /// </summary>
+            public string orderStatus { get; set; }
+            /// <summary>
+            /// agv杞﹀彿鍒楄〃
+            /// </summary>
+            public string agvIDList { get; set; }
+            /// <summary>
+            /// 浼樺厛绾�+            /// </summary>
+            public string priority { get; set; }
+            /// <summary>
+            /// 璁㈠崟褰撳墠鐨勭洰鐨勫湴
+            /// </summary>
+            public string currentDes { get; set; }
+
+
+            /// <summary>
+            /// 褰撳墠鎸囦护
+            /// </summary>
+            public string currentCmd { get; set; }
+
+            /// <summary>
+            /// 閿欒鐮�+            /// </summary>
+            public int errorCode { get; set; }
+
+            /// <summary>
+            /// 璁㈠崟鐨勬埅鑷虫椂闂�+            /// </summary>
+            public string deadLine { get; set; }
+
+            /// <summary>
+            /// 璁㈠崟鐨勫垱寤烘椂闂�+            /// </summary>
+            public string createdTime { get; set; }
+
+            /// <summary>
+            /// 棰濆淇℃伅1
+            /// </summary>
+            public string extraInfo1 { get; set; }
+
+            /// <summary>
+            /// 棰濆淇℃伅2
+            /// </summary>
+            public string extraInfo2 { get; set; }
+        }
+
+        /// <summary>
+        /// 瀹夊叏浜や簰鍙傛暟
+        /// </summary>
+        public class AskSecurityParame {
+            /// <summary>
+            /// 璐т綅缂栫爜
+            /// </summary>
+            public string stnNo { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟鍙峰敮涓�爣璇�+            /// </summary>
+            public string taskNo { get; set; }
+
+
+
+        }
+        /// <summary>
+        /// 浠诲姟鐘舵�鍥炴姤涓婃父
+        /// </summary>
+        public class taskreportParme
+        {
+
+            public string taskNo { get; set; }
+
+            public int state { get; set; }
+            public string agvNo { get; set; }
+            public string cancelMsg { get; set; }
+            public string stnNo { get; set; }
+
+            public DateTime startTime { get; set; }
+        }
+
+        public class finish
+        {
+
+            public string taskNo { get; set; }
+
+        }
+
+
+
+
+        public class taskreportReturn
+        {
+            public int errCode { get; set; }
+
+            public string errMsg { get; set; }
+
+        }
+
+
+        /// <summary>
+        /// 閫氱煡璁惧鍙栬揣瀹屾垚
+        /// </summary>
+        public class loadCompleteParme
+        {
+
+            public string taskNo { get; set; }
+            public string stnNo { get; set; }
+
+        }
+        /// <summary>
+        /// 涓婃姤浠诲姟鍙傛暟
+        /// </summary>
+        public class taskReportParame {
+            /// <summary>
+            /// 浠诲姟鍙峰敮涓�爣璇�+            /// </summary>
+            public string taskNo { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟鐘舵�
+            /// </summary>
+            public string state { get; set; }
+
+            /// <summary>
+            /// 浠诲姟杞﹀彿
+            /// </summary>
+            public string agvNo { get; set; }
+        }
+
+
+
+
+        /// <summary>
+        /// 鍙栨秷浠诲姟鍙傛暟
+        /// </summary>
+        public class cancleTaskParme {
+            /// <summary>
+            /// 浠诲姟鍙峰敮涓�爣璇�+            /// </summary>
+            public string task_no { get; set; }
+        }
+
+        /// <summary>
+        /// 淇敼鐗╂枡鍙傛暟
+        /// </summary>
+        public class MesUdeItemParme {
+            /// <summary>
+            /// 鍛ㄨ浆鍗″彿
+            /// </summary>
+            public string TurnCardNum { get; set; }
+
+            /// <summary>
+            /// 鑳舵枡璐ㄩ噺鐘舵�
+            /// </summary>
+            public string CHECK_INFO { get; set; }
+
+
+            /// <summary>
+            /// 鑳舵枡缂栫爜
+            /// </summary>
+            public string PROD_NO { get; set; }
+
+
+            /// <summary>
+            /// 寤堕暱鎶ュ憡鏃堕棿(鍗曚綅涓�H)
+            /// </summary>
+            public float EXPIRED_REP { get; set; }
+
+            /// <summary>
+            /// 鏁伴噺
+            /// </summary>
+            public float CURRENT_AMOUNT { get; set; }
+
+
+            /// <summary>
+            /// operator
+            /// </summary>
+            public string Operator { get; set; }
+
+            /// <summary>
+            /// operattime
+            /// </summary>
+            public DateTime Operattime { get; set; }
+
+        }
+
+
+
+        /// <summary>
+        /// 鏌ヨ鐗╂枡鍙傛暟
+        /// </summary>
+        public class MesAreaSecItemParme {
+            /// <summary>
+            /// 鍛ㄨ浆鍗″彿
+            /// </summary>
+            public string TurnCardNum { get; set; }
+            /// <summary>
+            /// 搴撳尯
+            /// </summary>
+            public string Location_From { get; set; }
+        }
+
+
+
+
+
+        /// <summary>
+        /// 鏌ヨ鐗╂枡杩斿洖鍙傛暟
+        /// </summary>
+        public class MesAreaSecItemReturn
+        {
+            /// <summary>
+            /// 閿欒璇存槑锛屽綋success涓篎alse鏃讹紝errCode鏈夊�
+            /// </summary>
+            public string Msg { get; set; }
+            /// <summary>
+            /// 鎺ュ彛璋冪敤缁撴灉 true鎴愬姛 false澶辫触
+            /// </summary>
+            public bool Success { get; set; }
+            /// <summary>
+            /// 鎺ュ彛鍙嶉鐮�鏃犻敊璇负0
+            /// </summary>
+            public int Code { get; set; }
+
+            public int AffectedRows { get; set; }
+
+            public object Data { get; set; }
+
+            public int Status { get; set; }
+        }
+
+
+        /// <summary>
+        /// 缁戝畾鎴栬В缁戝弬鏁�+        /// </summary>
+        public class BindUnbindParme {
+            /// <summary>
+            /// 鍛ㄨ浆鍗″彿
+            /// </summary>
+            public string TurnCardNum { get; set; }
+            /// <summary>
+            /// 鏍囧噯閲嶉噺
+            /// </summary>
+            public float standardWeight { get; set; }
+            /// <summary>
+            /// 鍒跺搧缂栧彿
+            /// </summary>
+            public string PROD_NO { get; set; }
+            /// <summary>
+            /// 宸ヨ壓缂栧彿
+            /// </summary>
+            public string PROD_TECH { get; set; }
+
+
+            /// <summary>
+            /// 鐘舵�鏈�绉嶃�鍚堟牸銆戙�灏佸瓨銆�+            /// </summary>
+            public string CHECK_INFO { get; set; }
+
+            /// <summary>
+            /// 鍒跺搧瑙勬牸
+            /// </summary>
+            public string PROD_SPEC { get; set; }
+            /// <summary>
+            /// 鍒跺搧绫诲瀷
+            /// </summary>
+            public string PROD_BOM { get; set; }
+            /// <summary>
+            /// 宸ヨ缂栧彿
+            /// </summary>
+            public string TOOLS_NO { get; set; }
+            /// <summary>
+            /// 杞芥枡鏁伴噺
+            /// </summary>
+            public float ST_AMOUNT { get; set; }
+            /// <summary>
+            /// 褰撳墠鏁伴噺
+            /// </summary>
+            public float CURRENT_AMOUNT { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃堕棿
+            /// </summary>
+            public DateTime PRODUCE_TIME { get; set; }
+            /// <summary>
+            /// 鐢熸晥鏃堕棿
+            /// </summary>
+            public DateTime SHELF_LIFE_TIME { get; set; }
+            /// <summary>
+            /// 澶辨晥鏃堕棿
+            /// </summary>
+            public DateTime EXPIRED_TIME { get; set; }
+            /// <summary>
+            /// 缂╃煭鎶ュ憡鏃堕棿
+            /// </summary>
+            public float SHELF_REP { get; set; }
+            /// <summary>
+            /// 寤堕暱鎶ュ憡鏃堕棿
+            /// </summary>
+            public float EXPIRED_REP { get; set; }
+            /// <summary>
+            /// 涓氬姟绫诲瀷
+            /// 100	缁戝畾
+            /// 200	瑙g粦
+            /// </summary>
+            public string BUSI_TYPE { get; set; }
+
+            /// <summary>
+            /// 缁戝畾鐨勮揣浣�+            /// </summary>
+            public string LOCATION_CODE { get; set; }
+
+        }
+
+
+        public class taskParme
+        {
+            /// <summary>
+            /// 浠诲姟浼樺厛绾�+            /// </summary>
+            public int priority { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟鍙峰敮涓�爣璇�+            /// </summary>
+            public string taskNo { get; set; }
+        }
+
+            /// <summary>
+            /// 娣诲姞浠诲姟鍙傛暟
+            /// </summary>
+            public class addTaskParme
+        {
+            /// <summary>
+            /// 鎵樼洏鐮�+            /// </summary>
+            public string cntrCode { get; set; }
+
+            /// <summary>
+            /// 浠诲姟绫诲瀷
+            /// </summary>
+            public string taskType { get; set; }
+
+            /// <summary>
+            /// 鏉ユ簮绯荤粺鍚嶇О
+            /// </summary>
+            public string creator { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟鍙峰敮涓�爣璇�+            /// </summary>
+            public string taskNo { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟璧风偣
+            /// </summary>
+            public string start { get; set; }
+
+
+
+            /// <summary>
+            /// 浠诲姟缁堢偣
+            /// </summary>
+            public string end { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟浼樺厛绾�+            /// </summary>
+            public int priority { get; set; }
+
+        }
+
+
+            /// <summary>
+            /// 鐐瑰埌鐐瑰弬鏁�+            /// </summary>
+            public class PtpTaskParme
+        {
+            /// <summary>
+            /// 鎵樼洏鐮�+            /// </summary>
+            public string TOOLS_NO { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟鍙峰敮涓�爣璇�+            /// </summary>
+            public string task_no { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟璧风偣
+            /// </summary>
+            public string Location_From { get; set; }
+
+
+
+            /// <summary>
+            /// 浠诲姟缁堢偣
+            /// </summary>
+            public string Location_To { get; set; }
+
+
+            /// <summary>
+            /// 浠诲姟浼樺厛绾�+            /// </summary>
+            public int priority { get; set; }
+
+        }
+        /// <summary>
+        /// 鍑哄叆搴撲换鍔′笅鍙戞帴鍙e弬鏁�+        /// </summary>
+        public class ZcInWorkAreaParme {
+
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string task_no { get; set; }
+            /// <summary>
+            /// 浠诲姟绫诲瀷1:鍏ュ簱;2:鍑哄簱
+            /// </summary>
+            public int Task_type { get; set; }
+            /// <summary>
+            /// 鍛ㄨ浆鍗″彿
+            /// </summary>
+            public string TurnCardNum { get; set; }
+            /// <summary>
+            /// 鏍囧噯閲嶉噺
+            /// </summary>
+            public float standardWeight { get; set; }
+            /// <summary>
+            /// 宸ヨ绫诲瀷 鑳庝晶25,鍐呰‖35,鑳庝綋/甯樺竷45,甯︽潫55,鑳庡湀65,鑳庨潰15,绾ょ淮85锛岄挗涓�5
+            /// </summary>
+            public string TOOLS_TPYE { get; set; }
+            /// <summary>
+            /// 鍒跺搧缂栧彿
+            /// </summary>
+            public string PROD_NO { get; set; }
+            /// <summary>
+            /// 宸ヨ壓缂栧彿
+            /// </summary>
+            public string PROD_TECH { get; set; }
+            /// <summary>
+            /// 鍒跺搧瑙勬牸
+            /// </summary>
+            public string PROD_SPEC { get; set; }
+            /// <summary>
+            /// 鍒跺搧绫诲瀷
+            /// </summary>
+            public string PROD_BOM { get; set; }
+            /// <summary>
+            /// 鍒跺搧鐗瑰緛鍊�+            /// </summary>
+            public string PROD_Feature { get; set; }
+            /// <summary>
+            /// 宸ヨ缂栧彿
+            /// </summary>
+            public string TOOLS_NO { get; set; }
+            /// <summary>
+            /// 杞芥枡鏁伴噺
+            /// </summary>
+            public float ST_AMOUNT { get; set; }
+            /// <summary>
+            /// 褰撳墠鏁伴噺
+            /// </summary>
+            public float CURRENT_AMOUNT { get; set; }
+            /// <summary>
+            /// 璧峰搴撲綅缂栧彿
+            /// </summary>
+            public string Location_From { get; set; }
+            /// <summary>
+            /// 鐩殑搴撲綅缂栧彿
+            /// </summary>
+            public string Location_To { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃堕棿
+            /// </summary>
+            public DateTime PRODUCE_TIME { get; set; }
+            /// <summary>
+            /// 鐢熸晥鏃堕棿
+            /// </summary>
+            public DateTime SHELF_LIFE_TIME { get; set; }
+            /// <summary>
+            /// 澶辨晥鏃堕棿
+            /// </summary>
+            public DateTime EXPIRED_TIME { get; set; }
+            /// <summary>
+            /// 缂╃煭鎶ュ憡鏃堕棿
+            /// </summary>
+            public float SHELF_REP { get; set; }
+            /// <summary>
+            /// 寤堕暱鎶ュ憡鏃堕棿
+            /// </summary>
+            public float EXPIRED_REP { get; set; }
+            /// <summary>
+            /// 璐ㄦ鐘舵�浠g爜
+            /// </summary>
+            public string CHECK_CODE { get; set; }
+            /// <summary>
+            /// 璐ㄦ鐘舵�
+            /// </summary>
+            public string CHECK_INFO { get; set; }
+            /// <summary>
+            /// 浼樺厛绾�-鏅�锛氫换鍔$敓鎴愭椂锛屽潎涓烘绾у埆;1-鍔犳�;2-绱ф�
+            /// </summary>
+            public int Priority { get; set; }
+            /// <summary>
+            /// 浠诲姟鐘舵�0-鍒濆鐘舵�;1-杩涜涓�2-瀹屾垚;3-浠诲姟鍙栨秷
+            /// </summary>
+            public int Data_status { get; set; }
+            /// <summary>
+            /// 涓氬姟绫诲瀷
+            /// 1	鍗婃垚鍝佹弧鎵樺叆搴�+            /// 2	鎴愬瀷鏈哄崐妗跺洖搴�+            /// 3	鎴愬瀷鏈虹┖妗跺洖搴�+            /// 4	鎴愬瀷鏈烘弧鎵樺嚭搴�+            /// 5	鎴愬瀷鏈哄甫鏉熷洖搴�+            /// 6	鎴愬瀷鏈哄甫鏉熸弧鎵樺嚭搴�+            /// 7	鍗婃垚鍝佺┖鎵樺嚭搴�+            /// 8	鑳舵枡鍏ュ簱
+            /// 9	鍛煎彨鑳舵枡
+            /// 10	鍙犵洏鏈虹┖鎵樺叆搴�+            /// 11	鑳舵枡鍗婃《鍥炲簱
+            /// 12	绌烘灦瀛愬叆搴�+            /// 13	鑳庡湀绌烘墭鍏ヤ笉甯﹀灚鐗�+            /// 14	鑳庡湀绌烘墭鍑轰笉甯﹀灚鐗�+            /// 100	缁戝畾
+            /// 200	瑙g粦
+            /// </summary>
+            public string BUSI_TYPE { get; set; }
+        }
+
+
+        /// <summary>
+        /// 绔嬪簱鎶ヨ涓婃姤鍙傛暟
+        /// </summary>
+        public class WcsWarningParme : BaseModel
+        {
+            public string requestPk { get; set; }
+            public string taskNo { get; set; }
+            public string reqTime { get; set; }
+            public string errorNo { get; set; }
+            public string errorDes { get; set; }
+            public string remarks { get; set; }
+            public string roadway { get; set; }
+            public string areaCode { get; set; }
+        }
+
+        /// <summary>
+        /// 宸烽亾鍙敤涓婃姤
+        /// </summary>
+        public class WcsRoadwaystateParme : BaseModel
+        {
+            /// <summary>
+            /// 璇锋眰缂栧彿
+            /// </summary>
+            public string requestPk { get; set; }
+            /// <summary>
+            /// 搴撳尯
+            /// </summary>
+            public string areaCode { get; set; }
+            /// <summary>
+            /// 宸烽亾
+            /// </summary>
+            public string roadWay { get; set; }
+            /// <summary>
+            /// 鍙敤锛�0鍙敤 1涓嶅彲鐢�+            /// </summary>
+            public string status { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public string reqTime { get; set; }
+        }
+
+
+        /// <summary>
+        /// 鏀归亾鍙傛暟
+        /// </summary>
+        public class changeBitParme : BaseModel
+        {
+            /// <summary>
+            /// 璇锋眰缂栧彿
+            /// </summary>
+            public string requestPk { get; set; }
+
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string taskNo { get; set; }
+        }
+
+
+
+            /// <summary>
+            /// 閫氱煡纭
+            /// </summary>
+            public class agvResponseParme : BaseModel
+        {
+            /// <summary>
+            /// 璇锋眰缂栧彿
+            /// </summary>
+            public string requestPk { get; set; }
+            /// <summary>
+            /// 浠诲姟绫诲瀷 1鍙栬揣 2鏀捐揣
+            /// </summary>
+            public string trkType { get; set; }
+            /// <summary>
+            /// allow鍏佽
+            /// </summary>
+            public string isAllow { get; set; }
+            /// <summary>
+            /// 鐩殑鍦扮珯鍙板彿
+            /// </summary>
+            public string stnNo { get; set; }
+            /// <summary>
+            /// 鎿嶄綔浜�+            /// </summary>
+            public string clientCode { get; set; }
+            /// <summary>
+            /// 杞﹀彿
+            /// </summary>
+            public string carNo { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public string reqTime { get; set; }
+        }
+        
+
+
+        public class WcsCVParme : BaseModel
+        {
+
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string S_TASK_NO { get; set; }
+            /// <summary>
+            /// 鎺ラ┏浣�+            /// </summary>
+            public string JbLocation { get; set; }
+        }
+
+
+
+        /// <summary>
+        /// 绔嬪簱浠诲姟鎵ц閫氱煡鍙傛暟
+        /// </summary>
+        public class WcsOperateTaskParme : BaseModel {
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string requestPk { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�+            /// </summary>
+            public string contNo { get; set; }
+            /// <summary>
+            /// 閫氱煡绫诲瀷  1:浠诲姟寮�锛�锛氬畬鎴�锛氭墽琛屼腑锛� : rfid妫�獙涓婃姤 8锛氭斁璐ф湁璐�9:  鍙栬揣鏃犺揣
+            /// </summary>
+            public string noticeType { get; set; }
+            /// <summary>
+            /// 褰撳墠浣嶇疆
+            /// </summary>
+            public string curPos { get; set; }
+            /// <summary>
+            /// RFID缁撴灉鐮�+            /// </summary>
+            public string code { get; set; }
+            /// <summary>
+            /// 鍒拌揪缁撴灉
+            /// </summary>
+            public string result { get; set; }
+            /// <summary>
+            /// 鎿嶄綔浜�+            /// </summary>
+            public string clientCode { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public string reqTime { get; set; }
+        }
+
+
+        /// <summary>
+        /// 绔嬪簱鍛煎彨绌烘墭銆佹弧鎵�+        /// </summary>
+        public class WcsOperateTaskParme1 : BaseModel
+        {
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string requestPk { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�+            /// </summary>
+            public string contNo { get; set; }
+            /// <summary>
+            /// 閫氱煡绫诲瀷  0:鎵樼洏妫�祴鍚堟牸锛岋紙婊℃嫋鍏�(contNo+curPos蹇呴』鏈夊�)锛�锛氱┖鎵樺嚭锛坈urPos蹇呴』鏈夊�锛�锛氱┖鎵樺叆(contNo+curPos蹇呴』鏈夊�)7锛氱┖鏋跺瓙鍏ワ紙curPos蹇呴』鏈夊�锛�+            /// </summary>
+            public string noticeType { get; set; }
+            /// <summary>
+            /// 褰撳墠浣嶇疆
+            /// </summary>
+            public string curPos { get; set; }
+            /// <summary>
+            /// RFID缁撴灉鐮�0鎴愬姛 1澶辫触
+            /// </summary>
+            public string code { get; set; }
+            /// <summary>
+            /// 鍒拌揪缁撴灉
+            /// </summary>
+            public string result { get; set; }
+            /// <summary>
+            /// 鎿嶄綔浜�+            /// </summary>
+            public string clientCode { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public string reqTime { get; set; }
+        }
+
+        public class WcsWarningReurn
+        {
+            /// <summary>
+            /// 杩斿洖鐮侊紙0-鎴愬姛  鍏朵粬-寮傚父鐮侊級
+            /// </summary>
+            public string code { get; set; }
+            /// <summary>
+            /// "鎴愬姛"鎴栤�澶辫触鍘熷洜鈥�+            /// </summary>
+            public string msg { get; set; }
+
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string requestPk { get; set; }
+        }
+
+
+
+        /// <summary>
+        /// hosttoagv涓婃姤杞﹁締鐘舵�锛堝弬鏁板湪hosttoagv鏈嶅姟閰嶇疆锛屽彲淇敼锛�+        /// </summary>
+        public class AgvDeviceStatus
+        {
+            public string infoType { get; set; }
+            public string forkliftNo { get; set; }
+            public string battery { get; set; }
+            public string errCode { get; set; }
+            public string errCode2 { get; set; }
+            public string faildCode { get; set; }
+            public string mileage { get; set; }
+            public string motor { get; set; }
+            public string traffic { get; set; }
+            public string time { get; set; }
+            public string lifts { get; set; }
+            public string pos { get; set; }
+            public string angle { get; set; }
+            public string agvstate { get; set; }
+            public DateTime Operattime { get; set; } = DateTime.Now;
+        }
+
+    }
+
+    /// <summary>
+    /// 椤圭洰璁㈠埗model
+    /// </summary>
+    public class OtherModel
+    {
+
+    }
+}
diff --git a/api/MoboxController.cs b/api/MoboxController.cs
new file mode 100644
index 0000000..4719739
--- /dev/null
+++ b/api/MoboxController.cs
@@ -0,0 +1,91 @@
+锘縰sing HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using System.Linq;
+using System.Web.Http;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+
+namespace HH.WCS.ZhongCeJinTan.api
+{
+    /// <summary>
+    /// mobox璋冪敤
+    /// </summary>
+     [RoutePrefix("mobox")]
+    public class MoboxController : System.Web.Http.ApiController
+    {
+        [HttpPost]
+        //[Route("CancelTask")]
+        public SimpleResult CancelTask(MoboxTaskBase model) {
+            var result=new SimpleResult();
+             var task=TaskHelper.GetTask(model.TaskNo);
+            if (task != null) {
+                if (task.S_B_STATE.Trim() == "鏈墽琛�) {
+                    //鏈墽琛岀洿鎺ヤ慨鏀圭姸鎬佷负鍙栨秷
+                    TaskHelper.UpdateStatus(model.TaskNo, "鍙栨秷");
+                }
+                else if(task.S_B_STATE.Trim() != "鍙栨秷"&& task.S_B_STATE.Trim() != "瀹屾垚")  {
+                    //if (GZRobot.CancelOrder(task.GZ_ID))
+                    //{
+                    //    result.resultMsg = "浠诲姟鍙栨秷宸茬粡鍙戦�缁欏皬杞�;
+                    //}  
+                }
+                else {
+                    result.resultCode = 1;
+                    result.resultMsg = "浠诲姟宸茬粨鏉�;
+                }
+            }
+            else {
+                result.resultCode = 1;
+                result.resultMsg = "浠诲姟涓嶅瓨鍦�;
+            }
+            return result;
+        }
+
+
+        //浣滀笟浠诲姟寮哄埗瀹屾垚 
+        [HttpPost]
+        //[Route("CompleteTask")]
+        public SimpleResult CompleteTask(MoboxTaskBase model)
+        {
+            var result = new SimpleResult();
+            var task = TaskHelper.GetTask(model.TaskNo);
+            if (task != null)
+            {
+                if (task.S_B_STATE.Trim() == "鏈墽琛�)
+                {
+                    result.resultMsg = "浠诲姟鏈墽琛岋紝涓嶅厑璁稿己鍒跺畬鎴愶紒";
+                }
+                //else if (task.S_B_STATE.Trim() != "鏈墽琛� && task.S_B_STATE.Trim() != "寰呮帹閫� && task.S_B_STATE.Trim() != "鍙栨秷")
+                else if (task.S_B_STATE.Trim() != "鏈墽琛� && task.S_B_STATE.Trim() != "寰呮帹閫� && task.S_B_STATE.Trim() != "鍙栬揣澶辫触")
+                {
+                    //宸叉帹閫佷絾鏄病鏈夊畬鎴愭垨鑰呭彇娑堬紝閫氱煡hosttoagv
+                    TaskHelper.UpdateStatus(model.TaskNo.Trim(), "瀹屾垚");
+                  
+                    //if (GZRobot.CancelOrder(task.GZ_ID))
+                    //{
+                    //    result.resultMsg = "浠诲姟瀹屾垚宸茬粡鍙戦�缁欏皬杞�;
+
+                    //    LocationHelper.UnLockLoc(task.S_START_LOC);
+                    //    LocationHelper.UnLockLoc(task.S_END_LOC);
+                    //}
+                }
+                else
+                {
+                    result.resultCode = 1;
+                    result.resultMsg = "浠诲姟宸茬粨鏉�;
+                }
+            }
+            else
+            {
+                result.resultCode = 1;
+                result.resultMsg = "浠诲姟涓嶅瓨鍦�;
+            }
+            return result;
+        }
+
+
+     
+    }
+}
diff --git a/api/Startup.cs b/api/Startup.cs
new file mode 100644
index 0000000..34b58d6
--- /dev/null
+++ b/api/Startup.cs
@@ -0,0 +1,29 @@
+锘縰sing System;
+using System.Threading.Tasks;
+using System.Web.Http;
+using Microsoft.Owin;
+using Owin;
+
+[assembly: OwinStartup(typeof(HH.WCS.ZhongCeJinTan.api.Startup))]
+
+namespace HH.WCS.ZhongCeJinTan.api
+{
+    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();
+
+            //WebApiConfig.Register(config);
+
+            app.UseWebApi(config);
+        }
+    }
+}
diff --git a/api/WmsController.cs b/api/WmsController.cs
new file mode 100644
index 0000000..d5ccd81
--- /dev/null
+++ b/api/WmsController.cs
@@ -0,0 +1,210 @@
+锘縰sing HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
+
+namespace HH.WCS.ZhongCeJinTan.api
+{
+    //[RoutePrefix("wms")]
+    public class WmsController : System.Web.Http.ApiController
+    {
+
+        //Mes璋冪敤
+
+        /// <summary>
+        /// 浠诲姟涓嬪彂鎺ュ彛
+        /// </summary>
+        /// <param name="jsonData"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public Result ZcInWorkArea(ZcInWorkAreaParme model)
+        {
+            LogHelper.Info("ZcInWorkArea 鍙傛暟锛� + JsonConvert.SerializeObject(model), "Mes浠诲姟涓嬪彂");
+            var res = TaskProcess.addMesTask(model);
+            LogHelper.Info("ZcInWorkArea 杩斿洖锛� + JsonConvert.SerializeObject(res), "Mes浠诲姟涓嬪彂");
+            return res;
+        }
+
+
+
+
+        /// <summary>
+        /// 鍒涘缓鐐瑰埌鐐逛换鍔�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public Result SendTaskZCMes(PtpTaskParme model)
+        {
+            LogHelper.Info("SendTaskZCMes 鍙傛暟锛� + JsonConvert.SerializeObject(model), "鐐瑰埌鐐�);
+            var res = TaskProcess.addTask1(model);
+            LogHelper.Info("SendTaskZCMes 杩斿洖锛� + JsonConvert.SerializeObject(res), "鐐瑰埌鐐�);
+            return res;
+        }
+
+
+
+        /// <summary>
+        /// 鍙栨秷浠诲姟
+        /// </summary>
+        [HttpPost]
+        public Result CancelTask(cancleTaskParme model)
+        {
+            LogHelper.Info("cancelTask 鍙傛暟锛� + JsonConvert.SerializeObject(model), "鍙栨秷");
+            var res = TaskProcess.cancelTask1(model);
+            LogHelper.Info("cancelTask 杩斿洖锛� + JsonConvert.SerializeObject(res), "鍙栨秷");
+            return res;
+        }
+
+
+        /// <summary>
+        /// MES鐗╂枡缁戝畾璐т綅鎺ュ彛
+        /// </summary>
+        [HttpPost]
+        public Result MesBindUnbind(BindUnbindParme model)
+        {
+            LogHelper.Info("MesBindUnbind 鍙傛暟锛� + JsonConvert.SerializeObject(model), "鐗╂枡缁戝畾瑙g粦");
+            var res = TaskProcess.MesBindUnbind(model);
+            LogHelper.Info("MesBindUnbind 杩斿洖锛� + JsonConvert.SerializeObject(res), "鐗╂枡缁戝畾瑙g粦");
+            return res;
+        }
+
+
+        /// <summary>
+        /// MES鐗╂枡鏌ヨ
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public MesAreaSecItemReturn InventoryRecords(MesAreaSecItemParme model)
+        {
+            LogHelper.Info("InventoryRecords 鍙傛暟锛� + JsonConvert.SerializeObject(model), "鐗╂枡缁戝畾瑙g粦");
+            var res = TaskProcess.MesAreaSecItem(model);
+            LogHelper.Info("InventoryRecords 杩斿洖锛� + JsonConvert.SerializeObject(res), "鐗╂枡缁戝畾瑙g粦");
+            return res;
+        }
+
+        /// <summary>
+        /// MES鐗╂枡淇敼
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public Result MesUdeItem(MesUdeItemParme model)
+        {
+            LogHelper.Info("MesUdeItem 鍙傛暟锛� + JsonConvert.SerializeObject(model), "鐗╂枡缁戝畾瑙g粦");
+            var res = TaskProcess.MesUdeItem(model);
+            LogHelper.Info("MesUdeItem 杩斿洖锛� + JsonConvert.SerializeObject(res), "鐗╂枡缁戝畾瑙g粦");
+            return res;
+        }
+
+
+        /// <summary>
+        /// 搴撲綅鎿嶄綔璁板綍鎺ュ彛
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public Result LocationRecords(MesUdeItemParme model)
+        {
+            LogHelper.Info("MesUdeItem 鍙傛暟锛� + JsonConvert.SerializeObject(model), "鐗╂枡缁戝畾瑙g粦");
+            var res = TaskProcess.MesUdeItem(model);
+            LogHelper.Info("MesUdeItem 杩斿洖锛� + JsonConvert.SerializeObject(res), "鐗╂枡缁戝畾瑙g粦");
+            return res;
+        }
+
+
+
+        //Wcs璋冪敤
+
+
+        /// <summary>
+        /// Wcs浠诲姟鎵ц閫氱煡
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public WcsWarningReurn WcsOperateTask(WcsOperateTaskParme model)
+        {
+            LogHelper.Info("WcsOperateTask浠诲姟鎵ц閫氱煡 鍙傛暟锛� + JsonConvert.SerializeObject(model), "Wcs浠诲姟鎵ц閫氱煡 ");
+            var res = WcsTask.WcsOperateTask(model);
+            LogHelper.Info("WcsOperateTask浠诲姟鎵ц閫氱煡 杩斿洖锛� + JsonConvert.SerializeObject(res), "Wcs浠诲姟鎵ц閫氱煡 ");
+            return res;
+        }
+
+
+        /// <summary>
+        /// Wcs鎶ヨ涓婃姤
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public WcsWarningReurn WcsTaskProcessing(WcsWarningParme model)
+        {
+            LogHelper.Info("WcsTaskProcessing鎶ヨ涓婃姤 鍙傛暟锛� + JsonConvert.SerializeObject(model), "鎶ヨ涓婃姤");
+            var res = WcsTask.WcsTaskProcessing(model);
+            LogHelper.Info("WcsTaskProcessing鎶ヨ 杩斿洖锛� + JsonConvert.SerializeObject(res), "鎶ヨ涓婃姤");
+            return res;
+        }
+
+
+        /// <summary>
+        /// Wcs宸烽亾鍙敤涓婃姤
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public WcsWarningReurn WcsRoadwaystate(WcsRoadwaystateParme model)
+        {
+            LogHelper.Info("WcsRoadwaystate宸烽亾鍙敤涓婃姤 鍙傛暟锛� + JsonConvert.SerializeObject(model), "宸烽亾鍙敤涓婃姤");
+            var res = WcsTask.WcsRoadwaystate(model);
+            LogHelper.Info("WcsRoadwaystate宸烽亾鍙敤 杩斿洖锛� + JsonConvert.SerializeObject(res), "宸烽亾鍙敤涓婃姤");
+            return res;
+        }
+
+
+        /// <summary>
+        /// Wcs閫氱煡纭锛堜氦浜掔敤锛�+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public WcsWarningReurn agvResponse(agvResponseParme model)
+        {
+            LogHelper.Info("agvResponse閫氱煡纭 鍙傛暟锛� + JsonConvert.SerializeObject(model), "閫氱煡纭");
+            var res = WcsTask.agvResponse(model);
+            LogHelper.Info("agvResponse閫氱煡纭 杩斿洖锛� + JsonConvert.SerializeObject(res), "閫氱煡纭");
+            return res;
+        }
+
+
+        /// <summary>
+        /// Wcs鏀捐揣鏈夎揣 闇�鏀归亾
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public WcsWarningReurn ZcInChangeBit(changeBitParme model)
+        {
+            LogHelper.Info("ZcInChangeBit 鏀捐揣鏈夎揣鍙傛暟锛� + JsonConvert.SerializeObject(model), "鏀捐揣鏈夎揣");
+            var res = WcsTask.ZcInChangeBit(model);
+            LogHelper.Info("ZcInChangeBit 鏀捐揣鏈夎揣杩斿洖锛� + JsonConvert.SerializeObject(res), "鏀捐揣鏈夎揣");
+            return res;
+        }
+
+        /// <summary>
+        /// Wcs涓嬪彂浠诲姟
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public WcsWarningReurn ZcWcsInWorkArea(WcsOperateTaskParme1 model)
+        {
+            LogHelper.Info("ZcWcsInWorkArea 鍙傛暟锛� + JsonConvert.SerializeObject(model), "Wcs涓嬪彂浠诲姟");
+            var res = WcsTask.ZcWcsInWorkArea(model);
+            LogHelper.Info("ZcWcsInWorkArea 杩斿洖锛� + JsonConvert.SerializeObject(res), "Wcs涓嬪彂浠诲姟");
+            return res;
+        }
+
+    }
+}
diff --git a/config/config.json b/config/config.json
new file mode 100644
index 0000000..82ffef1
--- /dev/null
+++ b/config/config.json
@@ -0,0 +1,97 @@
+{
+  "SqlServer": "Data Source=192.168.1.144;Initial Catalog=ZZBYDMobox;User ID=hhuser;Password=Am123123",
+  "WcsApiAddres": "http://ip:prot/wcs-admin/api/",
+  "NDCApiUrl": "http://[IP]:0000/api/order/",
+  "TmDeviceIp": "192.168.1.144",
+  "TmDevicePort": 502,
+  "EmptyPalletBufferArea": "绌烘墭缂撳瓨鍖哄煙",
+  "MesGetItemApi": "http://ip:prot/",
+  "TableName": [
+    {
+      "name": "璐т綅琛�,
+      "code": "TN_Location"
+    },
+    {
+      "name": "璐т綅瀹瑰櫒琛�,
+      "code": "TN_Loc_Container"
+    },
+    {
+      "name": "瀹瑰櫒琛�,
+      "code": "TN_Container"
+    },
+    {
+      "name": "浠诲姟琛�,
+      "code": "TN_Task"
+    },
+    {
+      "name": "浠诲姟鍔ㄤ綔琛�,
+      "code": "TN_Task_Action"
+    },
+    {
+      "name": "瀹瑰櫒鐗╂枡琛�,
+      "code": "TN_Task_Action"
+    }
+  ],
+  "SafetyLocation": [
+    {
+      "name": "鎺ラ┏浣嶄氦浜�,
+      "Area": [ "搴撳尯1", "搴撳尯2" ],
+      "type": 1
+    },
+    {
+      "name": "鑳庨潰鏈哄彴浜や簰",
+      "Area": [ "搴撳尯1", "搴撳尯2" ],
+      "type": 2
+    }
+  ],
+  "TmDevice": [
+    {
+      "deviceName": "鑳庨潰鏈哄彴1婊℃墭閰嶇疆",
+      "locCode": "JT1",
+      "deviceType": 1,
+      "enable": 1,
+      "beginAddr": 40022,
+      "writeSafetyAddr": 40022,
+      "writeSafetyAddr1": 40026,
+      "readSafetyAddr": 40001,
+      "readSafetyAddr1": 40004,
+      "endAddr": 40024
+    },
+    {
+      "deviceName": "鑳庨潰鏈哄彴1绌烘墭閰嶇疆",
+      "locCode": "JT1",
+      "deviceType": 2,
+      "enable": 1,
+      "beginAddr": 40021,
+      "writeSafetyAddr": 40021,
+      "writeSafetyAddr1": 40025,
+      "readSafetyAddr": 40001,
+      "readSafetyAddr1": 40005,
+      "endAddr": 40023
+    },
+    {
+      "deviceName": "鑳庨潰鏈哄彴2婊℃墭閰嶇疆",
+      "locCode": "JT2",
+      "deviceType": 1,
+      "enable": 1,
+      "beginAddr": 40029,
+      "writeSafetyAddr": 40029,
+      "writeSafetyAddr1": 40033,
+      "readSafetyAddr": 40007,
+      "readSafetyAddr1": 40010,
+      "endAddr": 40031
+    },
+    {
+      "deviceName": "鑳庨潰鏈哄彴2绌烘墭閰嶇疆",
+      "locCode": "JT3",
+      "deviceType": 2,
+      "enable": 1,
+      "beginAddr": 40028,
+      "writeSafetyAddr": 40028,
+      "writeSafetyAddr1": 40032,
+      "readSafetyAddr": 40007,
+      "readSafetyAddr1": 40011,
+      "endAddr": 40030
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/config/\351\205\215\347\275\256\350\257\264\346\230\216.txt" "b/config/\351\205\215\347\275\256\350\257\264\346\230\216.txt"
new file mode 100644
index 0000000..19a76f1
--- /dev/null
+++ "b/config/\351\205\215\347\275\256\350\257\264\346\230\216.txt"
@@ -0,0 +1 @@
+锘�
\ No newline at end of file
diff --git a/core/Monitor.cs b/core/Monitor.cs
new file mode 100644
index 0000000..0cf5ad4
--- /dev/null
+++ b/core/Monitor.cs
@@ -0,0 +1,79 @@
+锘縰sing HH.WCS.ZhongCeJinTan.api;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Web.Services.Description;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+
+namespace HH.WCS.ZhongCeJinTan.core
+{
+    /// <summary>
+    /// 瀹氭椂杞浠诲姟
+    /// </summary>
+    internal class Monitor
+    {
+        /// <summary>
+        /// 鏍规嵁浣滀笟鍒涘缓瀵瑰簲浠诲姟
+        /// </summary>
+        public static void CreateTask()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+
+            // 鑾峰彇鎵�湁绛夊緟涓殑浣滀笟
+            var operations = db.Queryable<WmsWork>().Where(p => p.N_B_STATE == 0).ToList();
+            foreach (var operation in operations)
+            {
+                TaskHelper.CreateTask(operation);
+            }
+        }
+
+
+        /// <summary>
+        /// 鏍规嵁浠诲姟鐘舵�鏇存柊浣滀笟鐘舵�
+        /// </summary>
+        public static void UpdateWorkState() {
+
+            var db = new SqlHelper<object>().GetInstance();
+
+            var operations = db.Queryable<WmsWork>().Where(p => p.N_B_STATE == 1).ToList();
+
+            foreach (var operation in operations)
+            {
+                // 鍒ゆ柇璇ヤ换鍔℃槸鍚﹀叏閮ㄥ畬鎴�+                var tasks = db.Queryable<WMSTask>().Where(p => p.S_OP_CODE == operation.S_CODE).ToList();
+
+
+                if (tasks.Count == tasks.Count(p => p.N_B_STATE == 3))
+                {
+                    operation.N_B_STATE = 2;
+                    operation.S_B_STATE = "瀹屾垚";
+                    operation.T_MODIFY = DateTime.Now;
+                    operation.T_END_TIME = DateTime.Now;
+                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE,it.T_MODIFY,it.T_END_TIME }).ExecuteCommand();
+                  
+                }
+                else if (tasks.Count(p => p.N_B_STATE == 5) > 0)
+                {
+                    operation.N_B_STATE = 7;
+                    operation.S_B_STATE = "鍙栨秷";
+                    operation.T_MODIFY = DateTime.Now;
+                    operation.T_END_TIME = DateTime.Now;
+
+                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY, it.T_END_TIME }).ExecuteCommand();
+                }
+            }
+        }
+
+
+
+
+    }
+}
diff --git a/core/TaskCore.cs b/core/TaskCore.cs
new file mode 100644
index 0000000..ed22626
--- /dev/null
+++ b/core/TaskCore.cs
@@ -0,0 +1,135 @@
+锘縰sing HH.WCS.ZhongCeJinTan.api;
+using HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Web.Services.Description;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+using static HH.WCS.ZhongCeJinTan.util.Settings;
+
+namespace HH.WCS.ZhongCeJinTan.core
+{
+    internal class TaskCore
+    {
+        public static void OperateTaskStatus(AgvTaskState model) {
+
+            var wmsTask = TaskHelper.GetTask(model.task_no);
+            var db = new SqlHelper<object>().GetInstance();
+
+            LogHelper.Info("OperateTaskStatus--浠诲姟淇℃伅" + JsonConvert.SerializeObject(wmsTask), "API");
+            LogHelper.Info("OperateTaskStatus--鍙傛暟淇℃伅" + JsonConvert.SerializeObject(model), "API");
+            if (wmsTask != null)
+                {
+                    if (model.state <= 7)
+                    {
+                        //鏈変换鍔″彿璇锋眰
+                        switch (model.state)
+                        {
+                            case 1:
+                                TaskHelper.Begin(wmsTask);
+                                //鑳庨潰浜や簰
+                                TaskHelper.TmSafety(wmsTask);
+                                break;
+                            case 3:
+                                TaskHelper.UpdateStatus(wmsTask, "寮�鍙栬揣");
+                            break;
+                            case 4:
+                                TaskHelper.UpdateStatus(wmsTask, "鍙栬揣瀹屾垚");
+                                LocationHelper.UnLockLoc(wmsTask.S_START_LOC);
+                                TaskProcess.OperateStatus(wmsTask, 4);
+                            break;
+                            case 5:
+                                TaskHelper.UpdateStatus(wmsTask, "寮�鍗歌揣");
+                                break;
+                            case 6:
+                                TaskHelper.UpdateStatus(wmsTask, "鍗歌揣瀹屾垚");
+                                LocationHelper.UnLockLoc(wmsTask.S_END_LOC);
+                                TaskProcess.OperateStatus(wmsTask, 6);
+
+                                //濡傛灉鏄簩娈典换鍔″垯涓嬪彂绔嬪簱浠诲姟
+                                var wcsTask = TaskHelper.GetTaskByState("鏈墽琛�, "wcs", wmsTask.S_OP_CODE,"鍏ュ簱");
+                                if (wcsTask!=null)
+                                {
+                                    LocationHelper.LockLoc(wcsTask.S_START_LOC, "鍑哄簱閿�, 2);
+                                    WcsTask.WcsTaskEntity(wcsTask);
+                                }                        
+                            break;
+                            case 2:
+                                TaskHelper.End(wmsTask); 
+                            break;
+                            case 7:
+                                TaskHelper.Fail(wmsTask);
+                                TaskProcess.OperateStatus(wmsTask, 7);
+                                //鍏ュ簱鎴栬�鍥炲簱浠诲姟鍙栨秷鍒犻櫎鎵樼洏鐗╂枡
+                                if (wmsTask.S_TYPE.Contains("鍏ュ簱") || wmsTask.S_TYPE.Contains("鍥炲簱"))
+                                {
+                                    ContainerHelper.delCntr(wmsTask.S_CNTR_CODE);
+                                    ContainerHelper.delCntrItem(wmsTask.S_CNTR_CODE);
+                                }
+                                    //鍑哄簱鍙栨秷鍒ゆ柇鎺ラ┏浣嶆槸鍚︽湁璐э紝鏈夎揣闇�瑙g粦
+                                    if (!WcsTask.WcsCvstate(wmsTask))
+                                    {
+                                        LogHelper.Info($"Wcs绔嬪簱鎺ラ┏浣嶆棤璐э紝瑙g粦璐т綅:{wmsTask.S_START_LOC}", "绔嬪簱");
+                                        TaskProcess.OperateStatus(wmsTask, 4);
+                                        ContainerHelper.delCntr(wmsTask.S_CNTR_CODE);
+                                        ContainerHelper.delCntrItem(wmsTask.S_CNTR_CODE);
+                                    } 
+                                break;
+
+                        }
+                         TaskHelper.AddActionRecord(wmsTask.S_CODE, model.state, model.forklift_no, model.ext_data);
+                        //agv鎵ц閫氱煡
+                        //WcsTask.WcsCallback(wmsTask, model.state, model.forklift_no);
+                }
+                else
+                {
+                    //瀹夊叏璇锋眰绛�+                    TaskProcess.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
+                }
+            }
+        
+        }
+      
+
+
+
+
+
+        /// <summary>
+        /// agv浠诲姟鍒嗗彂
+        /// </summary>
+        internal static void Dispatch() {
+            //鏌ヨ浠诲姟
+            //鑾峰彇鎵�湁鏈墽琛岀殑agv浠诲姟
+            var list = TaskHelper.GetTaskListByState("鏈墽琛�, "agv");
+            if (list.Count > 0) {
+                list.ForEach(task => {
+                        TaskProcess.SendTask(task);
+                });     
+            }
+        }
+
+        /// <summary>
+        /// 绔嬪簱浠诲姟鍒嗗彂
+        /// </summary>
+        internal static void Dispatch1()
+        {
+            //鏌ヨ浠诲姟
+            //鑾峰彇鎵�湁鏈墽琛岀殑wcs浠诲姟
+            var list = TaskHelper.GetWcsTaskListByState("鏈墽琛�, "wcs","鍑哄簱");
+            if (list.Count > 0)
+            {
+                list.ForEach(task => {
+                    WcsTask.WcsTaskEntity(task);
+                });
+            }
+        }
+    }
+}
diff --git a/device/ModbusHelper.cs b/device/ModbusHelper.cs
new file mode 100644
index 0000000..7ca6cab
--- /dev/null
+++ b/device/ModbusHelper.cs
@@ -0,0 +1,239 @@
+锘縰sing EasyModbus;
+using HH.WCS.ZhongCeJinTan.util;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+using static HH.WCS.ZhongCeJinTan.device.TcpServer;
+
+namespace HH.WCS.ZhongCeJinTan.device
+{
+    internal 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 bool[] ReadCoils(int address, int qty, string ip, int port = 502) {
+            bool[] res = new bool[0];
+            LogHelper.Info($"ReadCoils:SendMsg:Addr:{address},Qty:{qty},Ip:{ip},Port:{port}", "ModBus");
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                client.ConnectionTimeout = 3500;
+                try
+                {
+                    res = client.ReadCoils(address, qty);
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            LogHelper.Info($"ReadCoils:ReqMsg:{JsonConvert.SerializeObject(res)},Addr:{address},Ip:{ip},Port:{port}", "ModBus");
+            return res;
+        }
+        /// <summary>
+        /// 璇荤鏁h緭鍏�+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal 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;
+
+        }
+
+        static object ReadHoldingRegistersLock = new object();
+        /// <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) {
+            int[] res = new int[0];
+            lock (ReadHoldingRegistersLock)
+            {
+                LogHelper.Info($"ReadHoldingRegisters:SendMsg:Addr:{address},Qty:{qty},Ip:{TmIp},Port:{TmPort}", "ModBus");
+
+                var client = GetClient(TmIp, TmPort);
+                if (client != null && client.Connected)
+                {
+                    client.ConnectionTimeout = 5000;
+                    try
+                    {
+                        res = client.ReadHoldingRegisters(address, qty);
+                        client.Disconnect();
+                    }
+                    catch (Exception ex)
+                    {
+                        //LogHelper.Error(ex.Message, ex);
+                        LogHelper.Info($"ReadHoldingRegisters锛欵rror:{ex.Message}");
+                    }
+                }
+                LogHelper.Info($"ReadHoldingRegisters:ReqMsg:{JsonConvert.SerializeObject(res)},Addr:{address},Ip:{TmIp},Port:{TmPort}", "ModBus");
+            }
+            return res;
+        }
+        /// <summary>
+        /// 璇昏緭鍏ュ瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal 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 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 bool WriteMultipleCoils(int address, bool[] values, string ip, int port = 502) {
+            var res = false;
+            LogHelper.Info($"WriteMultipleCoils:SendMsg:Addr:{address},Values:{values},Ip:{ip},Port:{port}","ModBus");
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                client.ConnectionTimeout = 3500;
+                try {
+                    client.WriteMultipleCoils(address, values);
+                    res = true;
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            LogHelper.Info($"WriteMultipleCoils:ReqMsg:{JsonConvert.SerializeObject(res)},Addr:{address},Values:{values},Ip:{ip},Port:{port}", "ModBus");
+            return res;
+        }
+
+
+        static string TmIp = Settings.TmDeviceIp;
+        static int TmPort = Settings.TmDevicePort;
+
+
+        /// <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) {
+            var res = false;
+            var client = GetClient(TmIp, TmPort);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteSingleRegister(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 bool WriteMultipleRegisters(int address, int[] values, string ip, int port = 503) {
+            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;
+        }
+
+        static ModbusClient GetClient(string ip, int port) {
+            ModbusClient client = null;
+            LogHelper.Info($"GetClient:ip:{ip},port:{port}","ModBus");
+            if (!clients.ContainsKey(ip)) {
+                LogHelper.Info($"GetClient:ip:{ip},port:{port}.閾炬帴涓嶅瓨鍦紝寮�閾炬帴", "ModBus");
+                client = new ModbusClient(ip, port);
+                try {
+                    client.Connect();
+                    //clients[ip] = client;
+                    LogHelper.Info($"GetClient:ip:{ip},port:{port}.閾炬帴鎴愬姛", "ModBus");
+                }
+                catch (Exception ex) {
+                    LogHelper.Info($"GetClient:ip:{ip},port:{port}.閾炬帴寮傚父锛歿ex.Message}", "ModBus");
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return client;
+        }
+    }
+
+    
+}
diff --git a/device/PlcHelper.cs b/device/PlcHelper.cs
new file mode 100644
index 0000000..ae5abb5
--- /dev/null
+++ b/device/PlcHelper.cs
@@ -0,0 +1,89 @@
+锘縰sing HH.WCS.ZhongCeJinTan.process;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.ZhongCeJinTan.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 byte[] CRC16LH(byte[] pDataBytes) {
+            ushort crc = 0xffff;
+            ushort polynom = 0xA001;
+
+            for (int i = 0; i < pDataBytes.Length; i++) {
+                crc ^= pDataBytes[i];
+                for (int j = 0; j < 8; j++) {
+                    if ((crc & 0x01) == 0x01) {
+                        crc >>= 1;
+                        crc ^= polynom;
+                    }
+                    else {
+                        crc >>= 1;
+                    }
+                }
+            }
+
+            byte[] result = BitConverter.GetBytes(crc);
+            return result;
+        }
+        internal static byte[] CRC16HL(byte[] pDataBytes) {
+            ushort crc = 0xffff;
+            ushort polynom = 0xA001;
+
+            for (int i = 0; i < pDataBytes.Length; i++) {
+                crc ^= pDataBytes[i];
+                for (int j = 0; j < 8; j++) {
+                    if ((crc & 0x01) == 0x01) {
+                        crc >>= 1;
+                        crc ^= polynom;
+                    }
+                    else {
+                        crc >>= 1;
+                    }
+                }
+            }
+
+            byte[] result = BitConverter.GetBytes(crc).Reverse().ToArray();
+            return result;
+        }
+
+        #endregion
+    }
+}
diff --git a/device/TcpServer.cs b/device/TcpServer.cs
new file mode 100644
index 0000000..bae680c
--- /dev/null
+++ b/device/TcpServer.cs
@@ -0,0 +1,158 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text.RegularExpressions;
+
+namespace HH.WCS.ZhongCeJinTan.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缁戝畾鍒颁富鏈轰笂闈㈢殑鏌愪釜绔彛
+                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), 2024));
+                Console.WriteLine("寮�惎tcp server 2024");
+                //鍚姩鐩戝惉锛屽苟涓旇缃竴涓渶澶х殑闃熷垪闀垮害
+                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")
+                        {
+                            //娑堟伅鍒嗗壊锛屽幓閲�+                            var list = Regex.Split(message, "0d0a", RegexOptions.IgnoreCase).Distinct().ToList();
+                            foreach (var item in list)
+                            {
+                                if (!string.IsNullOrEmpty(item))
+                                {
+                                    string msg = item.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/dispatch/GZRobot.cs b/dispatch/GZRobot.cs
new file mode 100644
index 0000000..09e0caa
--- /dev/null
+++ b/dispatch/GZRobot.cs
@@ -0,0 +1,520 @@
+锘縰sing HH.WCS.ZhongCeJinTan.core;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Web.Caching;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+
+namespace HH.WCS.ZhongCeJinTan.dispatch
+{
+    /// <summary>
+    /// 鍥借嚜璋冨害杈呭姪绫�+    /// </summary>
+    public class GZRobot
+    {
+        private static readonly HttpHelper apiHelper = new HttpHelper();
+
+        private static readonly string baseUrl = "";
+
+        private static readonly string baseUrl1 = "";
+
+        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);
+            LogHelper.Info($"鎺ㄩ�涓�ゼ鍙傛暟淇℃伅{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 int CreateOrder1(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(baseUrl1 + "api/om/order/", request);
+            msg = $"[guozi-CreateOrder] request={request} response={response}";
+            Console.WriteLine(msg);
+            LogHelper.Info($"鎺ㄩ�涓夋ゼ鍙傛暟淇℃伅{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 CancelGZOrder(int orderId)
+        {
+            bool result = false;
+            string msg = "";
+            List<CancelGZOrderInfo> requests = new List<CancelGZOrderInfo>();
+            var request = new CancelGZOrderInfo() { order_id = orderId, order_command_type_id = 2 };
+            requests.Add(request);
+            var response = apiHelper.Put(baseUrl + "api/om/order/order-command/", JsonConvert.SerializeObject(requests));
+            msg = $"[guozi-CancelOrder] request={requests};response={response}";
+            LogHelper.Info($"{msg}", "浠诲姟");
+            if (response != "")
+            {
+                var dataResult = JsonConvert.DeserializeObject<CancelGZOrderResult>(response);
+                if (dataResult.code == 0)
+                {
+                    msg = "[guozi-CancelOrder]鍙栨秷璁㈠崟鎴愬姛";
+                    Console.WriteLine(msg);
+                    result = true;
+                    return result;
+                }
+            }
+            else
+            {
+                msg = "[guozi-CancelOrder]鍙栨秷璁㈠崟澶辫触";
+                Console.WriteLine(msg);
+            }
+            return result;
+        }
+
+        public static bool CancelGZOrder1(int orderId)
+        {
+            bool result = false;
+            string msg = "";
+            List<CancelGZOrderInfo> requests = new List<CancelGZOrderInfo>();
+            var request = new CancelGZOrderInfo() { order_id = orderId, order_command_type_id = 2 };
+            requests.Add(request);
+            var response = apiHelper.Put(baseUrl1 + "api/om/order/order-command/", JsonConvert.SerializeObject(requests));
+            msg = $"[guozi-CancelOrder] request={requests};response={response}";
+            LogHelper.Info($"{msg}", "浠诲姟");
+            if (response != "")
+            {
+                var dataResult = JsonConvert.DeserializeObject<CancelGZOrderResult>(response);
+                if (dataResult.code == 0)
+                {
+                    msg = "[guozi-CancelOrder]鍙栨秷璁㈠崟鎴愬姛";
+                    Console.WriteLine(msg);
+                    result = true;
+                    return result;
+                }
+            }
+            else
+            {
+                msg = "[guozi-CancelOrder]鍙栨秷璁㈠崟澶辫触";
+                Console.WriteLine(msg);
+            }
+            return result;
+        }
+
+
+
+
+        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<CancelOrderResult>(response);
+                if (dataResult.code == 0)
+                {
+                    msg = "[guozi-CancelOrder]鍙栨秷璁㈠崟鎴愬姛";
+                    Console.WriteLine(msg);
+                    result = true;
+                    return result;
+                }
+            }
+            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="id"></param>
+        /// <returns></returns>
+        public static AgvTaskState QueryOrder(string taskNo)
+        {
+            AgvTaskState result = new AgvTaskState();
+            string msg = "";
+            var response = apiHelper.Get(baseUrl + $"api/om/order/?order_name={taskNo}");
+            msg = $"[guozi-QueryOrderResult] request={taskNo};response={response}";
+            Console.WriteLine(msg);
+            if (response != "")
+            {
+                var req = JsonConvert.DeserializeObject<QueryOrderResult1>(response);
+                LogHelper.Info($"{req.data.Count}");
+                if (req.code == 0 && req.data.Count > 0)
+                {
+                    switch (req.data[0].orderStatus)
+                    {
+                        case "active":
+                            result.state = 1;
+                            break;
+                        case "source_finish":
+                            //鍙栬揣瀹屾垚
+                            result.state = 4;
+                            break;
+                        case "dest_finish":
+                            //鍗歌揣瀹屾垚
+                            result.state = 6;
+                            break;
+                        case "finish":
+                            result.state = 2;
+                            break;
+                        case "cancel_finish":
+                            result.state = 7;
+                            break;
+                        default:
+                            result.state = 0;
+                            break;
+                    }
+                    result.task_no = req.data[0].orderName;
+                    if (req.data[0].agvIDList != null)
+                    {
+                        result.forklift_no = req.data[0].agvIDList[0].ToString();
+                    }
+                    TaskCore.OperateTaskStatus(result);
+                }
+            }
+            else
+            {
+                msg = "[guozi-QueryOrderResult]鏌ヨ璁㈠崟淇℃伅澶辫触";
+                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.task_no = model.orderName;
+                agv.forklift_no = model.agvIDList;
+                TaskCore.OperateTaskStatus(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 CancelGZOrderInfo
+    {
+        public int order_id { get; set; }
+
+        public int order_command_type_id { get; set; }
+
+    }
+    public class CancelGZOrderResult
+    {
+        public string app_name { get; set; }
+        public string version { get; set; }
+        public int code { get; set; }
+        public string msg { get; set; }
+        public cancle data { get; set; }
+        public List<int> success_list { get; set; }
+        public List<int> error_list { get; set; }
+    }
+    public class cancle
+    {
+        public List<success_list> success_list { get; set; }
+        public List<error_list> error_list { 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 CancelOrderResult
+    {
+        public string app_name { get; set; }
+        public string version { get; set; }
+        public int code { get; set; }
+        public string msg { get; set; }
+        public cancle data { get; set; }
+    }
+
+
+    public class success_list
+    {
+        public int order_id { get; set; }
+    }
+
+    public class error_list
+    {
+    }
+
+
+    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; }//{"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 QueryOrderResult1
+    {
+        public string app_name { get; set; }
+        public string version { get; set; }
+        public int code { get; set; }
+        public string msg { get; set; }
+        public List<data> data { 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/dispatch/HostToAGV.cs b/dispatch/HostToAGV.cs
new file mode 100644
index 0000000..135028d
--- /dev/null
+++ b/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 partial 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 partial 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 partial 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 partial 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 partial 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 partial 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 partial 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 partial 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/dispatch/NDCApi.cs b/dispatch/NDCApi.cs
new file mode 100644
index 0000000..cfa881c
--- /dev/null
+++ b/dispatch/NDCApi.cs
@@ -0,0 +1,259 @@
+锘縰sing HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using SqlSugar;
+using System.Security.Policy;
+using Newtonsoft.Json;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+using System.Reflection;
+using static HH.WCS.ZhongCeJinTan.process.TaskProcess;
+using HH.WCS.ZhongCeJinTan;
+namespace HH.WCS.Mobox3.ZhongCeJinTan.dispatch
+{
+    public class NDCApi
+    {
+        public static string NDCApiUrl { set; get; }
+        static NDCApi() {
+
+            NDCApiUrl = Settings.NDCApiUrl;
+        }
+
+        public static AgvApiResult AddOrderNew(int ts, int pri, string taskNo, List<param> param) 
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+            var model = new AddOrderNewModel();
+            model.ts_no = ts;
+            model.pri = pri;
+            model.task_no = taskNo;
+            model.param = param;
+            try {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{taskNo}涓嬪彂锛寋jsonInfo}" , "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "Add", jsonInfo);
+                LogHelper.Info($"浠诲姟涓嬪彂缁撴灉res={result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e) {
+                LogHelper.Info($"浠诲姟涓嬪彂澶辫触 res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+        }
+
+        public static AgvApiResult AddOrderNew(AddOrderNewModel model)
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+
+            try
+            {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{model.task_no}涓嬪彂锛寋jsonInfo}", "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "Add", jsonInfo);
+                LogHelper.Info($"浠诲姟涓嬪彂缁撴灉res={result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"浠诲姟涓嬪彂澶辫触 res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+        }
+
+        public static AgvApiResult CancelOrder(string tsNo, bool is_force = true) 
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+            var model = new CancelOrderModel();
+            model.task_no = tsNo;
+            model.is_force = is_force;
+            try {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙栨秷锛寋jsonInfo}", "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "Cancel", jsonInfo);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙栨秷缁撴灉={result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e) {
+                LogHelper.Info($"CancelOrder  res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+        }
+
+        public static AgvApiResult CancelOrder(CancelOrderModel model)
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+            try
+            {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙栨秷锛寋jsonInfo}", "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "Cancel", jsonInfo);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙栨秷缁撴灉={result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"CancelOrder  res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+
+        }
+
+        public static AgvApiResult ChangeOrderPri(string taskNo, int newPri)
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+            var model = new ChangePriModel();
+            model.task_no = taskNo;
+            model.pri = newPri;
+            try
+            {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{model.task_no}浼樺厛绾ф洿鏀癸紝{jsonInfo}", "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "ChangePri", jsonInfo);
+                LogHelper.Info($"浠诲姟{model.task_no}浼樺厛绾ф洿鏀圭粨鏋�{result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"ChangeOrderPri res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+        }
+
+        public static AgvApiResult ChangeOrderPri(ChangePriModel model)
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+            try
+            {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{model.task_no}浼樺厛绾ф洿鏀癸紝{jsonInfo}", "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "ChangePri", jsonInfo);
+                LogHelper.Info($"浠诲姟{model.task_no}浼樺厛绾ф洿鏀圭粨鏋�{result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"ChangeOrderPri res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+        }
+
+        public static AgvApiResult ChangeOrderParam(string taskNo,int paramNo, string paramStr) 
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+            var model = new ChangeParamModel();
+            model.task_no = taskNo;
+            model.param_no = paramNo;
+            model.param = paramStr;
+            try {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙傛暟鏇存敼锛寋jsonInfo}", "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "ChangeParam", jsonInfo);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙傛暟鏇存敼缁撴灉={result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e) {
+                LogHelper.Info($"ChangeOrderParam res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+        }
+
+        public static AgvApiResult ChangeOrderParam(ChangeParamModel model)
+        {
+            var httpH = new HttpHelper();
+            var agvApiResult = new AgvApiResult();
+            try
+            {
+                string jsonInfo = JsonConvert.SerializeObject(model);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙傛暟鏇存敼锛寋jsonInfo}", "NDC");
+                var result = httpH.WebPost(NDCApiUrl + "ChangeParam", jsonInfo);
+                LogHelper.Info($"浠诲姟{model.task_no}鍙傛暟鏇存敼缁撴灉={result}", "NDC");
+                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
+                return agvApiResult;
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"ChangeOrderParam res={e.Message}", "NDC");
+                agvApiResult.err_code = -1;
+                agvApiResult.err_msg = e.Message;
+                return agvApiResult;
+            }
+        }
+
+    }
+
+    /// <summary>
+    /// 杩斿洖淇℃伅Model
+    /// </summary>
+    public class AgvApiResult
+    {
+        public int err_code { set; get; }//寮傚父鐮侊細0 - 姝e父锛屽叾瀹冨�涓哄紓甯搁敊璇爜
+        public string err_msg { set; get; }//杩斿洖鐨勯敊璇弿杩帮紝鍦�err_code <> 0 鏃惰繑鍥�+        public object result { set; get; }//姝g‘杩斿洖鐨勭粨鏋滃唴瀹癸紝鍦�err_code = 0 涓旀湁杩斿洖鍐呭鏃�+    }
+
+    public class AddOrderNewModel
+    {
+        public int ts_no { set; get; }//TS 鍙凤紝蹇呴』鏈夊�	
+        public int pri { set; get; }//浼樺厛绾�+        public string task_no { set; get; }//涓婃父浠诲姟缂栫爜锛屽鏋�no_feedback = 1 鏃讹紝鍙互涓虹┖
+        public List<param> param { set; get; } = new List<param>();//鍙傛暟鍒楄〃
+    }
+
+
+    public class param
+    {
+        public string name { set; get; }//鍙傛暟鍚�+        public string value { set; get; }//鍙傛暟鍊�+    }
+
+    public class CancelOrderModel
+    {
+        public string task_no { set; get; }//涓婃父浠诲姟缂栫爜
+        public bool is_force { set; get; } = true;//鏄惁寮哄埗鍙栨秷锛� 鈥�寮哄埗
+    }
+
+    public class ChangeParamModel
+    {
+        public string task_no { set; get; }//涓婃父浠诲姟缂栫爜
+        public int param_no { set; get; }//鍙傛暟鍙�+        public string param { set; get; }//鍙傛暟鍐呭锛屽涓弬鏁颁互鑻辨枃鍒嗗彿(;)鍒嗛殧
+    }
+
+    public class ChangePriModel
+    {
+        public string task_no { set; get; }//涓婃父浠诲姟缂栫爜
+        public int pri { set; get; }//鏂颁紭鍏堢骇
+    }
+}
diff --git a/dispatch/WcsTask.cs b/dispatch/WcsTask.cs
new file mode 100644
index 0000000..b1ea96d
--- /dev/null
+++ b/dispatch/WcsTask.cs
@@ -0,0 +1,1376 @@
+锘縰sing HanHe.Message;
+using HH.WCS.Mobox3.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.api;
+using HH.WCS.ZhongCeJinTan.process;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using S7.Net.Types;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Services.Description;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
+
+namespace HH.WCS.ZhongCeJinTan.dispatch
+{
+    /// <summary>
+    /// wcs浠诲姟鐩稿叧
+    /// </summary>
+    internal class WcsTask
+    {
+        private static readonly HttpHelper apiHelper = new HttpHelper();
+        private static readonly string baseUrl = Settings.WcsApiAddres;
+
+
+        /// <summary>
+        /// 鐢熸垚浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <returns></returns>
+        public static bool WcsTaskEntity(WMSTask mst, CntrItemRel Item = null)
+        {
+            string Type = "";
+            string TrayType = "";
+            string Traycode = mst.S_CNTR_CODE;
+            var isFu = "0";
+
+            var cntr = ContainerHelper.GetCntr(Traycode);
+
+            if (cntr!=null)
+            {
+                if (cntr.N_DETAIL_COUNT>0)
+                {
+                    isFu = "1";
+                }
+            }
+            var workFlow = TaskHelper.selectWorkFlowByType(mst.N_TYPE.ToString(), mst.TOOLSTYPE);
+
+            
+
+            if (workFlow != null)
+            {
+                if (workFlow.INOROUT.Contains("鍏ュ簱"))
+                {
+                    Type = "1";
+                }
+
+                if (workFlow.INOROUT.Contains("鍑哄簱"))
+                {
+                    Type = "2";
+                }
+            }
+
+            if (mst.S_CNTR_CODE.Contains("KJZ"))
+            {
+                TrayType = "KJZ";
+            }
+           
+            var interact = new
+            {
+                requestPk = mst.S_CODE,//浠诲姟鍙�+                contNo = Traycode,//鎵樼洏鍙�+                contType = TrayType,//鎵樼洏绫诲瀷
+                trkType = Type,//浠诲姟绫诲瀷
+                trkPrty = mst.N_PRIORITY,//浠诲姟浼樺厛绾�+                frmPos = mst.S_START_LOC,//璧峰浣嶇疆
+                toPos = mst.S_END_LOC,//鐩殑鍦�+                isFull = isFu,//绌烘墭 婊℃墭
+                groupNo = Item?.S_ITEM_NAME,//鎼�缁勫彿
+                clientCode = "WMS",//鎿嶄綔浜�+                operationTime = DateTime.Now.ToString()//鎿嶄綔鏃堕棿
+            };
+            LogHelper.Info("Wcs绔嬪簱涓嬪彂浠诲姟 鍦板潃淇℃伅:" + baseUrl + "receive", "绔嬪簱涓嬪彂浠诲姟");
+            LogHelper.Info("Wcs绔嬪簱涓嬪彂浠诲姟 鍙傛暟淇℃伅:" + JsonConvert.SerializeObject(interact), "绔嬪簱涓嬪彂浠诲姟");
+            var result = apiHelper.Post(baseUrl + "receive", JsonConvert.SerializeObject(interact));
+            LogHelper.Info("Wcs绔嬪簱涓嬪彂浠诲姟 杩斿洖淇℃伅:" + JsonConvert.SerializeObject(result), "绔嬪簱涓嬪彂浠诲姟");
+            if (!string.IsNullOrEmpty(result))
+            {
+                var res = JsonConvert.DeserializeObject<WcsTaskReturn>(result);
+                if (res.code == "0")
+                {
+                    TaskHelper.UpdateStatus(mst, "宸叉帹閫�);
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                LogHelper.Info("Wcs绔嬪簱涓嬪彂浠诲姟 杩斿洖淇℃伅涓虹┖", "绔嬪簱涓嬪彂浠诲姟");
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 鍙栨秷浠诲姟
+        /// </summary>
+        /// <returns></returns>
+        public static bool WcsCancellTask(WMSTask mst)
+        {
+            var interact = new
+            {
+                requestPk = mst.S_CODE,//璇锋眰pk
+                contNo = mst.S_CNTR_CODE,//鎵樼洏鍙�+                clientCode = "",
+                reqTime = DateTime.Now.ToString()//鎿嶄綔鏃堕棿
+            };
+            LogHelper.Info("Wcs绔嬪簱鍙栨秷浠诲姟 鍦板潃淇℃伅:" + baseUrl + "cancel", "绔嬪簱鍙栨秷浠诲姟");
+            LogHelper.Info("Wcs绔嬪簱鍙栨秷浠诲姟 鍙傛暟淇℃伅:" + JsonConvert.SerializeObject(interact), "绔嬪簱鍙栨秷浠诲姟");
+            var result = apiHelper.Post(baseUrl + "cancel", JsonConvert.SerializeObject(interact));
+            LogHelper.Info("Wcs绔嬪簱鍙栨秷浠诲姟 杩斿洖淇℃伅:" + JsonConvert.SerializeObject(result), "绔嬪簱鍙栨秷浠诲姟");
+            if (!string.IsNullOrEmpty(result))
+            {
+                var res = JsonConvert.DeserializeObject<WcsTaskReturn>(result);
+                if (res.code == "0")
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            else {
+                LogHelper.Info("Wcs绔嬪簱鍙栨秷浠诲姟 杩斿洖淇℃伅涓虹┖", "绔嬪簱鍙栨秷浠诲姟");
+                return false;
+            }
+        }
+
+
+
+
+        /// <summary>
+        /// 杈撻�绾挎槸鍚︽湁璐ф煡璇�+        /// </summary>
+        /// <returns></returns>
+        public static bool WcsCvstate(WMSTask aloneWcsTask)
+        {
+
+            if (!aloneWcsTask.S_TYPE.Contains("鍑哄簱"))
+            {
+                return false;
+            }
+            var safety = Settings.safetyLocations.Where(a => a.Area.Contains(aloneWcsTask.S_START_AREA)).FirstOrDefault();
+
+            if (safety==null)
+            {
+                return false;
+            }
+
+            if (safety.type!=1)
+            {
+                return false;
+            }
+
+            var interact = new
+            {
+                requestPk = aloneWcsTask.S_CODE,//璇锋眰缂栧彿
+                clientCode = "WMS",// 鎿嶄綔浜�濡俉MS/MES绛�+                stnNo = aloneWcsTask.S_START_LOC,//鎺ラ┏浣�+                reqTime = DateTime.Now.ToString()//鎿嶄綔鏃堕棿
+            };
+            LogHelper.Info("Wcs绔嬪簱杈撻�绾挎槸鍚︽湁璐�鍦板潃淇℃伅:" + baseUrl + "CV-state", "绔嬪簱");
+            LogHelper.Info("Wcs绔嬪簱杈撻�绾挎槸鍚︽湁璐�鍙傛暟淇℃伅:" + JsonConvert.SerializeObject(interact), "绔嬪簱");
+            var result = apiHelper.Post(baseUrl + "CV-state", JsonConvert.SerializeObject(interact));
+            LogHelper.Info("Wcs绔嬪簱杈撻�绾挎槸鍚︽湁璐�杩斿洖淇℃伅:" + JsonConvert.SerializeObject(result), "绔嬪簱");
+            if (!string.IsNullOrEmpty(result))
+            {
+                var res = JsonConvert.DeserializeObject<WcsTaskReturn>(result);
+                if (res.status == "1")
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                LogHelper.Info("Wcs绔嬪簱杈撻�绾挎槸鍚︽湁璐�杩斿洖淇℃伅涓虹┖", "绔嬪簱");
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// Wcs浠诲姟涓嬪彂
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static WcsWarningReurn ZcWcsInWorkArea(WcsOperateTaskParme1 model)
+        {
+            var result = new WcsWarningReurn();
+            var newDb = new SqlHelper<object>().GetInstance();
+
+            try
+            {
+
+                var taskNo = "";
+
+                if (string.IsNullOrEmpty(model.requestPk))
+                {
+                    LogHelper.Info("浠诲姟鍙蜂负绌�, "Wcs涓嬪彂浠诲姟");
+                    throw new Exception("浠诲姟鍙蜂负绌�);
+                }
+                else
+                {
+                    taskNo = model.requestPk;
+                }
+
+
+                if (model.noticeType == "0" || model.noticeType == "6")
+                {
+                    if (string.IsNullOrEmpty(model.contNo) )
+                    {
+                        LogHelper.Info("contNo鍜宑urPos涓嶈兘涓虹┖", "Wcs涓嬪彂浠诲姟");
+                        throw new Exception("contNo鍜宑urPos涓嶈兘涓虹┖");
+                    }
+                }
+
+                if (string.IsNullOrEmpty(model.curPos))
+                {
+                     LogHelper.Info("curPos涓嶈兘涓虹┖", "Wcs涓嬪彂浠诲姟");
+                     throw new Exception("curPos涓嶈兘涓虹┖");
+                }
+
+              
+
+                if (addWcsTask(model))
+                {
+                    result.msg = "Wcs涓嬪彂浠诲姟鎴愬姛";
+                    result.code = "0";
+                }
+                else {
+                    result.msg = "Wcs涓嬪彂浠诲姟澶辫触";
+                    result.code = "1";
+                }
+                return result;
+
+            }
+            catch (Exception ex)
+            {
+                newDb.RollbackTran();
+                result.msg = ex.Message;
+                result.code = "1";
+                LogHelper.Info("Wcs涓嬪彂浠诲姟寮傚父" + ex.Message, "Wcs涓嬪彂浠诲姟");
+                return result;
+            }
+            return result;
+        }
+        /// <summary>
+        /// Wcs婊℃墭鍏ュ拰绌烘墭鍑�+        /// </summary>
+        internal static bool addWcsTask(WcsOperateTaskParme1 model)
+        {
+                //浣滀笟娴佺▼
+                WorkFlow workFlow =null;
+
+                
+
+                 var item = new MesReturnItem();
+
+                switch (model.noticeType)
+                {
+                    //婊℃墭鍏�+                    case "0":
+                    var url = Settings.MesGetItemApi;
+                    var interact = new
+                    {
+                        tagno = model.contNo//鎵樼洏RFID鑺墖缂栧彿
+                    };
+                    LogHelper.Info("Mes鑾峰彇鐗╂枡 鍦板潃淇℃伅:" + url, "Wcs涓嬪彂浠诲姟");
+                    LogHelper.Info("Mes鑾峰彇鐗╂枡 鍙傛暟淇℃伅:" + JsonConvert.SerializeObject(interact), "Wcs涓嬪彂浠诲姟");
+                    var res = apiHelper.Post(url, JsonConvert.SerializeObject(interact));
+                    LogHelper.Info("Mes鑾峰彇鐗╂枡 杩斿洖淇℃伅:" + JsonConvert.SerializeObject(res), "Wcs涓嬪彂浠诲姟");
+                    if (!string.IsNullOrEmpty(res))
+                    {
+                        var res1 = JsonConvert.DeserializeObject<MesReturn>(res);
+                        if (res1.flag)
+                        {
+                            if (res1.obj.Count > 0)
+                            {
+                                item = res1.obj[0];
+                            }
+                            else {
+                                LogHelper.Info("Mes鑾峰彇鐗╂枡 杩斿洖List閿欒", "Wcs涓嬪彂浠诲姟");
+                                throw new Exception("Mes鑾峰彇鐗╂枡 杩斿洖List閿欒");
+                            }
+                        }
+                        else
+                        {
+                            LogHelper.Info("Mes鑾峰彇鐗╂枡 杩斿洖澶辫触" + res1.message, "Wcs涓嬪彂浠诲姟");
+                            throw new Exception("Mes鑾峰彇鐗╂枡 杩斿洖澶辫触" + res1.message);
+                        }
+
+                    }
+                    else
+                    {
+                        LogHelper.Info("Mes鑾峰彇鐗╂枡 杩斿洖淇℃伅涓虹┖", "Wcs涓嬪彂浠诲姟");
+                        throw new Exception("Mes鑾峰彇鐗╂枡 杩斿洖淇℃伅涓虹┖");
+                    }
+
+                    //鏌ユ壘璧风偣
+                    var start1 = LocationHelper.GetLoc(model.curPos);
+                    LogHelper.Info($"ZcWcsInWorkArea鍏ュ簱浠诲姟涓嬪彂璧风偣淇℃伅" + JsonConvert.SerializeObject(start1), "Wcs涓嬪彂浠诲姟");
+
+
+                    if (start1 == null || start1.S_LOCK_STATE != "鏃�)
+                    {
+                        LogHelper.Info($"ZcWcsInWorkArea鍏ュ簱浠诲姟涓嬪彂澶辫触锛岃捣鐐�{model.curPos},娌℃壘鍒版垨鏈夐攣", "Wcs涓嬪彂浠诲姟");
+                        throw new Exception($"璧风偣:{model.curPos},娌℃壘鍒版垨鏈夐攣");
+                    }
+
+
+                    workFlow = TaskHelper.selectWorkFlowByStratArea(model.noticeType, start1.S_AREA_CODE);
+
+                    if (workFlow == null)
+                    {
+                        LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂澶辫触锛宯oticeType:{model.noticeType},娌℃壘鍒板搴斾綔涓氭祦绋�, "Wcs涓嬪彂浠诲姟");
+                        throw new Exception($"noticeType:{model.noticeType},娌℃壘鍒板搴斾綔涓氭祦绋�);
+                    }
+                    else
+                    {
+                        LogHelper.Info($"鍏ュ簱浣滀笟娴佺▼淇℃伅" + JsonConvert.SerializeObject(workFlow), "Wcs涓嬪彂浠诲姟");
+                    }
+
+
+
+                    //鏌ユ壘缁堢偣
+                    var endList1 = LocationHelper.GetAllLocList1(workFlow.ENDAREA);
+
+
+                    if (string.IsNullOrEmpty(model.code))
+                    {
+                        LogHelper.Info($"ZcWcsInWorkArea鍏ュ簱浠诲姟涓嬪彂澶辫触锛宑ode涓虹┖", "Wcs涓嬪彂浠诲姟");
+                        throw new Exception($"code涓虹┖");
+                    }
+
+                    Location end1 = null;
+
+                    //rfid寮傚父锛屽幓寮傚父搴撳尯
+                    if (model.code == "1" || model.contNo == "99")
+                    {
+                        var endList2 = LocationHelper.GetAllLocList1(workFlow.ERRORAREA);
+                        end1 = LocationHelper.FindEndcolByLoc(endList2, workFlow.ERRORAREA);
+                        LogHelper.Info($"ZcWcsInWorkArea涓�浠诲姟鍏ュ紓甯稿簱鍖虹粓鐐逛俊鎭� + JsonConvert.SerializeObject(end1), "Wcs涓嬪彂浠诲姟");
+                    }
+                    else {
+                        end1 = LocationHelper.FindEndcolByLoc(endList1, workFlow.ENDAREA);
+                        LogHelper.Info($"ZcWcsInWorkArea涓�浠诲姟鍏ヤ笁灞傝揣鏋剁粓鐐逛俊鎭� + JsonConvert.SerializeObject(end1), "Wcs涓嬪彂浠诲姟");
+                    }
+
+
+                    LogHelper.Info($"ZcWcsInWorkArea浠诲姟涓嬪彂缁堢偣淇℃伅" + JsonConvert.SerializeObject(end1), "Wcs涓嬪彂浠诲姟");
+
+                    if (end1 == null)
+                    {
+                        LogHelper.Info($"ZcWcsInWorkArea浠诲姟涓嬪彂澶辫触锛岀粓鐐瑰簱鍖簕workFlow.ENDAREA},娌℃壘鍒扮粓鐐�, "Wcs涓嬪彂浠诲姟");
+                        throw new Exception($"缁堢偣搴撳尯{workFlow.ENDAREA},娌℃壘鍒扮粓鐐�);
+                    }
+                    //娣诲姞鎵樼洏鐗╂枡鍏宠仈琛�+                   
+                        CntrItemRel rel = new CntrItemRel();
+                       
+                        rel.S_CNTR_CODE = model.contNo;
+                        rel.PRODUCTIONDATE = DateTime.Parse(item.wrkdatetime);
+                        rel.S_ITEM_CODE = item.recipe;
+                        rel.F_SUM_QTY = item.zl;
+                        rel.TurnCardNum = item.tmh;
+                        rel.facnm = item.facnm;
+                        rel.cdrub= item.cdrub;
+                        rel.mchid = item.mchid;
+                        rel.wdate = item.wdate;
+                        rel.wsht = item.wsht; 
+                        rel.strbat = item.strbat; 
+                        rel.endbat = item.endbat;
+                        rel.planno = item.planno; 
+                        rel.stage  = item.stage;
+                        rel.grd = item.grd;
+                        
+                        ContainerHelper.CreateCntrItem(rel);
+
+
+                    //娣诲姞鎵樼洏
+                    Container cntr1 = new Container();
+                    cntr1.S_CODE = model.contNo;
+                    cntr1.C_ENABLE = "Y";
+                    cntr1.N_DETAIL_COUNT = 1;
+                    cntr1.S_TYPE = "";
+
+                  
+                    ContainerHelper.CreateCntr(cntr1);
+                  
+
+
+
+
+                    //璧风偣缁堢偣鏌ユ壘鎴愬姛锛屽垱寤轰綔涓�+
+                    var taskType1 = int.Parse(workFlow.FLOWCODE);
+
+                    var operation1 = new WmsWork
+                    {
+                        // 浣滀笟鍙�+                        S_CODE = model.requestPk,
+                        // 浣滀笟绫诲瀷
+                        N_TYPE = taskType1,
+                        // 浣滀笟绫诲瀷
+                        S_TYPE = workFlow.FLOWNAME,
+                        // 璧风偣璐т綅
+                        S_START_LOC = start1.S_CODE,
+                        // 璧风偣搴撳尯缂栫爜
+                        S_START_AREA = start1.S_AREA_CODE,
+                        //鎺ラ┏浣�+                        CONNECTION = "",
+                        // 缁堢偣璐т綅
+                        S_END_LOC = end1.S_CODE,
+                        // 缁堢偣搴撳尯缂栫爜
+                        S_END_AREA = end1.S_AREA_CODE,
+                        // 瀹瑰櫒缂栫爜
+                        S_CNTR_CODE = model.contNo,
+                        // 浣滀笟瀹氫箟鍚嶇О
+                        S_OP_DEF_NAME = workFlow.FLOWNAME,
+                        //浼樺厛绾�+                        N_PRIORITY = 1,
+                        //宸ヨ绫诲瀷
+                        TOOLSTYPE = ""
+                    };
+
+                    //鍒涘缓浣滀笟
+                    if (WMSHelper.CreateWmsWork(operation1))
+                    {
+                        LogHelper.Info($"ZcWcsInWorkArea鍏ュ簱浣滀笟鍒涘缓鎴愬姛{operation1.S_CODE}", "Wcs涓嬪彂浠诲姟");
+                        return true;
+                    }
+
+                    break;
+                    //绌烘墭鍑�+                    case "5":
+                    //鏌ユ壘缁欏畾缁堢偣
+                    var end = LocationHelper.GetLoc(model.curPos);
+                    LogHelper.Info($"ZcWcsInWorkArea鍑哄簱浠诲姟涓嬪彂缁堢偣淇℃伅" + JsonConvert.SerializeObject(end), "Wcs涓嬪彂浠诲姟");
+
+
+                    if (end == null || end.S_LOCK_STATE != "鏃�)
+                    {
+                        LogHelper.Info($"ZcWcsInWorkArea鍑哄簱浠诲姟涓嬪彂澶辫触锛岀粓鐐�{model.curPos},娌℃壘鍒版垨鏈夐攣", "Wcs涓嬪彂浠诲姟");
+                        throw new Exception($"缁堢偣:{model.curPos},娌℃壘鍒版垨鏈夐攣");
+                    }
+
+                    workFlow = TaskHelper.selectWorkFlowByType(model.noticeType);
+
+                    if (workFlow == null)
+                    {
+                        LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂澶辫触锛宯oticeType:{model.noticeType},娌℃壘鍒板搴斾綔涓氭祦绋�, "Wcs涓嬪彂浠诲姟");
+                        throw new Exception($"noticeType:{model.noticeType},娌℃壘鍒板搴斾綔涓氭祦绋�);
+                    }
+                    else
+                    {
+                        LogHelper.Info($"鍑哄簱浣滀笟娴佺▼淇℃伅" + JsonConvert.SerializeObject(workFlow), "Wcs涓嬪彂浠诲姟");
+                    }
+
+
+                    //鏌ユ壘璧风偣
+                    var strrtList = LocationHelper.GetAllLocList2(workFlow.STARTAREA);
+                    Location start = null;
+                   
+                    //瀵绘壘璐ф灦绌烘墭锛屼紭鍏堢┖鎵�+                    start = LocationHelper.FindStartcolByHjArea(strrtList, workFlow.STARTAREA);
+                    LogHelper.Info($"ZcWcsInWorkArea鍑哄簱浠诲姟涓嬪彂绌烘墭璧风偣淇℃伅" + JsonConvert.SerializeObject(start), "Wcs涓嬪彂浠诲姟");
+
+                    //娌℃湁绌烘墭鎵剧┖鏋跺瓙
+                    if (start == null) {
+                        start = LocationHelper.FindStartcolByHjAreaKjz(strrtList, workFlow.STARTAREA);
+                    }
+                    LogHelper.Info($"ZcWcsInWorkArea鍑哄簱浠诲姟涓嬪彂绌烘灦瀛愯捣鐐逛俊鎭� + JsonConvert.SerializeObject(start), "Wcs涓嬪彂浠诲姟");
+                    if (start == null)
+                    {
+                        LogHelper.Info($"ZcWcsInWorkArea鍑哄簱浠诲姟涓嬪彂澶辫触锛岃捣鐐瑰簱鍖簕workFlow.STARTAREA},娌℃壘鍒拌捣鐐�, "Wcs涓嬪彂浠诲姟");
+                        throw new Exception($"璧风偣搴撳尯{workFlow.STARTAREA},娌℃壘鍒拌捣鐐�);
+                    }
+
+                    //鑾峰彇鎵樼洏鐮�+                    var cntrCode = LocationHelper.GetLocCntrCode(start.S_CODE);
+
+                    //璧风偣缁堢偣鏌ユ壘鎴愬姛锛屽垱寤轰綔涓�+
+                    var taskType = int.Parse(workFlow.FLOWCODE);
+
+                    var operation = new WmsWork
+                    {
+                        // 浣滀笟鍙�+                        S_CODE = model.requestPk,
+                        // 浣滀笟绫诲瀷
+                        N_TYPE = taskType,
+                        // 浣滀笟绫诲瀷
+                        S_TYPE = workFlow.FLOWNAME,
+                        // 璧风偣璐т綅
+                        S_START_LOC = start.S_CODE,
+                        // 璧风偣搴撳尯缂栫爜
+                        S_START_AREA = start.S_AREA_CODE,
+                        //鎺ラ┏浣�+                        CONNECTION = "",
+                        // 缁堢偣璐т綅
+                        S_END_LOC = end.S_CODE,
+                        // 缁堢偣搴撳尯缂栫爜
+                        S_END_AREA = end.S_AREA_CODE,
+                        // 瀹瑰櫒缂栫爜
+                        S_CNTR_CODE = cntrCode,
+                        // 浣滀笟瀹氫箟鍚嶇О
+                        S_OP_DEF_NAME = workFlow.FLOWNAME,
+                        //浼樺厛绾�+                        N_PRIORITY = 1,
+                        //宸ヨ绫诲瀷
+                        TOOLSTYPE = ""
+                    };
+
+                    //鍒涘缓浣滀笟
+                    if (WMSHelper.CreateWmsWork(operation))
+                    {
+                        LogHelper.Info($"ZcWcsInWorkArea鍑哄簱浣滀笟鍒涘缓鎴愬姛{operation.S_CODE}", "Wcs涓嬪彂浠诲姟");
+                        return true;
+                    }
+
+                    break;
+                    //绌烘嫋鍏�+                    case "6":
+                        break;
+                    //绌烘灦瀛愬叆
+                    case "7":
+
+                        break;
+                    default:
+                        break;
+                }
+
+
+                return false;
+        }
+
+
+        ///// <summary>
+        /// Wcs浠诲姟鎵ц閫氱煡
+        /// </summary>
+        internal static WcsWarningReurn WcsOperateTask(WcsOperateTaskParme model) {
+            var result = new WcsWarningReurn();
+            var newDb = new SqlHelper<object>().GetInstance();
+
+            try
+            {
+            
+                var taskNo = "";
+            
+                if (string.IsNullOrEmpty(model.requestPk))
+                {
+                    LogHelper.Info("浠诲姟鍙蜂负绌�, "Wcs浠诲姟鎵ц閫氱煡");
+                    throw new Exception("浠诲姟鍙蜂负绌�);
+                }
+                else
+                {
+                    taskNo = model.requestPk;
+                }
+                var transportTask = newDb.Queryable<WMSTask>().Where(e => e.S_CODE == taskNo)?.First();
+
+                if (transportTask == null)
+                {
+                    LogHelper.Info($"鏈煡璇㈠埌{taskNo}瀵瑰簲鐨勪换鍔�, "Wcs浠诲姟鎵ц閫氱煡");
+                    throw new Exception("鏈煡璇㈠埌瀵瑰簲鐨勪换鍔�);
+                }
+
+                TaskHelper.WcsAddActionRecord(model.requestPk, model.noticeType, "WCS");
+
+                switch (model.noticeType)
+                {
+                    //浠诲姟寮�
+                    case "1":
+                        LogHelper.Info($"浠诲姟{taskNo}寮�", "Wcs浠诲姟鎵ц閫氱煡");
+                        TaskHelper.Begin(transportTask);
+                        break;
+                     //浠诲姟瀹屾垚
+                    case "2":
+                        LogHelper.Info($"浠诲姟{taskNo}瀹屾垚", "Wcs浠诲姟鎵ц閫氱煡");
+                        LocationHelper.UnLockLoc(transportTask.S_START_LOC);
+                        TaskProcess.OperateStatus(transportTask, 4);
+                        LocationHelper.UnLockLoc(transportTask.S_END_LOC);
+                        TaskProcess.OperateStatus(transportTask, 6);
+                        TaskHelper.End(transportTask);
+                        LocationHelper.CreateUpAndDown(transportTask);
+                        break;
+                     //浠诲姟鎵ц涓�+                    case "3":
+                        break;
+                     //RFID鏍¢獙涓婃姤
+                    case "4":
+                        if (string.IsNullOrEmpty(model.code))
+                        {
+                            LogHelper.Info($"RFID鏍¢獙鐮佷负绌�, "Wcs浠诲姟鎵ц閫氱煡");
+                            throw new Exception("RFID鏍¢獙鐮佷负绌�);
+                        }
+                        else {
+
+                            WcsRfidCheckoutEntitys RfidChek = new WcsRfidCheckoutEntitys();
+                            RfidChek.S_TASK_NO = model.requestPk;
+                            RfidChek.S_NEWTRAY_CODE = model.contNo;
+                            RfidChek.S_OLDTRAY_CODE = transportTask.S_CNTR_CODE;
+                            RfidChek.S_JBWBIT = transportTask.S_START_LOC;
+
+                            if (model.code=="0")
+                            {
+                                LogHelper.Info($"RFID鏍¢獙鐮佹垚鍔�, "Wcs浠诲姟鎵ц閫氱煡");
+                                RfidChek.S_RESULT = "RFID鏍¢獙鎴愬姛";
+                            }
+                            if (model.code == "1")
+                            {
+                                //鏍¢獙澶辫触 鍙栨秷绔嬪簱浠诲姟 鏀筧gv浠诲姟璧风偣缁堢偣
+                                LogHelper.Info($"RFID鏍¢獙澶辫触", "Wcs浠诲姟鎵ц閫氱煡");
+                                RfidChek.S_RESULT = "RFID鏍¢獙澶辫触";
+                                if (WcsCancellTask(transportTask))
+                                {
+                                    ContainerHelper.delCntr(transportTask.S_CNTR_CODE);
+                                    ContainerHelper.delCntrItem(transportTask.S_CNTR_CODE);
+                                    TaskHelper.Fail(transportTask);
+                                    TaskProcess.OperateStatus(transportTask, 7);
+
+                                    var agvTask = newDb.Queryable<WMSTask>().Where(e => e.S_CODE == transportTask.S_OP_CODE+"_1")?.First();
+                                    if (agvTask == null)
+                                    {
+                                        LogHelper.Info($"RFID鏍¢獙澶辫触锛屾病鎵惧埌瀵瑰簲{transportTask.S_OP_CODE+"_1"}浠诲姟", "Wcs浠诲姟鎵ц閫氱煡");
+                                        throw new Exception($"RFID鏍¢獙澶辫触,娌℃壘鍒板搴攞transportTask.S_OP_CODE + "_1"}浠诲姟");
+                                    }
+                                    var workFlow = TaskHelper.selectWorkFlowByType(agvTask.N_TYPE.ToString(), agvTask.TOOLSTYPE);
+                                  
+                                        if (workFlow == null)
+                                        {
+                                            LogHelper.Info($"RFID鏍¢獙澶辫触锛屾病鎵惧埌瀵瑰簲浣滀笟娴佺▼", "Wcs浠诲姟鎵ц閫氱煡");
+                                            throw new Exception($"RFID鏍¢獙澶辫触,娌℃壘鍒板搴斾綔涓氭祦绋�);
+                                        }
+                                    //鏌ユ壘缁堢偣
+                                    var endList = LocationHelper.GetAllLocList1(workFlow.ERRORAREA);
+
+                                    var end = LocationHelper.FindEndcolByLocList(endList, workFlow.ERRORAREA,workFlow.ROADWAY);
+                                    LogHelper.Info($"RFID鏍¢獙澶辫触涓嬪彂寮傚父缁堢偣淇℃伅" + JsonConvert.SerializeObject(end), "Wcs浠诲姟鎵ц閫氱煡");
+
+
+                                    if (end == null)
+                                    {
+                                        LogHelper.Info($"RFID鏍¢獙澶辫触涓嬪彂浠诲姟澶辫触锛岀粓鐐瑰簱鍖簕workFlow.ERRORAREA},娌℃壘鍒扮粓鐐�, "Wcs浠诲姟鎵ц閫氱煡");
+                                        throw new Exception($"RFID鏍¢獙澶辫触缁堢偣搴撳尯{workFlow.ERRORAREA},娌℃壘鍒扮粓鐐�);
+                                    }
+                                    agvTask.S_START_LOC = agvTask.S_END_LOC;
+                                    agvTask.S_START_AREA = agvTask.S_END_AREA;
+                                    agvTask.S_END_LOC = end.S_CODE;
+                                    agvTask.S_END_AREA = end.S_AREA_CODE;
+                                    agvTask.S_TYPE = workFlow.FLOWNAME;
+                                    newDb.BeginTran();
+                                    var I = newDb.Updateable(agvTask).UpdateColumns(it => new { it.S_START_LOC, it.S_START_AREA,it.S_END_LOC,it.S_END_AREA,it.S_TYPE,it.S_B_STATE }).ExecuteCommand();
+                                    if (I == 0)
+                                    {
+                                        throw new Exception("淇敼浠诲姟琛ㄥけ璐�);
+                                    }
+                                    newDb.CommitTran();
+                                    //鏀瑰弬鏁伴�鐭ュ皬杞�+
+                                }
+                            }
+
+                            newDb.BeginTran();
+                            var R = newDb.Insertable(RfidChek).ExecuteCommand();
+                            if (R == 0)
+                            {
+                                throw new Exception("娣诲姞RFID鏍¢獙琛ㄥけ璐�);
+                            }
+                            newDb.CommitTran();
+
+                        }
+                        break;
+                    //9鍙栬揣鏃犺揣
+                    case "9":
+                        LogHelper.Info($"浠诲姟鍙穥transportTask.S_CODE},鍙栬揣鏃犺揣,鍙栨秷浠诲姟", "Wcs浠诲姟鎵ц閫氱煡");
+                        if (WcsCancellTask(transportTask)) {
+                            LogHelper.Info($"浠诲姟鍙穥transportTask.S_CODE},鍙栨秷浠诲姟鎴愬姛锛岃捣鐐箋transportTask.S_START_LOC}璁句负寮傚父", "Wcs浠诲姟鎵ц閫氱煡");
+                            TaskHelper.Fail(transportTask);
+                            TaskProcess.OperateStatus(transportTask, 7);
+                            LocationHelper.updateLocLock(transportTask.S_START_LOC, 4, "寮傚父閿�);
+                            var agvTask = TaskHelper.GetTask(transportTask.S_OP_CODE + "_1");
+                            if (agvTask!=null)
+                            {
+                                TaskHelper.Fail(agvTask);
+                                NDCApi.CancelOrder(agvTask.S_CODE.Trim());
+                                TaskProcess.CacheBitCancelUpdate(agvTask);
+                            }
+                        }
+                        break;
+                    default:
+                        break;
+                }
+
+                result.msg = "閫氱煡鎴愬姛";
+                result.code = "0";
+
+            }
+            catch (Exception ex)
+            {
+                newDb.RollbackTran();
+                result.msg = ex.Message;
+                result.code = "1";
+                LogHelper.Info("Wcs浠诲姟鎵ц閫氱煡寮傚父" + ex.Message, "Wcs浠诲姟鎵ц閫氱煡");
+                return result;
+            }
+            return result;
+        }
+
+
+        /// <summary>
+        /// Wcs鎶ヨ涓婃姤
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static WcsWarningReurn WcsTaskProcessing(WcsWarningParme model)
+        {
+            var result = new WcsWarningReurn();
+            var newDb = new SqlHelper<object>().GetInstance();
+
+            try
+            {
+                var ghh = $" 浠诲姟鍙�{model.taskNo}\n 搴撳尯:{model.areaCode} \n 宸烽亾:{model.roadway}\n 鏁呴殰鍐呭:{model.remarks} 鏃堕棿:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}";
+                var dd = new DingDingHelper();
+                dd.button1_Click(ghh);
+               
+                newDb.BeginTran();
+                WcsWarningEntitys aloneWcsTask = new WcsWarningEntitys()
+                {
+                    requestPk = model.requestPk,
+                    taskNo = model.taskNo,
+                    errorDes = model.errorDes,
+                    errorNo = model.errorNo,
+                    remarks = model.remarks,
+                    areaCode = model.areaCode,
+                    roadway = model.roadway,
+                    reqTime = model.reqTime
+                };
+                var I = newDb.Insertable(aloneWcsTask).ExecuteCommand();
+                if (I == 0)
+                {
+                    throw new Exception("娣诲姞绔嬪簱鎶ヨ淇℃伅琛ㄥけ璐�);
+                }
+
+                //绔嬪簱鎶ヨ淇敼宸烽亾鍙敤琛�+                //var parme = new WcsRoadwaystateParme();
+                //parme.requestPk = model.requestPk;
+                //parme.roadWay = model.roadway;
+                //parme.reqTime = model.reqTime;
+                //parme.areaCode = model.areaCode;
+                //WcsRoadwaystate(parme);
+
+                newDb.CommitTran();
+                result.code = "0";
+                result.msg = "鎴愬姛";
+                LogHelper.Info("Wcs鎶ヨ涓婃姤杩斿洖"+ JsonConvert.SerializeObject(result), "鎶ヨ涓婃姤");
+                return result;
+            }
+            catch (Exception ex)
+            {
+                newDb.RollbackTran();
+                result.msg = ex.Message;
+                result.code = "1";
+                LogHelper.Info("Wcs鎶ヨ淇℃伅寮傚父" + ex.Message, "鎶ヨ涓婃姤");
+                return result;
+            }
+        }
+
+        public static WcsPositionAvailableReturn WcsPositionAvailable(string S_TASK_NO ,List<string> list)
+        {
+            WcsPositionAvailableReturn entityTwo = new WcsPositionAvailableReturn();
+
+            var interact = new
+            {
+                requestPk = S_TASK_NO,//浠诲姟鍙�+                stnNo = list,//鎺ラ┏浣�+                operationTime = DateTime.Now.ToString()//鎿嶄綔鏃堕棿
+            };
+
+            try
+            {
+                LogHelper.Info("鏌ヨWcs绔嬪簱鎺ラ┏浣�鍦板潃淇℃伅:" + baseUrl + "positionAvailable", "鎺ラ┏浣�);
+
+                LogHelper.Info("鏌ヨWcs绔嬪簱鎺ラ┏浣�鍙傛暟淇℃伅:" + JsonConvert.SerializeObject(interact),"鎺ラ┏浣�);
+
+                var result = apiHelper.Post(baseUrl + "positionAvailable", JsonConvert.SerializeObject(interact));
+
+                LogHelper.Info("鏌ヨWcs绔嬪簱鎺ラ┏浣�杩斿洖淇℃伅" + JsonConvert.SerializeObject(result), "鎺ラ┏浣�);
+
+                if (string.IsNullOrEmpty(result))
+                 {
+                    entityTwo.code = "1";
+                    return entityTwo;
+                 }
+                var data = JsonConvert.DeserializeObject<WcsPositionAvailableReturn>(result);
+                return data;
+            }
+            catch (Exception ex)
+            {
+                entityTwo.code = "1";
+                entityTwo.msg = ex.Message;
+                return entityTwo;
+            }
+
+        }
+        internal static WcsWarningReurn WcsRoadwaystate(WcsRoadwaystateParme model)
+        {
+            var result = new WcsWarningReurn();
+            var newDb = new SqlHelper<object>().GetInstance();
+
+            try
+            {
+                if (string.IsNullOrEmpty(model.areaCode))
+                {
+                    throw new Exception("搴撳尯绂佹涓虹┖");
+                }
+                if (model.roadWay == "0")
+                {
+                    throw new Exception("娌′紶宸烽亾鍙�);
+                }
+                if (string.IsNullOrEmpty(model.status))
+                {
+                    throw new Exception("鐘舵�绂佹涓虹┖");
+                }
+                if (model.status != "0" && model.status != "1")
+                {
+                    throw new Exception($"闈炴硶鐘舵�鐮�鐘舵�鐮佷负 {model.status}");
+                }
+
+
+                var rowdwa = newDb.Queryable<RoadWayEnable>().Where(x => x.areaCode == model.areaCode && x.roadWay == model.roadWay).First();
+                if (rowdwa == null)
+                {
+                    //throw new Exception($"宸烽亾琛ㄦ病鎵惧埌搴撳尯鏄瘂model.areaCode},宸烽亾鏄瘂model.roadWay}鐨勬暟鎹�);
+                   
+
+
+                    RoadWayEnable rowdwa1 = new RoadWayEnable()
+                    {
+                        requestPk = model.requestPk,
+                        status = model.status,
+                        areaCode = model.areaCode,
+                        roadWay = model.roadWay,
+                        reqTime = model.reqTime
+                    };
+
+                    newDb.BeginTran();
+                    var I = newDb.Insertable(rowdwa1).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        throw new Exception("娣诲姞宸烽亾鍙敤琛ㄥけ璐�);
+                    }
+                    newDb.CommitTran();
+                }
+                else {
+                    if (rowdwa.status == model.status)
+                    {
+                        result.code = "0";
+                        result.msg = "鎴愬姛";
+                        return result;
+                    }
+
+                    rowdwa.requestPk = model.requestPk;
+                    rowdwa.status = model.status;
+                    rowdwa.areaCode = model.areaCode;
+                    rowdwa.roadWay = model.roadWay;
+                    rowdwa.reqTime = model.reqTime;
+
+                    newDb.BeginTran();
+                    var I = newDb.Updateable(rowdwa).UpdateColumns(it => new { it.requestPk, it.status, it.areaCode, it.roadWay, it.reqTime }).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        throw new Exception("淇敼宸烽亾鍙敤琛ㄥけ璐�);
+                    }
+                    newDb.CommitTran();
+                }
+
+               
+                result.code = "0";
+                result.msg = "鎴愬姛";
+                LogHelper.Info("Wcs宸烽亾鍙敤涓婃姤杩斿洖" + JsonConvert.SerializeObject(result), "宸烽亾鍙敤涓婃姤");
+                return result;
+            }
+            catch (Exception ex)
+            {
+                newDb.RollbackTran();
+                result.msg = ex.Message;
+                result.code = "1";
+                LogHelper.Info("Wcs宸烽亾鍙敤涓婃姤寮傚父" + ex.Message, "宸烽亾鍙敤涓婃姤");
+                return result;
+            }
+        }
+
+
+        /// <summary>
+        /// agv鎵ц閫氱煡
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="state"></param>
+        /// <param name="forkliftNo"></param>
+        /// <returns></returns>
+        public static bool WcsCallback(WMSTask mst, int state, string forkliftNo = "")
+        {
+            string Type = "";
+            string bit = "";
+            var Meshod = "";
+            var newDb = new SqlHelper<object>().GetInstance();
+            var tac = newDb.Queryable<WcsSafety>().Where(a => a.TaskNo == mst.S_CODE && a.Sign == state).ToList();
+            if (tac.Count() > 0)
+            {
+                LogHelper.Info("鏌ヨ鍒板畨鍏ㄨ姹備俊鍙疯褰曡〃宸茬粡瀛樺湪鏁版嵁,姝ゆ淇″彿涓嶄笅杈剧粰绔嬪簱", "agv鎵ц閫氱煡");
+                return true;
+            }
+
+            if (mst.S_TYPE.Contains("鍏ュ簱"))
+            {
+                 Type = "2";
+                 bit = mst.S_END_LOC;
+                if (state == 1103)
+                {
+                    Meshod = "AgvRequest";
+                    bit = mst.S_END_LOC;
+                }
+                else if (state == 7)
+                {
+                    Type = "3";
+                    Meshod = "AgvRequestCancel";
+                }
+                else if (state == 4) {
+                    //鐢宠鍑洪棬
+                    Type = "4";
+                    Meshod = "AgvRequest";
+                    bit = mst.S_END_LOC;
+                }
+                else
+                {
+                    Meshod = "Complete";
+                }
+            }
+            else if (mst.S_TYPE.Contains("鍑哄簱"))
+            {
+                Type = "1";
+                bit = mst.S_START_LOC;
+                if (state == 1101)
+                {
+                    Meshod = "AgvRequest";
+                }
+                else if (state == 7)
+                {
+                    Type = "3";
+                    Meshod = "AgvRequestCancel";
+                }
+                else if (state == 3)
+                {
+                    //鐢宠杩涢棬
+                    Type = "3";
+                    Meshod = "AgvRequest";
+                    bit = mst.S_START_LOC;
+                }
+                else
+                {
+                    Meshod = "Complete";
+                }
+            }
+            else
+            {
+                LogHelper.Info("闄や簡鍑哄叆搴撳叾浣欎笉闇�瀹夊叏璇锋眰", "agv鎵ц閫氱煡");
+                return true;
+            }
+
+
+
+            var interact = new
+            {
+                requestPk = mst.S_CODE,//浠诲姟鍙�+                trkType = Type,//浠诲姟绫诲瀷
+                method = Meshod,//API鍚嶇О
+                stnNo = bit,//鐩殑鍦扮珯鍙板彿
+                carNo = forkliftNo,// 杞﹀彿
+                clientCode = "WMS",//鎿嶄綔浜�+                operationTime = DateTime.Now.ToString()//鎿嶄綔鏃堕棿
+            };
+            LogHelper.Info("agv鎵ц閫氱煡 鍦板潃淇℃伅:" + baseUrl + "agvCallback", "agv鎵ц閫氱煡");
+            LogHelper.Info("agv鎵ц閫氱煡 鍙傛暟淇℃伅:" + JsonConvert.SerializeObject(interact), "agv鎵ц閫氱煡");
+            var result = apiHelper.Post(baseUrl + "agvCallback", JsonConvert.SerializeObject(interact));
+            LogHelper.Info("agv鎵ц閫氱煡 杩斿洖淇℃伅:" + JsonConvert.SerializeObject(result), "agv鎵ц閫氱煡");
+            if (!string.IsNullOrEmpty(result))
+            {
+                var res = JsonConvert.DeserializeObject<WcsTaskCallBack>(result);
+                if (res.code == "0")
+                {
+                    WcsSafety Sign = new WcsSafety();
+                    Sign.TaskNo = mst.S_CODE;
+                    Sign.Sign = state;
+                    newDb.BeginTran();
+                    var B = newDb.Insertable(Sign).ExecuteCommand();
+                    if (B == 0)
+                    {
+                        newDb.RollbackTran();
+                    }
+                    newDb.CommitTran();
+                    LogHelper.Info("agv鎵ц閫氱煡鎴愬姛:", "agv鎵ц閫氱煡");
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                LogHelper.Info("agv鎵ц閫氱煡鎴愬姛 杩斿洖淇℃伅涓虹┖", "agv鎵ц閫氱煡");
+                return false;
+            }
+
+        }
+
+
+        /// <summary>
+        /// agv寮�叧闂ㄦ墽琛岄�鐭�+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="state"></param>
+        /// <param name="forkliftNo"></param>
+        /// <returns></returns>
+        public static bool WcsCallback1(WMSTask mst, int state, string forkliftNo = "")
+        {
+            string Type = "";
+            string bit = "";
+            var Meshod = "";
+            var newDb = new SqlHelper<object>().GetInstance();
+           
+
+            if (mst.S_TYPE.Contains("鍏ュ簱"))
+            {
+                    if (state == 1023)
+                    {
+                        Meshod = "AgvRequest";
+                        bit = mst.S_END_LOC;
+                        Type = "3";
+                    }
+                    else{ 
+                        Meshod = "AgvRequest";
+                        bit = mst.S_END_LOC;
+                        Type = "4";
+                    }
+            }
+            else if (mst.S_TYPE.Contains("鍑哄簱"))
+            {
+                    if (state == 1023)
+                    {
+                        Meshod = "AgvRequest";
+                        bit = mst.S_START_LOC;
+                        Type = "3";
+                    }
+                    else
+                    {
+                        Meshod = "AgvRequest";
+                        bit = mst.S_START_LOC;
+                        Type = "4";
+                    }
+            }
+            else
+            {
+                LogHelper.Info("闄や簡鍑哄叆搴撳叾浣欎笉闇�瀹夊叏璇锋眰", "agv鎵ц閫氱煡");
+                return true;
+            }
+
+
+
+            var interact = new
+            {
+                requestPk = mst.S_CODE,//浠诲姟鍙�+                trkType = Type,//浠诲姟绫诲瀷
+                method = Meshod,//API鍚嶇О
+                stnNo = bit,//鐩殑鍦扮珯鍙板彿
+                carNo = forkliftNo,// 杞﹀彿
+                clientCode = "WMS",//鎿嶄綔浜�+                operationTime = DateTime.Now.ToString()//鎿嶄綔鏃堕棿
+            };
+            LogHelper.Info("agv鎵ц閫氱煡 鍦板潃淇℃伅:" + baseUrl + "agvCallback", "agv鎵ц閫氱煡");
+            LogHelper.Info("agv鎵ц閫氱煡 鍙傛暟淇℃伅:" + JsonConvert.SerializeObject(interact), "agv鎵ц閫氱煡");
+            var result = apiHelper.Post(baseUrl + "agvCallback", JsonConvert.SerializeObject(interact));
+            LogHelper.Info("agv鎵ц閫氱煡 杩斿洖淇℃伅:" + JsonConvert.SerializeObject(result), "agv鎵ц閫氱煡");
+            if (!string.IsNullOrEmpty(result))
+            {
+                var res = JsonConvert.DeserializeObject<WcsTaskCallBack>(result);
+                if (res.code == "0")
+                {
+                    WcsSafety Sign = new WcsSafety();
+                    Sign.TaskNo = mst.S_CODE;
+                    Sign.Sign = state;
+                    newDb.BeginTran();
+                    var B = newDb.Insertable(Sign).ExecuteCommand();
+                    if (B == 0)
+                    {
+                        newDb.RollbackTran();
+                    }
+                    newDb.CommitTran();
+                    LogHelper.Info("agv鎵ц閫氱煡鎴愬姛:", "agv鎵ц閫氱煡");
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                LogHelper.Info("agv鎵ц閫氱煡鎴愬姛 杩斿洖淇℃伅涓虹┖", "agv鎵ц閫氱煡");
+                return false;
+            }
+
+        }
+
+
+
+        /// <summary>
+        /// 鏀捐揣鏈夎揣
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static WcsWarningReurn ZcInChangeBit(changeBitParme model)
+             {
+                    var result = new WcsWarningReurn();
+                    var newDb = new SqlHelper<object>().GetInstance();
+
+                    try
+                    {
+                        if (string.IsNullOrEmpty(model.taskNo))
+                        {
+                            throw new Exception("浠诲姟鍙蜂负绌�);
+                        }
+
+                        var task = TaskHelper.GetTask(model.taskNo);
+                        if (task==null)
+                        {
+                            throw new Exception($"鏈煡璇㈠埌浠诲姟鍙穥model.taskNo}鐨勪换鍔�);
+                        }
+
+                        if (task.S_B_STATE.Contains("瀹屾垚")|| task.S_B_STATE.Contains("鍙栨秷") || task.S_B_STATE.Contains("澶辫触"))
+                        {
+                            throw new Exception($"浠诲姟鍙穥model.taskNo}锛屼换鍔$姸鎬侊細{task.S_B_STATE}锛屼笉鑳芥敼閬�);
+                        }
+
+                      var endLoc = LocationHelper.GetLocOne(task.S_END_LOC);
+
+                       var end = newDb.Queryable<Location>().Where(a => a.S_AREA_CODE == endLoc.S_AREA_CODE && a.N_ROW == endLoc.N_ROW && a.N_COL > endLoc.N_COL && a.S_LOCK_STATE == "鏃� && a.N_CURRENT_NUM == 0).OrderBy(b=>b.N_COL).First();
+
+                      LogHelper.Info($"Wcs鏀捐揣鏈夎揣瀵绘壘鏂扮粓鐐逛俊鎭� + JsonConvert.SerializeObject(end), "鏀捐揣鏈夎揣");
+
+                    if (end!=null)
+                    {
+                        newDb.BeginTran();
+                        endLoc.N_LOCK_STATE = 4;
+                        endLoc.S_LOCK_STATE = "寮傚父閿�;
+                        newDb.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand();
+                        task.S_END_LOC = end.S_CODE;
+                        newDb.Updateable(task).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand();
+                        newDb.CommitTran();
+                        LocationHelper.LockLoc(end.S_CODE, "鍏ュ簱閿�, 1);
+                        result.msg = end.S_CODE;
+                        result.code = "0";
+                    }
+                    else
+                    {
+                        throw new Exception($"鏈煡璇㈠埌搴撳尯{endLoc.S_AREA_CODE}鏈夌鍚堢殑璐т綅");
+                     }
+
+                    }
+                    catch (Exception ex)
+                    {
+                        newDb.RollbackTran();
+                        result.msg = ex.Message;
+                        result.code = "1";
+                        LogHelper.Info("Wcs鏀捐揣鏈夎揣寮傚父" + ex.Message, "鏀捐揣鏈夎揣");
+                    return result;
+                    }
+                    return result;
+             }
+
+
+        /// <summary>
+        /// agv閫氱煡纭
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+            public static WcsWarningReurn agvResponse(agvResponseParme model) {
+            var result = new WcsWarningReurn();
+            var newDb = new SqlHelper<object>().GetInstance();
+
+            try
+            {
+                newDb.BeginTran();
+                WcsInform aloneWcsTask = new WcsInform()
+                {
+                    requestPk = model.requestPk,
+                    trkType = model.trkType,
+                    isAllow = model.isAllow,
+                    stnNo = model.stnNo,
+                    carNo = model.carNo,
+                    clientCode = model.clientCode,
+                    reqTime = model.reqTime
+                };
+                var I = newDb.Insertable(aloneWcsTask).ExecuteCommand();
+                if (I == 0)
+                {
+                    throw new Exception("娣诲姞绔嬪簱閫氱煡纭琛ㄥけ璐�);
+                }
+                newDb.CommitTran();
+                result.code = "0";
+                result.msg = "鎴愬姛";
+                LogHelper.Info("Wcs閫氱煡纭杩斿洖" + JsonConvert.SerializeObject(result), "閫氱煡纭");
+                return result;
+            }
+            catch (Exception ex)
+            {
+                newDb.RollbackTran();
+                result.msg = ex.Message;
+                result.code = "1";
+                LogHelper.Info("Wcs閫氱煡纭寮傚父" + ex.Message, "閫氱煡纭");
+                return result;
+            }
+        }
+        
+
+    }
+    
+    
+
+
+    /// <summary>
+    /// Wcs浠诲姟杩斿洖
+    /// </summary>
+    public class WcsTaskReturn
+        {
+            public string code { get; set; }
+            public string msg { get; set; }
+            public string requestPk { get; set; }
+            public string status { get; set; }
+    }
+
+    /// <summary>
+    /// Mes鎺ュ彛杩斿洖
+    /// </summary>
+    public class MesReturn
+    {
+        /// <summary>
+        /// 鎴愬姛锛歵rue锛屽け璐ワ細false
+        /// </summary>
+        public bool flag { get; set; }
+        /// <summary>
+        /// 澶辫触鍘熷洜
+        /// </summary>
+        public string message { get; set; }
+        /// <summary>
+        ///  List瀵硅薄
+        /// </summary>
+        public List<MesReturnItem> obj { get; set; }
+    }
+
+    /// <summary>
+    /// Mes杩斿洖鐗╂枡淇℃伅
+    /// </summary>
+    public class MesReturnItem {
+        /// <summary>
+        /// 宸ュ巶
+        /// </summary>
+        public string facnm { get; set; }
+        /// <summary>
+        /// 鏉$爜鍙�+        /// </summary>
+        public string tmh { get; set; }
+        /// <summary>
+        /// 閰嶆柟
+        /// </summary>
+        public string recipe { get; set; }
+        /// <summary>
+        /// 鑳跺彿
+        /// </summary>
+        public string cdrub { get; set; }
+        /// <summary>
+        /// 鏈哄彴
+        /// </summary>
+        public string mchid { get; set; }
+        /// <summary>
+        /// 浣滀笟鏃ユ湡
+        /// </summary>
+        public string wdate { get; set; }
+        /// <summary>
+        /// 鐝
+        /// </summary>
+        public string wsht { get; set; }
+        /// <summary>
+        /// 寮�杞︽
+        /// </summary>
+        public string strbat { get; set; }
+        /// <summary>
+        /// 缁撴潫杞︽
+        /// </summary>
+        public string endbat { get; set; }
+        /// <summary>
+        /// 閲嶉噺
+        /// </summary>
+        public decimal zl { get; set; }
+        /// <summary>
+        /// 鐢熶骇璁″垝缂栧彿
+        /// </summary>
+        public string planno { get; set; }
+        /// <summary>
+        /// 鎵樼洏RFID鑺墖
+        /// </summary>
+        public string tagno { get; set; }
+        /// <summary>
+        /// 鐢熶骇鏃堕棿
+        /// </summary>
+        public string wrkdatetime { get; set; }
+        /// <summary>
+        /// 鑳舵枡娈�+        /// </summary>
+        public string stage { get; set; }
+        /// <summary>
+        /// 妫�獙缁撴灉
+        /// </summary>
+        public string grd { get; set; }
+    }
+
+
+    /// <summary>
+    /// Wcs浠诲姟杩斿洖
+    /// </summary>
+    public class WcsTaskCallBack
+    {
+        public string code { get; set; }
+        public string msg { get; set; }
+        public string requestPk { get; set; }
+    }
+
+    public class WcsPositionAvailableReturn
+        {
+            public string code { get; set; }
+            public string msg { get; set; }
+            public string requestPk { get; set; }
+            public List<string> available { get; set; }
+
+        }
+
+
+        public class WcsReturnEntityWtp
+        {
+            public string code { get; set; }
+            public string msg { get; set; }
+            public string contNo { get; set; }
+            public string contType { get; set; }
+            public string requestPk { get; set; }
+        }
+    }
diff --git a/dll/S7.Net.dll b/dll/S7.Net.dll
new file mode 100644
index 0000000..095acb4
--- /dev/null
+++ b/dll/S7.Net.dll
Binary files differ
diff --git a/dll/S7.Net.xml b/dll/S7.Net.xml
new file mode 100644
index 0000000..281d92e
--- /dev/null
+++ b/dll/S7.Net.xml
@@ -0,0 +1,991 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>S7.Net</name>
+    </assembly>
+    <members>
+        <member name="T:S7.Net.Conversion">
+            <summary>
+            Conversion methods to convert from Siemens numeric format to C# and back
+            </summary>
+        </member>
+        <member name="M:S7.Net.Conversion.BinStringToInt32(System.String)">
+            <summary>
+            Converts a binary string to Int32 value
+            </summary>
+            <param name="txt"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.BinStringToByte(System.String)">
+            <summary>
+            Converts a binary string to a byte. Can return null.
+            </summary>
+            <param name="txt"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.ValToBinString(System.Object)">
+            <summary>
+            Converts the value to a binary string
+            </summary>
+            <param name="value"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.SelectBit(System.Byte,System.Int32)">
+            <summary>
+            Helper to get a bit value given a byte and the bit index.
+            Example: DB1.DBX0.5 -> var bytes = ReadBytes(DB1.DBW0); bool bit = bytes[0].SelectBit(5); 
+            </summary>
+            <param name="data"></param>
+            <param name="bitPosition"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.ConvertToShort(System.UInt16)">
+            <summary>
+            Converts from ushort value to short value; it's used to retrieve negative values from words
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.ConvertToUshort(System.Int16)">
+            <summary>
+            Converts from short value to ushort value; it's used to pass negative values to DWs
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.ConvertToInt(System.UInt32)">
+            <summary>
+            Converts from UInt32 value to Int32 value; it's used to retrieve negative values from DBDs
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.ConvertToUInt(System.Int32)">
+            <summary>
+            Converts from Int32 value to UInt32 value; it's used to pass negative values to DBDs
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.ConvertToUInt(System.Double)">
+            <summary>
+            Converts from double to DWord (DBD)
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Conversion.ConvertToDouble(System.UInt32)">
+            <summary>
+            Converts from DWord (DBD) to double
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="T:S7.Net.COTP">
+            <summary>
+            COTP Protocol functions and types
+            </summary>
+        </member>
+        <member name="T:S7.Net.COTP.TPDU">
+            <summary>
+            Describes a COTP TPDU (Transport protocol data unit)
+            </summary>
+        </member>
+        <member name="M:S7.Net.COTP.TPDU.Read(System.Net.Sockets.Socket)">
+            <summary>
+            Reads COTP TPDU (Transport protocol data unit) from the network stream
+            See: https://tools.ietf.org/html/rfc905
+            </summary>
+            <param name="socket">The socket to read from</param>
+            <returns>COTP DPDU instance</returns>
+        </member>
+        <member name="T:S7.Net.COTP.TSDU">
+            <summary>
+            Describes a COTP TSDU (Transport service data unit). One TSDU consist of 1 ore more TPDUs
+            </summary>
+        </member>
+        <member name="M:S7.Net.COTP.TSDU.Read(System.Net.Sockets.Socket)">
+            <summary>
+            Reads the full COTP TSDU (Transport service data unit)
+            See: https://tools.ietf.org/html/rfc905
+            </summary>
+            <returns>Data in TSDU</returns>
+        </member>
+        <member name="T:S7.Net.CpuType">
+            <summary>
+            Types of S7 cpu supported by the library
+            </summary>
+        </member>
+        <member name="F:S7.Net.CpuType.S7200">
+            <summary>
+            S7 200 cpu type
+            </summary>
+        </member>
+        <member name="F:S7.Net.CpuType.S7300">
+            <summary>
+            S7 300 cpu type
+            </summary>
+        </member>
+        <member name="F:S7.Net.CpuType.S7400">
+            <summary>
+            S7 400 cpu type
+            </summary>
+        </member>
+        <member name="F:S7.Net.CpuType.S71200">
+            <summary>
+            S7 1200 cpu type
+            </summary>
+        </member>
+        <member name="F:S7.Net.CpuType.S71500">
+            <summary>
+            S7 1500 cpu type
+            </summary>
+        </member>
+        <member name="T:S7.Net.ErrorCode">
+            <summary>
+            Types of error code that can be set after a function is called
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.NoError">
+            <summary>
+            The function has been executed correctly
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.WrongCPU_Type">
+            <summary>
+            Wrong type of CPU error
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.ConnectionError">
+            <summary>
+            Connection error
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.IPAddressNotAvailable">
+            <summary>
+            Ip address not available
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.WrongVarFormat">
+            <summary>
+            Wrong format of the variable
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.WrongNumberReceivedBytes">
+            <summary>
+            Wrong number of received bytes
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.SendData">
+            <summary>
+            Error on send data
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.ReadData">
+            <summary>
+            Error on read data
+            </summary>
+        </member>
+        <member name="F:S7.Net.ErrorCode.WriteData">
+            <summary>
+            Error on write data
+            </summary>
+        </member>
+        <member name="T:S7.Net.DataType">
+            <summary>
+            Types of memory area that can be read
+            </summary>
+        </member>
+        <member name="F:S7.Net.DataType.Input">
+            <summary>
+            Input area memory
+            </summary>
+        </member>
+        <member name="F:S7.Net.DataType.Output">
+            <summary>
+            Output area memory
+            </summary>
+        </member>
+        <member name="F:S7.Net.DataType.Memory">
+            <summary>
+            Merkers area memory (M0, M0.0, ...)
+            </summary>
+        </member>
+        <member name="F:S7.Net.DataType.DataBlock">
+            <summary>
+            DB area memory (DB1, DB2, ...)
+            </summary>
+        </member>
+        <member name="F:S7.Net.DataType.Timer">
+            <summary>
+            Timer area memory(T1, T2, ...)
+            </summary>
+        </member>
+        <member name="F:S7.Net.DataType.Counter">
+            <summary>
+            Counter area memory (C1, C2, ...)
+            </summary>
+        </member>
+        <member name="T:S7.Net.VarType">
+            <summary>
+            Types
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.Bit">
+            <summary>
+            S7 Bit variable type (bool)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.Byte">
+            <summary>
+            S7 Byte variable type (8 bits)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.Word">
+            <summary>
+            S7 Word variable type (16 bits, 2 bytes)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.DWord">
+            <summary>
+            S7 DWord variable type (32 bits, 4 bytes)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.Int">
+            <summary>
+            S7 Int variable type (16 bits, 2 bytes)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.DInt">
+            <summary>
+            DInt variable type (32 bits, 4 bytes)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.Real">
+            <summary>
+            Real variable type (32 bits, 4 bytes)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.String">
+            <summary>
+            String variable type (variable)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.StringEx">
+            <summary>
+            String variable type (variable)
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.Timer">
+            <summary>
+            Timer variable type
+            </summary>
+        </member>
+        <member name="F:S7.Net.VarType.Counter">
+            <summary>
+            Counter variable type
+            </summary>
+        </member>
+        <member name="T:S7.Net.Plc">
+            <summary>
+            Creates an instance of S7.Net driver
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.IP">
+            <summary>
+            IP address of the PLC
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.CPU">
+            <summary>
+            CPU type of the PLC
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.Rack">
+            <summary>
+            Rack of the PLC
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.Slot">
+            <summary>
+            Slot of the CPU of the PLC
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.MaxPDUSize">
+            <summary>
+            Max PDU size this cpu supports
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.IsAvailable">
+            <summary>
+            Returns true if a connection to the PLC can be established
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.IsConnected">
+            <summary>
+            Checks if the socket is connected and polls the other peer (the PLC) to see if it's connected.
+            This is the variable that you should continously check to see if the communication is working
+            See also: http://stackoverflow.com/questions/2661764/how-to-check-if-a-socket-is-connected-disconnected-in-c
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.LastErrorString">
+            <summary>
+            Contains the last error registered when executing a function
+            </summary>
+        </member>
+        <member name="P:S7.Net.Plc.LastErrorCode">
+            <summary>
+            Contains the last error code registered when executing a function
+            </summary>
+        </member>
+        <member name="M:S7.Net.Plc.#ctor(S7.Net.CpuType,System.String,System.Int16,System.Int16)">
+            <summary>
+            Creates a PLC object with all the parameters needed for connections.
+            For S7-1200 and S7-1500, the default is rack = 0 and slot = 0.
+            You need slot > 0 if you are connecting to external ethernet card (CP).
+            For S7-300 and S7-400 the default is rack = 0 and slot = 2.
+            </summary>
+            <param name="cpu">CpuType of the PLC (select from the enum)</param>
+            <param name="ip">Ip address of the PLC</param>
+            <param name="rack">rack of the PLC, usually it's 0, but check in the hardware configuration of Step7 or TIA portal</param>
+            <param name="slot">slot of the CPU of the PLC, usually it's 2 for S7300-S7400, 0 for S7-1200 and S7-1500.
+             If you use an external ethernet card, this must be set accordingly.</param>
+        </member>
+        <member name="M:S7.Net.Plc.Open">
+            <summary>
+            Open a <see cref="T:System.Net.Sockets.Socket"/> and connects to the PLC, sending all the corrected package
+            and returning if the connection was successful (<see cref="F:S7.Net.ErrorCode.NoError"/>) of it was wrong.
+            </summary>
+            <returns>Returns ErrorCode.NoError if the connection was successful, otherwise check the ErrorCode</returns>
+        </member>
+        <member name="M:S7.Net.Plc.Close">
+            <summary>
+            Disonnects from the PLC and close the socket
+            </summary>
+        </member>
+        <member name="M:S7.Net.Plc.ReadMultipleVars(System.Collections.Generic.List{S7.Net.Types.DataItem})">
+            <summary>
+            Reads multiple vars in a single request. 
+            You have to create and pass a list of DataItems and you obtain in response the same list with the values.
+            Values are stored in the property "Value" of the dataItem and are already converted.
+            If you don't want the conversion, just create a dataItem of bytes. 
+            DataItems must not be more than 20 (protocol restriction) and bytes must not be more than 200 + 22 of header (protocol restriction).
+            </summary>
+            <param name="dataItems">List of dataitems that contains the list of variables that must be read. Maximum 20 dataitems are accepted.</param>
+        </member>
+        <member name="M:S7.Net.Plc.ReadBytes(S7.Net.DataType,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Reads a number of bytes from a DB starting from a specified index. This handles more than 200 bytes with multiple requests.
+            If the read was not successful, check LastErrorCode or LastErrorString.
+            </summary>
+            <param name="dataType">Data type of the memory area, can be DB, Timer, Counter, Merker(Memory), Input, Output.</param>
+            <param name="db">Address of the memory area (if you want to read DB1, this is set to 1). This must be set also for other memory area types: counters, timers,etc.</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <param name="count">Byte count, if you want to read 120 bytes, set this to 120.</param>
+            <returns>Returns the bytes in an array</returns>
+        </member>
+        <member name="M:S7.Net.Plc.Read(S7.Net.DataType,System.Int32,System.Int32,S7.Net.VarType,System.Int32,System.Byte)">
+            <summary>
+            Read and decode a certain number of bytes of the "VarType" provided. 
+            This can be used to read multiple consecutive variables of the same type (Word, DWord, Int, etc).
+            If the read was not successful, check LastErrorCode or LastErrorString.
+            </summary>
+            <param name="dataType">Data type of the memory area, can be DB, Timer, Counter, Merker(Memory), Input, Output.</param>
+            <param name="db">Address of the memory area (if you want to read DB1, this is set to 1). This must be set also for other memory area types: counters, timers,etc.</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <param name="varType">Type of the variable/s that you are reading</param>
+            <param name="bitAdr">Address of bit. If you want to read DB1.DBX200.6, set 6 to this parameter.</param>
+            <param name="varCount"></param>
+        </member>
+        <member name="M:S7.Net.Plc.Read(System.String)">
+            <summary>
+            Reads a single variable from the PLC, takes in input strings like "DB1.DBX0.0", "DB20.DBD200", "MB20", "T45", etc.
+            If the read was not successful, check LastErrorCode or LastErrorString.
+            </summary>
+            <param name="variable">Input strings like "DB1.DBX0.0", "DB20.DBD200", "MB20", "T45", etc.</param>
+            <returns>Returns an object that contains the value. This object must be cast accordingly.</returns>
+        </member>
+        <member name="M:S7.Net.Plc.ReadStruct(System.Type,System.Int32,System.Int32)">
+            <summary>
+            Reads all the bytes needed to fill a struct in C#, starting from a certain address, and return an object that can be casted to the struct.
+            </summary>
+            <param name="structType">Type of the struct to be readed (es.: TypeOf(MyStruct)).</param>
+            <param name="db">Address of the DB.</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <returns>Returns a struct that must be cast.</returns>
+        </member>
+        <member name="M:S7.Net.Plc.ReadStruct``1(System.Int32,System.Int32)">
+            <summary>
+            Reads all the bytes needed to fill a struct in C#, starting from a certain address, and returns the struct or null if nothing was read.
+            </summary>
+            <typeparam name="T">The struct type</typeparam>
+            <param name="db">Address of the DB.</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <returns>Returns a nulable struct. If nothing was read null will be returned.</returns>
+        </member>
+        <member name="M:S7.Net.Plc.ReadClass(System.Object,System.Int32,System.Int32)">
+            <summary>
+            Reads all the bytes needed to fill a class in C#, starting from a certain address, and set all the properties values to the value that are read from the PLC. 
+            This reads only properties, it doesn't read private variable or public variable without {get;set;} specified.
+            </summary>
+            <param name="sourceClass">Instance of the class that will store the values</param>       
+            <param name="db">Index of the DB; es.: 1 is for DB1</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <returns>The number of read bytes</returns>
+        </member>
+        <member name="M:S7.Net.Plc.ReadClass``1(System.Int32,System.Int32)">
+            <summary>
+            Reads all the bytes needed to fill a class in C#, starting from a certain address, and set all the properties values to the value that are read from the PLC. 
+            This reads only properties, it doesn't read private variable or public variable without {get;set;} specified. To instantiate the class defined by the generic
+            type, the class needs a default constructor.
+            </summary>
+            <typeparam name="T">The class that will be instantiated. Requires a default constructor</typeparam>
+            <param name="db">Index of the DB; es.: 1 is for DB1</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <returns>An instance of the class with the values read from the PLC. If no data has been read, null will be returned</returns>
+        </member>
+        <member name="M:S7.Net.Plc.ReadClass``1(System.Func{``0},System.Int32,System.Int32)">
+            <summary>
+            Reads all the bytes needed to fill a class in C#, starting from a certain address, and set all the properties values to the value that are read from the PLC. 
+            This reads only properties, it doesn't read private variable or public variable without {get;set;} specified.
+            </summary>
+            <typeparam name="T">The class that will be instantiated</typeparam>
+            <param name="classFactory">Function to instantiate the class</param>
+            <param name="db">Index of the DB; es.: 1 is for DB1</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <returns>An instance of the class with the values read from the PLC. If no data has been read, null will be returned</returns>
+        </member>
+        <member name="M:S7.Net.Plc.WriteBytes(S7.Net.DataType,System.Int32,System.Int32,System.Byte[])">
+            <summary>
+            Write a number of bytes from a DB starting from a specified index. This handles more than 200 bytes with multiple requests.
+            If the write was not successful, check LastErrorCode or LastErrorString.
+            </summary>
+            <param name="dataType">Data type of the memory area, can be DB, Timer, Counter, Merker(Memory), Input, Output.</param>
+            <param name="db">Address of the memory area (if you want to read DB1, this is set to 1). This must be set also for other memory area types: counters, timers,etc.</param>
+            <param name="startByteAdr">Start byte address. If you want to write DB1.DBW200, this is 200.</param>
+            <param name="value">Bytes to write. If more than 200, multiple requests will be made.</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.WriteBit(S7.Net.DataType,System.Int32,System.Int32,System.Int32,System.Boolean)">
+            <summary>
+            Write a single bit from a DB with the specified index.
+            </summary>
+            <param name="dataType">Data type of the memory area, can be DB, Timer, Counter, Merker(Memory), Input, Output.</param>
+            <param name="db">Address of the memory area (if you want to read DB1, this is set to 1). This must be set also for other memory area types: counters, timers,etc.</param>
+            <param name="startByteAdr">Start byte address. If you want to write DB1.DBW200, this is 200.</param>
+            <param name="bitAdr">The address of the bit. (0-7)</param>
+            <param name="value">Bytes to write. If more than 200, multiple requests will be made.</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.WriteBit(S7.Net.DataType,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Write a single bit from a DB with the specified index.
+            </summary>
+            <param name="dataType">Data type of the memory area, can be DB, Timer, Counter, Merker(Memory), Input, Output.</param>
+            <param name="db">Address of the memory area (if you want to read DB1, this is set to 1). This must be set also for other memory area types: counters, timers,etc.</param>
+            <param name="startByteAdr">Start byte address. If you want to write DB1.DBW200, this is 200.</param>
+            <param name="bitAdr">The address of the bit. (0-7)</param>
+            <param name="value">Bytes to write. If more than 200, multiple requests will be made.</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.Write(S7.Net.DataType,System.Int32,System.Int32,System.Object,System.Int32)">
+            <summary>
+            Takes in input an object and tries to parse it to an array of values. This can be used to write many data, all of the same type.
+            You must specify the memory area type, memory are address, byte start address and bytes count.
+            If the read was not successful, check LastErrorCode or LastErrorString.
+            </summary>
+            <param name="dataType">Data type of the memory area, can be DB, Timer, Counter, Merker(Memory), Input, Output.</param>
+            <param name="db">Address of the memory area (if you want to read DB1, this is set to 1). This must be set also for other memory area types: counters, timers,etc.</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <param name="value">Bytes to write. The lenght of this parameter can't be higher than 200. If you need more, use recursion.</param>
+            <param name="bitAdr">The address of the bit. (0-7)</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.Write(System.String,System.Object)">
+            <summary>
+            Writes a single variable from the PLC, takes in input strings like "DB1.DBX0.0", "DB20.DBD200", "MB20", "T45", etc.
+            If the write was not successful, check <see cref="P:S7.Net.Plc.LastErrorCode"/> or <see cref="P:S7.Net.Plc.LastErrorString"/>.
+            </summary>
+            <param name="variable">Input strings like "DB1.DBX0.0", "DB20.DBD200", "MB20", "T45", etc.</param>
+            <param name="value">Value to be written to the PLC</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.WriteStruct(System.Object,System.Int32,System.Int32)">
+            <summary>
+            Writes a C# struct to a DB in the PLC
+            </summary>
+            <param name="structValue">The struct to be written</param>
+            <param name="db">Db address</param>
+            <param name="startByteAdr">Start bytes on the PLC</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.WriteClass(System.Object,System.Int32,System.Int32)">
+            <summary>
+            Writes a C# class to a DB in the PLC
+            </summary>
+            <param name="classValue">The class to be written</param>
+            <param name="db">Db address</param>
+            <param name="startByteAdr">Start bytes on the PLC</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.ClearLastError">
+            <summary>
+            Sets the <see cref="P:S7.Net.Plc.LastErrorCode"/> to <see cref="F:S7.Net.ErrorCode.NoError"/> and <see cref="P:S7.Net.Plc.LastErrorString"/> to <see cref="F:System.String.Empty"/>.
+            </summary>
+        </member>
+        <member name="M:S7.Net.Plc.ReadHeaderPackage(System.Int32)">
+            <summary>
+            Creates the header to read bytes from the PLC
+            </summary>
+            <param name="amount"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Plc.CreateReadDataRequestPackage(S7.Net.DataType,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Create the bytes-package to request data from the PLC. You have to specify the memory type (dataType), 
+            the address of the memory, the address of the byte and the bytes count. 
+            </summary>
+            <param name="dataType">MemoryType (DB, Timer, Counter, etc.)</param>
+            <param name="db">Address of the memory to be read</param>
+            <param name="startByteAdr">Start address of the byte</param>
+            <param name="count">Number of bytes to be read</param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Plc.WriteBytesWithASingleRequest(S7.Net.DataType,System.Int32,System.Int32,System.Byte[])">
+            <summary>
+            Writes up to 200 bytes to the PLC and returns NoError if successful. You must specify the memory area type, memory are address, byte start address and bytes count.
+            If the write was not successful, check LastErrorCode or LastErrorString.
+            </summary>
+            <param name="dataType">Data type of the memory area, can be DB, Timer, Counter, Merker(Memory), Input, Output.</param>
+            <param name="db">Address of the memory area (if you want to read DB1, this is set to 1). This must be set also for other memory area types: counters, timers,etc.</param>
+            <param name="startByteAdr">Start byte address. If you want to read DB1.DBW200, this is 200.</param>
+            <param name="value">Bytes to write. The lenght of this parameter can't be higher than 200. If you need more, use recursion.</param>
+            <returns>NoError if it was successful, or the error is specified</returns>
+        </member>
+        <member name="M:S7.Net.Plc.ParseBytes(S7.Net.VarType,System.Byte[],System.Int32,System.Byte)">
+            <summary>
+            Given a S7 variable type (Bool, Word, DWord, etc.), it converts the bytes in the appropriate C# format.
+            </summary>
+            <param name="varType"></param>
+            <param name="bytes"></param>
+            <param name="varCount"></param>
+            <param name="bitAdr"></param>
+            <returns></returns>
+        </member>
+        <member name="M:S7.Net.Plc.VarTypeToByteLength(S7.Net.VarType,System.Int32)">
+            <summary>
+            Given a S7 <see cref="T:S7.Net.VarType"/> (Bool, Word, DWord, etc.), it returns how many bytes to read.
+            </summary>
+            <param name="varType"></param>
+            <param name="varCount"></param>
+            <returns>Byte lenght of variable</returns>
+        </member>
+        <member name="M:S7.Net.Plc.Dispose(System.Boolean)">
+            <summary>
+            Releases all resources, disonnects from the PLC and closes the <see cref="T:System.Net.Sockets.Socket"/>
+            </summary>
+        </member>
+        <member name="M:S7.Net.Plc.Dispose">
+            <summary>
+            Releases all resources, disonnects from the PLC and closes the <see cref="T:System.Net.Sockets.Socket"/>
+            </summary>
+        </member>
+        <member name="T:S7.Net.TPKT">
+            <summary>
+            Describes a TPKT Packet
+            </summary>
+        </member>
+        <member name="M:S7.Net.TPKT.Read(System.Net.Sockets.Socket)">
+            <summary>
+            Reds a TPKT from the socket
+            </summary>
+            <param name="socket">The socket to read from</param>
+            <returns>TPKT Instace</returns>
+        </member>
+        <member name="T:S7.Net.Types.Bit">
+            <summary>
+            Contains the conversion methods to convert Bit from S7 plc to C#.
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Bit.FromByte(System.Byte,System.Byte)">
+            <summary>
+            Converts a Bit to bool
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Bit.ToBitArray(System.Byte[])">
+            <summary>
+            Converts an array of bytes to a BitArray
+            </summary>
+        </member>
+        <member name="T:S7.Net.Types.Boolean">
+            <summary>
+            Contains the methods to read, set and reset bits inside bytes
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Boolean.GetValue(System.Byte,System.Int32)">
+            <summary>
+            Returns the value of a bit in a bit, given the address of the bit
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Boolean.SetBit(System.Byte,System.Int32)">
+            <summary>
+            Sets the value of a bit to 1 (true), given the address of the bit
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Boolean.ClearBit(System.Byte,System.Int32)">
+            <summary>
+            Resets the value of a bit to 0 (false), given the address of the bit
+            </summary>
+        </member>
+        <member name="T:S7.Net.Types.Byte">
+            <summary>
+            Contains the methods to convert from bytes to byte arrays
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Byte.ToByteArray(System.Byte)">
+            <summary>
+            Converts a byte to byte array
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Byte.FromByteArray(System.Byte[])">
+            <summary>
+            Converts a byte array to byte
+            </summary>
+            <param name="bytes"></param>
+            <returns></returns>
+        </member>
+        <member name="T:S7.Net.Types.Class">
+            <summary>
+            Contains the methods to convert a C# class to S7 data types
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Class.GetClassSize(System.Object)">
+            <summary>
+            Gets the size of the class in bytes.
+            </summary>
+            <param name="instance">An instance of the class</param>
+            <returns>the number of bytes</returns>
+        </member>
+        <member name="M:S7.Net.Types.Class.FromBytes(System.Object,System.Byte[])">
+            <summary>
+            Sets the object's values with the given array of bytes
+            </summary>
+            <param name="sourceClass">The object to fill in the given array of bytes</param>
+            <param name="bytes">The array of bytes</param>
+        </member>
+        <member name="M:S7.Net.Types.Class.ToBytes(System.Object)">
+            <summary>
+            Creates a byte array depending on the struct type.
+            </summary>
+            <param name="sourceClass">The struct object</param>
+            <returns>A byte array or null if fails.</returns>
+        </member>
+        <member name="T:S7.Net.Types.Counter">
+            <summary>
+            Contains the conversion methods to convert Counter from S7 plc to C# ushort (UInt16).
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Counter.FromByteArray(System.Byte[])">
+            <summary>
+            Converts a Counter (2 bytes) to ushort (UInt16)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Counter.ToByteArray(System.UInt16)">
+            <summary>
+            Converts a ushort (UInt16) to word (2 bytes)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Counter.ToByteArray(System.UInt16[])">
+            <summary>
+            Converts an array of ushort (UInt16) to an array of bytes
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Counter.ToArray(System.Byte[])">
+            <summary>
+            Converts an array of bytes to an array of ushort
+            </summary>
+        </member>
+        <member name="T:S7.Net.Types.DataItem">
+            <summary>
+            Create an instance of a memory block that can be read by using ReadMultipleVars
+            </summary>
+        </member>
+        <member name="P:S7.Net.Types.DataItem.DataType">
+            <summary>
+            Memory area to read 
+            </summary>
+        </member>
+        <member name="P:S7.Net.Types.DataItem.VarType">
+            <summary>
+            Type of data to be read (default is bytes)
+            </summary>
+        </member>
+        <member name="P:S7.Net.Types.DataItem.DB">
+            <summary>
+            Address of memory area to read (example: for DB1 this value is 1, for T45 this value is 45)
+            </summary>
+        </member>
+        <member name="P:S7.Net.Types.DataItem.StartByteAdr">
+            <summary>
+            Address of the first byte to read
+            </summary>
+        </member>
+        <member name="P:S7.Net.Types.DataItem.BitAdr">
+            <summary>
+            Addess of bit to read from StartByteAdr
+            </summary>
+        </member>
+        <member name="P:S7.Net.Types.DataItem.Count">
+            <summary>
+            Number of variables to read
+            </summary>
+        </member>
+        <member name="P:S7.Net.Types.DataItem.Value">
+            <summary>
+            Contains the value of the memory area after the read has been executed
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DataItem.#ctor">
+            <summary>
+            Create an instance of DataItem
+            </summary>
+        </member>
+        <member name="T:S7.Net.Types.DInt">
+            <summary>
+            Contains the conversion methods to convert DInt from S7 plc to C# int (Int32).
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DInt.FromByteArray(System.Byte[])">
+            <summary>
+            Converts a S7 DInt (4 bytes) to int (Int32)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DInt.ToByteArray(System.Int32)">
+            <summary>
+            Converts a int (Int32) to S7 DInt (4 bytes)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DInt.ToByteArray(System.Int32[])">
+            <summary>
+            Converts an array of int (Int32) to an array of bytes
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DInt.ToArray(System.Byte[])">
+            <summary>
+            Converts an array of S7 DInt to an array of int (Int32)
+            </summary>
+        </member>
+        <member name="T:S7.Net.Types.Double">
+            <summary>
+            Contains the conversion methods to convert Real from S7 plc to C# double.
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Double.FromByteArray(System.Byte[])">
+            <summary>
+            Converts a S7 Real (4 bytes) to double
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Double.FromDWord(System.Int32)">
+            <summary>
+            Converts a S7 DInt to double
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Double.FromDWord(System.UInt32)">
+            <summary>
+            Converts a S7 DWord to double
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Double.ToByteArray(System.Double)">
+            <summary>
+            Converts a double to S7 Real (4 bytes)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Double.ToByteArray(System.Double[])">
+            <summary>
+            Converts an array of double to an array of bytes 
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Double.ToArray(System.Byte[])">
+            <summary>
+            Converts an array of S7 Real to an array of double
+            </summary>
+        </member>
+        <member name="T:S7.Net.Types.DWord">
+            <summary>
+            Contains the conversion methods to convert DWord from S7 plc to C#.
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DWord.FromByteArray(System.Byte[])">
+            <summary>
+            Converts a S7 DWord (4 bytes) to uint (UInt32)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DWord.FromBytes(System.Byte,System.Byte,System.Byte,System.Byte)">
+            <summary>
+            Converts 4 bytes to DWord (UInt32)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DWord.ToByteArray(System.UInt32)">
+            <summary>
+            Converts a uint (UInt32) to S7 DWord (4 bytes) 
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DWord.ToByteArray(System.UInt32[])">
+            <summary>
+            Converts an array of uint (UInt32) to an array of S7 DWord (4 bytes) 
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.DWord.ToArray(System.Byte[])">
+            <summary>
+            Converts an array of S7 DWord to an array of uint (UInt32)
+            </summary>
+        </member>
+        <member name="T:S7.Net.Types.Int">
+            <summary>
+            Contains the conversion methods to convert Int from S7 plc to C#.
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Int.FromByteArray(System.Byte[])">
+            <summary>
+            Converts a S7 Int (2 bytes) to short (Int16)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Int.ToByteArray(System.Int16)">
+            <summary>
+            Converts a short (Int16) to a S7 Int byte array (2 bytes)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Int.ToByteArray(System.Int16[])">
+            <summary>
+            Converts an array of short (Int16) to a S7 Int byte array (2 bytes)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Int.ToArray(System.Byte[])">
+            <summary>
+            Converts an array of S7 Int to an array of short (Int16)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Int.CWord(System.Int32)">
+            <summary>
+            Converts a C# int value to a C# short value, to be used as word.
+            </summary>
+            <param name="value"></param>
+            <returns></returns>
+        </member>
+        <member name="T:S7.Net.Types.StringEx">
+            <summary>
+            Contains the methods to convert from S7 strings to C# strings
+              there are two kinds how strings a send. This one is with a pre of two bytes
+              they contain the length of the string
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.StringEx.FromByteArray(System.Byte[])">
+            <summary>
+            Converts S7 bytes to a string
+            </summary>
+            <param name="bytes"></param>
+            <returns></returns>
+        </member>
+        <member name="T:S7.Net.Types.String">
+            <summary>
+            Contains the methods to convert from S7 strings to C# strings
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.String.ToByteArray(System.String)">
+            <summary>
+            Converts a string to S7 bytes
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.String.FromByteArray(System.Byte[])">
+            <summary>
+            Converts S7 bytes to a string
+            </summary>
+            <param name="bytes"></param>
+            <returns></returns>
+        </member>
+        <member name="T:S7.Net.Types.Struct">
+            <summary>
+            Contains the method to convert a C# struct to S7 data types
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Struct.GetStructSize(System.Type)">
+            <summary>
+            Gets the size of the struct in bytes.
+            </summary>
+            <param name="structType">the type of the struct</param>
+            <returns>the number of bytes</returns>
+        </member>
+        <member name="M:S7.Net.Types.Struct.FromBytes(System.Type,System.Byte[])">
+            <summary>
+            Creates a struct of a specified type by an array of bytes.
+            </summary>
+            <param name="structType">The struct type</param>
+            <param name="bytes">The array of bytes</param>
+            <returns>The object depending on the struct type or null if fails(array-length != struct-length</returns>
+        </member>
+        <member name="M:S7.Net.Types.Struct.ToBytes(System.Object)">
+            <summary>
+            Creates a byte array depending on the struct type.
+            </summary>
+            <param name="structValue">The struct object</param>
+            <returns>A byte array or null if fails.</returns>
+        </member>
+        <member name="T:S7.Net.Types.Timer">
+            <summary>
+            Converts the Timer data type to C# data type
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Timer.FromByteArray(System.Byte[])">
+            <summary>
+            Converts the timer bytes to a double
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Timer.ToByteArray(System.UInt16)">
+            <summary>
+            Converts a ushort (UInt16) to an array of bytes formatted as time
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Timer.ToByteArray(System.UInt16[])">
+            <summary>
+            Converts an array of ushorts (Uint16) to an array of bytes formatted as time
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Timer.ToArray(System.Byte[])">
+            <summary>
+            Converts an array of bytes formatted as time to an array of doubles
+            </summary>
+            <param name="bytes"></param>
+            <returns></returns>
+        </member>
+        <member name="T:S7.Net.Types.Word">
+            <summary>
+            Contains the conversion methods to convert Words from S7 plc to C#.
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Word.FromByteArray(System.Byte[])">
+            <summary>
+            Converts a word (2 bytes) to ushort (UInt16)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Word.FromBytes(System.Byte,System.Byte)">
+            <summary>
+            Converts 2 bytes to ushort (UInt16)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Word.ToByteArray(System.UInt16)">
+            <summary>
+            Converts a ushort (UInt16) to word (2 bytes)
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Word.ToByteArray(System.UInt16[])">
+            <summary>
+            Converts an array of ushort (UInt16) to an array of bytes
+            </summary>
+        </member>
+        <member name="M:S7.Net.Types.Word.ToArray(System.Byte[])">
+            <summary>
+            Converts an array of bytes to an array of ushort
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/packages.config b/packages.config
new file mode 100644
index 0000000..a095e1d
--- /dev/null
+++ b/packages.config
@@ -0,0 +1,24 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="BouncyCastle.NetCoreSdk" version="1.9.0.1" targetFramework="net46" />
+  <package id="EasyModbusTCP" version="5.6.0" targetFramework="net46" />
+  <package id="Microsoft.AspNet.WebApi.Client" version="6.0.0" targetFramework="net46" />
+  <package id="Microsoft.AspNet.WebApi.Core" version="5.3.0" targetFramework="net46" />
+  <package id="Microsoft.AspNet.WebApi.Owin" version="5.3.0" targetFramework="net46" />
+  <package id="Microsoft.AspNet.WebApi.OwinSelfHost" version="5.3.0" targetFramework="net46" />
+  <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="Newtonsoft.Json" version="13.0.3" targetFramework="net46" />
+  <package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net46" />
+  <package id="NLog" version="5.3.2" targetFramework="net46" />
+  <package id="Owin" version="1.0" targetFramework="net461" />
+  <package id="SqlSugar" version="5.1.4.166" targetFramework="net46" />
+  <package id="System.Buffers" version="4.5.1" targetFramework="net46" />
+  <package id="System.Memory" version="4.5.5" targetFramework="net46" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net46" />
+  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net452" />
+  <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net46" />
+  <package id="Topshelf" version="4.3.0" targetFramework="net452" />
+  <package id="Topshelf.NLog" version="4.3.0" targetFramework="net452" />
+</packages>
\ No newline at end of file
diff --git a/process/DeviceProcess.cs b/process/DeviceProcess.cs
new file mode 100644
index 0000000..94af32b
--- /dev/null
+++ b/process/DeviceProcess.cs
@@ -0,0 +1,424 @@
+锘縰sing HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using SqlSugar;
+using System.Security.Policy;
+using Newtonsoft.Json;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+using System.Reflection;
+using static HH.WCS.ZhongCeJinTan.process.TaskProcess;
+using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
+using HH.WCS.Mobox3.ZhongCeJinTan.dispatch;
+using static HH.WCS.ZhongCeJinTan.util.Settings;
+
+namespace HH.WCS.ZhongCeJinTan.process
+{
+    /// <summary>
+    /// 璁惧淇″彿澶勭悊
+    /// </summary>
+    internal class DeviceProcess
+    {
+        private static Dictionary<string, DateTime> times = new Dictionary<string, DateTime>();
+        private static Dictionary<string, statemodel> LineState = new Dictionary<string, statemodel>();
+        public class statemodel
+        {
+            public int status { get; set; }
+            public DateTime modify { get; set; }
+        }
+        internal static void Analysis(string data, string ip)
+        {
+            if (data.Length >= 6)
+            {
+                //鍘绘帀娑堟伅澶�F 00
+                data = data.Substring(4);
+    
+                var plc = Settings.deviceInfos.Where(a => a.address == ip && a.enable == 1).FirstOrDefault();
+                if (plc != null)
+                {
+                    if (plc.enable == 1)
+                    {
+                        if (plc.deviceType == 1)
+                        {
+                            AnalysisDoor(data, plc);
+                        }
+                    }
+                }
+                else
+                {
+                    Console.WriteLine($"TCP淇″彿澶勭悊锛氭湭鏌ヨ鍒癐P涓簕ip}鐨勬暟鎹紝璇锋鏌eviceInfo閰嶇疆涓績鏄惁瀛樺湪璇P鐨勬暟鎹紒");
+                }
+            }
+
+        }
+
+        private static Dictionary<string, DateTime> doorRecord = new Dictionary<string, DateTime>();
+        /// <summary>
+        /// 浜ょ璇锋眰
+        /// </summary>
+        /// <param name="agv"></param>
+        /// <param name="zone"></param>
+        /// <param name="occupy"></param>
+        internal static bool Traffic(string zone, int occupy,bool flag)
+        {
+
+            var plc = Settings.deviceInfos.Where(a => a.location[0].Contains(zone)).FirstOrDefault();
+            if (plc != null)
+            {
+               
+                LogHelper.Info($"瀹夊叏闂ㄥ鎺ワ細闂細{zone}", "鑷姩闂�);
+
+                if (flag)
+                {
+                    if (occupy == 1)
+                    {
+                        //寮�棬璇锋眰 3F 00 11 20 0d 0a
+                        var req = $"3f 00 11 0d 0a";
+                        PlcHelper.SendHex(plc.address, req);
+                        var msg = $"瀹夊叏闂ㄥ紑闂ㄨ姹�闂ㄥ彿锛歿zone}锛宨p={plc.address}, data={req}";
+                        LogHelper.Info(msg, "鑷姩闂�);
+                        //杞﹀瓙璇锋眰涓�灏卞彂涓�寮�棬璇锋眰
+                        if (doorStatus.Keys.Contains(zone) && DateTime.Now.Subtract(doorStatus[zone].modify).TotalSeconds < 5)
+                        {
+                            if (doorStatus[zone].info == "1")
+                            {
+                                LogHelper.Info($"瀹夊叏闂ㄥ凡缁忔墦寮�細闂細{zone}", "鑷姩闂�);
+                                return true;
+                            }
+                        }
+
+                    }
+                    if (occupy == 4)
+                    {
+                        //鍏抽棬淇″彿 3F 00 10 20 0d 0a
+                        var req = $"3f 00 10 0d 0a";
+                        PlcHelper.SendHex(plc.address, req);
+                        var msg = $"瀹夊叏闂ㄥ叧闂ㄨ姹�闂ㄥ彿锛歿zone}锛宨p={plc.address}, data={req}";
+                        LogHelper.Info(msg, "鑷姩闂�);
+                        return true;
+                    }
+                }
+                else {
+                    if (occupy == 1)
+                    {
+                        if (doorStatus[zone].info == "1")
+                        {
+                            LogHelper.Info($"瀹夊叏闂ㄥ凡缁忔墦寮�細闂細{zone}", "鑷姩闂�);
+                            return true;
+                        }
+                        else
+                        {
+                            LogHelper.Info($"瀹夊叏闂ㄥ凡缁忓叧闂細闂細{zone}", "鑷姩闂�);
+                            return false;
+                        }
+                    }
+
+                    if (occupy == 4) {
+                        return true;
+                    }
+                        
+
+
+                }
+            }
+
+            return false;
+
+        }
+
+        private static Dictionary<string, signalInfo> doorStatus = new Dictionary<string, signalInfo>();
+        /// <summary>
+        /// 鑷姩闂�+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="plc"></param>
+        internal static void AnalysisDoor(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"鑷姩闂ㄧ姸鎬侊細{data},鍦板潃涓猴細{plc.address}", "鑷姩闂�);
+            var state = data.Substring(1, 1);
+            LogHelper.Info($"闂▄plc.location[0]}鐨勭姸鎬亄state}", "鑷姩闂�);
+            if (doorStatus.Keys.Contains(plc.location[0]))
+             {
+                doorStatus[plc.location[0]].info = state;
+                doorStatus[plc.location[0]].modify = DateTime.Now;
+             }
+             else
+               {
+                 doorStatus.Add(plc.location[0] , new signalInfo { info = state, modify = DateTime.Now });
+              } 
+        }
+
+      
+
+
+        internal static void QuLiao(WMSTask mst,string fkNo, int state)
+        {
+            try
+            {
+                var newDb = new SqlHelper<object>().GetInstance();
+                    LogHelper.Info($"瀹夊叏浜や簰寮� 浠诲姟鍙�{mst.S_CODE}", "瀹夊叏浜や簰");
+                    var safety = Settings.safetyLocations.Where(a => a.Area.Contains(mst.S_START_AREA)).FirstOrDefault();
+
+                    LogHelper.Info($"瀹夊叏浜や簰寮� 浠诲姟鍙�{mst.S_CODE},浜や簰閰嶇疆淇℃伅" + JsonConvert.SerializeObject(safety), "瀹夊叏浜や簰");
+                if (state == 1101)
+                    {
+                    //1101鍙栬揣鐢宠杩涘叆
+                    if (safety != null)
+                    {
+                        //1涓烘帴椹充綅浜や簰
+                        if (safety.type == 1)
+                        {
+                            LogHelper.Info($"鎺ラ┏浣嶅畨鍏ㄤ氦浜掑紑濮�浠诲姟鍙�{mst.S_CODE},鍙栬揣搴撳尯鎺ラ┏浣嶄氦浜� , "瀹夊叏浜や簰");
+
+                            //鍏堢粰绔嬪簱鍙戦�鍗歌揣閫氱煡
+                            WcsTask.WcsCallback(mst, state, fkNo);
+
+                            //鏌ユ壘绔嬪簱閫氱煡纭琛�+                            var flag = newDb.Queryable<WcsInform>().Where(a => a.requestPk.Contains(mst.S_CODE) && a.trkType=="1").First();
+                            if (flag != null)
+                            {
+                                if (flag.isAllow == "1")
+                                {
+                                    //绔嬪簱閫氱煡鎴愬姛淇敼鍙傛暟
+                                    LogHelper.Info($"绔嬪簱閫氱煡纭锛屽彇璐т氦绠℃垚鍔燂紝淇敼鍙傛暟", "瀹夊叏浜や簰");
+                                    NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
+                                }
+                                else
+                                {
+                                    LogHelper.Info($"绔嬪簱閫氱煡纭锛屼换鍔″彿={mst.S_CODE}锛屽彇璐т氦绠′笉鍏佽锛屼笉淇敼鍙傛暟", "瀹夊叏浜や簰");
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"绔嬪簱閫氱煡纭锛屼换鍔″彿={mst.S_CODE}锛屽彇璐т氦绠″け璐ワ紝鏈煡鍒扮珛搴撻�鐭ョ‘璁よ褰�, "瀹夊叏浜や簰");
+                            }
+                        }//2涓鸿儙闈氦浜�+                        else if (safety.type == 2)
+                        {
+                            var safetyLoc = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(mst.S_START_LOC) && a.deviceType == 1).FirstOrDefault();
+                            if (safetyLoc != null) {
+                                LogHelper.Info($"鑳庨潰瀹夊叏浜や簰鍙栬揣寮�锛屼换鍔″彿={mst.S_CODE},鍦板潃{safetyLoc.writeSafetyAddr}鍐欏叆1,鍦板潃{safetyLoc.writeSafetyAddr1}鍐欏叆1", "鑳庨潰浜や簰");
+
+                                if (ModbusHelper.WriteSingleRegister(safetyLoc.writeSafetyAddr, 1)&& ModbusHelper.WriteSingleRegister(safetyLoc.writeSafetyAddr1, 1))
+                                {
+                                    LogHelper.Info($"鑳庨潰瀹夊叏浜や簰鍙栬揣鍒ゆ柇淇″彿锛屼换鍔″彿={mst.S_CODE},璇诲彇鍦板潃{safetyLoc.readSafetyAddr},鍦板潃{safetyLoc.readSafetyAddr1}", "鑳庨潰浜や簰");
+                                    var res = ModbusHelper.ReadHoldingRegisters(safetyLoc.readSafetyAddr, 1);
+                                    var res1 = ModbusHelper.ReadHoldingRegisters(safetyLoc.readSafetyAddr1, 1);
+                                    LogHelper.Info($"浠诲姟鍙�{mst.S_CODE},鍙栬揣璇诲彇鍦板潃{safetyLoc.readSafetyAddr},鍊納res[0]},鍦板潃{safetyLoc.readSafetyAddr1},鍊納res1[0]}", "鑳庨潰浜や簰");
+                                    if (res[0] == 1 && res1[0] == 1)
+                                    {
+                                        LogHelper.Info($"浠诲姟鍙�{mst.S_CODE},鍙栬揣浜ょ鎴愬姛锛屼慨鏀瑰弬鏁�, "鑳庨潰浜や簰");
+                                        NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info($"浠诲姟鍙�{mst.S_CODE},鍙栬揣浜ょ澶辫触锛屼笉淇敼鍙傛暟", "鑳庨潰浜や簰");
+                                    }
+                                } 
+
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鑳庨潰瀹夊叏浜や簰鍙栬揣锛屼换鍔″彿={mst.S_CODE},娌℃壘鍒扮粓鐐箋mst.S_START_LOC}閰嶇疆", "鑳庨潰浜や簰");
+                            }
+                        }
+                    }
+
+                }else
+                 {
+                    //1102鍙栬揣瀹屾垚
+                    if (safety.type == 2)
+                    {
+                        var safetyLoc = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(mst.S_START_LOC) && a.deviceType == 1).FirstOrDefault();
+                        if (safetyLoc != null)
+                        {
+                            LogHelper.Info($"鑳庨潰瀹夊叏浜や簰鍙栬揣瀹屾垚锛屼换鍔″彿={mst.S_CODE},鍦板潃{safetyLoc.endAddr}鍐欏叆1", "鑳庨潰浜や簰");
+                            ModbusHelper.WriteSingleRegister(safetyLoc.endAddr, 1);
+                        }
+                            
+                    }
+                 }
+                
+            }
+            catch (Exception ex)
+            {
+               
+                LogHelper.Info($"鍙栨枡寮傚父{ex.Message}", "瀹夊叏浜や簰");
+            }
+        }
+
+        internal static void XieLiao(WMSTask mst,string fkNo,int state)
+        {
+            try
+            {
+                var newDb = new SqlHelper<object>().GetInstance();
+                LogHelper.Info($"瀹夊叏浜や簰寮� 浠诲姟鍙�{mst.S_CODE}", "瀹夊叏浜や簰");
+                var safety = Settings.safetyLocations.Where(a => a.Area.Contains(mst.S_END_AREA)).FirstOrDefault();
+                if (state==1103)
+                {
+                    //1103鍗歌揣鐢宠杩涘叆
+                    if (safety != null) {
+
+                        //1涓烘帴椹充綅浜や簰
+                        if (safety.type == 1)
+                        {
+                            LogHelper.Info($"鎺ラ┏浣嶅畨鍏ㄤ氦浜掑紑濮�浠诲姟鍙�{mst.S_CODE},浜や簰绫诲瀷涓�锛屽嵏璐у簱鍖鸿揣鏋朵氦浜�, "瀹夊叏浜や簰");
+
+                            //鍏堢粰绔嬪簱鍙戦�鍗歌揣閫氱煡
+                            WcsTask.WcsCallback(mst, state, fkNo);
+
+                            //鏌ユ壘绔嬪簱閫氱煡纭琛�+                            var flag = newDb.Queryable<WcsInform>().Where(a => a.requestPk.Contains(mst.S_CODE) && a.trkType == "2").First();
+                            if (flag != null)
+                            {
+                                if (flag.isAllow == "1")
+                                {
+                                    //绔嬪簱閫氱煡鎴愬姛淇敼鍙傛暟
+                                    LogHelper.Info($"绔嬪簱閫氱煡纭锛屼换鍔″彿={mst.S_CODE}锛屽嵏璐т氦绠℃垚鍔燂紝淇敼鍙傛暟", "瀹夊叏浜や簰");
+                                    NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
+                                }
+                                else {
+                                    LogHelper.Info($"绔嬪簱閫氱煡纭锛屼换鍔″彿={mst.S_CODE}锛屽嵏璐т氦绠′笉鍏佽锛屼笉淇敼鍙傛暟", "瀹夊叏浜や簰");
+                                }
+                            }
+                            else {
+                                LogHelper.Info($"绔嬪簱閫氱煡纭锛屼换鍔″彿={mst.S_CODE}锛屽嵏璐т氦绠″け璐ワ紝鏈煡鍒扮珛搴撻�鐭ョ‘璁よ褰�, "瀹夊叏浜や簰");
+                            }
+                        }//2涓鸿儙闈氦浜�+                        else if (safety.type == 2)
+                        {
+                            var safetyLoc = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(mst.S_END_LOC) && a.deviceType == 2).FirstOrDefault();
+                            if (safetyLoc != null)
+                            {
+                                LogHelper.Info($"鑳庨潰瀹夊叏浜や簰鍗歌揣寮�锛屼换鍔″彿={mst.S_CODE},鍦板潃{safetyLoc.writeSafetyAddr}鍐欏叆1,鍦板潃{safetyLoc.writeSafetyAddr1}鍐欏叆1", "鑳庨潰浜や簰");
+                                if (ModbusHelper.WriteSingleRegister(safetyLoc.writeSafetyAddr, 1) && ModbusHelper.WriteSingleRegister(safetyLoc.writeSafetyAddr1, 1))
+                                {
+                                    var res = ModbusHelper.ReadHoldingRegisters(safetyLoc.readSafetyAddr, 1);
+                                    var res1 = ModbusHelper.ReadHoldingRegisters(safetyLoc.readSafetyAddr1, 1);
+                                    LogHelper.Info($"浠诲姟鍙�{mst.S_CODE},鍗歌揣璇诲彇鍦板潃{safetyLoc.readSafetyAddr},鍊納res[0]},鍦板潃{safetyLoc.readSafetyAddr1},鍊納res1[0]}", "鑳庨潰浜や簰");
+                                    if (res[0] == 1 && res1[0] == 1)
+                                    {
+                                        LogHelper.Info($"浠诲姟鍙�{mst.S_CODE},鍗歌揣浜ょ鎴愬姛锛屼慨鏀瑰弬鏁�, "鑳庨潰浜や簰");
+                                        NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info($"浠诲姟鍙�{mst.S_CODE},鍗歌揣浜ょ澶辫触锛屼笉淇敼鍙傛暟", "鑳庨潰浜や簰");
+                                    }
+                                }
+
+                            }
+                            else {
+                                LogHelper.Info($"鑳庨潰瀹夊叏浜や簰鍗歌揣锛屼换鍔″彿={mst.S_CODE},娌℃壘鍒扮粓鐐箋mst.S_END_LOC}閰嶇疆", "鑳庨潰浜や簰");
+                            }
+                        }
+                    }
+
+
+                    
+                }
+                else
+                {
+                    //1104鍗歌揣瀹屾垚
+                    if (safety.type == 2)
+                    {
+                        var safetyLoc = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(mst.S_END_LOC) && a.deviceType == 2).FirstOrDefault();
+                        if (safetyLoc != null)
+                        {
+                            LogHelper.Info($"鑳庨潰瀹夊叏浜や簰鍗歌揣瀹屾垚锛屼换鍔″彿={mst.S_CODE},鍦板潃{safetyLoc.endAddr}鍐欏叆1", "鑳庨潰浜や簰");
+                            ModbusHelper.WriteSingleRegister(safetyLoc.endAddr, 1);
+                        }
+                    }
+                }
+
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"鍗告枡寮傚父{ex.Message}", "瀹夊叏浜や簰");
+            }
+        }
+
+
+
+
+
+
+        internal static void Door(WMSTask mst, string fkNo, int state)
+        {
+            try
+            {
+                var newDb = new SqlHelper<object>().GetInstance();
+                LogHelper.Info($"瀹夊叏浜や簰寮� 浠诲姟鍙�{mst.S_CODE}", "闂ㄤ氦浜�);
+                var safety = new safetyLocation();
+
+                if (mst.S_TYPE.Contains("鍑哄簱"))
+                {
+                    safety= Settings.safetyLocations.Where(a => a.Area.Contains(mst.S_START_AREA)).FirstOrDefault();
+                }
+                if (mst.S_TYPE.Contains("鍏ュ簱"))
+                {
+                    safety = Settings.safetyLocations.Where(a => a.Area.Contains(mst.S_END_AREA)).FirstOrDefault();
+                }
+
+                LogHelper.Info($"瀹夊叏浜や簰寮� 浠诲姟鍙�{mst.S_CODE},浜や簰閰嶇疆淇℃伅" + JsonConvert.SerializeObject(safety), "闂ㄤ氦浜�);
+
+                    //1023寮�棬 1025鍏抽棬
+                    if (safety != null)
+                    {
+                        //闂ㄤ氦浜�+                        if (safety.type == 3)
+                        {
+                            LogHelper.Info($"闂ㄥ畨鍏ㄤ氦浜掑紑濮�浠诲姟鍙�{mst.S_CODE},浜や簰绫诲瀷涓�锛屽紑鍏抽棬璇锋眰淇″彿{state}", "闂ㄤ氦浜�);
+                            if (state != 1023 && state != 1025)
+                            {
+                                LogHelper.Info($"闂ㄥ畨鍏ㄤ氦浜掑け璐�浠诲姟鍙�{mst.S_CODE},浜や簰绫诲瀷涓�锛屽紑鍏抽棬璇锋眰淇″彿{state}", "闂ㄤ氦浜�);
+                                return;
+                            }
+
+
+                            //鍏堢粰绔嬪簱鍙戦�寮�棬閫氱煡
+                            WcsTask.WcsCallback1(mst, state, fkNo);
+
+
+                            //鏌ユ壘绔嬪簱閫氱煡纭琛�+                            WcsInform flag = null;
+
+                            
+                            if (state == 1023)
+                            {
+                                flag = newDb.Queryable<WcsInform>().Where(a => a.requestPk.Contains(mst.S_CODE) && a.trkType == "3").First();
+                            }
+                            else
+                            {
+                                flag = newDb.Queryable<WcsInform>().Where(a => a.requestPk.Contains(mst.S_CODE) && a.trkType == "4").First();
+                            }
+                            if (flag != null)
+                            {
+                                if (flag.isAllow == "allow")
+                                {
+                                    //绔嬪簱閫氱煡鎴愬姛淇敼鍙傛暟
+                                    LogHelper.Info($"绔嬪簱閫氱煡纭锛屼换鍔″彿={mst.S_CODE}锛屽紑鍏抽棬浜ょ鎴愬姛锛屼慨鏀瑰弬鏁�, "闂ㄤ氦浜�);
+                                    NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"绔嬪簱閫氱煡纭锛屼换鍔″彿={mst.S_CODE}锛屽紑鍏抽棬浜ょ澶辫触锛屾湭鏌ュ埌绔嬪簱閫氱煡纭璁板綍", "闂ㄤ氦浜�);
+                            }
+                        }
+                    }
+            }
+            catch (Exception ex)
+            {
+
+                LogHelper.Info($"闂ㄤ氦浜掑紓甯竰ex.Message}", "闂ㄤ氦浜�);
+            }
+        }
+
+    } 
+}
diff --git a/process/TaskProcess.cs b/process/TaskProcess.cs
new file mode 100644
index 0000000..0c74448
--- /dev/null
+++ b/process/TaskProcess.cs
@@ -0,0 +1,1913 @@
+锘縰sing HH.WCS.ZhongCeJinTan.api;
+using HH.WCS.ZhongCeJinTan.core;
+using HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Security.Cryptography;
+using System.Threading.Tasks;
+using System.Web.UI.WebControls;
+using static HH.WCS.ZhongCeJinTan.api.ApiModel;
+using static System.Net.WebRequestMethods;
+using System.IO;
+using System.Net.Sockets;
+using System.Text;
+using System.ComponentModel;
+using System.Data.SqlClient;
+using System.Collections;
+using System.Threading;
+using S7.Net;
+using static System.Runtime.CompilerServices.RuntimeHelpers;
+using System.Web.UI.WebControls.WebParts;
+using static HH.WCS.ZhongCeJinTan.util.Settings;
+using System.Security.Policy;
+using HH.WCS.Mobox3.ZhongCeJinTan.dispatch;
+using S7.Net.Types;
+using System.Web.Services.Description;
+using Container = HH.WCS.ZhongCeJinTan.wms.Container;
+using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
+using Top.Api;
+
+namespace HH.WCS.ZhongCeJinTan.process
+{
+    internal class TaskProcess
+    {
+
+
+        #region 浠诲姟鐩稿叧
+        //--------------------------------------------------浠诲姟鐩稿叧--------------------------------------------------
+        /// <summary>
+        /// 鍙栬揣鍗歌揣瀹屾垚锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="v"></param>
+        internal static void CacheBitUpdate(WMSTask mst, bool load) {
+
+            var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
+            if (load)
+            {
+                Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTR_CODE}");
+                LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTR_CODE}");
+                LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList());
+            }
+            else
+            {
+                Console.WriteLine($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岀粓鐐圭粦瀹氬鍣▄mst.S_CNTR_CODE}");
+                LogHelper.Info($"浠诲姟{mst.S_CODE} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTR_CODE}");
+                LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
+            }
+
+        }
+
+        /// <summary>
+        /// 浠诲姟鍙栨秷锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static void CacheBitCancelUpdate(WMSTask mst) {
+
+            LocationHelper.UnLockLoc(mst.S_START_LOC);
+            LocationHelper.UnLockLoc(mst.S_END_LOC);
+
+
+        }
+
+        
+
+        /// <summary>
+        /// 瀹夊叏璇锋眰
+        /// </summary>
+        /// <param name="no"></param>
+        /// <param name="state"></param>
+        /// <param name="forkliftNo"></param>
+        /// <param name="extData"></param>
+        internal static void OperateReq(string no, int state, string forkliftNo="", string extData="")
+        {
+            //1103鍛煎彨绌烘墭 鍗歌揣  1104 鍛煎彨绌烘墭 鍗歌揣瀹屾垚
+            var mst = TaskHelper.GetTask(no);
+            if (state == 1103 || state == 1104)
+            {
+                LogHelper.Info($"浠诲姟鍙穥no}锛屽嵏璐ц姹傦細{state}", "瀹夊叏浜や簰");
+                if (mst != null)
+                {
+                    DeviceProcess.XieLiao(mst, forkliftNo, state);
+                }
+                else
+                {
+                    LogHelper.Info($"娌℃壘鍒颁换鍔no}锛屼氦浜掕姹傚け璐�, "瀹夊叏浜や簰");
+                }
+            }
+            else if (state == 1101 || state == 1102)
+            {
+                LogHelper.Info($"浠诲姟鍙穥no}锛屽彇璐ц姹傦細{state}", "瀹夊叏浜や簰");
+                if (mst != null)
+                {
+                    DeviceProcess.QuLiao(mst, forkliftNo, state);
+                }
+                else
+                {
+                    LogHelper.Info($"娌℃壘鍒颁换鍔no}锛屼氦浜掕姹傚け璐�, "瀹夊叏浜や簰");
+                }
+            }
+            else if (state == 1105)
+            {
+                //鍒ゆ柇鎺ラ┏浣嶅拰宸烽亾鏄惁鍙敤 涓嶅彲鐢ㄩ渶瑕佹敼閬�+                changeBit(mst);
+            }
+            else if (state == 1023 || state == 1025)
+            {
+                //寮�叧鍏抽棬鐢宠
+                DeviceProcess.Door(mst, forkliftNo, state);
+            }
+            else if (state == 1013) {
+                LogHelper.Info($"绛夊緟浜や簰锛屼换鍔″彿={mst.S_CODE}锛屽嵏璐т氦绠℃垚鍔燂紝淇敼鍙傛暟", "瀹夊叏浜や簰");
+
+                //绛夊緟rfid鏍¢獙
+                var rfidFlag = TaskHelper.GetRfid(mst.S_CODE);
+
+                LogHelper.Info($"绛夊緟浜や簰锛屼换鍔″彿={mst.S_CODE}锛孯FID鏍¢獙淇℃伅"+JsonConvert.SerializeObject(rfidFlag), "瀹夊叏浜や簰");
+                if (rfidFlag!=null)
+                {
+                    if (rfidFlag.S_RESULT.Contains("鎴愬姛"))
+                    {
+                        LogHelper.Info($"浠诲姟鍙�{mst.S_CODE}锛岀瓑寰呬氦绠℃垚鍔燂紝淇敼鍙傛暟", "瀹夊叏浜や簰");
+                        NDCApi.ChangeOrderParam(mst.S_CODE, 6, "1");
+                    }
+                }
+            }
+        }
+
+
+        internal static bool CreateWmsWork(WmsWork work)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                return db.Insertable<WmsWork>(work).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                throw;
+            }
+        }
+
+
+        /// <summary>
+        /// 浠诲姟鐘舵�鏇存柊澶勭悊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="state"></param>
+        internal static void OperateStatus(WMSTask mst, int state)
+        {
+            if (state == 4)
+            {
+                CacheBitUpdate(mst, true);
+            }
+            if (state == 6)//鍗歌揣瀹屾垚
+            {
+                CacheBitUpdate(mst, false);
+            }
+            if (state == 7)
+            {
+                CacheBitCancelUpdate(mst);
+            }
+        }
+
+
+
+        private static object lockObj = new object();
+
+
+
+        private static object locLocker = new object();
+
+        internal static void changeBit(WMSTask task) {
+
+            var db = new SqlHelper<object>().GetInstance();
+
+            try
+            {
+                var workFlow = TaskHelper.selectWorkFlowByType(task.N_TYPE.ToString(), task.TOOLSTYPE);
+
+                if (workFlow == null)
+                {
+                    LogHelper.Info($"鍒ゆ柇鎺ラ┏浣嶄互鍙婂贩閬撴槸鍚﹀彲鐢紝BUSI_TYpe:{task.N_TYPE},娌℃壘鍒板搴斾綔涓氭祦绋�, "鏀归亾瀹夊叏浜や簰");
+                    throw new Exception($"鍒ゆ柇鎺ラ┏浣嶄互鍙婂贩閬撴槸鍚﹀彲鐢紝BUSI_TYpe:{task.N_TYPE},娌℃壘鍒板搴斾綔涓氭祦绋�);
+                }
+
+                var wcsTask = db.Queryable<WMSTask>().Where(e => e.S_CODE == task.S_OP_CODE + "_2")?.First();
+                if (wcsTask == null)
+                {
+                    LogHelper.Info($"鍒ゆ柇宸烽亾鍙敤澶辫触锛屾病鎵惧埌瀵瑰簲{task.S_OP_CODE + "_2"}浠诲姟", "鏀归亾瀹夊叏浜や簰");
+                    throw new Exception($"鍒ゆ柇宸烽亾鍙敤澶辫触,娌℃壘鍒板搴攞task.S_OP_CODE + "_2"}浠诲姟");
+
+                }
+
+                //鍒ゆ柇鎺ラ┏浣嶅彲鐢�+                var flag = true;
+
+                if (workFlow.FLOWNAME.Contains("鍏ュ簱"))
+                {
+                    var connectionList = LocationHelper.GetConnectionList(workFlow.CONNECTION);
+                    var usableConnectionList = WcsTask.WcsPositionAvailable(task.S_CODE, connectionList);
+                    if (usableConnectionList != null && usableConnectionList.code == "0")
+                    {
+                        foreach (var item in usableConnectionList.available)
+                        {
+                            var con = LocationHelper.GetLoc(item);
+                            if (con.S_CODE.Contains(task.S_END_LOC))
+                            {
+                                flag = false;
+                                LogHelper.Info($"褰撳墠浠诲姟{task.S_CODE}鎺ラ┏浣峽con.S_CODE}鍙敤锛屼笉闇�鏀归亾锛岀洿鎺ヤ慨鏀瑰弬鏁�涓�", "鏀归亾瀹夊叏浜や簰");
+                                NDCApi.ChangeOrderParam(task.S_CODE, 6, "1");
+                                break;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"鍒ゆ柇鎺ラ┏浣嶆槸鍚﹀彲鐢ㄦ帴鍙e洖澶嶅紓甯�, "鏀归亾瀹夊叏浜や簰");
+                        throw new Exception($"鍒ゆ柇鎺ラ┏浣嶆槸鍚﹀彲鐢ㄦ帴鍙e洖澶嶅紓甯�);
+                    }
+                    if (flag)
+                    {
+
+                        LogHelper.Info($"褰撳墠浠诲姟{task.S_CODE}鎺ラ┏浣嶄笉鍙敤锛岄渶瑕佹敼閬�, "鏀归亾瀹夊叏浜や簰");
+                        var connection = "";
+                        foreach (var item in usableConnectionList.available)
+                        {
+                            var con = LocationHelper.GetLoc(item);
+                            if (con.S_LOCK_STATE == "鏃� && con.N_CURRENT_NUM < 2)
+                            {
+                                connection = con.S_CODE;
+                                LogHelper.Info($"鏀归亾瀵绘壘鍒板彲鐢ㄦ帴椹充綅{connection}", "鏀归亾瀹夊叏浜や簰");
+                                break;
+                            }
+                        }
+                        if (connection == "")
+                        {
+                            throw new Exception($"鏀归亾瀵绘壘涓嶅埌鍙敤鎺ラ┏浣�);
+                        }
+
+                        var loc = LocationHelper.GetLocOne(connection);
+
+                        if (workFlow.FLOWNAME.Contains("鍏ュ簱"))
+                        {
+                            LocationHelper.LockLoc(loc.S_CODE, "鍏ュ簱閿�, 1);
+                            var endLoc = LocationHelper.GetLocOne(task.S_END_LOC);
+                            endLoc.N_LOCK_STATE = 0;
+                            endLoc.S_LOCK_STATE = "鏃�;
+                            db.BeginTran();
+                            db.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand();
+                            //鏀逛竴娈典换鍔$粓鐐�+                            task.S_END_LOC = loc.S_CODE;
+                            db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand();
+
+                            //鏀逛簩娈典换鍔¤捣鐐�+                            wcsTask.S_START_LOC = loc.S_CODE;
+                            db.Updateable(wcsTask).UpdateColumns(it => new { it.S_START_LOC }).ExecuteCommand();
+                            db.CommitTran();
+                            
+                            var site = LocationHelper.GetAgvSiteZc(loc.S_CODE);
+                            LogHelper.Info($"浠诲姟{task.S_CODE}鏀归亾鎴愬姛锛屾敼鍙傛暟2涓簕site},鍙傛暟6涓�", "鏀归亾瀹夊叏浜や簰");
+                            NDCApi.ChangeOrderParam(task.S_CODE, 2, site);
+                            NDCApi.ChangeOrderParam(task.S_CODE, 6, "1");
+                           
+                        }
+                        //} else if (workFlow.FLOWNAME.Contains("鍑哄簱")) {
+                        //    var endLoc = LocationHelper.GetLocOne(task.S_START_LOC);
+                        //    endLoc.N_LOCK_STATE = 3;
+                        //    endLoc.S_LOCK_STATE = "鍏朵粬閿�;
+                        //    db.BeginTran();
+                        //    db.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand();
+                        //    task.S_START_LOC = loc.S_CODE;
+                        //    db.Updateable(task).UpdateColumns(it => new { it.S_START_LOC }).ExecuteCommand();
+                        //    db.CommitTran();
+                        //    LocationHelper.LockLoc(loc.S_CODE, "鍑哄簱閿�, 2);
+                        //}
+                    }
+                }
+
+
+
+                //if (workFlow.FLOWNAME.Contains("鍏ュ簱"))
+                //{
+                //    var loc = LocationHelper.GetLocOne(wcsTask.S_END_LOC);
+                //    //鏌ユ壘鍙敤宸烽亾
+                //    var rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == wcsTask.S_END_AREA && x.status == "0" && x.roadWay == loc.N_ROADWAY.ToString()).First();
+                //    if (rowdwa == null)
+                //    {
+                //        LogHelper.Info($"鍒ゆ柇宸烽亾鍙敤,褰撳墠搴撳尯{wcsTask.S_END_AREA}褰撳墠宸烽亾{loc.N_ROADWAY}鍙敤,涓嶉渶瑕佹敼閬�, "鏀归亾瀹夊叏浜や簰");
+                //    }
+                //    else
+                //    {
+                //        LogHelper.Info($"褰撳墠宸烽亾涓嶅彲鐢紝闇�鏀归亾", "鏀归亾瀹夊叏浜や簰");
+                //        if (workFlow.FLOWNAME.Contains("鍏ュ簱"))
+                //        {
+                //            var endLoc = LocationHelper.GetLocOne(wcsTask.S_END_LOC);
+
+                //            var endList = LocationHelper.GetAllLocList1(workFlow.ENDAREA);
+
+                //            var end = LocationHelper.FindEndcolByLocList(endList, workFlow.ENDAREA, workFlow.ROADWAY);
+                //            LogHelper.Info($"褰撳墠宸烽亾涓嶅彲鐢紝闇�鏀归亾锛屾柊缁堢偣淇℃伅" + JsonConvert.SerializeObject(end), "鏀归亾瀹夊叏浜や簰");
+
+
+                //            if (end == null)
+                //            {
+                //                LogHelper.Info($"褰撳墠宸烽亾涓嶅彲鐢紝缁堢偣搴撳尯{workFlow.ENDAREA},娌℃壘鍒扮粓鐐�, "鏀归亾瀹夊叏浜や簰");
+                //                throw new Exception($"缁堢偣搴撳尯{workFlow.ENDAREA},娌℃壘鍒扮粓鐐�);
+                //            }
+                //            LocationHelper.LockLoc(end.S_CODE, "鍏ュ簱閿�, 1);
+                //            db.BeginTran();
+                //            endLoc.N_LOCK_STATE = 0;
+                //            endLoc.S_LOCK_STATE = "鏃�;
+                //            db.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand();
+                //            wcsTask.S_END_LOC = end.S_CODE;
+                //            db.Updateable(wcsTask).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand();
+                //            db.CommitTran();
+
+                //        }
+                //    }
+                //}
+
+
+            }
+            catch (Exception ex)
+            {
+                db.RollbackTran();
+                LogHelper.Info($"鍒ゆ柇鎺ラ┏浣嶅拰宸烽亾鍙敤寮傚父"+ex.Message, "鏀归亾瀹夊叏浜や簰");
+            }
+
+        }
+
+
+
+        /// <summary>
+        /// 鏂癗DC鎺ㄩ�浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static bool SendTask(WMSTask mst)
+        {
+            var start = "0"; 
+            var end = "0";
+            try
+            {
+
+                LogHelper.Info($"鎺ㄩ�浠诲姟{mst.S_CODE}", "NDC");
+
+                start = LocationHelper.GetAgvSiteZc(mst.S_START_LOC);
+                end = LocationHelper.GetAgvSiteZc(mst.S_END_LOC);
+
+                LogHelper.Info($"鎺ㄩ�浠诲姟{mst.S_CODE}锛岃捣鐐圭珯鐐癸細{start}锛岀粓鐐圭珯鐐癸細{end}", "NDC");
+
+                var ndcParme = new List<param>();
+                ndcParme.Add(new param() { name = "From", value = start.ToString() });
+                ndcParme.Add(new param() { name = "To", value = end.ToString() });
+
+                var res =  NDCApi.AddOrderNew(1, mst.N_PRIORITY, mst.S_CODE, ndcParme);
+
+                if (res.err_code==0)
+                {
+                    TaskHelper.UpdateStatus(mst, "宸叉帹閫�);
+
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"鎺ㄩ�浠诲姟{mst.S_CODE}寮傚父锛寋e.Message}", "NDC");
+                return false;
+            }
+        }
+
+
+
+        /// <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, string cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1,string taskNo="") {
+            var result = false;
+            var res = TaskHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, cntrs, trayCarryCount, startLayer, endLayer);
+            if (res) {
+                result = true;
+                //浠诲姟鍒涘缓鎴愬姛锛岃捣鐐硅揣浣嶅嚭搴撻攣瀹氾紝缁堢偣璐т綅鍏ュ簱閿佸畾
+                LocationHelper.LockLoc(start, "鍑哄簱閿�, 2);
+                LocationHelper.LockLoc(end, "鍏ュ簱閿�, 1);
+            }
+            return result;
+        }
+
+        internal static Result MesUdeItem(MesUdeItemParme model)
+        {
+            var result = new Result();
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                if (string.IsNullOrEmpty(model.TurnCardNum))
+                {
+                    LogHelper.Info("鍛ㄨ浆鍗″彿 涓嶅厑璁镐负绌�, "淇敼鐗╂枡");
+                    throw new Exception("鍛ㄨ浆鍗″彿 涓嶅厑璁镐负绌�);
+                }
+                var Item = db.Queryable<CntrItemRel>().Where(e => e.TurnCardNum == model.TurnCardNum)?.First();
+                if (Item == null)
+                {
+                    LogHelper.Info("璇ュ懆杞崱鍙�鏈煡璇㈠埌鎸囧畾鐗╂枡淇℃伅", "淇敼鐗╂枡");
+                    throw new Exception("璇ュ懆杞崱鍙�鏈煡璇㈠埌鎸囧畾鐗╂枡淇℃伅");
+                }
+                db.BeginTran();
+                var B = db.Updateable<CntrItemRel>()
+                    .SetColumnsIF(!string.IsNullOrEmpty(model.CHECK_INFO), it => it.S_ITEM_STATE == model.CHECK_INFO)
+                      .SetColumnsIF(!string.IsNullOrEmpty(model.PROD_NO), it => it.S_ITEM_CODE == model.PROD_NO)
+                       .SetColumnsIF(model.CURRENT_AMOUNT != 0, it => it.F_QTY == Convert.ToDecimal(model.CURRENT_AMOUNT))
+                        .SetColumns(it => it.expireTime == Item.expireTime.AddHours(model.EXPIRED_REP))
+                    .Where(x => x.TurnCardNum == model.TurnCardNum).ExecuteCommand();
+                if (B == 0)
+                {
+                    db.RollbackTran();
+                    LogHelper.Info("鏇存柊鐗╂枡淇℃伅澶辫触", "淇敼鐗╂枡");
+                    throw new Exception("鏇存柊鐗╂枡淇℃伅澶辫触");
+                }
+                db.CommitTran();
+                LogHelper.Info("淇敼鐗╂枡瀹屾垚", "淇敼鐗╂枡");
+
+                result.errMsg = "淇敼鐗╂枡瀹屾垚";
+                result.errCode = 0;
+                result.success = true;
+                return result;
+            }
+            catch (Exception e)
+            {
+                db.RollbackTran();
+                LogHelper.Info("淇敼鐗╂枡缁戝畾寮傚父:" + e.Message, "淇敼鐗╂枡");
+                result.errMsg = "淇敼鐗╂枡寮傚父";
+                result.errCode = 1;
+                result.success = false;
+                return result;
+            }
+        }
+            
+
+
+        internal static MesAreaSecItemReturn MesAreaSecItem(MesAreaSecItemParme model) { 
+
+            var result = new MesAreaSecItemReturn();
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
+                ca.AndIF(!string.IsNullOrEmpty(model.Location_From), (o, p, t) => o.S_AREA_CODE == model.Location_From);
+                ca.AndIF(!string.IsNullOrEmpty(model.TurnCardNum), (o, p, t) => t.TurnCardNum == model.TurnCardNum);
+                var lstCanOutL = db.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE)
+                    .Where(ca.ToExpression()).Includes(e => e.LocCntrRel, p => p.CntrItemRel).ToList();
+                List<CntrItemRel> item = new List<CntrItemRel>();
+                foreach (var itm in lstCanOutL)
+                {
+                    item.Add(itm?.LocCntrRel?.CntrItemRel);
+                }
+
+                result.Data = item;
+                result.Success = true;
+                result.AffectedRows = 1;
+                result.Code = 0;
+                result.Msg = "鏌ヨ鐗╂枡淇℃伅鎴愬姛";
+                result.Status = 1;
+                return result;
+            }
+            catch (Exception)
+            {
+                result.Data = null;
+                result.Success = false;
+                result.AffectedRows = 1;
+                result.Code = 1;
+                result.Msg = "鏌ヨ鐗╂枡淇℃伅寮傚父";
+                result.Status = 1;
+                return result;
+            }
+        }  
+
+
+        /// <summary>
+        /// 瑙g粦缁戝畾鐗╂枡淇℃伅
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static Result MesBindUnbind(BindUnbindParme model)
+        {
+            var result = new Result();
+            var db = new SqlHelper<object>().GetInstance();
+
+            try
+            {
+                if (model == null)
+                {
+                    result.errMsg = "鍙傛暟涓簄ull";
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+
+                if (model.BUSI_TYPE != "100" && model.BUSI_TYPE != "200")
+                {
+                    result.errMsg = "鍙傛暟涓簄ull";
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+
+                LogHelper.Info("缁戝畾瑙g粦鍒ゆ柇鐘舵�鐮�, "鐗╂枡缁戝畾瑙g粦");
+                if (model.BUSI_TYPE == "100")
+                {
+                    LogHelper.Info("缁戝畾寮�", "鐗╂枡缁戝畾瑙g粦");
+                    //鍏堝垽鏂墭鐩樼爜鏄惁瀛樺湪浜庢暟鎹簱涓�+                    var TrayLocation = db.Queryable<LocCntrRel>().Where(e => e.S_CNTR_CODE == model.TOOLS_NO).ToList();
+                    if (TrayLocation.Count() > 0)
+                    {
+                        LogHelper.Info("鏌ヨ鍒拌宸ヨ宸茬粡缁戝畾浜嗚揣浣嶄俊鎭�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鏌ヨ鍒拌宸ヨ宸茬粡缁戝畾浜嗚揣浣嶄俊鎭�);
+                    }
+                    var TrayItems = db.Queryable<CntrItemRel>().Where(e => e.S_CNTR_CODE == model.TOOLS_NO).ToList();
+                    if (TrayItems.Count() > 0)
+                    {
+                        LogHelper.Info("鏌ヨ鍒拌宸ヨ宸茬粡缁戝畾浜嗙墿鏂欎俊鎭�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鏌ヨ鍒拌宸ヨ宸茬粡缁戝畾浜嗙墿鏂欎俊鎭�);
+                    }
+                    var Locations = db.Queryable<Location>().Where(e => e.S_CODE == model.LOCATION_CODE)?.First();
+                    if (Locations == null)
+                    {
+                        LogHelper.Info("鏈煡璇㈠埌闇�缁戝畾鐨勮揣浣嶄俊鎭�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鏈煡璇㈠埌闇�缁戝畾鐨勮揣浣嶄俊鎭�);
+                    }
+                    if (Locations.S_LOCK_STATE != "鏃�)
+                    {
+                        LogHelper.Info($"闇�缁戝畾鐨勮揣浣峽Locations.S_CODE}鐨勭姸鎬佷负{Locations.S_LOCK_STATE} 璐т綅涓嶅彲鐢�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception($"闇�缁戝畾鐨勮揣浣峽Locations.S_CODE}鐨勭姸鎬佷负{Locations.S_LOCK_STATE} 璐т綅涓嶅彲鐢�);
+                    }
+                    if (Locations.C_ENABLE != "Y")
+                    {
+                        LogHelper.Info($"闇�缁戝畾鐨勮揣浣峽Locations.S_CODE}鐨勫惎鐢ㄧ姸鎬佷负{Locations.C_ENABLE} 璐т綅涓嶅彲鐢�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception($"闇�缁戝畾鐨勮揣浣峽Locations.S_CODE}鐨勫惎鐢ㄧ姸鎬佷负{Locations.C_ENABLE} 璐т綅涓嶅彲鐢�);
+                    }
+                    if (Locations.N_CURRENT_NUM > 0)
+                    {
+                        LogHelper.Info($"闇�缁戝畾鐨勮揣浣峽Locations.S_CODE}鐨勫綋鍓嶅閲忎负{Locations.N_CURRENT_NUM} 璐т綅涓嶅彲鐢�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception($"闇�缁戝畾鐨勮揣浣峽Locations.S_CODE}鐨勫綋鍓嶅閲忎负{Locations.N_CURRENT_NUM} 璐т綅涓嶅彲鐢�);
+                    }
+                    var LocCnt = new LocCntrRel();
+                    LocCnt.S_CNTR_CODE = model.TOOLS_NO;
+                    LocCnt.S_LOC_CODE = model.LOCATION_CODE;
+                    db.BeginTran();
+                    var I = db.Updateable<Location>().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 1 }).Where(x => x.S_CODE == model.LOCATION_CODE).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        LogHelper.Info($"鏇存柊璐т綅鏁伴噺涓�澶辫触", "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鏇存柊璐т綅鏁伴噺涓�澶辫触");
+                    }
+                    I = db.Insertable(LocCnt).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        LogHelper.Info($"娣诲姞鎵樼洏璐т綅琛ㄦ暟鎹け璐�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("娣诲姞鎵樼洏璐т綅琛ㄦ暟鎹け璐�);
+                    }
+                    var trayItemMstGuid = Guid.NewGuid().ToString();
+
+                    //娣诲姞鎵樼洏
+                    Container cntr = new Container();
+                    cntr.S_CODE = model.TOOLS_NO;
+                    cntr.C_ENABLE = "Y";
+                    cntr.N_DETAIL_COUNT = 1;
+                    cntr.S_TYPE = "";
+
+
+                    //娣诲姞鎵樼洏鐗╂枡鍏宠仈琛�+                    CntrItemRel rel = new CntrItemRel();
+                    rel.S_ITEM_CODE = model.PROD_NO;
+                    rel.S_ITEM_NAME = model.PROD_BOM;
+                    rel.S_CNTR_CODE = model.TOOLS_NO;
+                    rel.S_BATCH_NO = "";
+                    rel.TurnCardNum = model.TurnCardNum;
+                    rel.Level = model.PROD_BOM;
+                    rel.itemModel = model.PROD_NO;
+
+                    var EXPIRED_TIME = model.EXPIRED_TIME.ToString();
+                    if (EXPIRED_TIME == "0001/1/1 0:00:00")
+                    {
+                        rel.expireTime = model.SHELF_LIFE_TIME.AddHours(model.EXPIRED_REP);
+                        LogHelper.Info($"澶辨晥鏃堕棿涓�001/1/1 0:00:00锛屼慨鏀逛负锛歿rel.expireTime}", "鐗╂枡缁戝畾瑙g粦");
+                    }
+                    else {
+                        rel.expireTime = model.EXPIRED_TIME;
+                    }
+
+               
+                    rel.takeEffectTime = model.SHELF_LIFE_TIME.AddHours(-model.SHELF_REP); ;
+                    rel.F_QTY = Convert.ToDecimal(model.CURRENT_AMOUNT);
+                    rel.S_ITEM_STATE = model.CHECK_INFO;
+                    rel.PRODUCTIONDATE = model.PRODUCE_TIME;
+                    rel.T_INSTOCK = DateTime.Now;
+                    rel.S_ITEM_SPEC = model.PROD_SPEC;
+                    rel.F_SUM_QTY = Convert.ToDecimal(model.standardWeight);
+                    rel.itemFeature = model.PROD_TECH;
+                    if (!string.IsNullOrEmpty(model.PROD_NO))
+                    {
+                        var A = db.Insertable(rel).ExecuteCommand();
+
+                        var C = db.Insertable(cntr).ExecuteCommand();
+                        if (A == 0)
+                        {
+                            LogHelper.Info($"鐗╂枡琛ㄦ坊鍔犲け璐�, "鐗╂枡缁戝畾瑙g粦");
+                            throw new Exception("鐗╂枡琛ㄦ坊鍔犲け璐�);
+                        }
+                    }
+                    db.CommitTran();
+                    LogHelper.Info("缁戝畾瀹屾垚", "鐗╂枡缁戝畾瑙g粦");
+                    result.errMsg = "缁戝畾瀹屾垚";
+                    result.errCode = 0;
+                    result.success = true;
+                    return result;
+                }
+                else
+                {
+                    LogHelper.Info("瑙g粦寮�", "鐗╂枡缁戝畾瑙g粦");
+                    var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
+                    ca.AndIF(!string.IsNullOrEmpty(model.LOCATION_CODE), (o, p, t) => o.S_CODE == model.LOCATION_CODE);
+                    ca.AndIF(!string.IsNullOrEmpty(model.TurnCardNum), (o, p, t) => t.TurnCardNum == model.TurnCardNum);
+                    ca.AndIF(!string.IsNullOrEmpty(model.TOOLS_NO), (o, p, t) => p.S_CNTR_CODE == model.TOOLS_NO);
+                    var Locations = db.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).Includes(e => e.LocCntrRel, p => p.CntrItemRel)?.First();
+                    if (Locations == null)
+                    {
+                        LogHelper.Info($"鏈煡璇㈠埌闇�瑙g粦鐨勮揣浣嶄俊鎭�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鏈煡璇㈠埌闇�瑙g粦鐨勮揣浣嶄俊鎭�);
+                    }
+                    if (Locations.S_LOCK_STATE != "鏃�)
+                    {
+
+                        LogHelper.Info($"闇�瑙g粦鐨勮揣浣峽Locations.S_CODE}鐨勭姸鎬佷负{Locations.S_LOCK_STATE} 璐т綅涓嶅彲瑙g粦", "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception($"闇�瑙g粦鐨勮揣浣峽Locations.S_CODE}鐨勭姸鎬佷负{Locations.S_LOCK_STATE} 璐т綅涓嶅彲瑙g粦");
+                    }
+                    db.BeginTran();
+                    var I = db.Updateable<Location>().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0 }).Where(x => x.S_CODE == Locations.S_CODE).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        LogHelper.Info($"鏇存柊璐т綅鏁伴噺涓�澶辫触", "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鏇存柊璐т綅鏁伴噺涓�澶辫触");
+                    }
+                    I = db.Deleteable<LocCntrRel>().Where(e => e.S_LOC_CODE == Locations.S_CODE && e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        LogHelper.Info($"鍒犻櫎鎵樼洏璐т綅琛ㄥけ璐�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鍒犻櫎鎵樼洏璐т綅琛ㄥけ璐�);
+                    }
+                    I = db.Deleteable<CntrItemRel>().Where(e => e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        LogHelper.Info($"鍒犻櫎鎵樼洏鐗╂枡琛ㄥけ璐�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鍒犻櫎鎵樼洏鐗╂枡琛ㄥけ璐�);
+                    }
+                    I = db.Deleteable<Container>().Where(e => e.S_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
+                    if (I == 0)
+                    {
+                        LogHelper.Info($"鍒犻櫎鎵樼洏琛ㄥけ璐�, "鐗╂枡缁戝畾瑙g粦");
+                        throw new Exception("鍒犻櫎鎵樼洏琛ㄥけ璐�);
+                    }
+                    db.CommitTran();
+                    LogHelper.Info("缁戝畾瑙g粦", "缁撴潫");
+                    }
+                }
+            catch (Exception e)
+            {
+                db.RollbackTran();
+                LogHelper.Info("鐗╂枡缁戝畾瑙g粦寮傚父:" + e.Message, "鐗╂枡缁戝畾瑙g粦");
+                result.errMsg = "鐗╂枡缁戝畾瑙g粦寮傚父";
+                result.errCode = 1;
+                return result;
+            }
+            return result;
+        }
+
+
+            
+
+
+        internal static Result cancelTask1(cancleTaskParme model) {
+            var result = new Result();
+            LogHelper.Info("cancelTask1鍙栨秷浠诲姟淇℃伅锛� + JsonConvert.SerializeObject(model), "鍙栨秷");
+            if (model == null)
+            {
+                result.errMsg = "鍙傛暟涓簄ull";
+                result.errCode = 1; 
+                result.success  =false;
+                return result;
+            }
+
+            try
+            {
+                var task = TaskHelper.GetTask(model.task_no + "_1");
+                var wcsTask = TaskHelper.GetTask(model.task_no + "_2");
+                if (task != null && wcsTask != null)
+                {
+                    if (task.S_B_STATE.Trim() == "鏈墽琛�)
+                    {
+                        //鏈墽琛岀洿鎺ヤ慨鏀圭姸鎬佷负鍙栨秷
+                        LogHelper.Info("cancelTask1鍙栨秷agv浠诲姟锛�, "鍙栨秷");
+                        TaskHelper.Fail(task);
+                        TaskProcess.CacheBitCancelUpdate(task);
+                        if (task.S_TYPE.Contains("鍏ュ簱") || task.S_TYPE.Contains("鍥炲簱"))
+                        {
+                            ContainerHelper.delCntr(task.S_CNTR_CODE);
+                            ContainerHelper.delCntrItem(task.S_CNTR_CODE);
+                        }
+                        
+                       
+                        TaskHelper.Fail(wcsTask);
+                        TaskProcess.OperateStatus(wcsTask, 7);
+                        result.errCode = 0;
+                        result.errMsg = "鍙栨秷鎴愬姛";
+                        result.success = true;
+                        return result;
+                    }
+                    else if (task.S_B_STATE.Trim() != "鍙栨秷"  && task.S_B_STATE.Trim() != "澶辫触")
+                    {
+                        var db = new SqlHelper<object>().GetInstance();
+                        var qhflag = db.Queryable<WmsTaskAction>().Where(a => a.S_TASK_CODE == task.S_CODE && a.S_ACTION == "4").First();
+
+
+                        if (qhflag != null)
+                        {
+                            LogHelper.Info($"璇ヤ换鍔task.S_CODE}宸茬粡鍙栬揣瀹屾垚", "鍙栨秷");
+                            result.errCode = 1;
+                            result.errMsg = "浠诲姟宸茬粡鍙栬揣瀹屾垚锛屼笉鍏佽鍙栨秷";
+                            result.success = false;
+                            return result;
+                        }
+
+                        //宸叉帹閫佷絾鏄病鏈夊畬鎴愭垨鑰呭彇娑堬紝閫氱煡hosttoagv
+                        TaskHelper.Fail(task);
+                        
+                        NDCApi.CancelOrder(task.S_CODE.Trim());
+                        TaskProcess.CacheBitCancelUpdate(task);
+                        if (task.S_TYPE.Contains("鍏ュ簱") || task.S_TYPE.Contains("鍥炲簱"))
+                        {
+                            ContainerHelper.delCntr(task.S_CNTR_CODE);
+                            ContainerHelper.delCntrItem(task.S_CNTR_CODE);
+                        }
+                        TaskHelper.Fail(wcsTask);
+                        TaskProcess.OperateStatus(wcsTask, 7);
+                        result.errCode = 0;
+                        result.errMsg = "鍙栨秷鎴愬姛";
+                        result.success = true;
+                    }
+                    else
+                    {
+                        result.errCode = 1;
+                        result.errMsg = "浠诲姟宸茬粡缁撴潫";
+                        result.success = false;
+                    }
+                }
+                else
+                {
+                    result.errCode = 1;
+                    result.errMsg = "浠诲姟涓嶅瓨鍦�;
+                    result.success = false;
+                }
+            }
+            catch (Exception ex)
+            {
+
+                LogHelper.Info("cancelTask1鍙栨秷浠诲姟寮傚父锛�+ex.Message, "鍙栨秷");
+                result.errCode = 1;
+                result.errMsg = "鍙栨秷浠诲姟寮傚父";
+                return result;
+            }
+
+            return result;
+        }
+
+
+        internal static Result completeTask1(cancleTaskParme model) {
+            LogHelper.Info("completeTask1寮哄埗瀹屾垚浠诲姟锛� + JsonConvert.SerializeObject(model), "API");
+            var result = new Result();
+            if (model == null)
+            {
+                result.success = false;
+                result.errMsg = "鍙傛暟涓簄ull";
+                result.errCode = 1;
+            }
+
+            var task = TaskHelper.GetTask(model.task_no);
+            if (task != null)
+            {
+                if (task.S_B_STATE.Trim() == "鏈墽琛�)
+                {
+                    result.success = false;
+                    result.errMsg = "浠诲姟鏈墽琛岋紝涓嶅厑璁稿己鍒跺畬鎴愶紒";
+                    result.errCode = 1;
+
+                } 
+                else if (task.S_B_STATE.Trim() == "鍙栨秷" && task.S_B_STATE.Trim() == "澶辫触" && task.S_B_STATE.Trim() == "瀹屾垚") {
+                    result.success = false;
+                    result.errMsg = "浠诲姟宸插彇娑堟垨鑰呭畬鎴愶紝涓嶅厑璁稿己鍒跺畬鎴愶紒";
+                    result.errCode = 1;
+                }
+                else if (task.S_B_STATE.Trim() != "鏈墽琛� && task.S_B_STATE.Trim() != "寰呮帹閫�)
+                {
+                    TaskHelper.UpdateStatus(model.task_no.Trim(), "宸插畬鎴�);
+                  
+                }
+                else
+                {
+                    result.success = false;
+                    result.errMsg = "浠诲姟宸茬粨鏉�;
+                    result.errCode = 1;
+                }
+            }
+            else
+            {
+                result.success = false;
+                result.errMsg = "浠诲姟涓嶅瓨鍦�;
+                result.errCode = 1;
+            }
+            return result;
+        }
+
+
+        /// <summary>
+        /// 瀹夊叏浜や簰
+        /// </summary>
+        public static bool Interaction(WMSTask wmsTask, int qx,string loc)
+        {
+          return false;
+        }
+      
+
+
+        /// <summary>
+        /// 淇敼浠诲姟浼樺厛绾�+        /// </summary>
+        internal static zcResult task1(taskParme model)
+        {
+            var result = new zcResult();
+
+            if (model == null)
+            {
+                result.errMsg = "鍙傛暟涓簄ull";
+                result.errCode = 1;
+                return result;
+            }
+            var db = new SqlHelper<object>().GetInstance();
+           
+            var task = TaskHelper.GetTask(model.taskNo);
+            if (task == null)
+            {
+                result.errMsg = "娌℃壘鍒拌浠诲姟";
+                result.errCode = 1;
+                return result;
+            }
+            else {
+                if (task.S_B_STATE != "鏈墽琛�)
+                {
+                    result.errMsg = "浠诲姟宸茬粡鎺ㄩ�";
+                    result.errCode = 1;
+                    return result;
+                }
+
+                try
+                {
+                    db.BeginTran();
+                    task.N_PRIORITY = model.priority;
+                    db.Updateable(task).UpdateColumns(it => new { it.N_PRIORITY }).ExecuteCommand();
+                    db.Ado.CommitTran();
+                    LogHelper.Info($"淇敼浼樺厛绾ф垚鍔�浠诲姟鍙�{task.S_CODE}", "API1");
+                    result.errMsg = "淇敼浼樺厛绾ф垚鍔�;
+                    result.errCode = 0;
+                    return result;
+                }
+                catch (Exception e)
+                {
+                    LogHelper.Info("淇敼浼樺厛绾у紓甯稿紓甯�" + e.Message, "API1");
+                    result.errMsg = "淇敼浼樺厛绾у紓甯�;
+                    result.errCode = 1;
+                    
+                    db.Ado.RollbackTran();
+                    return result;
+
+                }
+            }
+        }
+
+            /// <summary>
+            /// 娣诲姞鐐瑰埌鐐逛换鍔�+            /// </summary>
+            internal static Result addTask1(PtpTaskParme model)
+            {
+            var result = new Result();
+            try
+            {
+               
+                if (model == null)
+                {
+                    result.errMsg = "鍙傛暟涓簄ull";
+                    result.errCode = 1;
+                    return result;
+                }
+
+                var qd = "";
+                var zd = "";
+                string trayCode = "";
+
+                string taskNo = "";
+
+                if (string.IsNullOrEmpty(model.TOOLS_NO))
+                {
+                    trayCode = TaskHelper.GenerateTrayNo();
+                }
+                else
+                {
+                    trayCode = model.TOOLS_NO;
+                }
+
+                if (string.IsNullOrEmpty(model.task_no))
+                {
+                    taskNo = TaskHelper.GenerateTaskNo();
+                }
+                else
+                {
+                    taskNo = model.task_no;
+                }
+
+                if (string.IsNullOrEmpty(model.Location_From) || string.IsNullOrEmpty(model.Location_To)) {
+                    result.errMsg = "璧风偣鎴栫粓鐐逛负绌�;
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+
+
+                var startLoc = LocationHelper.GetLocOne(model.Location_From);
+                if (startLoc != null)
+                {
+                    if (startLoc.C_ENABLE=="Y" && startLoc.S_LOCK_STATE=="鏃�)
+                    {
+                        qd = startLoc.S_CODE;
+                    }
+                    else
+                    {
+                        result.errMsg = "璧风偣鏈惎鐢ㄦ垨鏈夐攣";
+                        result.errCode = 1;
+                        result.success = false;
+                        return result;
+                    }
+                   
+                }
+                else {
+                    result.errMsg = "娌℃壘鍒拌捣鐐�;
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+
+                var endLoc = LocationHelper.GetLocOne(model.Location_To);
+                if (endLoc != null)
+                {
+                    if (endLoc.C_ENABLE == "Y" && endLoc.S_LOCK_STATE == "鏃�)
+                    {
+                        zd = endLoc.S_CODE;
+                    }
+                    else
+                    {
+                        result.errMsg = "缁堢偣鏈惎鐢ㄦ垨鏈夐攣";
+                        result.errCode = 1;
+                        result.success = false;
+                        return result;
+                    } 
+                }
+                else {
+                    result.errMsg = "娌℃壘鍒扮粓鐐�;
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+
+                var startTask = TaskHelper.GetTaskByStartLoc(qd);
+                if (startTask != null)
+                {
+                    result.errMsg = "璧风偣鏈夋墽琛屼腑浠诲姟";
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+                var endTask = TaskHelper.GetTaskByStartLoc(zd);
+                if (endTask != null)
+                {
+                    result.errMsg = "缁堢偣鏈夋墽琛屼腑浠诲姟";
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+
+
+                //LogHelper.Info($"鍒涘缓浠诲姟鍙傛暟:start:{qd},end:{zd},trayCode:{trayCode},pri:{model.priority},taskNo:{taskNo}", "鐐瑰埌鐐�);
+
+
+                var wmsWork = WMSHelper.GetWmsWorkByCntr(trayCode);
+                if (wmsWork != null)
+                {
+                    LogHelper.Info($"璧风偣{qd} 鎵樼洏{trayCode}宸茬粡鍒涘缓浣滀笟锛岃鍕块噸澶嶇敵璇�, "鐐瑰埌鐐�);
+                    result.errMsg = "璧风偣鏈夋墭鐩樹綔涓�;
+                    result.errCode = 1;
+                    result.success = false;
+                    return result;
+                }
+                else
+                {
+                    var taskType = 20;
+
+                    var operation = new WmsWork
+                    {
+                        // 浣滀笟鍙�+                        S_CODE = model.task_no,
+                        // 浣滀笟绫诲瀷
+                        N_TYPE = taskType,
+                        // 浣滀笟绫诲瀷
+                        S_TYPE = "鐐瑰埌鐐�,
+                        // 璧风偣璐т綅
+                        S_START_LOC = startLoc.S_CODE,
+                        // 璧风偣搴撳尯缂栫爜
+                        S_START_AREA = startLoc.S_AREA_CODE,
+                        // 缁堢偣璐т綅
+                        S_END_LOC = endLoc.S_CODE,
+                        // 缁堢偣搴撳尯缂栫爜
+                        S_END_AREA = endLoc.S_AREA_CODE,
+                        // 瀹瑰櫒缂栫爜
+                        S_CNTR_CODE = trayCode,
+                        // 浣滀笟瀹氫箟鍚嶇О
+                        S_OP_DEF_NAME = WmsWork.GetOpName(taskType),
+                        //浼樺厛绾�+                        N_PRIORITY = model.priority,
+
+                    };
+
+
+                    if (WMSHelper.CreateWmsWork(operation))
+                    {
+                        result.errMsg = "浣滀笟鍒涘缓鎴愬姛";
+                        result.errCode = 0;
+                        result.success = true;
+                        return result;
+                    }
+                    else
+                    {
+                        result.errMsg = "浣滀笟鍒涘缓澶辫触";
+                        result.errCode = 1;
+                        result.success = false;
+                        return result;
+                    }
+                }
+
+                //TaskProcess.CreateTransport(qd, zd, "鐐瑰埌鐐�, trayCode, 1, 1, 1, model.priority, taskNo);
+
+
+                   
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"鍒涘缓鐐瑰埌鐐逛换鍔″紓甯革紝"+ex.Message, "鐐瑰埌鐐�);
+                result.errMsg = "浠诲姟鍒涘缓寮傚父";
+                result.errCode = 1;
+                result.success = false;
+                return result;
+            }
+
+
+
+        }
+
+       
+
+
+            /// <summary>
+            /// 娣诲姞mes浠诲姟
+            /// </summary>
+            internal static Result addMesTask(ZcInWorkAreaParme model) { 
+            var result = new Result();
+
+
+            try
+            {
+                //鏍¢獙鍙傛暟
+                if (string.IsNullOrEmpty(model.BUSI_TYPE))
+                {
+                    LogHelper.Info( "ZCSendTask浠诲姟涓嬪彂澶辫触锛岀己灏戝弬鏁癇USI_TYPE銆�, "Mes浠诲姟涓嬪彂");
+                    throw new Exception("缂哄皯鍙傛暟BUSI_TYPE");
+                }
+                if (model.BUSI_TYPE == "1" && string.IsNullOrEmpty(model.TOOLS_TPYE))
+                {
+                    LogHelper.Info("ZCSendTask浠诲姟涓嬪彂澶辫触锛岀己灏戝弬鏁癟OOLS_TPYE銆�, "Mes浠诲姟涓嬪彂");
+                    throw new Exception("缂哄皯鍙傛暟TOOLS_TPYE");
+                }
+                if (string.IsNullOrEmpty(model.Location_From) && string.IsNullOrEmpty(model.Location_To))
+                {
+                    LogHelper.Info("ZCSendTask浠诲姟涓嬪彂澶辫触锛岃捣鐐瑰拰缁堢偣鍚屾椂涓虹┖銆�, "Mes浠诲姟涓嬪彂");
+                    throw new Exception("缂哄皯璧风偣Location_From鎴栫粓鐐筁ocation_To!");
+                }
+                if (!string.IsNullOrEmpty(model.Location_From) && !string.IsNullOrEmpty(model.Location_To))
+                {
+                    LogHelper.Info("ZCSendTask浠诲姟涓嬪彂澶辫触锛岃捣鐐瑰拰缁堢偣鍚屾椂鏈夊�銆�, "Mes浠诲姟涓嬪彂");
+                    throw new Exception("璧风偣Location_From鎴栫粓鐐筁ocation_To 涓嶈兘鍚屾椂鏈夊弬!");
+                }
+                if (string.IsNullOrEmpty(model.task_no) )
+                {
+                    LogHelper.Info("ZCSendTask浠诲姟涓嬪彂澶辫触锛岀己灏戝弬鏁皌ask_no銆�, "Mes浠诲姟涓嬪彂");
+
+                    throw new Exception("缂哄皯鍙傛暟task_no");
+                }
+
+
+                //var wmsWork = TaskHelper.GetTaskByCntrCode(model.TOOLS_NO);
+
+                if (!string.IsNullOrEmpty(model.TOOLS_NO))
+                {
+                    var cntr = ContainerHelper.GetCntr(model.TOOLS_NO);
+                    if (cntr != null)
+                    {
+                        LogHelper.Info($"鎵樼洏{model.TOOLS_NO}宸茬粡鍒涘缓浣滀笟锛岃鍕块噸澶嶇敵璇�, "Mes浠诲姟涓嬪彂");
+                        throw new Exception($"鎵樼洏{model.TOOLS_NO}宸茬粡鍒涘缓浣滀笟锛岃鍕块噸澶嶇敵璇�);
+                    }
+                }
+
+
+                //鎵樼洏鏄庣粏鏁伴噺
+                var cntrCount = 1;
+
+                //浣滀笟娴佺▼
+                WorkFlow workFlow = null;
+
+                //宸ヨ绫诲瀷
+                var TOOLSTYPE = "";
+                if (!string.IsNullOrEmpty(model.TOOLS_TPYE))
+                {
+                    TOOLSTYPE = model.TOOLS_TPYE;
+                    
+                }
+
+                workFlow = TaskHelper.selectWorkFlowByType(model.BUSI_TYPE, TOOLSTYPE);
+               
+                LogHelper.Info($"浣滀笟{model.task_no}锛屽伐瑁呯被鍨媨TOOLSTYPE}", "Mes浠诲姟涓嬪彂");
+
+               
+                if (workFlow == null) {
+                    LogHelper.Info($"ZCSendTask浠诲姟涓嬪彂澶辫触锛孊USI_TYpe:{model.BUSI_TYPE},娌℃壘鍒板搴斾綔涓氭祦绋�, "Mes浠诲姟涓嬪彂");
+                    throw new Exception($"BUSI_TYpe:{model.BUSI_TYPE},娌℃壘鍒板搴斾綔涓氭祦绋�);
+                }
+                else{
+                    LogHelper.Info($"浣滀笟娴佺▼淇℃伅" + JsonConvert.SerializeObject(workFlow), "Mes浠诲姟涓嬪彂");
+                }
+
+                if (model.Task_type == 1)
+                {
+                    //鍏ュ簱浠诲姟
+
+
+                    //鎵樼洏鐮侊紝绌烘灦瀛愪笉鍙戜娇鐢ㄨ櫄鎷熷彿锛屽彂浜嗛粯璁や娇鐢╩es宸ヨ缂栧彿
+                    var cntrCode = "";
+
+                    if (!string.IsNullOrEmpty(model.TOOLS_NO))
+                    {
+                        cntrCode = model.TOOLS_NO;
+                    }
+
+
+
+                    //鏌ユ壘璧风偣
+                    var start = LocationHelper.GetLoc(model.Location_From);
+                    LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂璧风偣淇℃伅"+JsonConvert.SerializeObject(start), "Mes浠诲姟涓嬪彂");
+
+
+                    if (start == null || start.S_LOCK_STATE!="鏃�) {
+                        LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂澶辫触锛岃捣鐐�{model.Location_From},娌℃壘鍒版垨鏈夐攣", "Mes浠诲姟涓嬪彂");
+                        throw new Exception($"璧风偣:{model.Location_From},娌℃壘鍒版垨鏈夐攣");
+                    }
+
+                    //鎺ラ┏浣�+                    var connection = "";
+
+                    //濡傛灉闇�涓嬪彂wcs绔嬪簱锛屽垯闇�瀵绘壘鍙敤鎺ラ┏浣�+                    if (workFlow.SENDWCS=="Y") {
+
+                        //娴嬭瘯榛樿鍙栦竴涓帴椹充綅
+                        //var connectionList = LocationHelper.GetAllLocList1(workFlow.CONNECTION);
+                        //foreach (var item in connectionList)
+                        //{
+                        //    if (item.S_LOCK_STATE == "鏃� && item.N_CURRENT_NUM < 2)
+                        //    {
+                        //        connection = item.S_CODE;
+                        //        LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鍒板彲鐢ㄦ帴椹充綅{connection}", "Mes浠诲姟涓嬪彂");
+                        //    }
+                        //}
+
+                        //if (connection=="")
+                        //{
+                        //    LogHelper.Info($"ZCSendTask浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�, "Mes浠诲姟涓嬪彂");
+                        //    throw new Exception($"ZCSendTask浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�);
+                        //}
+
+                        //姝e紡浠g爜锛岃皟鐢ㄦ帴鍙e鎵惧彲鐢ㄦ帴椹充綅
+                        var connectionList = LocationHelper.GetConnectionList(workFlow.CONNECTION);
+                        var usableConnectionList = WcsTask.WcsPositionAvailable(model.task_no, connectionList);
+                        if (usableConnectionList != null && usableConnectionList.code == "0")
+                        {
+                            foreach (var item in usableConnectionList.available)
+                            {
+                                var con = LocationHelper.GetLoc(item);
+                                if (con.S_LOCK_STATE == "鏃� && con.N_CURRENT_NUM < 2)
+                                {
+                                    connection = con.S_CODE;
+                                    LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鍒板彲鐢ㄦ帴椹充綅{connection}", "Mes浠诲姟涓嬪彂");
+                                }
+                            }
+                        }
+                        else
+                        {
+                            LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�, "Mes浠诲姟涓嬪彂");
+                            throw new Exception($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�);
+                        }
+
+                        if (connection=="")
+                        {
+                            LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�, "Mes浠诲姟涓嬪彂");
+                            throw new Exception($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�);
+                        }
+                    }
+
+                    //鏌ユ壘缁堢偣
+                    var endList = LocationHelper.GetAllLocList1(workFlow.ENDAREA);
+
+                    Location end = null;
+
+
+                    if (workFlow.FLOWCODE == "1")
+                    {
+                        //婊℃墭鍏�+                        end = LocationHelper.FindEndcolByLocList(endList, workFlow.ENDAREA, workFlow.ROADWAY);
+                    }
+                    else if (workFlow.FLOWCODE == "3")
+                    {
+                        //绌烘墭鍏�浼樺厛鍏ョ紦瀛樺尯锛屾病鏈夊叆绔嬪簱鍖�+                        var ktHcq = Settings.EmptyPalletBufferArea;
+                        cntrCount = 0;
+                        var endList1 = LocationHelper.GetAllLocList1(ktHcq);
+                        end = LocationHelper.FindEndcolByLoc(endList1, ktHcq);
+                        LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟瀵绘壘绌烘墭缂撳瓨鍖虹粓鐐逛俊鎭� + JsonConvert.SerializeObject(end), "Mes浠诲姟涓嬪彂");
+                        if (end == null)
+                        {
+                            LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟娌℃壘鍒扮┖鎵樼紦瀛樺尯缁堢偣,瀵绘壘绔嬪簱鍖虹┖璐т綅", "Mes浠诲姟涓嬪彂");
+                            end = LocationHelper.FindEndcolByLocList(endList, workFlow.ENDAREA, workFlow.ROADWAY);
+                        }
+                        else
+                        {
+                            connection = "";
+                        }
+                    }
+                    else if (workFlow.FLOWCODE == "2")
+                    {
+
+                        //85绾ょ淮 95閽笣涓�浠诲姟鍏ヤ笁灞傝揣鏋�+                        if (TOOLSTYPE == "85" || TOOLSTYPE == "95")
+                        {
+                            end = LocationHelper.FindEndcolByLoc(endList, workFlow.ENDAREA);
+                            LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟85绾ょ淮 95閽笣涓�浠诲姟鍏ヤ笁灞傝揣鏋剁粓鐐逛俊鎭� + JsonConvert.SerializeObject(end), "Mes浠诲姟涓嬪彂");
+                        }
+                        else
+                        {
+                            end = LocationHelper.FindEndcolByLocList(endList, workFlow.ENDAREA, workFlow.ROADWAY);
+                        }
+                    }
+                    else if (workFlow.FLOWCODE == "12")
+                    {
+                        //绌烘灦瀛愬叆
+                        end = LocationHelper.FindEndcolByLoc(endList, workFlow.ENDAREA);
+                        cntrCount = 0;
+                        //鐢熸垚绌烘灦瀛愯櫄鎷熷彿
+                        cntrCode = ContainerHelper.GenerateCntrNo();
+                    }
+
+
+                        LogHelper.Info($"ZCSendTask浠诲姟涓嬪彂缁堢偣淇℃伅" + JsonConvert.SerializeObject(end), "Mes浠诲姟涓嬪彂");
+
+                    if (end == null) {
+                        LogHelper.Info($"ZCSendTask浠诲姟涓嬪彂澶辫触锛岀粓鐐瑰簱鍖簕workFlow.ENDAREA},娌℃壘鍒扮粓鐐�, "Mes浠诲姟涓嬪彂");
+                        throw new Exception($"缁堢偣搴撳尯{workFlow.ENDAREA},娌℃壘鍒扮粓鐐�);
+                    }
+
+                    //娣诲姞鎵樼洏鐗╂枡鍏宠仈琛�+                    if (cntrCount!=0)
+                    {
+                        CntrItemRel rel = new CntrItemRel();
+                        rel.S_ITEM_CODE = model.PROD_NO;
+                        rel.S_ITEM_NAME = model.PROD_BOM;
+                        rel.S_CNTR_CODE = model.TOOLS_NO;
+                        rel.S_BATCH_NO = "";
+                        rel.TurnCardNum = model.TurnCardNum;
+                        rel.Level = model.PROD_BOM;
+                        rel.itemModel = model.PROD_NO;
+
+                        var EXPIRED_TIME = model.EXPIRED_TIME.ToString();
+                        if (EXPIRED_TIME == "0001/1/1 0:00:00")
+                        {
+                            rel.expireTime = model.SHELF_LIFE_TIME.AddHours(model.EXPIRED_REP);
+                            LogHelper.Info($"澶辨晥鏃堕棿涓�001/1/1 0:00:00锛屼慨鏀逛负锛歿rel.expireTime}", "Mes浠诲姟涓嬪彂");
+                        }
+                        else
+                        {
+                            rel.expireTime = model.EXPIRED_TIME;
+                        }
+
+                        var SHELF_LIFE_TIME = model.SHELF_LIFE_TIME.ToString();
+                        if (SHELF_LIFE_TIME == "0001/1/1 0:00:00")
+                        {
+                            rel.takeEffectTime = model.SHELF_LIFE_TIME.AddHours(-model.SHELF_REP);
+                            LogHelper.Info($"鐢熸晥鏃堕棿涓�001/1/1 0:00:00锛屼慨鏀逛负锛歿rel.takeEffectTime}", "Mes浠诲姟涓嬪彂");
+                        }
+                        else
+                        {
+                            rel.takeEffectTime = model.SHELF_LIFE_TIME;
+                        }
+
+                        rel.F_QTY = Convert.ToDecimal(model.CURRENT_AMOUNT);
+                        rel.S_ITEM_STATE = model.CHECK_INFO;
+                        rel.PRODUCTIONDATE = model.PRODUCE_TIME;
+                        rel.T_INSTOCK = DateTime.Now;
+                        rel.S_ITEM_SPEC = model.PROD_SPEC;
+                        rel.F_SUM_QTY = Convert.ToDecimal(model.standardWeight);
+                        rel.itemFeature = model.PROD_TECH;
+                        ContainerHelper.CreateCntrItem(rel);
+                    }
+                   
+
+
+                    //娣诲姞鎵樼洏
+                    Container cntr1 = new Container();
+                    cntr1.S_CODE = cntrCode;
+                    cntr1.C_ENABLE = "Y";
+                    cntr1.N_DETAIL_COUNT = cntrCount;
+                    cntr1.S_TYPE = "";
+
+                    LogHelper.Info($"娣诲姞瀹瑰櫒淇℃伅"+JsonConvert.SerializeObject(cntr1), "Mes浠诲姟涓嬪彂");
+                    if (ContainerHelper.CreateCntr(cntr1))
+                    {
+                        LogHelper.Info($"娣诲姞瀹瑰櫒淇℃伅鎴愬姛" , "Mes浠诲姟涓嬪彂");
+                    }
+                    else {
+                        LogHelper.Info($"娣诲姞瀹瑰櫒淇℃伅澶辫触" , "Mes浠诲姟涓嬪彂");
+                    }
+
+
+
+
+                    //璧风偣缁堢偣鏌ユ壘鎴愬姛锛屽垱寤轰綔涓�+
+                    var taskType = int.Parse(workFlow.FLOWCODE);
+
+                    var operation = new WmsWork
+                    {
+                        // 浣滀笟鍙�+                        S_CODE = model.task_no,
+                        // 浣滀笟绫诲瀷
+                        N_TYPE = taskType,
+                        // 浣滀笟绫诲瀷
+                        S_TYPE = workFlow.FLOWNAME,
+                        // 璧风偣璐т綅
+                        S_START_LOC = start.S_CODE,
+                        // 璧风偣搴撳尯缂栫爜
+                        S_START_AREA = start.S_AREA_CODE,
+                        //鎺ラ┏浣�+                        CONNECTION = connection,
+                        // 缁堢偣璐т綅
+                        S_END_LOC = end.S_CODE,
+                        // 缁堢偣搴撳尯缂栫爜
+                        S_END_AREA = end.S_AREA_CODE,
+                        // 瀹瑰櫒缂栫爜
+                        S_CNTR_CODE = cntrCode,
+                        // 浣滀笟瀹氫箟鍚嶇О
+                        S_OP_DEF_NAME = workFlow.FLOWNAME,
+                        //浼樺厛绾�+                        N_PRIORITY = model.Priority,
+                        //宸ヨ绫诲瀷
+                        TOOLSTYPE = TOOLSTYPE
+
+                    };
+
+                    //鍒涘缓浣滀笟
+                    if (WMSHelper.CreateWmsWork(operation)) {
+                        LogHelper.Info($"ZCSendTask鍏ュ簱浣滀笟鍒涘缓鎴愬姛{operation.S_CODE}", "Mes浠诲姟涓嬪彂");
+                        result.errMsg = "鍏ュ簱浣滀笟鍒涘缓鎴愬姛";
+                        result.errCode = 0;
+                        result.success = true;
+                        return result;
+                    }
+
+
+                }
+                else if (model.Task_type == 2)
+                {
+                    //鍑哄簱浠诲姟
+
+                    //鎺ラ┏浣�+                    var connection = "";
+
+                    //鏌ユ壘缁欏畾缁堢偣
+                    var end = LocationHelper.GetLoc(model.Location_To);
+                    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂缁堢偣淇℃伅" + JsonConvert.SerializeObject(end), "Mes浠诲姟涓嬪彂");
+
+
+                    if (end == null || end.S_LOCK_STATE != "鏃�)
+                    {
+                        LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂澶辫触锛岀粓鐐�{model.Location_To},娌℃壘鍒版垨鏈夐攣", "Mes浠诲姟涓嬪彂");
+                        throw new Exception($"缁堢偣:{model.Location_To},娌℃壘鍒版垨鏈夐攣");
+                    }
+
+
+                    //鏌ユ壘璧风偣
+                    var strrtList = LocationHelper.GetAllLocList2(workFlow.STARTAREA);
+                    Location start = null;
+                    if (workFlow.FLOWCODE == "9")
+                    {
+                        if (TOOLSTYPE == "85" || TOOLSTYPE == "95")
+                        {
+                            start = LocationHelper.FindStartcolByHjLoclistAndItem(strrtList, model.PROD_NO, workFlow.STARTAREA);
+                            LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟85绾ょ淮 95閽笣涓�浠诲姟涓夊眰璐ф灦璧风偣淇℃伅" + JsonConvert.SerializeObject(start), "Mes浠诲姟涓嬪彂");
+                        }
+                        else {
+                            //鏍规嵁鍒跺搧缂栧彿瀵绘壘绔嬪簱鍖哄搴旂墿鏂欐墭鐩�+                            start = LocationHelper.FindStartcolByLoclistAndItem(strrtList, model.PROD_NO, workFlow.STARTAREA, workFlow.ROADWAY);
+                        }
+
+                       
+                    }
+                    else if (workFlow.FLOWCODE == "7") {
+                        //瀵绘壘绔嬪簱鍖虹┖鎵�+                        start = LocationHelper.FindStartcolByLoclistAndcntr(strrtList, workFlow.STARTAREA);
+                    }
+
+
+                    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣淇℃伅" + JsonConvert.SerializeObject(start), "Mes浠诲姟涓嬪彂");
+
+                    if (start == null)
+                    {
+                        LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂澶辫触锛岃捣鐐瑰簱鍖簕workFlow.STARTAREA},娌℃壘鍒拌捣鐐�, "Mes浠诲姟涓嬪彂");
+                        throw new Exception($"璧风偣搴撳尯{workFlow.STARTAREA},娌℃壘鍒拌捣鐐�);
+                    }
+
+                    //鑾峰彇鎵樼洏鐮�+                    var cntrCode = LocationHelper.GetLocCntrCode(start.S_CODE);
+
+                    if (workFlow.SENDWCS == "Y")
+                    {
+                        //娴嬭瘯榛樿鍙栦竴涓帴椹充綅
+                        //var connectionList = LocationHelper.GetAllLocList1(workFlow.CONNECTION);
+                        //foreach (var item in connectionList)
+                        //{
+                        //    if (item.S_LOCK_STATE == "鏃� && item.N_CURRENT_NUM < 2)
+                        //    {
+                        //        connection = item.S_CODE;
+                        //        LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鍒板彲鐢ㄦ帴椹充綅{connection}", "Mes浠诲姟涓嬪彂");
+                        //    }
+                        //}
+
+                        //if (connection == "")
+                        //{
+                        //    LogHelper.Info($"ZCSendTask浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�, "Mes浠诲姟涓嬪彂");
+                        //    throw new Exception($"ZCSendTask浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�);
+                        //}
+
+
+                        //姝e紡浠g爜锛岃皟鐢ㄦ帴鍙e鎵惧彲鐢ㄦ帴椹充綅
+                        var connectionList = LocationHelper.GetConnectionList(workFlow.CONNECTION);
+                        var usableConnectionList = WcsTask.WcsPositionAvailable(model.task_no, connectionList);
+                        if (usableConnectionList != null && usableConnectionList.code == "0")
+                        {
+                            foreach (var item in usableConnectionList.available)
+                            {
+                                var con = LocationHelper.GetLoc(item);
+                                if (con.S_LOCK_STATE == "鏃� && con.N_CURRENT_NUM < 2)
+                                {
+                                    connection = con.S_CODE;
+                                    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂瀵绘壘鍒板彲鐢ㄦ帴椹充綅{connection}", "Mes浠诲姟涓嬪彂");
+                                }
+                            }
+                        }
+                        else
+                        {
+                            LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�, "Mes浠诲姟涓嬪彂");
+                            throw new Exception($"ZCSendTask鍑哄簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�);
+                        }
+
+                        if (connection == "")
+                        {
+                            LogHelper.Info($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�, "Mes浠诲姟涓嬪彂");
+                            throw new Exception($"ZCSendTask鍏ュ簱浠诲姟涓嬪彂瀵绘壘鎺ラ┏浣嶅け璐�);
+                        }
+                    }
+
+
+                    //璧风偣缁堢偣鏌ユ壘鎴愬姛锛屽垱寤轰綔涓�+
+                    var taskType = int.Parse(workFlow.FLOWCODE);
+
+                    var operation = new WmsWork
+                    {
+                        // 浣滀笟鍙�+                        S_CODE = model.task_no,
+                        // 浣滀笟绫诲瀷
+                        N_TYPE = taskType,
+                        // 浣滀笟绫诲瀷
+                        S_TYPE = workFlow.FLOWNAME,
+                        // 璧风偣璐т綅
+                        S_START_LOC = start.S_CODE,
+                        // 璧风偣搴撳尯缂栫爜
+                        S_START_AREA = start.S_AREA_CODE,
+                        //鎺ラ┏浣�+                        CONNECTION = connection,
+                        // 缁堢偣璐т綅
+                        S_END_LOC = end.S_CODE,
+                        // 缁堢偣搴撳尯缂栫爜
+                        S_END_AREA = end.S_AREA_CODE,
+                        // 瀹瑰櫒缂栫爜
+                        S_CNTR_CODE = cntrCode,
+                        // 浣滀笟瀹氫箟鍚嶇О
+                        S_OP_DEF_NAME = workFlow.FLOWNAME,
+                        //浼樺厛绾�+                        N_PRIORITY = model.Priority,
+                        //宸ヨ绫诲瀷
+                        TOOLSTYPE = TOOLSTYPE
+                    };
+
+                    //鍒涘缓浣滀笟
+                    if (WMSHelper.CreateWmsWork(operation))
+                    {
+                        LogHelper.Info($"ZCSendTask鍑哄簱浣滀笟鍒涘缓鎴愬姛{operation.S_CODE}", "Mes浠诲姟涓嬪彂");
+                        result.errMsg = "鍑哄簱浣滀笟鍒涘缓鎴愬姛";
+                        result.errCode = 0;
+                        result.success = true;
+                        return result;
+                    }
+
+                }
+                else {
+                    LogHelper.Info("ZCSendTask鍑哄簱浠诲姟涓嬪彂澶辫触锛孴ask_type涓嶇瓑浜�鎴�", "Mes浠诲姟涓嬪彂");
+                    throw new Exception("Task_type涓嶇瓑浜�鎴�");
+                }
+
+
+                //鍙傛暟鏍¢獙瀹屾垚淇濆瓨鍒癿es浠诲姟璁板綍
+                //MesTask req = new MesTask()
+                //{
+                //    task_no = model.task_no,
+                //    Task_type = model.Task_type,
+                //    TurnCardNum = model.TurnCardNum,
+                //    PROD_NO = model.PROD_NO,
+                //    PROD_TECH = model.PROD_TECH,
+                //    PROD_SPEC = model.PROD_SPEC,
+                //    PROD_BOM = model.PROD_BOM,
+                //    PROD_Feature = model.PROD_Feature,
+                //    TOOLS_NO = model.TOOLS_NO,
+                //    ST_AMOUNT = model.ST_AMOUNT,
+                //    CURRENT_AMOUNT = model.CURRENT_AMOUNT,
+                //    Location_From = model.Location_From,
+                //    Location_To = model.Location_To,
+                //    PRODUCE_TIME = model.PRODUCE_TIME,
+                //    SHELF_LIFE_TIME = model.SHELF_LIFE_TIME,
+                //    EXPIRED_TIME = model.EXPIRED_TIME,
+                //    SHELF_REP = model.SHELF_REP,
+                //    EXPIRED_REP = model.EXPIRED_REP,
+                //    CHECK_CODE = model.CHECK_CODE,
+                //    CHECK_INFO = model.CHECK_INFO,
+                //    Priority = model.Priority,
+                //    Data_status = model.Data_status,
+                //    CreateDate = DateTime.Now,
+                //    standardWeight = model.standardWeight,
+                //    BUSI_TYPE = model.BUSI_TYPE,
+                //    TOOLS_TPYE = model.TOOLS_TPYE,
+                //};
+
+
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info("ZCSendTask浠诲姟涓嬪彂寮傚父"+ex.Message, "Mes浠诲姟涓嬪彂");
+                result.errMsg = "ZCSendTask浠诲姟涓嬪彂寮傚父"+ex.Message;
+                result.errCode = 1;
+                result.success = false;
+                return result;
+            }
+
+            return result;
+        
+        }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        /// <summary>
+        /// 闂ㄥ畨鍏ㄤ氦浜�+        /// </summary>
+        internal static ReturnResult1 safetyDoor(doorInteraction model)
+        {
+            var res = new ReturnResult1();
+        
+            if (model == null)
+            {
+                res.code = 1;
+                res.msg = "鍙傛暟涓簄ull";
+                return res;
+            }
+            else
+            {
+                //寮�棬 1   鍏抽棬 4
+                if (DeviceProcess.Traffic(model.doorname, model.apply_code,true))
+                {
+                    res.code = 0;
+                    res.msg = "鍏佽";
+                }
+                else
+                {
+                    res.code = 1;
+                    res.msg = "涓嶅厑璁�;
+                }
+            }
+
+            return res;
+        }
+
+        /// <summary>
+        /// 闂ㄧ姸鎬�+        /// </summary>
+        internal static ReturnResult1 selectDoorStatus1(doorInteraction model)
+        {
+            var res = new ReturnResult1();
+
+            if (model == null)
+            {
+                res.code = 1;
+                res.msg = "鍙傛暟涓簄ull";
+                return res;
+            }
+            else
+            {
+                if (DeviceProcess.Traffic(model.doorname, model.apply_code, false))
+                {
+                    res.code = 0;
+                    res.msg = "鎴愬姛";
+                }
+                else
+                {
+                    res.code = 1;
+                    res.msg = "澶辫触";
+                }
+                return res;
+            }
+        }
+
+
+        /// <summary>
+        /// 瀹夊叏浜や簰
+        /// </summary>
+        internal static ReturnResult1 safetyInteraction1(Interaction model) {
+            var res = new ReturnResult1();
+            var wmsTask = new WMSTask();
+            if (model == null)
+            {
+                res.code = 0;
+                res.msg = "鍙傛暟涓簄ull";
+                return res;
+            }
+            else
+            {
+                try
+                {
+                    switch (model.apply_code)
+                    {
+                        case "1":
+                            //鍙栬揣璇锋眰杩涘叆
+                            wmsTask = TaskHelper.GetTaskByKwName(model.station_name, true, model.orderid);
+                            if (wmsTask != null)
+                            {
+                                //杈撻�绾块渶瑕佸畨鍏ㄤ氦浜�+                                    if (TaskProcess.Interaction(wmsTask, 1, model.station_name))
+                                    {
+                                        res.code = 0;
+                                        res.msg = "杈撻�绾垮厑璁歌繘鍏�;
+                                        return res;
+                                    }
+                                    else
+                                    {
+                                        res.code = 1;
+                                        res.msg = "杈撻�绾夸笉鍏佽杩涘叆";
+                                        return res;
+                                    }
+                               
+                            }
+                            else
+                            {
+                                res.code = 1;
+                                res.msg = "娌℃壘鍒颁换鍔�;
+                                return res;
+                            }
+                        case "3":
+                            //鍙栬揣瀹屾垚
+                            wmsTask = TaskHelper.GetTaskByKwName(model.station_name, true, model.orderid);
+                            if (wmsTask != null)
+                            {
+                                //杈撻�绾块渶瑕佸畨鍏ㄤ氦浜�+                                if (TaskProcess.Interaction(wmsTask, 3, model.station_name))
+                                {
+                                    res.code = 0;
+                                    res.msg = "鍙栬揣瀹屾垚閫氱煡鎴愬姛";
+                                    return res;
+                                }
+                                else
+                                {
+                                    res.code = 1;
+                                    res.msg = "鍙栬揣瀹屾垚閫氱煡鎴愬姛";
+                                    return res;
+                                }
+
+                            }
+                            else
+                            {
+                                res.code = 1;
+                                res.msg = "娌℃壘鍒颁换鍔�;
+                                return res;
+                            }
+                        case "6":
+                            //鍗歌揣瀹屾垚
+                            wmsTask = TaskHelper.GetTaskByKwName(model.station_name, false, model.orderid);
+                            if (wmsTask != null)
+                            {
+                                //杈撻�绾块渶瑕佸畨鍏ㄤ氦浜�+                                if (TaskProcess.Interaction(wmsTask, 6, model.station_name))
+                                {
+                                    res.code = 0;
+                                    res.msg = "鍗歌揣瀹屾垚閫氱煡鎴愬姛";
+                                    return res;
+                                }
+                                else
+                                {
+                                    res.code = 1;
+                                    res.msg = "鍗歌揣瀹屾垚閫氱煡澶辫触";
+                                    return res;
+                                }
+
+                            }
+                            else
+                            {
+                                res.code = 1;
+                                res.msg = "娌℃壘鍒颁换鍔�;
+                                return res;
+                            }
+                        case "4":
+                            //鍙栬揣绂诲紑鍔ㄤ綔
+                            wmsTask = TaskHelper.GetTaskByKwName(model.station_name, true, model.orderid);
+                            if (wmsTask != null)
+                            {
+                                //杈撻�绾块渶瑕佸畨鍏ㄤ氦浜�+                                TaskProcess.Interaction(wmsTask, 4, model.station_name);
+                                     res.code = 0;
+                                     res.msg = "鍙栬揣宸茬粡閫�嚭";
+                                     return res;
+                            }
+                            else
+                            {
+                                res.code = 1;
+                                res.msg = "娌℃壘鍒颁换鍔�;
+                                return res;
+                            }
+                        case "5":
+                            //鍗歌揣璇锋眰杩涘叆
+                            wmsTask = TaskHelper.GetTaskByKwName(model.station_name, false, model.orderid);
+                            if (wmsTask != null)
+                            {     
+                                    if (TaskProcess.Interaction(wmsTask, 5, model.station_name))
+                                    {
+                                        res.code = 0;
+                                        res.msg = "杈撻�绾垮厑璁歌繘鍏�;
+                                        return res;
+                                    }
+                                    else
+                                    {
+                                        res.code = 1;
+                                        res.msg = "杈撻�绾夸笉鍏佽杩涘叆";
+                                        return res;
+                                    }
+                            }
+                            else
+                            {
+                                res.code = 1;
+                                res.msg = "娌℃壘鍒颁换鍔�;
+                                return res;
+                            }
+                        case "8":
+                            //var db = new SqlHelper<object>().GetInstance();
+                            ////鍗歌揣绂诲紑鍔ㄤ綔
+                            //if (model.station_name.Contains("SM"))
+                            //{
+                            //  var  task = TaskHelper.GetTaskByKwName1(model.orderid);
+                            //    if (task == null)
+                            //    {
+                            //        res.code = 1;
+                            //        res.msg = "娌℃壘鍒颁换鍔�;
+                            //        return res;
+                            //    }
+                            //    else {
+                            //        LogHelper.Info("鍗歌揣绂诲紑鍔ㄤ綔", "浠诲姟");
+                            //        res.code = 0;
+                            //        res.msg = "鍗歌揣宸茬粡閫�嚭";
+                            //        return res;
+                            //    }
+                            //}
+
+
+                          
+                            LogHelper.Info("鍗歌揣绂诲紑鍔ㄤ綔", "浠诲姟");
+                            res.code = 0;
+                            res.msg = "鍗歌揣宸茬粡閫�嚭";
+                            return res;
+                        default:
+                            break;
+                    }
+                }
+                catch (Exception e)
+                {
+                    LogHelper.Info("瀹夊叏浜や簰寮傚父淇℃伅" + e.Message, "浠诲姟");
+                }
+
+            }
+            res.code = 0;
+            res.msg = "鍏佽杩涘叆";
+            return res;
+
+        }
+
+
+      
+
+      
+
+
+
+        
+
+
+        public class signalInfo
+        {
+            public string info { get; set; }
+            public DateTime modify { get; set; }
+        }
+
+
+        #endregion
+    }
+}
diff --git a/util/DingTalk.cs b/util/DingTalk.cs
new file mode 100644
index 0000000..915c9a9
--- /dev/null
+++ b/util/DingTalk.cs
@@ -0,0 +1,682 @@
+锘縰sing DingTalk.Api;
+using DingTalk.Api.Request;
+using DingTalk.Api.Response;
+using HH.WCS.ZhongCeJinTan;
+using HH.WCS.ZhongCeJinTan.util;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace HanHe.Message
+{
+    public class DingTalk
+    {
+        private static string accessToken;
+        private static long agentId = 3821174862;
+        private static string appKey = "dingreswzhnbdarn9uby";
+        private static string appSecret = "grCVjpohQOzmhZsmVwb-7-CsyZmg0G6d_X86xreuYjj6Y_YZgSSE4nCLpDIzUJ4P";
+        private static DateTime expiresIn = DateTime.Now;
+        private static List<OapiDepartmentListResponse.DepartmentDomain> department = new List<OapiDepartmentListResponse.DepartmentDomain>();
+        private static List<OapiUserSimplelistResponse.UserlistDomain> userlist = new List<OapiUserSimplelistResponse.UserlistDomain>();
+        private static bool param = false;
+        //public static bool Init(long agentId, string appKey, string appSecret)
+        //{
+        //    if (agentId > 0 && !string.IsNullOrEmpty(appKey) && !string.IsNullOrEmpty(appSecret))
+        //    {
+
+        //        DingTalk.agentId = agentId;
+        //        DingTalk.appKey = appKey;
+        //        DingTalk.appSecret = appSecret;
+        //        if (!GetToken())
+        //        {
+        //            DingTalk.agentId = 0;
+        //            DingTalk.appKey = "";
+        //            DingTalk.appSecret = "";
+        //        }
+        //        else
+        //        {
+        //            return true;
+        //        }
+        //    }
+        //    return false;
+        //}
+        public static bool InitTest(long agentId, string appKey, string appSecret)
+        {
+            if (agentId > 0 && !string.IsNullOrEmpty(appKey) && !string.IsNullOrEmpty(appSecret))
+            {
+                return GetToken(appKey, appSecret, false);
+            }
+            return false;
+        }
+        /// <summary>
+        /// 鑾峰彇鎵�湁閮ㄩ棬鍚嶇О
+        /// </summary>
+        /// <returns></returns>
+        public static List<string> GetDepartment()
+        {
+            List<string> names = new List<string>();
+            if (department.Count > 0)
+            {
+                department.ForEach(d => names.Add(d.Name));
+            }
+            return names;
+        }
+        /// <summary>
+        /// 鏍规嵁閮ㄩ棬鍚嶇О鍙戦�娑堟伅
+        /// </summary>
+        /// <param name="deptName">閮ㄩ棬鍚嶇О</param>
+        /// <param name="content">娑堟伅鍐呭</param>
+        /// <returns></returns>
+        public static MessageResult SendMessageToParty(string deptName, string content)
+        {
+            MessageResult result = new MessageResult();
+            if (string.IsNullOrEmpty(accessToken))
+            {
+                result.Errcode = -1;
+                result.Errmsg = "涓嶅悎娉曠殑token";
+            }
+            else
+            {
+                //鑾峰彇閮ㄩ棬id
+                var deptId = CheckDepartment(deptName);
+                if (deptId == "0")
+                {
+                    result.Errcode = -2;
+                    result.Errmsg = "涓嶅瓨鍦ㄧ殑閮ㄩ棬";
+                }
+                else
+                {
+                    result = SendMessage(deptId, content, true);
+                }
+            }
+            return result;
+        }
+        public static MessageResult SendMessageToUser(string userName, string content)
+        {
+            MessageResult result = new MessageResult();
+            if (string.IsNullOrEmpty(accessToken))
+            {
+                result.Errcode = -1;
+                result.Errmsg = "涓嶅悎娉曠殑token";
+            }
+            else
+            {
+                //鑾峰彇浜哄憳id
+                var userId = CheckUser(userName);
+                if (userId == "0")
+                {
+                    result.Errcode = -2;
+                    result.Errmsg = "涓嶅瓨鍦ㄧ殑浜哄憳";
+                }
+                else
+                {
+                    result = SendMessage(userId, content, false);
+                }
+            }
+            return result;
+        }
+
+        #region 鍐呴儴鏂规硶
+
+        private static bool GetToken(string appKey = "", string appSecret = "", bool init = true)
+        {
+            if (string.IsNullOrEmpty(appKey))
+            {
+                appKey = DingTalk.appKey;
+            }
+            if (string.IsNullOrEmpty(appSecret))
+            {
+                appSecret = DingTalk.appSecret;
+            }
+
+            DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+            OapiGettokenRequest request = new OapiGettokenRequest();
+            request.Appkey = appKey;
+            request.Appsecret = appSecret;
+            request.SetHttpMethod("GET");
+
+            OapiGettokenResponse response = client.Execute(request);
+            if (response.Errcode == 0)
+            {
+                //40089 涓嶅悎娉曠殑corpid鎴朿orpsecret
+                if (init)
+                {
+                    param = true;
+                    accessToken = response.AccessToken;
+                    ListDepartment();
+                    ListUser();
+                }
+                return true;
+            }
+            return false;
+        }
+        /// <summary>
+        /// 鑾峰彇閮ㄩ棬鍒楄〃
+        /// </summary>
+        /// <param name="id">鐖禝d</param>
+        private static void ListDepartment(string id = "")
+        {
+            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list");
+            OapiDepartmentListRequest request = new OapiDepartmentListRequest();
+            request.Id = id;
+            request.FetchChild = true;
+            request.SetHttpMethod("GET");
+            OapiDepartmentListResponse response = client.Execute(request, accessToken);
+            if (response.Errcode == 0)
+            {
+                //40014 涓嶅悎娉曠殑access_token
+                department = response.Department;
+            }
+            else
+            {
+                LogHelper.Info("閽夐拤", response.Errmsg);
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁閮ㄩ棬鍚嶇О鑾峰彇閮ㄩ棬id
+        /// </summary>
+        /// <param name="name"></param>
+        private static string CheckDepartment(string deptName)
+        {
+            string id = "0";
+            if (string.IsNullOrEmpty(deptName))
+            {
+                if (department.Count > 0)
+                {
+                    var list = department.Where(a => a.Parentid == 1).ToList();
+                    if (list.Count > 0)
+                    {
+                        id = string.Join(",", list.Select(a => a.Id.ToString()).ToArray());
+                    }
+                }
+            }
+            else
+            {
+                if (department.Count > 0)
+                {
+                    for (int i = 0; i < department.Count; i++)
+                    {
+                        if (department[i].Name == deptName)
+                        {
+                            id = department[i].Id.ToString();
+                            break;
+                        }
+                    }
+                }
+            }
+            return id;
+        }
+        private static string CheckUser(string userName)
+        {
+            string id = "0";
+            if (userlist.Count > 0)
+            {
+                for (int i = 0; i < userlist.Count; i++)
+                {
+                    if (userlist[i].Name == userName)
+                    {
+                        id = userlist[i].Userid;
+                        break;
+                    }
+                }
+            }
+            return id;
+        }
+
+        private static MessageResult SendMessage(string id, string content, bool party)
+        {
+
+            OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+            request.AgentId = agentId;
+            request.ToAllUser = false;
+            if (party)
+            {
+                request.DeptIdList = id;//123,456
+            }
+            else
+            {
+                request.UseridList = id;//zhangsan,lisi
+            }
+            OapiMessageCorpconversationAsyncsendV2Request.MsgDomain msg = new OapiMessageCorpconversationAsyncsendV2Request.MsgDomain();
+            msg.Msgtype = "text";
+            msg.Text = new OapiMessageCorpconversationAsyncsendV2Request.TextDomain() { Content = content };
+            request.Msg_ = msg;
+
+            return SendMessage(request);
+            //response.Errcode=88 ding talk error[subcode=40014,submsg=涓嶅悎娉曠殑access_token]
+        }
+
+        private static MessageResult SendMessage(OapiMessageCorpconversationAsyncsendV2Request request)
+        {
+            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+
+            OapiMessageCorpconversationAsyncsendV2Response response = client.Execute(request, accessToken);
+            if (response.Errcode == 88 && DingTalk.param)
+            {
+                //token杩囨湡
+                if (GetToken())
+                {
+                    return SendMessage(request);
+                }
+            }
+            return new MessageResult { Errcode = response.Errcode, Errmsg = response.Errmsg };
+        }
+
+        public static void GetSendProgress(long taskId = 23017959620)
+        {
+            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/getsendprogress");
+            OapiMessageCorpconversationGetsendprogressRequest request = new OapiMessageCorpconversationGetsendprogressRequest();
+            request.AgentId = agentId;
+            request.TaskId = taskId;
+            OapiMessageCorpconversationGetsendprogressResponse response = client.Execute(request, accessToken);
+        }
+
+        private static void GetDeptMember(string deptId)
+        {
+            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getDeptMember");
+            OapiUserGetDeptMemberRequest req = new OapiUserGetDeptMemberRequest();
+            req.DeptId = deptId;//93688589
+            req.SetHttpMethod("GET");
+            OapiUserGetDeptMemberResponse rsp = client.Execute(req, accessToken);
+
+        }
+
+        private static void ListUser()
+        {
+            var list = new List<OapiUserSimplelistResponse.UserlistDomain>();
+            department.ForEach(d =>
+            {
+                if (d.Id > 1)
+                {
+                    list.AddRange(Simplelist(d.Id));
+                }
+            });
+            userlist = list.Distinct(new UserIdComparer()).ToList();
+        }
+        private static List<OapiUserSimplelistResponse.UserlistDomain> Simplelist(long deptId)
+        {
+            var list = new List<OapiUserSimplelistResponse.UserlistDomain>();
+
+            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/simplelist");
+            OapiUserSimplelistRequest request = new OapiUserSimplelistRequest();
+            request.DepartmentId = deptId;
+            request.Offset = 0;
+            request.Size = 50;
+            request.SetHttpMethod("GET");
+
+            OapiUserSimplelistResponse response = client.Execute(request, accessToken);
+            //60020 璁块棶ip涓嶅湪鐧藉悕鍗曚箣涓�request ip=117.71.57.100
+            if (response.Errcode == 0)
+            {
+                //response.HasMore
+                list.AddRange(response.Userlist);
+                while (response.HasMore)
+                {
+                    request.Offset += 50;
+                    response = client.Execute(request, accessToken);
+                    if (response.Errcode == 0)
+                    {
+                        list.AddRange(response.Userlist);
+                    }
+                }
+            }
+            return list;
+        }
+        #endregion
+
+    }
+    public class UserIdComparer : IEqualityComparer<OapiUserSimplelistResponse.UserlistDomain>
+    {
+        public bool Equals(OapiUserSimplelistResponse.UserlistDomain x, OapiUserSimplelistResponse.UserlistDomain y)
+        {
+            if (x == null)
+                return y == null;
+            return x.Userid == y.Userid;
+        }
+
+        public int GetHashCode(OapiUserSimplelistResponse.UserlistDomain obj)
+        {
+            if (obj == null)
+                return 0;
+            return obj.Userid.GetHashCode();
+        }
+    }
+    public class MessageResult
+    {
+        public long Errcode { get; set; }
+        public string Errmsg { get; set; }
+    }
+
+
+
+    public class DingDingHelper
+    {
+        private static readonly HttpHelper apiHelper = new HttpHelper();
+        string appkey = "dingitwnepteor0s0ywq";
+        string appsecret = "6_jqU2EZYdfzz2Vx08PoOIsM3V3zWrQeNi3BkAP37pKMsWChJbRpxcWTaued_BhZ";
+        string agentid = "3102306110";//
+        string corpId = "";//浼佷笟鍙�+        string AccessToken = String.Empty;
+
+        #region 閫氳繃鍏嶇櫥鎺堟潈鐮佸拰access_token鑾峰彇鐢ㄦ埛鐨剈serid
+        public string GetUserIdByCode(string code)
+        {
+            GetToken();
+            if (string.IsNullOrWhiteSpace(AccessToken) || string.IsNullOrWhiteSpace(code))
+                return "";
+
+            try
+            {
+                string AccessUrl = string.Format("https://oapi.dingtalk.com/user/getuserinfo?access_token={0}&code={1}", AccessToken, code);
+                //璇锋眰鑾峰彇token  GET鏂瑰紡
+                Newtonsoft.Json.Linq.JToken json = Newtonsoft.Json.Linq.JToken.Parse(apiHelper.Get(AccessUrl, null));
+                return json["userid"].ToString();
+            }
+            catch (Exception ex)
+            {
+                return "";
+            }
+        }
+        #endregion
+
+        #region 鏍规嵁鎵嬫満鍙疯幏鍙栫敤鎴穒d
+        /// <summary>
+        /// 鏍规嵁鎵嬫満鍙疯幏鍙栫敤鎴穒d
+        /// </summary>
+        /// <param name="phoneNumber">鐢ㄦ埛鎵嬫満鍙�/param>
+        /// <returns></returns>
+        public string GetUserIdByPhoneNumber(string phoneNumber)
+        {
+            GetToken();
+            if (string.IsNullOrWhiteSpace(AccessToken) || string.IsNullOrWhiteSpace(phoneNumber))
+                return "";
+
+            string MessageUrl = String.Format("https://oapi.dingtalk.com/user/get_by_mobile?access_token={0}&mobile={1}", AccessToken, phoneNumber);
+
+            try
+            {
+                var sr = apiHelper.Get(MessageUrl, null);
+                //Newtonsoft.Json.Linq.JToken json = Newtonsoft.Json.Linq.JToken.Parse(sr);
+                return sr;// json["userid"].ToString();
+            }
+            catch (Exception ex)
+            {
+                return "";
+            }
+
+        }
+        #endregion
+
+        #region 鏍规嵁鐢ㄦ埛id鑾峰彇鐢ㄦ埛璇︾粏淇℃伅
+        /// <summary>
+        /// 鏍规嵁鐢ㄦ埛id鑾峰彇鐢ㄦ埛璇︾粏淇℃伅
+        /// </summary>
+        /// <param name="userid">鐢ㄦ埛id</param>
+        /// <returns></returns>
+        public string GetUseInfoByUid(string userid)
+        {
+            GetToken();
+            if (string.IsNullOrWhiteSpace(AccessToken) || string.IsNullOrWhiteSpace(userid))
+                return "";
+
+            try
+            {
+                string AccessUrl = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", AccessToken, userid);
+                //璇锋眰鑾峰彇token  GET鏂瑰紡
+                return apiHelper.Get(AccessUrl, null);
+            }
+            catch (Exception ex)
+            {
+                return "";
+            }
+        }
+        #endregion
+
+        #region 鑾峰彇TOKEN
+        public void GetToken()
+        {
+            if (string.IsNullOrWhiteSpace(AccessToken))
+            {
+                string AccessUrl = string.Format("https://oapi.dingtalk.com/gettoken?appkey={0}&appsecret={1}", appkey, appsecret);
+                //璇锋眰鑾峰彇token  GET鏂瑰紡
+                Newtonsoft.Json.Linq.JToken json = Newtonsoft.Json.Linq.JToken.Parse(apiHelper.Get(AccessUrl, null));
+                AccessToken = json["access_token"].ToString();
+            }
+        }
+        #endregion
+
+        #region 娑堟伅鎺ㄩ�
+        /// <summary>
+        /// 鏂囨湰娑堟伅鎺ㄩ�锛圱ext鏍煎紡锛�+        /// </summary>
+        /// <param name="text">鎺ㄩ�鍐呭</param>
+        /// <param name="userid_list">鐢ㄦ埛id锛屽涓敤鎴风敤,闅斿紑锛堝锛�23,456锛�/param>
+        public string SendTextMessageToUser(string text, string userid_list)
+        {
+            GetToken();
+            if (string.IsNullOrWhiteSpace(AccessToken) || string.IsNullOrWhiteSpace(text) || string.IsNullOrWhiteSpace(userid_list))
+                return "";
+
+            string MessageUrl = String.Format("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token={0}", AccessToken);
+
+
+            var json_req = SendCommonText(text, userid_list);
+            //var json_req = SendCommonTextAndTitle("閿�敭璁㈠崟绠$悊绯荤粺", content.ToString(), txtusesid.Text);
+            //var json_req = SendCardMsg("閿�敭璁㈠崟绠$悊绯荤粺", content.ToString(), "鏌ョ湅璇︽儏", "https://ding-doc.dingtalk.com/", txtusesid.Text);
+
+            string jsonRequest = JsonConvert.SerializeObject(json_req);//灏嗗璞¤浆鎹负json
+            //POST璇锋眰 娑堟伅鎺ㄩ�
+            var sr = apiHelper.Post(MessageUrl, jsonRequest);
+            return sr;
+        }
+
+        /// <summary>
+        /// 鏂囨湰娑堟伅鎺ㄩ�锛圡arkDown鏍煎紡锛�+        /// </summary>
+        /// <param name="title">鎻愰啋鐢ㄦ埛鐨勬爣棰�/param>
+        /// <param name="text">鎻愰啋鍐呭锛堟敮鎸乵arkdown鏂囨湰瑙f瀽锛�/param>
+        /// <param name="userid_list">鐢ㄦ埛id锛屽涓敤鎴风敤,闅斿紑锛堝锛�23,456锛�/param>
+        /// <returns></returns>
+        public string SendMarkDownMessageToUser(string title, string text, string userid_list)
+        {
+            GetToken();
+            if (string.IsNullOrWhiteSpace(AccessToken) || string.IsNullOrWhiteSpace(text) || string.IsNullOrWhiteSpace(userid_list))
+                return "";
+
+            string MessageUrl = String.Format("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token={0}", AccessToken);
+
+
+            //var json_req = SendCommonText(text, userid_list);
+            var json_req = SendCommonTextAndTitle(title, text, userid_list);
+            //var json_req = SendCardMsg("閿�敭璁㈠崟绠$悊绯荤粺", content.ToString(), "鏌ョ湅璇︽儏", "https://ding-doc.dingtalk.com/", txtusesid.Text);
+
+            string jsonRequest = JsonConvert.SerializeObject(json_req);//灏嗗璞¤浆鎹负json
+            //POST璇锋眰 娑堟伅鎺ㄩ�
+            var sr = apiHelper.Post(MessageUrl, jsonRequest);
+            return sr;
+        }
+
+        /// <summary>
+        /// 鏂囨湰娑堟伅鎺ㄩ�锛圡arkDown鏍煎紡锛�+        /// </summary>
+        /// <param name="title">鎻愰啋鐢ㄦ埛鐨勬爣棰�/param>
+        /// <param name="text">鎻愰啋鍐呭锛堟敮鎸乵arkdown鏂囨湰瑙f瀽锛�/param>
+        /// <param name="linkText">閾炬帴鏂囨湰</param>
+        /// <param name="linkUrl">閾炬帴鍦板潃</param>
+        /// <param name="userid_list">鐢ㄦ埛id锛屽涓敤鎴风敤,闅斿紑锛堝锛�23,456锛�/param>
+        /// <returns></returns>
+        public string SendActionCardMessageToUser(string title, string text, string linkText, string linkUrl, string userid_list)
+        {
+            GetToken();
+            if (string.IsNullOrWhiteSpace(AccessToken) || string.IsNullOrWhiteSpace(text)
+                || string.IsNullOrWhiteSpace(userid_list))
+                return "";
+
+            string MessageUrl = String.Format("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token={0}", AccessToken);
+
+            var json_req = SendCardMsg(title, text, linkText, linkUrl, userid_list);
+
+            string jsonRequest = JsonConvert.SerializeObject(json_req);//灏嗗璞¤浆鎹负json
+            //POST璇锋眰 娑堟伅鎺ㄩ�
+            var sr = apiHelper.Post(MessageUrl, jsonRequest);
+            return sr;
+        }
+        #endregion
+
+        #region 鎺ㄩ�娑堟伅绫诲瀷
+        /// <summary>
+        /// 鎺ㄩ�鏅�鏂囨湰鍐呭
+        /// </summary>
+        /// <param name="content"></param>
+        /// <param name="usesid"></param>
+        /// <returns></returns>
+        public object SendCommonText(string content, string usesid)
+        {
+            return new
+            {
+                userid_list = usesid,  //鎺ュ彈鎺ㄩ�userid锛屼笉鍚岀敤鎴风敤|鍒嗗壊
+                //dept_id_list = "127577105",   //鎺ュ彈鎺ㄩ�閮ㄩ棬id
+                agent_id = agentid,//搴旂敤Id
+                to_all_user = "true",
+                msg = new
+                {
+                    msgtype = "text",
+                    text = new { content = content.ToString() }//鍐呭text
+
+                }
+            };
+        }
+
+
+        /// <summary>
+        /// 鎺ㄩ�markdown鍐呭
+        /// </summary>
+        /// <param name="_title"></param>
+        /// <param name="_content"></param>
+        /// <param name="usesid"></param>
+        /// <returns></returns>
+        public object SendCommonTextAndTitle(string _title, string _content, string usesid)
+        {
+            return new
+            {
+                userid_list = usesid,  //鎺ュ彈鎺ㄩ�userid锛屼笉鍚岀敤鎴风敤|鍒嗗壊
+                dept_id_list = "",   //鎺ュ彈鎺ㄩ�閮ㄩ棬id
+                agent_id = agentid,//搴旂敤Id                
+                msg = new
+                {
+                    msgtype = "markdown",//鎺ㄩ�绫诲瀷
+                    markdown = new
+                    {
+                        title = _title,
+                        text = _content//鍐呭text
+                    }
+                }
+            };
+        }
+        /// <summary>
+        /// 鎺ㄩ�action_card鏍煎紡鍐呭
+        /// </summary>
+        /// <param name="_title">鏍囬</param>
+        /// <param name="_content">鍐呭</param>
+        /// <param name="_single_title">閾炬帴鏍囬</param>
+        /// <param name="_single_url">閾炬帴鍦板潃</param>
+        /// <param name="usesid"></param>
+        /// <returns></returns>
+        public object SendCardMsg(string _title, string _content, string _single_title, string _single_url, string usesid)
+        {
+            return new
+            {
+                userid_list = usesid,  //鎺ュ彈鎺ㄩ�userid锛屼笉鍚岀敤鎴风敤|鍒嗗壊
+                //dept_id_list = "",   //鎺ュ彈鎺ㄩ�閮ㄩ棬id
+                agent_id = agentid,//搴旂敤Id               
+                msg = new
+                {
+                    msgtype = "action_card",
+                    action_card = new
+                    {
+                        title = _title,//鎻愮ず淇℃伅
+                        markdown = _content,
+                        single_title = _single_title,
+                        single_url = _single_url
+                    }
+                }
+            };
+        }
+
+        #endregion
+        #region 缇ゆ満鍣ㄤ汉 鎺ㄩ�娑堟伅
+
+        static void SendMarkdownMessage(string webhookUrl, string accessToken, string secret, string title, string markdownContent, string phone)
+        {
+            long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+            string sign = ComputeSignature(secret, timestamp);
+            string url = $"{webhookUrl}?access_token={accessToken}&timestamp={timestamp}&sign={sign}";
+            using (HttpClient client = new HttpClient())
+            {
+                List<string> Mobiles = new List<string>() { phone };
+                var pay = new
+                {
+                    at = new
+                    {
+                        atMobiles = Mobiles,
+                        isAtAll = false
+                    },
+                    msgtype = "text",
+                    text = new
+                    {
+                        content = markdownContent
+                    }
+                };
+                var payload = new
+                {
+                    msgtype = "text",
+                    text = new
+                    {
+                        content = markdownContent
+                    }
+                };
+                //string jsonPayload = Newtonsoft.Json.JsonConvert.SerializeObject(payload);
+                string jsonPayload = Newtonsoft.Json.JsonConvert.SerializeObject(pay);
+                var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
+                var response = apiHelper.Post(url, jsonPayload);
+                LogHelper.Info("杩斿洖" + response, "閽夐拤閫氱煡");
+            }
+        }
+
+        static string ComputeSignature(string secret, long timestamp)
+        {
+            string stringToSign = $"{timestamp}\n{secret}";
+            byte[] secretBytes = Encoding.UTF8.GetBytes(secret);
+            byte[] stringToSignBytes = Encoding.UTF8.GetBytes(stringToSign);
+
+            using (var hmac = new HMACSHA256(secretBytes))
+            {
+                byte[] hashBytes = hmac.ComputeHash(stringToSignBytes);
+                return Convert.ToBase64String(hashBytes);
+            }
+        }
+
+        /// <summary>
+        /// 閽夐拤閫氱煡
+        /// </summary>
+        /// <param name="JqrValue">鍙戦�鐨勫唴瀹�/param>
+        /// <param name="phone">鎵嬫満璐﹀彿(闈炲繀濉�</param>
+        public void button1_Click(string JqrValue = "", string phone = "")
+        {
+            LogHelper.Info(JqrValue, "閽夐拤閫氱煡");
+            string webhookUrl = "https://oapi.dingtalk.com/robot/send";
+            string accessToken = "8fd9cdb520d37f706abe2db307909f0756b3be4a339db52acaeec197651694f2";
+            string secret = "SEC484c1305c61ed9c72a7c124cd338f46aa7b88f6b4c88c8b469c06ec9b6076962";
+            string markdownContent = JqrValue;
+            string title = "Markdown Message";
+            SendMarkdownMessage(webhookUrl, accessToken, secret, title, markdownContent, phone);
+        }
+        #endregion
+    }
+}
diff --git a/util/HttpHelper.cs b/util/HttpHelper.cs
new file mode 100644
index 0000000..545404f
--- /dev/null
+++ b/util/HttpHelper.cs
@@ -0,0 +1,216 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text;
+
+namespace HH.WCS.ZhongCeJinTan.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 = 6000;
+
+            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 Put(string url, string postData, string contentType = "application/json", string sessionId = "")
+        {
+            WebRequest request = WebRequest.Create(url);
+            request.Method = "Put";
+            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
+            request.ContentType = contentType;
+            request.ContentLength = byteArray.Length;
+            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
+            {
+                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 = "") {
+			WebRequest request = WebRequest.Create(url);
+			request.Method = "POST";
+			byte[] byteArray = Encoding.UTF8.GetBytes(postData);
+			request.ContentType = contentType;
+			request.ContentLength = byteArray.Length;
+			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 {
+				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/util/LogHelper.cs b/util/LogHelper.cs
new file mode 100644
index 0000000..6d08cd1
--- /dev/null
+++ b/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.ZhongCeJinTan
+{
+
+    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>() { "ModBus", "API", "HosttoagvTask", "浠诲姟","寮哄埗瀹屾垚","鐐瑰埌鐐�,"鍙栨秷", "NDC", "鐗╂枡缁戝畾瑙g粦", "淇敼鐗╂枡", "绔嬪簱", "鎶ヨ涓婃姤", "Mes浠诲姟涓嬪彂", "鎺ラ┏浣�, "Wcs浠诲姟鎵ц閫氱煡 ", "绔嬪簱涓嬪彂浠诲姟", "绔嬪簱鍙栨秷浠诲姟", "宸烽亾鍙敤涓婃姤", "閫氱煡纭", "agv鎵ц閫氱煡", "瀹夊叏浜や簰", "鏀捐揣鏈夎揣", "鑳庨潰浜や簰", "鏀归亾瀹夊叏浜や簰", "涓婁笅鏋惰褰�, "Wcs涓嬪彂浠诲姟", "闂ㄤ氦浜�, "HosttoagvCar", "閽夐拤閫氱煡" };
+            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.Warn, 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/util/STAttribute.cs b/util/STAttribute.cs
new file mode 100644
index 0000000..fc9d158
--- /dev/null
+++ b/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.ZhongCeJinTan.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/util/SYSHelper.cs b/util/SYSHelper.cs
new file mode 100644
index 0000000..0036402
--- /dev/null
+++ b/util/SYSHelper.cs
@@ -0,0 +1,43 @@
+锘縰sing HH.WCS.ZhongCeJinTan.util;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.ZhongCeJinTan.util
+{
+    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("dbo.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/util/Settings.cs b/util/Settings.cs
new file mode 100644
index 0000000..f405bf0
--- /dev/null
+++ b/util/Settings.cs
@@ -0,0 +1,212 @@
+锘縰sing Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using static HH.WCS.ZhongCeJinTan.util.Settings;
+
+namespace HH.WCS.ZhongCeJinTan.util
+{
+    public class Settings
+    {
+       
+      
+        public static string SqlServer { get; set; }
+
+        public static string TmDeviceIp { get; set; }
+
+        public static int TmDevicePort { get; set; }
+
+        public static List<safetyLocation> safetyLocations { get; set; }
+        public static string WcsApiAddres { get; set; }
+
+        /// <summary>
+        /// 绌烘墭缂撳瓨鍖�+        /// </summary>
+        public static string EmptyPalletBufferArea { get; set; }
+
+        /// <summary>
+        /// Mes鑾峰彇鐗╂枡淇℃伅鎺ュ彛鍦板潃
+        /// </summary>
+        public static string MesGetItemApi { get; set; }
+        
+        public static List<deviceInfo> deviceInfos { get; set; }
+
+
+        public static List<TmDeviceInfo> TmDeviceInfos { get; set; }
+
+        public static List<areaInfo> areaInfos { get; set; }
+
+
+        public static string NDCApiUrl { get; set; }
+        
+
+        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 == "TableName") {
+                                var list = JsonConvert.DeserializeObject<List<TableName>>(keyValue.Value.ToString());
+                                list.ForEach(a => STAttribute.attributes.Add(a.name, a.code));
+                            }
+                            if (keyValue.Name == "SqlServer") {
+                                SqlServer = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "WcsApiAddres")
+                            {
+                                WcsApiAddres = keyValue.Value.ToString();
+                            }
+
+                            if (keyValue.Name == "MesGetItemApi")
+                            {
+                                MesGetItemApi = keyValue.Value.ToString();
+                            }
+                            if (keyValue.Name == "NDCApiUrl")
+                            {
+                                NDCApiUrl = keyValue.Value.ToString();
+                            }
+
+                            if (keyValue.Name == "TmDeviceIp")
+                            {
+                                TmDeviceIp = keyValue.Value.ToString();
+                            }
+
+                            if (keyValue.Name == "TmDevicePort")
+                            {
+                                TmDevicePort = (int)keyValue.Value;
+                            }
+                            if (keyValue.Name == "EmptyPalletBufferArea")
+                            {
+                                EmptyPalletBufferArea = keyValue.Value.ToString();
+                            }
+                            
+
+                            if (keyValue.Name == "SafetyLocation")
+                            {
+                                safetyLocations = JsonConvert.DeserializeObject<List<safetyLocation>>(keyValue.Value.ToString());
+                            }
+
+                            if (keyValue.Name == "TmDevice")
+                            {
+                                TmDeviceInfos = JsonConvert.DeserializeObject<List<TmDeviceInfo>>(keyValue.Value.ToString());
+                            }
+                            //if (keyValue.Name == "DeviceInfo")
+                            //{
+                            //    deviceInfos = JsonConvert.DeserializeObject<List<deviceInfo>>(keyValue.Value.ToString());
+                            //}
+                            //if (keyValue.Name == "AreaInfo")
+                            //{
+                            //   areaInfos = JsonConvert.DeserializeObject<List<areaInfo>>(keyValue.Value.ToString());
+                            //}
+                        }
+                    }
+                }
+                LogHelper.Info("鍔犺浇閰嶇疆鏂囦欢淇℃伅 瀹屾垚");
+            }
+            catch (Exception ex) {
+                LogHelper.Error("鍔犺浇閰嶇疆鏂囦欢澶辫触锛� + ex.Message, ex);
+            }
+
+        }
+
+        public class TmDeviceInfo
+        {
+            public string deviceName { get; set; }
+            public string locCode { get; set; }
+            public int deviceType { get; set; }
+            public int enable { get; set; }
+            public int beginAddr { get; set; }
+            public int writeSafetyAddr { get; set; }
+            public int writeSafetyAddr1 { get; set; }
+            public int readSafetyAddr { get; set; }
+            public int readSafetyAddr1 { get; set; }
+            public int endAddr { get; set; }
+        }
+
+        public class deviceInfo
+        {
+            public string address { get; set; }
+            public string deviceName { get; set; }
+            public string[] deviceNo { get; set; }
+            public string[] location { get; set; }
+
+            public int deviceType { get; set; }
+            public int enable { get; set; }
+        }
+
+        public class areaInfo
+        {
+      
+            public string[] startArea { get; set; }
+            public string[] endArea { get; set; }
+
+            public string carType { get; set; }
+         
+        }
+
+   
+
+
+     public class safetyLocation
+        {
+        public string name { get; set; }
+        public List<string> Area { get; set; }
+
+        public int type{ get; set; }
+    }
+
+    public class TableName
+        {
+            public string name { get; set; }
+            public string code { get; set; }
+        }
+
+        public class EndLoc
+        {
+            public string[] location;
+        }
+
+        public class zoneInfo
+        {
+            public string zone { get; set; }
+            public string deviceName { get; set; }
+            /// <summary>
+            /// </summary>
+            public int zoneType { get; set; }
+            public int[] rows { get; set; }
+
+            public int bits { get; set; }
+        }
+        public class zoneInfo1
+        {
+            public string deviceName { get; set; }
+            /// <summary>
+            /// 搴撳尯鍒楄〃锛屾寜鏁扮粍涓嬫爣椤哄簭閫夋嫨
+            /// </summary>
+            public string[] zone { get; set; }
+
+            public int zoneType { get; set; }
+        }
+
+      
+        public class tpZone
+        {
+            public string zone { get; set; }
+            public string deviceName { get; set; }
+            /// <summary>
+            /// </summary>
+            public int zoneType { get; set; }
+            public int bits { get; set; }
+
+            public string address { get; set; }
+        }
+
+    }
+}
diff --git a/util/SqlHelper.cs b/util/SqlHelper.cs
new file mode 100644
index 0000000..a7ff8a3
--- /dev/null
+++ b/util/SqlHelper.cs
@@ -0,0 +1,158 @@
+锘縰sing Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace HH.WCS.ZhongCeJinTan.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;
+            }
+        }
+
+
+        //鍒涘缓SqlSugarClient 
+        public SqlSugarClient GetInstance() {
+            //鍒涘缓鏁版嵁搴撳璞�+            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() {
+                ConnectionString = Settings.SqlServer,
+                DbType = DbType.SqlServer,
+                IsAutoCloseConnection = true,
+                InitKeyType = InitKeyType.Attribute//浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�+            });
+            //
+            //db.MappingTables.Add("","");
+
+            //鐩戞帶鎵�湁瓒呰繃1绉掔殑Sql
+            db.Aop.OnLogExecuted = (sql, p) => {
+                //Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(p.ToDictionary(it => it.ParameterName, it => it.Value)));
+                //鎵ц鏃堕棿瓒呰繃1绉�+                if (db.Ado.SqlExecutionTime.TotalSeconds > 1) {
+                    //浠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
+            };
+            //鎹浆鎹�(ExecuteCommand鎵嶄細鎷︽埅锛屾煡璇笉琛�
+            //db.Aop.DataExecuting = (value, entity) => {
+            //    //var val=entity.EntityColumnInfo
+            //    Console.WriteLine(entity.EntityName);
+            //};
+            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());
+                    }
+                });
+            };
+            return db;
+        }
+        public bool CreateTable(List<Type> types) {
+            bool result = false;
+            var db = GetInstance();
+            try {
+                if (db != null) {
+                    // 鍒涘缓鏁版嵁搴�+                    // db.Context.DbMaintenance.CreateDatabase();
+                    // 鍒涘缓琛�+                    db.Context.CodeFirst.InitTables(
+                        types.ToArray()
+                    );
+                    //Console.WriteLine("鏁版嵁琛ㄥ垱寤烘垚鍔熴�");
+                }
+            }
+            catch (Exception ex) {
+                LogHelper.Error($"鏁版嵁琛ㄥ垱寤哄け璐�{ex.Message.ToString()}", ex);
+            }
+            //finally
+            //{
+            //    //db.Close();//瀵规暟鎹簱鎿嶄綔瀹屾垚鍚庯紝闇�鍏抽棴鏁版嵁搴擄紝閲婃斁鍐呭瓨
+            //}
+            return result;
+        }
+
+
+    }
+
+}
diff --git a/util/StrHelper.cs b/util/StrHelper.cs
new file mode 100644
index 0000000..fbdc8f0
--- /dev/null
+++ b/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.ZhongCeJinTan.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/util/TopSdk.dll b/util/TopSdk.dll
new file mode 100644
index 0000000..2a394ad
--- /dev/null
+++ b/util/TopSdk.dll
Binary files differ
diff --git a/util/XmlHelper.cs b/util/XmlHelper.cs
new file mode 100644
index 0000000..3dbee52
--- /dev/null
+++ b/util/XmlHelper.cs
@@ -0,0 +1,39 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace HH.WCS.ZhongCeJinTan.util
+{
+    public class XmlHelper
+    {
+        public static string xmlPath = "";
+        public static string xmlFileName = "settings.xml";
+        public static XmlDocument xmldoc = new XmlDocument();
+        static XmlHelper()
+        {
+            xmlPath = System.IO.Directory.GetCurrentDirectory();
+            xmlPath += "/" + xmlFileName;
+            xmldoc.Load(xmlPath);
+        }
+
+		public static string GetElementValue(string name) {
+			string result = string.Empty;
+			XmlNode xn = xmldoc.SelectSingleNode("Custom");
+			XmlNodeList xnl = xn.ChildNodes;
+			foreach (object node in xnl) {
+				XmlElement xe = node as XmlElement;
+				if (xe == null)
+					continue;
+
+				if (xe.Name == name) {
+					result = xe.InnerText;
+					break;
+				}
+			}
+			return result;
+		}
+    }
+}
diff --git a/wms/ContainerHelper.cs b/wms/ContainerHelper.cs
new file mode 100644
index 0000000..5590922
--- /dev/null
+++ b/wms/ContainerHelper.cs
@@ -0,0 +1,105 @@
+锘縰sing HH.WCS.ZhongCeJinTan.util;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Services.Configuration;
+
+namespace HH.WCS.ZhongCeJinTan.wms
+{
+    /// <summary>
+    /// 瀹瑰櫒甯姪绫�+    /// </summary>
+    internal class ContainerHelper
+    {
+        internal static string GenerateCntrNo()
+        {
+            var date = DateTime.Now.ToString("yyMMdd");
+            var id = SYSHelper.GetSerialNumber("鎵樼洏鍙�, "KJZ" + date);
+            return $"KJZ{date}{id.ToString().PadLeft(4, '0')}";
+        }
+
+        internal static bool CreateCntrItem(CntrItemRel work)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                return db.Insertable<CntrItemRel>(work).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                throw;
+            }
+        }
+
+        internal static bool CreateCntr(Container cntr)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+
+                return db.Insertable<Container>(cntr).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                LogHelper.Info($"娣诲姞瀹瑰櫒寮傚父"+ ex.Message, "Mes浠诲姟涓嬪彂");
+                throw;
+            }
+        }
+
+       
+
+        internal static bool delCntrItem(string cntrCode)
+        {
+            LogHelper.Info($"鍒犻櫎瀹瑰櫒{cntrCode}", "Mes浠诲姟涓嬪彂");
+            var db = new SqlHelper<object>().GetInstance();
+
+            var tp = db.Queryable<CntrItemRel>().Where(it => it.S_CNTR_CODE == cntrCode).First();
+            if (tp == null)
+            {
+                return true;
+            }
+            else
+            {
+                return db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == cntrCode).ExecuteCommand() > 0;
+            }
+        }
+        internal static bool delCntr(string cntrCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+
+            var tp = db.Queryable<Container>().Where(it => it.S_CODE == cntrCode).First();
+            if (tp == null)
+            {
+                return true;
+            }
+            else
+            {
+                return db.Deleteable<Container>().Where(it => it.S_CODE == cntrCode).ExecuteCommand() > 0;
+            }
+        }
+
+
+
+        internal static Container GetCntr(string cntr)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
+
+        }
+        internal static CntrItemRel GetCntrItem(string cntr)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<CntrItemRel>().Where(s => s.S_CNTR_CODE == cntr).First();
+
+        }
+       
+
+
+    }
+}
diff --git a/wms/LocationHelper.cs b/wms/LocationHelper.cs
new file mode 100644
index 0000000..f806d68
--- /dev/null
+++ b/wms/LocationHelper.cs
@@ -0,0 +1,1294 @@
+锘縰sing HH.WCS.ZhongCeJinTan;
+using HH.WCS.ZhongCeJinTan.util;
+using HH.WCS.ZhongCeJinTan.wms;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using static HH.WCS.ZhongCeJinTan.util.Settings;
+using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
+
+namespace HH.WCS.ZhongCeJinTan.wms
+{
+    internal class LocationHelper
+    {
+        private static Dictionary<string, Location> locations = null;
+        //private static Dictionary<string, LocationExt> locationExts = null;
+
+        static LocationHelper() {
+            //鍒濆鍖杔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 => {
+            //        var key = $"{a.S_LOC_CODE.Trim()}_{a.S_PICKUP_POINT.Trim()}";
+            //        if (!locationExts.ContainsKey(key)) {
+            //            locationExts.Add(key, a);
+            //        }
+            //    });
+            //}
+        }
+
+        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;
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鎵�湁璐т綅淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        internal static List<Location> GetAllLocList() {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().ToList();
+        }
+
+        /// <summary>
+        /// 鑾峰彇璐т綅淇℃伅,鍙傛暟搴撳尯缂栧彿,鎸夌収鎺掑垪浠庡皬鍒板ぇ鎺掑簭
+        /// </summary>
+        internal static List<Location> GetAllLocList1(string S_AREA_CODE)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE).OrderBy(a=> a.N_ROW).OrderBy(a => a.N_COL).ToList();
+        }
+
+        /// <summary>
+        /// 鑾峰彇璐т綅淇℃伅,鍙傛暟搴撳尯缂栧彿,鎸夌収鍒椾粠澶у埌灏忔帓搴�+        /// </summary>
+        internal static List<Location> GetAllLocList2(string S_AREA_CODE)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE).OrderBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).ToList();
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇璐т綅淇℃伅,鍙傛暟搴撳尯缂栧彿
+        /// </summary>
+        internal static List<string> GetConnectionList(string S_AREA_CODE)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var ConnectionList =  db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE).OrderBy(a => a.N_ROW).OrderBy(a => a.N_COL).ToList();
+            List<string> result = new List<string>();
+            foreach (var item in ConnectionList)
+            {
+                result.Add(item.S_CODE);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鎵剧粓鐐瑰贩閬撳彲鐢ㄧ┖璐т綅
+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindEndcolByLocList(List<Location> locations,string endArea,string rodway="")
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                Location end = null;
+                //鏍规嵁缁堢偣璐т綅鎵剧┖闂茶揣浣�+                var rows = locations.Select(a => a.N_ROW).Distinct().ToList();
+
+                //浣滀笟娴佺▼鐨勫贩閬�+                var xd = new List<string>();
+
+                List<RoadWayEnable> rowdwa = null;
+
+                if (!string.IsNullOrEmpty(rodway))
+                {
+                    xd = rodway.Split('-').ToList();
+                    rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == endArea && x.status == "0"  && xd.Contains(x.roadWay)).ToList();
+                }
+                else {
+                    //鏌ユ壘鍙敤宸烽亾
+                    rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == endArea && x.status == "0").ToList();
+                }
+
+                
+
+
+                for (int i = 0; i < rows.Count; i++)
+                {
+                    var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList();
+                    
+                    var flag = false;
+                    var flag1 = false;
+
+                    foreach (var item in rowdwa)
+                    {
+                        if (rowList.Count(a => a.N_ROADWAY.ToString()== item.roadWay) > 0)
+                        {
+                            flag = true;
+                            break;
+                        }
+
+                       
+                    }
+
+                    foreach (var item1 in xd)
+                    {
+                        if (rowList.Count(a => a.N_ROADWAY.ToString() != item1) > 0)
+                        {
+                            flag1 = true;
+                            break;
+                        }
+                    }
+
+                    if (flag1 || flag)
+                    {
+                        continue;
+                    }
+
+
+                    if (rowList.Count(a => a.N_CURRENT_NUM == 0) > 0)
+                    {
+                        Location other = null;
+                        //褰撳墠鎺掓病鏈夐攣骞朵笖鏈夌┖浣嶇疆
+                        //鍏堟壘婊′綅锛岀劧鍚庡悗闈竴浣嶈涔堟槸绌猴紝瑕佷箞涓嶅瓨鍦�+                        var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault();
+                        if (full == null)
+                        {
+                            //娌℃湁婊′綅锛岄偅灏辨壘鏈�皬鐨勭┖浣�+                            other = rowList.Where(b=>b.S_LOCK_STATE=="鏃�).OrderBy(a => a.N_COL).FirstOrDefault();
+                        }
+                        else
+                        {
+                            other = rowList.Where(b => b.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault();
+                        }
+                        if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "绂佺敤"))
+                        {
+                            //绂佺敤浜嗛�鎷╁悗闈竴涓揣浣�+                            other = db.Queryable<Location>().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "绂佺敤") && a.S_AREA_CODE == other.S_AREA_CODE && a.S_LOCK_STATE=="鏃�&& a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First();
+                        }
+                        if (other != null)
+                        {
+                            end = other;
+                            break;
+
+                        }
+
+                    }
+                }
+                return end;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+
+        /// <summary>
+        /// 鎵剧粓鐐瑰彲鐢ㄧ┖璐т綅鎺掗櫎涓嶅彲鐢ㄥ贩閬�+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindEndcolByLoc(List<Location> locations, string endArea)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                Location end = null;
+                //鏍规嵁缁堢偣璐т綅鎵剧┖闂茶揣浣�+                var rows = locations.Select(a => a.N_ROW).Distinct().ToList();
+
+                var rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == endArea && x.status == "0").ToList();
+
+                for (int i = 0; i < rows.Count; i++)
+                {
+                    var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList();
+
+                    var flag = false;
+
+                    foreach (var item in rowdwa)
+                    {
+                        if (rowList.Count(a => a.N_ROADWAY.ToString() == item.roadWay) > 0)
+                        {
+                            flag = true;
+                            break;
+                        }
+                    }
+
+                    if (flag)
+                    {
+                        continue;
+                    }
+
+
+                    if (rowList.Count(a => a.N_CURRENT_NUM == 0) > 0)
+                    {
+                        Location other = null;
+                        //褰撳墠鎺掓病鏈夐攣骞朵笖鏈夌┖浣嶇疆
+                        //鍏堟壘婊′綅锛岀劧鍚庡悗闈竴浣嶈涔堟槸绌猴紝瑕佷箞涓嶅瓨鍦�+                        var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault();
+                        if (full == null)
+                        {
+                            //娌℃湁婊′綅锛岄偅灏辨壘鏈�皬鐨勭┖浣�+                            other = rowList.Where(b => b.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).FirstOrDefault();
+                        }
+                        else
+                        {
+                            other = rowList.Where(b => b.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault();
+                        }
+                        if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "绂佺敤"))
+                        {
+                            //绂佺敤浜嗛�鎷╁悗闈竴涓揣浣�+                            other = db.Queryable<Location>().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "绂佺敤") && a.S_AREA_CODE == other.S_AREA_CODE && a.S_LOCK_STATE == "鏃� && a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First();
+                        }
+                        if (other != null)
+                        {
+                            end = other;
+                            break;
+
+                        }
+
+                    }
+                }
+                return end;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+        /// <summary>
+        /// 鎵剧粓鐐瑰彲鐢ㄧ┖璐т綅鎺掗櫎涓嶅彲鐢ㄥ贩閬�+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindEndcolByLoc1(List<Location> locations, string endArea)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                Location end = null;
+                //鏍规嵁缁堢偣璐т綅鎵剧┖闂茶揣浣�+                var rows = locations.Select(a => a.N_ROW).Distinct().ToList();
+
+              
+
+                for (int i = 0; i < rows.Count; i++)
+                {
+                    var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList();
+
+
+                    if (rowList.Count(a => a.N_CURRENT_NUM == 0) > 0)
+                    {
+                        Location other = null;
+                        //褰撳墠鎺掓病鏈夐攣骞朵笖鏈夌┖浣嶇疆
+                        //鍏堟壘婊′綅锛岀劧鍚庡悗闈竴浣嶈涔堟槸绌猴紝瑕佷箞涓嶅瓨鍦�+                        var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault();
+                        if (full == null)
+                        {
+                            //娌℃湁婊′綅锛岄偅灏辨壘鏈�皬鐨勭┖浣�+                            other = rowList.Where(b => b.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).FirstOrDefault();
+                        }
+                        else
+                        {
+                            other = rowList.Where(b => b.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault();
+                        }
+                        if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "绂佺敤"))
+                        {
+                            //绂佺敤浜嗛�鎷╁悗闈竴涓揣浣�+                            other = db.Queryable<Location>().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "绂佺敤") && a.S_AREA_CODE == other.S_AREA_CODE && a.S_LOCK_STATE == "鏃� && a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First();
+                        }
+                        if (other != null)
+                        {
+                            end = other;
+                            break;
+
+                        }
+
+                    }
+                }
+                return end;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+        /// <summary>
+        /// 鎵捐捣鐐规弧璐т綅
+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindStartcolByLoclistAndCol(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)
+                    {
+                        locations.RemoveAll(a => a.N_ROW == rowsStart[i]);
+                    }
+                }
+                start = locations.FindAll(a => a.N_CURRENT_NUM == 1 && a.S_LOCK_STATE == "鏃�).OrderByDescending(a => a.N_COL).FirstOrDefault();
+                return start;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+        
+        /// <summary>
+        /// 鏍规嵁璧风偣绔嬪簱鍖烘壘绌烘墭
+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindStartcolByLoclistAndcntr(List<Location> locations,string startArea) {
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                Location start = null;
+                var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList();
+
+                //鏌ユ壘鍙敤宸烽亾
+                var rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == startArea && x.status == "0").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);
+
+
+                    var flag = false;
+
+                    foreach (var item in rowdwa)
+                    {
+                        if (rowList.Count(a => a.N_ROADWAY.ToString() == item.roadWay) > 0)
+                        {
+                            flag = true;
+                            break;
+                        }
+                    }
+
+                    if (flag)
+                    {
+                        continue;
+                    }
+
+                    //褰撳墠鎺掓湁閿佸苟涓旀病鏈夋弧璐т綅锛屾帓闄�+                    if ( rowList.Count(a => a.N_CURRENT_NUM == 1) == 0)
+                    {
+                        locations.RemoveAll(a => a.N_ROW == rowsStart[i]);
+                    }
+                }
+                foreach (var item in locations)
+                {
+                    if (item.N_CURRENT_NUM == 0)
+                    {
+                        continue;
+                    }
+                    var tp = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == item.S_CODE).First();
+
+                    if (tp != null && item.S_LOCK_STATE == "鏃�)
+                    {
+                        var tp1 = db.Queryable<Container>().Where(s => s.S_CODE == tp.S_CNTR_CODE).First();
+
+                        if (tp1 != null && tp1.N_DETAIL_COUNT==0)
+                        {
+                            start = item;
+                            break;
+                        }
+                    }
+                }
+                return start;
+
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁璧风偣璐ф灦鍖烘壘绌烘墭
+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindStartcolByHjArea(List<Location> locations, string startArea)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            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.N_CURRENT_NUM == 1) == 0)
+                    {
+                        locations.RemoveAll(a => a.N_ROW == rowsStart[i]);
+                    }
+                }
+                foreach (var item in locations)
+                {
+                    if (item.N_CURRENT_NUM==0)
+                    {
+                        continue;
+                    }
+
+                    var tp = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == item.S_CODE).First();
+
+                    if (tp != null && item.S_LOCK_STATE == "鏃�)
+                    {
+                        if (tp.S_CNTR_CODE.Contains("KJZ"))
+                        {
+                            continue;
+                        }
+
+                        var tp1 = db.Queryable<Container>().Where(s => s.S_CODE == tp.S_CNTR_CODE).First();
+
+                        if (tp1 != null && tp1.N_DETAIL_COUNT == 0)
+                        {
+                            start = item;
+                            break;
+                        }
+                    }
+                }
+                return start;
+
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁璧风偣璐ф灦鍖烘壘绌烘墭
+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindStartcolByHjAreaKjz(List<Location> locations, string startArea)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            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.N_CURRENT_NUM == 1) == 0)
+                    {
+                        locations.RemoveAll(a => a.N_ROW == rowsStart[i]);
+                    }
+                }
+                foreach (var item in locations)
+                {
+                    if (item.N_CURRENT_NUM == 0)
+                    {
+                        continue;
+                    }
+
+                    var tp = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == item.S_CODE).First();
+
+                    if (tp != null && item.S_LOCK_STATE == "鏃�)
+                    {
+                        if (tp.S_CNTR_CODE.Contains("KJZ"))
+                        {
+                            var tp1 = db.Queryable<Container>().Where(s => s.S_CODE == tp.S_CNTR_CODE).First();
+
+                            if (tp1 != null && tp1.N_DETAIL_COUNT == 0)
+                            {
+                                start = item;
+                                break;
+                            }
+                        }
+                    }
+                }
+                return start;
+
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐗╂枡缂栫爜鎵剧珛搴撳尯璧风偣婊¤揣浣�+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindStartcolByLoclistAndItem(List<Location> locations,string itemCode,string endArea,string rodway="")
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                Location start = null;
+                var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList();
+
+                LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟鎺掗櫎涓嶅彲鐢ㄥ贩閬撳紑濮�, "Mes浠诲姟涓嬪彂");
+                //浣滀笟娴佺▼鐨勫贩閬�+                var xd = new List<string>();
+
+                List<RoadWayEnable> rowdwa = null;
+
+                if (!string.IsNullOrEmpty(rodway))
+                {
+                    xd = rodway.Split('-').ToList();
+                    rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == endArea && x.status == "0" && xd.Contains(x.roadWay)).ToList();
+                }
+                else
+                {
+                    //鏌ユ壘鍙敤宸烽亾
+                    rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == endArea && x.status == "0").ToList();
+                }
+
+                //if (rodway.Count()==0)
+                //{
+                //    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟璧风偣搴撳尯{endArea}鎵句笉鍒板彲鐢ㄥ贩閬�, "Mes浠诲姟涓嬪彂");
+                //    return null;
+                //}
+                
+
+                for (int i = 0; i < rowsStart.Count; i++)
+                {
+                    var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL);
+
+                    var flag = false;
+                    var flag1 = false;
+
+                    foreach (var item in rowdwa)
+                    {
+                        if (rowList.Count(a => a.N_ROADWAY.ToString() == item.roadWay) > 0)
+                        {
+                            flag = true;
+                            break;
+                        }
+                    }
+                    foreach (var item1 in xd)
+                    {
+                        if (rowList.Count(a => a.N_ROADWAY.ToString() != item1) > 0)
+                        {
+                            flag1 = true;
+                            break;
+                        }
+                    }
+
+                    if (flag1 || flag)
+                    {
+                        locations.RemoveAll(a => a.N_ROW == rowsStart[i]);
+                    }
+
+                    //rowList.Count(a => a.S_LOCK_STATE.Trim() != "鏃�) > 0 ||
+                    //褰撳墠鎺掓湁閿佸苟涓旀病鏈夋弧璐т綅锛屾帓闄�+                    if ( rowList.Count(a => a.N_CURRENT_NUM == 1) == 0)
+                    {
+                        locations.RemoveAll(a => a.N_ROW == rowsStart[i]);
+                    }
+                }
+
+                DateTime date = DateTime.Now;
+                List<CntrItemRel> startList = new List<CntrItemRel>(); ;
+
+                LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟鎺掗櫎涓嶅彲鐢ㄥ贩閬撳畬鎴�, "Mes浠诲姟涓嬪彂");
+
+                foreach (var item in locations) {
+                    if (item.N_CURRENT_NUM==0)
+                    {
+                        continue;
+                    }
+
+                    var tp = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == item.S_CODE).First();
+
+                    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣璐т綅瀹瑰櫒淇℃伅" + JsonConvert.SerializeObject(tp), "Mes浠诲姟涓嬪彂");
+                    if (tp != null && item.S_LOCK_STATE == "鏃�)
+                    {
+                        var tp1 = db.Queryable<CntrItemRel>().Where(s => s.S_CNTR_CODE == tp.S_CNTR_CODE).First();
+                        LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣瀹瑰櫒鐗╂枡淇℃伅" + JsonConvert.SerializeObject(tp1), "Mes浠诲姟涓嬪彂");
+                       
+                        if (tp1 != null && tp1.S_ITEM_CODE== itemCode&& tp1.S_ITEM_STATE == "鍚堟牸" && tp1.takeEffectTime < date && tp1.expireTime > date)
+                        {
+                            LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣鍚堟牸瀹瑰櫒鐗╂枡锛屽鍣ㄥ彿{tp1.S_CNTR_CODE}", "Mes浠诲姟涓嬪彂");
+                            startList.Add(tp1);
+                        }
+                    }
+                }
+
+                LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣鍚堟牸鐗╂枡鏁伴噺{startList.Count}", "Mes浠诲姟涓嬪彂");
+                var startItem = startList.OrderBy(a => a.PRODUCTIONDATE).FirstOrDefault();
+
+                LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣鎸夌敓浜ф椂闂存帓搴忕墿鏂欎俊鎭� + JsonConvert.SerializeObject(startItem), "Mes浠诲姟涓嬪彂");
+                if (startItem!=null)
+                {
+                    var tp = db.Queryable<LocCntrRel>().Where(s => s.S_CNTR_CODE == startItem.S_CNTR_CODE).First();
+                    start = LocationHelper.GetLocOne(tp.S_LOC_CODE);
+                    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣璐т綅淇℃伅" + JsonConvert.SerializeObject(start), "Mes浠诲姟涓嬪彂");
+                }
+                return start;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐗╂枡缂栫爜鎵捐揣鏋跺尯璧风偣婊¤揣浣�+        /// </summary>
+        /// <param name="locations"></param>
+        /// <returns></returns>
+        internal static Location FindStartcolByHjLoclistAndItem(List<Location> locations, string itemCode, string endArea)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            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);
+
+         
+                 
+
+                    //rowList.Count(a => a.S_LOCK_STATE.Trim() != "鏃�) > 0 ||
+                    //褰撳墠鎺掓湁閿佸苟涓旀病鏈夋弧璐т綅锛屾帓闄�+                    if (rowList.Count(a => a.N_CURRENT_NUM == 1) == 0)
+                    {
+                        locations.RemoveAll(a => a.N_ROW == rowsStart[i]);
+                    }
+                }
+
+                DateTime date = DateTime.Now;
+                List<CntrItemRel> startList = new List<CntrItemRel>(); ;
+
+                foreach (var item in locations)
+                {
+                    if (item.N_CURRENT_NUM == 0)
+                    {
+                        continue;
+                    }
+
+                    var tp = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == item.S_CODE).First();
+
+                    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣璐т綅瀹瑰櫒淇℃伅" + JsonConvert.SerializeObject(tp), "Mes浠诲姟涓嬪彂");
+                    if (tp != null && item.S_LOCK_STATE == "鏃�)
+                    {
+                        var tp1 = db.Queryable<CntrItemRel>().Where(s => s.S_CNTR_CODE == tp.S_CNTR_CODE).First();
+                        LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣瀹瑰櫒鐗╂枡淇℃伅" + JsonConvert.SerializeObject(tp1), "Mes浠诲姟涓嬪彂");
+
+                        if (tp1 != null && tp1.S_ITEM_CODE == itemCode )
+                        {
+                            LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣鍚堟牸瀹瑰櫒鐗╂枡锛屽鍣ㄥ彿{tp1.S_CNTR_CODE}", "Mes浠诲姟涓嬪彂");
+                            startList.Add(tp1);
+                        }
+                    }
+                }
+
+                LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣鍚堟牸鐗╂枡鏁伴噺{startList.Count}", "Mes浠诲姟涓嬪彂");
+                var startItem = startList.OrderBy(a => a.PRODUCTIONDATE).FirstOrDefault();
+
+                LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣鎸夌敓浜ф椂闂存帓搴忕墿鏂欎俊鎭� + JsonConvert.SerializeObject(startItem), "Mes浠诲姟涓嬪彂");
+                if (startItem != null)
+                {
+                    var tp = db.Queryable<LocCntrRel>().Where(s => s.S_CNTR_CODE == startItem.S_CNTR_CODE).First();
+                    start = LocationHelper.GetLocOne(tp.S_LOC_CODE);
+                    LogHelper.Info($"ZCSendTask鍑哄簱浠诲姟涓嬪彂璧风偣璐т綅淇℃伅" + JsonConvert.SerializeObject(start), "Mes浠诲姟涓嬪彂");
+                }
+                return start;
+            }
+            catch (Exception)
+            {
+
+                throw;
+            }
+
+        }
+
+
+        internal static List<Location> GetAllLocList1(string S_AREA_CODE, string row)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.N_ROW.ToString() == row).OrderBy(a => a.N_COL).ToList();
+        }
+
+        /// <summary>
+        /// 鑾峰彇璐т綅淇℃伅,鍙傛暟璐т綅缂栧彿
+        /// </summary>
+        internal static List<Location> GetAllLocList(string S_AREA_CODE)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE).ToList();
+        }
+
+        internal static List<Location> GetAllLocList6(string S_AREA_CODE)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE).OrderBy(b=> b.N_COL).ToList();
+        }
+
+        /// <summary>
+        /// 鑾峰彇璐т綅淇℃伅,鍙傛暟璐т綅缂栧彿
+        /// </summary>
+        internal static Location GetLocOne(string S_LOC_CODE)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_CODE == S_LOC_CODE).First();
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鏈夐攣璐т綅淇℃伅,鍙傛暟搴撳尯缂栧彿
+        /// </summary>
+        internal static List<Location> GetAllLockLocList1(string S_AREA_CODE,int row)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.N_ROW ==row && s.S_LOCK_STATE != "鏃�).ToList();
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鏈夐攣璐т綅淇℃伅,鍙傛暟搴撳尯缂栧彿,宸烽亾鍙�+        /// </summary>
+        internal static List<Location> GetAllLockLocList1(string S_AREA_CODE, int row,int xd)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.S_LOCK_STATE != "鏃� && s.N_ROADWAY==xd).ToList();
+        }
+
+        internal static List<Location> GetAllLockLocList(string S_LOC_CODE)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(s => s.S_CODE == S_LOC_CODE && s.S_LOCK_STATE != "鏃�).ToList();
+        }
+
+
+        internal static int GetArea(string area)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.S_START_AREA==area  && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鏈墽琛� && a.S_B_STATE != "澶辫触" && a.S_B_STATE != "鍙栨秷").ToList().Count();
+        }
+
+
+        internal static Location GetLoc(string code) {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(a => a.S_CODE.Trim() == code).First();
+        }
+
+        internal static Location GetLocByWorkName(string workName)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(a => a.S_AGV_SITE.Trim() == workName).First();
+        }
+
+
+
+
+
+
+
+
+        internal static string GetLocCntrCode(string locCode)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var tp = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == locCode).First();
+            return tp.S_CNTR_CODE;
+        }
+                
+
+
+
+
+
+
+        /// <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;
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒缂栧彿鑾峰彇璐т綅瀹瑰櫒淇℃伅
+        /// </summary>
+        /// <param name="cntrNo"></param>
+        /// <returns></returns>
+        internal static LocCntrRel GetLocCntr(string cntrNo)
+        {
+           
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<LocCntrRel>().Where(a =>a.S_CNTR_CODE.Contains(cntrNo)).First();
+            return list;
+
+        }
+
+
+
+
+        /// <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;
+
+        }
+        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).OrderBy(b=>b.N_ROW).ToList();
+                return list;
+            }
+            catch (Exception ex) {
+                //Console.WriteLine(ex.Message);
+                throw ex;
+            }
+
+        }
+
+        internal static List<Location> GetLocListAny1(string area)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == area).OrderBy(b => b.N_ROW).ToList();
+                return list;
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine(ex.Message);
+                throw ex;
+            }
+
+        }
+        internal static List<Location> GetLocListAny(string area, int row) {
+            try {
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == area && a.N_ROW == row).ToList();
+                return list;
+            }
+            catch (Exception ex) {
+                //Console.WriteLine(ex.Message);
+                throw ex;
+            }
+
+        }
+        //internal static List<FreeLineInfo> GetAllFreeLineInfo() {
+        //    var db = new SqlHelper<object>().GetInstance();
+        //    return db.Queryable<FreeLineInfo>().ToList();
+        //}
+        /// <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="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, string lockState,int lockNo) {
+            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.S_LOCK_STATE = lockState;
+                model.N_LOCK_STATE = lockNo;
+                res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE,it.N_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.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0;
+                LogHelper.Info("UnLockLoc:瑙i攣缁撴灉" + res);
+            }
+            else {
+                LogHelper.Info("UnLockLoc 澶辫触");
+            }
+            return res;
+        }
+
+
+        internal static string GetAgvSiteZc(string loc)
+        {
+            var location = GetLocOne(loc.Trim());
+            return location.S_AGV_SITE;
+        }
+
+
+        public static bool LockLoc(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 = "鍏ュ簱閿�;
+                res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
+            }
+
+            return res;
+        }
+        public static bool updateLocLock(string loc,int state,string states)
+        {
+            LogHelper.Info($"updateLocLock:loc:{loc},state:{state},states:{states}" );
+            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 = states;
+                model.N_LOCK_STATE = state;
+                res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand() > 0;
+            }
+            LogHelper.Info($"updateLocLock:loc:{loc},state:{state},states:{states},res:{res}");
+            return res;
+        }
+
+
+        /// <summary>
+        /// 娣诲姞涓婁笅鏋惰〃
+        /// </summary>
+        /// <param name="task"></param>
+        /// <returns></returns>
+        internal static bool CreateUpAndDown(WMSTask task)
+        {
+            LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃", "涓婁笅鏋惰褰�);
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                var cntr = ContainerHelper.GetCntr(task.S_CNTR_CODE);
+                if (cntr == null) {
+                    LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃娌℃煡鍒板鍣▄task.S_CNTR_CODE}", "涓婁笅鏋惰褰�);
+                    return false;
+                }
+                var cntr1 = new RecordUpAndDown();
+
+               
+                var work = db.Queryable<WmsWork>().Where(it => it.S_CODE==task.S_OP_CODE ).First();
+                if (work == null) {
+                    LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃娌℃煡鍒颁綔涓歿task.S_OP_CODE}", "涓婁笅鏋惰褰�);
+                }
+
+                var type = "涓婃灦";
+
+                if (task.S_TYPE.Contains("鍑哄簱"))
+                {
+                    type = "涓嬫灦";
+                }
+
+                var c = 0;
+                cntr1.S_ACTION = type;
+                cntr1.S_END_LOC = work.S_END_LOC;
+                cntr1.S_CNTR_CODE = task.S_CNTR_CODE;
+                cntr1.S_LOC_CODE = work.S_START_LOC;
+                cntr1.S_TRAY_TYPE = cntr.S_TYPE;
+                cntr1.S_OPTASK = task.S_CODE;
+                cntr1.T_INBOUND_TIME = DateTime.Now;
+               
+
+                if (cntr.N_DETAIL_COUNT > 0)
+                {
+                    var cntrItem = ContainerHelper.GetCntrItem(task.S_CNTR_CODE);
+                    if (cntrItem == null)
+                    {
+                        LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃娌℃煡鍒板鍣ㄧ墿鏂檣task.S_CNTR_CODE}", "涓婁笅鏋惰褰�);
+                        return false;
+                    }
+
+                    cntr1.expireTime=cntrItem.expireTime;
+                    cntr1.itemFeature=cntrItem.itemFeature;
+                    cntr1.F_QTY = cntrItem.F_QTY;
+                    cntr1.F_SUM_QTY = cntrItem.F_SUM_QTY;
+                    cntr1.TurnCardNum = cntrItem.TurnCardNum;
+                    cntr1.S_ITEM_CODE = cntrItem.S_ITEM_CODE;
+                    cntr1.S_ITEM_SPEC = cntrItem.S_ITEM_SPEC;
+                    cntr1.itemModel = cntrItem.itemModel;
+                    cntr1.Level = cntrItem.Level;
+                    cntr1.D_PRD_DATE = cntrItem.PRODUCTIONDATE;
+                    cntr1.S_ITEM_NAME = cntrItem.S_ITEM_NAME;
+                    cntr1.S_BATCH_NO = cntrItem.S_BATCH_NO;
+                    cntr1.S_ITEM_STATE = cntrItem.S_ITEM_STATE;
+                    cntr1.takeEffectTime = cntrItem.takeEffectTime;
+
+
+
+                    //if (task.S_TYPE.Contains("鍏ュ簱")&&task.S_SCHEDULE_TYPE.Contains("wcs"))
+                    //{
+                    //    var endLoc = LocationHelper.GetLocOne(task.S_END_LOC);
+                    //    endLoc.PRODUCTIONDATE = cntrItem.PRODUCTIONDATE;
+                    //    c = db.Updateable(endLoc).UpdateColumns(it => new { it.PRODUCTIONDATE }).ExecuteCommand();
+
+                    //}
+                }
+                db.BeginTran();
+                var b = db.Insertable<RecordUpAndDown>(cntr1).ExecuteCommand();
+                LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃褰卞搷琛屾暟:b:{b},c:{c}", "涓婁笅鏋惰褰�);
+
+                if ( b > 0)
+                {
+                    db.CommitTran();
+                    LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃鎴愬姛", "涓婁笅鏋惰褰�);
+                    return true;
+                }
+                else {
+                    db.RollbackTran();
+                    LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃澶辫触" , "涓婁笅鏋惰褰�);
+                    return false;
+                }
+
+            }
+            catch (Exception ex)
+            {
+                db.RollbackTran();
+                LogHelper.Info($"浠诲姟{task.S_CODE}娣诲姞涓婁笅鏋惰〃寮傚父" + ex.Message,"涓婁笅鏋惰褰�);
+                return false;
+                throw;
+            }
+        }
+
+        
+
+
+
+        /// <summary>
+        /// 鍒犻櫎璐т綅瀹瑰櫒琛ㄨ褰�淇敼璐т綅瀹瑰櫒鏁伴噺
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static bool UnBindingLoc(string loc, List<string> cntrs)
+        {
+            LogHelper.Info($"UnBindingLoc淇℃伅:loc锛歿loc},cntrs:{cntrs}");
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var location = db.Queryable<Location>().Where(a => a.S_CODE == loc).First();
+            try
+            {
+                db.BeginTran();
+                var lcrList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == loc).ToList();
+                var count = db.Deleteable<LocCntrRel>().Where(it => cntrs.Contains(it.S_CNTR_CODE) && it.S_LOC_CODE == loc).ExecuteCommand();
+
+                LogHelper.Info($"lcrList淇℃伅" + JsonConvert.SerializeObject(lcrList));
+                LogHelper.Info($"count淇℃伅" + JsonConvert.SerializeObject(count));
+
+                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();
+                LogHelper.Info($"瑙g粦寮傚父{ex.Message}");
+            }
+            return res;
+        }
+        /// <summary>
+        /// 璐т綅缁戝畾瀹瑰櫒
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static bool BindingLoc(string loc, List<string> cntrs)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var location = db.Queryable<Location>().Where(a => a.S_CODE == loc).First();
+            try
+            {
+                var lcrList = db.Queryable<LocCntrRel>().Includes(a => a.Container).Where(a => a.S_LOC_CODE == 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 }).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 }).ExecuteCommand();
+
+                db.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                db.RollbackTran();
+                LogHelper.Info($"缁戝畾寮傚父{ex.Message}");
+            }
+            return res;
+        }
+    }
+}
diff --git a/wms/NormalArea.cs b/wms/NormalArea.cs
new file mode 100644
index 0000000..b7896b1
--- /dev/null
+++ b/wms/NormalArea.cs
@@ -0,0 +1,15 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.ZhongCeJinTan.wms
+{
+    /// <summary>
+    /// 鏅�搴撳尯
+    /// </summary>
+    internal class NormalArea
+    {
+    }
+}
diff --git a/wms/TaskHelper.cs b/wms/TaskHelper.cs
new file mode 100644
index 0000000..7b16b6d
--- /dev/null
+++ b/wms/TaskHelper.cs
@@ -0,0 +1,800 @@
+锘縰sing HH.WCS.ZhongCeJinTan.device;
+using HH.WCS.ZhongCeJinTan.dispatch;
+using HH.WCS.ZhongCeJinTan.util;
+using Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Services.Description;
+using System.Xml.Linq;
+using static HH.WCS.ZhongCeJinTan.util.Settings;
+using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
+
+namespace HH.WCS.ZhongCeJinTan.wms
+{
+    internal class TaskHelper
+    {
+        internal static string GenerateTaskNo() {
+            var date = DateTime.Now.ToString("yyMMdd");
+            var id = SYSHelper.GetSerialNumber("浠诲姟鍙�, "TN" + date);
+            return $"TN{date}{id.ToString().PadLeft(4, '0')}";
+        }
+
+        internal static string GenerateTrayNo()
+        {
+            var id = SYSHelper.GetSerialNumber("鎵樼洏鍙�, "TP");
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"TP{date}{id.ToString().PadLeft(4, '0')}";
+        }
+
+        internal static bool UpdateStatus(WMSTask task, string status) {
+            var res = false;
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            task.S_B_STATE = status;
+            task.N_B_STATE = 1;
+            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE,it.N_B_STATE }).ExecuteCommand();
+            return res;
+        }
+
+      
+
+
+
+        internal static WMSTask GetTask(string no) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_CODE.Trim() == no).First();
+            return task;
+        }
+
+
+        internal static WMSTask GetTaskByCntrCode(string cntrCode)
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Trim() == cntrCode && a.S_B_STATE!= "鍙栨秷" && a.S_B_STATE != "澶辫触").First();
+            return task;
+        }
+
+
+
+        internal static List<WMSTask> GetTask()
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+
+            return db.Queryable<WMSTask>().Where(b => b.S_B_STATE == "宸叉帹閫� || b.S_B_STATE == "鎵ц涓� || b.S_B_STATE == "瀹屾垚" || b.S_B_STATE == "鍙栨秷").OrderByDescending(a => a.T_CREATE).ToList();
+        }
+
+        internal static WMSTask GetTaskByKwName(string kwName,bool flag,int gzId)
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = new WMSTask();
+            if (flag)
+            {
+                //璧风偣搴撲綅鍚嶇О
+                //task = db.Queryable<WMSTask>().Where(a => a.stratKwName==kwName && a.GZ_ID==gzId && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触" ).OrderByDescending(b=> b.T_CREATE).First();
+            }
+            else {
+                //缁堢偣搴撲綅鍚嶇О
+                //task = db.Queryable<WMSTask>().Where(a => a.endKwName == kwName && a.GZ_ID == gzId  && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触" ).OrderByDescending(b => b.T_CREATE).First();
+            }
+
+          
+            return task;
+        }
+
+
+
+     
+      
+        /// <summary>
+        /// 鏌ユ壘璧风偣鏈夋墽琛岀殑浠诲姟
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static WMSTask GetTaskByStartLoc(string loc)
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_START_LOC == loc && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触" && a.S_B_STATE != "宸插畬鎴�).OrderByDescending(b => b.T_CREATE).First();
+            return task;
+        }
+        /// <summary>
+        /// 鏌ユ壘缁堢偣鏈夋墽琛岀殑浠诲姟
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static WMSTask GetTaskByEndLoc(string loc)
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_END_LOC == loc &&  a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触" && a.S_B_STATE != "宸插畬鎴�).OrderByDescending(b => b.T_CREATE).First();
+            return task;
+        }
+
+        internal static List<WMSTask> GetTask(long start, long end) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var tasks = db.Queryable<WMSTask>().Where(a => SqlFunc.Between(SqlFunc.ToInt64(SqlFunc.Substring(a.S_CODE, 2, a.S_CODE.Length)), start, end)).ToList();
+            return tasks;
+        }
+
+      
+        internal static List<WMSTask> GetTaskByStart(string bit) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_START_LOC.Trim() == bit.Trim()).ToList();
+            return task;
+        }
+        internal static List<WMSTask> GetTaskByEnd(string bit) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_END_LOC.Trim() == bit.Trim()).ToList();
+            return task;
+        }
+        internal static List<WMSTask> GetTaskByType(string taskType) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.S_TYPE.Trim() == 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.GetLocOne(from);
+            var endLoc = LocationHelper.GetLocOne(to);
+
+            WMSTask wmsTask = new WMSTask() {
+                S_CODE = GenerateTaskNo(),
+                S_START_AREA = fromLoc.S_AREA_CODE,
+                S_END_AREA = endLoc.S_AREA_CODE,
+                S_START_LOC = from,
+                S_END_LOC = to,
+                S_TYPE = taskType,
+                N_PRIORITY = pri,
+                S_B_STATE = "鏈墽琛�,
+                S_CNTR_CODE = cntrInfo,
+                S_START_SITE_LAYER = startLayer,
+                S_END_SITE_LAYER = endLayer,
+                N_CNTR_COUNT = cntrCount,
+            };
+            LogHelper.Info("浠诲姟鍒涘缓:" + JsonConvert.SerializeObject(wmsTask),"浠诲姟");
+            return CreateTask(wmsTask);
+        }
+
+
+        /// <summary>
+        /// 鏍规嵁浣滀笟鍒涘缓瀵瑰簲浠诲姟
+        /// </summary>
+        /// <param name="operation">浣滀笟妯″瀷</param>
+        public static void CreateTask(WmsWork operation)
+        {
+            // 鏍规嵁浠诲姟绫诲瀷鍒涘缓涓嶅悓鐨勪换鍔�+            switch (operation.N_TYPE)
+            {
+                case 0:
+                    //閽笣 绾ょ淮婊℃墭鍑轰竴娈典换鍔�+                    CreateOneTask(operation);
+                    break;
+                case 1:
+                    //鍏ュ簱涓ゆ浠诲姟
+                    CreateInTowTask(operation);
+                    break;
+                case 2:
+                    //85绾ょ淮 95閽笣涓�浠诲姟鍏ヤ笁灞傝揣鏋�+                    if (operation.TOOLSTYPE == "85" || operation.TOOLSTYPE == "95")
+                    {
+                        CreateOneTask(operation);
+                    }
+                    else
+                    {
+                        //鍗婃《鍥炲簱浜屾浠诲姟鍏ョ珛搴撳尯
+                        CreateInTowTask(operation);
+                    }
+                    break;
+                case 3:
+                    //绌烘墭鍏ュ簱浣滀笟锛屾病鎺ラ┏浣嶅氨涓�浠诲姟
+                    if (string.IsNullOrEmpty(operation.CONNECTION))
+                    {
+                        CreateOneTask(operation);
+                    }
+                    else {
+                        CreateInTowTask(operation);
+                    }
+
+                    break;
+                case 4:
+                    //鑳庨潰鍛煎彨绌烘墭鍑哄簱涓ゆ浠诲姟
+                    CreateOutTowTask(operation);
+                    break;
+                case 5:
+                    //閽笣 绾ょ淮绌烘墭鍑轰竴娈典换鍔�+                    CreateOneTask(operation);
+                    break;
+                case 7:
+                    CreateOutTowTask(operation);
+                    break;
+                case 9:
+                    //85绾ょ淮 95閽笣涓�浠诲姟浠庝笁灞傝揣鏋跺彇
+                    if (operation.TOOLSTYPE == "85" || operation.TOOLSTYPE == "95")
+                    {
+                        CreateOneTask(operation);
+                    }
+                    else {
+                        //鍛煎彨鑳舵枡鍑哄簱涓ゆ浠诲姟
+                        CreateOutTowTask(operation);
+                    }
+                    break;
+                case 12:
+                    CreateOneTask(operation);
+                    break;
+                case 20:
+                    CreateOneTask(operation);
+                    break;
+            }
+        }
+
+
+        /// <summary>
+        /// 鍒涘缓涓�潯浠诲姟
+        /// </summary>
+        /// <param name="operation"></param>
+        private static void CreateOneTask(WmsWork operation)
+        {
+            var tasks = new List<Task>();
+
+            // 浠诲姟1
+            var task1 = new WMSTask()
+            {
+                // 浣滀笟缂栫爜
+                S_OP_CODE = operation.S_CODE,
+                // 浠诲姟鍙�+                S_CODE = GenerateTaskNo(),
+                // 浠诲姟绫诲瀷
+                N_TYPE = operation.N_TYPE,
+                // 浠诲姟绫诲瀷
+                S_TYPE = operation.S_TYPE,
+                // 璧风偣璐т綅
+                S_START_LOC = operation.S_START_LOC,
+                // 璧风偣搴撳尯
+                S_START_AREA = operation.S_START_AREA,
+                // 缁堢偣璐т綅
+                S_END_LOC = operation.S_END_LOC,
+                // 缁堢偣搴撳尯
+                S_END_AREA = operation.S_END_AREA,
+                // 璁惧绫诲瀷
+                N_SCHEDULE_TYPE = 1,
+                // 璁惧绫诲瀷
+                S_SCHEDULE_TYPE = "agv",
+                // 瀹瑰櫒缂栫爜
+                S_CNTR_CODE = operation.S_CNTR_CODE,
+                //浠诲姟鐘舵�
+                S_B_STATE = "鏈墽琛�,
+                // 浼樺厛绾�+                N_PRIORITY = operation.N_PRIORITY,
+                //宸ヨ绫诲瀷
+                TOOLSTYPE = operation.TOOLSTYPE,
+            };
+
+            try
+            {
+                // 淇敼浣滀笟鐘舵�涓烘墽琛屼腑
+                operation.N_B_STATE = 1;
+                operation.S_B_STATE = "鎵ц";
+
+                if (CreateTask(task1))
+                {
+                    LocationHelper.LockLoc(operation.S_START_LOC, "鍑哄簱閿�, 2);
+                    LocationHelper.LockLoc(operation.S_END_LOC, "鍏ュ簱閿�, 1);
+                    LogHelper.Info($"浠诲姟{task1.S_OP_CODE}鍒涘缓鎴愬姛", "浠诲姟");
+                    var db = new SqlHelper<object>().GetInstance();
+                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
+                }
+                else {
+                    LogHelper.Info($"浠诲姟{task1.S_OP_CODE}鍒涘缓澶辫触", "浠诲姟");
+                }
+
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info("CreateOneTask寮傚父淇℃伅" + e.Message, "浠诲姟");
+                throw;
+            }
+        }
+
+        /// <summary>
+        /// 鍒涘缓涓ゆ潯浠诲姟(涓ゆ浠诲姟)
+        /// </summary>
+        /// <param name="operation"></param>
+        private static void CreateInTowTask(WmsWork operation)
+        {
+
+            var ConnectionLoc = LocationHelper.GetLocOne(operation.CONNECTION);
+
+
+            // 浠诲姟1
+            var task1 = new WMSTask()
+            {
+                // 浣滀笟缂栫爜
+                S_OP_CODE = operation.S_CODE,
+                // 浠诲姟鍙�+                S_CODE = operation.S_CODE+"_1",
+                // 浠诲姟绫诲瀷
+                N_TYPE = operation.N_TYPE,
+                // 浠诲姟绫诲瀷
+                S_TYPE = operation.S_TYPE,
+                // 璧风偣璐т綅
+                S_START_LOC = operation.S_START_LOC,
+                // 璧风偣搴撳尯
+                S_START_AREA = operation.S_START_AREA,
+                // 缁堢偣璐т綅
+                S_END_LOC = operation.CONNECTION,
+                // 缁堢偣搴撳尯
+                S_END_AREA = ConnectionLoc.S_AREA_CODE,
+                // 璁惧绫诲瀷
+                N_SCHEDULE_TYPE = 2,
+                // 璁惧绫诲瀷
+                S_SCHEDULE_TYPE = "agv",
+                // 瀹瑰櫒缂栫爜
+                S_CNTR_CODE = operation.S_CNTR_CODE,
+                //浠诲姟鐘舵�
+                S_B_STATE = "鏈墽琛�,
+                // 浼樺厛绾�+                N_PRIORITY = operation.N_PRIORITY,
+                //宸ヨ绫诲瀷
+                TOOLSTYPE = operation.TOOLSTYPE,
+
+            };
+
+            // 浠诲姟2
+            var task2 = new WMSTask()
+            {
+                // 浣滀笟缂栫爜
+                S_OP_CODE = operation.S_CODE,
+                // 浠诲姟鍙�+                S_CODE = operation.S_CODE + "_2",
+                // 浠诲姟绫诲瀷
+                N_TYPE = operation.N_TYPE,
+                // 浠诲姟绫诲瀷
+                S_TYPE = operation.S_TYPE,
+                // 璧风偣璐т綅
+                S_START_LOC = operation.CONNECTION,
+                // 璧风偣搴撳尯
+                S_START_AREA = ConnectionLoc.S_AREA_CODE,
+                // 缁堢偣璐т綅
+                S_END_LOC = operation.S_END_LOC,
+                // 缁堢偣搴撳尯
+                S_END_AREA = operation.S_END_AREA,
+                // 璁惧绫诲瀷
+                N_SCHEDULE_TYPE = 3,
+                // 璁惧绫诲瀷
+                S_SCHEDULE_TYPE = "wcs",
+                // 瀹瑰櫒缂栫爜
+                S_CNTR_CODE = operation.S_CNTR_CODE,
+                //浠诲姟鐘舵�
+                S_B_STATE = "鏈墽琛�,
+                // 浼樺厛绾�+                N_PRIORITY = operation.N_PRIORITY,
+                //宸ヨ绫诲瀷
+                TOOLSTYPE = operation.TOOLSTYPE,
+            };
+
+            try
+            {
+                // 淇敼浣滀笟鐘舵�涓烘墽琛屼腑
+                operation.N_B_STATE = 1;
+                operation.S_B_STATE = "鎵ц";
+
+                if (CreateTask(task1) && CreateTask(task2))
+                {
+                    LocationHelper.LockLoc(operation.S_START_LOC, "鍑哄簱閿�, 2);
+                    LocationHelper.LockLoc(operation.S_END_LOC, "鍏ュ簱閿�, 1);
+                    LocationHelper.LockLoc(operation.CONNECTION, "鍏朵粬閿�, 3);
+                    LogHelper.Info($"浠诲姟{task1.S_CODE},{task2.S_CODE}鍒涘缓鎴愬姛", "浠诲姟");
+                    var db = new SqlHelper<object>().GetInstance();
+                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
+                }
+                else
+                {
+                    LogHelper.Info($"浠诲姟{task1.S_CODE},{task2.S_CODE}鍒涘缓澶辫触", "浠诲姟");
+                }
+
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info("CreateOneTask寮傚父淇℃伅" + e.Message, "浠诲姟");
+                throw;
+            }
+        }
+
+        private static void CreateOutTowTask(WmsWork operation)
+        {
+
+            var ConnectionLoc = LocationHelper.GetLocOne(operation.CONNECTION);
+
+
+            // 浠诲姟1
+            var task1 = new WMSTask()
+            {
+                // 浣滀笟缂栫爜
+                S_OP_CODE = operation.S_CODE,
+                // 浠诲姟鍙�+                S_CODE = operation.S_CODE + "_2",
+                // 浠诲姟绫诲瀷
+                N_TYPE = operation.N_TYPE,
+                // 浠诲姟绫诲瀷
+                S_TYPE = operation.S_TYPE,
+                // 璧风偣璐т綅
+                S_START_LOC = operation.S_START_LOC,
+                // 璧风偣搴撳尯
+                S_START_AREA = operation.S_START_AREA,
+                // 缁堢偣璐т綅
+                S_END_LOC = operation.CONNECTION,
+                // 缁堢偣搴撳尯
+                S_END_AREA = ConnectionLoc.S_AREA_CODE,
+                // 璁惧绫诲瀷
+                N_SCHEDULE_TYPE = 2,
+                // 璁惧绫诲瀷
+                S_SCHEDULE_TYPE = "wcs",
+                // 瀹瑰櫒缂栫爜
+                S_CNTR_CODE = operation.S_CNTR_CODE,
+                //浠诲姟鐘舵�
+                S_B_STATE = "鏈墽琛�,
+                // 浼樺厛绾�+                N_PRIORITY = operation.N_PRIORITY,
+                //宸ヨ绫诲瀷
+                TOOLSTYPE = operation.TOOLSTYPE,
+            };
+
+            // 浠诲姟2
+            var task2 = new WMSTask()
+            {
+                // 浣滀笟缂栫爜
+                S_OP_CODE = operation.S_CODE,
+                // 浠诲姟鍙�+                S_CODE = operation.S_CODE + "_1",
+                // 浠诲姟绫诲瀷
+                N_TYPE = operation.N_TYPE,
+                // 浠诲姟绫诲瀷
+                S_TYPE = operation.S_TYPE,
+                // 璧风偣璐т綅
+                S_START_LOC = operation.CONNECTION,
+                // 璧风偣搴撳尯
+                S_START_AREA = ConnectionLoc.S_AREA_CODE,
+                // 缁堢偣璐т綅
+                S_END_LOC = operation.S_END_LOC,
+                // 缁堢偣搴撳尯
+                S_END_AREA = operation.S_END_AREA,
+                // 璁惧绫诲瀷
+                N_SCHEDULE_TYPE = 3,
+                // 璁惧绫诲瀷
+                S_SCHEDULE_TYPE = "agv",
+                // 瀹瑰櫒缂栫爜
+                S_CNTR_CODE = operation.S_CNTR_CODE,
+                //浠诲姟鐘舵�
+                S_B_STATE = "鏈墽琛�,
+                // 浼樺厛绾�+                N_PRIORITY = operation.N_PRIORITY,
+                //宸ヨ绫诲瀷
+                TOOLSTYPE = operation.TOOLSTYPE,
+            };
+
+            try
+            {
+                // 淇敼浣滀笟鐘舵�涓烘墽琛屼腑
+                operation.N_B_STATE = 1;
+                operation.S_B_STATE = "鎵ц";
+
+                if (CreateTask(task1) && CreateTask(task2))
+                {
+                    LocationHelper.LockLoc(operation.S_START_LOC, "鍑哄簱閿�, 2);
+                    LocationHelper.LockLoc(operation.S_END_LOC, "鍏ュ簱閿�, 1);
+                    LocationHelper.LockLoc(operation.CONNECTION, "鍏ュ簱閿�, 1);
+                    LogHelper.Info($"浠诲姟{task1.S_CODE},{task2.S_CODE}鍒涘缓鎴愬姛", "浠诲姟");
+                    var db = new SqlHelper<object>().GetInstance();
+                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
+                }
+                else
+                {
+                    LogHelper.Info($"浠诲姟{task1.S_CODE},{task2.S_CODE}鍒涘缓澶辫触", "浠诲姟");
+                }
+
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info("CreateOneTask寮傚父淇℃伅" + e.Message, "浠诲姟");
+                throw;
+            }
+        }
+
+
+        internal static bool CheckExist(string no) {
+            return GetTask(no.Trim()) != null;
+        }
+        internal static bool UpdateStatus(string no, string status) {
+            var res = false;
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_CODE.Trim() == no).First();
+            //if (task != null) {
+                task.S_B_STATE = status;
+                //闇�鍒ゆ柇浠诲姟鏄惁澶辫触鎴栬�宸插畬鎴愶紝涓嶅厑璁稿啀淇敼
+                res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
+            //}
+            return res;
+        }
+        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData = "0") {
+            var db = new SqlHelper<WmsTaskAction>().GetInstance();
+            var action = new WmsTaskAction() {
+                S_ACTION = state.ToString(),
+                S_TASK_CODE = no,
+                S_EQ_CODE = forkliftNo,
+                S_EQ_TYPE = "agv",
+                S_DATA = extData
+            };
+            return db.Insertable(action).ExecuteCommand() > 0;
+        }
+        internal static WmsTaskAction GetActionRecord(string taskNo,string action)
+        {
+            var db = new SqlHelper<WmsTaskAction>().GetInstance();
+
+            var ac = db.Queryable<WmsTaskAction>().Where(a => a.S_TASK_CODE == taskNo && a.S_ACTION == action).First();
+            
+            return ac;
+        }
+
+      
+
+
+        internal static bool WcsAddActionRecord(string no, string state, string forkliftNo, string extData = "0")
+        {
+            var db = new SqlHelper<WmsTaskAction>().GetInstance();
+            var action = new WmsTaskAction()
+            {
+                S_ACTION = state.ToString(),
+                S_TASK_CODE = no,
+                S_EQ_CODE = forkliftNo,
+                S_EQ_TYPE = "wcs",
+                S_DATA = extData
+            };
+            return db.Insertable(action).ExecuteCommand() > 0;
+        }
+
+
+
+
+        internal static bool CheckActionRecordExist(string no, string code) {
+            var db = new SqlHelper<WmsTaskAction>().GetInstance();
+            return db.Queryable<WmsTaskAction>().Count(a => a.S_TASK_CODE.Trim() == no.Trim() && a.S_ACTION == code) > 0;
+        }
+        internal static void Begin(WMSTask task,string avgNo) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            if (task != null) {
+                if (task.S_B_STATE.Trim() == "宸叉帹閫�) {
+                    task.S_B_STATE = "鎵ц涓�;
+                    task.T_START_TIME = DateTime.Now;
+                    task.S_EQ_NO = avgNo;
+                    db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.T_START_TIME,it.S_EQ_NO }).ExecuteCommand();
+                }
+
+            }
+        }
+
+
+        internal static WcsRfidCheckoutEntitys GetRfid(string TaskCode) {
+            var db = new SqlHelper<WcsRfidCheckoutEntitys>().GetInstance();
+            return db.Queryable<WcsRfidCheckoutEntitys>().Where(a=> a.S_TASK_NO== TaskCode).First();
+        }
+        
+
+
+
+
+        internal static void Begin(WMSTask task)
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            if (task != null)
+            {
+                if (task.N_B_STATE == 1)
+                {
+                    task.N_B_STATE = 2;
+                    task.S_B_STATE = WMSTask.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 TmSafety(WMSTask wmsTask) {
+
+            safetyLocation safety1 = null;
+            if (wmsTask.S_TYPE.Contains("鍏ュ簱"))
+            {
+                safety1 = Settings.safetyLocations.Where(a => a.Area.Contains(wmsTask.S_START_AREA)).FirstOrDefault();
+                if (safety1 != null)
+                {
+                    if (safety1.type==2)
+                    {
+                        var safety = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(wmsTask.S_START_LOC)).FirstOrDefault();
+                        if (safety != null)
+                        {
+                            LogHelper.Info($"鑳庨潰鍏ュ簱浠诲姟寮�锛屼换鍔″彿={wmsTask.S_CODE}闇�鍜岃儙闈㈡満鍙颁氦浜掞紝鍦板潃{safety.beginAddr}鍐欏叆1", "鑳庨潰浜や簰");
+                            ModbusHelper.WriteSingleRegister(safety.beginAddr, 1);
+                        }
+                    }
+                }
+            }
+            else if (wmsTask.S_TYPE.Contains("鍑哄簱"))
+            {
+                safety1 = Settings.safetyLocations.Where(a => a.Area.Contains(wmsTask.S_END_AREA)).FirstOrDefault();
+                if (safety1 != null)
+                {
+                    if (safety1.type == 2)
+                    {
+                        var safety = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(wmsTask.S_END_LOC)).FirstOrDefault();
+                        if (safety != null)
+                        {
+                            LogHelper.Info($"鑳庨潰鍑哄簱浠诲姟寮�锛屼换鍔″彿={wmsTask.S_CODE}闇�鍜岃儙闈㈡満鍙颁氦浜掞紝鍦板潃{safety.beginAddr}鍐欏叆1", "鑳庨潰浜や簰");
+                            ModbusHelper.WriteSingleRegister(safety.beginAddr, 1);
+                        }
+                    }
+                }
+            }
+
+
+           
+
+
+            
+
+            
+        }
+
+       
+
+
+
+internal static void End(WMSTask task)
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            if (task != null)
+            {
+                task.N_B_STATE = 3;
+                task.S_B_STATE = WMSTask.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();
+            }
+
+            if (task.S_TYPE.Contains("鍑哄簱") && task.S_SCHEDULE_TYPE.Contains("wcs")) {
+                LocationHelper.LockLoc(task.S_END_LOC, "鍑哄簱閿�, 2);
+            }
+                
+            if (task.S_TYPE.Contains("鍑哄簱")&&task.S_SCHEDULE_TYPE.Contains("agv") )
+            {
+                var location = db.Queryable<Location>().Where(a => a.S_CODE == task.S_END_LOC).First();
+                location.N_CURRENT_NUM = 0;
+                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM}).ExecuteCommand();
+                db.Deleteable<Container>().Where(it => it.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
+                db.Deleteable<LocCntrRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
+                db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
+            }
+        }
+
+
+
+        internal static void Fail(WMSTask task)
+        {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            if (task != null)
+            {
+                task.N_B_STATE = 5;
+                task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
+                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
+            }
+        }
+
+
+        internal static bool CreateTask(WMSTask wmsTask) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            return db.Insertable(wmsTask).ExecuteCommand() > 0;
+
+        }
+
+        /// <summary>
+        /// 淇濆瓨鍒癿es浠诲姟璁板綍
+        /// </summary>
+        /// <param name="task"></param>
+        /// <returns></returns>
+        //public bool SaveTask(MesTask task)
+        //{
+        //    var db = new SqlHelper<MesTask>().GetInstance();
+        //    try
+        //    {
+        //        db.BeginTran();
+        //        if (db.Insertable(task).ExecuteCommand() > 0)
+        //        {
+        //            db.CommitTran();
+        //            LogHelper.Info($"淇濆瓨Mes浠诲姟{task.task_no}璁板綍鎴愬姛锛�,"Mes浠诲姟涓嬪彂");
+        //            return true;
+        //        }
+        //        else {
+        //            db.RollbackTran();
+        //            LogHelper.Info($"淇濆瓨Mes浠诲姟{task.task_no}璁板綍澶辫触锛�, "Mes浠诲姟涓嬪彂");
+        //            return false;
+        //        }
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        db.RollbackTran();
+        //        LogHelper.Info($"淇濆瓨Mes浠诲姟{task.task_no}璁板綍寮傚父锛� + ex.Message, "Mes浠诲姟涓嬪彂");
+        //        return false;
+        //    }
+
+        //}
+
+        //鏍规嵁娴佺▼缂栧彿鏌ユ壘浣滀笟娴佺▼
+        public static WorkFlow selectWorkFlow(string flowCode){
+            var db = new SqlHelper<WorkFlow>().GetInstance();
+            return db.Queryable<WorkFlow>().Where(a => a.FLOWCODE == flowCode).First();
+        }
+
+        //鏍规嵁娴佺▼缂栧彿鍜屽伐瑁呯被鍨嬫煡鎵句綔涓氭祦绋�+        public static WorkFlow selectWorkFlowByType(string flowCode,string type="")
+        {
+            var db = new SqlHelper<WorkFlow>().GetInstance();
+            return db.Queryable<WorkFlow>().Where(a => a.FLOWCODE == flowCode && a.TOOLSTYPE == type).First();
+        }
+
+        //鏍规嵁娴佺▼缂栧彿鍜岃捣鐐瑰簱鍖烘煡鎵句綔涓氭祦绋�+        public static WorkFlow selectWorkFlowByStratArea(string flowCode, string startArea)
+        {
+            var db = new SqlHelper<WorkFlow>().GetInstance();
+            return db.Queryable<WorkFlow>().Where(a => a.FLOWCODE == flowCode && a.STARTAREA==startArea).First();
+        }
+
+        /// <summary>
+        /// 鏍规嵁浠诲姟鐘舵�鑾峰彇agv浠诲姟
+        /// </summary>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<WMSTask> GetTaskListByState(string state,string eq) {
+            try {
+                var db = new SqlHelper<object>().GetInstance();
+                return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_SCHEDULE_TYPE.Contains(eq)).OrderByDescending(a=>a.N_PRIORITY).OrderBy(s=>s.T_CREATE).ToList();
+            }
+            catch (Exception ex) {
+                LogHelper.Error(ex.Message, ex);
+                return new List<WMSTask>();
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁浠诲姟鐘舵�鑾峰彇浠诲姟
+        /// </summary>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<WMSTask> GetWcsTaskListByState(string state, string eq, string type)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_SCHEDULE_TYPE.Contains(eq) && a.S_TYPE.Contains(type)).OrderByDescending(a => a.N_PRIORITY).OrderBy(s => s.T_CREATE).ToList();
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error(ex.Message, ex);
+                return new List<WMSTask>();
+            }
+        }
+        /// <summary>
+        /// 鏍规嵁浠诲姟鐘舵�鍜屼綔涓氱紪鐮佸拰璁惧绫诲瀷鑾峰彇鍗曚釜浠诲姟
+        /// </summary>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static WMSTask GetTaskByState(string state, string eq,string opCode,string type)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_SCHEDULE_TYPE.Contains(eq) && a.S_OP_CODE.Contains(opCode) && a.S_TYPE.Contains(type)).First();
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error(ex.Message, ex);
+                return new WMSTask();
+            }
+
+        }
+    }
+}
diff --git a/wms/WMSHelper.cs b/wms/WMSHelper.cs
new file mode 100644
index 0000000..b50157b
--- /dev/null
+++ b/wms/WMSHelper.cs
@@ -0,0 +1,57 @@
+锘縰sing HH.WCS.ZhongCeJinTan.util;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HH.WCS.ZhongCeJinTan.wms
+{
+    /// <summary>
+    /// 杩欓噷鍙槸鍋氬弬鑰冿紝鍑哄叆搴撶畻娉曞缓璁湪鐩稿叧鐨勬祦绋嬩腑瀹氬埗寮�彂锛岄櫎闈炴湁閫氱敤鐨勫彲浠ユ斁鍒拌繖閲岋紝涓嶅悓椤圭洰涔熷彲浠ョ敤
+    /// </summary>
+    internal class WMSHelper
+    {
+      
+
+        internal static WmsWork GetWmsWorkByCntr(string cntr, bool active = true)
+        {
+            WmsWork result = null;
+            var db = new SqlHelper<object>().GetInstance();
+            if (active)
+            {
+                result = db.Queryable<WmsWork>().Where(a => a.S_CNTR_CODE.Contains(cntr) && a.N_B_STATE < 2).First();
+            }
+            else
+            {
+                result = db.Queryable<WmsWork>().Where(a => a.S_CNTR_CODE.Contains(cntr)).First();
+            }
+            return result;
+        }
+
+
+
+
+
+        internal static bool CreateWmsWork(WmsWork work)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                return db.Insertable<WmsWork>(work).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                throw;
+            }
+        }
+
+        internal static string GenerateWorkNo()
+        {
+            var id = SYSHelper.GetSerialNumber("浣滀笟鍙�, "OP");
+            var date = DateTime.Now.ToString("yyMMdd");
+            return $"OP{date}{id.ToString().PadLeft(4, '0')}";
+        }
+
+    }
+}
diff --git a/wms/WMSModel.cs b/wms/WMSModel.cs
new file mode 100644
index 0000000..7dcbfd1
--- /dev/null
+++ b/wms/WMSModel.cs
@@ -0,0 +1,1353 @@
+锘縰sing HH.WCS.ZhongCeJinTan.util;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection.Emit;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.ZhongCeJinTan.wms
+{
+
+    //---------------------------------------浠撳簱淇℃伅---------------------------------------
+    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;
+
+    }
+
+
+    [ST("浣滀笟娴佺▼琛�)]
+    public class WorkFlow : BaseModel
+    {
+        /// <summary>
+        /// 娴佺▼缂栧彿
+        /// </summary>
+        public string FLOWCODE { get; set; }
+        /// <summary>
+        /// 娴佺▼鍚嶇О
+        /// </summary>
+        public string FLOWNAME { get; set; }
+        /// <summary>
+        /// 鍑哄叆搴�+        /// </summary>
+        public string INOROUT { get; set; }
+        /// <summary>
+        /// 鏄惁閫氱煡绔嬪簱
+        /// </summary>
+        /// </summary>
+        public string INFORMWCS { get; set; }
+        /// <summary>
+        /// 鏄惁涓嬭揪缁欑珛搴�+        /// </summary>
+        public string SENDWCS { get; set; }
+        /// <summary>
+        /// 鎺ラ┏浣嶅簱鍖�+        /// </summary>
+        public string CONNECTION { get; set; }
+        /// <summary>
+        /// 璧风偣搴撳尯
+        /// </summary>
+        public string STARTAREA { get; set; }
+        /// <summary>
+        /// 缁堢偣搴撳尯
+        /// </summary>
+        public string ENDAREA { get; set; }
+        /// <summary>
+        /// 寮傚父搴撳尯
+        /// </summary>
+        public string ERRORAREA { get; set; }
+        /// <summary>
+        /// 宸ヨ绫诲瀷
+        /// </summary>
+        public string TOOLSTYPE { get; set; }
+        /// <summary>
+        /// 宸烽亾
+        /// </summary>
+        public string ROADWAY { get; set; }
+
+    }
+
+    [ST("璐т綅琛�)]
+    public class Location : BaseModel
+    {
+        /// <summary>
+        /// 璐т綅缂栫爜
+        /// </summary>
+        public string S_CODE { get; set; }
+
+        /// <summary>
+        /// 璐т綅鍚嶇О
+        /// </summary>
+        public string S_NAME { get; set; }
+
+        /// <summary>
+        /// 浠撳簱缂栫爜
+        /// </summary>
+        public string S_WH_CODE { get; set; }
+
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+
+        /// <summary>
+        /// 宸烽亾
+        /// </summary>
+        public int N_ROADWAY { get; set; }
+
+        /// <summary>
+        /// 鎺掑彿
+        /// </summary>
+        public int N_ROW { get; set; }
+
+        /// <summary>
+        /// 鍒楀彿
+        /// </summary>
+        public int N_COL { get; set; }
+
+        /// <summary>
+        /// 灞�+        /// </summary>
+        public int N_LAYER { get; set; }
+
+        /// <summary>
+        /// 瀹归噺
+        /// </summary>
+        public string N_CAPACITY { get; set; }
+
+        /// <summary>
+        /// 褰撳墠鏁伴噺
+        /// </summary>
+        public int N_CURRENT_NUM { get; set; }
+
+        /// <summary>
+        /// AGV绔欑偣
+        /// </summary>
+        public string S_AGV_SITE { get; set; }
+
+        /// <summary>
+        /// AGV绔欑偣灞傛暟
+        /// </summary>
+        public int N_AGV_SITE_LAYER { get; set; }
+
+        /// <summary>
+        /// 閿佸畾鐘舵�
+        /// </summary>
+        public string S_LOCK_STATE { get; set; }
+
+        /// <summary>
+        /// 閿佸畾鐘舵�鍊�1鍏ュ簱閿�2鍑哄簱閿�0鏃犻攣
+        /// </summary>
+        public int N_LOCK_STATE { get; set; }
+
+
+        /// <summary>
+        /// 鍚敤
+        /// </summary>
+        public string C_ENABLE { get; set; }
+
+        /// <summary>
+        /// 鐢熶骇鏃堕棿
+        /// </summary>
+        public DateTime PRODUCTIONDATE { get; set; }
+        
+        /// <summary>
+        /// 娣卞害
+        /// </summary>
+        public string N_DEEP { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_CODE))]
+        public LocCntrRel LocCntrRel { get; set; }
+    }
+
+
+
+    [ST("璐т綅瀹瑰櫒琛�)]
+    public class LocCntrRel : BaseModel
+    {
+        /// <summary>
+        /// 璐т綅缂栫爜
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_LOC_CODE { get; set; }
+      
+        /// <summary>
+        /// 瀹瑰櫒缂栫爜
+        /// </summary>
+        public string S_CNTR_CODE { get; set; }
+
+        /// <summary>
+        /// 鍔ㄤ綔绫诲瀷
+        /// </summary>
+        //public string S_ACTION_TYPE { get; set; }
+
+        /// <summary>
+        /// 鍔ㄤ綔婧�+        /// </summary>
+        public string S_ACTION_SRC { get; set; }
+
+        /// <summary>
+        /// 鍔ㄤ綔绫诲瀷鍊�+        /// </summary>
+       // public int N_ACTION_TYPE { get; set; }
+
+        /// <summary>
+        /// 缁戝畾鏂瑰紡
+        /// </summary>
+        public string S_BINDING_METHOD { get; set; }
+
+        /// <summary>
+        /// 缁戝畾鏂瑰紡鍊�+        /// </summary>
+        public int N_BINDING_METHOD { get; set; }
+
+        /// <summary>
+        /// 娣变綅
+        /// </summary>
+        //public int N_DEEP { get; set; }
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_CNTR_CODE))]
+        public CntrItemRel CntrItemRel { get; set; }
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_CNTR_CODE))]
+        public Container Container { get; set; }
+    }
+
+    
+
+    [ST("瀹瑰櫒鐗╂枡琛�)]
+    public class CntrItemRel : BaseModel
+    {
+        /// <summary>
+        /// 瀹瑰櫒缂栫爜
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_CNTR_CODE { 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_BATCH_NO { get; set; }
+
+        /// <summary>
+        /// 鏁伴噺
+        /// </summary>
+        public decimal F_QTY { get; set; }
+
+        /// <summary>
+        /// 璐ㄦ鐘舵�
+        /// </summary>
+        public string S_ITEM_STATE { get; set; }
+
+        /// <summary>
+        /// 鍛ㄨ浆鍗″彿
+        /// </summary>
+        public string TurnCardNum { get; set; }
+        /// <summary>
+        /// 鐗╂枡鐗瑰緛  zc涓�鐢ㄦ潵瀛樺伐鑹虹紪鍙�+        /// </summary>
+        public string itemFeature { get; set; }
+        /// <summary>
+        /// 瑙勬牸鍨嬪彿
+        /// </summary>
+        public string itemModel { get; set; }
+
+        /// <summary>
+        /// 澶辨晥鏃堕棿
+        /// </summary>
+        public DateTime expireTime { get; set; }
+
+        /// <summary>
+        /// 鐢熸晥鏃堕棿
+        /// </summary>
+        public DateTime takeEffectTime { get; set; }
+
+        /// <summary>
+        /// 鐢熶骇鏃堕棿
+        /// </summary>
+        public DateTime PRODUCTIONDATE { get; set; }
+
+        /// <summary>
+        /// 鍒跺搧绫诲瀷
+        /// </summary>
+        public string Level { get; set; }
+
+        /// <summary>
+        /// 瑙勬牸
+        /// </summary>
+        public string S_ITEM_SPEC { get; set; }
+
+        /// <summary>
+        /// 鎬婚噸閲�+        /// </summary>
+        public decimal F_SUM_QTY { get; set; }
+
+        /// <summary>
+        /// 鍏ュ簱鏃堕棿
+        /// </summary>
+        public DateTime T_INSTOCK { get; set; }
+
+        /// <summary>
+        /// 宸ュ巶
+        /// </summary>
+        public string facnm { get; set; }
+
+        /// <summary>
+        /// 鑳跺彿
+        /// </summary>
+        public string cdrub { get; set; }
+        /// <summary>
+        /// 鏈哄彴
+        /// </summary>
+        public string mchid { get; set; }
+        /// <summary>
+        /// 浣滀笟鏃ユ湡
+        /// </summary>
+        public string wdate { get; set; }
+        /// <summary>
+        /// 鐝
+        /// </summary>
+        public string wsht { get; set; }
+        /// <summary>
+        /// 寮�杞︽
+        /// </summary>
+        public string strbat { get; set; }
+        /// <summary>
+        /// 缁撴潫杞︽
+        /// </summary>
+        public string endbat { get; set; }
+
+        /// <summary>
+        /// 鐢熶骇璁″垝缂栧彿
+        /// </summary>
+        public string planno { get; set; }
+
+        /// <summary>
+        /// 鑳舵枡娈�+        /// </summary>
+        public string stage { get; set; }
+        /// <summary>
+        /// 妫�獙缁撴灉
+        /// </summary>
+        public string grd { get; set; }
+        /// <summary>
+        /// 宸ヨ閲嶉噺
+        /// </summary>
+        //public decimal F_AVG_QTY { get; set; }
+
+        /// <summary>
+        /// 渚涘簲鍟嗙紪鐮�+        /// </summary>
+        //public string S_SUPPLIER_N0 { get; set; }
+        /// <summary>
+        /// 渚涘簲鍟嗗悕绉�+        /// </summary>
+        //public string S_SUPPLIER { get; set; }
+
+        /// <summary>
+        /// 璁㈠崟鍙�+        /// </summary>
+        //public string S_Order_Number { get; set; }
+
+        /// <summary>
+        /// 鐝
+        /// </summary>
+        // public string S_Classes { get; set; }
+
+        /// <summary>
+        /// 鏈哄彴鍙�+        /// </summary>
+        //public int S_Drilling_Crew { get; set; }
+
+        /// <summary>
+        /// 杞﹀彿
+        /// </summary>
+        //public int S_Car_Num { get; set; }
+
+        /// <summary>
+        /// 绗嚑涓枡
+        /// </summary>
+        //public string S_Srequency { get; set; }
+
+        /// <summary>
+        /// 鏃堕棿
+        /// </summary>
+        //public string S_TIME { get; set; }
+        //public string applyProdSpecList { get; set; }
+    }
+
+    //[ST("鐗╂枡琛�)]
+    //public class Item : BaseModel
+    //{
+    //    /// <summary>
+    //    /// 鐗╂枡绫诲瀷
+    //    /// </summary>
+    //    public string S_ITEM_TYPE { get; set; }
+
+    //    /// <summary>
+    //    /// 鐗╂枡缂栫爜
+    //    /// </summary>
+    //    public string S_ITEM_CODE { get; set; }
+
+    //    /// <summary>
+    //    /// 鐗╂枡鍚嶇О
+    //    /// </summary>
+    //    public string S_ITEM_NAME { get; set; }
+
+    //    /// <summary>
+    //    /// 閲嶉噺
+    //    /// </summary>
+    //    public float F_WEIGHT { get; set; }
+    //}
+    [ST("浣滀笟琛�)]
+    public class WmsWork : BaseModel
+    {
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�锛氱瓑寰咃紝1锛氭墽琛岋紝2锛氬畬鎴愶紝3锛氶敊璇紝4锛氬惎鍔ㄥけ璐ワ紝5锛氭殏鍋滃惎鍔紝6锛氫换鍔℃湭鍒涘缓銆�锛氫换鍔″彇娑堬級
+        /// </summary>
+        public string S_B_STATE { get; set; } = "绛夊緟";
+
+        /// <summary>
+        /// 涓氬姟鐘舵�锛�锛氱瓑寰咃紝1锛氭墽琛岋紝2锛氬畬鎴愶紝3锛氶敊璇紝4锛氬惎鍔ㄥけ璐ワ紝5锛氭殏鍋滃惎鍔紝6锛氫换鍔℃湭鍒涘缓銆�锛氫换鍔″彇娑堬級
+        /// </summary>
+        public int N_B_STATE { get; set; } = 0;
+
+        /// <summary>
+        /// 鎺ラ┏浣嶏紝濡傛灉鏈変簩娈典换鍔¢渶瑕佸綋浣滀笟鐨勪腑杞揣浣嶏紝涓�浠诲姟鐨勭粓鐐癸紝浜屾浠诲姟鐨勮捣鐐�+        /// </summary>
+        public string CONNECTION { get; set; }
+
+
+        /// <summary>
+        /// 浣滀笟宸ヨ绫诲瀷
+        /// </summary>
+        public string TOOLSTYPE { get; set; }
+
+        /// <summary>
+        /// 浣滀笟缂栫爜
+        /// </summary>
+        public string S_CODE { get; set; }
+
+        /// <summary>
+        /// 璧风偣璐т綅
+        /// </summary>
+        public string S_START_LOC { get; set; }
+
+     
+        /// <summary>
+        /// 缁堢偣璐т綅
+        /// </summary>
+        public string S_END_LOC { get; set; }
+
+        /// <summary>
+        /// 浣滀笟绫诲瀷
+        /// </summary>
+        public string S_TYPE { get; set; }
+
+        /// <summary>
+        /// 浣滀笟绫诲瀷
+        /// </summary>
+        public int N_TYPE { get; set; }
+
+        /// <summary>
+        /// 浣滀笟瀹氫箟鍚嶇О
+        /// </summary>
+        public string S_OP_DEF_NAME { get; set; }
+
+        /// <summary>
+        /// 浠诲姟寮�鏃堕棿
+        /// </summary>
+        public DateTime T_START_TIME { get; set; }
+
+        /// <summary>
+        /// 浠诲姟缁撴潫鏃堕棿
+        /// </summary>
+        public DateTime T_END_TIME { get; set; }
+
+        /// <summary>
+        /// 瀹瑰櫒缂栫爜
+        /// </summary>
+        public string S_CNTR_CODE { get; set; }
+
+       
+
+        /// <summary>
+        /// mobox鑴氭湰鑷姩杩愯鍚姩寮�叧
+        /// </summary>
+        public string C_AUTO_START { get; set; } = "N";
+
+        /// <summary>
+        /// 璧风偣浠撳簱
+        /// </summary>
+        public string S_START_WH { get; set; } = "ZCCK";
+
+        /// <summary>
+        /// 璧风偣搴撳尯
+        /// </summary>
+        public string S_START_AREA { get; set; }
+
+        /// <summary>
+        /// 缁堢偣浠撳簱
+        /// </summary>
+        public string S_END_WH { get; set; } = "ZCCK";
+
+        /// <summary>
+        /// 缁堢偣搴撳尯
+        /// </summary>
+        public string S_END_AREA { get; set; }
+
+
+        /// <summary>
+        /// 浣滀笟浼樺厛绾�+        /// </summary>
+        public int N_PRIORITY { 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;
+                case 6: status = "浠诲姟鏈垱寤�; break;
+                case 7: status = "浠诲姟鍙栨秷"; break;
+            }
+            return status;
+        }
+
+        /// <summary>
+        /// 鏍规嵁浼犻�鏁板瓧鍒ゆ柇浠诲姟绫诲瀷
+        /// 1锛氬父瑙勫叆搴撱�2锛氬父瑙勫嚭搴撱�3锛氱洏鐐瑰叆搴撱�4锛氱洏鐐瑰嚭搴撱�5锛氶�搴撲换鍔�+        /// </summary>
+        /// <param name="v"></param>
+        /// <returns></returns>
+        internal static string GetTypeStr(int v)
+        {
+            var str = "";
+            switch (v)
+            {
+                case 1: str = "甯歌鍏ュ簱"; break;
+                case 2: str = "甯歌鍑哄簱"; break;
+                case 3: str = "鐐瑰埌鐐逛换鍔�; break;
+                case 4: str = "鐩樼偣鍑哄簱"; break;
+                case 5: str = "鐗规畩浠诲姟"; break;
+            }
+            return str;
+        }
+
+        /// <summary>
+        /// 鏍规嵁浼犻�鏁板瓧鍒ゆ柇浠诲姟涓枃鍚嶇О
+        /// </summary>
+        /// <param name="v"></param>
+        /// <returns></returns>
+        public static string GetOpName(int v)
+        {
+            var str = "";
+            switch (v)
+            {
+                case 1: str = "鐮佺洏鍏ュ簱"; break;
+                case 2: str = "FTP鍑哄簱"; break;
+                case 20: str = "鐐瑰埌鐐逛换鍔�; break;
+                case 4: str = "鐩樼偣鍑哄簱"; break;
+                case 5: str = "鐗规畩浠诲姟"; break;
+            }
+            return str;
+        }
+    }
+
+        [ST("浠诲姟琛�)]
+    public class WMSTask : BaseModel
+    {
+        /// <summary>
+        /// 浣滀笟宸ヨ绫诲瀷
+        /// </summary>
+        public string TOOLSTYPE { get; set; }
+
+
+        /// <summary>
+        /// 浠诲姟缂栫爜
+        /// </summary>
+        public string S_CODE { get; set; }
+
+        /// <summary>
+        /// 浠诲姟绫诲瀷鍊�+        /// </summary>
+        public int N_TYPE { get; set; }
+
+        /// <summary>
+        /// 浠诲姟绫诲瀷
+        /// </summary>
+        public string S_TYPE { get; set; }
+
+        /// <summary>
+        /// 浠诲姟鐘舵�鍊�+        /// </summary>
+        public int N_B_STATE { get; set; }
+
+        /// <summary>
+        /// 浠诲姟鐘舵�
+        /// </summary>
+        public string S_B_STATE { get; set; }
+
+        /// <summary>
+        /// 椤哄簭鍙�+        /// </summary>
+        public string N_SORT_NO { get; set; }
+
+        /// <summary>
+        /// 浣滀笟缂栫爜
+        /// </summary>
+        public string S_OP_CODE { get; set; }
+
+        /// <summary>
+        /// 璁惧缂栧彿
+        /// </summary>
+        public string S_EQ_NO { get; set; }
+
+        /// <summary>
+        /// 寮�鏃堕棿
+        /// </summary>
+        public DateTime T_START_TIME { get; set; }
+
+        /// <summary>
+        /// 缁撴潫鏃堕棿
+        /// </summary>
+        public DateTime T_END_TIME { get; set; }
+
+        /// <summary>
+        /// 璋冨害绫诲瀷鍊�+        /// </summary>
+        public int N_SCHEDULE_TYPE { get; set; }
+
+        /// <summary>
+        /// 璋冨害绫诲瀷
+        /// </summary>
+        public string S_SCHEDULE_TYPE { get; set; }
+
+        /// <summary>
+        /// 浼樺厛绾�+        /// </summary>
+        public int N_PRIORITY { get; set; }
+
+        /// <summary>
+        /// 璁惧浠诲姟鍙�+        /// </summary>
+        public string S_EQ_TASK_CODE { get; set; }
+
+        /// <summary>
+        /// 璧峰浠撳簱
+        /// </summary>
+        public string S_START_WH { get; set; }
+
+        /// <summary>
+        /// 璧峰搴撳尯缂栧彿
+        /// </summary>
+        public string S_START_AREA { get; set; }
+
+        /// <summary>
+        /// 璧风偣
+        /// </summary>
+        public string S_START_LOC { get; set; }
+
+        /// <summary>
+        /// 璧峰璐т綅绔欑偣
+        /// </summary>
+        public string S_START_SITE { get; set; }
+
+        /// <summary>
+        /// 璧风偣灞�+        /// </summary>
+        public int S_START_SITE_LAYER { get; set; }
+
+        /// <summary>
+        /// 鐩殑浠撳簱
+        /// </summary>
+        public string S_END_WH { get; set; }
+
+        /// <summary>
+        /// 鐩殑搴撳尯缂栧彿
+        /// </summary>
+        public string S_END_AREA { get; set; }
+
+        /// <summary>
+        /// 缁堢偣
+        /// </summary>
+        public string S_END_LOC { get; set; }
+
+        /// <summary>
+        /// 鐩殑璐т綅绔欑偣
+        /// </summary>
+        public string S_END_SITE { get; set; }
+
+        /// <summary>
+        /// 缁堢偣灞�+        /// </summary>
+        public int S_END_SITE_LAYER { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string S_NOTE { get; set; }
+
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        public string S_ERR { get; set; }
+
+        /// <summary>
+        /// 閿欒鐮�+        /// </summary>
+        public int N_ERR { get; set; }
+
+        /// <summary>
+        /// 瀹瑰櫒缂栫爜
+        /// </summary>
+        public string S_CNTR_CODE { get; set; }
+
+        /// <summary>
+        /// 鎼繍鐨勬墭鐩樻暟閲�+        /// </summary>
+        public int N_CNTR_COUNT { get; set; }
+
+
+        /// <summary>
+        /// 杞﹂棿缂栫爜
+        /// </summary>
+        public string S_WORKSHOP_NO { get; set; }
+
+        /// <summary>
+        /// 杞﹂棿鍚嶇О
+        /// </summary>
+        public string S_WORKSHOP_NAME { get; set; }
+
+        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;
+                case 5:
+                    status = "鍙栨秷";
+                    break;
+            }
+
+            return status;
+        }
+    }
+
+
+    [ST("浠诲姟鍔ㄤ綔琛�)]
+    public class WmsTaskAction : BaseModel
+    {
+        /// <summary>
+        /// 璁惧绫诲瀷
+        /// </summary>
+        public string S_EQ_TYPE { get; set; }
+
+        /// <summary>
+        /// 鍔ㄤ綔
+        /// </summary>
+        public string S_ACTION { get; set; }
+
+        /// <summary>
+        /// 浠诲姟缂栫爜
+        /// </summary>
+        public string S_TASK_CODE { get; set; }
+
+        /// <summary>
+        /// 璁惧鍙�+        /// </summary>
+        public string S_EQ_CODE { get; set; }
+
+        /// <summary>
+        /// 闄勫姞鍙傛暟
+        /// </summary>
+        public string S_DATA { get; set; }
+
+        /// <summary>
+        /// 鍔ㄤ綔鐮�+        /// </summary>
+        public string N_ACTION_CODE { get; set; }
+
+    }
+
+
+    [ST("瀹瑰櫒琛�)]
+    public class Container : BaseModel
+    {
+        /// <summary>
+        /// 瀹瑰櫒缂栫爜
+        /// </summary>
+        public string S_CODE { get; set; }
+
+        /// <summary>
+        /// 瀹瑰櫒绫诲瀷鍊�+        /// </summary>
+        //public string N_TYPE { get; set; }
+
+        /// <summary>
+        /// 瀹瑰櫒绫诲瀷
+        /// </summary>
+        public string S_TYPE{ get; set; }
+
+        /// <summary>
+        /// 瑙勬牸
+        /// </summary>
+        //public string S_SPEC { get; set; }
+
+        /// <summary>
+        /// 鑷噸
+        /// </summary>
+        //public float F_WEIGHT { get; set; }
+
+        /// <summary>
+        /// 鏈�ぇ閲嶉噺
+        /// </summary>
+        //public float F_MAX_WEIGHT { get; set; }
+
+        /// <summary>
+        /// 闀�+        /// </summary>
+        //public int N_LENGTH { get; set; }
+
+        /// <summary>
+        /// 鏄惁鍙敤
+        /// </summary>
+        public string C_ENABLE { get; set; }
+
+        /// <summary>
+        /// 瀹�+        /// </summary>
+       // public int N_WIDTH { get; set; }
+
+        /// <summary>
+        /// 铏氭嫙瀹瑰櫒
+        /// </summary>
+        //public string C_IS_VIRTUAL { get; set; }
+
+        /// <summary>
+        /// 楂�+        /// </summary>
+        //public string N_HEIGHT { get; set; }
+
+        /// <summary>
+        /// 鏄庣粏鏉℃暟
+        /// </summary>
+        public int N_DETAIL_COUNT { get; set; }
+
+        /// <summary>
+        /// 瀹瑰櫒涓氬姟鐘舵�
+        /// </summary>
+        //public int N_B_STATE { get; set; }
+
+        /// <summary>
+        /// 閿佸畾涓氬姟鍙�+        /// </summary>
+        //public string S_LOCK_OP_CODE { get; set; }
+
+        /// <summary>
+        /// 閿佺姸鎬�+        /// </summary>
+        //public string S_LOCK_STATE { get; set; }
+
+        /// <summary>
+        /// 閿佺姸鎬�+        /// </summary>
+        //public int N_LOCK_STATE { get; set; }
+
+        /// <summary>
+        /// 璐у搧閲嶉噺
+        /// </summary>
+        //public float F_GOOD_WEIGHT { get; set; }
+
+
+        /// <summary>
+        /// 鏈�ぇ浣撶Н
+        /// </summary>
+        //public float F_MAX_VOLUME { get; set; }
+
+        /// <summary>
+        /// 璐у搧浣撶Н
+        /// </summary>
+        //public float F_GOOD_VOLUME { get; set; }
+
+        /// <summary>
+        /// 婊℃
+        /// </summary>
+        //public string C_FULL { get; set; }
+
+    }
+
+    /// <summary>
+    /// MES浠诲姟璁板綍琛�+    /// </summary>
+    //[ST("MES浠诲姟璁板綍琛�)]
+    //public class MesTask : BaseModel
+    //{
+    //    /// <summary>
+    //    /// 浠诲姟鍙�+    //    /// </summary>
+    //    public string task_no { get; set; }
+    //    /// <summary>
+    //    /// 浠诲姟绫诲瀷1:鍏ュ簱;2:鍑哄簱
+    //    /// </summary>
+    //    public int Task_type { get; set; }
+    //    /// <summary>
+    //    /// 鍛ㄨ浆鍗″彿
+    //    /// </summary>
+    //    public string TurnCardNum { get; set; }
+    //    /// <summary>
+    //    /// 鏍囧噯閲嶉噺
+    //    /// </summary>
+    //    public float standardWeight { get; set; }
+    //    /// <summary>
+    //    /// 宸ヨ绫诲瀷 鑳庝晶25,鍐呰‖35,鑳庝綋/甯樺竷45,甯︽潫55,鑳庡湀65,鑳庨潰15,绾ょ淮85锛岄挗涓�5
+    //    /// </summary>
+    //    public string TOOLS_TPYE { get; set; }
+    //    /// <summary>
+    //    /// 鍒跺搧缂栧彿
+    //    /// </summary>
+    //    public string PROD_NO { get; set; }
+    //    /// <summary>
+    //    /// 宸ヨ壓缂栧彿
+    //    /// </summary>
+    //    public string PROD_TECH { get; set; }
+    //    /// <summary>
+    //    /// 鍒跺搧瑙勬牸
+    //    /// </summary>
+    //    public string PROD_SPEC { get; set; }
+    //    /// <summary>
+    //    /// 鍒跺搧绫诲瀷
+    //    /// </summary>
+    //    public string PROD_BOM { get; set; }
+    //    /// <summary>
+    //    /// 鍒跺搧鐗瑰緛鍊�+    //    /// </summary>
+    //    public string PROD_Feature { get; set; }
+    //    /// <summary>
+    //    /// 宸ヨ缂栧彿
+    //    /// </summary>
+    //    public string TOOLS_NO { get; set; }
+    //    /// <summary>
+    //    /// 杞芥枡鏁伴噺
+    //    /// </summary>
+    //    public float ST_AMOUNT { get; set; }
+    //    /// <summary>
+    //    /// 褰撳墠鏁伴噺
+    //    /// </summary>
+    //    public float CURRENT_AMOUNT { get; set; }
+    //    /// <summary>
+    //    /// 璧峰搴撲綅缂栧彿
+    //    /// </summary>
+    //    public string Location_From { get; set; }
+    //    /// <summary>
+    //    /// 鐩殑搴撲綅缂栧彿
+    //    /// </summary>
+    //    public string Location_To { get; set; }
+    //    /// <summary>
+    //    /// 鐢熶骇鏃堕棿
+    //    /// </summary>
+    //    public DateTime PRODUCE_TIME { get; set; }
+    //    /// <summary>
+    //    /// 鐢熸晥鏃堕棿
+    //    /// </summary>
+    //    public DateTime SHELF_LIFE_TIME { get; set; }
+    //    /// <summary>
+    //    /// 澶辨晥鏃堕棿
+    //    /// </summary>
+    //    public DateTime EXPIRED_TIME { get; set; }
+    //    /// <summary>
+    //    /// 缂╃煭鎶ュ憡鏃堕棿
+    //    /// </summary>
+    //    public float SHELF_REP { get; set; }
+    //    /// <summary>
+    //    /// 寤堕暱鎶ュ憡鏃堕棿
+    //    /// </summary>
+    //    public float EXPIRED_REP { get; set; }
+    //    /// <summary>
+    //    /// 璐ㄦ鐘舵�浠g爜
+    //    /// </summary>
+    //    public string CHECK_CODE { get; set; }
+    //    /// <summary>
+    //    /// 璐ㄦ鐘舵�
+    //    /// </summary>
+    //    public string CHECK_INFO { get; set; }
+    //    /// <summary>
+    //    /// 浼樺厛绾�-鏅�锛氫换鍔$敓鎴愭椂锛屽潎涓烘绾у埆;1-鍔犳�;2-绱ф�
+    //    /// </summary>
+    //    public int Priority { get; set; }
+    //    /// <summary>
+    //    /// 浠诲姟鐘舵�0-鍒濆鐘舵�;1-杩涜涓�2-瀹屾垚;3-浠诲姟鍙栨秷
+    //    /// </summary>
+    //    public int Data_status { get; set; }
+    //    /// <summary>
+    //    /// 涓氬姟绫诲瀷
+    //    /// 1	鍗婃垚鍝佹弧鎵樺叆搴�+    //    /// 2	鎴愬瀷鏈哄崐妗跺洖搴�+    //    /// 3	鎴愬瀷鏈虹┖妗跺洖搴�+    //    /// 4	鎴愬瀷鏈烘弧鎵樺嚭搴�+    //    /// 5	鎴愬瀷鏈哄甫鏉熷洖搴�+    //    /// 6	鎴愬瀷鏈哄甫鏉熸弧鎵樺嚭搴�+    //    /// 7	鍗婃垚鍝佺┖鎵樺嚭搴�+    //    /// 8	鑳舵枡鍏ュ簱
+    //    /// 9	鍛煎彨鑳舵枡
+    //    /// 10	鍙犵洏鏈虹┖鎵樺叆搴�+    //    /// 11	鑳舵枡鍗婃《鍥炲簱
+    //    /// 12	绌烘灦瀛愬叆搴�+    //    /// 13	鑳庡湀绌烘墭鍏ヤ笉甯﹀灚鐗�+    //    /// 14	鑳庡湀绌烘墭鍑轰笉甯﹀灚鐗�+    //    /// 100	缁戝畾
+    //    /// 200	瑙g粦
+    //    /// </summary>
+    //    public string BUSI_TYPE { get; set; }
+
+    //    /// <summary>
+    //    /// 鍒涘缓鏃堕棿
+    //    /// </summary>
+    //    public DateTime CreateDate { get; set; }
+    //}
+
+
+        /// <summary>
+        /// 涓婁笅鏋惰〃
+        /// </summary>
+        [ST("涓婁笅鏋惰褰�)]
+        public class RecordUpAndDown : BaseModel
+        {
+
+        
+            /// <summary>
+            /// 涓婃灦涓嬫灦
+            /// </summary>
+            public string S_ACTION { get; set; }
+
+
+            /// <summary>
+            /// 缁堢偣璐т綅
+            /// </summary>
+            public string S_END_LOC { get; set; }
+
+            /// <summary>
+            /// 璧风偣璐т綅
+            /// </summary>
+            public string S_LOC_CODE { get; set; }
+
+            /// <summary>
+            /// 鍑哄叆搴撴椂闂�+            /// </summary>
+            public DateTime T_INBOUND_TIME { get; set; }
+
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string S_OPTASK { get; set; }
+
+            /// <summary>
+            /// 鎵樼洏鐮�+            /// </summary>
+            public string S_CNTR_CODE { get; set; }
+
+            /// <summary>
+            /// 璐у搧缂栫爜
+            /// </summary>
+            public string S_ITEM_CODE { get; set; }
+
+            /// <summary>
+            /// 鐢熶骇鏃堕棿
+            /// </summary>
+            public DateTime D_PRD_DATE { get; set; }
+
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string S_BATCH_NO { get; set; }
+
+
+            /// <summary>
+            /// 鎵樼洏绫诲瀷
+            /// </summary>
+            public string S_TRAY_TYPE { get; set; }
+
+            /// <summary>
+            /// 璐у搧鍚嶇О
+            /// </summary>
+            public string S_ITEM_NAME { get; set; }
+
+            /// <summary>
+            /// 鏁伴噺
+            /// </summary>
+            public decimal F_QTY { get; set; }
+
+            /// <summary>
+            /// 璐ㄦ鐘舵�
+            /// </summary>
+            public string S_ITEM_STATE { get; set; }
+
+            /// <summary>
+            /// 鍛ㄨ浆鍗″彿
+            /// </summary>
+            public string TurnCardNum { get; set; }
+            /// <summary>
+            /// 鐗╂枡鐗瑰緛  zc涓�鐢ㄦ潵瀛樺伐鑹虹紪鍙�+            /// </summary>
+            public string itemFeature { get; set; }
+            /// <summary>
+            /// 瑙勬牸鍨嬪彿
+            /// </summary>
+            public string itemModel { get; set; }
+
+            /// <summary>
+            /// 澶辨晥鏃堕棿
+            /// </summary>
+            public DateTime expireTime { get; set; }
+
+            /// <summary>
+            /// 鐢熸晥鏃堕棿
+            /// </summary>
+            public DateTime takeEffectTime { get; set; }
+
+            /// <summary>
+            /// 鍒跺搧绫诲瀷
+            /// </summary>
+            public string Level { get; set; }
+
+            /// <summary>
+            /// 瑙勬牸
+            /// </summary>
+            public string S_ITEM_SPEC { get; set; }
+
+            /// <summary>
+            /// 鎬婚噸閲�+            /// </summary>
+            public decimal F_SUM_QTY { get; set; }
+        }
+
+
+
+
+
+
+
+    /// <summary>
+    /// AGV鐘舵�淇℃伅琛�+    /// </summary>
+    [ST("AGV鐘舵�淇℃伅琛�)]
+    public class S_AGV_CONDITIONEntitys : BaseModel
+    {
+        /// <summary>
+        /// 杞﹀彿
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true)]
+        public string forkliftNo { get; set; }
+
+        #region 鐢垫睜淇℃伅
+        /// <summary>
+        /// 鐢垫睜鐢甸噺
+        /// </summary>
+        public string Battery_Soc { get; set; }
+        /// <summary>
+        /// 鐢垫睜鐢靛帇
+        /// </summary>
+        public string Battery_V { get; set; }
+
+        /// <summary>
+        /// 鐢垫睜鐢垫祦
+        /// </summary>
+        public string Battery_Amp { get; set; }
+
+        /// <summary>
+        /// 鐢垫睜娓╁害
+        /// </summary>
+        public string Battery_Temp { get; set; }
+        /// <summary>
+        /// 鐢垫睜灞炴�
+        /// </summary>
+        public string Battery_Prop { get; set; }
+        #endregion
+
+        #region 鐢垫満淇℃伅
+        /// <summary>
+        /// 鐢垫満鐢垫祦
+        /// </summary>
+        public string Motor_Amp { get; set; }
+        /// <summary>
+        /// 鐢垫満娓╁害
+        /// </summary>
+        public string Motor_Temp { get; set; }
+
+        /// <summary>
+        /// 娌规车鐢垫満璧峰崌鏃剁數娴�+        /// </summary>
+        public string Motor_Y_Amp { get; set; }
+        /// <summary>
+        /// 娌规车鐢垫満瀹炴椂娓╁害
+        /// </summary>
+        public string Motor_Y_Temp { get; set; }
+        #endregion
+        #region 浜ら�绠″埗淇℃伅
+        /// <summary>
+        /// 甯冨眬浣嶇疆鐐�+        /// </summary>
+        public string Traffic_Pt { get; set; }
+        /// <summary>
+        /// 甯冨眬浣嶇疆娈�+        /// </summary>
+        public string Traffic_Sec { get; set; }
+        /// <summary>
+        /// 鍫靛閫昏緫绾�+        /// </summary>
+        public string Traffic_Wire { get; set; }
+        /// <summary>
+        /// 鍫靛鍗曚綅缂栧彿
+        /// </summary>
+        public string Traffic_Unit { get; set; }
+        /// <summary>
+        /// 鍫靛IO,ID
+        /// </summary>
+        public string Traffic_Io { get; set; }
+        #endregion
+        #region 寮�満鏃堕棿
+        /// <summary>
+        /// 绱寮�満鏃堕棿锛屽崟浣嶏紙澶╋級
+        /// </summary>
+        public string Time_D { get; set; }
+        /// <summary>
+        /// 绱寮�満鏃堕棿锛屽崟浣嶏紙h锛�+        /// </summary>
+        public string time_H { get; set; }
+        #endregion
+        #region 閲岀▼
+        /// <summary>
+        /// 绱閲岀▼锛屽崟浣嶏紙km锛�+        /// </summary>
+        public string Mileage_Km { get; set; }
+        /// <summary>
+        /// 绱閲岀▼锛屽崟浣嶏紙m锛�+        /// </summary>
+        public string Mileage_m { get; set; }
+        #endregion
+        #region 涓惧崌娆℃暟
+        /// <summary>
+        /// 绱璐у弶涓惧崌娆℃暟锛屽崟浣�1000娆�+        /// </summary>
+        public string Lifts_Kc { get; set; }
+        /// <summary>
+        ///绱璐у弶涓惧崌娆℃暟锛屽崟浣�娆�+        /// </summary>
+        public string Lifts_c { get; set; }
+        #endregion
+
+        #region 鍏朵粬淇℃伅
+        /// <summary>
+        /// 杞﹁締X鍧愭爣(cm)
+        /// </summary>
+        public string Pos_X { get; set; }
+        /// <summary>
+        /// 杞﹁締Y鍧愭爣(cm)
+        /// </summary>
+        public string Pos_Y { get; set; }
+        /// <summary>
+        /// 杞﹁締z鍧愭爣(璧峰崌楂樺害)(mm)
+        /// </summary>
+        public string Pos_Z { get; set; }
+        #endregion
+        #region 杞悜瑙掑害
+        /// <summary>
+        /// 杞悜瑙掑害锛屽崟浣�掳
+        /// </summary>
+        public string Angle_Deg { get; set; }
+        #endregion
+        #region agv鐘舵�
+        public string Agvstate_s { get; set; }
+        #endregion
+    }
+
+    /// <summary>
+    /// AGV鎶ヨ瀵圭収琛�+    /// </summary>
+    [ST("AGV鎶ヨ瀵圭収琛�)]
+    public class S_AGV_TYPEEntitys : BaseModel
+    {
+        /// <summary>
+        /// 閿欒绫诲瀷
+        /// </summary>
+        public string S_AGV_TYPE { get; set; }
+        /// <summary>
+        /// AGV閿欒浠g爜
+        /// </summary>
+        public string S_AGV_ERRCODE { get; set; }
+        /// <summary>
+        /// 1鐨勪綅缃�+        /// </summary>
+        public int N_CODE_1 { get; set; }
+        /// <summary>
+        /// 鍚箟
+        /// </summary>
+        public string S_AGV_NOTE { get; set; }
+        /// <summary>
+        /// 寮�叧
+        /// </summary>
+        public string S_IS_OPEN { get; set; }
+    }
+
+    /// <summary>
+    /// AGV鎶ヨ淇℃伅琛�+    /// </summary>
+    [ST("AGV鎶ヨ淇℃伅琛�)]
+    public class AgvErrorReportEntitys : BaseModel
+    {
+        /// <summary>
+        /// 杞﹀彿
+        /// </summary>
+        public string AgvLicense { get; set; }
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        public string AgvErrorMsg { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/wms/WcsModel.cs b/wms/WcsModel.cs
new file mode 100644
index 0000000..c801622
--- /dev/null
+++ b/wms/WcsModel.cs
@@ -0,0 +1,139 @@
+锘縰sing HH.WCS.ZhongCeJinTan.util;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.ZhongCeJinTan.wms
+{
+    internal class WcsModel
+    {
+
+
+       
+
+
+        /// <summary>
+        /// 绔嬪簱鎶ヨ涓婃姤琛�+        /// </summary>
+        [ST("绔嬪簱鎶ヨ涓婃姤琛�)]
+        public class WcsWarningEntitys : BaseModel
+        {
+            public string requestPk { get; set; }
+            public string taskNo { get; set; }
+            public string reqTime { get; set; }
+            public string errorNo { get; set; }
+            public string errorDes { get; set; }
+            public string remarks { get; set; }
+            public string roadway { get; set; }
+            public string areaCode { get; set; }
+        }
+
+        /// <summary>
+        /// 绔嬪簱閫氱煡纭琛�+        /// </summary>
+        [ST("绔嬪簱閫氱煡纭琛�)]
+        public class WcsInform : BaseModel
+        {
+            /// <summary>
+            /// 璇锋眰缂栧彿
+            /// </summary>
+            public string requestPk { get; set; }
+            /// <summary>
+            /// 浠诲姟绫诲瀷 1鍙栬揣 2鏀捐揣
+            /// </summary>
+            public string trkType { get; set; }
+            /// <summary>
+            /// 1鍏佽
+            /// </summary>
+            public string isAllow { get; set; }
+            /// <summary>
+            /// 鐩殑鍦扮珯鍙板彿
+            /// </summary>
+            public string stnNo { get; set; }
+            /// <summary>
+            /// 鎿嶄綔浜�+            /// </summary>
+            public string clientCode { get; set; }
+            /// <summary>
+            /// 杞﹀彿
+            /// </summary>
+            public string carNo { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public string reqTime { get; set; }
+        }
+
+        [ST("绔嬪簱瀹夊叏璇锋眰璁板綍琛�)]
+        public class WcsSafety : BaseModel
+        {
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string TaskNo { get; set; }
+
+            /// <summary>
+            /// 淇″彿
+            /// </summary>
+            public int Sign { get; set; }
+        }
+
+
+        /// <summary>
+        /// 宸烽亾鍙敤琛�+        /// </summary>
+        [ST("宸烽亾鍙敤琛�)]
+        public class RoadWayEnable : BaseModel
+        {
+            /// <summary>
+            /// 璇锋眰缂栧彿
+            /// </summary>
+            public string requestPk { get; set; }
+            /// <summary>
+            /// 搴撳尯
+            /// </summary>
+            public string areaCode { get; set; }
+            /// <summary>
+            /// 宸烽亾
+            /// </summary>
+            public string roadWay { get; set; }
+            /// <summary>
+            /// 鍙敤锛�0涓嶅彲鐢�1鍙敤
+            /// </summary>
+            public string status { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public string reqTime { get; set; }
+
+        }
+
+        [ST("RFID鏁堥獙缁撴灉琛�)]
+        public class WcsRfidCheckoutEntitys : BaseModel
+        {
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string S_TASK_NO { get; set; }
+            /// <summary>
+            /// 瀹為檯RFID缂栫爜
+            /// </summary>
+            public string S_NEWTRAY_CODE { get; set; }
+            /// <summary>
+            /// 鍘烺FID缂栫爜
+            /// </summary>
+            public string S_OLDTRAY_CODE { get; set; }
+            /// <summary>
+            /// 鎺ラ┏浣�+            /// </summary>
+            public string S_JBWBIT { get; set; }
+            /// <summary>
+            /// 楠岃瘉缁撴灉
+            /// </summary>
+            public string S_RESULT { get; set; }
+        }
+
+    }
+}

--
Gitblit v1.9.1