From d968571628134ed672d9c6e4ba5cf32ba8d9644b Mon Sep 17 00:00:00 2001
From: jinxin <1013386558@qq.com>
Date: 星期三, 04 六月 2025 10:43:44 +0800
Subject: [PATCH] 农夫茶园

---
 HH.WCS.NongFuChaYuan/OtherService/StrHelper.cs           |   31 
 HH.WCS.NongFuChaYuan/ApiService/StandController.cs       |   70 
 HH.WCS.NongFuChaYuan/WmsService/WCSHelper.cs             |  234 
 HH.WCS.NongFuChaYuan/WmsService/LocationHelper.cs        |  544 +
 HH.WCS.NongFuChaYuan/TaskController/TaskProcess.cs       | 1033 +++
 HH.WCS.NongFuChaYuan/OtherService/XmlHelper.cs           |   39 
 HH.WCS.NongFuChaYuan/Program.cs                          |  138 
 .vs/slnx.sqlite                                          |    0 
 HH.WCS.NongFuChaYuan/WmsService/WMSModel.cs              |  446 +
 HH.WCS.NongFuChaYuan/DispatchService/NDC.cs              |  236 
 HH.WCS.NongFuChaYuan/ApiService/ApiModel.cs              |  421 +
 HH.WCS.NongFuChaYuan/readme.txt                          |    1 
 HH.WCS.NongFuChaYuan/DeviceService/OITcpHelper.cs        |  249 
 HH.WCS.NongFuChaYuan/settings.xml                        |  269 
 HH.WCS.NongFuChaYuan/DeviceService/TcpServer.cs          |  154 
 HH.WCS.NongFuChaYuan/EasyModbus.dll                      |    0 
 HH.WCS.NongFuChaYuan/DeviceService/PlcHelper.cs          |   91 
 HH.WCS.NongFuChaYuan/packages.config                     |   17 
 HH.WCS.NongFuChaYuan/WmsService/WCSModel.cs              |  386 +
 HH.WCS.NongFuChaYuan/OtherService/LogHelper.cs           |  140 
 HH.WCS.NongFuChaYuan/WmsService/JobHelper.cs             |   46 
 HH.WCS.NongFuChaYuan/WmsService/ContainerHelper.cs       |  210 
 HH.WCS.NongFuChaYuan/OtherService/Settings.cs            | 1177 ++++
 HH.WCS.NongFuChaYuan/OtherService/STAttribute.cs         |   49 
 HH.WCS.NongFuChaYuan/ApiService/Startup.cs               |   76 
 HH.WCS.NongFuChaYuan/TaskController/DeviceProcess.cs     | 1945 +++++++
 HH.WCS.NongFuChaYuan/WmsService/TaskHelper.cs            |  259 
 HH.WCS.NongFuChaYuan/WmsService/NormalArea.cs            |   15 
 HH.WCS.NongFuChaYuan/Properties/AssemblyInfo.cs          |   36 
 HH.WCS.NongFuChaYuan/OtherService/HttpHelper.cs          |  204 
 HH.WCS.NongFuChaYuan/HH.WCS.NongFuChaYuan.csproj         |  173 
 HH.WCS.NongFuChaYuan/OtherService/SqlHelper.cs           |  163 
 HH.WCS.NongFuChaYuan/WmsService/SYSHelper.cs             |   63 
 HH.WCS.NongFuChaYuan/ApiService/MoboxController.cs       |   52 
 HH.WCS.NongFuChaYuan/DeviceService/ModbusHelper.cs       |  237 
 HH.WCS.NongFuChaYuan/DispatchService/HostToAGV.cs        |  550 ++
 HH.WCS.NongFuChaYuan/TaskController/Monitor.cs           | 2163 +++++++
 HH.WCS.NongFuChaYuan/ApiService/ApiHelper.cs             |  980 +++
 HH.WCS.NongFuChaYuan/DispatchService/GZRobot.cs          |  256 
 HH.WCS.NongFuChaYuan/ApiService/ThirdController.cs       |  130 
 HH.WCS.NongFuChaYuan/DispatchService/NDCHelper.cs        |  103 
 HH.WCS.NongFuChaYuan/OtherService/CryptoDecryptHelper.cs |  214 
 .vs/ProjectSettings.json                                 |    3 
 HH.WCS.NongFuChaYuan/ApiService/AgvController.cs         |   48 
 HH.WCS.NongFuChaYuan/App.config                          |   26 
 HH.WCS.NongFuChaYuan/WmsService/IntensiveArea.cs         | 2647 +++++++++
 46 files changed, 16,324 insertions(+), 0 deletions(-)

diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json
new file mode 100644
index 0000000..f8b4888
--- /dev/null
+++ b/.vs/ProjectSettings.json
@@ -0,0 +1,3 @@
+{
+  "CurrentProjectSetting": null
+}
\ No newline at end of file
diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite
new file mode 100644
index 0000000..fcd479f
--- /dev/null
+++ b/.vs/slnx.sqlite
Binary files differ
diff --git a/HH.WCS.NongFuChaYuan/ApiService/AgvController.cs b/HH.WCS.NongFuChaYuan/ApiService/AgvController.cs
new file mode 100644
index 0000000..dbafe90
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/ApiService/AgvController.cs
@@ -0,0 +1,48 @@
+锘縰sing HH.WCS.NongFuChaYuan.TaskController;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using System.Web.Http;
+using static HH.WCS.NongFuChaYuan.ApiService.ApiModel;
+
+namespace HH.WCS.NongFuChaYuan.ApiService
+{
+    /// <summary>
+    /// HostToAgv鎺ュ彛绫�+    /// </summary>
+    [RoutePrefix("agv")]
+    public class AgvController : System.Web.Http.ApiController
+    {
+        [HttpPost]
+        [Route("AGVCallbackState")]
+        public ReturnResult AGVCallbackState(AgvTaskState model) {
+            LogHelper.Info("AGVCallbackState Request锛� + JsonConvert.SerializeObject(model), "HosttoagvTask");
+            ApiHelper.OperateTaskStatus(model);
+            ReturnResult result = new ReturnResult();
+            LogHelper.Info("AGVCallbackState Return锛� + JsonConvert.SerializeObject(result), "HosttoagvTask");
+            return result;
+        }
+
+        [HttpPost]
+        [Route("AGVCallbackEvent")]
+        public ReturnResult AGVCallbackEvent(AgvEventInfo model) {
+            LogHelper.Info("AGVCallbackEvent Request锛� + JsonConvert.SerializeObject(model), "HosttoagvTask");
+
+            ReturnResult result = new ReturnResult();
+            LogHelper.Info("AGVCallbackEvent Return锛� + JsonConvert.SerializeObject(result), "HosttoagvTask");
+            return result;
+        }
+
+        [HttpPost]
+        [Route("AGVDeviceReceive")]
+        public ReturnResult AGVDeviceReceive(List<AgvDeviceStatus> models) {
+            models.ForEach(a =>
+            {
+                LogHelper.Info("AGVDeviceReceive Request锛� + JsonConvert.SerializeObject(a), "HosttoagvCar");
+                ApiHelper.AGVDeviceReceiveSet(a.forkliftNo, a.battery, a.agvCurrTaskInfo, a.errCode, a.errCode2, a.faildCode);
+            });
+            ReturnResult result = new ReturnResult();
+            LogHelper.Info("AGVDeviceReceive Return锛� + JsonConvert.SerializeObject(result), "HosttoagvCar");
+            return result;
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/ApiService/ApiHelper.cs b/HH.WCS.NongFuChaYuan/ApiService/ApiHelper.cs
new file mode 100644
index 0000000..755bc9f
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/ApiService/ApiHelper.cs
@@ -0,0 +1,980 @@
+锘縰sing HH.WCS.NongFuChaYuan.DeviceService;
+using HH.WCS.NongFuChaYuan.DispatchService;
+using HH.WCS.NongFuChaYuan.TaskController;
+using HH.WCS.NongFuChaYuan.OtherService;
+using HH.WCS.NongFuChaYuan.WmsService;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using static HH.WCS.NongFuChaYuan.ApiService.ApiModel;
+using static HH.WCS.NongFuChaYuan.ApiService.OtherModel;
+using System;
+
+namespace HH.WCS.NongFuChaYuan.ApiService
+{
+    /// <summary>
+    /// API鎺ュ彛瀹炵幇绫�+    /// </summary>
+    public class ApiHelper
+    {
+        static ApiHelper()
+        {
+
+        }
+
+        #region   HostToAgv鎺ュ彛瀹炵幇绫�+
+        /// <summary>
+        /// AGV淇″彿澶勭悊
+        /// </summary>
+        /// <param name="model"></param>
+        public static void OperateTaskStatus(AgvTaskState model)
+        {
+            if (string.IsNullOrEmpty(model.No))
+            {
+                //鏃犱换鍔″彿璇锋眰(浜ょ)
+                DeviceProcess.SpecialTraffic(model.ForkliftNo, model.LockNo, model.State);
+            }
+            else
+            {
+                var wmsTask = TaskHelper.GetTask(model.No);
+                if (wmsTask != null)
+                {
+                    if (model.ForkliftNo != "0")
+                    {
+                        if (model.State <= 7)
+                        {
+                            if (!TaskHelper.CheckActionRecordExist(model.No, model.State.ToString()))
+                            {
+                                //鏈変换鍔″彿璇锋眰
+                                switch (model.State)
+                                {
+                                    case 1:
+                                        TaskHelper.Begin(wmsTask, model.ForkliftNo);
+                                        break;
+                                    #region MyRegion
+                                    case 3:
+                                        TaskHelper.UpdateStatus(wmsTask, "寮�鍙栬揣");
+                                        break;
+                                    case 4:
+                                        TaskProcess.OperateStatus(wmsTask, 4);
+                                        TaskHelper.UpdateStatus(wmsTask, "鍙栬揣瀹屾垚");
+                                        break;
+                                    case 5:
+                                        TaskHelper.UpdateStatus(wmsTask, "寮�鍗歌揣");
+                                        break;
+                                    case 6:
+                                        TaskProcess.OperateStatus(wmsTask, 6);
+                                        TaskHelper.UpdateStatus(wmsTask, "鍗歌揣瀹屾垚");
+                                        break;
+                                    #endregion
+                                    case 2:
+                                        if (!TaskHelper.CheckActionRecordExist(model.No, "6"))
+                                        {
+                                            TaskProcess.OperateStatus(wmsTask, 6);
+                                        }
+                                        TaskHelper.End(wmsTask);
+                                        break;
+                                    case 7:
+                                        TaskProcess.OperateStatus(wmsTask, 7);
+                                        TaskHelper.Fail(wmsTask);
+                                        break;
+                                }
+                                TaskHelper.UpdateAgvNo(wmsTask, model.ForkliftNo);
+                                TaskHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
+                                TaskProcess.ThirdReportStatus(wmsTask.S_SRC_NO.Trim(), model.ForkliftNo, model.State, model.ExtData, wmsTask);
+                                TaskProcess.GeneralInterFaceFunc(wmsTask, model.State.ToString());
+                                TaskProcess.RoboticarmTask(wmsTask, model.State);
+                            }
+                        }
+                        else
+                        {
+                            //瀹夊叏璇锋眰绛�+                            TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData);
+                            TaskHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
+                        }
+                    }
+                }
+            }
+        }
+
+        internal static SimpleResult AddTask(ApiModel.AddTaskModel model)
+        {
+            var result = new SimpleResult();
+            var db = new SqlHelper<object>().GetInstance();
+            if (!string.IsNullOrEmpty(model.StartBit) && !string.IsNullOrEmpty(model.EndBit))
+            {
+                //鍒涘缓鐐瑰埌鐐硅嚜鍔ㄨ浆杩愪换鍔�+                IntensiveArea.DaMingShanCreateTransport(model.StartBit, model.EndBit, "鐐瑰埌鐐硅浆杩�, model.TrayCode, 1, 1, "", 1);
+            }
+            else if (!string.IsNullOrEmpty(model.StartBit) && string.IsNullOrEmpty(model.EndBit))
+            {
+                //鏍规嵁閰嶇疆鏂囦欢鏉ラ�鎷╃粓鐐瑰簱鍖�+                if (!string.IsNullOrEmpty(model.ItemCode))
+                {
+                    var info = Settings.GetItemCacheAreaList().Where(a => a.ItemCode == model.ItemCode).FirstOrDefault();
+                    if (info != null)
+                    {
+                        string areaNo = info.AreaCode;
+                        var endbitlist = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaNo && a.N_CURRENT_NUM == 0)
+                            .PartitionBy(a => a.N_ROW)
+                            .OrderBy(a => a.N_COL)
+                            .Take(1)
+                            .ToList();
+                        foreach (var item in endbitlist)
+                        {
+                            var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                            if (lockinfo == null)
+                            {
+                                //鍒涘缓浠诲姟
+                                IntensiveArea.DaMingShanCreateTransport(model.StartBit, item.S_LOC_CODE, "鐐瑰埌鐐硅浆杩�, model.TrayCode, 1, 1, "", 1);
+                                break;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        result.resultCode = 1;
+                        result.resultMsg = "鐗╂枡缂栫爜瀵瑰簲鐨勫簱鍖烘湭閰嶇疆";
+                    }
+                }
+                else
+                {
+                    result.resultCode = -2;
+                    result.resultMsg = "鐗╂枡缂栫爜涓嶈兘涓虹┖";
+                }
+            }
+            else
+            {
+                result.resultCode = -1;
+                result.resultMsg = "璧风偣涓嶈兘涓虹┖";
+            }
+
+
+            return result;
+        }
+
+        static object AGVDeviceReceiveLock = new object();
+
+        /// <summary>
+        /// AGV鐘舵�澶勭悊
+        /// </summary>
+        /// <param name="forkliftNo"></param>
+        /// <param name="battery"></param>
+        /// <param name="agvCurrTaskInfo"></param>
+        /// <param name="errCode"></param>
+        /// <param name="errCode2"></param>
+        /// <param name="faildCode"></param>
+        internal static void AGVDeviceReceiveSet(string forkliftNo, string battery, string agvCurrTaskInfo, string errCode, string errCode2, string faildCode)
+        {
+            lock (AGVDeviceReceiveLock)
+            {
+                var db = new SqlHelper<HangChaAGV>().GetInstance();
+                var agvDeviceInfo = db.Queryable<HangChaAGV>().Where(a => a.agvNo == forkliftNo).First();
+                if (agvDeviceInfo == null)
+                {
+                    var agvInfo = new HangChaAGV()
+                    {
+                        agvNo = forkliftNo,
+                        agvBattery = battery,
+                        agvCurrTaskInfo = agvCurrTaskInfo,
+                        agvErrCode = errCode,
+                        errCode2 = errCode2,
+                        faildCode = faildCode
+                    };
+                    db.Insertable(agvInfo).ExecuteCommand();
+                }
+                else
+                {
+                    agvDeviceInfo.agvBattery = battery;
+                    agvDeviceInfo.agvCurrTaskInfo = agvCurrTaskInfo;
+                    agvDeviceInfo.agvErrCode = errCode;
+                    agvDeviceInfo.errCode2 = errCode2;
+                    agvDeviceInfo.faildCode = faildCode;
+                    db.Updateable(agvDeviceInfo).UpdateColumns(a => new
+                    { a.agvBattery, a.agvCurrTaskInfo, a.agvErrCode, a.errCode2, a.faildCode }).ExecuteCommand();
+                }
+            }
+        }
+
+        #endregion
+
+        #region   Mobox鎺ュ彛瀹炵幇绫�+        /// <summary>
+        /// Mobox鍙栨秷浠诲姟
+        /// </summary>
+        /// <param name="model"></param>
+        /// <param name="result"></param>
+        /// <returns></returns>
+        internal static SimpleResult MoboxCancelTask(MoboxTaskBase model, SimpleResult result)
+        {
+            var task = TaskHelper.GetTask(model.TaskNo);
+            if (task != null)
+            {
+                if (task.S_B_STATE.Trim() == "鏈墽琛�)
+                {
+                    //鏈墽琛岀洿鎺ヤ慨鏀圭姸鎬佷负鍙栨秷
+                    result.resultMsg = "浠诲姟鏈墽琛岋紝鐩存帴鍙栨秷";
+                    TaskHelper.UpdateStatus(model.TaskNo.Trim(), "鍙栨秷");
+                    //task.S_B_STATE = "鍙栨秷";
+                    TaskProcess.OperateStatus(task, 7);
+                    //TaskProcess.TaskCanCelOrComplete(task);
+                    TaskProcess.GeneralInterFaceFunc(task, "7");
+                }
+                else if (task.S_B_STATE.Trim() == "宸叉帹閫�)
+                {
+                    //宸叉帹閫佷絾鏄皬杞︽湭鎵ц锛屽彇娑堥渶瑕侀�鐭OSTTOAGV
+                    NDCHelper.Cancel(task.S_TASK_NO.Trim());
+                    result.resultMsg = "浠诲姟鍙栨秷宸茬粡鍙戦�缁欏皬杞�;
+                    TaskHelper.UpdateStatus(model.TaskNo.Trim(), "鍙栨秷");
+                    //task.S_B_STATE = "鍙栨秷";
+                    TaskProcess.OperateStatus(task, 7);
+                    //TaskProcess.TaskCanCelOrComplete(task);
+                    TaskProcess.GeneralInterFaceFunc(task, "7");
+                }
+                else
+                {
+                    result.resultCode = 1;
+                    result.resultMsg = "浠诲姟宸茬粨鏉熸垨澶勪簬鎵ц涓紝涓嶅厑璁稿彇娑堬紒";
+                }
+            }
+            else
+            {
+                result.resultCode = 1;
+                result.resultMsg = "浠诲姟涓嶅瓨鍦�;
+            }
+            return result;
+        }
+
+        internal static SimpleResultModel BindingTrayCode(BindingTrayCodeModel model)
+        {
+            var result = new SimpleResultModel { success = false };
+            var db = new SqlHelper<object>().GetInstance();
+            if (!string.IsNullOrEmpty(model.location) && !string.IsNullOrEmpty(model.TrayInfo))
+            {
+                var locinfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == model.location).First();
+                if (locinfo != null)
+                {
+                    var info = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == model.location && a.S_CNTR_CODE == model.TrayInfo).First();
+                    if (info == null)
+                    {
+                        locinfo.N_CURRENT_NUM++;
+                        if (locinfo.N_CURRENT_NUM <= locinfo.N_CAPACITY)
+                        {
+                            var cntrinfo = new LocCntrRel { S_LOC_CODE = model.location, S_CNTR_CODE = model.TrayInfo };
+                            db.Insertable<LocCntrRel>(cntrinfo).ExecuteCommand();
+                            db.Updateable<Location>(locinfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand();
+                            result.success = true;
+                            result.errCode = 0;
+                        }
+                        else
+                        {
+                            result.errCode = -2;
+                            result.errMsg = "褰撳墠鏁伴噺瓒呰繃鏈�ぇ瀹归噺 涓嶅厑璁哥粦瀹�;
+                        }
+
+                    }
+                    else
+                    {
+                        result.errCode = -2;
+                        result.errMsg = "璐т綅瀹瑰櫒琛ㄤ腑璇ョ珯鐐瑰凡缁戝畾璇ユ墭鐩�;
+                    }
+                }
+                else
+                {
+                    result.errCode = -1;
+                    result.errMsg = "閿欒鐨勮揣浣嶇紪鐮�;
+                }
+            }
+            else
+            {
+                result.errCode = -1;
+                result.errMsg = "鍙傛暟涓嶈兘涓虹┖";
+            }
+
+            return result;
+        }
+
+
+        /// <summary>
+        /// 绌烘墭缁戝畾瑙g粦鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResultModel EmptyLocaBindAUnBind(EmptyLocaBindAUnBindModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 };
+            string msg = "";
+            if (!string.IsNullOrEmpty(model.Location))
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                var locInfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == model.Location).First();
+                if (locInfo != null)
+                {
+                    if (model.BindState == "1")
+                    {
+                        var firstLocInfo = db.Queryable<Location>().Where(a => a.N_ROW == locInfo.N_ROW.Trim()).OrderBy(a => a.N_COL).Take(1).First();
+                        if (firstLocInfo != null)
+                        {
+                            string note = string.IsNullOrEmpty(firstLocInfo.S_NOTE) ? "" : firstLocInfo.S_NOTE.Trim();
+                            if (string.IsNullOrEmpty(note))
+                            {
+                                locInfo.N_CURRENT_NUM = locInfo.N_CAPACITY;
+                                //locInfo.S_NOTE = model.BindType;
+                                db.Updateable(locInfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand();
+                                result.success = true; result.errCode = 0; msg = $"绌烘墭缁戝畾瑙g粦鎺ュ彛:璐т綅锛歿model.Location}锛岀粦瀹氾細鎴愬姛锛�;
+                            }
+                            else msg = $"绌烘墭缁戝畾瑙g粦鎺ュ彛:涓庡綋鍓嶅簱浣嶏細{locInfo.N_ROW.Trim()}宸插瓨鏀炬墭鐩樼被鍨嬩笉鍖归厤锛�;
+                        }
+                    }
+                    else if (model.BindState == "2")
+                    {
+                        locInfo.N_CURRENT_NUM = 0;
+                        //locInfo.S_NOTE = "";
+                        db.Updateable(locInfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand();
+                        result.success = true; result.errCode = 0; msg = $"绌烘墭缁戝畾瑙g粦鎺ュ彛:璐т綅锛歿model.Location}锛岃В缁戯細鎴愬姛锛�;
+                    }
+                }
+                else msg = $"绌烘墭缁戝畾瑙g粦鎺ュ彛:鏈煡鍒拌揣浣嶇紪鐮佷负锛歿model.Location}鐨勮揣浣嶄俊鎭紒";
+            }
+            else msg = $"绌烘墭缁戝畾瑙g粦鎺ュ彛:浼犺緭鏁版嵁寮傚父锛岃揣浣嶇紪鐮佷负绌猴紒";
+            LogHelper.Info("EmptyLocaBindAUnBind Dispose锛� + msg, "ThirdSystemLog");
+            result.errMsg = msg;
+            return result;
+        }
+
+        internal static SimpleResultModel BindingItemCode(BindingItemCodeModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 };
+            var db = new SqlHelper<object>().GetInstance();
+            if (!string.IsNullOrEmpty(model.TrayInfo) && !string.IsNullOrEmpty(model.Location))
+            {
+                var locinfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == model.Location).First();
+                if (locinfo != null)
+                {
+                    if (locinfo.N_CURRENT_NUM < locinfo.N_CAPACITY)
+                    {
+                        locinfo.N_CURRENT_NUM = locinfo.N_CURRENT_NUM + 1;
+                        db.Updateable(locinfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand();
+                        var cntrinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == model.TrayInfo).First();
+                        if (cntrinfo == null)
+                        {
+                            LocCntrRel info = new LocCntrRel { S_CNTR_CODE = model.TrayInfo, S_LOC_CODE = model.Location };
+                            db.Insertable(info).ExecuteCommand();
+                            var iteminfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == model.TrayInfo).First();
+                            if (iteminfo == null)
+                            {
+                                IntensiveArea.BindCntrItem(model.TrayInfo, model.ItemCode, model.BatchNo);
+                                result.success = true;
+                                result.errCode = 0;
+                            }
+                            else
+                            {
+                                result.errMsg = "鐗╂枡琛ㄤ腑宸叉湁璇ユ墭鐩樼墿鏂欎俊鎭�璇锋鏌ユ墭鐩樺彿鎴栧凡閲嶅缁戝畾";
+                            }
+                        }
+                        else
+                        {
+                            result.errMsg = "璇ユ墭鐩樺凡缁戝畾,璇风‘瀹氭墭鐩樺彿鏄惁姝g‘";
+                        }
+                    }
+                    else
+                    {
+                        result.errMsg = "璇ヨ揣浣嶆暟閲忓ぇ浜庣瓑浜庡閲�;
+                    }
+                }
+                else
+                {
+                    result.errMsg = "绔欑偣缂栫爜寮傚父";
+                }
+            }
+            else
+            {
+                result.errMsg = "鎵樼洏鍙蜂笉鑳戒负绌�;
+            }
+
+            return result;
+        }
+
+        internal static SimpleResultModel FuWeiInfo(FuWeiInfomodel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { success = false, errCode = -1 };
+            if (!string.IsNullOrEmpty(model.deviceName))
+            {
+                var info = Settings.GetDeviceInfoList().Where(a => a.deviceName == model.deviceName).FirstOrDefault();
+                if (info != null)
+                {
+                    if (string.IsNullOrEmpty(model.location))
+                    {
+                        //鐩存帴鍙戦�PLC娑堟伅
+                        PlcHelper.SendHex(info.address, "3F00100D0A");
+                    }
+                    else
+                    {
+                        //鍖归厤涓嬩欢鍙e彂閫佸搴旂殑PLC娑堟伅
+                        if (info.location[0] == model.location)
+                        {
+                            PlcHelper.SendHex(info.address, "3F00100D0A");
+                        }
+                        else
+                        {
+                            PlcHelper.SendHex(info.address, "3F00200D0A");
+                        }
+                    }
+                    result.success = true;
+                    result.errCode = 0;
+                }
+                else result.errMsg = $"浜х嚎鍙穥model.deviceName}寮傚父 閰嶇疆鏂囦欢鎵句笉鍒拌浜х嚎鍙�;
+            }
+            else result.errMsg = "浜х嚎鍙蜂笉鑳戒负绌�;
+            return result;
+        }
+
+
+
+        /// <summary>
+        /// Mobox寮哄埗瀹屾垚浠诲姟
+        /// </summary>
+        /// <param name="model"></param>
+        /// <param name="result"></param>
+        /// <returns></returns>
+        internal static SimpleResult MoboxCompleteTask(MoboxTaskBase model, SimpleResult result)
+        {
+            var task = TaskHelper.GetTask(model.TaskNo);
+            if (task != null)
+            {
+                if (!TaskHelper.CheckActionRecordExist(task.S_TASK_NO, "1"))
+                {
+                    result.resultMsg = "浠诲姟鏈墽琛岋紝涓嶅厑璁稿己鍒跺畬鎴愶紒";
+                    result.resultCode = 1;
+                }
+                else
+                if (TaskHelper.CheckActionRecordExist(task.S_TASK_NO, "4") && task.S_TYPE.Trim() != "鍙栨秷" && task.S_TYPE.Trim() != "澶辫触" && task.S_TYPE.Trim() != "瀹屾垚")
+                {
+                    //宸叉帹閫佷絾鏄病鏈夊畬鎴愭垨鑰呭彇娑堬紝閫氱煡hosttoagv
+                    result.resultMsg = "浠诲姟瀹屾垚宸茬粡鍙戦�缁欏皬杞�;
+                    TaskHelper.UpdateStatus(model.TaskNo.Trim(), "瀹屾垚");
+                    NDCHelper.Cancel(task.S_TASK_NO.Trim());
+                    TaskProcess.TaskCanCelOrComplete(task, false);
+                    TaskProcess.TASK_STATUSFunc(task);
+                    TaskProcess.GeneralInterFaceFunc(task, "2");
+                }
+                else if (!TaskHelper.CheckActionRecordExist(task.S_TASK_NO, "4") && task.S_TYPE.Trim() != "鍙栨秷" && task.S_TYPE.Trim() != "澶辫触" && task.S_TYPE.Trim() != "瀹屾垚")
+                {
+                    //宸叉帹閫佷絾鏄病鏈夊畬鎴愭垨鑰呭彇娑堬紝閫氱煡hosttoagv
+                    result.resultMsg = "浠诲姟鍙栨秷宸茬粡鍙戦�缁欏皬杞�;
+                    TaskHelper.UpdateStatus(model.TaskNo.Trim(), "鍙栨秷");
+                    NDCHelper.Cancel(task.S_TASK_NO.Trim());
+                    //TaskProcess.TaskCanCelOrComplete(task, false);
+                    //TaskProcess.TASK_STATUSFunc(task);
+                    TaskProcess.OperateStatus(task, 7);
+                    TaskProcess.GeneralInterFaceFunc(task, "7");
+                }
+                else
+                {
+                    result.resultCode = 1;
+                    result.resultMsg = "浠诲姟宸茬粨鏉�;
+                }
+            }
+            else
+            {
+                result.resultCode = 1;
+                result.resultMsg = "浠诲姟涓嶅瓨鍦�;
+            }
+            return result;
+        }
+
+        internal static SimpleResult WeiTuo(MoboxTaskBase model)
+        {
+            var result = new SimpleResult();
+            var db = new SqlHelper<object>().GetInstance();
+            var task = TaskHelper.GetTask(model.TaskNo);
+            if (task != null)
+            {
+                NDCHelper.Cancel(task.S_TASK_NO.Trim());
+                result.resultMsg = "浠诲姟鍙栨秷宸茬粡鍙戦�缁欏皬杞�;
+                result.resultCode = 0;
+                TaskHelper.UpdateStatus(model.TaskNo.Trim(), "鍙栨秷");
+                //TaskProcess.OperateStatus(task, 7);
+                //TaskProcess.TaskCanCelOrComplete(task);
+                TaskProcess.GeneralInterFaceFunc(task, "7");
+                //IntensiveArea.ULlock(task.S_END_LOC);
+                //瑙g粦璧风偣鎵樼洏
+                //var trayInfoList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == task.S_START_LOC).ToList();
+                var trayInfoList = task.S_CNTRS.Split(',').ToList();
+                if (trayInfoList.Count() > 0)
+                {
+                    trayInfoList.ForEach(a =>
+                    {
+                        db.Deleteable<LocCntrRel>().Where(b => b.S_CNTR_CODE == a).ExecuteCommand();
+                        db.Deleteable<CntrItemRel>().Where(b => b.S_CNTR_CODE == a).ExecuteCommand();
+                    });
+                }
+                LocationHelper.UnLockLoc(task.S_START_LOC);
+                LocationHelper.UnLockLoc(task.S_END_LOC, task.S_TYPE);
+
+            }
+            else
+            {
+                result.resultMsg = "璇ヤ换鍔″彿涓嶅瓨鍦�;
+                result.resultCode = -1;
+            }
+
+            return result;
+        }
+
+        internal static SimpleResultModel BHYiKuworkinfo(YiKuworkinfomodel model)
+        {
+            string endloc = "";
+            int yikunum = 0;
+            SimpleResultModel result = new SimpleResultModel { success = false };
+            var db = new SqlHelper<WorkOrder>().GetInstance();
+            if (!string.IsNullOrEmpty(model.S_WorkNo))
+            {
+                var info = db.Queryable<WorkOrder>().Where(a => a.S_WorkNo == model.S_WorkNo).First();
+                if (info == null)
+                {
+                    var rowlist = db.Queryable<Location>()
+                        .Where(a => a.S_AREA_CODE == model.S_EndLoca && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "鏃�)
+                        .PartitionBy(a => a.N_ROW)
+                        .Take(1)
+                        .ToList();
+                    foreach (var item in rowlist)
+                    {
+                        endloc = endloc + item.N_ROW + ",";
+                    }
+
+                    if (model.S_YiKuNum == 0)
+                    {
+                        yikunum = 9999;
+                    }
+                    else
+                    {
+                        yikunum = model.S_YiKuNum;
+                    }
+
+                    WorkOrder wmsTask = new WorkOrder()
+                    {
+                        S_WorkNo = model.S_WorkNo,
+                        //S_PLineNo = model.DeviceName,
+                        //S_UsingNo = "N",
+                        S_ORDER_TYPE = "澶囪揣绉诲簱",
+                        S_ItemCode = model.S_ItemCode,
+                        S_WorkState = model.S_WorkState,
+                        S_StartLoca = model.S_StartLoca,
+                        S_EndLoca = endloc,
+                        S_YiKuNum = yikunum,
+                        S_BatchNo = model.S_BatchNo
+                        //S_Modify = model.WorkTime
+                    };
+                    WCSHelper.DaMingShanInsertWork(wmsTask);
+                    result.success = true;
+                    result.errMsg = $"宸ュ崟淇℃伅鎺ユ敹鎴愬姛锛屽伐鍗曞凡鍒涘缓锛�;
+                }
+                else
+                {
+                    result.errMsg = "宸ュ崟鍙烽噸澶�宸ュ崟琛ㄤ腑鏈夌浉鍚岀殑鏁版嵁";
+                    result.errCode = -2;
+                }
+            }
+            else
+            {
+                result.errMsg = "宸ュ崟鍙蜂笉鑳戒负绌�;
+                result.errCode = -1;
+            }
+
+
+            return result;
+        }
+
+
+        internal static SimpleResultModel YiKuworkinfo(YiKuworkinfomodel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { success = false };
+            var db = new SqlHelper<WorkOrder>().GetInstance();
+            if (!string.IsNullOrEmpty(model.S_WorkNo))
+            {
+                var info = db.Queryable<WorkOrder>().Where(a => a.S_WorkNo == model.S_WorkNo).First();
+                if (info == null)
+                {
+                    WorkOrder wmsTask = new WorkOrder()
+                    {
+                        S_WorkNo = model.S_WorkNo,
+                        //S_PLineNo = model.DeviceName,
+                        //S_UsingNo = "N",
+                        S_ORDER_TYPE = "浜哄伐绉诲簱",
+                        S_ItemCode = model.S_ItemCode,
+                        S_WorkState = model.S_WorkState,
+                        S_StartLoca = model.S_StartLoca,
+                        S_EndLoca = model.S_EndLoca,
+                        S_YiKuNum = model.S_YiKuNum,
+                        S_BatchNo = model.S_BatchNo
+                        //S_Modify = model.WorkTime
+                    };
+                    WCSHelper.DaMingShanInsertWork(wmsTask);
+                    result.success = true;
+                    result.errMsg = $"宸ュ崟淇℃伅鎺ユ敹鎴愬姛锛屽伐鍗曞凡鍒涘缓锛�;
+                }
+                else
+                {
+                    result.errMsg = "宸ュ崟鍙烽噸澶�宸ュ崟琛ㄤ腑鏈夌浉鍚岀殑鏁版嵁";
+                    result.errCode = -2;
+                }
+            }
+            else
+            {
+                result.errMsg = "宸ュ崟鍙蜂笉鑳戒负绌�;
+                result.errCode = -1;
+            }
+
+
+            return result;
+        }
+
+        /// <summary>
+        /// 鏃犵爜妯″紡-浜哄伐鍒嗘嫞鍑哄簱鎺ュ彛瑙g粦鎵樼洏
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResultModel NoCodeUnbindingTrayCode(NoCodeUnbindingTrayCodeModel model)
+        {
+            var result = new SimpleResultModel { success = false, errCode = -1 };
+            string msg = ""; string locCode = ""; string areaCode = "";
+            var db = new SqlHelper<object>().GetInstance();
+            if (!string.IsNullOrEmpty(model.RowNo) && !string.IsNullOrEmpty(model.LockState))
+            {
+                var rowinfo = db.Queryable<Location>().Where(a => a.N_ROW == model.RowNo && (a.S_LOCK_STATE.Trim() == "鍏ュ簱閿� || a.S_LOCK_STATE.Trim() == "绉诲簱閿� || a.S_LOCK_STATE.Trim() == "鍑哄簱閿�)).First();
+                if (rowinfo == null)
+                {
+                    if (model.LockState == "1")
+                    {
+                        //var rowInfo = db.Queryable<RowLock>().Where(a => a.N_ROW == model.RowNo).First();
+                        //if (rowInfo != null)
+                        //{
+                        //    TaskController.Monitor.YiKuUnLockRow(db, model.RowNo.Trim(), rowInfo.S_AREA_CODE.Trim(), false);
+                        var locInfo = db.Queryable<Location>().Where(a => a.N_ROW == model.RowNo.Trim()).ToList();
+                        if (locInfo.Count() > 0)
+                        {
+                            locInfo.ForEach(a =>
+                            {
+                                if (a.S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                {
+                                    a.S_LOCK_STATE = "鍏朵粬閿�;
+                                    db.Updateable(a).UpdateColumns(b => new { b.S_LOCK_STATE }).ExecuteCommand();
+                                }
+                            });
+                        }
+                        result.success = true;
+                        result.errCode = 0;
+                        // }
+                    }
+                    else if (model.LockState == "2")
+                    {
+                        var locInfoList = db.Queryable<Location>().Where(a => a.N_ROW == model.RowNo.Trim()).ToList();
+                        if (locInfoList.Count > 0)
+                        {
+                            for (int i = 0; i < locInfoList.Count; i++)
+                            {
+                                if (locInfoList[i].S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                {
+                                    areaCode = locInfoList[i].S_AREA_CODE.Trim();
+                                    locCode = locInfoList[i].S_LOC_CODE.Trim();
+                                    var locInfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == locCode).First();
+                                    //if (model.IsDelete == "1")
+                                    //{
+                                    //    var trayInfoList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).ToList();
+                                    //    if (trayInfoList.Count() > 0)
+                                    //    {
+                                    //        trayInfoList.ForEach(a =>
+                                    //        {
+                                    //            db.Deleteable<LocCntrRel>().Where(b => b.S_CNTR_CODE == a.S_CNTR_CODE.Trim()).ExecuteCommand();
+                                    //            db.Deleteable<CntrItemRel>().Where(b => b.S_CNTR_CODE == a.S_CNTR_CODE.Trim()).ExecuteCommand();
+                                    //        });
+                                    //    }
+                                    //    locInfo.N_CURRENT_NUM = 0;
+                                    //}
+                                    //else if(model.IsDelete=="3") 
+                                    //{
+                                    //    locInfo.N_CURRENT_NUM = locInfo.N_CAPACITY;
+                                    //}
+                                    locInfo.S_LOCK_STATE = "鏃�;
+                                    db.Updateable(locInfo).UpdateColumns(a => new { a.S_LOCK_STATE }).ExecuteCommand();
+                                }
+                            }
+                            result.success = true;
+                            result.errCode = 0;
+                            //TaskController.Monitor.YiKuUnLockRow(db, model.RowNo, areaCode);
+                        }
+                    }
+                    else if (model.LockState == "3")
+                    {
+                        var locInfoList = db.Queryable<Location>().Where(a => a.N_ROW == model.RowNo.Trim()).ToList();
+                        if (locInfoList.Count > 0)
+                        {
+                            for (int i = 0; i < locInfoList.Count; i++)
+                            {
+                                if (locInfoList[i].S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                {
+                                    areaCode = locInfoList[i].S_AREA_CODE.Trim();
+                                    locCode = locInfoList[i].S_LOC_CODE.Trim();
+                                    var locInfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == locCode).First();
+
+                                    //if (model.IsDelete == "1")
+                                    //{
+                                    //    var trayInfoList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).ToList();
+                                    //    if (trayInfoList.Count() > 0)
+                                    //    {
+                                    //        trayInfoList.ForEach(a =>
+                                    //        {
+                                    //            db.Deleteable<LocCntrRel>().Where(b => b.S_CNTR_CODE == a.S_CNTR_CODE.Trim()).ExecuteCommand();
+                                    //            db.Deleteable<CntrItemRel>().Where(b => b.S_CNTR_CODE == a.S_CNTR_CODE.Trim()).ExecuteCommand();
+                                    //        });
+                                    //    }
+                                    //    locInfo.N_CURRENT_NUM = 0;
+                                    //}
+                                    //else if(model.IsDelete=="3") 
+                                    //{
+                                    locInfo.N_CURRENT_NUM = locInfo.N_CAPACITY;
+                                    //}
+                                    //locInfo.S_LOCK_STATE = "鏃�;
+                                    db.Updateable(locInfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand();
+                                }
+                            }
+                            result.success = true;
+                            result.errCode = 0;
+                            //TaskController.Monitor.YiKuUnLockRow(db, model.RowNo, areaCode);
+                        }
+                    }
+                    else if (model.LockState == "4")
+                    {
+                        var locInfoList = db.Queryable<Location>().Where(a => a.N_ROW == model.RowNo.Trim()).ToList();
+                        if (locInfoList.Count > 0)
+                        {
+                            for (int i = 0; i < locInfoList.Count; i++)
+                            {
+                                if (locInfoList[i].S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                {
+                                    areaCode = locInfoList[i].S_AREA_CODE.Trim();
+                                    locCode = locInfoList[i].S_LOC_CODE.Trim();
+                                    var locInfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == locCode).First();
+
+                                    //if (model.IsDelete == "1")
+                                    //{
+                                    var trayInfoList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).ToList();
+                                    if (trayInfoList.Count() > 0)
+                                    {
+                                        trayInfoList.ForEach(a =>
+                                        {
+                                            db.Deleteable<LocCntrRel>().Where(b => b.S_CNTR_CODE == a.S_CNTR_CODE.Trim()).ExecuteCommand();
+                                            db.Deleteable<CntrItemRel>().Where(b => b.S_CNTR_CODE == a.S_CNTR_CODE.Trim()).ExecuteCommand();
+                                        });
+                                    }
+                                    locInfo.N_CURRENT_NUM = 0;
+                                    //}
+                                    //else if(model.IsDelete=="3") 
+                                    //{
+                                    //locInfo.N_CURRENT_NUM = locInfo.N_CAPACITY;
+                                    //}
+                                    //locInfo.S_LOCK_STATE = "鏃�;
+                                    db.Updateable(locInfo).UpdateColumns(a => new { a.N_CURRENT_NUM }).ExecuteCommand();
+                                }
+                            }
+                            result.success = true;
+                            result.errCode = 0;
+                            //TaskController.Monitor.YiKuUnLockRow(db, model.RowNo, areaCode);
+                        }
+                    }
+                }
+                else
+                {
+                    msg = "璇ユ帓鏈夊叆搴撻攣鎴栫Щ搴撻攣锛屼笉浜堢粦瀹氳В缁�;
+                }
+            }
+            else if (!string.IsNullOrEmpty(model.Location) && !string.IsNullOrEmpty(model.LockState))
+            {
+                var locinfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == model.Location && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                if (locinfo != null)
+                {
+                    if (model.LockState == "5")
+                    {
+                        if (locinfo.S_LOCK_STATE != "鎶ュ簾")
+                        {
+                            locinfo.N_CURRENT_NUM = locinfo.N_CAPACITY;
+                            db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
+                            LocCntrRel info = new LocCntrRel { S_LOC_CODE = locinfo.S_LOC_CODE, S_CNTR_CODE = model.TrayNo, S_TRAY_TYPE = model.Type };
+                            db.Insertable(info).ExecuteCommand();
+                            result.success = true;
+                            result.errCode = 0;
+                        }
+                        else
+                        {
+                            msg = "璇ヨ揣浣嶇姸鎬佷负鎶ュ簾 涓嶅厑璁哥粦瀹氭搷浣�;
+                        }
+                    }
+                    if (model.LockState == "6")
+                    {
+                        locinfo.N_CURRENT_NUM = 0;
+                        db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
+                        db.Deleteable<LocCntrRel>().Where(a => a.S_LOC_CODE == locinfo.S_LOC_CODE).ExecuteCommand();
+                        result.success = true;
+                        result.errCode = 0;
+                    }
+                }
+                else
+                {
+                    msg = "璇ヨ揣浣嶇姸鎬佸紓甯革紝涓嶄簣缁戝畾瑙g粦";
+                }
+            }
+            else msg = $"MOBOX浼犺緭鏁版嵁寮傚父锛佷紶杈撲负绌哄�锛�;
+            result.errMsg = msg;
+            LogHelper.Info("NoCodeUnbindingTrayCode Dispose锛� + result.errMsg, "ThirdSystemLog");
+            return result;
+        }
+        #endregion
+
+        #region   椤圭洰瀹氬埗
+
+        #region   瑗块棬瀛愭帴鍙e疄鐜扮被
+        /// <summary>
+        /// 寮哄埗鍏呯數鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResultModel ForcedCharging(OtherModel.ForcedChargingModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { errCode = -1 };
+            try
+            {
+                bool charge = NDCHelper.SendChargeTask(model.agvNo);
+                if (charge)
+                {
+                    result.errCode = 0;
+                    result.errMsg = "鎺ㄩ�灏忚溅鍏呯數鎴愬姛锛�;
+                    result.success = true;
+                }
+                else
+                {
+                    result.errMsg = "鎺ㄩ�灏忚溅鍏呯數澶辫触锛�;
+                    result.success = false;
+                }
+            }
+            catch
+            {
+                result.errMsg = "鎺ㄩ�灏忚溅鍏呯數澶辫触,鏈煡璇㈠埌杞﹀彿锛�;
+                result.success = false;
+            }
+
+            return result;
+        }
+        /// <summary>
+        /// 鍙栨秷浠诲姟鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResultModel CancelTask(CancelTaskModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { errCode = -1, success = false };
+
+            var task = TaskHelper.GetTaskBySrcNo(model.taskNo);
+            if (task != null)
+            {
+                if (task.S_B_STATE.Trim() == "鏈墽琛�)
+                {
+                    //鏈墽琛岀洿鎺ヤ慨鏀圭姸鎬佷负鍙栨秷
+                    TaskHelper.UpdateStatus(task.S_TASK_NO, "鍙栨秷");
+                    result.success = true;
+                    result.errCode = 0;
+                    result.errMsg = "浠诲姟鏈墽琛岋紝鍙栨秷鎴愬姛";
+                }
+                else if (task.S_B_STATE.Trim() != "鍙栨秷" && task.S_B_STATE.Trim() != "瀹屾垚")
+                {
+                    //宸叉帹閫佷絾鏄病鏈夊畬鎴愭垨鑰呭彇娑堬紝閫氱煡hosttoagv
+                    NDCHelper.Cancel(task.S_TASK_NO.Trim());
+                    result.success = true;
+                    result.errCode = 0;
+                    result.errMsg = "浠诲姟鍙栨秷宸茬粡鍙戦�缁欏皬杞�;
+                }
+                else result.errMsg = "浠诲姟宸茬粨鏉�;
+            }
+            else result.errMsg = "浠诲姟涓嶅瓨鍦�;
+
+            return result;
+        }
+        /// <summary>
+        /// 璋冩暣浼樺厛绾ф帴鍙�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResultModel SetPriority(SetPriorityModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { success = true, errCode = -1 };
+            var taskPriority = TaskHelper.GetTaskBySrcNo(model.taskNo);
+            if (taskPriority != null)
+            {
+                if (taskPriority.S_B_STATE == "鏈墽琛� || taskPriority.S_B_STATE == "寰呮帹閫� || taskPriority.S_B_STATE == "宸叉帹閫�)
+                {
+                    TaskHelper.UpdatePriority(taskPriority.S_TASK_NO, int.Parse(model.priority));//鏇存敼琛ㄦ暟鎹�+                    //if (taskPriority.S_B_STATE == "宸叉帹閫�) ;
+                    result.errCode = 0;
+                    result.errMsg = $"鏇存敼浼樺厛绾ф垚鍔燂紒浠诲姟鍙凤細{model.taskNo}";
+                    result.success = true;
+                }
+                else
+                {
+                    result.errMsg = $"鏇存敼浼樺厛绾уけ璐ワ紝褰撳墠浠诲姟宸叉墽琛岋紒浠诲姟鍙凤細{model.taskNo}";
+                    result.success = false;
+                }
+            }
+            else
+            {
+                result.errMsg = $"鏇存敼浼樺厛绾уけ璐ワ紝褰撳墠浠诲姟宸茬粡鎵ц瀹屾瘯鎴栧彇娑堬紒浠诲姟鍙凤細{model.taskNo}";
+                result.success = false;
+            }
+            LogHelper.Debug("SetPriority Request锛� + JsonConvert.SerializeObject(result));
+            return result;
+        }
+        /// <summary>
+        /// 鍒涘缓浠诲姟鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        internal static SimpleResultModel AddTask(OtherModel.AddTaskModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel { errCode = 0 };
+            bool req = false;
+            //string trayCodeType = ProcessHelper.GetTrayCode(model.trayCode);//鑾峰彇鎵樼洏绫诲瀷-瀵瑰簲鏉弶鎻愪緵鍙傛暟
+            //鏉ユ簮鍙峰垽鏂槸鍚﹀瓨鍦�+            if (!TaskHelper.CheckExistSrc(model.taskNo))
+            {
+                if (LocationHelper.CheckExist(model.startBit) && LocationHelper.CheckExist(model.endBit))
+                {
+                    req = TaskHelper.CreateTask(model.taskNo, model.startBit, model.endBit, model.taskType, 99, model.trayCode);
+                }
+                if (req == false)
+                {
+                    result.errCode = -1;
+                    result.success = false;
+                    result.errMsg = "鍒涘缓浠诲姟澶辫触";
+                }
+                else
+                {
+                    result.errCode = 0;
+                    result.success = true;
+                    result.errMsg = "鍒涘缓鎴愬姛";
+                }
+            }
+            else
+            {
+                result.errCode = -1;
+                result.success = false;
+                result.errMsg = "浠诲姟宸插瓨鍦紝鏃犳硶鍐嶆鍒涘缓锛�;
+            }
+            return result;
+        }
+        #endregion
+
+
+        #endregion
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/ApiService/ApiModel.cs b/HH.WCS.NongFuChaYuan/ApiService/ApiModel.cs
new file mode 100644
index 0000000..b57c993
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/ApiService/ApiModel.cs
@@ -0,0 +1,421 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.ApiService
+{
+    /// <summary>
+    /// 閫氱敤model
+    /// </summary>
+    public class ApiModel
+    {
+        #region   鏍囧噯妯″瀷
+        /// <summary>
+        /// 鏍囧噯鐘舵�杩斿洖鎺ュ彛
+        /// </summary>
+        public class SimpleResultModel
+        {
+            public bool success { get; set; }
+            public int errCode { get; set; }
+            public string errMsg { get; set; } = "";
+        }
+        #endregion
+
+        #region     hosttoagv-瀹炰綋妯″瀷
+        /// <summary>
+        /// 杩斿洖缁檋osttoagv
+        /// </summary>
+        public class ReturnResult
+        {
+            public int ResultCode { get; set; }
+            public string ResultMsg { get; set; }
+        }
+        /// <summary>
+        /// hosttoagv涓婃姤浠诲姟鐘舵�
+        /// </summary>
+        public class AgvTaskState
+        {
+            public int State { get; set; }
+            public string No { get; set; }
+            public string ForkliftNo { get; set; }
+            public string ErrCode { get; set; }
+            public string LockNo { get; set; }
+            public string Ext1 { get; set; }
+            public string Ext2 { get; set; }
+            public string N_CNTR_COUNT { get; set; }
+            public string ExtData { get; set; }
+        }
+        /// <summary>
+        /// hosttoagv涓婃姤杞﹁締鐘舵�锛堝弬鏁板湪hosttoagv鏈嶅姟閰嶇疆锛屽彲淇敼锛�+        /// </summary>
+        public class AgvDeviceStatus
+        {
+            public string forkliftNo { get; set; } = "";
+            public string errCode { get; set; } = "";
+            public string errCode2 { get; set; } = "";
+            public string faildCode { get; set; } = "";
+            public string xPos { get; set; } = "";
+            public string yPos { get; set; } = "";
+            public string battery { get; set; } = "";
+            public string detail { get; set; } = "";
+            public string infoType { get; set; } = "";
+            public string inMapRoute { get; set; } = "";
+            public string CumInfo { get; set; } = "";
+            public string agvCurrTaskInfo { get; set; } = "";
+            /// <summary>
+            /// 1----鎵嬪姩 锛�----鍗婅嚜鍔�锛�3----鑷姩
+            /// </summary>
+            public string AutoMode { get; set; } = "";
+            /// <summary>
+            /// 0----鏈厖鐢�锛�----鍏呯數鐘舵�
+            /// </summary>
+            public string chargedstate { get; set; } = "";
+        }
+        /// <summary>
+        /// hosttoagv涓婃姤鍏跺畠浜嬩欢淇℃伅
+        /// </summary>
+        public class AgvEventInfo
+        {
+            public int Code { get; set; }
+            public string CarID { get; set; }
+            public string Param1 { get; set; }
+            public string Param2 { get; set; }
+            public string Param3 { get; set; }
+        }
+        #endregion
+
+        #region     mobox-瀹炰綋妯″瀷
+        public class AddTaskModel
+        {
+            public string StartBit { get; set; }
+            public string EndBit { get; set; }
+            public string ItemCode { get; set; }
+            public string TrayCode { get; set; }
+        }
+
+        /// <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>
+    /// 椤圭洰璁㈠埗model
+    /// </summary>
+    public class OtherModel
+    {
+        #region   鑻忓窞瑗块棬瀛�+        public class AddTaskModel
+        {
+            public string taskNo { get; set; }
+            public string startBit { get; set; }
+            public string endBit { get; set; }
+            public int priority { get; set; }
+            public string taskType { get; set; }
+            public string trayCode { get; set; }
+        }
+        public class SetPriorityModel
+        {
+            public string taskNo { get; set; }
+            public string priority { get; set; }
+        }
+        public class CancelTaskModel
+        {
+            public string taskNo { get; set; }
+        }
+        public class ForcedChargingModel
+        {
+            public string agvNo { get; set; }
+        }
+        #endregion
+
+        #region   鍐滃か娣冲畨--瀵屽嫆WMS
+        /// <summary>
+        /// 宸ュ崟淇℃伅鎺ュ彛
+        /// </summary>
+        public class TASK_WorkInfoModel
+        {
+            public string WorkNo { get; set; }
+            public string DeviceName { get; set; }
+            public string ItemCode { get; set; }
+            /// <summary>
+            /// 宸ュ崟寮�鏃堕棿
+            /// </summary>
+            public string WorkTime { get; set; }
+            /// <summary>
+            /// 宸ュ崟鐘舵�--1-鏂板缓  2-瀹屾垚
+            /// </summary>
+            public string WorkState { get; set; }
+        }
+        /// <summary>
+        /// 鎵樼洏淇℃伅涓嬪彂鎺ュ彛
+        /// </summary>
+        public class SendTrayCodeModel
+        {
+            public List<TrayInfo> TrayInfo { get; set; }
+        }
+        public class TrayInfo
+        {
+            /// <summary>
+            /// 浜х嚎鍙�+            /// </summary>
+            public string deviceName { get; set; }
+            /// <summary>
+            /// 宸ュ崟鍙�+            /// </summary>
+            public string workNo { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�+            /// </summary>
+            public string trayCode { get; set; }
+            /// <summary>
+            /// 鎵樼洏鏁伴噺
+            /// </summary>
+            public string trayNum { get; set; }
+            /// <summary>
+            /// 瀵屽嫆鎺ユ敹鍒版墭鐩樼爜鐨勬椂闂�+            /// </summary>
+            public string dateTime { get; set; }
+            /// <summary>
+            /// 鎵规鍙�-鍚屾爣鍑嗘墭瑙�+            /// </summary>
+            public string batchNo { get; set; } = "";
+            /// <summary>
+            /// 鏍囧噯鎵樿
+            /// --鎴愬搧涓嬬嚎锛氬洜瀛樺湪涓�鍒囨崲 鐢熶骇鐗╂枡 鍔ㄤ綔锛涘洜姝ゅ皢 鎵规鍙枫�鐗╂枡灞傞珮浠ュ強鎵樿 瀛樺湪浜庣墿鏂欎俊鎭帴鍙�+            /// --涓嶄竴瀹氭瘡娆¢兘鏈夊�锛屽綋棣栨鎵樿涓�trayNum 鐩稿悓鏃讹紝闇�洿鏂拌嚦 Mobox 宸ュ崟瀵瑰簲瀛楁
+            /// --鍚庣画鏀跺埌鎵樿鏃讹紝鍏堝垽鏂綋鍓嶇墿鏂欐墭瑙�涓�宸ュ崟鎵樿鏄惁鐩稿悓锛屼笉鍚屽嵆浠h〃鎹㈢墿鏂欎簡
+            /// </summary>
+            public string trayRule { get; set; } = "";
+            /// <summary>
+            /// 鐗╂枡灞傞珮-6銆�銆�--鍚屾爣鍑嗘墭瑙�+            /// </summary>
+            public string itemLayer { get; set; } = "";
+        }
+        /// <summary>
+        /// 浜哄伐鍒嗘嫞瑙g粦鎵樼洏鎺ュ彛
+        /// </summary>
+        public class UnbindingTrayCodeModel
+        {
+            public string[] TrayInfo { get; set; }
+        }
+
+
+        public class BindingTrayCodeModel
+        {
+            public string location { get; set; }
+            public string TrayInfo { get; set; }
+        }
+
+        public class BindingItemCodeModel
+        {
+            /// <summary>
+            /// 绔欑偣缂栫爜
+            /// </summary>
+            public string Location { get; set; }
+            /// <summary>
+            /// 鎵樼洏鍙�+            /// </summary>
+            public string TrayInfo { get; set; }
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string ItemCode { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string BatchNo { get; set; }
+        }
+
+        /// <summary>
+        /// 鏃犵爜鍏ュ簱-浜哄伐鍒嗘嫞瑙g粦鎵樼洏鎺ュ彛
+        /// </summary>
+        public class NoCodeUnbindingTrayCodeModel
+        {
+            /// <summary>
+            /// 鎵樼洏鍙�+            /// </summary>
+            public string TrayNo { get; set; } = "";
+            /// <summary>
+            /// 鎵樼洏绫诲瀷
+            /// </summary>
+            public string Type { get; set; } = "";
+            public string Location { get; set; } = "";
+            /// <summary>
+            /// 搴撲綅鍙�鎺掑彿
+            /// </summary>
+            public string RowNo { get; set; } = "";
+            /// <summary>
+            /// 閿佸畾鐘舵�  1-閿佸畾  2-瑙i攣 3-缁戝畾 4-瑙g粦 5-鍗曠偣缁戝畾 6-鍗曠偣瑙g粦
+            /// </summary>
+            public string LockState { get; set; }
+            /// <summary>
+            /// 鍒犻櫎缁戝畾鏁版嵁 1-鍒犻櫎 2-涓嶅垹闄�3-缁戝畾
+            /// </summary>
+            //public string IsDelete { get; set; } = "2";
+        }
+        /// <summary>
+        /// 绌烘墭缁戝畾瑙g粦鎵樼洏鎺ュ彛
+        /// </summary>
+        public class EmptyLocaBindAUnBindModel
+        {
+            /// <summary>
+            /// 璐т綅缂栫爜
+            /// </summary>
+            public string Location { get; set; }
+            /// <summary>
+            /// 缁戝畾鐘舵�--1锛氱粦瀹�2锛氳В缁�+            /// </summary>
+            public string BindState { get; set; }
+        }
+        /// <summary>
+        /// 鎺ュ彛鐘舵�鍥炴姤澶勭悊
+        /// </summary>
+        public class ReturnMsgModel
+        {
+            public ResponseModel Response { get; set; }
+        }
+        public class ResponseModel
+        {
+            public ReturnModel @return { get; set; }
+        }
+        public class ReturnModel
+        {
+            public string returnCode { get; set; }
+            public string returnDesc { get; set; }
+            public string returnFlag { get; set; }
+        }
+
+
+        /// <summary>
+        /// 浠诲姟涓嬪彂瀹炰綋妯″瀷
+        /// </summary>
+        public class TASK_PUTModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string warehouseld { get; set; } = "CA02";
+            /// <summary>
+            /// 璧风偣
+            /// </summary>
+            public string fmPosition { get; set; }
+            /// <summary>
+            /// 缁堢偣
+            /// </summary>
+            public string toPosition { get; set; }
+            /// <summary>
+            /// 浠诲姟绫诲瀷 涓嬬嚎锛堝叆搴擄級-IN 缂犺啘锛堢Щ搴擄級-MV
+            /// </summary>
+            public string taskType { get; set; }
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string taskId { get; set; }
+            /// <summary>
+            /// 鎵樼洏鍙�+            /// </summary>
+            public string traceId { get; set; }
+            /// <summary>
+            /// 鍗�鍙屾墭
+            /// </summary>
+            public int qty { get; set; }
+            /// <summary>
+            /// 灞傛暟
+            /// </summary>
+            public int layers { get; set; }
+            /// <summary>
+            /// 浼樺厛绾� 1--鎴愬搧涓嬬嚎  2-缂犵粫鑶滅Щ搴� 3--鐞嗚揣
+            /// </summary>
+            public string priority { get; set; }
+        }
+        public class TASK_CANCELModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string warehouseld { get; set; } = "CA02";
+            /// <summary>
+            /// 浠诲姟缂栫爜
+            /// </summary>
+            public string taskId { get; set; }
+            public string udf01 { get; set; }
+            public string udf02 { get; set; }
+            public string udf03 { get; set; }
+        }
+        public class TrayCodeUpdateModel
+        {
+            public string WorkNo { get; set; }
+            public string DeviceName { get; set; }
+            public string ItemCode { get; set; }
+            /// <summary>
+            /// 闀垮楂�鐢ㄤ簬鍖哄垎澶у皬鏉�+            /// </summary>
+            public string ItemRule { get; set; }
+            public string BatchNo { get; set; }
+            //public string TrayCode { get; set; }
+            //public string TrayCodeNum { get; set; }
+            public string TrayRule { get; set; }
+            public string ItemLayer { get; set; }
+        }
+        #endregion
+
+        #region 鍐滃か澶ф槑灞�+        public class YiKuworkinfomodel
+        {
+            /// <summary>
+            /// 宸ュ崟鍙�+            /// </summary>
+            public string S_WorkNo { get; set; }//S_WorkNo
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string S_BatchNo { get; set; }
+            //public string S_ORDER_TYPE { get; set; }//宸ュ崟绫诲瀷
+            /// <summary>
+            /// 宸ュ崟鐘舵�
+            /// </summary>
+            public string S_WorkState { get; set; }//S_WorkState
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string S_ItemCode { get; set; } = "";
+            /// <summary>
+            /// 璧风偣鎺�澶氫釜鎺掔敤閫楀彿闅斿紑
+            /// </summary>
+            public string S_StartLoca { get; set; }
+            /// <summary>
+            /// 缁堢偣鎺�澶氫釜鎺掔敤閫楀彿闅斿紑
+            /// </summary>
+            public string S_EndLoca { get; set; }
+            /// <summary>
+            /// 绉诲簱鏁伴噺
+            /// </summary>
+            public int S_YiKuNum { get; set; }
+        }
+
+        public class FuWeiInfomodel
+        {
+            public string deviceName { get; set; }
+            public string location { get; set; }
+        }
+
+
+        #endregion
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/ApiService/MoboxController.cs b/HH.WCS.NongFuChaYuan/ApiService/MoboxController.cs
new file mode 100644
index 0000000..e3a8961
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/ApiService/MoboxController.cs
@@ -0,0 +1,52 @@
+锘縰sing HH.WCS.NongFuChaYuan.DispatchService;
+using HH.WCS.NongFuChaYuan.TaskController;
+using HH.WCS.NongFuChaYuan.WmsService;
+using Newtonsoft.Json;
+using System.Web.Http;
+using static HH.WCS.NongFuChaYuan.ApiService.ApiModel;
+
+namespace HH.WCS.NongFuChaYuan.ApiService
+{
+    /// <summary>
+    /// Mobox鎺ュ彛绫�+    /// </summary>
+    [RoutePrefix("mobox")]
+    public class MoboxController : System.Web.Http.ApiController
+    {
+        [HttpPost]
+        [Route("CancelTask")]
+        public SimpleResult CancelTask(MoboxTaskBase model) {
+            var result = new SimpleResult();
+            LogHelper.Info("CancelTask Request锛� + JsonConvert.SerializeObject(model), "MoboxTask");
+            return ApiHelper.MoboxCancelTask(model, result);
+        }
+
+        [HttpPost]
+        [Route("CompleteTask")]
+        public SimpleResult CompleteTask(MoboxTaskBase model) {
+            var result = new SimpleResult();
+            LogHelper.Info("CompleteTask Request锛� + JsonConvert.SerializeObject(model), "MoboxTask");
+            return ApiHelper.MoboxCompleteTask(model, result);
+        }
+
+        [HttpPost]
+        [Route("WeiTuo")]
+        public SimpleResult WeiTuo(MoboxTaskBase model)
+        {
+            var result = new SimpleResult();
+            LogHelper.Info("WeiTuo Request锛� + JsonConvert.SerializeObject(model), "MoboxTask");
+            return ApiHelper.WeiTuo(model);
+        }
+
+        [HttpPost]
+        [Route("AddTask")]
+        public SimpleResult AddTask(AddTaskModel model)
+        {
+            var result = new SimpleResult();
+            LogHelper.Info("AddTask Request锛� + JsonConvert.SerializeObject(model), "MoboxTask");
+            return ApiHelper.AddTask(model);
+        }
+
+
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/ApiService/StandController.cs b/HH.WCS.NongFuChaYuan/ApiService/StandController.cs
new file mode 100644
index 0000000..651840e
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/ApiService/StandController.cs
@@ -0,0 +1,70 @@
+锘縰sing HH.WCS.NongFuChaYuan;
+using HH.WCS.NongFuChaYuan.ApiService;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+using static HH.WCS.NongFuChaYuan.ApiService.ApiHelper;
+using static HH.WCS.NongFuChaYuan.ApiService.ApiModel;
+
+namespace Hanhe.iWCS.SuXiMexZiProtocol
+{
+    /// <summary>
+    /// 鏍囧噯鎺ュ彛绫�+    /// </summary>
+    [RoutePrefix("api")]
+    public class StandController : System.Web.Http.ApiController
+    {
+        /// <summary>
+        /// 鑻忓窞瑗块棬瀛�-鍒涘缓浠诲姟鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("AddTask")]
+        public SimpleResultModel AddTask(OtherModel.AddTaskModel model)
+        {
+            LogHelper.Debug("AddTask Request锛� + JsonConvert.SerializeObject(model));
+            return ApiHelper.AddTask(model);
+        }
+        /// <summary>
+        /// 鑻忓窞瑗块棬瀛�-鍙栨秷浠诲姟鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("CancelTask")]
+        public SimpleResultModel CancelTask(OtherModel.CancelTaskModel model)
+        {
+            LogHelper.Debug("CancelTask Request锛� + JsonConvert.SerializeObject(model));
+            return ApiHelper.CancelTask(model);
+        }
+        /// <summary>
+        /// 鑻忓窞瑗块棬瀛�-寮哄埗鍏呯數鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("ForcedCharging")]
+        public SimpleResultModel ForcedCharging(OtherModel.ForcedChargingModel model)
+        {
+            LogHelper.Debug("ForcedCharging Request锛� + JsonConvert.SerializeObject(model));
+            return ApiHelper.ForcedCharging(model);
+        }
+        /// <summary>
+        /// 鑻忓窞瑗块棬瀛�-璋冩暣浠诲姟浼樺厛绾�+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("SetPriority")]
+        public SimpleResultModel SetPriority(OtherModel.SetPriorityModel model)
+        {
+            LogHelper.Debug("SetPriority Request锛� + JsonConvert.SerializeObject(model));
+            return ApiHelper.SetPriority(model);
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/ApiService/Startup.cs b/HH.WCS.NongFuChaYuan/ApiService/Startup.cs
new file mode 100644
index 0000000..743f27b
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/ApiService/Startup.cs
@@ -0,0 +1,76 @@
+锘縰sing System;
+using System.Net;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+using System.Web.Http.Controllers;
+using System.Web.Http.Filters;
+using Microsoft.Owin;
+using Owin;
+
+[assembly: OwinStartup(typeof(HH.WCS.NongFuChaYuan.ApiService.Startup))]
+
+namespace HH.WCS.NongFuChaYuan.ApiService
+{
+    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);
+        }
+    }
+
+    /// <summary>
+    /// 鍩虹韬唤楠岃瘉鐗规�    鎺ュ彛涓婂鍔犳爣璇嗭細[BasicAuthentication]   鍗冲彲浣跨敤
+    /// 浼犲弬锛氬弬鏁板悕锛欰uthorization   鍙傛暟鍊硷細Basic admin:123         --Basic鍚庨潰闇�鍔犵┖鏍�+    /// </summary>
+    public class BasicAuthenticationAttribute : ActionFilterAttribute
+    {
+        public override void OnActionExecuting(HttpActionContext actionContext)
+        {
+            //妫�獙鐢ㄦ埛ticket淇℃伅锛岀敤鎴穞icket淇℃伅鏉ヨ嚜璋冪敤鍙戣捣鏂�+            if (actionContext.Request.Headers.Authorization != null)
+            {
+                //瑙e瘑鐢ㄦ埛ticket,骞舵牎楠岀敤鎴峰悕瀵嗙爜鏄惁鍖归厤
+                var encryptTicket = actionContext.Request.Headers.Authorization.Parameter;//璇锋眰淇℃伅涓獙璇佷俊鎭殑鍙傛暟
+                if (ValidateUserTicket(encryptTicket))//鑷畾涔夌殑鍒ゆ柇韬唤鏂规硶
+                    base.OnActionExecuting(actionContext);//閫氳繃韬唤楠岃瘉鍒欑户缁墽琛孋ontroller鏂规硶
+                else
+                {
+                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);//璇锋眰鐘舵�璁剧疆涓�401 璁よ瘉涓嶉�杩�+                    actionContext.Response.Content = new StringContent("鏉冮檺涓嶈冻", Encoding.UTF8, "application/json");//杩斿洖閿欒淇℃伅
+                    //LogHelper
+                }
+            }
+            else//璇锋眰涓病鏈夋坊鍔犻獙璇佷俊鎭紝鍒欒繑鍥為敊璇�+            {
+                actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
+                string err = "鎷掔粷璁块棶锛岃鍏堟坊鍔犻獙璇佷俊鎭悗锛屽湪璁块棶姝ゆ帴鍙o紒";
+                actionContext.Response.Content = new StringContent(err, Encoding.UTF8, "application/json");
+            }
+        }
+        /// <summary>
+        /// 鏍¢獙鐢ㄦ埛ticket淇℃伅
+        /// </summary>
+        /// <param name="encryptTicket"></param>
+        /// <returns></returns>
+        private bool ValidateUserTicket(string encryptTicket)
+        {
+            //榛樿鎺堟潈鐮�admin:123
+            //string userpwd = Encoding.Default.GetString(Convert.FromBase64String(encryptTicket));//鍙傛暟涓殑楠岃瘉淇℃伅锛岃浆涓簊tring
+            return encryptTicket.Equals("admin:123");
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/ApiService/ThirdController.cs b/HH.WCS.NongFuChaYuan/ApiService/ThirdController.cs
new file mode 100644
index 0000000..08bce53
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/ApiService/ThirdController.cs
@@ -0,0 +1,130 @@
+锘縰sing Newtonsoft.Json;
+using System.Web.Http;
+using static HH.WCS.NongFuChaYuan.ApiService.ApiHelper;
+using static HH.WCS.NongFuChaYuan.ApiService.ApiModel;
+using static HH.WCS.NongFuChaYuan.ApiService.OtherModel;
+
+namespace HH.WCS.NongFuChaYuan.ApiService
+{
+    /// <summary>
+    /// 绗笁鏂归」鐩帴鍙g被
+    /// </summary>
+    [RoutePrefix("api")]
+    public class ThirdController : System.Web.Http.ApiController
+    {
+
+        #region 鍐滃か澶ф槑灞�+        /// <summary>
+        /// 鍐滃か澶ф槑灞�缁戝畾鎵樼洏
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("~/BindingTrayCode")]
+        public SimpleResultModel BindingTrayCode(BindingTrayCodeModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel();
+            LogHelper.Info("BindingTrayCode Request锛� + JsonConvert.SerializeObject(model), "ThirdSystemLog");
+            result = ApiHelper.BindingTrayCode(model);
+            LogHelper.Info("BindingTrayCode Response锛� + JsonConvert.SerializeObject(result), "ThirdSystemLog");
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か娣冲畨--鏃犵爜妯″紡浜哄伐鍒嗘嫞鍑哄簱鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("~/NoCodeUnbindingTrayCode")]
+        public SimpleResultModel NoCodeUnbindingTrayCode(NoCodeUnbindingTrayCodeModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel();
+            LogHelper.Info("NoCodeUnbindingTrayCode Request锛� + JsonConvert.SerializeObject(model), "ThirdSystemLog");
+            result = ApiHelper.NoCodeUnbindingTrayCode(model);
+            LogHelper.Info("NoCodeUnbindingTrayCode Response锛� + JsonConvert.SerializeObject(result), "ThirdSystemLog");
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�-绌烘墭缁戝畾瑙g粦鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("~/EmptyLocaBindAUnBind")]
+        public SimpleResultModel EmptyLocaBindAUnBind(EmptyLocaBindAUnBindModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel();
+            LogHelper.Info("EmptyLocaBindAUnBind Request锛� + JsonConvert.SerializeObject(model), "ThirdSystemLog");
+            result = ApiHelper.EmptyLocaBindAUnBind(model);
+            LogHelper.Info("EmptyLocaBindAUnBind Response锛� + JsonConvert.SerializeObject(result), "ThirdSystemLog");
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�-绌烘墭缁戝畾瑙g粦鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("~/YiKuworkinfo")]
+        public SimpleResultModel YiKuworkinfo(YiKuworkinfomodel model)
+        {
+            SimpleResultModel result = new SimpleResultModel();
+            LogHelper.Info("YiKuworkinfo Request锛� + JsonConvert.SerializeObject(model), "ThirdSystemLog");
+            result = ApiHelper.YiKuworkinfo(model);
+            LogHelper.Info("YiKuworkinfo Response锛� + JsonConvert.SerializeObject(result), "ThirdSystemLog");
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�-绌烘墭缁戝畾瑙g粦鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("~/BHYiKuworkinfo")]
+        public SimpleResultModel BHYiKuworkinfo(YiKuworkinfomodel model)
+        {
+            SimpleResultModel result = new SimpleResultModel();
+            LogHelper.Info("BHYiKuworkinfo Request锛� + JsonConvert.SerializeObject(model), "ThirdSystemLog");
+            result = ApiHelper.BHYiKuworkinfo(model);
+            LogHelper.Info("BHYiKuworkinfo Response锛� + JsonConvert.SerializeObject(result), "ThirdSystemLog");
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�-澶嶄綅淇″彿
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("~/FuWeiInfo")]
+        public SimpleResultModel FuWeiInfo(FuWeiInfomodel model)
+        {
+            SimpleResultModel result = new SimpleResultModel();
+            LogHelper.Info("FuWeiInfo Request锛� + JsonConvert.SerializeObject(model), "ThirdSystemLog");
+            result = ApiHelper.FuWeiInfo(model);
+            LogHelper.Info("FuWeiInfo Response锛� + JsonConvert.SerializeObject(result), "ThirdSystemLog");
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�缁戝畾鐗╂枡
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("~/BindingItemCode")]
+        public SimpleResultModel BindingItemCode(BindingItemCodeModel model)
+        {
+            SimpleResultModel result = new SimpleResultModel();
+            LogHelper.Info("BindingItemCode Request锛� + JsonConvert.SerializeObject(model), "ThirdSystemLog");
+            result = ApiHelper.BindingItemCode(model);
+            LogHelper.Info("BindingItemCode Response锛� + JsonConvert.SerializeObject(result), "ThirdSystemLog");
+            return result;
+        }
+        #endregion
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/App.config b/HH.WCS.NongFuChaYuan/App.config
new file mode 100644
index 0000000..732b982
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/App.config
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
+    </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>
+    </assemblyBinding>
+  </runtime>
+</configuration>
diff --git a/HH.WCS.NongFuChaYuan/DeviceService/ModbusHelper.cs b/HH.WCS.NongFuChaYuan/DeviceService/ModbusHelper.cs
new file mode 100644
index 0000000..c9eb6cf
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DeviceService/ModbusHelper.cs
@@ -0,0 +1,237 @@
+锘縰sing EasyModbus;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.DeviceService
+{
+    internal class ModbusHelper
+    {
+        private 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];
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    res = client.ReadCoils(address, qty);
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 璇荤鏁h緭鍏�+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal bool[] ReadDiscreteInputs(int address, int qty, string ip, int port = 502) {
+            bool[] res = new bool[0];
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    res = client.ReadDiscreteInputs(address, qty);
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 璇讳繚鎸佸瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal int[] ReadHoldingRegisters(int address, int qty, string ip, int port = 502) {
+            int[] res = new int[0];
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    res = client.ReadHoldingRegisters(address, qty);
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+        }
+        /// <summary>
+        /// 璇昏緭鍏ュ瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="qty"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <returns></returns>
+        internal 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;
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteMultipleCoils(address, values);
+                    res = true;
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+
+        }
+        /// <summary>
+        /// 鍐欏崟涓瘎瀛樺櫒
+        /// </summary>
+        /// <param name="address"></param>
+        /// <param name="value"></param>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        internal bool WriteSingleRegister(int address, int value, string ip, int port = 502) {
+            var res = false;
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteSingleRegister(address, value);
+                    res = true;
+                }
+                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 = 502) {
+            var res = false;
+            var client = GetClient(ip, port);
+            if (client != null && client.Connected) {
+                try {
+                    client.WriteMultipleRegisters(address, values);
+                    res = true;
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            return res;
+        }
+        private ModbusClient GetClient(string ip, int port) {
+            ModbusClient client = null;
+            if (!clients.ContainsKey(ip)) {
+                client = new ModbusClient(ip, port);
+                try {
+                    client.Connect();
+                    clients[ip] = client;
+                }
+                catch (Exception ex) {
+                    LogHelper.Error(ex.Message, ex);
+                }
+            }
+            else {
+                if (clients[ip].Connected) {
+                    try {
+                        clients[ip].Connect();
+                        client = clients[ip];
+                    }
+                    catch (Exception ex) {
+                        LogHelper.Error(ex.Message, ex);
+                    }
+                }
+                else {
+                    client = clients[ip];
+                }
+            }
+            return client;
+        }
+    }
+
+    public class EasyModbusHelper
+    {
+        private static ModbusHelper ModbusHelper = new ModbusHelper();
+        public static void WriteOrRead()
+        {
+            //ModbusClient tcp = new ModbusClient("", 502);//TCP妯″紡杩炴帴
+            //ModbusClient rtu = new ModbusClient("COM1");//RTU妯″紡杩炴帴
+            //rtu.UnitIdentifier = 1;//璁惧ID
+            //rtu.Baudrate = 9600;//娉㈢壒鐜�+            //rtu.Parity = System.IO.Ports.Parity.None;//濂囧伓鏍¢獙浣�+            ////rtu.StopBits = System.IO.Ports.StopBits.One;//鍋滄浣�+            //rtu.ConnectionTimeout = 500;
+            //rtu.Connect();
+
+            int[] readHoldingRegisters = ModbusHelper.ReadHoldingRegisters(0, 2, "127.0.0.1");
+            //Console.WriteLine($"read:{JsonConvert.SerializeObject(readHoldingRegisters)}");
+            ModbusHelper.WriteMultipleRegisters(2, new int[1] { 9 }, "127.0.0.1");
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/DeviceService/OITcpHelper.cs b/HH.WCS.NongFuChaYuan/DeviceService/OITcpHelper.cs
new file mode 100644
index 0000000..3ba545c
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DeviceService/OITcpHelper.cs
@@ -0,0 +1,249 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using Newtonsoft.Json;
+using System;
+
+namespace HH.WCS.NongFuChaYuan.DeviceService
+{
+    public class OITcpHelper
+    {
+        private static string url = Settings.OITcpSeverUrl;
+        private static string token = "";
+        private static HttpHelper apiHelper = new HttpHelper();
+
+        #region 1.	涓浆璇锋眰鎿嶄綔
+        /// <summary>
+        /// 1.1.	璇锋眰 json鍐呭
+        /// </summary>
+        public static void JsonTransit() {
+            var req = JsonConvert.SerializeObject(new JsonTransitData());
+            var feedback = apiHelper.WebPost($"{url}/api/transit/json?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<JsonTransitResult>(feedback);
+            }
+        }
+        /// <summary>
+        /// 1.2.	璇锋眰 ascii鍐呭
+        /// </summary>
+        public static StrTransitResult AsciiTransit(StrTransitData model) {
+            StrTransitResult result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/transit/ascii?access_token={token}", req);
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<StrTransitResult>(feedback);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 1.3.	璇锋眰 hex鍐呭
+        /// </summary>
+        public static StrTransitResult HexTransit(StrTransitData model) {
+            StrTransitResult result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/transit/hex?access_token={token}", req);
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<StrTransitResult>(feedback);
+            }
+            //Console.WriteLine($"HexTransit req={req} res={feedback}");
+            return result;
+        }
+        public class BaseTransitData
+        {
+            public string host { get; set; }
+            public int port { get; set; } = 502;
+            public int timeout { get; set; } = 2000;
+
+        }
+        public class JsonTransitData : BaseTransitData
+        {
+            public object data { get; set; }
+        }
+        public class JsonTransitResult : BaseResponseModel
+        {
+            public object result { get; set; }
+        }
+        public class StrTransitData : BaseTransitData
+        {
+            public string data { get; set; }
+        }
+        public class StrTransitResult : BaseResponseModel
+        {
+            public string result { get; set; }
+        }
+        #endregion
+
+        #region 2.	Modbus澶勭悊鎿嶄綔
+        #region 2.1.	璇诲彇杈撳嚭绾垮湀鐘舵� 01 鍔熻兘
+        /// <summary>
+        /// 2.1.	璇诲彇杈撳嚭绾垮湀鐘舵� 01 鍔熻兘
+        /// </summary>
+        public static RelayReadOutResult RelayReadOutPut(RelayReadOutPutModel model) {
+            RelayReadOutResult result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/readoutput?access_token={token}", req);
+            //Console.WriteLine($"璇诲彇杈撳嚭绾垮湀鐘舵� modbus/relay/readoutput req={req} res={feedback}");
+           Console.Write($"璇诲彇杈撳嚭绾垮湀鐘舵� modbus/relay/readoutput req={req} res={feedback}");
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<RelayReadOutResult>(feedback);
+            }
+            return result;
+        }
+        public class RelayReadOutPutModel : BaseRequestModel
+        {
+            public int bitNum { get; set; }
+            //public object tcpModel { get; set; }
+            //public int msgNo { get; set; }
+        }
+        public class RelayReadOutResult : BaseResponseModel
+        {
+            public int[] result { get; set; }
+        }
+        #endregion
+
+        #region 2.2.	璇诲彇杈撳叆绂绘暎閲�02 鍔熻兘
+        /// <summary>
+        /// 2.2.	璇诲彇杈撳叆绂绘暎閲�02 鍔熻兘
+        /// </summary>
+        public static void RelayReadInPut(BaseRequestModel model) {
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/readinput?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<RelayReadInPutResult>(feedback);
+            }
+        }
+        public class RelayReadInPutResult : BaseRequestModel
+        {
+            public int result { get; set; }
+        }
+        #endregion
+
+        #region 2.3.	璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘
+        /// <summary>
+        /// 2.3.	璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘
+        /// </summary>
+        public static RegisterReadOutPutResult RegisterReadOutPut(RegisterReadOutPutModel model) {
+            RegisterReadOutPutResult result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/readoutput?access_token={token}", req);
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<RegisterReadOutPutResult>(feedback);
+            }
+            return result;
+        }
+        public class RegisterReadOutPutModel : BaseRequestModel
+        {
+
+            public int dataNum { get; set; }
+            //public int msgNo { get; set; }
+        }
+        public class RegisterReadOutPutResult : BaseResponseModel
+        {
+            public int[] result { get; set; }
+        }
+        #endregion
+
+        #region  2.4.	璇诲彇杈撳叆瀵勫瓨鍣ㄦ暟鎹�04 鍔熻兘
+        /// <summary>
+        /// 2.4.	璇诲彇杈撳叆瀵勫瓨鍣ㄦ暟鎹�04 鍔熻兘
+        /// </summary>
+        public static void RegisterReadInPut() {
+            var req = JsonConvert.SerializeObject(new RegisterReadInPutModel());
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/readinput?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<RegisterReadOutPutResult>(feedback);
+            }
+        }
+
+        public class RegisterReadInPutModel : BaseResponseModel
+        {
+            public int[] result { get; set; }
+        }
+        #endregion
+
+        #region 2.5.	鍐欏崟涓緭鍑虹嚎鍦�05 鍔熻兘
+        /// <summary>
+        /// 2.5.	鍐欏崟涓緭鍑虹嚎鍦�05 鍔熻兘
+        /// </summary>
+        public static BaseResponseModel RelayWriteOutPut(RelayWriteOutPutModel model) {
+            BaseResponseModel result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/writeoutput?access_token={token}", req);
+            //Console.WriteLine($"鍐欏崟涓緭鍑虹嚎鍦�modbus/relay/writeoutput req={req} res={feedback}");
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+            return result;
+        }
+        public class RelayWriteOutPutModel : BaseRequestModel
+        {
+            public bool status { get; set; }
+        }
+        #endregion
+
+        #region 2.6.	鍐欏崟涓緭鍑哄瘎瀛樺櫒 06 鍔熻兘
+        public static BaseResponseModel RegisterWriteOutPut(RegisterWriteOutPutModel model) {
+            BaseResponseModel result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/writeoutput?access_token={token}", req);
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+            return result;
+        }
+        public class RegisterWriteOutPutModel : BaseRequestModel
+        {
+            public int data { get; set; }
+        }
+        #endregion
+
+        #region 2.7.	鍐欏涓緭鍑虹嚎鍦�15 鍔熻兘
+        public static void RelayWriteOutPutMulti() {
+            var req = JsonConvert.SerializeObject(new RelayWriteOutPutModelMulti());
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/writeoutputmulti?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+        }
+        public class RelayWriteOutPutModelMulti : BaseRequestModel
+        {
+            public int bitNum { get; set; }
+            public int[] data { get; set; }
+        }
+        #endregion
+
+        #region 2.8.	鍐欏涓緭鍑哄瘎瀛樺櫒 16 鍔熻兘
+        public static void RegisterWriteOutPutMulti() {
+            var req = JsonConvert.SerializeObject(new RegisterWriteOutPutModelMulti());
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/writeoutputmulti?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+        }
+        public class RegisterWriteOutPutModelMulti : BaseRequestModel
+        {
+            public int[] data { get; set; }
+        }
+        #endregion
+
+        #endregion
+
+
+        public class ReadInPutResult : BaseResponseModel
+        {
+            public int result { get; set; }
+        }
+        public class BaseResponseModel
+        {
+            public int errCode { get; set; }
+            public string errMsg { get; set; }
+        }
+        public class BaseRequestModel
+        {
+            public string host { get; set; }
+            public int port { get; set; } = 502;
+            public int timeout { get; set; } = 1000;
+            public int deviceNo { get; set; } = 1;
+            public int addr { get; set; }
+            public object tcpModel { get; set; } = new { msgNo = 1 };
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/DeviceService/PlcHelper.cs b/HH.WCS.NongFuChaYuan/DeviceService/PlcHelper.cs
new file mode 100644
index 0000000..c7bd18d
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DeviceService/PlcHelper.cs
@@ -0,0 +1,91 @@
+锘縰sing HH.WCS.NongFuChaYuan.TaskController;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.DeviceService
+{
+    internal class PlcHelper
+    {
+        internal static void Receive(string ip, string msg) {
+            //澶勭悊璁惧淇″彿
+            ////Console.WriteLine($"澶勭悊PLC淇℃伅锛欼P锛歿ip},MSG:{msg}");
+            LogHelper.Info($"澶勭悊PLC淇℃伅锛欼P锛歿ip},MSG:{msg}", "Plc");
+            DeviceProcess.Analysis(msg, ip);
+        }
+        internal static bool SendHex(string ip, string msg) {
+            ////Console.WriteLine($"鍙戦�PLC淇℃伅锛欼P锛歿ip},MSG:{msg}");       
+            LogHelper.Info($"鍙戦�PLC淇℃伅锛欼P锛歿ip},MSG:{msg}", "Plc");
+            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/HH.WCS.NongFuChaYuan/DeviceService/TcpServer.cs b/HH.WCS.NongFuChaYuan/DeviceService/TcpServer.cs
new file mode 100644
index 0000000..32ef198
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DeviceService/TcpServer.cs
@@ -0,0 +1,154 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text.RegularExpressions;
+
+namespace HH.WCS.NongFuChaYuan.DeviceService
+{
+    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), 2023));
+                //socket.Bind(new IPEndPoint(IPAddress.Parse(ip), int.Parse(Settings.TcpPort)));
+                //鍚姩鐩戝惉锛屽苟涓旇缃竴涓渶澶х殑闃熷垪闀垮害
+                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, "0da", RegexOptions.IgnoreCase).Distinct().ToList();
+                            foreach (var item in list)
+                            {
+                                if (!string.IsNullOrEmpty(item)) 
+                                {
+                                    //鏄剧ず娑堟伅
+                                    string msg = message.Replace(@"0d", "").Replace(@"0a", "").Replace(@"0d0a", "").Trim();
+                                    PlcHelper.Receive(remote_ip, msg);
+                                    Array.Clear(buffers[remote_ip], 0, buffers[remote_ip].Length);//娓呯┖褰撳墠IP Buffer
+                                }
+                            }
+                        }
+                        else {
+                            Array.Clear(buffers[remote_ip], 0, buffers[remote_ip].Length);//娓呯┖褰撳墠IP Buffer
+                            //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);
+                    LogHelper.Error($"銆愬鐞嗗鎴风鐨勬秷鎭紓甯搞�锛� + ex.Message, ex);
+                }
+                //鎺ユ敹涓嬩竴涓秷鎭�鍥犱负杩欐槸涓�釜閫掑綊鐨勮皟鐢紝鎵�互杩欐牱灏卞彲浠ヤ竴鐩存帴鏀舵秷鎭簡锛�+                socket.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
+            }
+            catch (Exception ex) {
+                //Console.WriteLine(ex.Message);
+            }
+        }
+
+        private static string GetHexString(byte[] buffer, int lenght) {
+            return BitConverter.ToString(buffer, 0, lenght).Replace("-", string.Empty).ToLower();
+        }
+
+        public static bool TcpServerSend(string ip, byte[] msg) {
+            if (clients.Keys.Contains(ip)) {
+                var client = clients[ip];
+                if (client.Connected) {
+                    try {
+                        client.Send(msg);
+                        return true;
+                    }
+                    catch (SocketException ex) {
+                        //Console.WriteLine(ex.Message);
+                        clients[ip].Close();
+                        clients.Remove(ip);
+                    }
+                }
+                else {
+                    clients[ip].Close();
+                    clients.Remove(ip);
+                }
+            }
+            else {
+                //Console.WriteLine("鏈壘鍒拌澶囩殑閾炬帴锛� + ip);
+            }
+            return false;
+
+        }
+       
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/DispatchService/GZRobot.cs b/HH.WCS.NongFuChaYuan/DispatchService/GZRobot.cs
new file mode 100644
index 0000000..bd3702e
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DispatchService/GZRobot.cs
@@ -0,0 +1,256 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+
+namespace HH.WCS.NongFuChaYuan.DispatchService
+{
+    /// <summary>
+    /// 鍥借嚜璋冨害杈呭姪绫�+    /// </summary>
+    public class GZRobot
+    {
+        private static readonly HttpHelper apiHelper = new HttpHelper();
+        private static readonly string baseUrl = "http://192.168.1.99:2000/";
+        //private static readonly string logName = "guozi";
+        public static List<IOState> GetIO() {
+            var result = apiHelper.Get(baseUrl + "api/engine/view/iostates/");
+            var data = JsonConvert.DeserializeObject<gzResult<IOState>>(result);
+            return data.data;
+        }
+        public static void UpdateIOState() {
+            var data = new { data = new List<IOSateInfo>() };
+            var result = apiHelper.Post(baseUrl + "api/engine/tasks/iostates/", JsonConvert.SerializeObject(data));
+            var dataResult = JsonConvert.DeserializeObject<gzResult<IOStatesInfoResult>>(result);
+        }
+
+        public static int CreateOrder(string taskNo, int priority, string param, string ts = "榛樿") {
+            var msg = "";
+            var orderId = 0;
+            var data = new OrderInfo() { order_name = taskNo, priority = priority, dead_line = DateTime.Now, ts_name = ts, parameters = param };
+            var request = JsonConvert.SerializeObject(data);
+            var response = apiHelper.Post(baseUrl + "api/om/order/", request);
+            msg = $"[guozi-CreateOrder] request={request} response={response}";
+            //Console.WriteLine(msg);
+            if (response != "") {
+                try {
+                    var dataResult = JsonConvert.DeserializeObject<gzResult<OrderInfoResult>>(response);
+                    if (dataResult.code == 0) {
+                        orderId = dataResult.data[0].in_order_id;
+                    }
+                }
+                catch (Exception ex) {
+                }
+            }
+            else {
+                msg = "[guozi-CreateOrder]鍒涘缓璁㈠崟澶辫触";
+                //Console.WriteLine(msg);
+            }
+
+            return orderId;
+        }
+        public static bool CancelOrder(int orderId) {
+            bool result = false;
+            string msg = "";
+            var request = new CancelOrderInfo() { order_list = new List<int>(orderId) };
+            var response = apiHelper.Post(baseUrl + "api/om/order/cancel/", JsonConvert.SerializeObject(request));
+            msg = $"[guozi-CancelOrder] request={request};response={response}";
+            //Console.WriteLine(msg);
+            if (response != "") {
+                var dataResult = JsonConvert.DeserializeObject<gzResult<CancelOrderInfoResult>>(response);
+                if (dataResult.code == 0) {
+                    result = true;
+                }
+            }
+            else {
+                msg = "[guozi-CancelOrder]鍙栨秷璁㈠崟澶辫触";
+                //Console.WriteLine(msg);
+            }
+            return result;
+        }
+        public static QueryOrderResult QueryOrder(int id) {
+            //
+            var result = new QueryOrderResult() { agv_list = new List<int> { 0 } };
+            string msg = "";
+            var response = apiHelper.Get(baseUrl + $"/api/om/order/{id}/");
+            msg = $"[guozi-QueryOrderResult] request={id};response={response}";
+            //Console.WriteLine(msg);
+            if (response != "") {
+                var data = JsonConvert.DeserializeObject<gzResult<QueryOrderResult>>(response);
+                result = data.data[0];
+            }
+            else {
+                msg = "[guozi-QueryOrderResult]鏌ヨ璁㈠崟淇℃伅澶辫触";
+                //Console.WriteLine(msg);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 鑾峰彇浜や簰淇℃伅
+        /// </summary>
+        /// <param name="typeId">1浠诲姟鐘舵�  2寮�棬鎴栦氦绠� 3鐩殑鐐�/param>
+        /// <param name="status"></param>
+        /// <returns></returns>
+        public static List<InteractInfoResult> QueryInteractInfo(int typeId, string status = "active") {
+
+            //string aaa = "{\"app_name\": \"Gouzi client\", \"version\": \"1.0.0\", \"code\": 0, \"msg\": \"success\", \"data\": [{\"interaction_info_id\": 233, \"interaction_info_name\": \"TN2012030001\", \"interaction_info_desp\": null, \"interaction_info_type_id\": 3, \"value_json\": {\"state\": \"4\"}, \"info_status\": \"active\", \"return_value\": null}]}";
+            //var data = JsonConvert.DeserializeObject<gzResult<InteractInfoResult>>(aaa);
+            var list = new List<InteractInfoResult>();
+            string msg = "";
+            var result = apiHelper.Get(baseUrl + $"api/om/interaction_info/find_by_type/?type_id={typeId}&info_status={status}");
+            if (!string.IsNullOrEmpty(result)) {
+                //Console.WriteLine(result);
+                // {"app_name": "Gouzi client", "version": "1.0.0", "code": 0, "msg": "success", "data": [{"interaction_info_id": 230, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "4"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 231, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "6"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 232, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "2"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 233, "interaction_info_name": "TN2012030001", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "4"}, "info_status": "active", "return_value": null}]}
+                try {
+                    var data = JsonConvert.DeserializeObject<gzResult<InteractInfoResult>>(result);
+                    if (data.data != null) {
+                        list = data.data;
+                    }
+                }
+                catch (Exception ex) {
+                    //Console.WriteLine(ex.Message);
+                }
+            }
+            else {
+                msg = "[guozi-QueryInteractInfo]璇诲彇浜や簰淇℃伅澶辫触";
+                //Console.WriteLine(msg);
+            }
+            return list;
+        }
+        public static bool UpdateInteractInfo(UpdateInteractInfo interactInfo) {
+            string msg = "";
+            var result = false;
+            var request = JsonConvert.SerializeObject(interactInfo);
+            var response = apiHelper.Post(baseUrl + "api/om/interaction_info/update/", request);
+            msg = $"[mes-UpdateInteractInfo] request={request};response={response}";
+            if (response != "") {
+                var dataResult = JsonConvert.DeserializeObject<gzResult<object>>(response);
+                result = dataResult.code == 0;
+            }
+            else {
+                msg = "[guozi-UpdateInteractInfo]鏇存柊浜や簰淇℃伅澶辫触";
+                //Console.WriteLine(msg);
+            }
+            return result;
+        }
+
+    }
+    public class gzResult<T>
+    {
+        public string app_name { get; set; }
+        public string version { get; set; }
+        public int code { get; set; }
+        public string msg { get; set; }
+        public List<T> data { get; set; }
+    }
+    public class IOState
+    {
+        public int io_id { get; set; }
+        public string io_name { get; set; }
+        public string io_type_id { get; set; }
+        public string io_type { get; set; }
+        public int io_status_id { get; set; }
+        public string io_status_type { get; set; }
+        public string parameter_definition_int4_1 { get; set; }
+        public int io_value_int4_1 { get; set; }
+        public string parameter_definition_int4_2 { get; set; }
+        public int io_value_int4_2 { get; set; }
+        public string parameter_definition_int4_3 { get; set; }
+        public int io_value_int4_3 { get; set; }
+        public string parameter_definition_int4_4 { get; set; }
+        public int io_value_int4_4 { get; set; }
+        public string parameter_definition_json { get; set; }
+        public string io_value_json { get; set; }
+    }
+    public class IOSateInfo
+    {
+        public int io_id { get; set; }
+        public int io_status_id { get; set; }
+        public int io_value_int4_1 { get; set; }
+        public int io_value_int4_2 { get; set; }
+        public int io_value_int4_3 { get; set; }
+        public int io_value_int4_4 { get; set; }
+        public string io_value_json { get; set; }
+    }
+    public class IOStatesInfoResult
+    {
+        public List<ResultInfo> success_list { get; set; }
+        public List<ResultInfo> error_list { get; set; }
+        public class ResultInfo { public int io_id { get; set; } }
+    }
+    public class OrderInfo
+    {
+        public string order_name { get; set; }
+        public int priority { get; set; }
+        public DateTime dead_line { get; set; }
+        public string ts_name { get; set; }
+        public string parameters { get; set; }//{\"dock\":1}
+    }
+    public class OrderInfoResult
+    {
+        public int in_order_id { get; set; }
+    }
+    public class CancelOrderInfo
+    {
+        public List<int> order_list { get; set; }
+    }
+    public class CancelOrderInfoResult
+    {
+        public List<ResultInfo> success_list { get; set; }
+        public List<ResultInfo> error_list { get; set; }
+        public class ResultInfo { public int order_id { get; set; } }
+    }
+    public class QueryOrderResult
+    {
+        public int order_id { get; set; }
+        public string order_name { get; set; }
+        public int priority { get; set; }
+        public DateTime dead_line { get; set; }
+        public string ts_id { get; set; }
+        public string parameters { get; set; }//{"LocationName":"3-2-B", "PalletType":1}",
+        public string trigger { get; set; }
+        public string command { get; set; }
+        public string status { get; set; }
+        public List<int> agv_list { get; set; }
+        public string current_task { get; set; }
+        public string current_dest { get; set; }
+        public string current_opt { get; set; }
+        public string current_omi { get; set; }
+        public DateTime create_time { get; set; }
+        public DateTime? active_time { get; set; }
+        public DateTime? finished_time { get; set; }
+        public DateTime? cancel_time { get; set; }
+        public string response_timespan { get; set; }
+        public string execute_timespa { get; set; }
+        public string total_timespan { get; set; }
+    }
+    public class InteractInfoResult
+    {
+        public int interaction_info_id { get; set; }
+        public string interaction_info_name { get; set; }
+        public string interaction_info_desp { get; set; }
+        public int interaction_info_type_id { get; set; }
+        public object value_json { get; set; }//{"dock": 1},
+        public string info_status { get; set; }
+        public string return_value { get; set; }
+    }
+    public class UpdateInteractInfo
+    {
+        public int interaction_info_id { get; set; }
+        public string info_status { get; set; }
+        public string return_value { get; set; }
+    }
+    public class interaction_state
+    {
+        public string state { get; set; }
+    }
+    public class interaction_door
+    {
+        public string door { get; set; }
+    }
+    public class interaction_bit
+    {
+        public string order { get; set; }
+    }
+}
+
diff --git a/HH.WCS.NongFuChaYuan/DispatchService/HostToAGV.cs b/HH.WCS.NongFuChaYuan/DispatchService/HostToAGV.cs
new file mode 100644
index 0000000..135028d
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DispatchService/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/HH.WCS.NongFuChaYuan/DispatchService/NDC.cs b/HH.WCS.NongFuChaYuan/DispatchService/NDC.cs
new file mode 100644
index 0000000..b5c60bf
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DispatchService/NDC.cs
@@ -0,0 +1,236 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace HH.WCS.NongFuChaYuan.DispatchService
+{
+    public class NDC
+    {
+        private static HostToAGV callClient = null;
+        static NDC()
+        {
+            callClient = new HostToAGV();
+            //callClient.Url = "http://192.168.1.146:9988/HostToAGV.cgi";
+            callClient.Url = Settings.HostToAgvServerUrl;
+        }
+
+        private static string GetReqStr(int ts, Dictionary<string, string> param)
+        {
+            //< Order  TS = '60'  Pri = '" + mst.CN_N_PRIORITY.ToString() + "' From = '" + start.CN_N_AGV_LOCATION + "' To = '" + end.CN_N_AGV_LOCATION + "'  No = '" + mst.S_TASK_NO + "_1' Ext1 = '1' Ext2 = '" + Constants.TN_MID_COMMANDEQ_CALLAGVOrderCommandType + "'  N_CNTR_COUNT = ''   FRow = '" + sFloor + "'  TRow = '" + eFloor + "' />
+            var sb = new StringBuilder();
+            sb.Append($"<Req><Order ");
+            if (ts != 0)
+            {
+                sb.Append($"TS='{ts}'");
+            }
+            foreach (var kv in param)
+            {
+                sb.Append($" {kv.Key}='{kv.Value}'");
+            }
+            sb.Append("/></Req>");
+            return sb.ToString();
+        }
+
+
+        public static AGVResult AddNewOrder1(int ts, int pri, string taskNo, Dictionary<string, string> param)
+        {
+            //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
+
+            var bufin = GetReqStrNew(ts, pri, taskNo, param);
+
+            try
+            {
+                var result = callClient.OrderAdd(bufin);
+                LogHelper.Info($"OrderAdd req={bufin} res={result}", "NDC");
+                //LogHelper.Info(result.bufout, "ts");
+                return GetResult(result);
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"OrderAdd req={bufin} res={e.Message}", "NDC");
+                return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
+            }
+        }
+
+        public static AGVResult OrderAdd(int ts, Dictionary<string, string> param, Dictionary<string, string> param1) 
+        {
+            //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
+
+            var bufin = GetReqStr2(ts, param, param1);
+
+            try
+            {
+                var result = callClient.OrderAdd(bufin);
+                LogHelper.Info($"OrderAdd req={bufin} res={result}", "NDC");
+                //LogHelper.Info(result.bufout, "ts");
+                return GetResult(result);
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"OrderAdd req={bufin} res={e.Message}", "NDC");
+                return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
+            }
+        }
+
+        private static string GetReqStr2(int ts, Dictionary<string, string> param, Dictionary<string, string> param1)
+        {
+            //< Order  TS = '60'  Pri = '" + mst.CN_N_PRIORITY.ToString() + "' From = '" + start.CN_N_AGV_LOCATION + "' To = '" + end.CN_N_AGV_LOCATION + "'  No = '" + mst.S_TASK_NO + "_1' Ext1 = '1' Ext2 = '" + Constants.TN_MID_COMMANDEQ_CALLAGVOrderCommandType + "'  N_CNTR_COUNT = ''   FRow = '" + sFloor + "'  TRow = '" + eFloor + "' />
+            var sb = new StringBuilder();
+            sb.Append($"<Req><Order ");
+            if (ts != 0)
+            {
+                sb.Append($"TS='{ts}'");
+            }
+            foreach (var kv in param)
+            {
+                sb.Append($" {kv.Key}='{kv.Value}'");
+            }
+            sb.Append($" NoCallback='0' >");
+            foreach (var p1 in param1)
+            {
+                sb.Append($"<Param Name='{p1.Key}' Value='{p1.Value}' />");
+            }
+            sb.Append("</Order></Req>");
+            return sb.ToString();
+        }
+
+        private static string GetReqStrNew(int ts, int pri, string taskNo, Dictionary<string, string> param)
+        {
+            /*<Req>
+              <Order TS='5' Pri='80' No='666' NoCallback='0' Ext1='' Ext2='' Ext3=''>
+                <Param Name='From' Value='10' />
+                <Param Name='To' Value='20' />
+                <Param Name='FRow' Value='1' />
+                <Param Name='TRow' Value='7' />
+                <Param Name='DispInfo' Value='1' />
+                <Param Name='CtrlVal' Value='12' />
+                <Param Name='ChgTo' Value='2' />
+                <Param Name='Flow' Value='111' />
+                <Param Name='Tlow' Value='222' />
+              </Order>
+            </Req>*/
+            var sb = new StringBuilder();
+            sb.Append($"<Req><Order TS='{ts}' Pri='{pri}' No='{taskNo}'>");
+
+            foreach (var kv in param)
+            {
+                sb.Append($"<Param Name='{kv.Key}' Value='{kv.Value}'/>");
+            }
+            sb.Append("</Order></Req>");
+            return sb.ToString();
+        }
+        public static AGVResult AddNewOrder(int ts, Dictionary<string, string> param)
+        {
+            //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
+
+            var bufin = GetReqStr(ts, param);
+
+            try
+            {
+
+                var result = callClient.AddNewOrder(bufin);
+                LogHelper.Info($"AddNewOrder req={bufin} res={result}", "NDC");
+                //LogHelper.Info(result.bufout, "ts");
+                return GetResult(result);
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"AddNewOrder req={bufin} res={e.Message}", "NDC");
+                return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
+            }
+        }
+
+
+        public static AGVResult CancelOrder(int ts, Dictionary<string, string> param)
+        {
+            //< Req >< Order No = 'TN2302020001' >< Param Name = 'IsForce' Value = '1' /></ Order ></ Req >
+            var bufin = GetReqStr(ts, param);
+            try
+            {
+                var result = callClient.CancelOrder(bufin);
+                LogHelper.Info($"CancelOrder req={bufin} res={result}", "NDC");
+                return GetResult(result);
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"CancelOrder req={bufin} res={e.Message}", "NDC");
+                return new AGVResult
+                {
+                    Res = new Res
+                    {
+                        ErrCode = -1,
+                        ErrInfo = e.Message
+                    }
+                };
+            }
+        }
+        public static AGVResult StartNewOrderWithQCmd(int ts, Dictionary<string, string> param)
+        {
+            //lpn:      <Order TS='41' Pri='' ExtDeviceNo='{0}' CtrlVal='{1}' DispInfo='{2}' No='{3}' Ext1='' Ext2='' N_CNTR_COUNT='' />
+            //traccif:  <Order TS='164' From='2' To='2' ExtDeviceNo='" + lockNo + "' No='" + DateTime.Now.Ticks.ToString() + "' />
+            //lock:     <Order TS='170'  CtrlVal='" + CtrlVal + "' ExtDeviceNo='" + roadway + "' No='" + DateTime.Now.Ticks.ToString() + "' />
+            var bufin = GetReqStr(ts, param);
+            try
+            {
+                var r = callClient.StartNewOrderWithQCmd(bufin);
+                LogHelper.Info($"StartNewOrderWithQCmd req={bufin} res={r}", "NDC");
+                return GetResult(r);
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"StartNewOrderWithQCmd req={bufin} res={e.Message}", "NDC");
+                return new AGVResult
+                {
+                    Res = new Res
+                    {
+                        ErrCode = -1,
+                        ErrInfo = e.Message
+                    }
+                };
+            }
+        }
+        public static AGVResult ChangeOrder(Dictionary<string, string> param)
+        {
+            //< Req >< Order No = 'TN2302020002' ParamNo = '1' Param1 = '1' /></ Req >
+            var bufin = GetReqStr(0, param);
+            try
+            {
+                var r = callClient.ChangeOrder(bufin);
+                LogHelper.Info($"ChangeOrder req={bufin} res={r}", "NDC");
+                return GetResult(r);
+            }
+            catch (Exception e)
+            {
+                LogHelper.Info($"ChangeOrder req={bufin} res={e.Message}", "NDC");
+                return new AGVResult
+                {
+                    Res = new Res
+                    {
+                        ErrCode = -1,
+                        ErrInfo = e.Message
+                    }
+                };
+            }
+        }
+        private static AGVResult GetResult(string bufout)
+        {
+            //<Res><ErrCode>0</ErrCode><Result>11</Result></Res>
+            XmlDocument xml = new XmlDocument();
+            xml.LoadXml(bufout);
+            var json = JsonConvert.SerializeXmlNode(xml);
+            return JsonConvert.DeserializeObject<AGVResult>(json);
+        }
+        public class AGVResult
+        {
+            public Res Res { get; set; }
+        }
+        public class Res
+        {
+            public int ErrCode { get; set; }
+            public string ErrInfo { get; set; }
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/DispatchService/NDCHelper.cs b/HH.WCS.NongFuChaYuan/DispatchService/NDCHelper.cs
new file mode 100644
index 0000000..98654f0
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/DispatchService/NDCHelper.cs
@@ -0,0 +1,103 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HH.WCS.NongFuChaYuan.DispatchService
+{
+    public class NDCHelper
+    {
+        public static void Test() {
+            //dic.Add("Ext1", ""); dic.Add("Ext2", ""); dic.Add("N_CNTR_COUNT", "");
+            //var r = callClient.AddNewOrderAsync(new AddNewOrderRequest() { bufin = "<Req><Order Pri='1' TS='1' From='1' To='2' No='123471118_1'  Ext1='1' Ext2='CALLADDAGV'  N_CNTR_COUNT='' /></Req>" });
+            //r.Wait();
+
+            var dic = new Dictionary<string, string>();
+            dic.Add("Pri", "1"); dic.Add("From", "1"); dic.Add("To", "1"); dic.Add("No", "12311411718_2");// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", "");
+            var result = NDC.AddNewOrder(1, dic);
+
+            var dic1 = new Dictionary<string, string>();
+            var no = "3454566666";
+            dic1.Add("From", "1"); dic1.Add("To", "0"); dic1.Add("No", no);
+            result = NDC.AddNewOrder(101, dic1);
+
+            var dic2 = new Dictionary<string, string>();
+            dic2.Add("ExtDeviceNo", "1"); dic2.Add("From", "2"); dic2.Add("To", "2"); dic2.Add("No", DateTime.Now.Ticks.ToString()); dic2.Add("CtrlVal", "1");
+            result = NDC.AddNewOrder(39, dic2);
+
+            var dic3 = new Dictionary<string, string>();
+            dic3.Add("From", "1"); dic3.Add("To", "9"); dic3.Add("No", no);
+            result = NDC.CancelOrder(101, dic3);
+
+            var dic4 = new Dictionary<string, string>();
+            dic4.Add("ExtDeviceNo", "1"); dic4.Add("CtrlVal", "1"); dic4.Add("DispInfo", "AAAAAAAA"); dic4.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.StartNewOrderWithQCmd(41, dic4);
+
+            var dic5 = new Dictionary<string, string>();
+            dic5.Add("ExtDeviceNo", "1"); dic5.Add("CtrlVal", "1"); dic5.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.StartNewOrderWithQCmd(170, dic5);
+
+            var dic6 = new Dictionary<string, string>();
+            dic6.Add("ExtDeviceNo", "11"); dic6.Add("From", "2"); dic6.Add("To", "2"); dic6.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.StartNewOrderWithQCmd(164, dic6);
+
+            var dic7 = new Dictionary<string, string>();
+            dic7.Add("Param1", "50"); dic7.Add("No", DateTime.Now.Ticks.ToString());
+            result = NDC.ChangeOrder(dic7);
+        }
+
+
+
+        public static bool ChangeParam(string taskNo, int param1, int paramNo = 0) {
+            bool bResult = false;
+            var dic = new Dictionary<string, string>();
+            dic.Add("No", taskNo);
+            if (paramNo >= 0) {
+                dic.Add("ParamNo", paramNo.ToString());
+            }
+            dic.Add("Param1", param1.ToString());
+            var result = NDC.ChangeOrder(dic);
+            return bResult;
+        }
+
+        public static bool Traffic(string lockNo) {
+            bool bResult = false;
+            var dic = new Dictionary<string, string>();
+            dic.Add("ExtDeviceNo", lockNo);
+            dic.Add("From", "1");
+            dic.Add("To", lockNo); dic.Add("No", DateTime.Now.Ticks.ToString());
+
+            var result = NDC.StartNewOrderWithQCmd(164, dic);
+            return bResult;
+        }
+
+        public static bool Cancel(string taskNo) {
+            bool bResult = false;
+            var dic = new Dictionary<string, string>();
+            dic.Add("No", taskNo);
+            dic.Add("IsForce", "1");
+
+            var result = NDC.CancelOrder(1, dic);
+            return bResult;
+        }
+
+
+        /// <summary>
+        /// 鍏呯數浠诲姟涓嬪彂 SendChargeTask--98
+        /// </summary>
+        /// <param name="agvNo"></param>
+        /// <returns></returns>
+        public static bool SendChargeTask(string agvNo)
+        {
+            bool bResult = false;
+            var dic = new Dictionary<string, string>();
+            dic.Add("Pri", "20"); 
+            dic.Add("ExtDeviceNo", agvNo); 
+            dic.Add("FRow", "");
+            dic.Add("TRow", "");
+            dic.Add("No", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff"));
+            var result = NDC.AddNewOrder(98, dic);
+            if (result != null) bResult = result.Res.ErrCode != -1 ? true : false;
+            return bResult;
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/EasyModbus.dll b/HH.WCS.NongFuChaYuan/EasyModbus.dll
new file mode 100644
index 0000000..484b2da
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/EasyModbus.dll
Binary files differ
diff --git a/HH.WCS.NongFuChaYuan/HH.WCS.NongFuChaYuan.csproj b/HH.WCS.NongFuChaYuan/HH.WCS.NongFuChaYuan.csproj
new file mode 100644
index 0000000..6c7adb0
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/HH.WCS.NongFuChaYuan.csproj
@@ -0,0 +1,173 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{450AAB20-19D7-4C6A-9CDD-50F0EDCB27EC}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>HH.WCS.NongFuChaYuan</RootNamespace>
+    <AssemblyName>HH.WCS.NongFuChaYuan</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </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>
+  <ItemGroup>
+    <Reference Include="EasyModbus">
+      <HintPath>.\EasyModbus.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\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>..\ConsoleApp1\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>..\ConsoleApp1\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>..\ConsoleApp1\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\packages\NLog.5.1.1\lib\net45\NLog.dll</HintPath>
+    </Reference>
+    <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="SqlSugar, Version=5.1.3.46, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\packages\SqlSugar.5.1.3.47\lib\SqlSugar.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Configuration.Install" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Net.Http.Formatting, Version=5.2.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\packages\Microsoft.AspNet.WebApi.Client.5.2.9\lib\net45\System.Net.Http.Formatting.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ServiceProcess" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.Http, Version=5.2.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\packages\Microsoft.AspNet.WebApi.Core.5.2.9\lib\net45\System.Web.Http.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web.Http.Owin, Version=5.2.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\packages\Microsoft.AspNet.WebApi.Owin.5.2.9\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="Topshelf, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b, processorArchitecture=MSIL">
+      <HintPath>..\ConsoleApp1\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>..\ConsoleApp1\packages\Topshelf.NLog.4.3.0\lib\net452\Topshelf.NLog.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ApiService\StandController.cs" />
+    <Compile Include="ApiService\MoboxController.cs" />
+    <Compile Include="ApiService\AgvController.cs" />
+    <Compile Include="ApiService\ApiModel.cs" />
+    <Compile Include="DeviceService\PlcHelper.cs" />
+    <Compile Include="DeviceService\TcpServer.cs" />
+    <Compile Include="DispatchService\GZRobot.cs" />
+    <Compile Include="DispatchService\NDC.cs" />
+    <Compile Include="OtherService\CryptoDecryptHelper.cs" />
+    <Compile Include="OtherService\STAttribute.cs" />
+    <Compile Include="TaskController\Monitor.cs" />
+    <Compile Include="TaskController\DeviceProcess.cs" />
+    <Compile Include="ApiService\ThirdController.cs" />
+    <Compile Include="ApiService\ApiHelper.cs" />
+    <Compile Include="DispatchService\HostToAGV.cs" />
+    <Compile Include="TaskController\TaskProcess.cs" />
+    <Compile Include="OtherService\LogHelper.cs" />
+    <Compile Include="DeviceService\ModbusHelper.cs" />
+    <Compile Include="OtherService\StrHelper.cs" />
+    <Compile Include="WmsService\ContainerHelper.cs" />
+    <Compile Include="WmsService\JobHelper.cs" />
+    <Compile Include="WmsService\LocationHelper.cs" />
+    <Compile Include="WmsService\SYSHelper.cs" />
+    <Compile Include="WmsService\WCSHelper.cs" />
+    <Compile Include="WmsService\IntensiveArea.cs" />
+    <Compile Include="WmsService\WCSModel.cs" />
+    <Compile Include="WmsService\WMSModel.cs" />
+    <Compile Include="DeviceService\OITcpHelper.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="OtherService\Settings.cs" />
+    <Compile Include="OtherService\SqlHelper.cs" />
+    <Compile Include="ApiService\Startup.cs" />
+    <Compile Include="DispatchService\NDCHelper.cs" />
+    <Compile Include="OtherService\HttpHelper.cs" />
+    <Compile Include="OtherService\XmlHelper.cs" />
+    <Compile Include="WmsService\NormalArea.cs" />
+    <Compile Include="WmsService\TaskHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="settings.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="readme.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
+      <Visible>False</Visible>
+      <ProductName>Microsoft .NET Framework 4.6.1 %28x86 鍜�x64%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/HH.WCS.NongFuChaYuan/OtherService/CryptoDecryptHelper.cs b/HH.WCS.NongFuChaYuan/OtherService/CryptoDecryptHelper.cs
new file mode 100644
index 0000000..06a823e
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/CryptoDecryptHelper.cs
@@ -0,0 +1,214 @@
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.OtherService
+{
+    class CryptoDecryptHelper
+    {
+        public static void Test()
+        {
+            #region   鍚庡彴璋冪敤 浼佷笟寰俊鑷缓搴旂敤绋嬪簭 瀹炵幇 瀹炴椂鎶ヨ鍔熻兘
+            //App:tUI9CvF7d3b7_j8njXEQOdp4TGn_aPuALtNYuh9SGb8  閫氳褰�BIrQFYaP6E5ZBYkRHUjeFU2IkzCqsokIM5Bct74U9ec
+            //bool result = WeiXin.Init(1000002, "ww0b0c7633edccae9c", "tUI9CvF7d3b7_j8njXEQOdp4TGn_aPuALtNYuh9SGb8");
+            //if (result)
+            //{
+            //    WeiXin.SendMessageToUser("閮戝宥�,"111111111");
+            //}
+            #endregion
+
+            #region   AES+MD5 鍔犲瘑瑙e瘑鍔熻兘
+            //var str = JsonConvert.SerializeObject(new { platform = "111", actionType = 1, taskNo = "111111", reqTime = "2022-08-03 14:12:00" });
+            //var res = AESEncrypt(str, "de987awms8nfsspt22731o2ts0j833to");
+            //res = AESEncrypt(str, "de987awms8nfsspt22731o2ts0j833to",enmKeyBit.KeyBit128);
+            //res = AESEncrypt(str, "de987awms8nfsspt22731o2ts0j833to", enmKeyBit.KeyBit192);
+            //var req = AESDecrypt(res, "de987awms8nfsspt22731o2ts0j833to");
+            //string TokenMsg = "";
+            //var httpVerify = Settings.GetHttpApiVerifyList().Where(a => a.VerifyNo == "1" && a.Project == Settings.ProjectName && a.Enable == "1").FirstOrDefault();
+            //if (httpVerify != null) TokenMsg = httpVerify.Extend[0] + "from" + httpVerify.Extend[1] + "timestamp" + DateTime.Now.ToString().Replace("/","-");
+            ////Console.WriteLine($"鍔犲瘑鍓嶆槑鏂囷細{TokenMsg}");
+            //string TokenMsgEncrypt = GetMd5FromString(TokenMsg);
+            ////Console.WriteLine($"鍔犲瘑鍚庡瘑鏂�锛歿TokenMsgEncrypt}");
+            //TokenMsgEncrypt = GetMd5Hash(TokenMsg);
+            ////Console.WriteLine($"鍔犲瘑鍚庡瘑鏂�锛歿TokenMsgEncrypt}");
+            //TokenMsgEncrypt = MD5Encrypt16(TokenMsg);
+            ////Console.WriteLine($"鍔犲瘑鍚庡瘑鏂�6锛歿TokenMsgEncrypt}");
+            //TokenMsgEncrypt = MD5Encrypt32(TokenMsg);
+            ////Console.WriteLine($"鍔犲瘑鍚庡瘑鏂�2锛歿TokenMsgEncrypt}");
+            //TokenMsgEncrypt = MD5Encrypt64(TokenMsg);
+            ////Console.WriteLine($"鍔犲瘑鍚庡瘑鏂�4锛歿TokenMsgEncrypt}");
+            #endregion
+        }
+
+        public enum enmKeyBit
+        {
+            KeyBit128 = 128,
+            KeyBit192 = 192,
+            KeyBit256 = 256,
+        }
+        /// <summary>
+        /// AES ECB妯″紡 鍔犲瘑
+        /// </summary>
+        /// <param name="data">鏄庢枃</param>
+        /// <param name="key">瀵嗛挜</param>
+        /// <param name="keyBit">瀵嗛挜浣嶆暟</param>
+        /// <returns></returns>
+        public static string AESEncrypt(String data, String key, enmKeyBit keyBit = enmKeyBit.KeyBit256)
+        {
+            if (string.IsNullOrEmpty(data))
+            {
+                return string.Empty;
+            }
+
+            try
+            {
+                int intKeyBit = (int)keyBit;
+                RijndaelManaged aes = new RijndaelManaged();
+                byte[] bytsData = Encoding.UTF8.GetBytes(data);
+                byte[] bytsKey = new Byte[intKeyBit / 8];
+                Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bytsKey.Length)), bytsKey, bytsKey.Length);
+
+                aes.Mode = CipherMode.ECB;
+                aes.Padding = PaddingMode.PKCS7;
+                aes.KeySize = intKeyBit;
+                aes.Key = bytsKey;
+                //aes.IV = iv;
+                ICryptoTransform ctf = aes.CreateEncryptor();
+                byte[] bytsResult = ctf.TransformFinalBlock(bytsData, 0, bytsData.Length);
+
+                return Convert.ToBase64String(bytsResult);
+            }
+            catch
+            {
+                return string.Empty;
+            }
+        }
+        /// <summary>
+        /// AES ECB妯″紡 瑙e瘑
+        /// </summary>
+        /// <param name="data">瀵嗘枃</param>
+        /// <param name="key">瀵嗛挜</param>
+        /// <param name="keyBit">瀵嗛挜浣嶆暟</param>
+        /// <returns></returns>
+        public static string AESDecrypt(String data, String key, enmKeyBit keyBit = enmKeyBit.KeyBit256)
+        {
+            if (string.IsNullOrEmpty(data))
+            {
+                return string.Empty;
+            }
+            try
+            {
+                int intKeyBit = (int)keyBit;
+                RijndaelManaged aes = new RijndaelManaged();
+                byte[] bytsData = Convert.FromBase64String(data);
+                byte[] bytsKey = new Byte[intKeyBit / 8];
+                Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bytsKey.Length)), bytsKey, bytsKey.Length);
+
+                aes.Mode = CipherMode.ECB;
+                aes.Padding = PaddingMode.PKCS7;
+                aes.KeySize = intKeyBit;
+                aes.Key = bytsKey;
+                //aes.IV = iv;
+
+                ICryptoTransform ctf = aes.CreateDecryptor();
+                byte[] bytsResult = ctf.TransformFinalBlock(bytsData, 0, bytsData.Length);
+
+                return UTF8Encoding.UTF8.GetString(bytsResult);
+            }
+            catch
+            {
+                return string.Empty;
+            }
+        }
+
+        /// <summary>
+        /// MD5鍔犲瘑
+        /// </summary>
+        /// <param name="sInput"></param>
+        /// <returns></returns>
+        public static string GetMd5FromString(string sInput)
+        {
+            var lstData = Encoding.GetEncoding("utf-8").GetBytes(sInput);
+            var lstHash = new MD5CryptoServiceProvider().ComputeHash(lstData);
+            var result = new StringBuilder(32);
+            for (int i = 0; i < lstHash.Length; i++)
+            {
+                result.Append(lstHash[i].ToString("x2").ToUpper());
+            }
+            return result.ToString();
+        }
+        /// <summary>
+        /// MD5鍔犲瘑鏂瑰紡浜�+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        static string GetMd5Hash(string input)
+        {
+            using (MD5 md5 = MD5.Create())
+            {
+                byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
+                StringBuilder sb = new StringBuilder();
+                for (int i = 0; i < data.Length; i++)
+                {
+                    sb.Append(data[i].ToString("x2"));
+                }
+                return sb.ToString();
+            }
+        }
+
+        /// <summary>
+        /// 16浣峂D5鍔犲瘑
+        /// </summary>
+        /// <param name="password"></param>
+        /// <returns></returns>
+        public static string MD5Encrypt16(string password)
+        {
+            var md5 = new MD5CryptoServiceProvider();
+            string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8);
+            t2 = t2.Replace("-", "");
+            return t2;
+        }
+
+        /// <summary>
+        /// 32浣峂D5鍔犲瘑
+        /// </summary>
+        /// <param name="password"></param>
+        /// <returns></returns>
+        public static string MD5Encrypt32(string password)
+        {
+            string cl = password;
+            string pwd = "";
+            MD5 md5 = MD5.Create(); //瀹炰緥鍖栦竴涓猰d5瀵瑰儚
+                                    // 鍔犲瘑鍚庢槸涓�釜瀛楄妭绫诲瀷鐨勬暟缁勶紝杩欓噷瑕佹敞鎰忕紪鐮乁TF8/Unicode绛夌殑閫夋嫨銆�+            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
+            // 閫氳繃浣跨敤寰幆锛屽皢瀛楄妭绫诲瀷鐨勬暟缁勮浆鎹负瀛楃涓诧紝姝ゅ瓧绗︿覆鏄父瑙勫瓧绗︽牸寮忓寲鎵�緱
+            for (int i = 0; i < s.Length; i++)
+            {
+                // 灏嗗緱鍒扮殑瀛楃涓蹭娇鐢ㄥ崄鍏繘鍒剁被鍨嬫牸寮忋�鏍煎紡鍚庣殑瀛楃鏄皬鍐欑殑瀛楁瘝锛屽鏋滀娇鐢ㄥぇ鍐欙紙X锛夊垯鏍煎紡鍚庣殑瀛楃鏄ぇ鍐欏瓧绗�
+                pwd = pwd + s[i].ToString("X");
+            }
+            return pwd;
+        }
+
+        /// <summary>
+        /// 64浣峂D5鍔犲瘑
+        /// </summary>
+        /// <param name="password"></param>
+        /// <returns></returns>
+        public static string MD5Encrypt64(string password)
+        {
+            string cl = password;
+            //string pwd = "";
+            MD5 md5 = MD5.Create(); //瀹炰緥鍖栦竴涓猰d5瀵瑰儚
+                                    // 鍔犲瘑鍚庢槸涓�釜瀛楄妭绫诲瀷鐨勬暟缁勶紝杩欓噷瑕佹敞鎰忕紪鐮乁TF8/Unicode绛夌殑閫夋嫨銆�+            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
+            return Convert.ToBase64String(s);
+        }
+    }
+}
+
+
diff --git a/HH.WCS.NongFuChaYuan/OtherService/HttpHelper.cs b/HH.WCS.NongFuChaYuan/OtherService/HttpHelper.cs
new file mode 100644
index 0000000..9cdb6f0
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/HttpHelper.cs
@@ -0,0 +1,204 @@
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text;
+
+namespace HH.WCS.NongFuChaYuan.OtherService
+{
+    public class HttpHelper
+    {
+
+		public string WebPost(string url, string postData, string cotentType = "application/json", string token = "", string timestamp = "", bool Extend = false)
+		{
+			//Console.WriteLine(url);
+			WebRequest request = WebRequest.Create(url);
+			request.Method = "POST";
+			//string postData = JsonConvert.SerializeObject(data); 
+
+			//鎺ュ彛鍔犲瘑棰濆澧炲姞 Header 瀛楁
+			if (!string.IsNullOrEmpty(token) && (!string.IsNullOrEmpty(timestamp)))
+			{
+				switch (Settings.ProjectName)
+				{
+					case "鍐滃か鑼跺洯":
+						request.Headers.Set("token", token);//MD5鍔犲瘑鍚嶵oken鍊�+						request.Headers.Set("from", "MOBOX");//鏉ユ簮绯荤粺鍙�+						request.Headers.Set("timestamp", timestamp);//鏃堕棿鎴�+						if (Extend) request.Headers.Set("proxyInterfaceCode", Settings.OneSign);//MES浠诲姟鍥炴姤鎺ュ彛娣诲姞 鍞竴鏍囪瘑
+						break;
+					case "璋冭瘯妯″紡":
+						request.Headers.Set("Authorization", "Basic admin:123");//鍩烘湰韬唤楠岃瘉 Authorization  榛樿浼犺緭鍊硷細Basic admin:123
+						break;
+				}
+			}
+
+			LogHelper.Info($"澶撮儴淇℃伅 {JsonConvert.SerializeObject(request.Headers)}");
+			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 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/HH.WCS.NongFuChaYuan/OtherService/LogHelper.cs b/HH.WCS.NongFuChaYuan/OtherService/LogHelper.cs
new file mode 100644
index 0000000..91e9ea1
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/LogHelper.cs
@@ -0,0 +1,140 @@
+锘縰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.NongFuChaYuan
+{
+
+    public class LogHelper
+    {
+        public static Dictionary<string, ILogger> loggers = new Dictionary<string, ILogger>();
+
+        public static void Debug(string message, string name = "") {
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name)) {
+                logger = loggers[name];
+            }
+            else {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null) {
+                    loggers.Add(name, logger);
+                }
+                else {
+                    logger = LogFactory.CreateLogger("console");
+                }
+            }
+            if (logger != null) {
+                logger.Debug(message);
+            }
+        }
+
+        public static void Info(string message, string name = "") {
+            //logger.Info(message);
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name)) {
+                logger = loggers[name];
+            }
+            else {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null) {
+                    loggers.Add(name, logger);
+                }
+                else {
+                    logger = LogFactory.CreateLogger("infoFile");
+                }
+            }
+            if (logger != null) {
+                logger.Info(message);
+            }
+        }
+
+        public static void Error(string message, Exception ex, string name = "") {
+            //logger.Error(ex, message);
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name)) {
+                logger = loggers[name];
+            }
+            else {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null) {
+                    loggers.Add(name, logger);
+                }
+                else {
+                    logger = LogFactory.CreateLogger("errorFile");
+                }
+            }
+            if (logger != null) {
+                logger.Error($"{message}{ex.StackTrace}");
+            }
+        }
+    }
+
+    internal class LogFactory
+    {
+        /// <summary>
+        /// 閫氳繃閰嶇疆鏂囦欢閰嶇疆鏃ュ織
+        /// </summary>
+        static LogFactory() {
+            var loggerNames = new List<string>() { "HosttoagvTask", "HosttoagvCar", "NDC", "ThirdSystemLog", "MoboxTask", "WMSAlgoRithm","Monitor","Plc", "娓呮磥浣嶈ˉ绌烘墭", "鑷姩闂�, "鐢垫", "鐡剁洊鏈�, "缈绘枟鏈�, "杈撻�绾�, "鐢垫浠诲姟","瀹夊叏浜や簰","鑷姩绉诲簱","娉ㄥ鏈� };
+            LogManager.Configuration = DefaultConfig(loggerNames);
+        }
+        public static ILogger CreateLogger(string name) {
+            var logger = LogManager.GetLogger(name);
+            return logger;
+        }
+
+        public static LoggingConfiguration DefaultConfig(List<string> loggerNames) {
+            var config = new LoggingConfiguration();
+            loggerNames.ForEach(a => {
+                var target = new FileTarget();
+                target.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+                target.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+                target.ArchiveFileName = @"${basedir}/Logs/" + a + "/{####}.txt";
+                target.FileName = @"${basedir}/Logs/" + a + "/${shortdate}.txt";//褰撳墠鏂囦欢璺緞
+                target.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+                config.AddTarget(a, target);
+                config.AddRuleForOneLevel(LogLevel.Info, target, a);
+            });
+
+
+            // 娣诲姞target-console
+            //var consoleTarget = new ColoredConsoleTarget();
+            //consoleTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            //config.AddTarget("console", consoleTarget);
+            //config.AddRule(LogLevel.Debug, LogLevel.Fatal, consoleTarget);
+
+            //娣诲姞target-info
+            var infoFileTarget = new FileTarget();
+            infoFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+            infoFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+            infoFileTarget.ArchiveFileName = @"${basedir}/Logs/Info/{####}.txt";
+            infoFileTarget.FileName = @"${basedir}/Logs/Info/${shortdate}.txt";//褰撳墠鏂囦欢璺緞
+            infoFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("infoFile", infoFileTarget);
+            config.AddRuleForOneLevel(LogLevel.Info, infoFileTarget);//INFO鍐欏湪Info鏂囦欢
+
+            //娣诲姞target-err
+            var errorFileTarget = new FileTarget();
+            errorFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+            errorFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+            errorFileTarget.ArchiveFileName = @"${basedir}/Logs/Error/{####}.txt";
+            errorFileTarget.FileName = @"${basedir}/Logs/Error/${shortdate}.txt";
+            errorFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("errorFile", errorFileTarget);
+            config.AddRule(LogLevel.Error, LogLevel.Fatal, errorFileTarget);
+
+
+            return config;
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/OtherService/STAttribute.cs b/HH.WCS.NongFuChaYuan/OtherService/STAttribute.cs
new file mode 100644
index 0000000..345d2bc
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/STAttribute.cs
@@ -0,0 +1,49 @@
+锘縰sing HH.WCS.NongFuChaYuan.WmsService;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.OtherService
+{
+    [AttributeUsage(AttributeTargets.Class, Inherited = true)]
+    class STAttribute : SugarTable
+    {
+        public static Dictionary<string, string> TableModelName = new Dictionary<string, string>();
+
+        public STAttribute(string tableName) : base(tableName)
+        {
+            string value = "";
+            if (TableModelName.TryGetValue(TableName, out value))
+            {
+                TableName = value;
+            }
+        }
+
+        public static void InitTableName()
+        {
+            //Console.WriteLine($"StartUp Init TableName...");
+            var tableName = Settings.GetTableNameList().Where(a => a.TableProType == Settings.TableProType).ToList();
+            if (tableName.Count > 0)
+            {
+                tableName.ForEach(a =>
+                {
+                    if (!TableModelName.Keys.Contains(a.TableName)) TableModelName.Add(a.TableName, a.TableSqlName);
+                });
+            }
+            //Console.WriteLine($"StartUp Init TableName Complete!");
+        }
+        /// <summary>
+        /// 鍒涘缓鏁版嵁涓棿琛ㄨ〃
+        /// </summary>
+        /// <returns></returns>
+        public static void CreateMiddleTable()
+        {
+            var order = new SqlHelper<HangChaAGV>().CreateTable();//瀵屽嫆浼犺緭鎵樼洏淇℃伅琛�+            var order1 = new SqlHelper<MarginAGV>().CreateTable();//璁惧淇″彿鏃堕棿涓棿琛�+            //var order2 = new SqlHelper<DaMingShanDeviceState>().CreateTable();
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/OtherService/Settings.cs b/HH.WCS.NongFuChaYuan/OtherService/Settings.cs
new file mode 100644
index 0000000..593d957
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/Settings.cs
@@ -0,0 +1,1177 @@
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.OtherService
+{
+    public class Settings
+    {
+        #region   椤圭洰娴佺▼閰嶇疆鍖哄煙
+
+        #region ProjectName
+        private static string _ProjectName = "";
+        public static string ProjectName
+        {
+            get
+            {
+                if (_ProjectName == "")
+                {
+                    _ProjectName = XmlHelper.GetElementValue("ProjectName");
+                }
+                return _ProjectName;
+            }
+        }
+        #endregion
+
+        #region TableProType
+        private static string _TableProType = "";
+        public static string TableProType
+        {
+            get
+            {
+                if (_TableProType == "")
+                {
+                    _TableProType = XmlHelper.GetElementValue("TableProType");
+                }
+                return _TableProType;
+            }
+        }
+        #endregion
+
+        #region TableName
+        private static string _TableName = "";
+        private static string TableNameList
+        {
+            get
+            {
+                if (_TableName == "")
+                {
+                    _TableName = XmlHelper.GetElementValue("TableName");
+                }
+                return _TableName;
+            }
+        }
+
+        private static List<TableNameModel> TableNames = new List<TableNameModel>();
+        public static List<TableNameModel> GetTableNameList()
+        {
+            if (TableNames.Count == 0 && TableNameList != "")
+            {
+                TableNames = Newtonsoft.Json.JsonConvert.DeserializeObject<List<TableNameModel>>(TableNameList);
+            }
+            return TableNames;
+        }
+
+        public class TableNameModel
+        {
+            /// <summary>
+            /// 琛ㄥ悕鏍囪瘑锛氫究浜庡疄鏂借鐪�+            /// </summary>
+            public string TableSignNo { get; set; }
+            /// <summary>
+            /// 娉涙剰琛ㄥ悕
+            /// </summary>
+            public string TableName { get; set; }
+            /// <summary>
+            /// 鏁版嵁搴撳疄闄呰〃鍚�+            /// </summary>
+            public string TableSqlName { get; set; }
+            /// <summary>
+            /// 椤圭洰琛ㄧ被鍨�+            /// </summary>
+            public string TableProType { get; set; }
+            /// <summary>
+            /// 鏄惁鍚敤
+            /// </summary>
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #region FactoryCode
+        private static string _FactoryCode = "";
+        public static string FactoryCode
+        {
+            get
+            {
+                if (_FactoryCode == "")
+                {
+                    _FactoryCode = XmlHelper.GetElementValue("FactoryCode");
+                }
+                return _FactoryCode;
+            }
+        }
+        #endregion
+
+        #region FactoryName
+        private static string _FactoryName = "";
+        public static string FactoryName
+        {
+            get
+            {
+                if (_FactoryName == "")
+                {
+                    _FactoryName = XmlHelper.GetElementValue("FactoryName");
+                }
+                return _FactoryName;
+            }
+        }
+        #endregion
+
+        #region OneSign
+        private static string _OneSign = "";
+        public static string OneSign
+        {
+            get
+            {
+                if (_OneSign == "")
+                {
+                    _OneSign = XmlHelper.GetElementValue("OneSign");
+                }
+                return _OneSign;
+            }
+        }
+        #endregion
+
+        #endregion
+
+        #region   URL閰嶇疆鍖哄煙
+
+        #region HostToAgvServerUrl
+        private static string _hostToAgvServerUrl = "";
+        public static string HostToAgvServerUrl
+        {
+            get
+            {
+                if (_hostToAgvServerUrl == "")
+                {
+                    _hostToAgvServerUrl = XmlHelper.GetElementValue("HostToAgvServerUrl");
+                }
+                return _hostToAgvServerUrl;
+            }
+        }
+        #endregion
+
+        #region OITcpServerUrl
+        private static string _OITcpServerUrl = "";
+        public static string OITcpSeverUrl
+        {
+            get
+            {
+                if (_OITcpServerUrl == "")
+                {
+                    _OITcpServerUrl = XmlHelper.GetElementValue("OITcpServerUrl");
+                }
+                return _OITcpServerUrl;
+            }
+        }
+        #endregion
+
+        #region HttpUrlPort
+        private static string _HttpUrlPort = "";
+        public static string HttpUrlPort
+        {
+            get
+            {
+                if (_HttpUrlPort == "")
+                {
+                    _HttpUrlPort = XmlHelper.GetElementValue("HttpUrlPort");
+                }
+                return _HttpUrlPort;
+            }
+        }
+        #endregion
+
+        #region TcpPort
+        private static string _TcpPort = "";
+        public static string TcpPort
+        {
+            get
+            {
+                if (_TcpPort == "")
+                {
+                    _TcpPort = XmlHelper.GetElementValue("TcpPort");
+                }
+                return _TcpPort;
+            }
+        }
+        #endregion
+
+        #region SqlServer
+        private static string _SqlServer = "";
+        public static string SqlServer
+        {
+            get
+            {
+                if (_SqlServer == "")
+                {
+                    _SqlServer = XmlHelper.GetElementValue("SqlServer");
+                }
+                return _SqlServer;
+            }
+        }
+        #endregion
+
+        #region ThirdPartyUrl
+        private static string _ThirdPartyUrl = "";
+        private static string ThirdPartyUrlList
+        {
+            get
+            {
+                if (_ThirdPartyUrl == "")
+                {
+                    _ThirdPartyUrl = XmlHelper.GetElementValue("ThirdPartyUrl");
+                }
+                return _ThirdPartyUrl;
+            }
+        }
+
+        private static List<ThirdPartyUrlModel> ThirdPartyUrls = new List<ThirdPartyUrlModel>();
+        public static List<ThirdPartyUrlModel> GetThirdPartyUrlList()
+        {
+            if (ThirdPartyUrls.Count == 0 && ThirdPartyUrlList != "")
+            {
+                ThirdPartyUrls = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ThirdPartyUrlModel>>(ThirdPartyUrlList);
+            }
+            return ThirdPartyUrls;
+        }
+
+        public class ThirdPartyUrlModel
+        {
+            /// <summary>
+            /// URL缂栧彿-鍞竴
+            /// </summary>
+            public string UrlNo { get; set; }
+            /// <summary>
+            /// URL鏍囪瘑鍚�+            /// </summary>
+            public string UrlName { get; set; }
+            /// <summary>
+            /// URL璺緞
+            /// </summary>
+            public string Url { get; set; }
+            /// <summary>
+            /// 鏄惁鍚敤
+            /// </summary>
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #region HttpApiVerify
+        private static string _HttpApiVerify = "";
+        private static string HttpApiVerifyList
+        {
+            get
+            {
+                if (_HttpApiVerify == "")
+                {
+                    _HttpApiVerify = XmlHelper.GetElementValue("HttpApiVerify");
+                }
+                return _HttpApiVerify;
+            }
+        }
+
+        private static List<HttpApiVerifyModel> HttpApiVerifys = new List<HttpApiVerifyModel>();
+        public static List<HttpApiVerifyModel> GetHttpApiVerifyList()
+        {
+            if (HttpApiVerifys.Count == 0 && HttpApiVerifyList != "")
+            {
+                HttpApiVerifys = Newtonsoft.Json.JsonConvert.DeserializeObject<List<HttpApiVerifyModel>>(HttpApiVerifyList);
+            }
+            return HttpApiVerifys;
+        }
+
+        public class HttpApiVerifyModel
+        {
+            /// <summary>
+            /// 楠岃瘉缂栫爜
+            /// </summary>
+            public string VerifyNo { get; set; }
+            /// <summary>
+            /// 椤圭洰缂栫爜
+            /// </summary>
+            public string Project { get; set; }
+            /// <summary>
+            /// 鎵╁睍缂栫爜
+            /// </summary>
+            public string[] Extend { get; set; }
+            /// <summary>
+            /// 鏄惁鍚敤
+            /// </summary>
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #endregion
+
+        #region   璁惧鍗忚閰嶇疆鍖哄煙
+
+        #region DeviceInfo
+        private static string _deviceInfo = "";
+        private static string deviceInfoList
+        {
+            get
+            {
+                if (_deviceInfo == "")
+                {
+                    _deviceInfo = XmlHelper.GetElementValue("deviceInfo");
+                }
+                return _deviceInfo;
+            }
+        }
+
+        private static List<deviceInfo> deviceInfos = new List<deviceInfo>();
+        public static List<deviceInfo> GetDeviceInfoList()
+        {
+            if (deviceInfos.Count == 0 && deviceInfoList != "")
+            {
+                deviceInfos = Newtonsoft.Json.JsonConvert.DeserializeObject<List<deviceInfo>>(deviceInfoList);
+            }
+            return deviceInfos;
+        }
+
+        public class deviceInfo
+        {
+            public string address { get; set; }
+            public string deviceName { get; set; }
+            public string[] deviceNo { get; set; }
+            public string[] location { get; set; }
+            /// <summary>
+            /// deviceType=1 鑷姩闂紱deviceType=2 鐡剁洊鏈�鏃犺弻鐩栵紱deviceType=3 鐡剁洊鏈�姘寸洊锛沝eviceType=4 缈绘枟鏈猴紙姘寸洊锛夛紱
+            /// deviceType=5 缈绘枟鏈猴紙鏃犺弻鐩�v1/v2锛夛紱deviceType=6 缈绘枟鏈猴紙鏃犺弻鐩�v6锛夛紱deviceType=7 缈绘枟鏈猴紙鏃犺弻鐩�v8锛�+            /// </summary>
+            public int deviceType { get; set; }
+            public int enable { get; set; }
+        }
+        #endregion
+
+        #region   ModBusTcpPlc
+        private static string _ModBusTcpPlc = "";
+        private static string ModBusTcpPlc
+        {
+            get
+            {
+                if (_ModBusTcpPlc == "")
+                {
+                    _ModBusTcpPlc = XmlHelper.GetElementValue("ModBusTcpPlc");
+                }
+                return _ModBusTcpPlc;
+            }
+        }
+        public static List<ModBusTcpPlcModel> GetModBusTcpPlc()
+        {
+            return JsonConvert.DeserializeObject<List<ModBusTcpPlcModel>>(ModBusTcpPlc);
+        }
+        public class ModBusTcpPlcModel
+        {
+            public string device { get; set; }
+            public string deviceType { get; set; }
+            public string ip { get; set; }
+            public int readAddr { get; set; }
+            public int writeAddr { get; set; }
+            public string location { get; set; }
+            public int enable { get; set; }
+            public int port { get; set; }
+        }
+        #endregion
+
+        #region   ChargingPile
+
+        #region   BatteryTime
+        private static string _BatteryTime = "";
+        public static string BatteryTime
+        {
+            get
+            {
+                if (_BatteryTime == "")
+                {
+                    _BatteryTime = XmlHelper.GetElementValue("BatteryTime");
+                }
+                return _BatteryTime;
+            }
+        }
+        #endregion
+
+        #region   BatteryTimeEnd
+        private static string _BatteryTimeEnd = "";
+        public static string BatteryTimeEnd
+        {
+            get
+            {
+                if (_BatteryTimeEnd == "")
+                {
+                    _BatteryTimeEnd = XmlHelper.GetElementValue("BatteryTimeEnd");
+                }
+                return _BatteryTimeEnd;
+            }
+        }
+        #endregion
+
+        #region 鍏呯數妗╀俊鎭�+        private static string _ChargingPile = "";
+        private static string ChargingPile
+        {
+            get
+            {
+                if (_ChargingPile == "")
+                {
+                    _ChargingPile = XmlHelper.GetElementValue("ChargingPile");
+                }
+                return _ChargingPile;
+            }
+        }
+        public static List<ChargingPileInfo> GetChargingPile()
+        {
+            return JsonConvert.DeserializeObject<List<ChargingPileInfo>>(ChargingPile);
+        }
+        public class ChargingPileInfo
+        {
+            public string agvNo { get; set; }
+            public string agvType { get; set; }
+            public string charginGroup { get; set; }
+            public string charginIP { get; set; }
+            public string agvBit { get; set; }
+            public string enable { get; set; }
+        }
+        #endregion
+
+        #endregion
+
+        #endregion
+
+        #region   鐗规畩娴佺▼閰嶇疆鍖哄煙
+
+        #region   姹熻嫃瑗块棬瀛愰厤缃尯鍩�+
+        #region   姹熻嫃瑗块棬瀛�鐗规畩鐐逛綅閰嶇疆鑾峰彇
+        private static string _SpecialPoint = "";
+        private static string SpecialPoint
+        {
+            get
+            {
+                if (_SpecialPoint == "")
+                {
+                    _SpecialPoint = XmlHelper.GetElementValue("XiMenZiSpecialPoint");
+                }
+                return _SpecialPoint;
+            }
+        }
+        private static List<SpecialPointModel> SpecialPointList = new List<SpecialPointModel>();
+        public static List<SpecialPointModel> GetSpecialPointList()
+        {
+            if (SpecialPointList.Count == 0 && SpecialPoint != "")
+            {
+                SpecialPointList = JsonConvert.DeserializeObject<List<SpecialPointModel>>(SpecialPoint);
+            }
+            return SpecialPointList;
+        }
+        public class SpecialPointModel
+        {
+            /// <summary>
+            /// 璐т綅缂栫爜
+            /// </summary>
+            public string Location { get; set; }
+            /// <summary>
+            /// AGV绔欑偣鍙�+            /// </summary>
+            public string AgvCode { get; set; }
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #endregion
+
+        #region   鍐滃か鍧囧窞閰嶇疆鍖哄煙
+
+        #region _elevatorIP
+        private static string _elevatorIP = "";
+        public static string ElevatorIP
+        {
+            get
+            {
+                if (_elevatorIP == "")
+                {
+                    _elevatorIP = XmlHelper.GetElementValue("elevatorIP");
+                }
+                return _elevatorIP;
+            }
+        }
+        #endregion
+
+        #region _elevatorWaitMinute
+        private static int _elevatorWaitMinute = 0;
+        public static int ElevatorWaitMinute
+        {
+            get
+            {
+                if (_elevatorWaitMinute == 0)
+                {
+                    _elevatorWaitMinute = int.Parse(XmlHelper.GetElementValue("elevatorWaitMinute"));
+                }
+                return _elevatorWaitMinute;
+            }
+        }
+        #endregion
+
+        #region elevatorCacheBit
+        private static string _elevatorCacheBit = "";
+        private static string elevatorCacheList
+        {
+            get
+            {
+                if (_elevatorCacheBit == "")
+                {
+                    _elevatorCacheBit = XmlHelper.GetElementValue("elevatorCacheBit");
+                }
+                return _elevatorCacheBit;
+            }
+        }
+
+        private static List<elevatorCacheBit> elevatorCacheBits = new List<elevatorCacheBit>();
+        public static List<elevatorCacheBit> GetElevatorCacheBits()
+        {
+            //Console.WriteLine("elevatorCacheList  =" + elevatorCacheList);
+            if (elevatorCacheBits.Count == 0 && elevatorCacheList != "")
+            {
+                elevatorCacheBits = Newtonsoft.Json.JsonConvert.DeserializeObject<List<elevatorCacheBit>>(elevatorCacheList);
+            }
+            return elevatorCacheBits;
+        }
+        /// <summary>
+        ///  {"location":"鍐呴儴璐т綅","order":0,"agvBits":[100,101]},
+        /// </summary>
+        public class elevatorCacheBit
+        {
+
+            public string location { get; set; }
+
+            public int order { get; set; }
+            public int[] agvBits { get; set; }
+
+        }
+        #endregion
+
+        #region elevatorDoor
+        private static string _elevatorDoor = "";
+        public static string elevatorDoorList
+        {
+            get
+            {
+                if (_elevatorDoor == "")
+                {
+                    _elevatorDoor = XmlHelper.GetElementValue("elevatorDoor");
+                }
+                return _elevatorDoor;
+            }
+        }
+
+        private static List<elevatorDoor> elevatorDoors = new List<elevatorDoor>();
+        public static List<elevatorDoor> GetelEvatorDoorList()
+        {
+            if (elevatorDoors.Count == 0 && elevatorDoorList != "")
+            {
+                elevatorDoors = Newtonsoft.Json.JsonConvert.DeserializeObject<List<elevatorDoor>>(elevatorDoorList);
+            }
+            return elevatorDoors;
+        }
+
+        public class elevatorDoor
+        {
+            public string door { get; set; }
+            public int floor { get; set; }
+            public int addr { get; set; }
+
+
+        }
+        #endregion
+
+        #region tipperCacheBit
+        private static string _tipperCacheBit = "";
+        private static string tipperCacheBitList
+        {
+            get
+            {
+                if (_tipperCacheBit == "")
+                {
+                    _tipperCacheBit = XmlHelper.GetElementValue("tipperCacheBit");
+                }
+                return _tipperCacheBit;
+            }
+        }
+
+        private static List<TipperCacheBit> tipperCacheBits = new List<TipperCacheBit>();
+        public static List<TipperCacheBit> GetTipperCacheList()
+        {
+            if (tipperCacheBits.Count == 0 && tipperCacheBitList != "")
+            {
+                tipperCacheBits = Newtonsoft.Json.JsonConvert.DeserializeObject<List<TipperCacheBit>>(tipperCacheBitList);
+            }
+            return tipperCacheBits;
+        }
+
+        public class TipperCacheBit
+        {
+            public string deviceName { get; set; }
+            public string[] location { get; set; }
+            /// <summary>
+            ///locationType=11 婊℃墭浣�      locationType=12 绌洪搧绛�      locationType=13 绌哄鏂欑瓙     
+            /// </summary>
+            public int locationType { get; set; }
+
+        }
+        #endregion
+
+        #region outStockCacheBit
+        private static string _outStockCacheBit = "";
+        private static string outStockCacheBitList
+        {
+            get
+            {
+                if (_outStockCacheBit == "")
+                {
+                    _outStockCacheBit = XmlHelper.GetElementValue("outStockCacheBit");
+                }
+                return _outStockCacheBit;
+            }
+        }
+
+        private static List<outStockCacheBit> outStockCacheBits = new List<outStockCacheBit>();
+        public static List<outStockCacheBit> GetOutStockCacheList()
+        {
+            if (outStockCacheBits.Count == 0 && outStockCacheBitList != "")
+            {
+                outStockCacheBits = Newtonsoft.Json.JsonConvert.DeserializeObject<List<outStockCacheBit>>(outStockCacheBitList);
+            }
+            return outStockCacheBits;
+        }
+
+        public class outStockCacheBit
+        {
+            public string areaName { get; set; }
+            public string[] location { get; set; }
+            /// <summary>
+            ///locationType=1 鏃犺弻鐩栨弧锛坮ow=0涓撻棬缁橵6锛� locationType=2 姘寸洊婊�
+            ///locationType=3 閾佺┖2灞�loationType = 4 濉戞枡绌�灞�+            ///locationType = 4 v8婊�locationType = 5 v8閾佺┖ locationType = 6 v8濉戞枡绌�+            /// </summary>
+            public int locationType { get; set; }
+            public int row { get; set; }
+
+        }
+        #endregion
+
+        #region rawMaterialCacheBit
+        private static string _rawMaterialCacheBit = "";
+        private static string rawMaterialCacheBitList
+        {
+            get
+            {
+                if (_rawMaterialCacheBit == "")
+                {
+                    _rawMaterialCacheBit = XmlHelper.GetElementValue("rawMaterialCacheBit");
+                }
+                return _rawMaterialCacheBit;
+            }
+        }
+
+        private static List<RawMaterialCacheBit> rawMaterialCacheBits = new List<RawMaterialCacheBit>();
+        public static List<RawMaterialCacheBit> GetRawMaterialCacheList()
+        {
+            if (rawMaterialCacheBits.Count == 0 && rawMaterialCacheBitList != "")
+            {
+                rawMaterialCacheBits = Newtonsoft.Json.JsonConvert.DeserializeObject<List<RawMaterialCacheBit>>(rawMaterialCacheBitList);
+            }
+            return rawMaterialCacheBits;
+        }
+
+        public class RawMaterialCacheBit
+        {
+            public string[] location { get; set; }
+            public int locationType { get; set; }
+            public int row { get; set; }
+
+        }
+        #endregion
+
+        #region outStockCacheBit
+        private static string _outgoCacheBit = "";
+        private static string outgoCacheBitList
+        {
+            get
+            {
+                if (_outgoCacheBit == "")
+                {
+                    _outgoCacheBit = XmlHelper.GetElementValue("outgoCacheBit");
+                }
+                return _outgoCacheBit;
+            }
+        }
+
+        private static List<OutgoCacheBit> outgoCacheBits = new List<OutgoCacheBit>();
+        public static List<OutgoCacheBit> GetOutgoCacheList()
+        {
+            if (outgoCacheBits.Count == 0 && outgoCacheBitList != "")
+            {
+                outgoCacheBits = Newtonsoft.Json.JsonConvert.DeserializeObject<List<OutgoCacheBit>>(outgoCacheBitList);
+            }
+            return outgoCacheBits;
+        }
+
+        public class OutgoCacheBit
+        {
+            public string[] location { get; set; }
+            public int locationType { get; set; }
+            public int row { get; set; }
+
+        }
+        #endregion
+
+        #endregion
+
+        #region   鍐滃か娣冲畨閰嶇疆鍖哄煙
+
+        #region   鍐滃か娣冲畨-鐢熶骇浜х嚎浼樺厛搴撳尯鑾峰彇
+        private static string _ChunAnPriProLine = "";
+        private static string ChunAnPriProLine
+        {
+            get
+            {
+                if (_ChunAnPriProLine == "")
+                {
+                    _ChunAnPriProLine = XmlHelper.GetElementValue("ChunAnPriProLine");
+                }
+                return _ChunAnPriProLine;
+            }
+        }
+        private static List<ChunAnPriProLineModel> ChunAnPriProLineList = new List<ChunAnPriProLineModel>();
+        public static List<ChunAnPriProLineModel> GetChunAnPriProLineList()
+        {
+            if (ChunAnPriProLineList.Count == 0 && ChunAnPriProLine != "")
+            {
+                ChunAnPriProLineList = JsonConvert.DeserializeObject<List<ChunAnPriProLineModel>>(ChunAnPriProLine);
+            }
+            return ChunAnPriProLineList;
+        }
+        public class ChunAnPriProLineModel
+        {
+            public string ItemName { get; set; }
+            public string ItemTrayType { get; set; }
+            public string AgvItemLayer { get; set; }
+            public string[] ProductArea { get; set; }
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #region   鍐滃か娣冲畨-鐗规畩搴撳尯缂栫爜閰嶇疆
+        private static string _ChunAnExtendArea = "";
+        private static string ChunAnExtendArea
+        {
+            get
+            {
+                if (_ChunAnExtendArea == "")
+                {
+                    _ChunAnExtendArea = XmlHelper.GetElementValue("ChunAnExtendArea");
+                }
+                return _ChunAnExtendArea;
+            }
+        }
+        private static List<ChunAnExtendAreaModel> ChunAnExtendAreaList = new List<ChunAnExtendAreaModel>();
+        public static List<ChunAnExtendAreaModel> GetChunAnExtendAreaList()
+        {
+            if (ChunAnExtendAreaList.Count == 0 && ChunAnExtendArea != "")
+            {
+                ChunAnExtendAreaList = JsonConvert.DeserializeObject<List<ChunAnExtendAreaModel>>(ChunAnExtendArea);
+            }
+            return ChunAnExtendAreaList;
+        }
+        public class ChunAnExtendAreaModel
+        {
+            public string AreaName { get; set; }
+            /// <summary>
+            /// AGV鍙傛暟4
+            /// </summary>
+            public string AgvTRow4 { get; set; }
+            public string[] AreaNo { get; set; }
+            public string[] ExtendNo { get; set; }
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #endregion
+
+        #region 鍐滃か澶ф槑灞遍厤缃尯鍩�+
+        #region 鐡跺澂鍖哄煙涓婁笅绾挎寚瀹氬簱鍖�+        private static string _DaMingShanPriProLine = "";
+        private static string DaMingShanPriProLine
+        {
+            get
+            {
+                if (_DaMingShanPriProLine == "")
+                {
+                    _DaMingShanPriProLine = XmlHelper.GetElementValue("DaMingShanPriProLine");
+                }
+                return _DaMingShanPriProLine;
+            }
+        }
+        private static List<DaMingShanPriProLineModel> DaMingShanPriProLineList = new List<DaMingShanPriProLineModel>();
+        public static List<DaMingShanPriProLineModel> GetDaMingShanPriProLineList()
+        {
+            if (DaMingShanPriProLineList.Count == 0 && DaMingShanPriProLine != "")
+            {
+                DaMingShanPriProLineList = JsonConvert.DeserializeObject<List<DaMingShanPriProLineModel>>(DaMingShanPriProLine);
+            }
+            return DaMingShanPriProLineList;
+        }
+        public class DaMingShanPriProLineModel
+        {
+            public string deviceName { get; set; }
+            public string ItemName { get; set; }
+            public string ItemTrayType { get; set; }
+            public string[] ProductLocation { get; set; }
+            public string[] ProductArea { get; set; }
+            /// <summary>
+            /// 瀵嗛泦鍨�0 1
+            /// </summary>
+            public int IsDense { get; set; } = 0;
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #region 鐗╂枡缂栫爜瀵瑰簲閰嶇疆
+        private static string _DaMingShanItemName = "";
+        private static string DaMingShanItemName
+        {
+            get
+            {
+                if (_DaMingShanItemName == "")
+                {
+                    _DaMingShanItemName = XmlHelper.GetElementValue("DaMingShanItemName");
+                }
+                return _DaMingShanItemName;
+            }
+        }
+        private static List<DaMingShanItemNameModel> DaMingShanItemNameList = new List<DaMingShanItemNameModel>();
+        public static List<DaMingShanItemNameModel> GetDaMingShanItemNameList()
+        {
+            if (DaMingShanItemNameList.Count == 0 && DaMingShanItemName != "")
+            {
+                DaMingShanItemNameList = JsonConvert.DeserializeObject<List<DaMingShanItemNameModel>>(DaMingShanItemName);
+            }
+            return DaMingShanItemNameList;
+        }
+        public class DaMingShanItemNameModel
+        {
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string ItemName { get; set; }
+            /// <summary>
+            /// 瑙勬牸
+            /// </summary>
+            public string Specifications { get; set; }
+            /// <summary>
+            /// 鍝佺浉
+            /// </summary>
+            public string Condition { get; set; }
+            /// <summary>
+            /// 鍖呰
+            /// </summary>
+            public string Package { get; set; }
+            /// <summary>
+            /// 鐗╂枡灞傛暟
+            /// </summary>
+            public string Layers { get; set; }
+            /// <summary>
+            /// 浼犵粰TS灞傛暟
+            /// </summary>
+            public string TSlayers { get; set; }
+            /// <summary>
+            /// 閰嶇疆寮�叧
+            /// </summary>
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #region 鐡跺澂鍖哄煙涓婁笅绾挎寚瀹氬簱鍖�+        private static string _inStockCacheBit = "";
+        private static string inStockCacheBit
+        {
+            get
+            {
+                if (_inStockCacheBit == "")
+                {
+                    _inStockCacheBit = XmlHelper.GetElementValue("inStockCacheBit");
+                }
+                return _inStockCacheBit;
+            }
+        }
+        private static List<inStockCacheBitModel> inStockCacheBitList = new List<inStockCacheBitModel>();
+        public static List<inStockCacheBitModel> GetinStockCacheBitList()
+        {
+            if (inStockCacheBitList.Count == 0 && inStockCacheBit != "")
+            {
+                inStockCacheBitList = JsonConvert.DeserializeObject<List<inStockCacheBitModel>>(inStockCacheBit);
+            }
+            return inStockCacheBitList;
+        }
+        public class inStockCacheBitModel
+        {
+            /// <summary>
+            /// 鐡剁洊鍖哄煙鍑哄叆搴撶紦瀛樼偣
+            /// </summary>
+            public string location { get; set; }
+            /// <summary>
+            /// 绌�婊�+            /// </summary>
+            public string ItemTrayType { get; set; }
+            /// <summary>
+            /// 璁惧绫诲瀷 1锛氱摱鐩栨満 2锛氱摱鐩栫炕鏂楁満
+            /// </summary>
+            public int deviceType { get; set; }
+            /// <summary>
+            /// 瀵瑰簲搴撳尯
+            /// </summary>
+            public string[] ProductArea { get; set; }
+            /// <summary>
+            /// 鏄惁鍚敤
+            /// </summary>
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #region 鐡跺澂鍖哄煙涓婁笅绾挎寚瀹氬簱鍖�+        private static string _updateCacheBit = "";
+        private static string updateCacheBit
+        {
+            get
+            {
+                if (_updateCacheBit == "")
+                {
+                    _updateCacheBit = XmlHelper.GetElementValue("updateCacheBit");
+                }
+                return _updateCacheBit;
+            }
+        }
+        private static List<updateCacheBitModel> updateCacheBitList = new List<updateCacheBitModel>();
+        public static List<updateCacheBitModel> GetupdateCacheBitList()
+        {
+            if (updateCacheBitList.Count == 0 && updateCacheBit != "")
+            {
+                updateCacheBitList = JsonConvert.DeserializeObject<List<updateCacheBitModel>>(updateCacheBit);
+            }
+            return updateCacheBitList;
+        }
+        public class updateCacheBitModel
+        {
+            /// <summary>
+            /// 鐡剁洊鍖哄煙鍑哄叆搴撶紦瀛樼偣
+            /// </summary>
+            public string location { get; set; }
+            /// <summary>
+            /// 绌�婊�+            /// </summary>
+            public string AGVlocation { get; set; }
+
+        }
+        #endregion
+
+        #region 鐩樺簱瀹炴椂鏇存柊搴撳瓨
+        private static string _PanKu = "";
+        public static string PanKuList
+        {
+            get
+            {
+                if (_PanKu == "")
+                {
+                    _PanKu = XmlHelper.GetElementValue("PanKu");
+                }
+                return _PanKu;
+            }
+        }
+
+        private static List<string> PanKu = new List<string>();
+        public static List<string> GetPanKuList()
+        {
+            if (PanKu.Count == 0 && PanKuList != "")
+            {
+                PanKu = JsonConvert.DeserializeObject<List<string>>(PanKuList);
+            }
+            return PanKu;
+        }
+        #endregion
+
+        #region 鏌旀�绾挎
+        private static string _flexibility = "";
+        public static string flexibilityList
+        {
+            get
+            {
+                if (_flexibility == "")
+                {
+                    _flexibility = XmlHelper.GetElementValue("flexibility");
+                }
+                return _flexibility;
+            }
+        }
+
+        private static List<flexibilitymodel> flexibility = new List<flexibilitymodel>();
+        public static List<flexibilitymodel> GetflexibilityList()
+        {
+            if (flexibility.Count == 0 && flexibilityList != "")
+            {
+                flexibility = JsonConvert.DeserializeObject<List<flexibilitymodel>>(flexibilityList);
+            }
+            return flexibility;
+        }
+
+        public class flexibilitymodel
+        {
+            public string AGVbit { get; set; }
+            public List<int> col { get; set; } = new List<int>();
+            public string row { get; set; }
+            public string area { get; set; }
+        }
+        #endregion
+
+        #region flexibilityenable
+        private static string _flexibilityenable = "";
+        public static string flexibilityenable
+        {
+            get
+            {
+                if (_flexibilityenable == "")
+                {
+                    _flexibilityenable = XmlHelper.GetElementValue("flexibilityenable");
+                }
+                return _flexibilityenable;
+            }
+        }
+        #endregion
+
+        #region FULEenable
+        private static string _FULEenable = "";
+        public static string FULEenable
+        {
+            get
+            {
+                if (_FULEenable == "")
+                {
+                    _FULEenable = XmlHelper.GetElementValue("FULEenable");
+                }
+                return _FULEenable;
+            }
+        }
+        #endregion
+
+        #region 鎴愬搧搴撳尯鍒嗙被
+        private static string _AreaType = "";
+        private static string AreaType
+        {
+            get
+            {
+                if (_AreaType == "")
+                {
+                    _AreaType = XmlHelper.GetElementValue("AreaType");
+                }
+                return _AreaType;
+            }
+        }
+        private static List<AreaTypeModel> AreaTypeList = new List<AreaTypeModel>();
+        public static List<AreaTypeModel> GetAreaTypeList()
+        {
+            if (AreaTypeList.Count == 0 && DaMingShanPriProLine != "")
+            {
+                AreaTypeList = JsonConvert.DeserializeObject<List<AreaTypeModel>>(AreaType);
+            }
+            return AreaTypeList;
+        }
+
+        public class AreaTypeModel
+        {
+            public string AreaName { get; set; }
+            public string[] AreaCode { get; set; }
+            public string AreaType { get; set; }
+        }
+        #endregion
+
+        #endregion
+
+        #region 鑷姩杞繍娴佺▼閰嶇疆
+        private static string _inStockCacheArea = "";
+        private static string inStockCacheArea
+        {
+            get
+            {
+                if (_inStockCacheArea == "")
+                {
+                    _inStockCacheArea = XmlHelper.GetElementValue("inStockCacheArea");
+                }
+                return _inStockCacheArea;
+            }
+        }
+        private static List<inStockCacheAreaModel> inStockCacheAreaList = new List<inStockCacheAreaModel>();
+        public static List<inStockCacheAreaModel> GetinStockCacheAreaList()
+        {
+            if (inStockCacheAreaList.Count == 0 && inStockCacheArea != "")
+            {
+                inStockCacheAreaList = JsonConvert.DeserializeObject<List<inStockCacheAreaModel>>(inStockCacheArea);
+            }
+            return inStockCacheAreaList;
+        }
+        public class inStockCacheAreaModel
+        {
+            public string deviceName { get; set; }
+            /// <summary>
+            /// 绌烘弧绛愮紦瀛樺尯
+            /// </summary>
+            public string CacheAreaNo { get; set; }
+            /// <summary>
+            /// 瀵瑰簲搴撳尯
+            /// </summary>
+            public string ProductArea { get; set; }
+            public string CacheAreaNoLock { get; set; }
+            public int Priority { get; set; }
+            public string ProductAreaLock { get; set; }
+            public int CntrCount { get; set; }
+            public string TaskType { get; set; }
+            /// <summary>
+            /// 鏄惁鍚敤
+            /// </summary>
+            public string Enable { get; set; }
+        }
+        #endregion
+
+        #region 鏍规嵁鐗╂枡涓嶅悓鑷姩閫夋嫨缁堢偣搴撳尯閰嶇疆
+        private static string _ItemCacheArea = "";
+        private static string ItemCacheArea
+        {
+            get
+            {
+                if (_ItemCacheArea == "")
+                {
+                    _ItemCacheArea = XmlHelper.GetElementValue("ItemCacheArea");
+                }
+                return _ItemCacheArea;
+            }
+        }
+        private static List<ItemCacheAreaModel> ItemCacheAreaList = new List<ItemCacheAreaModel>();
+        public static List<ItemCacheAreaModel> GetItemCacheAreaList()
+        {
+            if (ItemCacheAreaList.Count == 0 && inStockCacheArea != "")
+            {
+                ItemCacheAreaList = JsonConvert.DeserializeObject<List<ItemCacheAreaModel>>(ItemCacheArea);
+            }
+            return ItemCacheAreaList;
+        }
+        public class ItemCacheAreaModel
+        {
+            public string ItemCode { get; set; }
+            public string AreaCode { get; set; }
+        }
+        #endregion
+        #endregion
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/OtherService/SqlHelper.cs b/HH.WCS.NongFuChaYuan/OtherService/SqlHelper.cs
new file mode 100644
index 0000000..13b1ef2
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/SqlHelper.cs
@@ -0,0 +1,163 @@
+锘縰sing Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace HH.WCS.NongFuChaYuan.OtherService
+{
+    //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;
+            }
+        }
+
+        public bool CreateTable()
+        {
+            bool result = false;
+            var db = GetInstance();
+
+            //瀹氫箟SQL璇彞
+            //string sql = "create table student" + "(num varchar(50),name varchar(255),age int)";
+            
+            try
+            {
+
+                // 鍒涘缓鏁版嵁搴�+                //db.Context.DbMaintenance.CreateDatabase();
+                // 鍒涘缓琛�+                db.Context.CodeFirst.InitTables(
+                    typeof(T)
+                );
+                ////Console.WriteLine("鏁版嵁琛ㄥ垱寤烘垚鍔熴�");
+            }
+            catch (Exception ae)
+            {
+                //Console.WriteLine("鏁版嵁琛ㄥ垱寤哄け璐ャ�" + ae.Message.ToString());
+            }
+            finally
+            {
+                //db.Close();//瀵规暟鎹簱鎿嶄綔瀹屾垚鍚庯紝闇�鍏抽棴鏁版嵁搴擄紝閲婃斁鍐呭瓨
+            }
+            return result;
+        }
+
+
+        //鍒涘缓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绉�+                ////Console.WriteLine(sql);
+                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.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;
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/OtherService/StrHelper.cs b/HH.WCS.NongFuChaYuan/OtherService/StrHelper.cs
new file mode 100644
index 0000000..6f28c61
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/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.NongFuChaYuan.OtherService
+{
+    internal class StrHelper
+    {
+        /// <summary>
+        /// 鑾峰彇闅忔満瀛楃涓�+        /// </summary>
+        /// <param name="prefix"></param>
+        /// <param name="Length"></param>
+        /// <returns></returns>
+        public static string StrRandom(string prefix, int Length) {
+            byte[] b = new byte[32];
+            RandomNumberGenerator.Create().GetBytes(b);
+            Random random = new Random(BitConverter.ToInt32(b, 0));
+            string str = "0123456789"; //abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+            string returnStr = string.Empty;
+            for (int i = 0; i < Length; i++) {
+                returnStr += str.Substring(random.Next(0, str.Length - 1), 1);
+            }
+            var cntrCode = prefix + returnStr;
+            return cntrCode;
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/OtherService/XmlHelper.cs b/HH.WCS.NongFuChaYuan/OtherService/XmlHelper.cs
new file mode 100644
index 0000000..4aec4d6
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/OtherService/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.NongFuChaYuan.OtherService
+{
+    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/HH.WCS.NongFuChaYuan/Program.cs b/HH.WCS.NongFuChaYuan/Program.cs
new file mode 100644
index 0000000..d516557
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/Program.cs
@@ -0,0 +1,138 @@
+锘縰sing HH.WCS.NongFuChaYuan.ApiService;
+using HH.WCS.NongFuChaYuan.TaskController;
+using HH.WCS.NongFuChaYuan.DeviceService;
+using HH.WCS.NongFuChaYuan.OtherService;
+using Microsoft.Owin.Hosting;
+using NLog;
+using System;
+using System.Collections.Generic;
+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.NongFuChaYuan.TaskController.Monitor;
+using HH.WCS.NongFuChaYuan.WmsService;
+
+namespace HH.WCS.NongFuChaYuan
+{
+    internal class StartMain
+    {
+        static void Main(string[] args)
+        {
+            //0.0 椤圭洰鏍囪瘑
+            ////Console.WriteLine($"Startup Server On {Settings.ProjectName}锛�);
+            //3.0 寮�惎澶栨寕鏈嶅姟
+            StartOther();
+            //4.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.SetDescription("hh123");
+                x.SetDisplayName("hh123.WmsService");
+                x.SetServiceName("hh123.WmsService");
+            });
+
+            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
+            Environment.ExitCode = exitCode;
+        }
+
+        private static void Startup()
+        {
+            Task.Run(() =>
+            {
+                var url = "http://+:8001";//{SettingHelper.port}
+                //var url = Settings.HttpUrlPort;//{SettingHelper.port}
+                using (WebApp.Start<Startup>(url))
+                {
+                    Console.WriteLine("Startup ApiServer 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($"Startup TcpServer On {ip.ToString()}:{Settings.TcpPort}!");
+                    new TcpServer(ip.ToString());
+                }
+            }
+        }
+
+        private static void StartOther()
+        {
+            Console.WriteLine($"Startup OtherServer!");
+            STAttribute.InitTableName();//鍒濆鍖�MOBOX銆丼QLSERVER 鏁版嵁搴撹〃鍚�+            STAttribute.CreateMiddleTable();//鍒濆鍖�鏍囧噯鏁版嵁涓棿琛�+
+            WCSHelper.CreateMiddleTable();//鍒涘缓涓棿琛�+                                          //WCSHelper.InitRowLockTable();//鍒濆鍖栨帓閿佸畾琛�+
+
+        }
+
+        public class WorkThread
+        {
+
+            public void Start()
+            {
+                //1.0 寮�惎api
+                Startup();
+                //2.0 寮�惎tcp
+                StartTcp();
+                List<Task> tasks = new List<Task>();
+                //娣诲姞浠诲姟鎺ㄩ�绾跨▼
+                tasks.Add(GetTask(TaskProcess.Dispatch));
+                //娣诲姞鑷畾涔夌嚎绋�+                TaskAddFunc(tasks);
+                //Task.WaitAll(tasks.ToArray());
+            }
+
+            private void TaskAddFunc(List<Task> tasks)
+            {
+                tasks.Add(GetTask(Monitor.AnalysisIntraoCular));
+                tasks.Add(GetTask(Monitor.AnalysisMoveLib));
+                //tasks.Add(GetTask(Monitor.AnalysisMoveLib1));
+                //tasks.Add(GetTask(Monitor.PanKurealtime));
+                //tasks.Add(GetTask(Monitor.AnalysisProductLine));
+                //tasks.Add(GetTask(Monitor.AnalysisStockup));
+            }
+
+            public void Stop() { Console.WriteLine("Stopped Thread Server!"); }
+            private Task GetTask(Action action)
+            {
+                var task = Task.Run(() =>
+                {
+                    while (true)
+                    {
+                        try
+                        {
+                            action();
+                        }
+                        catch (Exception ex)
+                        {
+                            LogHelper.Error(ex.Message, ex);
+                        }
+                        Thread.Sleep(3000);
+                    }
+                });
+                return task;
+            }
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/Properties/AssemblyInfo.cs b/HH.WCS.NongFuChaYuan/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d2d70c3
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�埇淇℃伅鐢变互涓�+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�鍙慨鏀�+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭�
+[assembly: AssemblyTitle("HH.WCS.NongFuChaYuan")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HH.WCS.NongFuChaYuan")]
+[assembly: AssemblyCopyright("Copyright 漏  2023")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏�ComVisible 璁剧疆涓�false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵�COM 缁勪欢涓嶅彲瑙併�濡傛灉闇�浠�COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�璁剧疆涓�true銆�+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("8e589c0d-7d65-474d-8ced-e34e087126a1")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�缁勬垚: 
+//
+//      涓荤増鏈�+//      娆$増鏈�+//      鐢熸垚鍙�+//      淇鍙�+//
+//鍙互鎸囧畾鎵�湁杩欎簺鍊硷紝涔熷彲浠ヤ娇鐢ㄢ�鐢熸垚鍙封�鍜屸�淇鍙封�鐨勯粯璁ゅ�
+//閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/HH.WCS.NongFuChaYuan/TaskController/DeviceProcess.cs b/HH.WCS.NongFuChaYuan/TaskController/DeviceProcess.cs
new file mode 100644
index 0000000..463667a
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/TaskController/DeviceProcess.cs
@@ -0,0 +1,1945 @@
+锘縰sing HH.WCS.NongFuChaYuan.DeviceService;
+using HH.WCS.NongFuChaYuan.DispatchService;
+using HH.WCS.NongFuChaYuan.OtherService;
+using HH.WCS.NongFuChaYuan.WmsService;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Timers;
+using static System.Runtime.CompilerServices.RuntimeHelpers;
+
+namespace HH.WCS.NongFuChaYuan.TaskController
+{
+    /// <summary>
+    /// 璁惧淇″彿澶勭悊--鐗规畩璁惧澶勭悊闇�鍔犻」鐩悕閰嶇疆
+    /// </summary>
+    internal class DeviceProcess
+    {
+        private static ModbusHelper modbusHelper = new ModbusHelper();
+
+        private static Dictionary<string, statemodel> LineState = new Dictionary<string, statemodel>();
+
+        public class statemodel
+        {
+            public string status { get; set; }
+            public DateTime modify { get; set; }
+            public int error { get; set; }
+        }
+        internal static void Analysis(string data, string ip)
+        {
+            if (data.Length >= 6)
+            {
+                //鍘绘帀娑堟伅澶�F 00
+                data = data.Substring(4);
+                ////Console.WriteLine($"{ip}-{data}");
+                var plc = Settings.GetDeviceInfoList().Where(a => a.address == ip && a.enable == 1).FirstOrDefault();
+
+
+                //if (data.Length == 6) 
+                //{
+                //    if (data.Substring(4, 2) == "32")
+                //    {
+                //        //杈撻�绾跨浜屼釜鍙�+                //        plc = Settings.GetDeviceInfoList().Where(a => a.address == ip && a.location.Contains("") && a.enable == 1).FirstOrDefault();
+                //    }
+                //    else if(data.Substring(0,2)=="12") 
+                //    {
+                //        //杈撻�绾跨涓�釜鍙�+                //        plc = Settings.GetDeviceInfoList().Where(a => a.address == ip && a.location.Contains("") && a.enable == 1).FirstOrDefault();
+                //    }
+                //}
+
+
+                if (plc != null)
+                {
+                    alysisDeviceChange(data, plc);
+                }
+                //else { }//Console.WriteLine($"TCP淇″彿澶勭悊锛氭湭鏌ヨ鍒癐P涓簕ip}鐨勬暟鎹紝璇锋鏌eviceInfo閰嶇疆涓績鏄惁瀛樺湪璇P鐨勬暟鎹紒");
+            }
+        }
+
+        private static void alysisDeviceChange(string data, Settings.deviceInfo plc)
+        {
+            if (plc.deviceType == 1) AnalysisDoor(data, plc);//鑷姩闂ㄥ鐞�+            else if (plc.deviceType == 2) DaMingShanAnalysisBottleCapmolding(data, plc);//娉ㄥ鏈哄鐞�+            else if (plc.deviceType == 3) DaMingShanAnalysisBottleCapTipper(data, plc);//鐡剁洊缈绘枟鏈哄鐞�+            else if (plc.deviceType == 6) DaMingShanAnalysisBottleCapmoldTipper(data, plc);//鐡跺澂缈绘枟鏈哄鐞�+            else if (plc.deviceType == 4) DaMingShanAnalysisBottleCap(data, plc);//鐡剁洊鏈哄鐞�+            else if (plc.deviceType == 5) DaMingShanAnalysisProductLine(data, plc);//杈撻�绾垮鐞�+            else if (plc.deviceType == 7) Roboticarm(data, plc);//鏈烘鑷傚鐞�+        }
+
+        private static void Roboticarm(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg={data}");
+            if (data.Length == 4)
+            {
+                if (data.Substring(0, 2) == "12")
+                {
+                    //绌烘涓嬬嚎
+                    RoboticarmEmpty(plc, plc.location[0]);
+                }
+                if (data.Substring(2, 2) == "21")
+                {
+                    //婊℃涓婄嚎
+                    RoboticarmFull(plc, plc.location[0]);
+                }
+            }
+        }
+
+        private static void RoboticarmEmpty(Settings.deviceInfo plc, string location)
+        {
+            var result = false;
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                if (location != "")
+                {
+                    if (LocationHelper.CheckLocFree(location))
+                    {
+                        //鏌ヨ宸ュ崟
+                        var endinfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.ItemTrayType == "绌�).FirstOrDefault();
+                        if (endinfo != null)
+                        {
+                            var workorder = db.Queryable<PGWorkOrder>().Where(a => a.S_PLineNo == plc.deviceName && a.S_WorkState == "鎵ц涓�).First();
+                            if (workorder != null)
+                            {
+                                var trayNo = "";
+                                var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).First();
+                                if (cntr != null)
+                                {
+                                    trayNo = cntr.S_CNTR_CODE;
+                                }
+                                else
+                                {
+                                    trayNo = ContainerHelper.GenerateCntrNo();
+                                }
+                                var endarea = endinfo.ProductArea[0];
+                                var endbit = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "鏃�).First();
+                                if (endbit != null)
+                                {
+                                    var endlocation = endbit.S_LOC_CODE.Trim();
+                                    result = IntensiveArea.DaMingShanCreateTransport(location, endlocation, "鏈烘鑷傜┖妗嗕笅绾�, trayNo, 1, 1, plc.deviceName, 1);
+                                    if (result)
+                                    {
+                                        //缁戝畾璐т綅涓庢墭鐩�+                                        LocCntrRel cn = new LocCntrRel
+                                        {
+                                            S_LOC_CODE = location,
+                                            S_CNTR_CODE = trayNo
+                                        };
+                                        db.Insertable(cn).ExecuteCommand();
+                                    }
+                                    else LogHelper.Info($"鏈烘鑷備笅绌轰换鍔�浠诲姟鍒涘缓澶辫触");
+                                }
+                                else LogHelper.Info($"鏈烘鑷備笅绌轰换鍔�鏌ヨ涓嶅埌鍙敤璐т綅");
+                            }
+                            else LogHelper.Info($"鏈烘鑷備笅绌轰换鍔�鏌ヨ涓嶅埌鎵ц涓殑宸ュ崟");
+                        }
+                        else
+                        {
+                            LogHelper.Info($"鏈烘鑷備笅绌轰换鍔�鎵句笉鍒扮粓鐐归厤缃�);
+                        }
+                    }
+                    else LogHelper.Info($"鏈烘鑷備换鍔�褰撳墠鐐逛綅{location} 鏈夋湭瀹屾垚鐨勪换鍔�);
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"鏈烘鑷傛秷鎭鐞嗗紓甯�寮傚父淇℃伅={ex.Message}", ex);
+            }
+
+        }
+
+        private static void RoboticarmFull(Settings.deviceInfo plc, string location)
+        {
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                if (location != "")
+                {
+                    if (LocationHelper.CheckLocFree(location))
+                    {
+                        //鏌ヨ宸ュ崟
+                        var startinfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.ItemTrayType == "婊�).FirstOrDefault();
+                        if (startinfo != null)
+                        {
+                            var workorder = db.Queryable<PGWorkOrder>().Where(a => a.S_PLineNo == plc.deviceName && a.S_WorkState == "鎵ц涓�).First();
+                            if (workorder != null)
+                            {
+                                var startarea = startinfo.ProductArea[0];
+                                var startbit = IntensiveArea.DaMingShanGetCacheLocationOut(startarea);
+                                if (startbit != null)
+                                {
+                                    var startlocation = startbit.S_LOC_CODE.Trim();
+                                    if (startbit.LocCntrRel != null)
+                                    {
+                                        var trayNo = startbit.LocCntrRel.S_CNTR_CODE;
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation, location, "鏈烘鑷傛弧妗嗕笂绾�, trayNo, 1, 1, plc.deviceName, 1);
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info($"鏈烘鑷傚懠婊′换鍔�璧风偣{startlocation} 娌℃湁缁戝畾鎵樼洏淇℃伅");
+                                    }
+                                }
+                                else
+                                {
+                                    LogHelper.Info($"鏈烘鑷傚懠婊′换鍔�鏌ヨ涓嶅埌鍙敤璐т綅");
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鏈烘鑷傚懠婊′换鍔�鏌ヨ涓嶅埌鎵ц涓殑宸ュ崟");
+                            }
+                        }
+                        else
+                        {
+                            LogHelper.Info($"鏈烘鑷備笅绌轰换鍔�鎵句笉鍒扮粓鐐归厤缃�);
+                        }
+                    }
+                    else LogHelper.Info($"璐т綅{location} 褰撳墠鐘舵�涓嶈兘鐢熸垚浠诲姟");
+                }
+                else LogHelper.Info($"璐т綅閰嶇疆绔欑偣涓虹┖");
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"鏈烘鑷傛秷鎭鐞嗗紓甯�寮傚父淇℃伅={ex.Message}", ex);
+            }
+        }
+
+        private static void DaMingShanAnalysisBottleCapmoldTipper(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg={data}", "缈绘枟鏈�);
+            //缈绘枟鏈轰笅绌虹瓙 鍒嗛厤缁堢偣瑙g粦璧风偣鐗╂枡
+            if (data.Substring(1, 1) == "1")
+            {
+                if (TipperEmpty2(plc, plc.location[0]))
+                {
+
+                }
+            }
+
+            var error = data.Substring(data.Length - 2);
+            if (LineState.Keys.Contains(plc.location[0]))
+            {
+                LineState[plc.location[0]].status = data;
+                LineState[plc.location[0]].modify = DateTime.Now;
+                LineState[plc.location[0]].error = int.Parse(error);
+            }
+            else
+            {
+                LineState.Add(plc.location[0], new statemodel { status = data, modify = DateTime.Now, error = int.Parse(error) });
+            }
+
+
+            data = data.Substring(2);
+            LogHelper.Info($"鑷姩闂ㄧ姸鎬侊細{data},鍦板潃涓猴細{plc.address}", "鑷姩闂�);
+            //if (data.Length / 2 == plc.deviceNo.Length)//2 2
+            //{
+            for (int i = 0; i < plc.deviceNo.Length; i++)
+            {
+                var state = data.Substring(i * 2 + 1, 1);
+                ////Console.WriteLine($"闂▄plc.deviceNo[i]}鐨勭姸鎬亄state}");
+                if (doorStatus.Keys.Contains(plc.deviceNo[i]))
+                {
+                    doorStatus[plc.deviceNo[i]].info = state;
+                    doorStatus[plc.deviceNo[i]].modify = DateTime.Now;
+                }
+                else
+                {
+                    doorStatus.Add(plc.deviceNo[i], new signalInfo { info = state, modify = DateTime.Now });
+                }
+            }
+            //}
+        }
+
+
+        #region 澶ф槑灞变俊鍙峰鐞嗘祦绋�+
+        /// <summary>
+        /// 娉ㄥ鏈恒�缈绘枟鏈轰簩娈典换鍔�+        /// </summary>
+        /// <param name="mst"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        internal static void Secondstagetask(WMSTask mst, bool type)
+        {
+            LogHelper.Info($"澶ф槑灞辫澶囦换鍔�浜屾澶勭悊");
+            var info = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC.Trim()) || a.location.Contains(mst.S_END_LOC.Trim())).FirstOrDefault();
+            if (info != null)
+            {
+                try
+                {
+                    if (info.location.Contains(mst.S_START_LOC.Trim()))
+                    {
+                        if (type)
+                        {
+                            //鍙栬揣瀹屾垚
+                            //娉ㄥ鏈轰簩娈典换鍔�+                            if (info.deviceType == 2)
+                            {
+                                //濡傛灉鍙栨弧浠诲姟鍦ˋ鍙�閫佺┖浠诲姟鍒嗛厤鍦˙鍙�+                                if (info.location[0] == mst.S_START_LOC.Trim())
+                                {
+                                    //A鍙�+                                    if (moldingEmpty(info, info.location[0]))
+                                    {
+                                        LogHelper.Info($"褰撳墠浣嶇疆{info.location[1]} :鍒涘缓娉ㄥ鏈洪�绌虹瓙浠诲姟鎴愬姛", "娉ㄥ鏈�);
+                                    }
+                                }
+                                else
+                                {
+                                    //B鍙�+                                    if (moldingEmpty(info, info.location[1]))
+                                    {
+                                        LogHelper.Info($"褰撳墠浣嶇疆{info.location[0]} :鍒涘缓娉ㄥ鏈洪�绌虹瓙浠诲姟鎴愬姛", "娉ㄥ鏈�);
+                                    }
+                                }
+                            }
+                            else if (info.deviceType == 3)
+                            {
+                                //缈绘枟鏈轰簩娈典换鍔�缈绘枟鏈哄彧鏈変竴涓彛 鍙栫┖閫佹弧
+                                if (TipperFull2(info, info.location[0], false))
+                                {
+                                    //鍒涘缓浠诲姟鎴愬姛
+                                    LogHelper.Info($"褰撳墠浣嶇疆{info.location[0]} :鍒涘缓缈绘枟鏈鸿ˉ婊$瓙浠诲姟鎴愬姛", "缈绘枟鏈�);
+                                }
+                            }
+                            else if (info.deviceType == 6)
+                            {
+                                //缈绘枟鏈轰簩娈典换鍔�缈绘枟鏈哄彧鏈変竴涓彛 鍙栫┖閫佹弧
+                                if (TipperFull2(info, info.location[0], true))
+                                {
+                                    //鍒涘缓浠诲姟鎴愬姛
+                                    LogHelper.Info($"褰撳墠浣嶇疆{info.location[0]} :鍒涘缓缈绘枟鏈鸿ˉ婊$瓙浠诲姟鎴愬姛", "缈绘枟鏈�);
+                                }
+                            }
+                            else if (info.deviceType == 5)
+                            {
+                                if (mst.S_START_LOC.Trim() == info.location[0])
+                                {
+                                    //涓�彿鍙�+                                    PlcHelper.SendHex(info.address, "3F00100D0A");
+                                }
+                                else
+                                {
+                                    //浜屽彿鍙�+                                    PlcHelper.SendHex(info.address, "3F00300D0A");
+                                }
+                            }
+                            else if (info.deviceType == 4)
+                            {
+                                //濡傛灉鍙栨弧浠诲姟鍦ˋ鍙�閫佺┖浠诲姟鍒嗛厤鍦˙鍙�+                                if (info.location[0] == mst.S_START_LOC.Trim())
+                                {
+                                    //A鍙�+                                    if (moldingEmpty2(info, info.location[0]))
+                                    {
+                                        LogHelper.Info($"褰撳墠浣嶇疆{info.location[0]} :鍒涘缓鐡剁洊鏈洪�绌虹瓙浠诲姟鎴愬姛", "鐡剁洊鏈�);
+                                    }
+                                }
+                                else
+                                {
+                                    //B鍙�+                                    if (moldingEmpty2(info, info.location[1]))
+                                    {
+                                        LogHelper.Info($"褰撳墠浣嶇疆{info.location[1]} :鍒涘缓鐡剁洊鏈洪�绌虹瓙浠诲姟鎴愬姛", "鐡剁洊鏈�);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        if (!type)
+                        {
+                            if (info.deviceType == 5)
+                            {
+                                PlcHelper.SendHex(info.address, "3F00200D0A");
+                            }
+                            if (info.deviceType == 4 || info.deviceType == 2)
+                            {
+                                if (mst.S_END_LOC == info.location[0])
+                                {
+                                    PlcHelper.SendHex(info.address, "3F00100D0A");
+                                    LogHelper.Info($"褰撳墠浣嶇疆{info.location[0]} :娉ㄥ鏈哄浣嶄俊鍙锋垚鍔�);
+                                }
+                                if (mst.S_END_LOC == info.location[1])
+                                {
+                                    PlcHelper.SendHex(info.address, "3F00200D0A");
+                                    LogHelper.Info($"褰撳墠浣嶇疆{info.location[1]} :娉ㄥ鏈哄浣嶄俊鍙锋垚鍔�);
+
+                                }
+                            }
+                            if (info.deviceType == 3 || info.deviceType == 6)
+                            {
+                                LogHelper.Info($"缈绘枟鏈哄嵏璐у畬鎴�鍙戦�閲嶇疆淇″彿");
+                                PlcHelper.SendHex(info.address, "3F00100D0A");
+                            }
+                        }
+                        else
+                        {
+
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    LogHelper.Error("璁惧浜屾澶勭悊寮傚父" + ex.Message, ex);
+                }
+
+            }
+        }
+
+        /// <summary>
+        /// 鐡跺澂缈绘枟鏈轰笂婊$瓙
+        /// </summary>
+        /// <param name="info"></param>
+        /// <param name="v"></param>
+        /// <returns></returns>
+        private static bool TipperFull2(Settings.deviceInfo plc, string location, bool v)
+        {
+            //閫氳繃绔欑偣缂栧彿鏌ヨ宸ュ崟
+            //閫氳繃宸ュ崟鑾峰彇鐗╂枡缂栫爜銆佹壒鍙�鍓嶆湡瀵屽嫆娌′笂绾挎壒鍙疯嚜琛岀紪鍐�
+            var result = false;
+
+            var db = new SqlHelper<object>().GetInstance();
+            if (location != "")
+            {
+                if (LocationHelper.CheckLocFree(location))
+                {
+                    LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "缈绘枟鏈�);
+                    var workOrder = WCSHelper.GetPGWorkOrder(plc.deviceName);
+                    if (workOrder != null)
+                    {
+                        LogHelper.Info($"鏌ュ埌浜嗗伐鍗晎workOrder.S_WorkNo} 宸ュ崟鐘舵�涓� {workOrder.S_WorkState }", "缈绘枟鏈�);
+                        if (workOrder.S_WorkState == "鎵ц涓�)
+                        {
+                            var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).ToList();
+                            if (trayInfo.Count() == 0)
+                            {
+                                if (v)
+                                {
+                                    //鐡跺澂缈绘枟鏈哄彨鏂�+                                    result = IntensiveArea.DaMingShanPLCOut3(plc, location, true, workOrder);
+                                }
+                                else
+                                {
+                                    //鐡剁洊缈绘枟鏈哄彨鏂�+                                    result = IntensiveArea.DaMingShanPLCOut3(plc, location, false, workOrder);
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"褰撳墠浣嶇疆{location} :鎵樼洏鏈В缁�, "缈绘枟鏈�);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "缈绘枟鏈�);
+                    }
+                }
+                else
+                {
+                    LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂琛ユ弧绛愪换鍔�, "缈绘枟鏈�);
+                }
+            }
+            return result;
+        }
+
+        private static void DaMingShanAnalysisBottleCap(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg={data}", "鐡剁洊鏈�);
+            //涓嬫弧绛愪俊鍙风敓鎴愪笅婊$瓙浠诲姟 寰呭彇璐у畬鎴愯В缁戣捣鐐硅揣浣�鐢熸垚閫佺┖浠诲姟
+            if (data.Substring(0, 2) == "11")
+            {
+                if (moldingFull2(plc, plc.location[0]))
+                {
+                    LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg=鐡剁洊鏈篈鍙g敓鎴愬彇婊′换鍔�, "娉ㄥ鏈�);
+                }
+            }
+            if (data.Substring(2, 2) == "21")
+            {
+                if (moldingFull2(plc, plc.location[1]))
+                {
+                    LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg=鐡剁洊鏈築鍙g敓鎴愬彇婊′换鍔�, "娉ㄥ鏈�);
+                }
+            }
+            data = data.Substring(4);
+            LogHelper.Info($"鑷姩闂ㄧ姸鎬侊細{data},鍦板潃涓猴細{plc.address}", "鑷姩闂�);
+            if (data.Length / 2 == plc.deviceNo.Length)//2 2
+            {
+                for (int i = 0; i < plc.deviceNo.Length; i++)
+                {
+                    var state = data.Substring(i * 2 + 1, 1);
+                    ////Console.WriteLine($"闂▄plc.deviceNo[i]}鐨勭姸鎬亄state}");
+                    if (doorStatus.Keys.Contains(plc.deviceNo[i]))
+                    {
+                        doorStatus[plc.deviceNo[i]].info = state;
+                        doorStatus[plc.deviceNo[i]].modify = DateTime.Now;
+                    }
+                    else
+                    {
+                        doorStatus.Add(plc.deviceNo[i], new signalInfo { info = state, modify = DateTime.Now });
+                    }
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// 鎺ユ敹PLC缈绘枟鏈轰俊鍙�+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="plc"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        private static void DaMingShanAnalysisBottleCapTipper(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg={data}", "缈绘枟鏈�);
+            //缈绘枟鏈轰笅绌虹瓙 鍒嗛厤缁堢偣瑙g粦璧风偣鐗╂枡
+            if (data.Substring(1, 1) == "1")
+            {
+                if (TipperEmpty(plc, plc.location[0]))
+                {
+
+                }
+            }
+
+            var error = data.Substring(data.Length - 2);
+            if (LineState.Keys.Contains(plc.location[0]))
+            {
+                LineState[plc.location[0]].status = data;
+                LineState[plc.location[0]].modify = DateTime.Now;
+                LineState[plc.location[0]].error = int.Parse(error);
+            }
+            else
+            {
+                LineState.Add(plc.location[0], new statemodel { status = data, modify = DateTime.Now, error = int.Parse(error) });
+            }
+
+
+            LogHelper.Info($"鑷姩闂ㄧ姸鎬侊細{data},鍦板潃涓猴細{plc.address}", "鑷姩闂�);
+            data = data.Substring(2);
+            //if (data.Length / 2 == plc.deviceNo.Length)//2 2
+            //{
+            for (int i = 0; i < plc.deviceNo.Length; i++)
+            {
+                var state = data.Substring(i * 2 + 1, 1);
+                ////Console.WriteLine($"闂▄plc.deviceNo[i]}鐨勭姸鎬亄state}");
+                if (doorStatus.Keys.Contains(plc.deviceNo[i]))
+                {
+                    doorStatus[plc.deviceNo[i]].info = state;
+                    doorStatus[plc.deviceNo[i]].modify = DateTime.Now;
+                }
+                else
+                {
+                    doorStatus.Add(plc.deviceNo[i], new signalInfo { info = state, modify = DateTime.Now });
+                }
+            }
+            //}
+        }
+        private static void DaMingShanAnalysisProductLine(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿data} 鏌ヨ宸ュ崟", "杈撻�绾�);
+            if (data.Substring(0, 2) == "12")
+            {
+                var info = Settings.GetDeviceInfoList().Where(a => a.address == "" && a.location.Contains(plc.location[0]) && a.enable == 1).FirstOrDefault();
+                if (info != null)
+                {
+                    var positionCode = "";
+                    if (info.location.Length > 1)
+                    {
+                        positionCode = info.location[1];
+                    }
+                    ProductLineFull(info, info.location[0], positionCode);
+                }
+            }
+
+            //琛ョ┖鏉縷|鍏佽琛ョ┖
+            if (data.Substring(2, 2) == "21")
+            {
+                var info = Settings.GetDeviceInfoList().Where(a => a.address == "" && a.location.Contains(plc.location[1]) && a.enable == 1).FirstOrDefault();
+                if (info != null)
+                {
+                    ProductLineEmpty(info, info.location[0]);
+                }
+            }
+
+            if (data.Length == 6)
+            {
+                if (data.Substring(4, 2) == "32")
+                {
+                    var info = Settings.GetDeviceInfoList().Where(a => a.address == "" && a.location.Contains(plc.location[2]) && a.enable == 1).FirstOrDefault();
+                    if (info != null)
+                    {
+                        var positionCode = "";
+                        if (info.location.Length > 1)
+                        {
+                            positionCode = info.location[1];
+                        }
+                        ProductLineFull(info, info.location[0], positionCode);
+                    }
+                    else
+                    {
+                        LogHelper.Info($"娌℃湁鎵惧埌location {plc.location[2]} 鐨勯厤缃枃浠�);
+                    }
+                }
+            }
+
+
+
+            if (LineState.Keys.Contains(plc.location[0]))
+            {
+                LineState[plc.location[0]].modify = DateTime.Now;
+                LineState[plc.location[0]].status = data;
+            }
+            else
+            {
+                LineState.Add(plc.location[0], new statemodel { modify = DateTime.Now, status = data });
+            }
+
+            if (LineState.Keys.Contains(plc.location[1]))
+            {
+                LineState[plc.location[1]].modify = DateTime.Now;
+                LineState[plc.location[1]].status = data;
+            }
+            else
+            {
+                LineState.Add(plc.location[1], new statemodel { modify = DateTime.Now, status = data });
+            }
+
+            if (plc.location.Length > 2)
+            {
+                if (LineState.Keys.Contains(plc.location[2]))
+                {
+                    LineState[plc.location[2]].modify = DateTime.Now;
+                    LineState[plc.location[2]].status = data;
+                }
+                else
+                {
+                    LineState.Add(plc.location[2], new statemodel { modify = DateTime.Now, status = data });
+                }
+            }
+        }
+
+
+
+
+        /// <summary>
+        /// 杈撻�绾胯ˉ绌烘墭
+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        private static void ProductLineEmpty(Settings.deviceInfo plc, string location)
+        {
+            try
+            {
+                if (location != "")
+                {
+                    if (LocationHelper.CheckLocFree(location))
+                    {
+                        LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 琛ョ┖淇″彿锛歿location} 鏌ヨ宸ュ崟", "杈撻�绾�);
+                        var list = plc.deviceName.Split(',').ToList();
+                        foreach (var item in list)
+                        {
+                            var workorder = WCSHelper.GetWorkOrder(item);
+                            if (workorder != null && workorder.S_WorkState.Trim() == "鎵ц涓�)
+                            {
+                                LogHelper.Info($"杈撻�绾匡細{item} 涓嬬嚎淇″彿锛歿location} 鎵惧埌宸ュ崟", "杈撻�绾�);
+                                ProductLineempty(plc, location, workorder, item);
+                                break;
+                            }
+                            else
+                            {
+                                LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "杈撻�绾�);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂鏍堟澘涓婄嚎", "杈撻�绾�);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine($"杈撻�绾垮懠鍙┖鎵樺紓甯� 寮傚父淇℃伅={ex.Message}");
+            }
+        }
+
+        private static void ProductLineempty(Settings.deviceInfo plc, string location, WorkOrder workorder, string deviceName)
+        {
+            bool result = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ绌烘墭搴撳尯", "杈撻�绾�);
+                var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == deviceName && a.ItemTrayType == "绌�).FirstOrDefault();
+                if (info != null)
+                {
+                    for (int i = 0; i < info.ProductArea.Length; i++)
+                    {
+                        string AreaCode = info.ProductArea[i];
+                        var startLocation = IntensiveArea.GetEmptyOut(AreaCode, workorder.S_TrayType);
+                        if (startLocation != null)
+                        {
+                            var iteminfo = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == workorder.S_ItemCode && a.S_ITEM_MODEL == workorder.S_ItemLayer).First();
+                            if (iteminfo != null)
+                            {
+                                result = IntensiveArea.DaMingShanCreateTransport(startLocation.S_LOC_CODE, location, "鏍堟澘涓婄嚎", startLocation.LocCntrRel.S_CNTR_CODE, 1, 1, deviceName, 1, 1, int.Parse(iteminfo.S_ITEM_LAYER), workorder.S_WorkNo, "", "", workorder.S_TrayType);
+                                if (result)
+                                {
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒扮┖鎵樺簱鍖洪厤缃枃浠�, "杈撻�绾�);
+                }
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine($"鏌ヨ琛ョ┖搴撳尯閰嶇疆鏂囦欢寮傚父,寮傚父鍘熷洜={ex.Message}");
+            }
+        }
+
+        internal static void QuLiao(WMSTask mst, bool v)
+        {
+            var info = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC) && a.address != "").FirstOrDefault();
+            if (info != null)
+            {
+                LogHelper.Info($"瀹夊叏浜や簰寮� 浠诲姟鍙�{mst.S_TASK_NO}", "瀹夊叏浜や簰");
+                if (info.location[0] == mst.S_START_LOC)
+                {
+                    //涓�彿鍙�+                    if (v)
+                    {
+                        if (LineState.Keys.Contains(mst.S_START_LOC.Trim()))
+                        {
+                            LogHelper.Info($"鏌ヨ杈撻�绾垮厑璁稿彇婊′俊鍙�鍏佽鍙栨弧淇″彿={LineState[mst.S_START_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
+                            if (LineState[mst.S_START_LOC.Trim()].status.Substring(0, 2) == "12" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)
+                            {
+                                NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18);
+                                PlcHelper.SendHex(info.address, "3F00110D0A");
+                            }
+                        }
+                    }
+                    else
+                    {
+                        PlcHelper.SendHex(info.address, "3F00100D0A");
+                    }
+                }
+                else
+                {
+                    //浜屽彿鍙�+                    if (v)
+                    {
+                        if (LineState.Keys.Contains(mst.S_START_LOC.Trim()))
+                        {
+                            LogHelper.Info($"鏌ヨ杈撻�绾垮厑璁稿彇婊′俊鍙�鍏佽鍙栨弧淇″彿={LineState[mst.S_START_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
+                            if (LineState[mst.S_START_LOC.Trim()].status.Substring(4, 2) == "32" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)
+                            {
+                                NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18);
+                                PlcHelper.SendHex(info.address, "3F00310D0A");
+                            }
+                        }
+                    }
+                    else
+                    {
+                        PlcHelper.SendHex(info.address, "3F00300D0A");
+                    }
+                }
+
+            }
+            else
+            {
+                LogHelper.Info($"浠诲姟鍙�{mst.S_TASK_NO} 鎵句笉鍒拌捣鐐箋mst.S_START_LOC} 瀵瑰簲鐨処P閰嶇疆鏂囦欢");
+            }
+        }
+
+        internal static void Xieliao(WMSTask mst, bool v = false)
+        {
+            var info = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_END_LOC) && a.address != "").FirstOrDefault();
+            if (info != null)
+            {
+                LogHelper.Info($"瀹夊叏浜や簰寮� 浠诲姟鍙�{mst.S_TASK_NO}", "瀹夊叏浜や簰");
+                if (info.deviceType == 5)
+                {
+                    if (v)
+                    {
+                        if (LineState.Keys.Contains(mst.S_END_LOC.Trim()))
+                        {
+                            LogHelper.Info($"鏌ヨ杈撻�绾垮厑璁歌ˉ绌轰俊鍙�鍏佽琛ョ┖淇″彿={LineState[mst.S_END_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
+                            if (LineState[mst.S_END_LOC.Trim()].status.Substring(2, 2) == "21" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)
+                            {
+                                NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1103, 18);
+                                PlcHelper.SendHex(info.address, "3F00210D0A");
+                            }
+                        }
+                    }
+                    else
+                    {
+                        PlcHelper.SendHex(info.address, "3F00200D0A");
+                    }
+                }
+                else if (info.deviceType == 3 || info.deviceType == 6)
+                {
+                    if (v)
+                    {
+                        if (LineState.Keys.Contains(mst.S_END_LOC.Trim()))
+                        {
+                            LogHelper.Info($"鏌ヨ缈绘枟鏈哄厑璁稿嵏璐т俊鍙�鍏佽鍗歌揣淇″彿={LineState[mst.S_END_LOC.Trim()].status} 鏃堕棿闂撮殧={DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds}", "瀹夊叏浜や簰");
+                            if (LineState[mst.S_END_LOC.Trim()].error ==0 && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)
+                            {
+                                NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1103, 18);
+                            }
+                        }
+                    }
+                }
+            }
+            else
+            {
+                LogHelper.Info($"浠诲姟鍙�{mst.S_TASK_NO} 鎵句笉鍒扮粓鐐箋mst.S_END_LOC} 瀵瑰簲鐨処P閰嶇疆鏂囦欢");
+            }
+        }
+
+        private static bool ProductLineFull(Settings.deviceInfo plc, string location, string positionCode = "")
+        {
+            var result = false;
+            try
+            {
+                if (location != "")
+                {
+                    //鍙栨弧锛岄渶瑕佹牴鎹伐鍗曚互鍙婁骇绾夸俊鎭紝鍒ゆ柇褰撳墠浜х嚎搴旇涓嬪彂鍒板摢涓簱鍖猴紝浠ュ強鏄粈涔堟墭鐩樼被鍨嬩笅绾�+                    if (LocationHelper.CheckLocFree(location))
+                    {
+                        LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "杈撻�绾�);
+                        //1.鏌ヨ褰撳墠浜х嚎宸ュ崟淇℃伅
+                        var list = plc.deviceName.Split(',').ToList();
+                        foreach (var item in list)
+                        {
+                            var deviceName = item;
+                            //plc.deviceName = item;
+                            var workOrder = WCSHelper.GetWorkOrder(deviceName);//鍒濆宸ュ崟鐢卞瘜鍕扺MS浼犺緭锛屽悗缁鍙栧伐鍗曡鍙朚OBOX宸ュ崟琛�+                            if (workOrder != null && workOrder.S_WorkState.Trim() == "鎵ц涓�)
+                            {
+                                LogHelper.Info($"杈撻�绾匡細{deviceName} 鏌ヨ鍒版墽琛屼腑鐨勫伐鍗�鏌ヨ宸ュ崟", "杈撻�绾�);
+                                string DeviceStartTime = DateTime.Now.ToString();//褰撳墠璁惧绗竴娆℃敹鍒颁笅绾夸俊鍙锋椂闂�+                                string TrayCode = "";//鎵樼洏缂栫爜--澶氫釜缂栫爜鐢�鑻辨枃閫楀彿闅斿紑
+                                string BatchNo = string.IsNullOrEmpty(workOrder.S_BatchNo) ? "" : workOrder.S_BatchNo.Trim();//鎵规鍙�+                                string ItemLayer = string.IsNullOrEmpty(workOrder.S_ItemLayer) ? "10" : workOrder.S_ItemLayer.Trim();//鐗╂枡灞傛暟
+                                string ItemTrayType = string.IsNullOrEmpty(workOrder.S_TrayType) ? "" : workOrder.S_TrayType.Trim();//璐х墿澶у皬鏉�-澶ф澘銆佸皬鏉�+                                string StartBit = plc.location[0];
+                                string EndBit = "";
+                                string StartLayer = "1";//鎴愬搧涓嬬嚎-璧风偣灞傛暟榛樿涓�
+                                string EndLayer = "";
+
+                                string plineNo = workOrder.S_PLineNo;
+                                //浜х嚎涓嬬嚎娴佺▼----姝e父娴佺▼涓嬬嚎
+                                if (workOrder.S_ORDER_TYPE.Trim() != "鏃犵爜鍏ュ簱")
+                                {
+                                    bool full = true;
+                                    //鍒ゆ柇褰撳墠璐т綅鏄惁瀛樺湪鎵樼洏锛屽鏋滃瓨鍦ㄥ垯 鏃犻渶浠庢墭鐩樹俊鎭腑闂磋〃鑾峰彇
+                                    var db = new SqlHelper<object>().GetInstance();
+                                    var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == StartBit).ToList();
+                                    if (trayInfo.Count() > 0)
+                                    {
+                                        BatchNo = workOrder.S_BatchNo.Trim();
+                                        ItemLayer = workOrder.S_ItemLayer.Trim();
+                                        string trayNo = "";
+                                        trayInfo.ForEach(a =>
+                                        {
+                                            trayNo = a.S_CNTR_CODE;
+                                            TrayCode = TrayCode + a.S_CNTR_CODE + ",";
+                                        });
+                                        //鑾峰彇宸ュ崟鍙�+                                        var task = db.Queryable<WMSTask>().Where(a => a.S_CNTRS.Contains(trayNo)).OrderByDescending(a => a.T_CREATE).First();
+                                        if (task != null)
+                                        {
+                                            LogHelper.Info($"鑾峰彇浠诲姟{task.S_TASK_NO} 宸ュ崟鍙穥task.S_SRC_NO}");
+                                            workOrder.S_WorkNo = task.S_SRC_NO;
+                                        }
+                                        else
+                                        {
+                                            LogHelper.Info($"鏈幏鍙栧埌宸ュ崟鍙�);
+                                            full = false;
+                                        }
+                                    }
+                                    else
+                                    {
+                                        //2.鑾峰彇璁惧绗竴娆′笅绾挎椂闂�+                                        bool IsTime = true;
+                                        DeviceStartTime = ConveryInfoFullTwo(plc, DeviceStartTime, deviceName);
+
+                                        if (IsTime)
+                                        {
+                                            //3.澶勭悊 宸ュ崟淇℃伅琛ㄦ暟鎹�-鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�+                                            full = ConveryInfoFullThree(plc, location, workOrder, DeviceStartTime, positionCode, deviceName, ref TrayCode, ref BatchNo, ref ItemLayer);
+                                        }
+                                        else full = false;
+                                    }
+
+                                    if (full)
+                                    {
+                                        //5.姝e父浜х嚎涓嬬嚎
+                                        ProductLineFull(plc, location, workOrder, TrayCode, BatchNo, ItemLayer, ItemTrayType, StartBit, deviceName);
+                                    }
+                                    else LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭瓨鍦ㄥ紓甯革紝璇锋煡璇㈠紓甯告棩蹇楋紒", "杈撻�绾�);
+                                }
+                                //鏃犵爜鍏ュ簱娴佺▼----浜哄伐鍒涘缓宸ュ崟鏃�---宸ュ崟绫诲瀷 搴旈�鎷�鏃犵爜鍏ュ簱
+                                else
+                                {
+                                    var db = new SqlHelper<object>().GetInstance();
+                                    var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).ToList();
+                                    if (trayInfo.Count() == 0) TrayCode = Guid.NewGuid().ToString("N") + "," + Guid.NewGuid().ToString("N");
+                                    else
+                                    {
+                                        trayInfo.ForEach(a =>
+                                        {
+                                            TrayCode = TrayCode + "," + a.S_CNTR_CODE.Trim();
+                                        });
+                                    }
+                                    LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location} 鏃犵爜鍏ュ簱锛�, "杈撻�绾�);
+                                    //Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏃犵爜鍏ュ簱锛�);
+                                    ProductLineFull(plc, location, workOrder, TrayCode, BatchNo, ItemLayer, ItemTrayType, StartBit, deviceName);
+                                }
+                            }
+                            else LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "杈撻�绾�);
+                        }
+                    }
+                    else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂婊℃墭涓嬬嚎", "杈撻�绾�);
+                }
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine($"杈撻�绾垮鐞嗗紓甯革細{ex.Message}");
+                LogHelper.Error($"杈撻�绾垮鐞嗗紓甯革細{ex.Message}", ex);
+            }
+
+            return result;
+        }
+
+
+        public static void ProductLineFull(Settings.deviceInfo plc, string location, WorkOrder workOrder, string TrayCode, string BatchNo, string ItemLayer, string ItemTrayType, string StartBit, string deviceName, bool ProType = true)
+        {
+            //5.鏍规嵁閰嶇疆鏂囦欢鑾峰彇褰撳墠浜х嚎浼樺厛涓嬪彂搴撳尯锛屽啀杩炲悓鐗╂枡銆佸ぇ灏忔澘銆佹壒娆★紝鑾峰彇姝ゅ簱鍖�鍙敤璐т綅
+            //      閬嶅巻搴撳尯鏌ヨ-鍒ゆ柇鎺掗攣-琛ㄥ悕锛�RowLock 
+            var creResult = false;
+            LogHelper.Info($"杈撻�绾匡細{deviceName} 鏌ヨ鍏ュ簱缁堢偣璐т綅 鎵规鍙穥BatchNo}", "杈撻�绾�);
+            var db = new SqlHelper<object>().GetInstance();
+            ////Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 鏌ヨ鍏ュ簱缁堢偣璐т綅");
+            //string ItemNameLayer = workOrder.S_ItemCode.Trim() + workOrder.S_ItemLayer.Trim();
+            //var PriProLineInfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.ItemTrayType == "婊� && a.ItemName == workOrder.S_ItemCode.Trim()).FirstOrDefault();
+            var PriProLineInfo = db.Queryable<ItemArea>().Where(a => a.S_ITEM_CODE == workOrder.S_ItemCode.Trim() && a.S_TRAY_TYPE == ItemTrayType).OrderByDescending(a => a.S_PRIORITY).ToList();
+            if (PriProLineInfo != null)
+            {
+                if (ProType)
+                {
+                    LogHelper.Info($"杈撻�绾匡細{deviceName} 鏌ヨ鍒伴厤缃枃浠�, "杈撻�绾�);
+                    ////Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 鏌ヨ鍒伴厤缃枃浠�);
+                    for (int i = 0; i < PriProLineInfo.Count(); i++)
+                    {
+                        string areaCode = PriProLineInfo[i].S_AREA_CODE;
+                        if (!creResult) creResult = IntensiveArea.DaMingShanPlcTask(StartBit, "鎴愬搧涓嬬嚎", TrayCode, areaCode, workOrder.S_ItemCode.Trim(), BatchNo, ItemLayer, ItemTrayType, deviceName, true, workOrder.S_WorkNo.Trim());
+                    }
+                }
+                //else
+                //{
+                //    for (int i = 0; i < PriProLineInfo.Count(); i++)
+                //    {
+                //        string areaCode = PriProLineInfo[i].S_AREA_CODE;
+                //        if (!creResult) creResult = IntensiveArea.DaMingShanPlcTask(StartBit, "闆跺ご涓嬬嚎", TrayCode, areaCode, workOrder.S_ItemCode.Trim(), BatchNo, ItemLayer, ItemTrayType, plc.deviceName, true, workOrder.S_WorkNo.Trim());
+                //    }
+                //}
+
+                if (creResult)
+                {
+                    //浠诲姟鍒涘缓鎴愬姛 缁戝畾璧风偣鎵樼洏琛紝鎵樼洏鐗╂枡琛�+                    LogHelper.Info("缁戝畾璐т綅瀹瑰櫒");
+                    IntensiveArea.BindLocCntr(StartBit, TrayCode, workOrder.S_ItemCode.Trim(), BatchNo, deviceName, ItemLayer, ItemTrayType);
+                }
+            }
+            else LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location} 鏈幏鍙栧埌褰撳墠浜х嚎鐨勪紭鍏堜笅绾垮簱鍖�DaMingShanPriProLine 閰嶇疆椤广�璇ョ墿鏂欎笉瀛樺湪锛歿workOrder.S_ItemCode.Trim()}", "杈撻�绾�);
+        }
+
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�澶勭悊缈绘枟鏈轰笅绌虹瓙璇锋眰
+        /// </summary>
+        /// <param name="plc">閰嶇疆淇℃伅</param>
+        /// <param name="location">涓嬩欢鍙�/param>
+        /// <returns></returns>
+        private static bool TipperEmpty(Settings.deviceInfo plc, string location)
+        {
+            //閫氳繃绔欑偣缂栧彿鏌ヨ宸ュ崟
+            //閫氳繃宸ュ崟鑾峰彇鐗╂枡缂栫爜銆佹壒鍙�鍓嶆湡瀵屽嫆娌′笂绾挎壒鍙疯嚜琛岀紪鍐�
+            var result = false;
+
+            var db = new SqlHelper<object>().GetInstance();
+            if (location != "")
+            {
+                if (LocationHelper.CheckLocFree(location))
+                {
+                    var taskFree = db.Queryable<WMSTask>().Where(a => a.S_START_LOC == location && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "澶辫触").First();
+                    if (taskFree == null)
+                    {
+                        LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "缈绘枟鏈�);
+                        var workOrder = WCSHelper.GetPGWorkOrder(plc.deviceName);
+                        if (workOrder != null)
+                        {
+                            LogHelper.Info($"鏌ュ埌浜嗗伐鍗晎workOrder.S_WorkNo} 宸ュ崟鐘舵�涓� {workOrder.S_WorkState} 鍗充骇鍗崇敤={workOrder.S_UsingNow}", "缈绘枟鏈�);
+                            if (workOrder.S_WorkState == "鎵ц涓�)
+                            {
+                                var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).ToList();
+                                if (trayInfo.Count() > 0)
+                                {
+                                    string TrayCode = "";
+                                    //string newbatchNo = DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "-" + SYSHelper.GenerateUniqueText(8);
+                                    //string BatchNo = string.IsNullOrEmpty(workOrder.S_BatchNo) ? newbatchNo : workOrder.S_BatchNo;
+                                    foreach (var b in trayInfo)
+                                    {
+                                        TrayCode = TrayCode + "," + b.S_CNTR_CODE.Trim();
+                                    }
+                                    if (!string.IsNullOrEmpty(TrayCode))
+                                    {
+                                        LogHelper.Info($"缈绘枟鏈�璐т綅鎵樼洏鍙�{TrayCode}");
+                                        if (workOrder.S_UsingNow == "Y")
+                                        {
+                                            result = IntensiveArea.DaMingShanPLCIn3(plc, location, TrayCode, "", true);
+                                        }
+                                        else
+                                        {
+                                            result = IntensiveArea.DaMingShanPLCIn3(plc, location, TrayCode, "", false);
+                                        }
+                                    }
+                                }
+                                else
+                                {
+                                    //鑷姩鐢熸垚鎵樼洏鐮�+                                    string TrayCode = Guid.NewGuid().ToString().Replace("-", "");
+                                    if (!string.IsNullOrEmpty(TrayCode))
+                                    {
+                                        LogHelper.Info($"缈绘枟鏈�璐т綅鎵樼洏鍙�{TrayCode}");
+                                        if (workOrder.S_UsingNow == "Y")
+                                        {
+                                            result = IntensiveArea.DaMingShanPLCIn3(plc, location, TrayCode, "", true);
+                                        }
+                                        else
+                                        {
+                                            result = IntensiveArea.DaMingShanPLCIn3(plc, location, TrayCode, "", false);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "缈绘枟鏈�);
+                        }
+                    }
+                    else LogHelper.Info($"璇ョ偣浣嶆湁鏈畬鎴愮殑浠诲姟 涓嶅厑璁搁噸澶嶇敓鎴愪换鍔�浠诲姟鍙穥taskFree.S_TASK_NO}");
+                }
+                else
+                {
+                    LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂绌烘墭涓嬬嚎", "缈绘枟鏈�);
+                }
+            }
+            else
+            {
+                LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 鐐逛綅涓虹┖", "缈绘枟鏈�);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�澶勭悊缈绘枟鏈轰笅绌虹瓙璇锋眰
+        /// </summary>
+        /// <param name="plc">閰嶇疆淇℃伅</param>
+        /// <param name="location">涓嬩欢鍙�/param>
+        /// <returns></returns>
+        private static bool TipperEmpty2(Settings.deviceInfo plc, string location)
+        {
+            //閫氳繃绔欑偣缂栧彿鏌ヨ宸ュ崟
+            //閫氳繃宸ュ崟鑾峰彇鐗╂枡缂栫爜銆佹壒鍙�鍓嶆湡瀵屽嫆娌′笂绾挎壒鍙疯嚜琛岀紪鍐�
+            var result = false;
+            try
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                if (location != "")
+                {
+                    if (LocationHelper.CheckLocFree(location))
+                    {
+                        var taskFree = db.Queryable<WMSTask>().Where(a => a.S_START_LOC == location && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "澶辫触").First();
+                        if (taskFree == null)
+                        {
+                            LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "缈绘枟鏈�);
+                            var workOrder = WCSHelper.GetPGWorkOrder(plc.deviceName);
+                            if (workOrder != null)
+                            {
+                                LogHelper.Info($"鏌ュ埌浜嗗伐鍗晎workOrder.S_WorkNo} 宸ュ崟鐘舵�涓� {workOrder.S_WorkState} 鍗充骇鍗崇敤={workOrder.S_UsingNow}", "缈绘枟鏈�);
+                                if (workOrder.S_WorkState == "鎵ц涓�)
+                                {
+                                    var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).ToList();
+                                    if (trayInfo.Count() > 0)
+                                    {
+                                        string TrayCode = "";
+                                        //string newbatchNo = DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "-" + SYSHelper.GenerateUniqueText(8);
+                                        //string BatchNo = string.IsNullOrEmpty(workOrder.S_BatchNo) ? newbatchNo : workOrder.S_BatchNo;
+                                        foreach (var b in trayInfo)
+                                        {
+                                            TrayCode = TrayCode + "," + b.S_CNTR_CODE.Trim();
+                                        }
+                                        if (!string.IsNullOrEmpty(TrayCode))
+                                        {
+                                            LogHelper.Info($"缈绘枟鏈�璐т綅鎵樼洏鍙�{TrayCode}");
+                                            if (workOrder.S_UsingNow == "Y")
+                                            {
+                                                result = IntensiveArea.DaMingShanPLCIn4(plc, location, TrayCode, workOrder, true);
+                                            }
+                                            else
+                                            {
+                                                result = IntensiveArea.DaMingShanPLCIn4(plc, location, TrayCode, workOrder, false);
+                                            }
+                                        }
+                                    }
+                                    else
+                                    {
+                                        //鑷姩鐢熸垚鎵樼洏鐮�+                                        string TrayCode = Guid.NewGuid().ToString().Replace("-", "");
+                                        if (!string.IsNullOrEmpty(TrayCode))
+                                        {
+                                            LogHelper.Info($"缈绘枟鏈�璐т綅鎵樼洏鍙�{TrayCode}");
+                                            if (workOrder.S_UsingNow == "Y")
+                                            {
+                                                result = IntensiveArea.DaMingShanPLCIn4(plc, location, TrayCode, workOrder, true);
+                                            }
+                                            else
+                                            {
+                                                result = IntensiveArea.DaMingShanPLCIn4(plc, location, TrayCode, workOrder, false);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "缈绘枟鏈�);
+                            }
+                        }
+                        else LogHelper.Info($"璇ョ偣浣嶆湁鏈畬鎴愮殑浠诲姟 涓嶅厑璁搁噸澶嶇敓鎴愪换鍔�浠诲姟鍙穥taskFree.S_TASK_NO}");
+                    }
+                    else
+                    {
+                        LogHelper.Info($"缈绘枟鏈猴細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂绌烘墭涓嬬嚎", "缈绘枟鏈�);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"鐡跺澂缈绘枟鏈哄紓甯�寮傚父淇℃伅={ex.Message}", ex);
+            }
+
+            return result;
+        }
+
+
+
+
+        /// <summary>
+        /// 鎺ユ敹PLC娉ㄥ鏈轰俊鍙�+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="plc"></param>
+        private static void DaMingShanAnalysisBottleCapmolding(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg={data}", "娉ㄥ鏈�);
+            //涓嬫弧绛愪俊鍙风敓鎴愪笅婊$瓙浠诲姟 寰呭彇璐у畬鎴愯В缁戣捣鐐硅揣浣�鐢熸垚閫佺┖浠诲姟
+            if (data.Substring(0, 2) == "11")
+            {
+                if (moldingFull(plc, plc.location[0]))
+                {
+                    LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg=娉ㄥ鏈篈鍙g敓鎴愬彇婊′换鍔�, "娉ㄥ鏈�);
+                }
+            }
+            if (data.Substring(2, 2) == "21")
+            {
+                if (moldingFull(plc, plc.location[1]))
+                {
+                    LogHelper.Info($"{plc.deviceName}--IP={plc.address}--msg=娉ㄥ鏈築鍙g敓鎴愬彇婊′换鍔�, "娉ㄥ鏈�);
+                }
+            }
+
+            LogHelper.Info($"鑷姩闂ㄧ姸鎬侊細{data},鍦板潃涓猴細{plc.address}", "鑷姩闂�);
+            data = data.Substring(4);
+            if (data.Length / 2 == plc.deviceNo.Length)//2 2
+            {
+                for (int i = 0; i < plc.deviceNo.Length; i++)
+                {
+                    var state = data.Substring(i * 2 + 1, 1);
+                    ////Console.WriteLine($"闂▄plc.deviceNo[i]}鐨勭姸鎬亄state}");
+                    if (doorStatus.Keys.Contains(plc.deviceNo[i]))
+                    {
+                        doorStatus[plc.deviceNo[i]].info = state;
+                        doorStatus[plc.deviceNo[i]].modify = DateTime.Now;
+                    }
+                    else
+                    {
+                        doorStatus.Add(plc.deviceNo[i], new signalInfo { info = state, modify = DateTime.Now });
+                    }
+                }
+            }
+
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�-澶勭悊娉ㄥ鏈烘弧鎵樿姹�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        private static bool moldingFull(Settings.deviceInfo plc, string location)
+        {
+            //閫氳繃绔欑偣缂栧彿鏌ヨ宸ュ崟
+            //閫氳繃宸ュ崟鑾峰彇鐗╂枡缂栫爜銆佹壒鍙�鍓嶆湡瀵屽嫆娌′笂绾挎壒鍙疯嚜琛岀紪鍐�
+            var result = false;
+
+            var db = new SqlHelper<object>().GetInstance();
+            if (location != "")
+            {
+                if (LocationHelper.CheckLocFree(location))
+                {
+                    LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "鐡剁洊鏈�);
+                    var workOrder = WCSHelper.GetPGWorkOrder(plc.deviceName);
+                    if (workOrder != null)
+                    {
+                        LogHelper.Info($"鏌ュ埌浜嗗伐鍗晎workOrder.S_WorkNo} 宸ュ崟鐘舵�涓� {workOrder.S_WorkState} 鍗充骇鍗崇敤={workOrder.S_UsingNow} 杩炴帴鍖哄煙={workOrder.S_LinkLineNo}", "鐡剁洊鏈�);
+                        if (workOrder.S_WorkState.Trim() == "鎵ц涓�)
+                        {
+                            LogHelper.Info($"鏌ヨ褰撳墠璐т綅 鎵樼洏鏁伴噺 璐т綅缂栫爜={location}");
+                            var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).ToList();
+                            if (trayInfo.Count() > 0)
+                            {
+                                LogHelper.Info($"褰撳墠璐т綅鎵樼洏鏁伴噺澶т簬0");
+                                string TrayCode = trayInfo[0].S_CNTR_CODE;
+                                //string newbatchNo = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + SYSHelper.GenerateUniqueText(8);
+                                //string BatchNo = string.IsNullOrEmpty(workOrder.) ? newbatchNo : workOrder.S_BatchNo;
+                                if (!string.IsNullOrEmpty(TrayCode))
+                                {
+                                    if (workOrder.S_UsingNow == "Y")
+                                    {
+                                        result = IntensiveArea.DaMingShanPLCIn(plc, location, TrayCode, "", workOrder, true);
+                                    }
+                                    else
+                                    {
+                                        result = IntensiveArea.DaMingShanPLCIn(plc, location, TrayCode, "", workOrder, false);
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 璇ョ珯鐐规病鏈夋墭鐩樻棤娉曞彇婊�, "鐡剁洊鏈�);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "鐡剁洊鏈�);
+                    }
+                }
+                else
+                {
+                    LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂婊℃墭涓嬬嚎", "鐡剁洊鏈�);
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鍐滃か澶ф槑灞�-澶勭悊鐡剁洊鏈烘弧鎵樿姹�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        private static bool moldingFull2(Settings.deviceInfo plc, string location)
+        {
+            //閫氳繃绔欑偣缂栧彿鏌ヨ宸ュ崟
+            //閫氳繃宸ュ崟鑾峰彇鐗╂枡缂栫爜銆佹壒鍙�鍓嶆湡瀵屽嫆娌′笂绾挎壒鍙疯嚜琛岀紪鍐�
+            var result = false;
+
+            var db = new SqlHelper<object>().GetInstance();
+            if (location != "")
+            {
+                if (LocationHelper.CheckLocFree(location))
+                {
+                    LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "鐡剁洊鏈�);
+                    var workOrder = WCSHelper.GetPGWorkOrder(plc.deviceName);
+                    if (workOrder != null)
+                    {
+                        LogHelper.Info($"鏌ュ埌浜嗗伐鍗晎workOrder.S_WorkNo} 宸ュ崟鐘舵�涓� {workOrder.S_WorkState} 鍗充骇鍗崇敤={workOrder.S_UsingNow}", "鐡剁洊鏈�);
+                        if (workOrder.S_WorkState.Trim() == "鎵ц涓�)
+                        {
+                            LogHelper.Info($"鏌ヨ褰撳墠璐т綅 鎵樼洏鏁伴噺 璐т綅缂栫爜={location}");
+                            var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location).ToList();
+                            if (trayInfo.Count() > 0)
+                            {
+                                LogHelper.Info($"褰撳墠璐т綅鎵樼洏鏁伴噺澶т簬0");
+                                string TrayCode = trayInfo[0].S_CNTR_CODE;
+                                //string newbatchNo = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + SYSHelper.GenerateUniqueText(8);
+                                //string BatchNo = string.IsNullOrEmpty(workOrder.S_BatchNo) ? newbatchNo : workOrder.S_BatchNo;
+                                if (!string.IsNullOrEmpty(TrayCode))
+                                {
+                                    if (workOrder.S_UsingNow == "Y")
+                                    {
+                                        result = IntensiveArea.DaMingShanPLCIn2(plc, location, TrayCode, "", workOrder.S_ItemCode, true);
+                                    }
+                                    else
+                                    {
+                                        result = IntensiveArea.DaMingShanPLCIn2(plc, location, TrayCode, "", workOrder.S_ItemCode, false);
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 璇ョ珯鐐规病鏈夋墭鐩樻棤娉曞彇婊�, "鐡剁洊鏈�);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "鐡剁洊鏈�);
+                    }
+                }
+                else
+                {
+                    LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂婊℃墭涓嬬嚎", "鐡剁洊鏈�);
+                }
+            }
+            return result;
+        }
+
+        private static bool moldingEmpty(Settings.deviceInfo plc, string location)
+        {
+            //閫氳繃绔欑偣缂栧彿鏌ヨ宸ュ崟
+            //閫氳繃宸ュ崟鑾峰彇鐗╂枡缂栫爜銆佹壒鍙�鍓嶆湡瀵屽嫆娌′笂绾挎壒鍙疯嚜琛岀紪鍐�
+            var result = false;
+
+            var db = new SqlHelper<object>().GetInstance();
+            if (location != "")
+            {
+                if (LocationHelper.CheckLocFree(location))
+                {
+                    LogHelper.Info($"娉ㄥ鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "娉ㄥ鏈�);
+                    var workOrder = WCSHelper.GetPGWorkOrder(plc.deviceName);
+                    if (workOrder != null)
+                    {
+                        LogHelper.Info($"鏌ュ埌浜嗗伐鍗晎workOrder.S_WorkNo} 宸ュ崟鐘舵�涓� {workOrder.S_WorkState}", "娉ㄥ鏈�);
+                        if (workOrder.S_WorkState.Trim() == "鎵ц涓�)
+                        {
+                            var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == location).ToList();
+                            if (trayInfo.Count() == 0)
+                            {
+                                result = IntensiveArea.DaMingShanPLCOut(plc, location, true, workOrder);
+                            }
+                            else
+                            {
+                                LogHelper.Info($"娉ㄥ鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 璇ョ珯鐐规湁鎵樼洏鏃犳硶閫佺┖", "娉ㄥ鏈�);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"娉ㄥ鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "娉ㄥ鏈�);
+                    }
+                }
+                else
+                {
+                    LogHelper.Info($"娉ㄥ鏈猴細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂鏍堟澘涓婄嚎", "娉ㄥ鏈�);
+                }
+            }
+            return result;
+        }
+
+        private static bool moldingEmpty2(Settings.deviceInfo plc, string location)
+        {
+            //閫氳繃绔欑偣缂栧彿鏌ヨ宸ュ崟
+            //閫氳繃宸ュ崟鑾峰彇鐗╂枡缂栫爜銆佹壒鍙�鍓嶆湡瀵屽嫆娌′笂绾挎壒鍙疯嚜琛岀紪鍐�
+            var result = false;
+
+            var db = new SqlHelper<object>().GetInstance();
+            if (location != "")
+            {
+                if (LocationHelper.CheckLocFree(location))
+                {
+                    LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏌ヨ宸ュ崟", "鐡剁洊鏈�);
+                    var workOrder = WCSHelper.GetPGWorkOrder(plc.deviceName);
+                    if (workOrder != null)
+                    {
+                        LogHelper.Info($"鏌ュ埌浜嗗伐鍗晎workOrder.S_WorkNo} 宸ュ崟鐘舵�涓� {workOrder.S_WorkState}", "鐡剁洊鏈�);
+                        if (workOrder.S_WorkState.Trim() == "鎵ц涓�)
+                        {
+                            var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == location).ToList();
+                            if (trayInfo.Count() == 0)
+                            {
+                                //if (workOrder.S_UsingNo == "Y")
+                                //{
+                                result = IntensiveArea.DaMingShanPLCOut2(plc, location, true, workOrder);
+                                //}
+                                //else
+                                //{
+                                //    result = IntensiveArea.DaMingShanPLCOut2(plc, location, false);
+                                //}
+                                if (!result)
+                                {
+                                    LogHelper.Info($"绌虹瓙缂撳瓨鍖烘棤鍙敤绌虹瓙");
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 璇ョ珯鐐规湁鎵樼洏鏃犳硶閫佺┖", "鐡剁洊鏈�);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 涓嬬嚎淇″彿锛歿location} 鏈壘鍒板伐鍗�, "鐡剁洊鏈�);
+                    }
+                }
+                else
+                {
+                    LogHelper.Info($"鐡剁洊鏈猴細{plc.deviceName} 褰撳墠浣嶇疆{location}鏈変换鍔★紝涓嶅彲瑙﹀彂鏍堟澘涓婄嚎", "鐡剁洊鏈�);
+                }
+            }
+            return result;
+        }
+        #endregion
+
+        #region 鑷姩闂�-閫氱敤
+
+        private static Dictionary<string, signalInfo> doorStatus = new Dictionary<string, signalInfo>();//鏅�鑷姩闂ㄥ瓧鍏�+        private static Dictionary<string, DateTime> doorRecord = new Dictionary<string, DateTime>();
+        private static Dictionary<string, DateTime> elevatorRecord = new Dictionary<string, DateTime>();//鐢垫瀹夊叏闂ㄥ瓧鍏�+        public class signalInfo
+        {
+            public string info { get; set; }
+            public DateTime modify { get; set; }
+            public int error { get; set; } = 0;
+        }
+
+        /// <summary>
+        /// 浜ょ淇″彿澶勭悊
+        /// </summary>
+        /// <param name="agvNo"></param>
+        /// <param name="lockNo"></param>
+        /// <param name="state"></param>
+        internal static void SpecialTraffic(string agvNo, string lockNo, int state)
+        {
+            if (state == 1023 || state == 1025)
+            {
+                Traffic(agvNo, lockNo, state == 1023);//鏍囧噯浜ょ澶勭悊 1023    1025
+            }
+
+            if (state == 1120)
+            {
+                tiqianopen(agvNo, lockNo);
+            }
+        }
+
+        private static void tiqianopen(string agvNo, string lockNo)
+        {
+            LogHelper.Info($"瀹夊叏闂ㄥ紑闂ㄨ姹�杞﹀彿={agvNo} 闂ㄥ彿={lockNo}");
+            var plc = Settings.GetDeviceInfoList().Where(a => a.deviceNo.Contains(lockNo)).FirstOrDefault();
+            if (plc != null)
+            {
+                LogHelper.Info($"鎵惧埌閰嶇疆鏂囦欢");
+                var index = 1;
+                for (int i = 0; i < plc.deviceNo.Length; i++)
+                {
+                    if (plc.deviceNo[i] == lockNo)
+                    {
+                        index = i + 1;
+                        break;
+                    }
+                }
+                index = index + plc.location.Length;
+                LogHelper.Info($"瀹夊叏闂ㄥ鎺ワ細闂ㄥ彿锛歿lockNo},index:{index}", "鑷姩闂�);
+
+
+                //寮�棬璇锋眰 3F 00 11 20 0d 0a锛�3F 00 10 21 0d 0a锛�+                var req = $"3f 00 {index}1 0d 0a";
+                PlcHelper.SendHex(plc.address, req);
+                var msg = $"瀹夊叏闂ㄥ紑闂ㄨ姹�闂ㄥ彿锛歿lockNo},index:{index}锛宨p={plc.address}, data={req}";
+                LogHelper.Info(msg, "鑷姩闂�);
+
+
+            }
+        }
+
+        /// <summary>
+        /// 鑷姩闂�+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="plc"></param>
+        internal static void AnalysisDoor(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"鑷姩闂ㄧ姸鎬侊細{data},鍦板潃涓猴細{plc.address}", "鑷姩闂�);
+            if (data.Length / 2 == plc.deviceNo.Length)//2 2
+            {
+                for (int i = 0; i < plc.deviceNo.Length; i++)
+                {
+                    var state = data.Substring(i * 2 + 1, 1);
+                    ////Console.WriteLine($"闂▄plc.deviceNo[i]}鐨勭姸鎬亄state}");
+                    if (doorStatus.Keys.Contains(plc.deviceNo[i]))
+                    {
+                        doorStatus[plc.deviceNo[i]].info = state;
+                        doorStatus[plc.deviceNo[i]].modify = DateTime.Now;
+                    }
+                    else
+                    {
+                        doorStatus.Add(plc.deviceNo[i], new signalInfo { info = state, modify = DateTime.Now });
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// TcpServer-浜ょ璇锋眰
+        /// </summary>
+        /// <param name="agv"></param>
+        /// <param name="zone"></param>
+        /// <param name="occupy"></param>
+        internal static void Traffic(string agv, string zone, bool occupy)
+        {
+            LogHelper.Info($"瀹夊叏闂ㄥ紑闂ㄨ姹�杞﹀彿={agv} 闂ㄥ彿={zone} 寮�棬璇锋眰={occupy}");
+            var plc = Settings.GetDeviceInfoList().Where(a => a.deviceNo.Contains(zone)).FirstOrDefault();
+            if (plc != null)
+            {
+                LogHelper.Info($"鎵惧埌閰嶇疆鏂囦欢");
+                var index = 1;
+                for (int i = 0; i < plc.deviceNo.Length; i++)
+                {
+                    if (plc.deviceNo[i] == zone)
+                    {
+                        index = i + 1;
+                        break;
+                    }
+                }
+                index = index + plc.location.Length;
+                LogHelper.Info($"瀹夊叏闂ㄥ鎺ワ細闂ㄥ彿锛歿zone},index:{index}", "鑷姩闂�);
+
+                if (occupy)
+                {
+                    //寮�棬璇锋眰 3F 00 11 20 0d 0a锛�3F 00 10 21 0d 0a锛�+                    var req = $"3f 00 {index}1 0d 0a";
+                    PlcHelper.SendHex(plc.address, req);
+                    var msg = $"瀹夊叏闂ㄥ紑闂ㄨ姹�闂ㄥ彿锛歿zone},index:{index}锛宨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},index:{index}", "鑷姩闂�);
+                            NDCHelper.Traffic(zone);
+                        }
+                    }
+                }
+                else
+                {
+                    //鍏抽棬淇″彿 3F 00 10 20 0d 0a
+                    var req = $"3f 00 {index}0 0d 0a";
+                    PlcHelper.SendHex(plc.address, req);
+                    var msg = $"瀹夊叏闂ㄥ叧闂ㄨ姹�闂ㄥ彿锛歿zone},index:{index}锛宨p={plc.address}, data={req}";
+                    LogHelper.Info(msg, "鑷姩闂�);
+                }
+            }
+        }
+
+        /// <summary>
+        /// ModBusTcp-浜ょ璇锋眰
+        /// </summary>
+        /// <param name="agv"></param>
+        /// <param name="zone"></param>
+        /// <param name="occupy"></param>
+        internal static void ModBusTraffic(string agv, string zone, bool occupy)
+        {
+            LogHelper.Info($"瀹夊叏闂ㄥ鎺ワ細鏀跺埌淇″彿锛歿occupy},澶囨敞锛氱湡涓�023锛屽亣涓�025锛岄棬鍙凤細{zone},杞﹀彿锛歿agv}", "鑷姩闂�);
+            var plc = Settings.GetModBusTcpPlc().Where(a => a.location == zone).FirstOrDefault();
+            if (plc != null)
+            {
+                if (occupy)
+                {
+                    int[] result = modbusHelper.ReadHoldingRegisters(plc.readAddr + 2, 1, plc.ip, plc.port);
+                    if (result[0] == 1)
+                    {
+                        NDCHelper.Traffic(zone);
+                    }
+                    else
+                    {
+                        modbusHelper.WriteSingleRegister(plc.readAddr + 2, 1, plc.ip, plc.port);
+                    }
+                }
+                else
+                {
+                    modbusHelper.WriteSingleRegister(plc.readAddr + 2, 2, plc.ip, plc.port);
+                }
+            }
+            else
+            {
+                LogHelper.Info($"璇锋鏌ラ厤缃枃浠讹細鏈湪閰嶇疆鏂囦欢涓煡璇㈠埌璇ラ棬鍙风殑淇℃伅銆傚綋鍓嶉棬鍙凤細{zone}", "鑷姩闂�);
+            }
+        }
+
+        /// <summary>
+        /// 鍗佸瓧璺彛瀹夊叏浜や簰
+        /// </summary>
+        /// <param name="agv"></param>
+        /// <param name="zone"></param>
+        /// <param name="occupy"></param>
+        internal static void Crossroads(string agv, string zone, bool occupy)
+        {
+            LogHelper.Info($"鍗佸瓧璺彛瀹夊叏浜や簰锛氭敹鍒颁俊鍙凤細{occupy},澶囨敞锛氱湡涓�101锛屽亣涓�102锛岄棬鍙凤細{zone},杞﹀彿锛歿agv}", "鑷姩闂�);
+            var plc = Settings.GetModBusTcpPlc().Where(a => a.location == zone).FirstOrDefault();
+            if (plc != null)
+            {
+                if (occupy)
+                {
+                    modbusHelper.WriteSingleRegister(plc.readAddr + 3, 1, plc.ip, plc.port);
+                }
+                else
+                {
+                    modbusHelper.WriteSingleRegister(plc.readAddr + 3, 2, plc.ip, plc.port);
+                }
+            }
+            else
+            {
+                LogHelper.Info($"璇锋鏌ラ厤缃枃浠讹細鏈湪閰嶇疆鏂囦欢涓煡璇㈠埌璇ラ棬鍙风殑淇℃伅銆傚綋鍓嶉棬鍙凤細{zone}", "鑷姩闂�);
+            }
+        }
+
+        /*
+         IO妯″潡1	鍙敤02鍔熻兘鐮佽鍙�+         1x0000	涓�ゼ寮�棬鍒颁綅淇″彿
+         1x0001	浜屾ゼ寮�棬鍒颁綅淇″彿
+	
+	
+         IO妯″潡2	鍙敤05鍔熻兘鐮佸啓鍏�+         0x0000	涓�ゼ妤煎眰鎸夐挳淇″彿
+         0x0001	浜屾ゼ妤煎眰鎸夐挳淇″彿
+         */
+        /// <summary>
+        /// 鐢垫鍙渶瑕佸紑闂紝涓嶉渶瑕佸叧闂�+        /// </summary>
+        /// <param name="zone"></param>
+        /// <param name="occupy"></param>
+        private static void TrafficElevator(string zone, bool occupy)
+        {
+            //鍒ゆ柇鏄惁鏃剁數姊棬
+            var elevatorDoor = Settings.GetelEvatorDoorList().Where(a => a.door == zone).FirstOrDefault();
+            if (elevatorDoor != null)
+            {
+                //oitcp涓浆 modbus rtu 鏂瑰紡寮�數姊�+                //BitConverter.ToString(CRC16LH(Hex2Bytes("01 02 00 03 00 01"))).Replace("-", string.Empty).ToLower()
+                LogHelper.Info($"鏀跺埌agv寮�數姊棬璇锋眰{zone}", "鐢垫");
+                if (occupy)
+                {
+                    var readAddr = elevatorDoor.addr == 1 ? 0 : 1;
+                    var read = $"01 02 00 0{readAddr} 00 01 ";
+                    read += BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(read))).Replace("-", " ").ToLower();
+                    LogHelper.Info($"鏌ヨ鐢垫闂▄zone}鐘舵�鍙戦�{read}", "鐢垫");
+                    var res = OITcpHelper.HexTransit(new OITcpHelper.StrTransitData { host = Settings.ElevatorIP, data = read, port = 8899 });
+                    if (res != null && res.errCode == 0 && res.result.Replace(" ", "").Substring(7, 1) == "1")
+                    {
+                        //鍒ゆ柇闂ㄥ紑浜嗭紝閫氱煡agv璧�+                        LogHelper.Info($"鐢垫闂▄zone}寮�簡锛岄�鐭gv杩涘幓", "鐢垫");
+                        NDCHelper.Traffic(zone);
+                    }
+                    else
+                    {
+                        if (!elevatorRecord.Keys.Contains(zone) || DateTime.Now.Subtract(elevatorRecord[zone]).TotalSeconds < 8)
+                        {
+                            //寮�棬鏄竴娆″惛鍚堬紝涓�鏂紑
+                            var write = $"01 05 00 0{elevatorDoor.addr} ff 00 ";
+                            write += BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(write))).Replace("-", " ").ToLower();
+                            LogHelper.Info($"鍙戦�鐢垫{zone}寮�棬璇锋眰{write}锛屽惛鍚�, "鐢垫");
+                            res = OITcpHelper.HexTransit(new OITcpHelper.StrTransitData { host = Settings.ElevatorIP, data = write, port = 8899 });
+                            if (res != null && res.errCode == 0)
+                            {
+                                //Console.WriteLine("鍑嗗鍙戦�鏂紑淇″彿");
+                                Thread.Sleep(1000);
+                                write = $"01 05 00 0{elevatorDoor.addr} 00 00 ";
+                                write += BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(write))).Replace("-", " ").ToLower();
+                                LogHelper.Info($"鍙戦�鐢垫{zone}寮�棬璇锋眰{write}锛屾柇寮�, "鐢垫");
+                                OITcpHelper.HexTransit(new OITcpHelper.StrTransitData { host = Settings.ElevatorIP, data = write, port = 8899 });
+                                Thread.Sleep(1000);
+                                LogHelper.Info($"鍙戦�鐢垫{zone}寮�棬璇锋眰{write}锛屾柇寮�, "鐢垫");
+                                OITcpHelper.HexTransit(new OITcpHelper.StrTransitData { host = Settings.ElevatorIP, data = write, port = 8899 });
+                                Thread.Sleep(1000);
+                                LogHelper.Info($"鍙戦�鐢垫{zone}寮�棬璇锋眰{write}锛屾柇寮�, "鐢垫");
+                                OITcpHelper.HexTransit(new OITcpHelper.StrTransitData { host = Settings.ElevatorIP, data = write, port = 8899 });
+
+                                if (!elevatorRecord.Keys.Contains(zone))
+                                {
+                                    elevatorRecord.Add(zone, DateTime.Now);
+                                }
+                                else
+                                {
+                                    elevatorRecord[zone] = DateTime.Now;
+                                }
+                            }
+                            else
+                            {
+                                //Console.WriteLine("鍙戦�鍚稿悎淇″彿澶辫触");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        #endregion
+
+        #region 鐡剁洊鏈�+        //璁板綍褰撳墠鐡剁洊鏈烘槸鍗充骇鍗崇敤杩樻槸鍏ュ簱妯″紡锛屽悗闈㈢┖鎵樺紑濮嬪嵏璐ф椂锛屽鏋滄ā寮忔湁鍙橀渶瑕侀�鐭ヨ澶�+        private static Dictionary<string, string> bottleCapState = new Dictionary<string, string>();
+
+        /// <summary>
+        /// 鐡剁洊鏈�3F 00 11锛堣澶�锛�22锛堣澶�锛�01锛�濉戞枡绛愩�2閾佺瓙锛�0d 0a
+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="plc"></param>
+        internal static void JunZhouAnalysisBottleCap(string data, Settings.deviceInfo plc)
+        {
+            LogHelper.Info($"{plc.deviceName}-{plc.address}-{data}", "鐡剁洊鏈�);
+
+            /*
+                鐘舵�1	婊℃墭浜х敓锛岄渶瑕佸彇婊¢�绌猴紝浠庢弧鎵樹骇鐢熷埌婊℃墭鍙栬蛋涓�洿缁存寔鐘舵�1
+                鐘舵�2	閫佺┖瀹屾垚涔嬪悗涓虹姸鎬�
+                鐘舵�3	婊℃墭鍙栬蛋锛岄�绌轰箣鍓嶄负鐘舵�3锛屽紑鏈洪粯璁ょ姸鎬佷篃涓虹姸鎬�
+            */
+
+
+
+            //淇″彿鍑洪敊
+            if (data.Substring(0, 1) != "1" || data.Substring(2, 1) != "2")
+            {
+                //鍒ゆ柇鍝竟娌℃湁鎵樼洏
+                if (ContainerHelper.CheckEmpty(plc.location[0]))
+                {
+                    PlcHelper.SendHex(plc.address, "3F00110d0a");
+                }
+                if (ContainerHelper.CheckEmpty(plc.location[1]))
+                {
+                    PlcHelper.SendHex(plc.address, "3F00210d0a");
+                }
+            }
+        }
+
+        #endregion
+
+        #region   杈撻�绾�+
+        /*  娣冲畨澶у皬鐗堝鐞嗭細
+            1.鍏ュ簱璁$畻璐т綅鑾峰彇鍒扮┖鎺掞紝闇�垽鏂彟涓�釜 鐗堜綅鎵�搴旂殑鎺�鏄惁瀛樺湪璐т綅,浠ュ強鏃犻攣瀹�----------OVER
+            2.绉诲簱宸ュ崟鐐瑰嚮鎵ц涓椂锛氶渶瑕佹嬁鍑烘墍鏈夌殑 璧风偣搴撲綅浠ュ強缁堢偣搴撲綅锛屽垽鏂悗缂�繀椤讳竴鑷�----------OVER
+            3.灏忔澘搴撳尯搴撲綅 闇� 鍦ㄥぇ鏉跨殑搴撳尯搴撲綅涓婂姞涓婂悗缂�-XB                            ----------OVER
+            4.杩涜搴撲綅閿佸畾瑙i攣鍥炴姤鏃讹紝闇�鍘婚櫎鍚庣紑 -XB                                    ----------OVER
+            5.澶ф澘鐨勫簱鍖哄簱浣嶉渶瑕佷笌瀵屽嫆WMS鍚屾                                             ----------OVER
+         */
+
+
+
+
+        private static string ConveryInfoFullTwo(Settings.deviceInfo plc, string DeviceStartTime, string deviceName)
+        {
+            //2.鑾峰彇褰撳墠浜х嚎 璁惧涓棿琛�瀵瑰簲淇℃伅   ChunAnDeviceState 
+            //2-1.鏈夋暟鎹紝鍒ゆ柇褰撳墠鏄惁涓虹涓�鏀跺埌涓嬬嚎淇″彿
+            //      绗竴娆★細鏇存柊 DeviceState = 1锛孌eviceStartTime = 褰撳墠鏃堕棿
+            //      绗琋娆★細鍒ゆ柇褰撳墠 DeviceState 鏄惁涓�锛屼笉涓�锛屾洿鏂�DeviceState 浠ュ強 DeviceStartTime
+            //2-2.鏃犳暟鎹紝鎻掑叆 DeviceName 锛孌eviceState = 1锛孌eviceStartTime = 褰撳墠鏃堕棿 鏁版嵁
+            var deviceTableInfo = WCSHelper.GetDaMingShanDeviceState(deviceName);
+            if (deviceTableInfo != null)
+            {
+                if (deviceTableInfo.DeviceState != "1") WCSHelper.UpdateDaMingShanDeviceState(deviceTableInfo, "1", DeviceStartTime);
+                else DeviceStartTime = deviceTableInfo.DeviceTime;
+            }
+            else
+            {
+                WCSHelper.DaMingShangInsertDeviceState(new DaMingShanDeviceState
+                {
+                    DeviceName = deviceName,
+                    DeviceTime = DeviceStartTime,
+                    DeviceState = "1"
+                });
+            }
+
+            return DeviceStartTime;
+        }
+        private static bool ConveryInfoFullThree(Settings.deviceInfo plc, string location, WorkOrder workOrder, string DeviceStartTime, string positionCode, string deviceName, ref string TrayCode, ref string BatchNo, ref string ItemLayer)
+        {
+            bool result = true;
+            var db = new SqlHelper<object>().GetInstance();
+            //3.浠�瀵屽嫆鎵樼洏淇℃伅涓棿琛�鑾峰彇 dateTime < DeviceStartTime 鐨勬暟鎹�  ChunAnTrayInfo
+            //      鏈変袱鏉★細杩涘叆绗�3-1 姝�+            //      灏忎簬涓ゆ潯锛氬紓甯�杩炴帴 鎶ヨ鍣�杩涜澹板厜鎶ヨ
+            //3-1.鍒ゆ柇鎵樼洏淇℃伅涓�鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�鏄惁鏈夊�---------鏍规嵁 鎵樿 鍒ゆ柇褰撳墠鎵樼洏鏄惁涓洪浂澶�+            //      鏈夊�锛氬垽鏂綋鍓嶅�鏄惁涓�宸ュ崟淇℃伅 鐩稿悓锛屼笉鍚屼唬琛�褰撳墠浜х嚎鍒囨崲浜嗙敓浜х被鍨嬫垨棣栨涓嬬嚎锛岄渶鍚屾鏇存柊 宸ュ崟淇℃伅
+            //      鏃犲�锛氬垽鏂伐鍗曟槸鍚﹀瓨鍦ㄥ搴斿�锛屼笉瀛樺湪 鍗�寮傚父
+            if (!string.IsNullOrEmpty(DeviceStartTime))
+            {
+                LogHelper.Info($"杈撻�绾匡細{deviceName} 鑾峰彇鎵樼洏鏁版嵁 浣嶇疆浠g爜{positionCode}");
+                var trayTableInfo = WCSHelper.GetDaMingShanTrayInfoList(positionCode, deviceName);
+                if (trayTableInfo != null)
+                {
+                    trayTableInfo = trayTableInfo.OrderBy(a => Convert.ToDateTime(a.dateTime)).ToList();
+                    if (trayTableInfo.Count == 2)
+                    {
+                        string trayCode = ""; string batchNo = ""; string itemLayer = "";
+                        //1-棣栧厛鍒ゆ柇宸ュ崟 鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�涓変釜鍙傛暟鏄惁鏈夊� 
+                        //      鏈夊�锛氬垽鏂拰褰撳墠鍊兼槸鍚︾浉鍚岋紝涓嶅悓 鍗�鏇存柊   UpdateWorkInfo
+                        //      鏃犲�锛氭洿鏂板伐鍗曞搴斾俊鎭�+                        trayTableInfo.ForEach(a =>
+                        {
+                            LogHelper.Info($"鎵樼洏鍙穥a.trayCode} 鎵规鍙穥a.batchNo} 鐗╂枡灞傛暟{a.itemLayer}");
+                            trayCode = trayCode + "," + a.trayCode;
+                            string TrayRule = "";
+                            string UpdateWorkOn = "";//鏇存柊宸ュ崟淇℃伅寮�叧 榛樿涓虹┖ 1-闇�鏇存柊 鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�淇℃伅
+
+                            //鎴愬搧涓嬬嚎锛氶鎵樹笅绾�蹇呴』 浼犺緭鍏ㄩ儴淇℃伅-鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁帮紱鍚﹀垯 绗竴鎵樺氨鏃犳硶涓嬬嚎
+                            //          涔嬪悗濡傛灉缂哄皯淇℃伅锛屽彲浠ヤ粠宸ュ崟鑾峰彇
+                            //宸ュ崟鍒濆鐘舵�锛氭墭瑙勩�鎵规鍙枫�鐗╂枡灞傛暟 蹇呯劧鏈変竴涓�涓虹┖锛涘悗缁細涓�洿鏈夊�
+                            if (string.IsNullOrEmpty(workOrder.S_BatchNo) || string.IsNullOrEmpty(workOrder.S_ItemLayer))
+                            {
+                                WCSHelper.UpdateWorkInfo(workOrder, a.batchNo, a.itemLayer);
+                                batchNo = a.batchNo; itemLayer = a.itemLayer;
+                            }
+                            //澶勭悊 褰撳墠鎵樼洏 鎵樿銆佹壒娆″彿銆佺墿鏂欏眰鏁�淇℃伅
+                            ConveryInfoFullThreeS(plc, location, a, workOrder, DeviceStartTime, ref batchNo, ref itemLayer, ref TrayRule, ref UpdateWorkOn);
+                            if (UpdateWorkOn == "1") WCSHelper.UpdateWorkInfo(workOrder, batchNo, itemLayer);
+
+                            //闆跺ご鐗╂枡鍒ゆ柇
+                            //if (TrayRule != a.trayNum)
+                            //{
+                            //    result = false;
+                            //    LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾垚鍝佷笅绾�褰撳墠鐗╂枡绠辨暟锛歿a.itemLayer}涓庢爣鍑嗘墭瑙勶細{TrayRule}涓嶇锛屾爣鍑嗘墭瑙勪俊鎭紓甯革紒", "杈撻�绾�);
+                            //    //姝e父涓嬬嚎-涓嶆槸鏁存墭涓嬬嚎  杩炴帴鎶ヨ鍣� 鎶ヨ
+                            //    //Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾垚鍝佷笅绾�褰撳墠鐗╂枡绠辨暟锛歿a.itemLayer}涓庢爣鍑嗘墭瑙勶細{TrayRule}涓嶇锛屾爣鍑嗘墭瑙勪俊鎭紓甯革紒");
+                            //}
+                            workOrder.S_WorkNo = a.workNo;
+                        });
+
+                        var trayAll = WCSHelper.GetDaMingShanTrayInfoAllList(deviceName);
+                        if (trayTableInfo.Count != trayAll.Count && trayTableInfo.Count == 1)
+                        {
+                            result = false;
+                            LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝璁板綍鎵樼洏淇℃伅涓簕trayAll.Count}鏉★紝鎵樼洏淇℃伅寮傚父锛�, "杈撻�绾�);
+                            //杩炴帴鎶ヨ鍣� 杩涜寮傚父鎶ヨ
+                            SendErrorTcpMsg(plc, DeviceStartTime);
+                            db.Deleteable<DaMingShanDeviceState>().Where(a => a.DeviceName.Trim() == deviceName).ExecuteCommand();
+                            //Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝璁板綍鎵樼洏淇℃伅涓簕trayAll.Count}鏉★紝鎵樼洏淇℃伅寮傚父锛�);
+                        }
+                        TrayCode = trayCode; BatchNo = batchNo; ItemLayer = itemLayer;
+                    }
+                    else
+                    {
+                        result = false;
+                        LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝鎵樼洏淇℃伅寮傚父锛�, "杈撻�绾�);
+                        //杩炴帴鎶ヨ鍣� 杩涜寮傚父鎶ヨ
+                        SendErrorTcpMsg(plc, DeviceStartTime);
+                        db.Deleteable<DaMingShanDeviceState>().Where(a => a.DeviceName.Trim() == deviceName).ExecuteCommand();
+                        //Console.WriteLine($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝鎵樼洏淇℃伅寮傚父锛�);
+                    }
+                }
+                else
+                {
+                    result = false;
+                    LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛岀涓�涓嬬嚎鏃堕棿涔嬪墠鍙幏寰梴trayTableInfo.Count}鏉℃墭鐩樹俊鎭紝鎵樼洏淇℃伅寮傚父锛�, "杈撻�绾�);
+                    SendErrorTcpMsg(plc, DeviceStartTime);
+                    db.Deleteable<DaMingShanDeviceState>().Where(a => a.DeviceName.Trim() == deviceName).ExecuteCommand();
+                }
+            }
+            else LogHelper.Info($"杈撻�绾匡細{deviceName} 涓嬬嚎淇″彿锛歿location} ,DeviceStartTime 璁惧绗竴娆′笅绾挎椂闂翠负绌猴紝绋嬪簭寮傚父锛�, "杈撻�绾�);
+            return result;
+        }
+
+
+
+
+        /// <summary>
+        /// 杈撻�绾挎墭鐩樹俊鎭紓甯�鍚戣緭閫佺嚎鍙戦�寮傚父淇″彿
+        /// 1銆佷笅绾挎椂闂村墠鐨勬墭鐩樻暟灏忎簬2
+        /// 2銆佹墭瑙勪笉绛変簬褰撳墠鏁伴噺
+        /// </summary>
+        /// <param name="plc"></param>
+        public static void SendErrorTcpMsg(Settings.deviceInfo plc, string deviceStartTime)
+        {
+            if ((DateTime.Now - Convert.ToDateTime(deviceStartTime)).TotalSeconds > 60) PlcHelper.SendHex(plc.address, "3F00600d0a");
+        }
+
+        private static void ConveryInfoFullThreeS(Settings.deviceInfo plc, string location, DaMingShanTrayInfo a, WorkOrder workOrder, string DeviceStartTime, ref string BatchNo, ref string ItemLayer, ref string TrayRule, ref string UpdateWorkOn)
+        {
+            //if (string.IsNullOrEmpty(a.trayRule))
+            //{
+            //    //浼犺緭缂哄皯 鏍囧噯鎵樿淇℃伅锛岄渶瑕佷粠宸ュ崟鑾峰彇
+            //    if (!string.IsNullOrEmpty(workOrder.S_TrayRules)) TrayRule = workOrder.S_TrayRules;
+            //    else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭〃鏃犳爣鍑嗘墭瑙勪俊鎭笖宸ュ崟:{workOrder.S_WorkNo}涔熸病鏈夋爣鍑嗘墭瑙勪俊鎭紝鏍囧噯鎵樿淇℃伅寮傚父锛�, "杈撻�绾�);
+            //}
+            //else
+            //{
+            //    //涓�鍒囨崲浜�鐢熶骇鐗╂枡锛岄渶瑕佹洿鏂�宸ュ崟淇℃伅
+            //    if (workOrder.S_TrayRules != a.trayRule)
+            //    {
+            //        TrayRule = a.trayRule;
+            //        UpdateWorkOn = "1";
+            //    }
+            //    else TrayRule = a.trayRule;
+            //}
+            if (string.IsNullOrEmpty(a.batchNo))
+            {
+                //浼犺緭缂哄皯 鎵规鍙蜂俊鎭紝闇�浠庡伐鍗曡幏鍙�+                if (!string.IsNullOrEmpty(workOrder.S_BatchNo)) BatchNo = workOrder.S_BatchNo;
+                else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭〃鏃犳壒娆″彿淇℃伅涓斿伐鍗�{workOrder.S_WorkNo}涔熸病鏈夋壒娆″彿淇℃伅锛屾壒娆″彿淇℃伅寮傚父锛�, "杈撻�绾�);
+            }
+            else
+            {
+                //涓�鍒囨崲浜�鐢熶骇鐗╂枡锛岄渶瑕佹洿鏂�宸ュ崟淇℃伅
+                if (workOrder.S_BatchNo != a.batchNo)
+                {
+                    BatchNo = a.batchNo;
+                    UpdateWorkOn = "1";
+                }
+                else BatchNo = a.batchNo;
+            }
+            if (string.IsNullOrEmpty(a.itemLayer))
+            {
+                //浼犺緭缂哄皯 鎵规鍙蜂俊鎭紝闇�浠庡伐鍗曡幏鍙�+                if (!string.IsNullOrEmpty(workOrder.S_ItemLayer)) ItemLayer = workOrder.S_ItemLayer;
+                else LogHelper.Info($"杈撻�绾匡細{plc.deviceName} 涓嬬嚎淇″彿锛歿location},涓嬬嚎鏃堕棿锛歿DeviceStartTime}锛屾墭鐩樹俊鎭〃鏃犵墿鏂欏眰鏁颁俊鎭笖宸ュ崟:{workOrder.S_WorkNo}涔熸病鏈夌墿鏂欏眰鏁颁俊鎭紝鐗╂枡灞傛暟淇℃伅寮傚父锛�, "杈撻�绾�);
+            }
+            else
+            {
+                //涓�鍒囨崲浜�鐢熶骇鐗╂枡锛岄渶瑕佹洿鏂�宸ュ崟淇℃伅
+                if (workOrder.S_ItemLayer != a.itemLayer)
+                {
+                    ItemLayer = a.itemLayer;
+                    UpdateWorkOn = "1";
+                }
+                else ItemLayer = a.itemLayer;
+            }
+        }
+        #endregion
+
+        #region   鍏朵粬璁惧
+        private static void AnalysisDevice()
+        {
+
+        }
+
+
+        #endregion
+
+    }
+
+}
diff --git a/HH.WCS.NongFuChaYuan/TaskController/Monitor.cs b/HH.WCS.NongFuChaYuan/TaskController/Monitor.cs
new file mode 100644
index 0000000..fc36104
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/TaskController/Monitor.cs
@@ -0,0 +1,2163 @@
+锘縰sing HH.WCS.NongFuChaYuan.DeviceService;
+using HH.WCS.NongFuChaYuan.TaskController;
+using HH.WCS.NongFuChaYuan.OtherService;
+using HH.WCS.NongFuChaYuan.WmsService;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using HH.WCS.NongFuChaYuan.DispatchService;
+using SqlSugar;
+
+namespace HH.WCS.NongFuChaYuan.TaskController
+{
+    /// <summary>
+    /// 瀹氭椂杞浠诲姟
+    /// </summary>
+    internal class Monitor
+    {
+        private static ModbusHelper modbusHelper = new ModbusHelper();
+        private static WCSHelper WCSHelper = new WCSHelper();
+
+        #region   鍐滃か灞辨硥-澶ф槑灞卞伐鍘�+
+
+
+
+
+
+
+
+        /// <summary>
+        /// 鑷姩绉诲簱 浠�鐐瑰紑濮嬬Щ搴�鍓嶄竴澶╃殑鎵规鍙�
+        /// </summary>
+        public static void AnalysisProductLine()
+        {
+            //鏌ユ壘鍓嶄竴澶╃殑涓棿琛ㄦ暟鎹�+            var db = new SqlHelper<object>().GetInstance();
+            var oldbatch = DateTime.Now.AddDays(-1).ToString("yyyyMMdd").Substring(2);
+            var newbatch = DateTime.Now.ToString("yyyyMMdd").Substring(2);
+            LogHelper.Info($"鏄ㄥぉ鎵规={oldbatch},褰撳ぉ鎵规={newbatch}", "鑷姩绉诲簱");
+            var movelist = db.Queryable<DaMingShanAnalysisMoveLib>().Where(a => a.Batch.Contains(oldbatch)).ToList();
+            if (movelist.Count > 0)
+            {
+                if (DateTime.Now > DateTime.Parse("9:30"))
+                {
+                    LogHelper.Info($"涓棿琛ㄦ煡鎵惧埌鍓嶄竴澶╃殑鎵规 寮�鏌ユ壘鑷姩绉诲簱宸ュ崟杩涜绉诲簱", "鑷姩绉诲簱");
+                    //鏌ユ壘宸ュ崟 濡傛灉鐘舵�涓烘墽琛屼腑鍒欏紑濮嬬Щ搴�+                    var worklist = movelist.GroupBy(a => a.DeviceName).ToList();
+                    for (int k = 0; k < worklist.Count(); k++)
+                    {
+                        var deviceinfo = worklist[k].OrderBy(a => a.DeviceName).First();
+                        var fulenewbatch = "";
+                        var fuleoldbatch = "";
+                        if (deviceinfo.DeviceName.Contains("SL1"))
+                        {
+                            fulenewbatch = newbatch + "SL1";
+                            fuleoldbatch = oldbatch + "SL1";
+                        }
+                        else
+                        {
+                            fulenewbatch = newbatch + "SL2";
+                            fuleoldbatch = oldbatch + "SL2";
+                        }
+                        var WorkInfo = WCSHelper.GetDaMingShanAnalysisOrderWorkType("鑷姩绉诲簱", fulenewbatch, deviceinfo.DeviceName);
+                        if (WorkInfo.Count > 0)
+                        {
+                            var rowlist = new List<string>();
+                            var oldrowlist = new List<string>();
+                            LogHelper.Info($"鏌ユ壘鍒拌嚜鍔ㄧЩ搴撳伐鍗�鍒ゆ柇鐘舵�鏄惁鏄墽琛屼腑", "鑷姩绉诲簱");
+                            var state = WorkInfo.Where(a => a.S_WorkState == "鎵ц涓�).ToList();
+                            if (state.Count > 0)
+                            {
+                                //鎵ц绉诲簱 灏嗕骇绾垮垎寮�繘琛岀Щ搴�+                                for (int i = 0; i < state.Count; i++)
+                                {
+                                    var list = movelist.Where(a => a.DeviceName == state[i].S_PLineNo).ToList();
+                                    //鎷垮嚭涓棿琛ㄨ褰曠殑鎺掓暟鎹�+                                    for (int j = 0; j < list.Count; j++)
+                                    {
+                                        rowlist.Add(list[j].RowNo);
+                                        oldrowlist.Add(list[j].RowNo);
+                                    }
+                                    //鍒ゆ柇杩欐潯浜х嚎瀵瑰簲鐨勬帓鏈夋病鏈変换鍔�+                                    if (IntensiveArea.TaskTakeAreaOver2(rowlist))
+                                    {
+                                        //鎺掗櫎鏀炬弧鐨勬帓鍜岀┖鐨勬帓骞惰В閿�+                                        LogHelper.Info($"浜х嚎 {list[0].DeviceName} 涓嬬嚎鐨勬墍鏈夋帓涓簕JsonConvert.SerializeObject(rowlist)}", "鑷姩绉诲簱");
+                                        IntensiveArea.ExcludeFullEmyRow(ref rowlist, state[i].S_PLineNo);
+                                        if (rowlist.Count() >= 2)
+                                        {
+                                            LogHelper.Info($"浜х嚎 {list[0].DeviceName} 缁忚繃绌烘弧鍒ゆ柇鎺掗櫎杩囧悗 鍓╀笅鐨勬墍鏈夋帓涓簕JsonConvert.SerializeObject(rowlist)}", "鑷姩绉诲簱");
+                                            //閿佸畾鍓╀笅鐨勬帓 鎺掗櫎璐т綅鏈夐攣鐨勬儏鍐�+                                            IntensiveArea.LockYiKu(ref rowlist);
+                                            LogHelper.Info($"浜х嚎 {list[0].DeviceName} 缁忚繃閿佸畾鎺掗櫎杩囧悗 鍓╀笅鐨勬墍鏈夋帓涓簕JsonConvert.SerializeObject(rowlist)}", "鑷姩绉诲簱");
+                                            //鍓╀笅鐨勬帓杩涜鐗╂枡鍖归厤鐢熸垚浠诲姟
+                                            var res = IntensiveArea.GetYiKuLocation(rowlist, state[i], fuleoldbatch);
+                                            if (!res && oldrowlist.Count() == rowlist.Count())
+                                            {
+                                                //缁撴潫宸ュ崟骞跺垹闄や腑闂磋〃鏁版嵁
+                                                WCSHelper.EndYiKuWorkOrder(state[i].S_PLineNo, state[i].S_BatchNo, oldbatch);
+                                                foreach (var item in rowlist)
+                                                {
+                                                    IntensiveArea.UnlockYiKu(item);
+                                                }
+                                            }
+                                        }
+                                        else
+                                        {
+                                            //缁撴潫宸ュ崟鍒犻櫎涓棿琛ㄦ暟鎹�+                                            WCSHelper.EndYiKuWorkOrder(state[i].S_PLineNo, state[i].S_BatchNo, oldbatch);
+                                            foreach (var item in rowlist)
+                                            {
+                                                IntensiveArea.UnlockYiKu(item);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鑷姩绉诲簱宸ュ崟鐘舵�涓嶄负鎵ц涓�鍙兘宸插畬鎴愭垨鏆傚仠 璇︽儏鐪媘obox宸ュ崟绠$悊", "鑷姩绉诲簱");
+                            }
+                        }
+                        else
+                        {
+                            LogHelper.Info($"娌℃湁鏌ユ壘鍒板綋澶╃殑鑷姩绉诲簱宸ュ崟 鑷姩鍒涘缓鑷姩绉诲簱宸ュ崟", "鑷姩绉诲簱");
+                            //鍒涘缓鑷姩绉诲簱宸ュ崟
+                            WorkOrder workorder = new WorkOrder
+                            {
+                                S_WorkNo = deviceinfo.Batch + "00" + (k + 1).ToString(),
+                                S_PLineNo = deviceinfo.DeviceName,
+                                S_BatchNo = fulenewbatch,
+                                S_ORDER_TYPE = "鑷姩绉诲簱",
+                                S_WorkState = "鎵ц涓�
+                            };
+                            WCSHelper.DaMingShanInsertWork(workorder);
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 澶囪揣绉诲簱
+        /// </summary>
+        internal static void AnalysisStockup()
+        {
+            var WorkInfo = WCSHelper.GetDaMingShanAnalysisOrderWork("澶囪揣绉诲簱");
+            if (WorkInfo != null)
+            {
+                AnalysisCularAndStock1(WorkInfo);
+            }
+        }
+
+
+        /// <summary>
+        /// 鏇存柊瀹炴椂搴撳瓨
+        /// </summary>
+        internal static void PanKurealtime()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var list = Settings.GetPanKuList();
+            if (list.Count() > 0)
+            {
+                list.ForEach(b =>
+                {
+                    var collist = db.Queryable<Location>().Where(a => a.S_AREA_CODE == b).PartitionBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).Take(1).ToList();
+                    collist.ForEach(c =>
+                    {
+                        var locinfo = db.Queryable<Location>().Where(a => a.N_ROW == c.N_ROW && a.N_CURRENT_NUM > 0).First();
+                        if (locinfo == null)
+                        {
+                            var pankuinfo = db.Queryable<DaMingShanPanKuTask>().Where(a => a.N_ROW == c.N_ROW).First();
+                            if (pankuinfo == null)
+                            {
+                                //鎻掑叆鐩樺簱鏁版嵁
+                                LogHelper.Info($"鎻掑叆绌烘帓鏁版嵁");
+                                var pk = new DaMingShanPanKuTask
+                                {
+                                    N_CURRENT_NUM = 0,
+                                    N_ROW = c.N_ROW,
+                                    S_AREA_CODE = b
+                                };
+                                db.Insertable(pk).ExecuteCommand();
+                            }
+                            else
+                            {
+                                //鏇存柊鐩樺簱鏁版嵁涓棿琛�+                                LogHelper.Info($"鏇存柊绌烘帓鏁版嵁");
+                                pankuinfo.N_CURRENT_NUM = 0;
+                                pankuinfo.S_BatchNo = "";
+                                pankuinfo.SQL_Condition = "";
+                                pankuinfo.S_ItemCode = "";
+                                pankuinfo.S_PLineNo = "";
+                                pankuinfo.S_AREA_CODE = b;
+                                db.Updateable(pankuinfo).WhereColumns(a => new { a.S_ID }).ExecuteCommand();
+                            }
+                        }
+                        else
+                        {
+                            var iteminfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locinfo.S_LOC_CODE).Includes(a => a.CntrItemRel).First();
+                            var numinfo = db.Queryable<Location>().Where(a => a.N_ROW == c.N_ROW).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                            var condition = WCSHelper.GetItemrel(iteminfo.CntrItemRel.S_ITEM_CODE, iteminfo.CntrItemRel.S_ITEM_MODEL);
+                            var pankuinfo = db.Queryable<DaMingShanPanKuTask>().Where(a => a.N_ROW == c.N_ROW).First();
+                            if (iteminfo != null && numinfo != null && condition != null)
+                            {
+                                if (pankuinfo == null)
+                                {
+                                    //鎻掑叆鐩樺簱鏁版嵁
+                                    LogHelper.Info($"鎻掑叆闈炵┖鎺掓暟鎹�);
+                                    var pk = new DaMingShanPanKuTask
+                                    {
+                                        N_ROW = c.N_ROW,
+                                        N_CURRENT_NUM = numinfo.sum * 2,
+                                        S_BatchNo = iteminfo.CntrItemRel.S_BATCH_NO,
+                                        SQL_Condition = condition.S_ITEM_CODE,
+                                        S_ItemCode = iteminfo.CntrItemRel.S_ITEM_CODE,
+                                        S_PLineNo = iteminfo.S_SRC == "涓�彿杈撻�绾� ? "SL1" : "SL2",
+                                        S_AREA_CODE = b
+                                    };
+                                    db.Insertable(pk).ExecuteCommand();
+                                }
+                                else
+                                {
+                                    //鏇存柊鐩樺簱鏁版嵁涓棿琛�+                                    LogHelper.Info($"鏇存柊闈炵┖鎺掓暟鎹�);
+                                    pankuinfo.N_CURRENT_NUM = numinfo.sum * 2;
+                                    pankuinfo.S_BatchNo = iteminfo.CntrItemRel.S_BATCH_NO;
+                                    pankuinfo.SQL_Condition = condition.S_ITEM_CODE;
+                                    pankuinfo.S_ItemCode = iteminfo.CntrItemRel.S_ITEM_CODE;
+                                    pankuinfo.S_PLineNo = iteminfo.S_SRC == "涓�彿杈撻�绾� ? "SL1" : "SL2";
+                                    pankuinfo.S_AREA_CODE = b;
+                                    db.Updateable(pankuinfo).WhereColumns(a => new { a.S_ID }).ExecuteCommand();
+                                }
+                            }
+                        }
+                    });
+                });
+            }
+        }
+
+
+        /// <summary>
+        /// 鐡剁洊鏈洪潪鍗充骇鍗崇敤
+        /// </summary>
+        internal static void AnalysisMoveLib()
+        {
+            ////鐡剁洊鏈�+            //PingGaikkcontrel();
+            //Thread.Sleep(1000);
+            //PingGaiN();
+            //Thread.Sleep(1000);
+            //PingGaiIncontrel();
+            //Thread.Sleep(1000);
+            ////鐡剁洊缈绘枟鏈�+            //FanDoukkcontrel();
+            //Thread.Sleep(1000);
+            //FanDouN();
+            //Thread.Sleep(1000);
+            //FanDouIncontrel();
+
+            ZiDong();
+            Thread.Sleep(1000);
+            itemZiDong();
+            Thread.Sleep(1000);
+
+
+        }
+
+        private static void itemZiDong()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            string areaNo = "YWJGJBQ";
+            var startbitlist = db.Queryable<Location>()
+                .Where(a => a.S_AREA_CODE == areaNo && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE=="鏃�)
+                .PartitionBy(a => a.N_ROW)
+                .OrderByDescending(a => a.N_COL)
+                .Includes(a => a.LocCntrRel, b => b.CntrItemRel)
+                .Take(1)
+                .ToList();
+            foreach (var item in startbitlist)
+            {
+                var startlock = db.Queryable<Location>()
+                    .Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "鏃� && a.S_LOCK_STATE != "鎶ュ簾")
+                    .First();
+                if (startlock == null)
+                {
+                    //绠楀彇缁堢偣
+                    if (item.LocCntrRel != null && !string.IsNullOrEmpty(item.LocCntrRel.S_CNTR_CODE))
+                    {
+                        if (item.LocCntrRel.CntrItemRel != null)
+                        {
+                            string itemcode = item.LocCntrRel.CntrItemRel.S_ITEM_CODE;
+                            var info = Settings.GetItemCacheAreaList().Where(a => a.ItemCode == itemcode).FirstOrDefault();
+                            if (info != null)
+                            {
+                                string endarea = info.AreaCode;
+                                var endbitlist = db.Queryable<Location>()
+                                    .Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE=="鏃�)
+                                    .PartitionBy(a => a.N_ROW)
+                                    .OrderBy(a => a.N_COL)
+                                    .Take(1)
+                                    .ToList();
+                                foreach (var it in endbitlist)
+                                {
+                                    var endlock = db.Queryable<Location>()
+                                        .Where(a => a.S_AREA_CODE == it.S_AREA_CODE && a.N_ROW == it.N_ROW && a.S_LOCK_STATE != "鏃� && a.S_LOCK_STATE != "鎶ュ簾")
+                                        .First();
+                                    if (endlock == null) 
+                                    {
+                                        //鍒涘缓浠诲姟
+                                        IntensiveArea.DaMingShanCreateTransport(item.S_LOC_CODE, it.S_LOC_CODE, "鐐瑰埌鐐硅浆杩�, item.LocCntrRel.S_CNTR_CODE, 1, 1, "", 1);
+                                        break;
+                                    }
+                                }
+                            }
+                            else 
+                            {
+                                LogHelper.Info($"鐗╂枡{itemcode} 鏈湪閰嶇疆涓壘鍒板搴斿簱鍖�);
+                            }
+                        }
+                        else 
+                        {
+                            LogHelper.Info($"璐т綅{item.S_LOC_CODE} 鎵樼洏{item.LocCntrRel.S_CNTR_CODE} 鏈粦瀹氱墿鏂�);
+                        }
+                    }
+                    else 
+                    {
+                        LogHelper.Info($"璐т綅{item.S_LOC_CODE} 鏈粦瀹氭墭鐩�);
+                    }
+                }
+            }
+        }
+
+        private static void ZiDong()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var list = Settings.GetinStockCacheAreaList().Where(a => a.Enable == "1").ToList();
+            if (list.Count > 0)
+            {
+                list.ForEach(a =>
+                {
+                    try
+                    {
+                        if (!string.IsNullOrEmpty(a.deviceName))
+                        {
+                            LogHelper.Info($"鑷姩杞繍 宸ュ崟鍙�{a.deviceName}");
+                            var workorder = db.Queryable<PGWorkOrder>().Where(it => it.S_PLineNo == a.deviceName && it.S_WorkState == "鎵ц涓�).First();
+                            if (workorder != null)
+                            {
+                                var num = 0;
+                                if (workorder.S_PLineNo == "Y7鍧� || workorder.S_PLineNo == "Y8鍧� || workorder.S_PLineNo == "Y8鐩�)
+                                {
+                                    //鍒ゆ柇缁堢偣鏁伴噺灏忎簬3
+                                    var areanum = db.Queryable<Location>().Where(it => it.S_AREA_CODE == a.ProductArea).Select(it => new { sum = SqlFunc.AggregateSum(it.N_CURRENT_NUM) }).First().sum;
+                                    var locknum = db.Queryable<Location>().Where(it => it.S_AREA_CODE == a.ProductArea && it.S_LOCK_STATE == "鍏ュ簱閿�).ToList().Count();
+                                    num = num + areanum + locknum;
+                                }
+
+                                if (num < 3)
+                                {
+                                    LogHelper.Info($"鑷姩杞繍 鏌ユ壘鍒板伐鍗�宸ュ崟鍙�{workorder.S_WorkNo}");
+                                    if (a.CacheAreaNoLock == "1")
+                                    {
+                                        var loclist = db.Queryable<Location>()
+                                       .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "鏃�)
+                                       .Select(it => new { sum = SqlFunc.AggregateSum(it.N_CURRENT_NUM), it.N_ROW })
+                                       .GroupBy(it => it.N_ROW)
+                                       .MergeTable()
+                                       .OrderByDescending(it => it.sum)
+                                       .ToList();
+
+                                        if (loclist.Count > 0)
+                                        {
+                                            LogHelper.Info($"璧风偣璐т綅鏁伴噺澶т簬0鐨勮揣浣嶆暟閲�{loclist.Count}");
+                                            var locinfo = db.Queryable<Location>()
+                                                .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                                .First();
+                                            if (locinfo != null)
+                                            {
+                                                var trayNo = "";
+                                                foreach (var item in loclist)
+                                                {
+                                                    if (a.ProductAreaLock == "0")
+                                                    {
+                                                        LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock} 鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄locinfo.S_LOC_CODE} 褰撳墠鏁伴噺{locinfo.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{locinfo.S_LOCK_STATE}");
+                                                        //缁堢偣搴撳尯闈炲瘑闆嗗瀷搴撳尯绠楁硶
+                                                        var lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                        if (lockinfo == null)
+                                                        {
+                                                            var startbit = db.Queryable<Location>()
+                                                            .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0)
+                                                            .OrderByDescending(it => it.N_COL)
+                                                            .Includes(it => it.LocCntrRel)
+                                                            .First();
+                                                            //鍒涘缓浠诲姟
+                                                            var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                                            LogHelper.Info($"鑾峰彇璧风偣{startbit.S_LOC_CODE} 鐐逛綅缁戝畾鎵樼洏鏁伴噺{traylist.Count}");
+
+                                                            for (int i = 0; i < a.CntrCount; i++)
+                                                            {
+                                                                LogHelper.Info("11111111111");
+                                                                trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                                            }
+                                                            LogHelper.Info("222222222222");
+                                                            IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                                            break;
+                                                        }
+                                                        else
+                                                        {
+                                                            LogHelper.Info($"璧风偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                        }
+                                                    }
+                                                    else
+                                                    {
+                                                        LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock}");
+                                                        //缁堢偣搴撳尯瀵嗛泦鍨嬪簱鍖虹畻娉�+                                                        var result = false;
+                                                        var endlist = db.Queryable<Location>().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                                        .OrderBy(it => it.N_COL)
+                                                        .PartitionBy(it => it.N_ROW)
+                                                        .Take(1)
+                                                        .ToList();
+                                                        foreach (var b in endlist)
+                                                        {
+                                                            LogHelper.Info($"鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄b.S_LOC_CODE} 褰撳墠鏁伴噺{b.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{b.S_LOCK_STATE}");
+                                                            var lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                            if (lockinfo == null)
+                                                            {
+                                                                lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                                if (lockinfo == null)
+                                                                {
+                                                                    var startbit = db.Queryable<Location>()
+                                                                    .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0)
+                                                                    .OrderByDescending(it => it.N_COL)
+                                                                    .Includes(it => it.LocCntrRel)
+                                                                    .First();
+                                                                    //鍒涘缓浠诲姟
+                                                                    var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                                                    for (int i = 0; i < a.CntrCount; i++)
+                                                                    {
+                                                                        trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                                                    }
+
+                                                                    IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                                                    break;
+                                                                }
+                                                                else
+                                                                {
+                                                                    LogHelper.Info($"璧风偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                                    break;
+                                                                }
+                                                            }
+                                                            else
+                                                            {
+                                                                LogHelper.Info($"缁堢偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                            }
+                                                        }
+                                                        if (result) break;
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                    else
+                                    {
+                                        var loclist = db.Queryable<Location>()
+                                           .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM == a.CntrCount && it.S_LOCK_STATE == "鏃�)
+                                           .Includes(it => it.LocCntrRel)
+                                           .First();
+
+                                        if (loclist != null)
+                                        {
+                                            LogHelper.Info($"璧风偣璐т綅 {loclist.S_LOC_CODE}");
+                                            var locinfo = db.Queryable<Location>()
+                                                .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                                .First();
+                                            if (locinfo != null)
+                                            {
+                                                var trayNo = "";
+                                                if (a.ProductAreaLock == "0")
+                                                {
+                                                    LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock} 鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄locinfo.S_LOC_CODE} 褰撳墠鏁伴噺{locinfo.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{locinfo.S_LOCK_STATE}");
+                                                    //鍒涘缓浠诲姟
+
+                                                    var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                                    for (int i = 0; i < a.CntrCount; i++)
+                                                    {
+                                                        trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                                    }
+                                                    IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                                }
+                                                else
+                                                {
+                                                    LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock}");
+                                                    //缁堢偣搴撳尯瀵嗛泦鍨嬪簱鍖虹畻娉�+                                                    var endlist = db.Queryable<Location>().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                                    .OrderBy(it => it.N_COL)
+                                                    .PartitionBy(it => it.N_ROW)
+                                                    .Take(1)
+                                                    .ToList();
+                                                    foreach (var b in endlist)
+                                                    {
+                                                        LogHelper.Info($"鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄b.S_LOC_CODE} 褰撳墠鏁伴噺{b.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{b.S_LOCK_STATE}");
+                                                        var lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                        if (lockinfo == null)
+                                                        {
+                                                            //鍒涘缓浠诲姟
+                                                            var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                                            for (int i = 0; i < a.CntrCount; i++)
+                                                            {
+                                                                trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                                            }
+                                                            IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                                            break;
+                                                        }
+                                                        else
+                                                        {
+                                                            LogHelper.Info($"缁堢偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                                else
+                                {
+
+                                }
+                            }
+                        }
+                        else
+                        {
+                            if (a.CacheAreaNoLock == "1")
+                            {
+                                var loclist = db.Queryable<Location>()
+                                .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM > 0)
+                                .Select(it => new { sum = SqlFunc.AggregateSum(it.N_CURRENT_NUM), it.N_ROW })
+                                .GroupBy(it => it.N_ROW)
+                                .MergeTable()
+                                .OrderByDescending(it => it.sum)
+                                .ToList();
+
+                                LogHelper.Info($"璧风偣璐т綅鏁伴噺澶т簬0鐨勮揣浣嶆暟閲�{loclist.Count}");
+                                if (loclist.Count > 0)
+                                {
+                                    var locinfo = db.Queryable<Location>()
+                                        .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                        .First();
+                                    if (locinfo != null)
+                                    {
+                                        LogHelper.Info($"鏌ユ壘鍒扮粓鐐规湁绌鸿揣浣嶅彲浠ュ嵏璐�璐т綅缂栫爜={locinfo.S_LOC_CODE}");
+                                        var trayNo = "";
+                                        foreach (var item in loclist)
+                                        {
+                                            if (a.ProductAreaLock == "0")
+                                            {
+                                                //缁堢偣搴撳尯闈炲瘑闆嗗瀷搴撳尯绠楁硶
+                                                LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock} 鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄locinfo.S_LOC_CODE} 褰撳墠鏁伴噺{locinfo.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{locinfo.S_LOCK_STATE}");
+                                                var lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                if (lockinfo == null)
+                                                {
+                                                    var startbit = db.Queryable<Location>()
+                                                                 .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "鏃�)
+                                                                 .OrderByDescending(it => it.N_COL)
+                                                                 .Includes(it => it.LocCntrRel)
+                                                                 .First();
+                                                    //鍒涘缓浠诲姟
+
+                                                    var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                                    for (int i = 0; i < a.CntrCount; i++)
+                                                    {
+                                                        trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                                    }
+                                                    IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                                    break;
+                                                }
+                                                else
+                                                {
+                                                    LogHelper.Info($"璧风偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                }
+                                            }
+                                            else
+                                            {
+                                                //缁堢偣搴撳尯瀵嗛泦鍨嬪簱鍖虹畻娉�+                                                LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock}");
+                                                var result = false;
+                                                var endlist = db.Queryable<Location>().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                                .OrderBy(it => it.N_COL)
+                                                .PartitionBy(it => it.N_ROW)
+                                                .Take(1)
+                                                .ToList();
+                                                foreach (var b in endlist)
+                                                {
+                                                    LogHelper.Info($"鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄b.S_LOC_CODE} 褰撳墠鏁伴噺{b.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{b.S_LOCK_STATE}");
+                                                    var lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                    if (lockinfo == null)
+                                                    {
+                                                        lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                        if (lockinfo == null)
+                                                        {
+                                                            var startbit = db.Queryable<Location>()
+                                                                 .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "鏃�)
+                                                                 .OrderByDescending(it => it.N_COL)
+                                                                 .Includes(it => it.LocCntrRel)
+                                                                 .First();
+                                                            LogHelper.Info($"鑾峰彇鍙彇璐ц揣浣嶇紪鐮亄startbit.S_LOC_CODE}");
+                                                            //鍒涘缓浠诲姟
+
+
+                                                            var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                                            for (int i = 0; i < a.CntrCount; i++)
+                                                            {
+                                                                trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                                            }
+
+
+                                                            IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                                            break;
+                                                        }
+                                                        else
+                                                        {
+                                                            LogHelper.Info($"璧风偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                            break;
+                                                        }
+                                                    }
+                                                    else
+                                                    {
+                                                        LogHelper.Info($"缁堢偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                    }
+                                                }
+                                                if (result) break;
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                var loclist = db.Queryable<Location>()
+                                     .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "鏃�)
+                                     .Includes(it => it.LocCntrRel)
+                                     .First();
+
+                                if (loclist != null)
+                                {
+                                    LogHelper.Info($"璧风偣璐т綅 {loclist.S_LOC_CODE}");
+                                    var locinfo = db.Queryable<Location>()
+                                        .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                        .First();
+                                    if (locinfo != null)
+                                    {
+                                        LogHelper.Info($"鏌ユ壘鍒扮粓鐐规湁绌鸿揣浣嶅彲浠ュ嵏璐�璐т綅缂栫爜={locinfo.S_LOC_CODE}");
+                                        var trayNo = "";
+
+                                        if (a.ProductAreaLock == "0")
+                                        {
+                                            //缁堢偣搴撳尯闈炲瘑闆嗗瀷搴撳尯绠楁硶
+                                            LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock} 鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄locinfo.S_LOC_CODE} 褰撳墠鏁伴噺{locinfo.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{locinfo.S_LOCK_STATE}");
+
+                                            //鍒涘缓浠诲姟
+                                            var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                            for (int i = 0; i < a.CntrCount; i++)
+                                            {
+                                                trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                            }
+                                            IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                        }
+                                        else
+                                        {
+                                            //缁堢偣搴撳尯瀵嗛泦鍨嬪簱鍖虹畻娉�+                                            LogHelper.Info($"缁堢偣搴撳尯{a.ProductArea} 瀵嗛泦绫诲瀷{a.ProductAreaLock}");
+                                            var endlist = db.Queryable<Location>().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "鏃�)
+                                            .OrderBy(it => it.N_COL)
+                                            .PartitionBy(it => it.N_ROW)
+                                            .Take(1)
+                                            .ToList();
+                                            foreach (var b in endlist)
+                                            {
+                                                LogHelper.Info($"鑾峰彇鍙嵏璐ц揣浣嶇紪鐮亄b.S_LOC_CODE} 褰撳墠鏁伴噺{b.N_CURRENT_NUM} 褰撳墠閿佸畾鐘舵�{b.S_LOCK_STATE}");
+                                                var lockinfo = db.Queryable<Location>().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "鏃�).First();
+                                                if (lockinfo == null)
+                                                {
+                                                    LogHelper.Info($"鑾峰彇鍙彇璐ц揣浣嶇紪鐮亄loclist.S_LOC_CODE}");
+                                                    //鍒涘缓浠诲姟
+
+                                                    var traylist = db.Queryable<LocCntrRel>().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList();
+                                                    for (int i = 0; i < a.CntrCount; i++)
+                                                    {
+                                                        trayNo = traylist[i].S_CNTR_CODE + "," + trayNo;
+                                                    }
+                                                    IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority);
+                                                    break;
+                                                }
+                                                else
+                                                {
+                                                    LogHelper.Info($"缁堢偣鎺�璐т綅{lockinfo.S_LOC_CODE} 褰撳墠璐т綅鐘舵�{lockinfo.S_LOCK_STATE} 涓嶅厑璁哥敓鎴愪换鍔�);
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    catch (Exception ex) 
+                    {
+                        LogHelper.Error($"鑷姩杞繍娴佺▼寮傚父 寮傚父淇℃伅{ex.Message}",ex);
+                    }
+
+                });
+            }
+        }
+
+        /// <summary>
+        /// 鐡跺澂鏈洪潪鍗充骇鍗崇敤
+        /// </summary>
+        internal static void AnalysisMoveLib1()
+        {
+            //鐡跺澂鏈�+            PingGaikkcontrel1();
+            Thread.Sleep(1000);
+            //PingGaiN1();
+            //Thread.Sleep(1000);
+            //PingGaiIncontrel1();
+            //Thread.Sleep(1000);
+            //鐡跺澂缈绘枟鏈�+            FanDoukkcontrel1();
+            //Thread.Sleep(1000);
+            //FanDouN1();
+            //Thread.Sleep(1000);
+            //FanDouIncontrel1();
+        }
+
+        /// <summary>
+        /// 绠℃帶鐡剁洊鍏ュ簱缂撳瓨浣�+        /// </summary>
+        private static void PingGaiIncontrel()
+        {
+            LogHelper.Info("鐡剁洊鍏ュ簱绠℃帶");
+            var db = new SqlHelper<object>().GetInstance();
+            //鐡剁洊鍏ュ簱涓嶉渶瑕佸伐鍗�+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 4 && a.enable == 1).FirstOrDefault();
+            if (info != null)
+            {
+                LogHelper.Info($"鏌ヨ鍒拌澶囬厤缃俊鎭�浜х嚎鍙�{info.deviceName}");
+                //鐡剁洊鍑哄簱缂撳瓨浣�+                var workorder = WCSHelper.GetWorkOrder(info.deviceName);
+                if (workorder != null)
+                {
+                    LogHelper.Info($"鏌ヨ鍒版墽琛屼腑宸ュ崟 宸ュ崟鍙�{workorder.S_WorkNo}");
+                    var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.ItemTrayType == "婊�).FirstOrDefault();
+                    if (startinfo != null)
+                    {
+                        LogHelper.Info($"鏌ヨ鍒扮紦瀛樼偣閰嶇疆淇℃伅 绔欑偣缂栫爜={startinfo.location}");
+                        var startlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == startinfo.location).First();
+                        if (startlocation != null)
+                        {
+                            LogHelper.Info($"璇ョ紦瀛樼偣绔欑偣淇℃伅 褰撳墠鏁伴噺={startlocation.N_CURRENT_NUM} 閿佸畾鐘舵�={startlocation.S_LOCK_STATE.Trim()}");
+                            if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                            {
+                                Location endlocation = null;
+                                //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                                for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                                {
+                                    endlocation = pinggaiIn(startinfo.ProductArea[i], 3, true, workorder.S_BatchNo);
+                                    if (endlocation != null)
+                                    {
+                                        var TrayCode = "";
+                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                        var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                        var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                        for (int j = 0; j < ctnslist.Count(); j++)
+                                        {
+                                            TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                        }
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                        break;
+                                    }
+                                }
+                            }
+                            if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                            {
+                                Location endlocation = null;
+                                //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                                for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                                {
+                                    endlocation = pinggaiIn(startinfo.ProductArea[i], 0, true, workorder.S_BatchNo);
+                                    if (endlocation != null)
+                                    {
+                                        var TrayCode = "";
+                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                        var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                        var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                        for (int j = 0; j < ctnslist.Count(); j++)
+                                        {
+                                            TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                        }
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        else LogHelper.Info("缂撳瓨鐐圭珯鐐硅〃淇℃伅寮傚父");
+                    }
+                    else LogHelper.Info("缂撳瓨鐐逛俊鎭厤缃紓甯�);
+                }
+                else LogHelper.Info("鐡剁洊婊$瓙鍏ュ簱鏈壘鍒板伐鍗�);
+            }
+            else LogHelper.Info($"鏈壘鍒拌澶囬厤缃枃浠�);
+        }
+
+        /// <summary>
+        /// 绠℃帶鐡剁洊鍏ュ簱缂撳瓨浣�+        /// </summary>
+        private static void PingGaiIncontrel1()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            //鐡剁洊鍏ュ簱涓嶉渶瑕佸伐鍗�+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 2 && a.enable == 1).FirstOrDefault();
+            if (info != null)
+            {
+                //鐡剁洊鍑哄簱缂撳瓨浣�+                var workorder = WCSHelper.GetWorkOrder(info.deviceName);
+                if (workorder != null)
+                {
+                    var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.ItemTrayType == "婊�).FirstOrDefault();
+                    if (startinfo != null)
+                    {
+                        var startlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == startinfo.location).First();
+                        if (startlocation != null)
+                        {
+                            if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                            {
+                                Location endlocation = null;
+                                //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                                for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                                {
+                                    endlocation = pinggaiIn(startinfo.ProductArea[i], 3, true, workorder.S_BatchNo);
+                                    if (endlocation != null)
+                                    {
+                                        var TrayCode = "";
+                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                        var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                        var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                        for (int j = 0; j < ctnslist.Count(); j++)
+                                        {
+                                            TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                        }
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                        break;
+                                    }
+                                }
+                            }
+                            if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                            {
+                                Location endlocation = null;
+                                //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                                for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                                {
+                                    endlocation = pinggaiIn(startinfo.ProductArea[i], 0, true, workorder.S_BatchNo);
+                                    if (endlocation != null)
+                                    {
+                                        var TrayCode = "";
+                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                        var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                        var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                        for (int j = 0; j < ctnslist.Count(); j++)
+                                        {
+                                            TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                        }
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+            }
+        }
+
+        /// <summary>
+        /// 绠℃帶鐡剁洊缈绘枟鏈哄叆搴撶紦瀛樹綅
+        /// </summary>
+        private static void FanDouIncontrel()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            //鐡剁洊缈绘枟鏈哄叆搴撲笉闇�宸ュ崟
+            var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.ItemTrayType == "绌�).FirstOrDefault();
+            if (startinfo != null)
+            {
+                LogHelper.Info($"鏌ヨ鍒扮┖绛愬叆搴撳尯{startinfo.location} 搴撳尯缂栫爜={JsonConvert.SerializeObject(startinfo.ProductArea)}");
+                var startlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == startinfo.location).First();
+                if (startlocation != null)
+                {
+                    LogHelper.Info($"鏌ヨ绌虹瓙鍏ュ簱鍖虹偣浣峽startinfo.location} 褰撳墠鏁伴噺={startlocation.N_CURRENT_NUM} 褰撳墠璐т綅鐘舵�={startlocation.S_LOCK_STATE}");
+                    if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                    {
+                        Location endlocation = null;
+                        //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                        for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                        {
+                            endlocation = pinggaiIn(startinfo.ProductArea[i], 3);
+                            if (endlocation != null)
+                            {
+                                var TrayCode = "";
+                                var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                for (int j = 0; j < ctnslist.Count(); j++)
+                                {
+                                    TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                }
+                                IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                break;
+                            }
+                        }
+                    }
+                    if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                    {
+                        Location endlocation = null;
+                        //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                        for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                        {
+                            endlocation = pinggaiIn(startinfo.ProductArea[i], 0);
+                            if (endlocation != null)
+                            {
+                                LogHelper.Info($"鍑嗗鐢熸垚浠诲姟");
+                                var TrayCode = "";
+                                var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                for (int j = 0; j < ctnslist.Count(); j++)
+                                {
+                                    TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                }
+                                LogHelper.Info($"鐢熸垚绌虹瓙鍏ュ簱浠诲姟");
+                                IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 绠℃帶鐡剁洊缈绘枟鏈哄叆搴撶紦瀛樹綅
+        /// </summary>
+        private static void FanDouIncontrel1()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            //鐡剁洊缈绘枟鏈哄叆搴撲笉闇�宸ュ崟
+            var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "绌�).FirstOrDefault();
+            if (startinfo != null)
+            {
+                LogHelper.Info($"鏌ヨ鍒扮┖绛愬叆搴撳尯{startinfo.location} 搴撳尯缂栫爜={JsonConvert.SerializeObject(startinfo.ProductArea)}");
+                var startlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == startinfo.location).First();
+                if (startlocation != null)
+                {
+                    LogHelper.Info($"鏌ヨ绌虹瓙鍏ュ簱鍖虹偣浣峽startinfo.location} 褰撳墠鏁伴噺={startlocation.N_CURRENT_NUM} 褰撳墠璐т綅鐘舵�={startlocation.S_LOCK_STATE}");
+                    if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                    {
+                        Location endlocation = null;
+                        //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                        for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                        {
+                            endlocation = pinggaiIn(startinfo.ProductArea[i], 3);
+                            if (endlocation != null)
+                            {
+                                var TrayCode = "";
+                                var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                for (int j = 0; j < ctnslist.Count(); j++)
+                                {
+                                    TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                }
+                                IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                break;
+                            }
+                        }
+                    }
+                    if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "鏃�)
+                    {
+                        Location endlocation = null;
+                        //鏌ユ壘搴撻噷鏈夋病鏈変笁灞傜殑鐗╂枡
+                        for (int i = 0; i < startinfo.ProductArea.Count(); i++)
+                        {
+                            endlocation = pinggaiIn(startinfo.ProductArea[i], 0);
+                            if (endlocation != null)
+                            {
+                                LogHelper.Info($"鍑嗗鐢熸垚浠诲姟");
+                                var TrayCode = "";
+                                var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1;
+                                for (int j = 0; j < ctnslist.Count(); j++)
+                                {
+                                    TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                }
+                                LogHelper.Info($"鐢熸垚绌虹瓙鍏ュ簱浠诲姟");
+                                IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍏ュ簱", TrayCode, 1, endley, "1", ctnslist.Count);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鐡剁洊闈炲嵆浜у嵆鐢�绠℃帶鍑哄簱缂撳瓨鍖�+        /// </summary>
+        private static void PingGaiN()
+        {
+            try
+            {
+                LogHelper.Info("鐡剁洊鍑哄簱绠℃帶");
+                var db = new SqlHelper<object>().GetInstance();
+                var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 4 && a.enable == 1).FirstOrDefault();
+                if (info != null)
+                {
+                    //鐡剁洊鍑哄簱缂撳瓨浣�+                    var workorder = WCSHelper.GetPGWorkOrder(info.deviceName);
+                    //闈炲嵆浜у嵆鐢ㄥ伐鍗曞搴�鍑哄簱鎿嶄綔
+                    if (workorder != null && workorder.S_WorkState.Trim() == "鎵ц涓� && workorder.S_UsingNow == "N")
+                    {
+                        //鐡剁洊鏈�闈炲嵆浜у嵆鐢�+                        var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.ItemTrayType == "绌�).FirstOrDefault();
+                        if (endinfo != null)
+                        {
+                            var endlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == endinfo.location).First();
+                            if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "鏃�)
+                            {
+                                //缁堢偣婊¤冻鏉′欢 鍒ゆ柇璧风偣
+                                for (int i = 0; i < endinfo.ProductArea.Count(); i++)
+                                {
+                                    var startlocation = pinggaiOut(endinfo.ProductArea[i]);
+                                    if (startlocation != null)
+                                    {
+                                        var TrayCode = "";
+                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                        var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                        var count = ctnslist.Count() == 5 ? 2 : 3;
+                                        var startley = ctnslist.Count() == 5 ? 2 : 1;
+                                        for (int j = 0; j < count; j++)
+                                        {
+                                            TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                        }
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍑哄簱", TrayCode, startley, 1, "1");
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"鐡剁洊鍑哄簱绠℃帶寮傚父 寮傚父淇℃伅={ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鐡剁洊闈炲嵆浜у嵆鐢�绠℃帶鍑哄簱缂撳瓨鍖�+        /// </summary>
+        private static void PingGaiN1()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 2 && a.enable == 1).FirstOrDefault();
+            if (info != null)
+            {
+                //鐡剁洊鍑哄簱缂撳瓨浣�+                var workorder = WCSHelper.GetPGWorkOrder(info.deviceName);
+                //闈炲嵆浜у嵆鐢ㄥ伐鍗曞搴�鍑哄簱鎿嶄綔
+                if (workorder != null && workorder.S_WorkState.Trim() == "鎵ц涓� && workorder.S_UsingNow == "N")
+                {
+                    //鐡剁洊鏈�闈炲嵆浜у嵆鐢�+                    var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.ItemTrayType == "绌�).FirstOrDefault();
+                    if (endinfo != null)
+                    {
+                        var endlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == endinfo.location).First();
+                        if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "鏃�)
+                        {
+                            //缁堢偣婊¤冻鏉′欢 鍒ゆ柇璧风偣
+                            for (int i = 0; i < endinfo.ProductArea.Count(); i++)
+                            {
+                                var startlocation = pinggaiOut(endinfo.ProductArea[i]);
+                                if (startlocation != null)
+                                {
+                                    var TrayCode = "";
+                                    var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                    var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                    var count = ctnslist.Count() == 5 ? 2 : 3;
+                                    var startley = ctnslist.Count() == 5 ? 2 : 1;
+                                    for (int j = 0; j < count; j++)
+                                    {
+                                        TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                    }
+                                    IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍑哄簱", TrayCode, startley, 1, "1");
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鐡剁洊缈绘枟闈炲嵆浜у嵆鐢�绠℃帶鍑哄簱缂撳瓨鍖�+        /// </summary>
+        private static void FanDouN()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 3 && a.enable == 1).FirstOrDefault();
+            if (info != null)
+            {
+                //鐡剁洊鍑哄簱缂撳瓨浣�+                var workorder = WCSHelper.GetPGWorkOrder(info.deviceName);
+                //闈炲嵆浜у嵆鐢ㄥ伐鍗曞搴�鍑哄簱鎿嶄綔
+                if (workorder != null && workorder.S_WorkState.Trim() == "鎵ц涓� && workorder.S_UsingNow == "N")
+                {
+                    //鐡剁洊鏈�闈炲嵆浜у嵆鐢�+                    var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.ItemTrayType == "婊�).FirstOrDefault();
+                    if (endinfo != null)
+                    {
+                        var endlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == endinfo.location).First();
+                        if (endlocation != null)
+                        {
+                            if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "鏃�)
+                            {
+                                //缁堢偣婊¤冻鏉′欢 鍒ゆ柇璧风偣
+                                for (int i = 0; i < endinfo.ProductArea.Count(); i++)
+                                {
+                                    var startlocation = pinggaiOut(endinfo.ProductArea[i], true);
+                                    if (startlocation != null)
+                                    {
+                                        var TrayCode = "";
+                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                        var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                        var count = ctnslist.Count() == 5 ? 2 : 3;
+                                        var startley = ctnslist.Count() == 5 ? 2 : 1;
+                                        for (int j = 0; j < count; j++)
+                                        {
+                                            TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                        }
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍑哄簱", TrayCode, startley, 1, "1");
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鐡剁洊缈绘枟闈炲嵆浜у嵆鐢�绠℃帶鍑哄簱缂撳瓨鍖�+        /// </summary>
+        private static void FanDouN1()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 6 && a.enable == 1).FirstOrDefault();
+            if (info != null)
+            {
+                //鐡剁洊鍑哄簱缂撳瓨浣�+                var workorder = WCSHelper.GetPGWorkOrder(info.deviceName);
+                //闈炲嵆浜у嵆鐢ㄥ伐鍗曞搴�鍑哄簱鎿嶄綔
+                if (workorder != null && workorder.S_WorkState.Trim() == "鎵ц涓� && workorder.S_UsingNow == "N")
+                {
+                    //鐡剁洊鏈�闈炲嵆浜у嵆鐢�+                    var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "婊�).FirstOrDefault();
+                    if (endinfo != null)
+                    {
+                        var endlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == endinfo.location).First();
+                        if (endlocation != null)
+                        {
+                            if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "鏃�)
+                            {
+                                //缁堢偣婊¤冻鏉′欢 鍒ゆ柇璧风偣
+                                for (int i = 0; i < endinfo.ProductArea.Count(); i++)
+                                {
+                                    var startlocation = pinggaiOut(endinfo.ProductArea[i], true);
+                                    if (startlocation != null)
+                                    {
+                                        var TrayCode = "";
+                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                        var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList();
+                                        var count = ctnslist.Count() == 5 ? 2 : 3;
+                                        var startley = ctnslist.Count() == 5 ? 2 : 1;
+                                        for (int j = 0; j < count; j++)
+                                        {
+                                            TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ",";
+                                        }
+                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍑哄簱", TrayCode, startley, 1, "1");
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鐡剁洊绌虹瓙-鍑哄簱缂撳瓨鍖虹殑杩炴帴
+        /// </summary>
+        private static void PingGaikkcontrel()
+        {
+            LogHelper.Info("鐡剁洊绌虹瓙鍖虹鎺�);
+            var db = new SqlHelper<object>().GetInstance();
+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 4 && a.enable == 1).FirstOrDefault();
+            if (info != null)
+            {
+                //鍑哄簱缂撳瓨鍖哄搴旂紦瀛樺尯 缂撳瓨鍖哄鏋滄湁绌轰綅缃氨浠庡嚭搴撶紦瀛樺尯鎼繍
+                LogHelper.Info($"鏌ヨ绌虹瓙鍖烘槸鍚︽湁绌鸿揣浣�);
+                var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == info.deviceName && a.ItemTrayType == "绌�).FirstOrDefault();
+                if (Areainfo != null)
+                {
+                    LogHelper.Info($"鏌ヨ绌虹瓙缂撳瓨浣�搴撳尯缂栫爜={Areainfo.ProductArea[0]}");
+                    string msg = Areainfo.ProductArea[0];
+                    var endlocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                    if (endlocation != null)
+                    {
+                        LogHelper.Info($"鏌ヨ鍒扮┖绛愬尯绌鸿揣浣�璐т綅缂栫爜={endlocation.S_LOC_CODE}");
+                        var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.ItemTrayType == "绌�).FirstOrDefault();
+                        if (locationinfo != null)
+                        {
+                            LogHelper.Info($"鏌ヨ鍑哄簱缂撳瓨浣嶆槸鍚︽湁璐�璐т綅缂栫爜={locationinfo.location}");
+                            var startlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == locationinfo.location).First();
+                            if (startlocation.S_LOCK_STATE.Trim() == "鏃� && startlocation.N_CURRENT_NUM > 0)
+                            {
+                                LogHelper.Info($"鏌ヨ鍒板嚭搴撶紦瀛樹綅 璐т綅缂栫爜={startlocation} 鏁伴噺={startlocation.N_CURRENT_NUM}");
+                                var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                if (ctnsinfo.Count() > 0)
+                                {
+                                    var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First();
+                                    LogHelper.Info($"鍒涘缓绌虹瓙缂撳瓨鍖鸿ˉ绌轰换鍔�鎵樼洏鍙�{ctns.S_CNTR_CODE}");
+                                    IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍏ョ紦瀛樺尯", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1");
+                                }
+                            }
+                        }
+                        else LogHelper.Info($"鐡剁洊鍑哄簱缂撳瓨鍖洪厤缃湭閰嶇疆");
+                    }
+                    else LogHelper.Info($"绌虹瓙缂撳瓨鍖烘湭鎵惧埌绌鸿揣浣�);
+                }
+                else LogHelper.Info($"绌虹瓙缂撳瓨鍖烘湭閰嶇疆");
+            }
+        }
+
+        /// <summary>
+        /// 鐡跺澂绌虹瓙-鍑哄簱缂撳瓨鍖虹殑杩炴帴
+        /// </summary>
+        private static void PingGaikkcontrel1()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 2 && a.enable == 1).ToList();
+            if (info.Count() > 0)
+            {
+                info.ForEach(b =>
+                {
+                    var workorder = WCSHelper.GetPGWorkOrder(b.deviceName);
+                    if (workorder != null)
+                    {
+                        //鍑哄簱缂撳瓨鍖哄搴旂紦瀛樺尯 缂撳瓨鍖哄鏋滄湁绌轰綅缃氨浠庡嚭搴撶紦瀛樺尯鎼繍
+                        LogHelper.Info($"鏌ヨ绌虹瓙鍖烘槸鍚︽湁绌鸿揣浣�);
+                        var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workorder.S_LinkLineNo && a.ItemTrayType == "绌�).FirstOrDefault();
+                        if (Areainfo != null)
+                        {
+                            if (Areainfo.ProductArea.Count() > 0)
+                            {
+                                for (int i = 0; i < Areainfo.ProductArea.Count(); i++)
+                                {
+                                    LogHelper.Info($"鏌ヨ绌虹瓙缂撳瓨浣�搴撳尯缂栫爜={Areainfo.ProductArea[i]}");
+                                    string msg = Areainfo.ProductArea[i];
+                                    var endlocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                                    if (endlocation != null)
+                                    {
+                                        LogHelper.Info($"鏌ヨ鍒扮┖绛愬尯绌鸿揣浣�璐т綅缂栫爜={endlocation.S_LOC_CODE}");
+                                        var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.ItemTrayType == "绌�).FirstOrDefault();
+                                        if (locationinfo != null)
+                                        {
+                                            LogHelper.Info($"鏌ヨ鍑哄簱缂撳瓨浣嶆槸鍚︽湁璐�璐т綅缂栫爜={locationinfo.location}");
+                                            var startarea = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locationinfo.location).ToList();
+                                            foreach (var item in startarea)
+                                            {
+                                                var startlocation = item;
+                                                if (startlocation.S_LOCK_STATE.Trim() == "鏃� && startlocation.N_CURRENT_NUM > 0)
+                                                {
+                                                    LogHelper.Info($"鏌ヨ鍒板嚭搴撶紦瀛樹綅 璐т綅缂栫爜={startlocation} 鏁伴噺={startlocation.N_CURRENT_NUM}");
+                                                    var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                                    if (ctnsinfo.Count() > 0)
+                                                    {
+                                                        var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First();
+                                                        LogHelper.Info($"鍒涘缓绌虹瓙缂撳瓨鍖鸿ˉ绌轰换鍔�鎵樼洏鍙�{ctns.S_CNTR_CODE}");
+                                                        IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "绌虹瓙鍏ョ紦瀛樺尯", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1");
+                                                        break;
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        else LogHelper.Info($"鐡跺澂鍑哄簱缂撳瓨鍖洪厤缃湭閰嶇疆");
+                                    }
+                                    else LogHelper.Info($"绌虹瓙缂撳瓨鍖烘湭鎵惧埌绌鸿揣浣�);
+                                }
+
+                            }
+                            else LogHelper.Info("璇锋鏌ョ┖绛愮紦瀛樺尯搴撳尯缂栧彿鏄惁閰嶇疆");
+                        }
+                        else LogHelper.Info($"绌虹瓙缂撳瓨鍖烘湭閰嶇疆");
+                    }
+
+                });
+            }
+        }
+
+        /// <summary>
+        /// 缈绘枟婊$瓙-鍑哄簱缂撳瓨鍖虹殑杩炴帴
+        /// </summary>
+        private static void FanDoukkcontrel()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 3 && a.enable == 1).FirstOrDefault();
+            if (info != null)
+            {
+                //鍑哄簱缂撳瓨鍖哄搴旂紦瀛樺尯 缂撳瓨鍖哄鏋滄湁绌轰綅缃氨浠庡嚭搴撶紦瀛樺尯鎼繍
+                LogHelper.Info($"鏌ヨ婊$瓙鍖烘槸鍚︽湁绌鸿揣浣�);
+                var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == info.deviceName && a.ItemTrayType == "婊�).FirstOrDefault();
+                if (Areainfo != null)
+                {
+                    LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨浣�搴撳尯缂栫爜={Areainfo.ProductArea[0]}");
+                    string msg = Areainfo.ProductArea[0];
+                    var endlocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                    if (endlocation != null)
+                    {
+                        LogHelper.Info($"鏌ヨ鍒版弧绛愬尯绌鸿揣浣�璐т綅缂栫爜={endlocation.S_LOC_CODE}");
+                        var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.ItemTrayType == "婊�).FirstOrDefault();
+                        if (locationinfo != null)
+                        {
+                            LogHelper.Info($"鏌ヨ鍑哄簱缂撳瓨浣嶆槸鍚︽湁璐�璐т綅缂栫爜={locationinfo.location}");
+                            var startlocation = db.Queryable<Location>().Where(a => a.S_LOC_CODE == locationinfo.location).First();
+                            if (startlocation.S_LOCK_STATE.Trim() == "鏃� && startlocation.N_CURRENT_NUM > 0)
+                            {
+                                LogHelper.Info($"鏌ヨ鍒板嚭搴撶紦瀛樹綅 璐т綅缂栫爜={startlocation} 鏁伴噺={startlocation.N_CURRENT_NUM}");
+                                var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                if (ctnsinfo.Count() > 0)
+                                {
+                                    var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First();
+                                    LogHelper.Info($"鍒涘缓婊$瓙缂撳瓨鍖鸿ˉ婊′换鍔�鎵樼洏鍙�{ctns.S_CNTR_CODE}");
+                                    IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍏ョ紦瀛樺尯", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1");
+                                }
+                            }
+                        }
+                        else LogHelper.Info($"鐡剁洊缈绘枟鏈哄嚭搴撶紦瀛樺尯閰嶇疆鏈厤缃�);
+                    }
+                    else LogHelper.Info($"婊$瓙缂撳瓨鍖烘湭鎵惧埌绌鸿揣浣�);
+                }
+                else LogHelper.Info($"婊$瓙缂撳瓨鍖烘湭閰嶇疆");
+            }
+        }
+
+        /// <summary>
+        /// 缈绘枟婊$瓙-鍑哄簱缂撳瓨鍖虹殑杩炴帴
+        /// </summary>
+        private static void FanDoukkcontrel1()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 6 && a.enable == 1).ToList();
+            if (info.Count() > 0)
+            {
+                info.ForEach(b =>
+                {
+                    #region 鏇存柊鍓嶅悓鐡剁洊
+                    var workorder = WCSHelper.GetPGWorkOrder(b.deviceName);
+                    if (workorder != null)
+                    {
+                        //鍑哄簱缂撳瓨鍖哄搴旂紦瀛樺尯 缂撳瓨鍖哄鏋滄湁绌轰綅缃氨浠庡嚭搴撶紦瀛樺尯鎼繍
+                        LogHelper.Info($"鏌ヨ婊$瓙鍖烘槸鍚︽湁绌鸿揣浣�);
+                        var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workorder.S_LinkLineNo && a.ItemTrayType == "婊�).FirstOrDefault();
+                        if (Areainfo != null)
+                        {
+                            if (Areainfo.ProductArea.Count() > 0)
+                            {
+                                for (int i = 0; i < Areainfo.ProductArea.Count(); i++)
+                                {
+                                    LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨浣�搴撳尯缂栫爜={Areainfo.ProductArea[i]}");
+                                    string msg = Areainfo.ProductArea[i];
+                                    var endlocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                                    if (endlocation != null)
+                                    {
+                                        LogHelper.Info($"鏌ヨ鍒版弧绛愬尯绌鸿揣浣�璐т綅缂栫爜={endlocation.S_LOC_CODE}");
+                                        var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "婊�).FirstOrDefault();
+                                        if (locationinfo != null)
+                                        {
+                                            LogHelper.Info($"鏌ヨ鍑哄簱缂撳瓨浣嶆槸鍚︽湁璐�璐т綅缂栫爜={locationinfo.location}");
+                                            var startarea = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locationinfo.location).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList();
+                                            foreach (var item in startarea)
+                                            {
+                                                var startlocation = item;
+                                                if (startlocation.S_LOCK_STATE.Trim() == "鏃� && startlocation.N_CURRENT_NUM > 0)
+                                                {
+                                                    LogHelper.Info($"鏌ヨ鍒板嚭搴撶紦瀛樹綅 璐т綅缂栫爜={startlocation} 鏁伴噺={startlocation.N_CURRENT_NUM} 鐗╂枡缂栫爜={startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE}");
+                                                    if (workorder.S_ItemCode == startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE)
+                                                    {
+                                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                                                        if (ctnsinfo.Count() > 0)
+                                                        {
+                                                            var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First();
+                                                            LogHelper.Info($"鍒涘缓婊$瓙缂撳瓨鍖鸿ˉ婊′换鍔�鎵樼洏鍙�{ctns.S_CNTR_CODE}");
+                                                            IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍏ョ紦瀛樺尯", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1");
+                                                            break;
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        else LogHelper.Info($"鐡剁洊缈绘枟鏈哄嚭搴撶紦瀛樺尯閰嶇疆鏈厤缃�);
+                                    }
+                                    else LogHelper.Info($"婊$瓙缂撳瓨鍖烘湭鎵惧埌绌鸿揣浣�);
+                                }
+                            }
+                            else LogHelper.Info($"搴撳尯缂栫爜寮傚父璇锋鏌ラ厤缃�);
+                        }
+                        else LogHelper.Info($"婊$瓙缂撳瓨鍖烘湭閰嶇疆");
+                    }
+                    #endregion
+
+                    #region 鏇存柊鍚�+                    //var workorder = WCSHelper.GetWorkOrder1(b.deviceName);
+                    //if (workorder.Count>0)
+                    //{
+                    //    foreach (var work in workorder)
+                    //    {
+                    //        //鍑哄簱缂撳瓨鍖哄搴旂紦瀛樺尯 缂撳瓨鍖哄鏋滄湁绌轰綅缃氨浠庡嚭搴撶紦瀛樺尯鎼繍
+                    //        LogHelper.Info($"鏌ヨ婊$瓙鍖烘槸鍚︽湁绌鸿揣浣�);
+                    //        var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == work.S_LinkLineNO && a.ItemTrayType == "婊�).FirstOrDefault();
+                    //        if (Areainfo != null)
+                    //        {
+                    //            if (Areainfo.ProductArea.Count() > 0)
+                    //            {
+                    //                for (int i = 0; i < Areainfo.ProductArea.Count(); i++)
+                    //                {
+                    //                    LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨浣�搴撳尯缂栫爜={Areainfo.ProductArea[i]}");
+                    //                    string msg = Areainfo.ProductArea[i];
+                    //                    var endlocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                    //                    if (endlocation != null)
+                    //                    {
+                    //                        LogHelper.Info($"鏌ヨ鍒版弧绛愬尯绌鸿揣浣�璐т綅缂栫爜={endlocation.S_LOC_CODE}");
+                    //                        var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "婊�).FirstOrDefault();
+                    //                        if (locationinfo != null)
+                    //                        {
+                    //                            LogHelper.Info($"鏌ヨ鍑哄簱缂撳瓨浣嶆槸鍚︽湁璐�璐т綅缂栫爜={locationinfo.location}");
+                    //                            var startarea = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locationinfo.location).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList();
+                    //                            foreach (var item in startarea)
+                    //                            {
+                    //                                var startlocation = item;
+                    //                                if (startlocation.S_LOCK_STATE.Trim() == "鏃� && startlocation.N_CURRENT_NUM > 0)
+                    //                                {
+                    //                                    LogHelper.Info($"鏌ヨ鍒板嚭搴撶紦瀛樹綅 璐т綅缂栫爜={startlocation} 鏁伴噺={startlocation.N_CURRENT_NUM} 鐗╂枡缂栫爜={startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE}");
+                    //                                    if (work.S_ItemCode == startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE)
+                    //                                    {
+                    //                                        var ctnsinfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList();
+                    //                                        if (ctnsinfo.Count() > 0)
+                    //                                        {
+                    //                                            var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First();
+                    //                                            LogHelper.Info($"鍒涘缓婊$瓙缂撳瓨鍖鸿ˉ婊′换鍔�鎵樼洏鍙�{ctns.S_CNTR_CODE}");
+                    //                                            IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "婊$瓙鍏ョ紦瀛樺尯", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1");
+                    //                                            break;
+                    //                                        }
+                    //                                    }
+                    //                                }
+                    //                            }
+                    //                        }
+                    //                        else LogHelper.Info($"鐡剁洊缈绘枟鏈哄嚭搴撶紦瀛樺尯閰嶇疆鏈厤缃�);
+                    //                    }
+                    //                    else LogHelper.Info($"婊$瓙缂撳瓨鍖烘湭鎵惧埌绌鸿揣浣�);
+                    //                }
+                    //            }
+                    //            else LogHelper.Info($"搴撳尯缂栫爜寮傚父璇锋鏌ラ厤缃�);
+                    //        }
+                    //        else LogHelper.Info($"婊$瓙缂撳瓨鍖烘湭閰嶇疆");
+                    //    }
+                    //
+                    //}
+                    #endregion
+
+                });
+            }
+        }
+
+        private static Location pinggaiIn(string area, int i, bool batchbol = false, string batch = "")
+        {
+            LogHelper.Info($"鐡剁洊鍏ュ簱绠楁硶寮� 鏁伴噺={i} 搴撳尯缂栫爜={area} 鎵规鍙�{batch}");
+            Location endlocation = null;
+            var db = new SqlHelper<object>().GetInstance();
+
+
+            if (i == 3)
+            {
+                LogHelper.Info("鏌ユ壘浜屽眰璐т綅");
+                var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM == i && a.S_AREA_CODE == area).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+                for (int j = list.Count() - 1; j >= 0; j--)
+                {
+                    string rowno = list[j].N_ROW;
+                    var rowinfo = db.Queryable<Location>().Where(a => a.N_ROW == rowno && a.S_LOCK_STATE != "鏃�).First();
+                    if (rowinfo != null)
+                    {
+                        list.Remove(list[j]);
+                    }
+                    else
+                    {
+                        if (batchbol)
+                        {
+                            var batchinfo = db.Queryable<Location>().Where(a => a.N_ROW == rowno && a.N_CURRENT_NUM > 0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).First();
+                            if (batchinfo != null)
+                            {
+                                LogHelper.Info($"鐗╂枡鎵规={batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO}");
+                                if (batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() != batch.Trim())
+                                {
+                                    list.Remove(list[j]);
+                                }
+                            }
+                        }
+                    }
+                }
+                if (list.Count() > 0)
+                {
+                    for (int k = 0; k < list.Count; k++)
+                    {
+                        if (list[k].N_CURRENT_NUM == i)
+                        {
+                            endlocation = list[k];
+                            break;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                LogHelper.Info("鏌ユ壘涓�眰璐т綅");
+                var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM == i && a.S_AREA_CODE == area).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+                LogHelper.Info($"鏌ユ壘婊¤冻鏁伴噺鐨勮揣浣�璐т綅鏁伴噺涓簕list.Count()}");
+                for (int j = list.Count() - 1; j >= 0; j--)
+                {
+                    string rowno = list[j].N_ROW;
+                    LogHelper.Info($"鏌ユ壘鎺抺rowno} 璐т綅鐘舵�");
+                    var rowinfo = db.Queryable<Location>().Where(a => a.N_ROW == rowno && a.S_LOCK_STATE != "鏃�).First();
+                    if (rowinfo != null)
+                    {
+                        LogHelper.Info($"鎺抺rowno}鐘舵�{rowinfo.S_LOCK_STATE} 鍓旈櫎璇ユ帓");
+                        list.Remove(list[j]);
+                    }
+                    else
+                    {
+                        if (batchbol)
+                        {
+                            LogHelper.Info($"寮�惎鎵规姣斿");
+                            var batchinfo = db.Queryable<Location>().Where(a => a.N_ROW == rowno && a.N_CURRENT_NUM > 0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).First();
+                            if (batchinfo != null)
+                            {
+                                LogHelper.Info($"鐗╂枡鎵规={batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO}");
+                                if (batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() != batch.Trim())
+                                {
+                                    list.Remove(list[j]);
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info($"鎺掑彿{rowno} 涓虹┖鎺�);
+                            }
+                        }
+                    }
+                }
+                if (list.Count() > 0)
+                {
+                    for (int k = 0; k < list.Count(); k++)
+                    {
+                        LogHelper.Info($"寮�鍒ゆ柇璐т綅鏄惁涓烘渶灏忓垪 璐т綅缂栫爜={list[k].S_LOC_CODE} 鍒�{list[k].N_COL}");
+                        if (list[k].N_COL == 1)
+                        {
+                            endlocation = list[k];
+                            break;
+                        }
+                        else
+                        {
+                            //鏌ユ壘鍓嶄竴鍒楄揣浣嶆槸鍚︿负婊�+                            string Rowno = list[k].N_ROW;
+                            int colno = list[k].N_COL - 1;
+                            var info = db.Queryable<Location>().Where(a => a.N_ROW == Rowno && a.N_COL == colno).First();
+                            if (info != null)
+                            {
+                                if (info.N_CAPACITY == info.N_CURRENT_NUM)
+                                {
+                                    endlocation = list[k];
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            LogHelper.Info($"鐡剁洊鍖哄叆搴撶畻娉曠粨鏉�缁堢偣璐т綅缁撴灉 {endlocation != null}");
+            return endlocation;
+        }
+
+        private static Location pinggaiOut(string area, bool res = false)
+        {
+            Location location = null;
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+            for (int j = list.Count - 1; j >= 0; j--)
+            {
+                var rowno = list[j].N_ROW;
+                var rowinfo = db.Queryable<Location>().Where(a => a.N_ROW == rowno && a.S_LOCK_STATE != "鏃�).First();
+                if (rowinfo != null)
+                {
+                    list.Remove(list[j]);
+                }
+            }
+            if (list.Count() > 0)
+            {
+                if (res)
+                {
+                    list = list.OrderBy(a => a.LocCntrRel.CntrItemRel.S_BATCH_NO).ToList();
+                }
+                location = list[0];
+            }
+            return location;
+        }
+
+
+        /// <summary>
+        /// 浜哄伐绉诲簱
+        /// </summary>
+        public static void AnalysisIntraoCular()
+        {
+            var WorkInfo = WCSHelper.GetDaMingShanAnalysisOrderWork("浜哄伐绉诲簱");
+            if (WorkInfo != null)
+            {
+                AnalysisCularAndStock(WorkInfo);
+            }
+        }
+
+
+
+
+        /// <summary>
+        /// 浜哄伐绉诲簱
+        /// </summary>
+        /// <param name="WorkInfo">宸ュ崟淇℃伅</param>
+        /// <param name="Analysis">宸ュ崟澶勭悊绫诲瀷锛�true-浜哄伐-澶囪揣-绠″埗澶勭悊  false-缂犺啘澶勭悊</param>
+        private static void AnalysisCularAndStock(List<WorkOrder> WorkInfo, bool Analysis = true)
+        {
+            var db = new SqlHelper<object>().GetInstance();//ChunAnAnalysisMoveLib
+            WorkInfo.ForEach(it =>
+            {
+                LogHelper.Info($"绉诲簱浠诲姟澶勭悊锛氬伐鍗曞彿锛歿it.S_WorkNo.Trim()}锛屽伐鍗曠被鍨嬶細{it.S_ORDER_TYPE.Trim()}", "Monitor");
+                //Console.WriteLine($"绉诲簱浠诲姟澶勭悊锛氬伐鍗曞彿锛歿it.S_WorkNo.Trim()}锛屽伐鍗曠被鍨嬶細{it.S_ORDER_TYPE.Trim()}");
+                //璧风偣搴撳尯 缁堢偣搴撳尯 璧风偣搴撲綅 缁堢偣搴撲綅
+                //浜哄伐涓嬪伐鍗� 璧风偣搴撲綅 鍙兘瀛樺湪澶氫釜锛岀敤鑻辨枃閫楀彿闅斿紑锛涚粓鐐瑰簱浣�鍚�璧风偣搴撲綅
+                //浣滀负 璧风偣搴撲綅 濡傛灉涓虹┖锛岃В閿佸簱浣嶏紝涓斾笉鍦ㄤ綔涓鸿捣鐐瑰簱浣嶄娇鐢紱缁堢偣搴撲綅 婊�鍒欎笉鍦ㄨ浆杩�+                // SQL_StartArea S_StartLoca SQL_EndArea S_EndLoca 
+                string startNo = ""; string endNo = ""; string startArea = ""; string endArea = "";
+                string ItemCode = string.IsNullOrEmpty(it.S_ItemCode) ? "" : it.S_ItemCode.Trim();
+                string BatchNo = string.IsNullOrEmpty(it.S_BatchNo) ? "" : it.S_BatchNo.Trim();
+                string ItemLayer = string.IsNullOrEmpty(it.S_ItemLayer) ? "" : it.S_ItemLayer.Trim();
+                List<string> startList = it.S_StartLoca.Trim().Split(',').ToList();
+                List<string> endList = it.S_EndLoca.Trim().Split(',').ToList();
+                if (it.S_YiKuNum > 0)
+                {
+                    startList.ForEach(a =>
+                    {
+                        if (!string.IsNullOrEmpty(a))
+                        {
+                            var startlocationlist = db.Queryable<Location>().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "鏃� && info.S_LOCK_STATE.Trim() != "鎶ュ簾").ToList();
+                            if (startlocationlist.Count() == 0)
+                            {
+                                //鏌ヨ鏈夐攣鐨勫簱浣�濡傛灉娌℃湁锛氶攣瀹氭墍鏈夊嚭搴撹揣浣�+                                var liststart = db.Queryable<Location>().Where(b => b.N_ROW.Trim() == a).ToList();
+                                foreach (var item in liststart)
+                                {
+                                    if (item.S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                    {
+                                        item.S_LOCK_STATE = "绉诲簱閿�;
+                                        db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                                    }
+                                }
+                                TaskProcess.AreaRowLockState(a);
+                            }
+                            //鏌ヨ鍒�鍙嚭搴撶殑 璧风偣搴撲綅锛屽垽鏂綋鍓嶈捣鐐瑰簱浣嶆槸鍚﹀厑璁哥敓鎴愪换鍔�+                            //浠诲姟绫诲瀷  搴撳尯缂栫爜+鎺掑彿+绉诲簱绫诲瀷------璧风偣搴撲綅 浠诲姟 鍧囧彇璐у畬鎴�+
+                            //姝e紡鐜 鎺掑彿涓篠TRING鍨嬶紝鍞竴锛屼汉宸ユ棤闇�紶杈撳簱鍖虹紪鐮�+                            //var startAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == int.Parse(a)).OrderBy(b => b.N_COL).Take(1).First();
+
+                            //娴嬭瘯鐜 鎺掑彿涓篒NT鍨嬶紝瀛樺湪閲嶅鎺掑彿锛屽洜姝ゅ姞涓�搴撳尯缂栫爜 鐢ㄤ綔鍖哄垎
+                            var yikulock = db.Queryable<Location>().Where(start => start.N_ROW.Trim() == a && start.S_LOCK_STATE.Trim() == "绉诲簱閿�).First();
+                            if (yikulock != null)
+                            {
+                                var startAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == a && b.N_CURRENT_NUM > 0).OrderByDescending(b => b.N_COL).Take(1).First();
+                                if (startAreaInfo != null && startAreaInfo.N_CURRENT_NUM >= 1)
+                                {
+                                    //YiKuUnLockRow(db, a, startAreaInfo.S_AREA_CODE.Trim(), false);
+                                    //鍒ゆ柇褰撳墠搴撲綅鏄惁鍙敤    鏍规嵁搴撳尯鑾峰彇姝ゅ簱鍖�鎵�湁鎵ц涓殑浠诲姟
+                                    //濡傛灉 鏈夋墽琛屼腑鐨�浠诲姟锛屼笖鏈彇璐у畬鎴愶紝鍒欎笉鍙敤锛涘弽涔嬶紝鏃犳墽琛屼腑浠诲姟 鎴�浠诲姟宸插彇璐у畬鎴�鍗冲彲浣跨敤
+                                    if (IntensiveArea.TaskTakeAreaOver(startAreaInfo.S_AREA_CODE.Trim(), a, true, Analysis))
+                                    {
+                                        startNo = a;
+                                        startArea = startAreaInfo.S_AREA_CODE.Trim();
+                                    }
+                                }
+                            }
+                        }
+                    });
+                    if (!string.IsNullOrEmpty(startNo))
+                    {
+                        endList.ForEach(a =>
+                        {
+                            if (!string.IsNullOrEmpty(a))
+                            {
+                                if (ItemBool(startNo, a))
+                                {
+                                    var startlocationlist = db.Queryable<Location>().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "鏃� && info.S_LOCK_STATE.Trim() != "鎶ュ簾").ToList();
+                                    if (startlocationlist.Count() == 0)
+                                    {
+                                        //鏌ヨ鏈夐攣鐨勫簱浣�濡傛灉娌℃湁锛氶攣瀹氭墍鏈夊嚭搴撹揣浣�+                                        var liststart = db.Queryable<Location>().Where(b => b.N_ROW.Trim() == a).ToList();
+                                        foreach (var item in liststart)
+                                        {
+                                            if (item.S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                            {
+                                                item.S_LOCK_STATE = "绉诲簱閿�;
+                                                db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                                            }
+                                        }
+                                        TaskProcess.AreaRowLockState(a);
+                                    }
+                                    //鑾峰彇鍙敤鐨�缁堢偣搴撲綅 锛�.缁堢偣搴撲綅 涓嶈兘鏈変换鍔℃墽琛屼腑  2.鏍规嵁缁堢偣搴撳尯 鏌ヨ 鍑烘墍鏈夊睘浜庢 搴撲綅鐨勪换鍔�+                                    var endAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == a && b.N_CURRENT_NUM < b.N_CAPACITY).PartitionBy(b => b.S_AREA_CODE).OrderByDescending(b => b.N_COL).Take(1).ToList();
+                                    foreach (var item in endAreaInfo)
+                                    {
+                                        if (item != null && item.N_CURRENT_NUM < item.N_CAPACITY)
+                                        {
+                                            var StartCntrType = db.Queryable<ItemArea>().Where(b => b.S_AREA_CODE == startArea).First();
+                                            var EndCntrType = db.Queryable<ItemArea>().Where(b => b.S_AREA_CODE == item.S_AREA_CODE).First();
+                                            LogHelper.Info($"璧风偣搴撳尯{startArea} 鎺抺startNo} 鏉垮瀷={StartCntrType.S_TRAY_TYPE}");
+                                            LogHelper.Info($"缁堢偣搴撳尯{item.S_AREA_CODE.Trim()} 鎺抺a} 鏉垮瀷={EndCntrType.S_TRAY_TYPE}");
+
+                                            if (StartCntrType.S_TRAY_TYPE == EndCntrType.S_TRAY_TYPE)
+                                            {
+                                                LogHelper.Info($"鏉垮瀷鍖归厤");
+                                                //YiKuUnLockRow(db, a, endAreaInfo.S_AREA_CODE.Trim(), false);
+                                                if (IntensiveArea.TaskTakeAreaOver(item.S_AREA_CODE.Trim(), a, false))
+                                                {
+                                                    endNo = a;
+                                                    endArea = item.S_AREA_CODE.Trim();
+                                                    break;
+                                                }
+                                            }
+                                            else
+                                            {
+                                                LogHelper.Info($"鏉垮瀷涓嶅尮閰�);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        });
+
+                    }
+                    if (Analysis)
+                    {
+                        if (!string.IsNullOrEmpty(startNo) && !string.IsNullOrEmpty(endNo))
+                        {
+                            //string taskType = it.S_ORDER_TYPE.Trim() + ":" + startNo + "-" + endNo;
+                            IntensiveArea.DaMingShanYiKuTask(startArea, endArea, startNo, endNo, "鎴愬搧绉诲簱", ItemCode, BatchNo, ItemLayer, it.S_WorkNo.Trim());
+                        }
+                    }
+                }
+
+                //瑙i攣骞跺畬鎴愬伐鍗�+                CompleteAndUnLockWork(it, db, startList, endList);
+            });
+        }
+
+
+
+        private static bool ItemBool(string startRow, string endRow)
+        {
+            var result = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var startitem = db.Queryable<Location>().Where(a => a.N_ROW == startRow && a.N_CURRENT_NUM > 0).First();
+            var enditem = db.Queryable<Location>().Where(a => a.N_ROW == endRow && a.N_CURRENT_NUM > 0).First();
+
+            if (enditem == null)
+            {
+                return true;
+            }
+            if (startitem != null && enditem != null)
+            {
+                var starttray = db.Queryable<ItemArea>().Where(a => a.S_AREA_CODE == startitem.S_AREA_CODE).First();
+                var endtray = db.Queryable<ItemArea>().Where(a => a.S_AREA_CODE == enditem.S_AREA_CODE).First();
+
+                if (starttray.S_TRAY_TYPE == endtray.S_TRAY_TYPE)
+                {
+                    result = true;
+                }
+                else
+                {
+                    LogHelper.Info($"璧风偣鎺抺startRow} 璐т綅{startitem.S_LOC_CODE} 涓�缁堢偣鎺抺endRow} 璐т綅{enditem.S_LOC_CODE} 鏉垮瀷涓嶇");
+                }
+            }
+            else
+            {
+                LogHelper.Info($"璧风偣鎺抺startRow} 鏌ヨ涓嶅埌褰撳墠鏁伴噺涓嶄负0鐨勮揣浣�);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 澶囪揣绉诲簱
+        /// </summary>
+        /// <param name="WorkInfo"></param>
+        /// <param name="Analysis"></param>
+        private static void AnalysisCularAndStock1(List<WorkOrder> WorkInfo, bool Analysis = true)
+        {
+            var db = new SqlHelper<object>().GetInstance();//ChunAnAnalysisMoveLib
+            WorkInfo.ForEach(it =>
+            {
+                LogHelper.Info($"绉诲簱浠诲姟澶勭悊锛氬伐鍗曞彿锛歿it.S_WorkNo.Trim()}锛屽伐鍗曠被鍨嬶細{it.S_ORDER_TYPE.Trim()}", "Monitor");
+                //Console.WriteLine($"绉诲簱浠诲姟澶勭悊锛氬伐鍗曞彿锛歿it.S_WorkNo.Trim()}锛屽伐鍗曠被鍨嬶細{it.S_ORDER_TYPE.Trim()}");
+                //璧风偣搴撳尯 缁堢偣搴撳尯 璧风偣搴撲綅 缁堢偣搴撲綅
+                //浜哄伐涓嬪伐鍗� 璧风偣搴撲綅 鍙兘瀛樺湪澶氫釜锛岀敤鑻辨枃閫楀彿闅斿紑锛涚粓鐐瑰簱浣�鍚�璧风偣搴撲綅
+                //浣滀负 璧风偣搴撲綅 濡傛灉涓虹┖锛岃В閿佸簱浣嶏紝涓斾笉鍦ㄤ綔涓鸿捣鐐瑰簱浣嶄娇鐢紱缁堢偣搴撲綅 婊�鍒欎笉鍦ㄨ浆杩�+                // SQL_StartArea S_StartLoca SQL_EndArea S_EndLoca 
+                string startNo = ""; string endNo = ""; string startArea = ""; string endArea = "";
+                List<string> startList = new List<string>(it.S_StartLoca.Trim().Split(','));
+                List<string> endList = new List<string>(it.S_EndLoca.Trim().Split(','));
+                if (it.S_YiKuNum > 0)
+                {
+                    startList.ForEach(a =>
+                    {
+                        if (!string.IsNullOrEmpty(a))
+                        {
+                            var startlocationlist = db.Queryable<Location>().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "鏃� && info.S_LOCK_STATE.Trim() != "鎶ュ簾").ToList();
+                            if (startlocationlist.Count() == 0)
+                            {
+                                //鏌ヨ鏈夐攣鐨勫簱浣�濡傛灉娌℃湁锛氶攣瀹氭墍鏈夊嚭搴撹揣浣�+                                var liststart = db.Queryable<Location>().Where(b => b.N_ROW.Trim() == a).ToList();
+                                foreach (var item in liststart)
+                                {
+                                    if (item.N_CURRENT_NUM > 0 && item.S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                    {
+                                        item.S_LOCK_STATE = "绉诲簱閿�;
+                                        db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                                    }
+                                }
+                                TaskProcess.AreaRowLockState(a);
+                            }
+                            //鏌ヨ鍒�鍙嚭搴撶殑 璧风偣搴撲綅锛屽垽鏂綋鍓嶈捣鐐瑰簱浣嶆槸鍚﹀厑璁哥敓鎴愪换鍔�+                            //浠诲姟绫诲瀷  搴撳尯缂栫爜+鎺掑彿+绉诲簱绫诲瀷------璧风偣搴撲綅 浠诲姟 鍧囧彇璐у畬鎴�+
+                            //姝e紡鐜 鎺掑彿涓篠TRING鍨嬶紝鍞竴锛屼汉宸ユ棤闇�紶杈撳簱鍖虹紪鐮�+                            //var startAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == int.Parse(a)).OrderBy(b => b.N_COL).Take(1).First();
+
+                            //娴嬭瘯鐜 鎺掑彿涓篒NT鍨嬶紝瀛樺湪閲嶅鎺掑彿锛屽洜姝ゅ姞涓�搴撳尯缂栫爜 鐢ㄤ綔鍖哄垎
+                            var yikulock = db.Queryable<Location>().Where(start => start.N_ROW.Trim() == a && start.S_LOCK_STATE.Trim() == "绉诲簱閿�).First();
+                            if (yikulock != null)
+                            {
+                                var startAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == a && b.N_CURRENT_NUM > 0).OrderByDescending(b => b.N_COL).Take(1).First();
+                                if (startAreaInfo != null && startAreaInfo.N_CURRENT_NUM >= 1)
+                                {
+                                    //YiKuUnLockRow(db, a, startAreaInfo.S_AREA_CODE.Trim(), false);
+                                    //鍒ゆ柇褰撳墠搴撲綅鏄惁鍙敤    鏍规嵁搴撳尯鑾峰彇姝ゅ簱鍖�鎵�湁鎵ц涓殑浠诲姟
+                                    //濡傛灉 鏈夋墽琛屼腑鐨�浠诲姟锛屼笖鏈彇璐у畬鎴愶紝鍒欎笉鍙敤锛涘弽涔嬶紝鏃犳墽琛屼腑浠诲姟 鎴�浠诲姟宸插彇璐у畬鎴�鍗冲彲浣跨敤
+                                    if (IntensiveArea.TaskTakeAreaOver(startAreaInfo.S_AREA_CODE.Trim(), a, true, Analysis))
+                                    {
+                                        startNo = a;
+                                        startArea = startAreaInfo.S_AREA_CODE.Trim();
+                                    }
+                                }
+                            }
+                        }
+                    });
+                    if (!string.IsNullOrEmpty(startNo))
+                    {
+                        endList.ForEach(a =>
+                        {
+                            if (!string.IsNullOrEmpty(a))
+                            {
+                                var startlocationlist = db.Queryable<Location>().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "鏃� && info.S_LOCK_STATE.Trim() != "鎶ュ簾").ToList();
+                                if (startlocationlist.Count() == 0)
+                                {
+                                    //鏌ヨ鏈夐攣鐨勫簱浣�濡傛灉娌℃湁锛氶攣瀹氭墍鏈夊嚭搴撹揣浣�+                                    var liststart = db.Queryable<Location>().Where(b => b.N_ROW.Trim() == a).ToList();
+                                    foreach (var item in liststart)
+                                    {
+                                        if (item.N_CURRENT_NUM < 2 && item.S_LOCK_STATE.Trim() != "鎶ュ簾")
+                                        {
+                                            item.S_LOCK_STATE = "绉诲簱閿�;
+                                            db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                                        }
+                                    }
+                                    TaskProcess.AreaRowLockState(a);
+                                }
+                                //鑾峰彇鍙敤鐨�缁堢偣搴撲綅 锛�.缁堢偣搴撲綅 涓嶈兘鏈変换鍔℃墽琛屼腑  2.鏍规嵁缁堢偣搴撳尯 鏌ヨ 鍑烘墍鏈夊睘浜庢 搴撲綅鐨勪换鍔�+                                var endAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == a && b.N_CURRENT_NUM < b.N_CAPACITY).OrderByDescending(b => b.N_COL).Take(1).First();
+                                if (endAreaInfo != null && endAreaInfo.N_CURRENT_NUM < endAreaInfo.N_CAPACITY)
+                                {
+                                    //YiKuUnLockRow(db, a, endAreaInfo.S_AREA_CODE.Trim(), false);
+                                    if (IntensiveArea.TaskTakeAreaOver(endAreaInfo.S_AREA_CODE.Trim(), a, false))
+                                    {
+                                        endNo = a;
+                                        endArea = endAreaInfo.S_AREA_CODE.Trim();
+                                    }
+                                }
+                            }
+                        });
+                    }
+                    if (Analysis)
+                    {
+                        if (!string.IsNullOrEmpty(startNo) && !string.IsNullOrEmpty(endNo))
+                        {
+                            //string taskType = it.S_ORDER_TYPE.Trim() + ":" + startNo + "-" + endNo;
+                            IntensiveArea.DaMingShanYiKuTask1(startArea, endArea, startNo, endNo, it.S_ORDER_TYPE.Trim(), it.S_WorkNo.Trim());
+                        }
+                    }
+                }
+
+                //瑙i攣骞跺畬鎴愬伐鍗�+                CompleteAndUnLockWork(it, db, startList, endList);
+            });
+        }
+
+        /// <summary>
+        /// 瑙i攣骞跺畬鎴愬伐鍗�+        /// </summary>
+        /// <param name="it"></param>
+        /// <param name="db"></param>
+        /// <param name="startList"></param>
+        /// <param name="endList"></param>
+        private static void CompleteAndUnLockWork(WorkOrder it, SqlSugar.SqlSugarClient db, List<string> startList, List<string> endList)
+        {
+            //鏌ヨ鍒拌捣鐐瑰簱浣嶅叏閮ㄧЩ搴撳畬姣曪紝瑙i攣鍏ㄩ儴搴撲綅锛屽苟鏇存敼宸ュ崟鐘舵�涓�绉诲簱瀹屾垚
+            //9999-鏁存帓绉诲簱--闇�垽鏂捣鐐规帓鍧囩Щ搴撳畬姣曪紝瀹屾垚宸ュ崟
+            //鍏朵粬锛氱Щ搴撴暟閲忎负0锛屽嵆鍙畬鎴愬伐鍗�+            bool result = true;
+            if (it.S_YiKuNum == 9999)
+            {
+                startList.ForEach(a =>
+                {
+                    if (!string.IsNullOrEmpty(a))
+                    {
+                        //var startAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == int.Parse(a)).OrderBy(b => b.N_COL).Take(1).First();
+
+                        var startAreaInfo = db.Queryable<Location>().Where(b => b.N_ROW == a && b.N_CURRENT_NUM > 0).OrderBy(b => b.N_COL).Take(1).First();
+                        if (startAreaInfo != null) result = false;
+                    }
+                });
+            }
+            else if (it.S_YiKuNum != 0 && it.S_YiKuNum > 0) result = false;
+            else
+            {
+                LogHelper.Info($"绉诲簱宸ュ崟寮傚父锛氬伐鍗曞彿锛歿it.S_WorkNo.Trim()},宸ュ崟绫诲瀷锛歿it.S_ORDER_TYPE.Trim()}锛岀Щ搴撴暟閲忥細{it.S_YiKuNum}", "Monitor");
+                //Console.WriteLine($"绉诲簱宸ュ崟寮傚父锛氬伐鍗曞彿锛歿it.S_WorkNo.Trim()},宸ュ崟绫诲瀷锛歿it.S_ORDER_TYPE.Trim()}锛岀Щ搴撴暟閲忥細{it.S_YiKuNum}");
+            }
+
+            if (result)
+            {
+                ChangeWorkState(it, db);
+                startList.ForEach(a =>
+                {
+                    var startrow = db.Queryable<Location>().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE == "绉诲簱閿�).ToList();
+                    foreach (var start in startrow)
+                    {
+                        start.S_LOCK_STATE = "鏃�;
+                        db.Updateable(start).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                    }
+                    TaskProcess.AreaRowLockState(a, false);
+                });
+                endList.ForEach(a =>
+                {
+                    var endrow = db.Queryable<Location>().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE == "绉诲簱閿�).ToList();
+                    foreach (var end in endrow)
+                    {
+                        end.S_LOCK_STATE = "鏃�;
+                        db.Updateable(end).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                    }
+                    TaskProcess.AreaRowLockState(a, false);
+                });
+            }
+        }
+
+
+        /// <summary>
+        /// 鏇存敼宸ュ崟鐘舵�涓虹Щ搴撳畬鎴�+        /// </summary>
+        /// <param name="it"></param>
+        /// <param name="db"></param>
+        private static void ChangeWorkState(WorkOrder it, SqlSugar.SqlSugarClient db)
+        {
+            var work = db.Queryable<WorkOrder>().Where(a => a.S_WorkNo == it.S_WorkNo).First();
+            if (work != null)
+            {
+                work.S_WorkState = "瀹屾垚";
+                db.Updateable(work).UpdateColumns(a => new { a.S_WorkState }).ExecuteCommand();
+                LogHelper.Info($"绉诲簱浠诲姟瀹屾垚锛氬伐鍗曞彿:{it.S_WorkNo.Trim()}锛屽伐鍗曠被鍨�{it.S_ORDER_TYPE.Trim()}", "Monitor");
+            }
+        }
+
+        #endregion
+
+
+        #region   鍐滃か灞辨硥-娣冲畨宸ュ巶
+
+        /// <summary>
+        /// 鍏呯數鏃堕棿-24灏忔椂鍒�+        /// </summary>
+        public static string batteryStart = Settings.BatteryTime;
+        public static string batteryEnd = Settings.BatteryTimeEnd;
+        /// <summary>
+        /// 鑷姩鍏呯數
+        /// </summary>
+        internal static void AnalysisBattery()
+        {
+            LogHelper.Info("鍏呯數浠诲姟娴佺▼鍒ゆ柇锛氭墽琛屽紑濮嬶紒", "Monitor");
+            var db = new SqlHelper<object>().GetInstance();
+            var now = DateTime.Today;
+            string date = now.Year.ToString() + "-" + now.Month.ToString() + "-" + now.Day.ToString() + " " + "12:00:00";
+            DateTime dt = Convert.ToDateTime(date);
+            string dateStart = now.Year.ToString() + "-" + now.Month.ToString() + "-" + now.Day.ToString() + " " + batteryStart;
+            DateTime dtStart = Convert.ToDateTime(dateStart);
+            string dateEnd = now.Year.ToString() + "-" + now.Month.ToString() + "-" + now.Day.ToString() + " " + batteryEnd;
+            DateTime dtEnd = Convert.ToDateTime(dateEnd);
+            if (dtStart.Subtract(dt).TotalMinutes > 0 && dtEnd.Subtract(dt).TotalMinutes < 0)
+            {
+                //鏅氫笂鑷冲噷鏅ㄦ椂闂存
+                if (DateTime.Now.Subtract(dt).TotalMinutes > 0) dtEnd = Convert.ToDateTime(dateEnd).AddDays(1);//褰撳墠鏃堕棿涓哄鏅�-缁撴潫鏃堕棿澶╂暟鍔�
+                else dtStart = Convert.ToDateTime(dateStart).AddDays(-1);//褰撳墠鏃堕棿涓哄噷鏅�-寮�鏃堕棿澶╂暟鍑忎竴
+            }
+            LogHelper.Info($"褰撳墠鏃堕棿锛歿DateTime.Now},璧峰鏃堕棿锛歿dtStart},缁撴潫鏃堕棿锛歿dtEnd}", "Monitor");
+            //Console.WriteLine($"銆愬鐞嗘椂闂村垽鏂�锛歿DateTime.Now >= dtStart}锛寋DateTime.Now <= dtEnd}");
+            if (DateTime.Now >= dtStart && DateTime.Now <= dtEnd)
+            {
+                //鍏堝垽鏂腑闂磋〃鏄惁鏈夊綋鍓嶅厖鐢垫々鐨勭姸鎬侊紝鏈夊垯涓嶆搷浣滐紝鍙嶄箣杩涘叆灏忚溅鐢甸噺鏌ヨ
+                LogHelper.Info("杩涘叆鍏呯數浠诲姟娴佺▼:褰撳墠鏃堕棿婊¤冻鐢熸垚鍏呯數浠诲姟鍩烘湰瑕佹眰锛屽紑濮嬪垽鏂瑿hargingPile閰嶇疆椤逛腑褰撳墠鍏呯數妗╃姸鎬佹槸鍚﹀紑鍚�, "Monitor");//ChargingPile
+                var list = Settings.GetChargingPile().Where(a => a.enable == "1").ToList();
+                if (list.Count > 0)
+                {
+                    list.ForEach(a =>
+                    {
+                        var agvState = db.Queryable<HangChaAGV>().Where(b => b.agvNo == a.agvNo).First();
+                        if (agvState != null)
+                        {
+                            int agvNo = int.Parse(a.agvNo);
+                            var margin = db.Queryable<MarginAGV>().Where(b => b.agvNo == agvNo).First();
+                            if (margin != null)
+                            {
+                                if (int.Parse(agvState.agvBattery.Trim()) <= 600)
+                                {
+                                    var count = db.Queryable<MarginAGV>().Where(b => b.state == 1).ToList();
+                                    if (count.Count() == 0)
+                                    {
+                                        if (margin.state == 0)
+                                        {
+                                            var dic = new Dictionary<string, string>();
+                                            dic.Add("Pri", "20");
+                                            dic.Add("ExtDeviceNo", a.agvNo);
+                                            dic.Add("FRow", "");
+                                            dic.Add("TRow", "");
+                                            dic.Add("No", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff"));
+                                            var res = NDC.AddNewOrder(1, dic);
+                                            if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009))
+                                            {
+                                                //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
+                                                margin.state = 1;
+                                                db.Updateable(margin).ExecuteCommand();
+                                                LogHelper.Info($"鍏呯數浠诲姟涓嬪彂鎴愬姛锛岃溅鍙凤細{a.agvNo}", "Monitor");
+                                            }
+                                        }
+                                    }
+                                }
+                                else if (int.Parse(agvState.agvBattery.Trim()) >= 1000)
+                                {
+                                    margin.state = 2;
+                                    db.Updateable(margin).ExecuteCommand();
+                                }
+                            }
+                            else
+                            {
+                                int marginGroup = int.Parse(a.charginGroup);
+                                var count = db.Queryable<MarginAGV>().Where(b => b.marginGroup == marginGroup && b.state == 1).ToList();
+                                if (count.Count() == 0)
+                                {
+                                    MarginAGV marginAGV = new MarginAGV
+                                    {
+                                        agvNo = int.Parse(a.agvNo),
+                                        marginGroup = int.Parse(a.charginGroup),
+                                        state = 0,
+                                        dateTime = DateTime.Now
+                                    };
+                                    db.Insertable(marginAGV).ExecuteCommand();
+                                }
+                            }
+                        }
+                    });
+                }
+            }
+            else
+            {
+                //瓒呰繃涓�皬鏃讹紝鍒犻櫎涓棿琛ㄥ叏閮ㄦ暟鎹�+                db.Deleteable<MarginAGV>().Where(a => a.singNo == "1").ExecuteCommand();
+                LogHelper.Info($"杩涘叆鍏呯數浠诲姟娴佺▼锛氬綋鍓嶆椂闂翠笉婊¤冻AMS鎺ㄩ�灏忚溅鍏呯數锛屽垹闄arginAGV灏忚溅鍏呯數涓棿琛紒", "Monitor");
+            }
+            LogHelper.Info("鍏呯數浠诲姟娴佺▼鍒ゆ柇锛氭墽琛岀粨鏉燂紒", "Monitor");
+        }
+
+
+
+
+
+        #endregion
+
+        #region   璋冭瘯妯″紡
+        internal static void Test()
+        {
+            //var db = new SqlHelper<object>().GetInstance();
+            //var listMaxCol = db.Queryable<Location>().Where(a => a.S_AREA_CODE == "CACK1" && a.N_ROW == 3).OrderByDescending(a => a.N_COL).First();
+            ////Console.WriteLine(JsonConvert.SerializeObject(listMaxCol));
+
+            //var trayInfoList = WCSHelper.GetChunAnTrayInfoList();
+            ////Console.WriteLine(JsonConvert.SerializeObject(trayInfoList));
+            //bool result = WCSHelper.DelChunAnTrayInfo("A01","10");
+            ////Console.WriteLine(JsonConvert.SerializeObject(result));
+
+
+            //var loca = IntensiveArea.GetLocationIn("CACK1", "濉戞枡姘�, "202303150001");
+            ////Console.WriteLine(JsonConvert.SerializeObject(loca));
+            //WCSHelper.CreateTable();
+
+            //var url = Settings.GetThirdPartyUrlList();
+            //for (int i = 0; i < url.Count(); i++)
+            //{
+            //    //Console.WriteLine(url[i].Url);
+            //}
+        }
+        #endregion
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/TaskController/TaskProcess.cs b/HH.WCS.NongFuChaYuan/TaskController/TaskProcess.cs
new file mode 100644
index 0000000..189f9a1
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/TaskController/TaskProcess.cs
@@ -0,0 +1,1033 @@
+锘縰sing HH.WCS.NongFuChaYuan.TaskController;
+using HH.WCS.NongFuChaYuan.DispatchService;
+using HH.WCS.NongFuChaYuan.OtherService;
+using HH.WCS.NongFuChaYuan.WmsService;
+using Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Threading.Tasks;
+using static HH.WCS.NongFuChaYuan.DispatchService.NDC;
+using HH.WCS.NongFuChaYuan.DeviceService;
+
+namespace HH.WCS.NongFuChaYuan.TaskController
+{
+    /// <summary>
+    /// 浠诲姟娴佺▼瀹炵幇绫�-鏍囧噯娴佺▼锛岄」鐩祦绋�+    /// </summary>
+    public class TaskProcess
+    {
+        private static HttpHelper httpHelper = new HttpHelper();
+        private static object JunZhouLocLocker = new object();//鍧囧窞鍑哄叆搴撹揣浣嶉攣
+        private static object ChunAnLocLocker = new object();//娣冲畨鍑哄叆搴撹揣浣嶉攣
+        private static string enable = Settings.flexibilityenable;
+
+        #region 鏍囧噯浠诲姟娴佺▼
+        //--------------------------------------------------浠诲姟鐩稿叧--------------------------------------------------
+
+        /// <summary>
+        /// 浠诲姟鍒嗗彂
+        /// </summary>
+        internal static void Dispatch()
+        {
+            //鑾峰彇鎵�湁鏈墽琛岀殑浠诲姟
+            var list = TaskHelper.GetTaskListByState("鏈墽琛�);
+            if (list.Count > 0)
+            {
+                list.ForEach(task =>
+                {
+                    if (!TaskProcess.Intercept(task))
+                    {
+                        //浣跨敤鑷畾涔変换鍔℃帹閫�+                        TaskProcess.SendTaskStandard(task);
+                    }
+                });
+            }
+        }
+
+        /// <summary>
+        /// 浠诲姟鎷︽埅
+        /// </summary>
+        /// <param name="task"></param>
+        /// <returns></returns>
+        internal static bool Intercept(WMSTask mst)
+        {
+            var result = false;
+            if (Settings.ProjectName == "鍐滃か鍧囧窞")
+            {
+                //缈绘枟鏈哄彔绌虹瓙
+                //鐢垫浠诲姟涓嶆帹閫侊紝鍗曠嫭澶勭悊
+                if (mst.S_TYPE.Contains("-鐢垫"))
+                {
+                    result = true;
+                }
+                if (mst.S_TYPE.Trim() == "缈绘枟鏈哄彔绌虹瓙" && mst.N_PRIORITY == 90)
+                {
+                    //鍒ゆ柇鐩稿悓缁堢偣鐨勫彔鎵樹换鍔℃槸鍚﹀瓨鍦紝鏄惁鍙栬揣瀹屾垚
+                    var list = TaskHelper.GetTaskByEnd(mst.S_END_LOC);
+                    var otherTask = list.Where(a => a.N_PRIORITY == 99).FirstOrDefault();
+                    if (otherTask != null && !TaskHelper.CheckActionRecordExist(otherTask.S_TASK_NO, "4"))
+                    {
+                        TaskHelper.UpdateStatus(mst, "鏈墽琛�);
+                        result = true;
+                    }
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鎺ㄩ�浠诲姟-NDC鍙傛暟鏍囧噯鐗�+        /// </summary>
+        /// <param name="mst">浠诲姟鏁版嵁</param>
+        /// <returns></returns>
+        internal static bool SendTaskStandard(WMSTask mst)
+        {
+            var result = false;
+            try
+            {
+                int TsNo = 1;//涓嬪彂浠诲姟绫诲瀷锛氶粯璁�鍧洊)-1锛屾垚鍝佷换鍔�5
+                var Extend1 = 0;//鍙栬揣绔欑偣
+                var Extend2 = 0;//鍗歌揣绔欑偣
+                string Extend3 = "";//鍔熻兘鐮�     16杩涘埗杞�0杩涘埗
+                string Extend4 = "";//鍧洊锛氭墭鐩樼被鍨�鍗充骇鍗崇敤1锛岄潪鍗充骇鍗崇敤2 涓嶅尯鍒嗕负1 鎴愬搧锛氬彇鍗歌揣灞傛暟(鍏堝崟鐙浆鎹负16杩涘埗锛屽啀鎷兼帴杞崲涓�0杩涘埗)
+                string Extend5 = mst.S_NOTE;//鐗╂枡楂樺害(鍝佺浉)                                   鏍规嵁宸ュ崟鐗╂枡鍒扮墿鏂欒〃鑾峰彇涓嬪彂TS鐨勭墿鏂欓珮搴�+                string Extend6 = "";//鎵樼洏鐗堝瀷 澶囨敞锛氶泦鍖栨澘 1锛屽ぇ鏉�2锛屽皬鏉�3锛岃秴鎵�4      鏍规嵁宸ュ崟鐗堝瀷杞崲涓哄搴旂殑鍊�+                int Extend7 = 0;//璧风偣鍒�+                int Extend8 = 0;//缁堢偣鍒�+                int startLayer = mst.N_START_LAYER;// 璧风偣鍙栬揣灞傛暟
+                int endLayer = mst.N_END_LAYER;// 缁堢偣鍗歌揣灞傛暟
+                string workNo = mst.S_SRC_NO;// 宸ュ崟鍙�+                string trayType = mst.S_CNTR_TYPE;//鎵樼洏绫诲瀷-鏍规嵁鍚勮嚜鐜板満鎯呭喌鑾峰彇
+                var taskType = mst.S_TYPE;// 浠诲姟绫诲瀷
+                var taskState = mst.S_B_STATE;// 浠诲姟鐘舵�
+                if (taskState == "鏈墽琛� || taskState == "寰呮帹閫�)
+                {
+                    var db = new SqlHelper<object>().GetInstance();
+                    // 鑾峰彇璧风粓鐐圭殑AGV绔欑偣 鏌ヨ 鎵╁睍璐т綅琛�S_PICKUP_POINT-鐐逛綅灞傛暟 S_LOC_CODE-璐т綅缂栫爜 GetAgvSite-鏍囧噯鑾峰彇鎵╁睍璐т綅琛ㄦ暟鎹殑鏂规硶
+                    Extend1 = LocationHelper.GetAgvSite(mst.S_START_LOC);
+                    Extend2 = LocationHelper.GetAgvSite(mst.S_END_LOC);
+
+                    Extend1 = Extend1 + mst.N_START_LAYER - 1;
+                    Extend2 = Extend2 + mst.N_END_LAYER - 1;
+                    //浜屾湡鎴愬搧浠诲姟绫诲瀷(灏�鎴愬搧杞﹂棿 浠诲姟绫诲瀷鍔犲叆鍒版鏁扮粍涓紝鍗冲彲鏍规嵁 浠诲姟绫诲瀷 鍖哄垎杞﹂棿锛屽苟鑾峰彇瀵瑰簲鐨凾S鍙傛暟)
+
+                    if (enable == "1" && (taskType.Contains("鎴愬搧涓嬬嚎") || taskType.Contains("绉诲簱") || taskType.Contains("鏍堟澘涓婄嚎")))
+                    {
+                        // 鎴愬搧浠诲姟涓嬪彂鍙傛暟鑾峰彇
+                        TsNo = 5;
+                        // 鍏朵粬鍔熻兘鐮佸彲浠ユ牴鎹换鍔$被鍨嬭嚜琛屾坊鍔�姝ゅ浠呯ず渚�绉诲簱 鍔熻兘鐮佽幏鍙栨柟寮忥紝濡傛灉鏈夋洿濂界殑鏂瑰紡锛屽彲浠ヨ嚜琛屼慨鏀�
+                        if (taskType.Contains("绉诲簱")) Extend3 = Convert.ToInt32("20", 16).ToString();
+
+                        // 鑾峰彇 浠诲姟鍙傛暟4 DATA 鏁版嵁
+                        string startLayerValue = Convert.ToString(startLayer, 16).ToUpper();
+                        string endLayerValue = Convert.ToString(endLayer, 16).ToUpper();
+                        Extend4 = Convert.ToInt32(startLayerValue + endLayerValue, 16).ToString();
+                        flexiUpdateBit(mst, ref Extend1, ref Extend2, ref Extend7, ref Extend8);
+                        //// 鑾峰彇鎴愬搧宸ュ崟鏁版嵁(鏌ヨ 鎴愬搧宸ュ崟琛�
+                        if (trayType != null)
+                        {
+                            // 鏍规嵁宸ュ崟涓墭鐩樼被鍨嬭浆鎹负瀵瑰簲鐨勪笅鍙慣S鍙傛暟鏁版嵁
+                            Extend6 = trayType == "闆嗗寲鏉� ? "1" : trayType == "澶ф澘" ? "2" : trayType == "灏忔澘" ? "3" : trayType == "闆嗗寲鏉胯秴鎵樹竴" ? "4" : "";
+                        }
+                    }
+                    else
+                    {
+                        // 鍧洊浠诲姟涓嬪彂鍙傛暟鑾峰彇
+                        Extend4 = "1";
+                    }
+
+                    if (mst.S_TYPE.Contains("缈绘枟鏈�)) mst.N_PRIORITY = 99;
+                    if (mst.S_START_LOC == "NFCY-YWL-01")
+                    {
+                        Extend1 = 564;
+                    }
+
+                    Console.WriteLine($"[SendTask]:TaskNo={mst.S_TASK_NO.Trim()},start={Extend1},end={Extend2}");
+                    var dic = new Dictionary<string, string>();
+                    var dic1 = new Dictionary<string, string>();
+                    dic.Add("Pri", mst.N_PRIORITY.ToString());
+                    dic.Add("No", mst.S_TASK_NO.Trim());
+                    dic1.Add("From", Extend1.ToString());
+                    dic1.Add("To", Extend2.ToString());
+                    dic1.Add("Func", Extend3);
+                    dic1.Add("Data", Extend4);
+
+                    if (taskType.Contains("鎴愬搧涓嬬嚎") || taskType.Contains("绉诲簱") || taskType.Contains("鏍堟澘涓婄嚎"))
+                    {
+                        dic1.Add("ItemHeight", Extend5);
+                        dic1.Add("CntrType", Extend6);
+                        dic1.Add("FromCol", Extend7.ToString());
+                        dic1.Add("ToCol", Extend8.ToString());
+                    }
+
+                    LogHelper.Info($"sendtask taskno={mst.S_TASK_NO} value={dic1}");
+                    var res = new AGVResult();
+                    res = NDC.OrderAdd(TsNo, dic, dic1);
+                    if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009))
+                    {
+                        TaskHelper.UpdateStatus(mst, "宸叉帹閫�);
+                        result = true;
+                    }
+                }
+                else result = true;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"SendTaskStandard Error:{ex.Message}", ex);
+            }
+
+            return result;
+        }
+
+        internal static void RoboticarmTask(WMSTask mst, int state)
+        {
+            if (mst.S_TYPE.Contains("鏈烘鑷�))
+            {
+                //鏈烘鑷備换鍔�瀵绘壘閰嶇疆鏂囦欢
+                var info = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC) || a.location.Contains(mst.S_END_LOC)).FirstOrDefault();
+                if (info != null)
+                {
+                    if (info.location.Contains(mst.S_START_LOC))
+                    {
+                        //绌烘涓嬬嚎
+                        if (state == 3) 
+                        {
+                            PlcHelper.SendHex(info.address, "3F00110D0A");
+                        }
+                        if (state == 4)
+                        {
+                            PlcHelper.SendHex(info.address, "3F00100D0A");
+                        }
+                    }
+                    else
+                    {
+                        //婊℃涓婄嚎
+                        if (state == 5)
+                        {
+                            PlcHelper.SendHex(info.address, "3F00210D0A");
+                        }
+                        if (state == 6)
+                        {
+                            PlcHelper.SendHex(info.address, "3F00200D0A");
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鎺ㄩ�浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static bool SendTask(WMSTask mst)
+        {
+            var result = false;
+            var start = 0; var end = 0;//璧风偣缁堢偣璐т綅淇℃伅
+            var flow = 0; var tlow = 0;
+            string FRow = ""; string TRow = "";//鎵╁睍鍙傛暟1锛屾墿灞曞弬鏁�----鏍规嵁瀹為檯椤圭洰鍐冲畾鏄惁鍚敤
+            var ts = 1;
+            var taskType = mst.S_TYPE.Trim();
+            var taskState = mst.S_B_STATE.Trim();
+            if (taskState == "鏈墽琛� || taskState == "寰呮帹閫�)
+            {
+                // 鏍囧噯璐т綅绔欑偣澶勭悊
+                if (start == 0) start = LocationHelper.GetAgvSite(mst.S_START_LOC);
+                if (end == 0) end = LocationHelper.GetAgvSite(mst.S_END_LOC);
+                FRow = mst.N_START_LAYER.ToString();
+                TRow = mst.N_END_LAYER.ToString();
+                //鏌ヨ璐т綅绔欑偣瀵圭収琛�+                if (int.Parse(FRow) > 1) start = start + (int.Parse(FRow) - 1);
+                if (int.Parse(TRow) > 1) end = end + (int.Parse(TRow) - 1);
+
+                FRow = mst.S_NOTE;
+                TRow = "1";
+                if (mst.S_TYPE.Contains("鍑哄簱"))
+                {
+                    var info = Settings.GetupdateCacheBitList().Where(a => a.location == mst.S_END_LOC).FirstOrDefault();
+                    if (info != null)
+                    {
+                        end = int.Parse(info.AGVlocation);
+                        if (mst.N_START_LAYER > 1)
+                        {
+                            FRow = "1";
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"浠诲姟缁堢偣鍓嶇Щ杞︾珯鐐规湭閰嶇疆");
+                    }
+                }
+
+                if (mst.S_TYPE.Contains("鍏ュ簱"))
+                {
+                    var info = Settings.GetupdateCacheBitList().Where(a => a.location == mst.S_START_LOC).FirstOrDefault();
+                    if (info != null)
+                    {
+                        start = int.Parse(info.AGVlocation);
+                        if (mst.N_END_LAYER > 1)
+                        {
+                            FRow = "1";
+                        }
+                    }
+                    else
+                    {
+                        LogHelper.Info($"浠诲姟璧风偣鍓嶇Щ杞︾珯鐐规湭閰嶇疆");
+                    }
+                }
+                //ZBbit(mst, ref start, ref end);
+                if (enable == "1" && (mst.S_TYPE.Contains("鎴愬搧涓嬬嚎") || mst.S_TYPE.Contains("绉诲簱")))
+                {
+                    //flexiUpdateBit(mst, ref start, ref end, ref flow, ref tlow, ref TRow);
+                    ts = 5;
+                }
+
+                //Console.WriteLine($"[SendTask]:TaskNo={mst.S_TASK_NO.Trim()},start={start},end={end}");
+                var dic = new Dictionary<string, string>();
+                //dic.Add("Pri", mst.N_PRIORITY.ToString());
+                dic.Add("From", start.ToString());
+                dic.Add("To", end.ToString());
+                dic.Add("FRow", FRow);
+                dic.Add("TRow", TRow);
+                dic.Add("Flow", flow.ToString());
+                dic.Add("Tlow", tlow.ToString());
+                //dic.Add("No", mst.S_TASK_NO.Trim());// dic.Add("Ext1", "1"); dic.Add("Ext2", "CALLADDAGV"); dic.Add("N_CNTR_COUNT", "");
+                //var res = NDC.AddNewOrder(ts, dic);
+                var res = NDC.AddNewOrder1(ts, mst.N_PRIORITY, mst.S_TASK_NO, dic);
+                if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009))
+                {
+                    //鎺ㄩ�鎴愬姛锛屼慨鏀逛换鍔′紭鍏堢骇
+                    TaskHelper.UpdateStatus(mst, "宸叉帹閫�);
+                    result = true;
+                }
+            }
+            else result = true;
+            return result;
+        }
+
+        private static void flexiUpdateBit(WMSTask mst, ref int start, ref int end, ref int flow, ref int tlow)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            flexibilloction startinfo = null;
+            flexibilloction endinfo = null;
+            var startloc = db.Queryable<Location>().Where(a => a.S_LOC_CODE == mst.S_START_LOC.Trim()).First();
+            var endloc = db.Queryable<Location>().Where(a => a.S_LOC_CODE == mst.S_END_LOC.Trim()).First();
+            //var trayno = mst.S_CNTRS.Split(',')[0];
+            //var iteminfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == trayno).First();
+            //if (iteminfo != null)
+            //{
+            //var info = Settings.GetDaMingShanItemNameList().Where(a => a.ItemName == mst.S_ITEM_CODE.Trim()).FirstOrDefault();
+            //var info = WCSHelper.GetItemrel(iteminfo.S_ITEM_CODE, iteminfo.S_ITEM_MODEL);
+            //if (info != null)
+            //{
+            startinfo = db.Queryable<flexibilloction>().Where(a => a.S_AREA_CODE == startloc.S_AREA_CODE && a.N_ROW == startloc.N_ROW && a.S_START_COL <= startloc.N_COL && a.S_END_COL >= startloc.N_COL).First();
+            endinfo = db.Queryable<flexibilloction>().Where(a => a.S_AREA_CODE == endloc.S_AREA_CODE && a.N_ROW == endloc.N_ROW && a.S_START_COL <= endloc.N_COL && a.S_END_COL >= endloc.N_COL).First();
+
+            if (startinfo != null)
+            {
+                if (mst.N_START_LAYER > 1)
+                {
+                    start = int.Parse(startinfo.S_Second_Bit);
+                    flow = startloc.N_COL - startinfo.S_START_COL;
+                }
+                else
+                {
+                    start = int.Parse(startinfo.S_First_Bit);
+                    flow = startloc.N_COL - startinfo.S_START_COL;
+                }
+            }
+            if (endinfo != null)
+            {
+                if (mst.N_END_LAYER > 1)
+                {
+                    end = int.Parse(endinfo.S_Second_Bit);
+                    tlow = endloc.N_COL - endinfo.S_START_COL;
+                }
+                else
+                {
+                    end = int.Parse(endinfo.S_First_Bit);
+                    tlow = endloc.N_COL - endinfo.S_START_COL;
+                }
+            }
+            //}
+            //}
+            //else
+            //{
+            //    LogHelper.Info($"浠诲姟{mst.S_TASK_NO} 鎵樼洏{mst.S_CNTRS.Split(',')[0]} 鏌ヤ笉鍒扮墿鏂欐暟鎹�);
+            //}
+
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// 鍙栬揣鍗歌揣瀹屾垚锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="load">true:鍙栬揣瀹屾垚 false:鍗歌揣瀹屾垚</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_TASK_NO} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTRS}");
+                LogHelper.Info($"浠诲姟{mst.S_TASK_NO} 璐т綅{mst.S_START_LOC}鍙栬揣瀹屾垚锛岃捣鐐硅В缁戝鍣▄mst.S_CNTRS}");
+                LocationHelper.UnBindingLoc(mst.S_START_LOC.Trim(), mst.S_CNTRS.Split(',').ToList(), mst);
+                //IntensiveArea.UnLockRow(mst.S_START_LOC.Trim(),mst.S_TYPE.Trim());
+            }
+            else
+            {
+                //Console.WriteLine($"浠诲姟{mst.S_TASK_NO} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岀粓鐐圭粦瀹氬鍣▄mst.S_CNTRS}");
+                LogHelper.Info($"浠诲姟{mst.S_TASK_NO} 璐т綅{mst.S_END_LOC}鍗歌揣瀹屾垚锛岀粓鐐圭粦瀹氬鍣▄mst.S_CNTRS}");
+                if (mst.S_TYPE.Trim() != "鏍堟澘涓婄嚎") LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTRS.Split(',').ToList(), mst);
+                else LocationHelper.SetPlcState(mst.S_END_LOC.Trim(), mst.S_CNTRS.Split(',').ToList());
+                //if (mst.S_TYPE.Contains("鎴愬搧涓嬬嚎")) IntensiveArea.ULlock(mst.S_END_LOC);
+                //IntensiveArea.UnLockRow(mst.S_END_LOC.Trim(), mst.S_TYPE.Trim());
+            }
+        }
+
+        /// <summary>
+        /// 浠诲姟鍙栨秷锛岀紦瀛樹綅鐘舵�鏇存柊
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static void CacheBitCancelUpdate(WMSTask mst)
+        {
+            //浠诲姟鍙栨秷锛屽彇璐у畬鎴愬墠鐨勶紝璧风偣鐨刲oadingCount鍜岀粓鐐箄nLoadingCount閮芥竻闄わ紝鍙栬揣瀹屾垚鐨勫彧澶勭悊缁堢偣
+            if (TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "4"))
+            {
+                //缁堢偣缁戝畾
+                //if (mst.S_TYPE.Trim() != "鎴愬搧涓嬬嚎")
+                //{
+                CacheBitUpdate(mst, false);
+                LocationHelper.UnLockLoc(mst.S_END_LOC);
+                if (mst.S_TYPE.Trim().Contains("绉诲簱") && !string.IsNullOrEmpty(mst.S_SRC_NO.Trim())) IntensiveArea.UpdateWorkNum(mst);
+                //}
+                //else
+                //{
+                //    LocationHelper.UnLockLoc(mst.S_END_LOC, mst.S_TYPE);
+                //}
+            }
+            else
+            {
+                if (mst.S_TYPE.Trim() == "鎴愬搧涓嬬嚎")
+                {
+                    //CacheBitUpdate(mst, true);
+                    WCSHelper.UpdateDaMingShanInsertAnalysisMoveLib(mst.S_END_LOC);
+                }
+                //璧风偣缁堢偣瑙i攣
+                LocationHelper.UnLockLoc(mst.S_START_LOC);
+                LocationHelper.UnLockLoc(mst.S_END_LOC, mst.S_TYPE);
+            }
+        }
+
+        /// <summary>
+        /// 浠诲姟鍙栨秷鎴栬�寮哄埗瀹屾垚澶嶄綅 璐т綅鎵樼洏琛紝璐т綅閿侊紝鎺掗攣
+        /// </summary>
+        /// <param name="mst">浠诲姟鏁版嵁</param>
+        /// <param name="taskState">浠诲姟鐘舵� true-鍙栨秷 false-寮哄埗瀹屾垚(浠呭厑璁稿彇璐у畬鎴�</param>
+        public static void TaskCanCelOrComplete(WMSTask mst, bool taskState = true)
+        {
+            if (TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "4"))
+            {
+                CacheBitUpdate(mst, false);//缁堢偣缁戝畾
+                LocationHelper.UnLockLoc(mst.S_END_LOC, mst.S_TYPE);
+            }
+            else
+            {
+                if (!taskState) CacheBitUpdate(mst, false);//寮哄埗瀹屾垚 缁戝畾缁堢偣
+                if (mst.S_TYPE.Trim().Contains("绉诲簱") && !string.IsNullOrEmpty(mst.S_SRC_NO.Trim())) IntensiveArea.UpdateWorkNum(mst);
+                LocationHelper.UnLockLoc(mst.S_START_LOC);
+                LocationHelper.UnLockLoc(mst.S_END_LOC, mst.S_TYPE);
+            }
+        }
+
+        /// <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)
+            {
+                if (mst != null)
+                {
+                    DeviceProcess.Xieliao(mst, state == 1103);
+                }
+            }
+
+            if (state == 1101 || state == 1102)
+            {
+                if (mst != null)
+                {
+                    DeviceProcess.QuLiao(mst, state == 1101);
+                }
+            }
+        }
+
+        /// <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 (!(mst.S_TYPE.Contains("绌虹瓙涓嬬嚎") &&  mst.S_SRC_SYS == "Y7鐩�))
+                {
+                    DeviceProcess.Secondstagetask(mst, true);
+                }
+                if (mst.S_TYPE.Contains("绌虹瓙涓婄嚎"))
+                {
+                    DeviceProcess.Secondstagetask(mst, false);
+                }
+            }
+            if (state == 6)//鍗歌揣瀹屾垚
+            {
+                if (mst.S_TYPE.Contains("绌虹瓙涓嬬嚎") &&  mst.S_SRC_SYS == "Y7鐩�)
+                {
+                    DeviceProcess.Secondstagetask(mst, true);
+                }
+                if (!mst.S_TYPE.Contains("绌虹瓙涓婄嚎"))
+                {
+                    DeviceProcess.Secondstagetask(mst, false);
+                }
+                CacheBitUpdate(mst, false);
+            }
+            if (state == 7)
+            {
+                CacheBitCancelUpdate(mst);
+            }
+        }
+
+        /// <summary>
+        /// 绗笁鏂逛换鍔$姸鎬佸洖鎶�+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="action"></param>
+        internal static void ThirdReportStatus(string SourceNo, string AgvNo, int State, string ExtData = "", WMSTask wmsTask = null)
+        {
+            if (Settings.FULEenable == "1")
+            {
+                if (State == 2) TaskProcess.TASK_STATUSFunc(wmsTask);
+            }
+        }
+
+        #endregion
+
+        #region 澶ф槑灞卞瘜鍕掓祦绋�+
+        /// <summary>
+        /// 浠诲姟瀹屾垚鐘舵�鍥炴姤--1.姝e父浠诲姟瀹屾垚鍥炴姤    2.绉诲簱浠诲姟瀹屾垚鍥炴姤
+        /// </summary>
+        /// <param name="JsonData"></param>
+        /// <returns></returns>
+        internal static void TASK_STATUSFunc(WMSTask wmsTask)
+        {
+            string msg = ""; List<string> trayList = new List<string>();
+            var req = new SimpleResult();
+            var StartInfo = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_LOC_CODE == wmsTask.S_START_LOC.Trim()).First();
+            var EndInfo = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_LOC_CODE == wmsTask.S_END_LOC.Trim()).First();
+            List<string> taskTrayList = new List<string>(wmsTask.S_CNTRS.Trim().Split(','));
+            taskTrayList.ForEach(a =>
+            {
+                if (!string.IsNullOrEmpty(a)) trayList.Add(a.Replace(" ", ""));
+            });
+            string[] trayInfo = trayList.ToArray();
+            var url = Settings.GetThirdPartyUrlList().Where(a => a.UrlNo == "2" && a.Enable == "1").FirstOrDefault();
+            if (wmsTask.S_TYPE.Contains("绉诲簱"))
+            {
+                //绉诲簱浠诲姟 瀹屾垚鍥炴姤
+                var httpVerify = Settings.GetHttpApiVerifyList().Where(a => a.VerifyNo == "1" && a.Project == Settings.ProjectName && a.Enable == "1").FirstOrDefault();
+                if (httpVerify != null)
+                {
+                    string sendMsg = JsonConvert.SerializeObject(new
+                    {
+                        startAreaNo = StartInfo.N_ROW.Trim(),
+                        endAreaNo = EndInfo.N_ROW.Trim(),
+                        trayInfo = trayInfo,
+                        repoNo = "CY02-1"
+                    });
+                    req = FuLeWebPost(sendMsg, "yikuTaskStatus", url.Url);//YKRWSD AreaRowLockState
+                }
+                else
+                {
+                    AnalysisCompleteModel model = new AnalysisCompleteModel();
+                    model.TrayInfo = trayInfo;
+                    model.StartAreaNo = StartInfo.N_ROW.Trim();
+                    model.EndAreaNo = EndInfo.N_ROW.Trim();
+                    string sendMsg = JsonConvert.SerializeObject(model);
+                    req = FuLeWebPost(sendMsg, "YKRWWC", url.Url);//YKRWWC YIKUTASK_STATUS
+                }
+            }
+            else if (wmsTask.S_TYPE.Contains("鎴愬搧涓嬬嚎"))
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                string SrcNo = wmsTask.S_SRC_SYS.Trim();
+                var workInfo = db.Queryable<WorkOrder>().Where(a => a.S_WorkNo == wmsTask.S_SRC_NO).First();
+                if (workInfo != null)
+                {
+                    if (workInfo.S_ORDER_TYPE.Trim() != "鏃犵爜鍏ュ簱")
+                    {
+                        //浜х嚎涓嬬嚎 瀹屾垚鍥炴姤
+                        var httpVerify = Settings.GetHttpApiVerifyList().Where(a => a.VerifyNo == "1" && a.Project == Settings.ProjectName && a.Enable == "1").FirstOrDefault();
+                        if (httpVerify != null)
+                        {
+                            string sendMsg = JsonConvert.SerializeObject(new
+                            {
+                                trayInfo = trayInfo,
+                                workNo = wmsTask.S_SRC_NO.Trim(),
+                                repoNo = "CY02-1",
+                                areaLoca = EndInfo.N_ROW.Trim()
+                            });
+                            req = FuLeWebPost(sendMsg, "proTaskStatus", url.Url);//YKRWSD AreaRowLockState
+                        }
+                        else
+                        {
+                            ProCompleteModel model = new ProCompleteModel();
+                            model.TrayInfo = trayInfo;
+                            model.WorkNo = wmsTask.S_SRC_NO.Trim();
+                            model.AreaLoca = EndInfo.N_ROW.Trim();
+                            string sendMsg = JsonConvert.SerializeObject(model);
+                            req = FuLeWebPost(sendMsg, "WGHB", url.Url);//WGHB PROTASK_STATUS
+                        }
+                    }
+                }
+            }
+
+            if (req != null && req.success) msg = $"TASK_STATUS:杩斿洖浠诲姟鐘舵�鎴愬姛:{JsonConvert.SerializeObject(req)}锛�;
+            else msg = $"TASK_STATUS:杩斿洖浠诲姟鐘舵�澶辫触:{JsonConvert.SerializeObject(req)}锛�;
+            LogHelper.Info(msg, "ThirdSystemLog");
+        }
+
+
+
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--姹夊拰浠诲姟姣忎釜鐘舵�杩涜瀹炴椂涓婁紶(鍖呮嫭浠诲姟鍒涘缓鏃讹紝涓婃姤 8)
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        internal static void GeneralInterFaceFunc(WMSTask wmsTask, string taskStatus)
+        {
+            string msg = "";
+            var req = new SimpleResult();
+            var db = new SqlHelper<object>().GetInstance();
+            if (TaskHelper.CheckActionRecordExist(wmsTask.S_TASK_NO, "4") && taskStatus == "7") taskStatus = "2";
+            if (taskStatus == "7" || taskStatus == "2") wmsTask.T_END_TIME = DateTime.Now;
+            try
+            {
+                //鏈烘鑷備换鍔℃嫤鎴�+                if (wmsTask.S_TYPE.Contains("鏈烘鑷�)) return;
+                //鑾峰彇涓婃姤鎺ュ彛鐨刄RL
+                var url = Settings.GetThirdPartyUrlList().Where(a => a.UrlNo == "4" && a.Enable == "1").FirstOrDefault();
+                LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_TASK_NO},浠诲姟鐘舵�锛歿taskStatus},鑾峰彇URL锛歿url}", "ThirdSystemLog");
+                //浠诲姟绫诲瀷鏁版嵁澶勭悊
+                string taskType = wmsTask.S_TYPE;
+                var taskTypeInfo = db.Queryable<TaskTypeConvTable>().Where(a => a.taskTypeName == wmsTask.S_TYPE).First();
+                if (taskTypeInfo != null) taskType = taskTypeInfo.taskType;
+                LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_TASK_NO},浠诲姟鐘舵�锛歿taskStatus},浠诲姟绫诲瀷鏁版嵁澶勭悊锛歿taskType}", "ThirdSystemLog");
+
+                //鎵樼洏鐗╂枡鏁版嵁澶勭悊
+                List<string> cntrList = new List<string>(wmsTask.S_CNTRS.Split(','));//鑾峰彇鎵樼洏鏁版嵁
+                string itemCode = "";//鐗╂枡缂栫爜
+                itemCode = GeneralInterFaceGetItemCodeFunc(wmsTask, db, cntrList, itemCode);
+                LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_TASK_NO},浠诲姟鐘舵�锛歿taskStatus},鐗╂枡缂栫爜锛歿itemCode}", "ThirdSystemLog");
+                List<asnReferenceDModel> asnReferenceList = new List<asnReferenceDModel> { };//鎵樼爜鏁扮粍
+                GeneralInterFaceGetTrayCodeFunc(wmsTask, db, asnReferenceList, cntrList);
+                LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_TASK_NO},浠诲姟鐘舵�锛歿taskStatus},鑾峰彇鎵樼洏鏁版嵁锛歿JsonConvert.SerializeObject(asnReferenceList)}", "ThirdSystemLog");
+
+                //AGV璁惧淇℃伅澶勭悊
+                string equipmentCode = "";
+                string orgCode = "";
+                string orgName = "";
+                string proxyInterfaceCode = "0050";
+                GeneralInterFaceGetAgvDeviceInfoFunc(wmsTask, db, ref equipmentCode, ref orgCode, ref orgName, ref proxyInterfaceCode);
+                LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_TASK_NO},浠诲姟鐘舵�锛歿taskStatus},equipmentCode锛歿equipmentCode},orgCode锛歿orgCode},orgName:{orgName},proxyInterfaceCode:{proxyInterfaceCode}", "ThirdSystemLog");
+
+                DateTime dateTime = taskStatus == "1" ? Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8) : taskStatus == "2" || taskStatus == "7" ? Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8) : taskStatus == "8" ? Convert.ToDateTime(wmsTask.T_CREATE).AddHours(-8) : DateTime.UtcNow;
+                string createTime = GetTimeStamp(wmsTask.T_CREATE.AddHours(-8), 1, 2);
+                string startTime = "";
+                //鍦–#涓紝浣跨敤DateTimeOffset.UtcNow.ToUnixTimeSeconds()鏂规硶鑾峰彇Unix鏃堕棿鎴虫椂锛屽彲鑳戒細澶氬嚭涓�釜姣銆傝繖鏄洜涓篣nix鏃堕棿鎴虫槸浠ョ涓哄崟浣嶇殑锛岃�DateTimeOffset.UtcNow杩斿洖鐨勬槸UTC鏃堕棿锛屽叾绮惧害涓�00绾崇銆�+                if (wmsTask.S_WORK_MODE != "agv" && !string.IsNullOrEmpty(wmsTask.S_WORK_MODE)) startTime = wmsTask.S_WORK_MODE;
+                else
+                {
+                    startTime = wmsTask.T_START_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8), 1, 2);
+                    if (startTime != null)
+                    {
+                        wmsTask.S_WORK_MODE = startTime;
+                        db.Updateable(wmsTask).UpdateColumns(a => new { a.S_WORK_MODE }).ExecuteCommand();
+                    }
+                }
+
+                string endTime = wmsTask.T_END_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8), 1, 2);
+                string businessTime = taskStatus == "1" ? startTime : taskStatus == "2" || taskStatus == "7" ? endTime : taskStatus == "8" ? createTime : GetTimeStamp(dateTime, 1, 2);
+                //string dt = wmsTask.T_START_TIME == null ? null : Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8).ToString();
+                //string mill = wmsTask.T_START_TIME == null ? null : Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8).Millisecond.ToString();
+                LogHelper.Info($"GeneralInterFaceFunc锛氫换鍔″彿锛歿wmsTask.S_TASK_NO},浠诲姟鐘舵�锛歿taskStatus},浠诲姟寮�鏃堕棿锛歿wmsTask.T_START_TIME}锛岃浆鎹㈠悗鏃堕棿锛歿startTime}", "ThirdSystemLog");
+
+                string sendMsg = JsonConvert.SerializeObject(new
+                {
+                    taskCode = wmsTask.S_TASK_NO,//浠诲姟缂栫爜
+                    taskStatus = taskStatus,//浠诲姟鐘舵�-浠诲姟鍒涘缓鎴愬姛浼犺緭 8
+                    taskType = taskType,//浠诲姟绫诲瀷-闇�鏍规嵁 閰嶇疆琛ㄦ暟鎹繘琛岃浆鎹紝杞崲涓篗ES鐨勪换鍔$被鍨�+                    createTime = createTime,//闇�浆鎹负 鏃堕棿鎴�   wmsTask.T_CREATE
+                    startTime = startTime,//闇�浆鎹负 鏃堕棿鎴�wmsTask.T_START_TIME
+                    endTime = endTime,//闇�浆鎹负 鏃堕棿鎴�wmsTask.T_END_TIME
+                    businessTime = businessTime,//褰撳墠浠诲姟鏃堕棿-闇�浆鎹负 鏃堕棿鎴�  DateTime.Now
+                    startAddress = wmsTask.S_START_LOC,//璧风偣
+                    endAddress = wmsTask.S_END_LOC,//缁堢偣
+                    equipmentNo = wmsTask.S_EQ_NO,//杞﹁締缂栧彿
+                    equipmentCode = equipmentCode,//杞﹁締閾墝-闇�鏍规嵁 閰嶇疆琛ㄦ暟鎹紝閫氳繃 杞﹁締缂栧彿浠ュ強宸ュ巶缂栫爜 鏌ヨ瀵瑰簲杞﹁締閾墝
+                    orgCode = Settings.FactoryCode,//宸ュ巶缂栫爜
+                    orgName = Settings.FactoryName,//宸ュ巶鍚嶇О
+                    sku = itemCode,//鐗╂枡缂栫爜
+                    asnReferenceDList = asnReferenceList,//鎵樼爜鏁扮粍 姝ゆ鍙夎溅鍙夌殑鎵樼洏鍠风爜锛�涓�鍙夎締杞︼紝鏈変袱涓紪鐮�  浜х嚎涓嬬嚎涓旈潪鏃犵爜妯″紡鏃朵紶杈�+                    appliactionId = "MOBOX"
+                    //proxyInterfaceCode = proxyInterfaceCode //鎺ュ彛鍞竴鏍囪瘑鐮�鍥哄畾鍊硷細0050
+                });
+                //http://yst-open-zuul-qa.idc.yst.com.cn/proxy/v1/
+                req = FuLeWebPost(sendMsg, "generalInterface", url.Url, true);//YKRWSD AreaRowLockState
+
+                if (req != null && req.success) msg = $"GeneralInterFaceFunc:杩斿洖浠诲姟鐘舵�鎴愬姛:{JsonConvert.SerializeObject(req)}锛�;
+                else msg = $"GeneralInterFaceFunc:杩斿洖浠诲姟鐘舵�澶辫触:{JsonConvert.SerializeObject(req)}锛�;
+            }
+            catch (Exception ex)
+            {
+                msg = $"GeneralInterFaceFunc Error:TaskInfo:{JsonConvert.SerializeObject(wmsTask)},TaskState:{taskStatus},ErrorMsg:{ex.Message}";
+            }
+
+            LogHelper.Info(msg, "ThirdSystemLog");
+        }
+
+
+
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鏃堕棿鎴�+        /// </summary>
+        /// <param name="DataBitType">鏁版嵁浣嶆暟锛氬�锛�2|64  鍚箟锛�2浣峾64浣�/param>
+        /// <param name="TimeType">鑾峰彇鏃堕棿绫诲瀷锛氬�锛�|2   鍚箟锛�-绉掔骇   2-姣绾�/param>
+        /// <param name="TimeUtcType">鑾峰彇鏃堕棿Utc绫诲瀷锛氬�锛�|2   鍚箟锛�-鏈湴鏃堕棿   2-Utc鏃堕棿</param>
+        /// <returns></returns>
+        public static string GetTimeStamp(DateTime dateTime, int DataBitType, int TimeType)
+        {
+            string timeStamp = "";
+
+            //鏃堕棿鎴虫墦鍗�+            TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);//鏃堕棿鎴宠幏鍙�+            double tsTime = TimeType == 1 ? ts.TotalSeconds : ts.TotalMilliseconds;//绉掔骇|姣绾ф椂闂磋幏鍙�+
+            string TimeTypeInfo = TimeType == 1 ? "绉掔骇" : "姣绾�;
+            timeStamp = DataBitType == 32 ? Convert.ToInt32(tsTime).ToString() : Convert.ToInt64(tsTime).ToString();
+
+            //double result = 0;
+            //result = DataBitType == 32 ? Convert.ToInt32(tsTime) : Convert.ToInt64(tsTime);
+
+            return timeStamp;
+        }
+
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇AGV璁惧淇℃伅鏁版嵁
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        /// <param name="db"></param>
+        /// <param name="equipmentCode"></param>
+        /// <param name="orgCode"></param>
+        /// <param name="orgName"></param>
+        /// <param name="proxyInterfaceCode"></param>
+        private static void GeneralInterFaceGetAgvDeviceInfoFunc(WMSTask wmsTask, SqlSugarClient db, ref string equipmentCode, ref string orgCode, ref string orgName, ref string proxyInterfaceCode)
+        {
+            if (!string.IsNullOrEmpty(wmsTask.S_EQ_NO))
+            {
+                var agvDeviceInfo = db.Queryable<AGVDeviceDataTable>().Where(a => a.equipmentNo == wmsTask.S_EQ_NO && a.orgCode == Settings.FactoryCode).First();
+                if (agvDeviceInfo != null)
+                {
+                    equipmentCode = agvDeviceInfo.equipmentCode;
+                    orgCode = agvDeviceInfo.orgCode;
+                    orgName = agvDeviceInfo.orgName;
+                    proxyInterfaceCode = agvDeviceInfo.proxyInterfaceCode;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鎵樼洏鏁版嵁
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        private static void GeneralInterFaceGetTrayCodeFunc(WMSTask wmsTask, SqlSugarClient db, List<asnReferenceDModel> asnReferenceList, List<string> cntrList)
+        {
+            string SrcNo = wmsTask.S_SRC_NO?.Trim();
+
+            //鏍规嵁浠诲姟涓瓨鏀剧殑宸ュ崟鍙凤紝鑾峰彇宸ュ崟绫诲瀷--鍥犱负娣冲畨 婊℃墭涓嬬嚎浠诲姟鍖呭惈 涓嬬嚎 鍊硷紝鍥犳澶氬垽鏂竴姝ワ紝鍑忓皯宸ュ崟琛ㄧ殑鏌ヨ
+            if (!string.IsNullOrEmpty(SrcNo) && wmsTask.S_TYPE.Contains("鎴愬搧涓嬬嚎"))
+            {
+                var workInfo = db.Queryable<WorkOrder>().Where(a => a.S_WorkNo == SrcNo).First();
+                if (workInfo != null)
+                {
+                    if (workInfo.S_ORDER_TYPE.Trim() != "鏃犵爜鍏ュ簱")
+                    {
+
+                        if (cntrList.Count > 0)
+                        {
+                            cntrList.ForEach(a =>
+                            {
+                                if (!string.IsNullOrEmpty(a))
+                                    asnReferenceList.Add(new asnReferenceDModel { asnReferenceD = a });
+                            });
+                        }
+                    }
+                }
+            }
+        }
+
+        public class asnReferenceDModel
+        {
+            public string asnReferenceD { get; set; }
+        }
+
+        /// <summary>
+        /// 浠诲姟淇℃伅鎺ュ彛--鑾峰彇鐗╂枡缂栫爜
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        private static string GeneralInterFaceGetItemCodeFunc(WMSTask wmsTask, SqlSugarClient db, List<string> cntrList, string itemCode)
+        {
+            if (cntrList.Count > 0)
+            {
+                string SrcNo = wmsTask.S_SRC_NO?.Trim();
+                if (!string.IsNullOrEmpty(SrcNo) && wmsTask.S_TYPE.Contains("鎴愬搧涓嬬嚎"))
+                {
+                    var workInfo = db.Queryable<WorkOrder>().Where(a => a.S_WorkNo == SrcNo).First();
+                    if (workInfo != null && workInfo.S_ORDER_TYPE.Trim() != "鏃犵爜鍏ュ簱") itemCode = workInfo.S_ItemCode;
+                }
+                else
+                {
+                    var cntrItemInfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrList[0]).First();
+                    if (cntrItemInfo != null)
+                    {
+                        ////姝ゅ鏌ヨ 鐗╂枡琛紝浠呴檺娣冲畨鑾峰彇MES鐗╂枡浣跨敤锛屽叾浠栧伐鍘傚彲鑷娉ㄩ噴锛涘洜娣冲畨鍏ュ簱鐗╂枡鏄娇鐢�鐗╂枡鍚嶇О+鐗╂枡灞傛暟 鎷兼帴鑰屾垚锛屽洜姝ら渶瑕�閫氳繃鐗╂枡琛ㄨ浆鎹负 MES 鐨勭墿鏂欑紪鐮�+                        //var itemInfo = db.Queryable<>().Where(a => a.S_ITEM_NAME == cntrItemInfo.S_ITEM_CODE).First();
+                        //if (itemInfo != null) itemCode = itemInfo.S_ITEM_CODE;
+                        itemCode = cntrItemInfo.S_ITEM_CODE;
+                    }
+                }
+            }
+
+            return itemCode;
+        }
+
+        public class ProCompleteModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string StockNo { get; set; } = "CY02-1";
+            public string[] TrayInfo { get; set; }
+            public string WorkNo { get; set; }
+            public string AreaLoca { get; set; }
+        }
+        public class AnalysisCompleteModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string StockNo { get; set; } = "CY02-1";
+            public string[] TrayInfo { get; set; }
+            public string StartAreaNo { get; set; }
+            public string EndAreaNo { get; set; }
+        }
+        /// <summary>
+        /// 搴撲綅閿佸畾瑙i攣鍥炴姤-绉诲簱浠诲姟閿佸畾瑙i攣搴撲綅
+        /// </summary>
+        /// <param name="AreaRow">搴撲綅鍙�澶氫釜搴撲綅鍙风敤鑻辨枃閫楀彿闅斿紑</param>
+        /// <param name="state">true-閿佸畾搴撲綅 false-瑙i攣搴撲綅</param>
+        internal static void AreaRowLockState(string AreaRow, bool state = true)
+        {
+            if (Settings.FULEenable == "1")
+            {
+                string msg = ""; List<string> areaList = new List<string>();
+                var req = new SimpleResult();
+                List<string> taskAreaList = new List<string>(AreaRow.Split(','));
+                taskAreaList.ForEach(a =>
+                {
+                    if (!string.IsNullOrEmpty(a)) areaList.Add(a.Replace(" ", ""));
+                });
+                string[] AreaInfo = areaList.ToArray();
+                var url = Settings.GetThirdPartyUrlList().Where(a => a.UrlNo == "2" && a.Enable == "1").FirstOrDefault();
+                var httpVerify = Settings.GetHttpApiVerifyList().Where(a => a.VerifyNo == "1" && a.Project == Settings.ProjectName && a.Enable == "1").FirstOrDefault();
+                if (httpVerify != null)
+                {
+                    string sendMsg = JsonConvert.SerializeObject(new
+                    {
+                        areaNum = AreaInfo,
+                        repoNo = "CY02-1",
+                        areaLock = state ? "1" : "2"
+                    });
+                    req = FuLeWebPost(sendMsg, "areaRowLockState", url.Url);//YKRWSD AreaRowLockState
+                }
+                else
+                {
+                    AreaRowLockStateModel model = new AreaRowLockStateModel();
+                    model.AreaNum = AreaInfo;
+                    model.AreaLock = state ? "1" : "2";
+                    string sendMsg = JsonConvert.SerializeObject(model);
+                    req = FuLeWebPost(sendMsg, "YKRWSD", url.Url);//YKRWSD AreaRowLockState
+                }
+                if (req != null && req.success) msg = $"YKRWSD:杩斿洖搴撲綅鐘舵�鎴愬姛:{JsonConvert.SerializeObject(req)}锛�;
+                else msg = $"YKRWSD:杩斿洖搴撲綅鐘舵�澶辫触:{JsonConvert.SerializeObject(req)}锛�;
+                LogHelper.Info(msg, "ThirdSystemLog");
+            }
+        }
+        public class AreaRowLockStateModel
+        {
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string StockNo { get; set; } = "CY02-1";
+            public string[] AreaNum { get; set; }
+            /// <summary>
+            /// 搴撲綅閿佸畾鐘舵�--1-閿佸畾 2-瑙i攣
+            /// </summary>
+            public string AreaLock { get; set; }
+        }
+        /// <summary>
+        /// FuLeWebPost
+        /// </summary>
+        /// <param name="param">鍙戦�鍐呭</param>
+        /// <param name="postName">鎺ュ彛鍚嶇О</param>
+        /// <param name="Par1">鎵╁睍鍙傛暟</param>
+        /// <returns></returns>
+        public static SimpleResult FuLeWebPost(string param, string postName, string Par1 = "", bool extend = false)
+        {
+            string msg = ""; string feedback = "";
+            SimpleResult result = new SimpleResult();
+            try
+            {
+                LogHelper.Info($"銆怓uLe Post {postName}銆戯細瀵屽嫆鎺ュ彛鍙傛暟json={param}");
+                string webAPIUrl = "";
+                var httpVerify = Settings.GetHttpApiVerifyList().Where(a => a.VerifyNo == "1" && a.Project == Settings.ProjectName && a.Enable == "1").FirstOrDefault();
+                if (postName == "generalInterface")
+                {
+                    httpVerify = Settings.GetHttpApiVerifyList().Where(a => a.VerifyNo == "2" && a.Project == Settings.ProjectName && a.Enable == "1").FirstOrDefault();
+                }
+                if (httpVerify != null)
+                {
+                    //閲囩敤鎺ュ彛鍔犲瘑鏂瑰紡杩涜浼犺緭
+                    webAPIUrl = $"{Par1}{postName}";
+                    string TokenMsg = "";
+                    string timestamp = DateTime.Now.ToString("s").Replace("T", " ");
+                    TokenMsg = httpVerify.Extend[0] + "from" + httpVerify.Extend[1] + "timestamp" + timestamp;
+                    LogHelper.Info($"銆怓uLe Post {postName}銆戯細鎺ュ彛鍦板潃: {webAPIUrl} 鍔犲瘑鍓嶆槑鏂囷細{TokenMsg}", "ThirdSystemLog");
+                    string TokenMsgEncrypt = CryptoDecryptHelper.GetMd5FromString(TokenMsg);
+                    LogHelper.Info($"銆怓uLe Post {postName}銆戯細鎺ュ彛鍦板潃: {webAPIUrl} 鍔犲瘑鍚庡瘑鏂囷細{TokenMsgEncrypt}", "ThirdSystemLog");
+                    feedback = httpHelper.WebPost(webAPIUrl, param, "application/json", TokenMsgEncrypt, timestamp, extend);
+                }
+                else
+                {
+                    //鏍囧噯浼犺緭鏂瑰紡浼犺緭
+                    webAPIUrl = $"{Par1}{postName}" + "&warehouseId=FLUXWMSDB";
+                    feedback = httpHelper.WebPost(webAPIUrl, param);
+                }
+
+
+                if (!string.IsNullOrEmpty(feedback))
+                {
+                    msg = $"銆怓uLe Post {postName}銆慦ebUrl={webAPIUrl};param={param} ;return={feedback}";
+                    var req = JsonConvert.DeserializeObject<SimpleResult>(feedback);
+                    if (req.success)
+                    {
+                        result.success = true;
+                        msg = $"銆怓uLe Post {postName}銆憇uccess锛�WebUrl={ webAPIUrl};param={param};return={feedback}";
+                    }
+                    else
+                    {
+                        if (!string.IsNullOrEmpty(req.errMsg)) msg = $"銆怓uLe Post {postName}銆慺ail锛乪rr={req.errMsg};WebUrl={webAPIUrl} ;param={param};return={feedback}";
+                        else msg = $"銆怓uLe Post {postName}銆慺ail锛乪rr={req.message};WebUrl={webAPIUrl} ;param={param};return={feedback}";
+                    }
+                }
+                else
+                {
+                    string errMsg = "can't find the address";
+                    msg = $"銆怓uLe Post {postName}銆慺ail锛乪rr={errMsg};WebUrl={webAPIUrl} ;param={param}";
+                }
+                //var db = new SqlHelper<object>().GetInstance();
+                //var RepeatUrl = db.Queryable<HttpRepeatSend>().Where(a => a.SendMsg == param && a.UrlName == postName && a.Url == Par1).First();
+                //if (result.success)
+                //{
+                //    if (RepeatUrl != null) db.Deleteable<HttpRepeatSend>().Where(a => a.SendMsg == param && a.UrlName == postName && a.Url == Par1).ExecuteCommand();
+                //}
+                //else
+                //{
+                //    if (RepeatUrl == null)
+                //    {
+                //        var RepeatInfo = new HttpRepeatSend()
+                //        {
+                //            SendMsg = param,
+                //            UrlName = postName,
+                //            Url = Par1,
+                //            SendNum = 5
+                //        };
+                //        db.Insertable(RepeatInfo).ExecuteCommand();
+                //    }
+                //    else
+                //    {
+                //        if (RepeatUrl.SendNum == 1) db.Deleteable<HttpRepeatSend>().Where(a => a.SendMsg == param && a.UrlName == postName && a.Url == Par1).ExecuteCommand();
+                //        else
+                //        {
+                //            RepeatUrl.SendNum = RepeatUrl.SendNum - 1;
+                //            db.Updateable(RepeatUrl).UpdateColumns(a => new { a.SendNum }).ExecuteCommand();
+                //        }
+                //    }
+                //}
+            }
+            catch (Exception ex)
+            {
+                msg = $"銆怓uLe Post {postName}銆慺ail锛乪rr={ex.Message}";
+            }
+            LogHelper.Info(msg, "ThirdSystemLog");
+            return result;
+        }
+        /// <summary>
+        /// 鎺ュ彛鐘舵�鍥炴姤澶勭悊
+        /// </summary>
+        public class SimpleResult
+        {
+            public bool success { get; set; }
+            public int errCode { get; set; }
+            public string errMsg { get; set; } = "";
+
+            /// <summary>
+            /// 娣冲畨浜屾湡-鍝嶅簲鏁版嵁
+            /// </summary>
+            public Object data { get; set; }
+            /// <summary>
+            /// 娣冲畨浜屾湡-鍝嶅簲缂栫爜
+            /// </summary>
+            public string code { get; set; }
+            /// <summary>
+            /// 娣冲畨浜屾湡-鍝嶅簲淇℃伅
+            /// </summary>
+            public string message { get; set; }
+            /// <summary>
+            /// 娣冲畨浜屾湡-鍝嶅簲淇℃伅绫诲瀷
+            /// </summary>
+            public string messageType { get; set; }
+            /// <summary>
+            /// 娣冲畨浜屾湡-寮傚父
+            /// </summary>
+            public Exception exception { get; set; }
+        }
+
+
+        #endregion
+
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/ContainerHelper.cs b/HH.WCS.NongFuChaYuan/WmsService/ContainerHelper.cs
new file mode 100644
index 0000000..85ea453
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/ContainerHelper.cs
@@ -0,0 +1,210 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    /// <summary>
+    /// 瀹瑰櫒甯姪绫�+    /// </summary>
+    internal class ContainerHelper
+    {
+
+        internal static string GenerateCntrNo()
+        {
+            var date = DateTime.Now.ToString("yyMMdd");
+            var id = SYSHelper.GetSerialNumber(date, "TP");
+            return $"TP{date}{id.ToString().PadLeft(4, '0')}";
+        }
+
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒绫诲瀷銆佺洰鐨勫湴銆佺姸鎬佹煡璇㈠鍣�+        /// </summary>
+        /// <param name="dest"></param>
+        /// <param name="cntrType"></param>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<Container> GetCntrListByPurpose(string dest, string cntrType, string state) {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Container>().Where(a => a.S_DEST == dest && a.S_TYPE == cntrType && a.S_CNTR_STATE == state).ToList();
+            return list;
+
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇瀹瑰櫒鏄惁鏈夌墿鏂欎俊鎭�+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static bool CheckEmpty(string cntr) {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<LocCntrRel>().Count(a => a.S_LOC_CODE.Trim() == cntr) == 0;
+        }
+
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒鍙疯幏鍙栧鍣ㄤ俊鎭�+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static Container GetCntr(string cntr) {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Container>().Where(a => a.S_CNTR_CODE == cntr).First();
+        }
+
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒鑾峰彇鐗╂枡淇℃伅
+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static List<CntrItemRel> GetCntrItemRel(string cntr) {
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntr).ToList();
+            return list;
+        }
+
+        /// <summary>
+        /// 鐗╂枡淇℃伅缁戝畾鍒版弧瀹瑰櫒涓�+        /// </summary>
+        /// <param name="cntrCode"></param>
+        /// <param name="itemCode"></param>
+        /// <param name="batchNo"></param>
+        /// <param name="qty"></param>
+        /// <param name="purpose">瀹瑰櫒鐢ㄩ�锛岀敤浜庡摢涓嚎杈硅繕鏄洰鐨勭偣</param>
+        /// <returns></returns>
+        internal static bool BindCntrItem(Container cntr, string itemCode, string batchNo, string qty) {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try 
+            {
+                db.BeginTran();
+                db.Updateable(cntr).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
+                //1.灏嗗師鏈夊鍣ㄧ墿鏂欎俊鎭垹闄�+                db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == cntr.S_CNTR_CODE.Trim()).ExecuteCommand();
+                //2.鎻掑叆鏂扮殑瀹瑰櫒鐗╂枡淇℃伅锛堝鍣ㄥ彿涓嶅彉锛�+                var cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CNTR_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode };
+                db.Insertable<CntrItemRel>(cir).ExecuteCommand();
+
+                db.Ado.CommitTran();
+                res = true;
+            }
+            catch (Exception ex) {
+                db.Ado.RollbackTran();
+            }
+            return res;
+        }
+        /// <summary>
+        /// 鏍规嵁瀹瑰櫒鏉ユ簮鍜岀姸鎬佽幏鍙栨墭鐩�+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<Container> GetCntr(string dest, string state, string cntrType = "") {
+            var db = new SqlHelper<object>().GetInstance();
+            if (cntrType == "") {
+                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.S_CNTR_STATE == state).ToList();
+            }
+            else {
+                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.S_CNTR_STATE == state && a.S_TYPE == cntrType).ToList();
+            }
+        }
+        internal static bool UpdateCntr(List<string> cntrs, string dest, string state) {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE)).ToList();
+            if (models.Count > 0) {
+                models.ForEach(a => {
+                    a.S_DEST = dest; a.S_CNTR_STATE = state;
+                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.S_CNTR_STATE }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+        internal static bool UpdateCntrDest(List<string> cntrs, string dest) {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE)).ToList();
+            if (models.Count > 0) {
+                models.ForEach(a => {
+                    a.S_DEST = dest;
+                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+        /// <summary>
+        /// 鏇存柊鎵樼洏鏉ユ簮
+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <param name="src"></param>
+        /// <returns></returns>
+        internal static bool UpdateCntrSrc(string cntr, string src) {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Container>().Where(a => a.S_CNTR_CODE == cntr).First();
+            if (model != null) {
+                model.S_SRC = src;
+                model.T_MODIFY = DateTime.Now;
+                res = db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.T_MODIFY }).ExecuteCommand() > 0;
+            }
+            return res;
+        }
+        internal static bool UpdateCntrState(List<string> cntrs, string state) {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE)).ToList();
+            if (models.Count > 0) {
+                models.ForEach(a => {
+                    a.S_CNTR_STATE = state;
+                    db.Updateable(a).UpdateColumns(it => new { it.S_CNTR_STATE }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+     
+        internal static bool UpdateCntr(List<string> cntrs, string src, string dest, string state) {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CNTR_CODE)).ToList();
+            if (models.Count > 0) {
+                models.ForEach(a => {
+                    a.S_DEST = dest; a.S_CNTR_STATE = state; a.S_SRC = src;
+                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.S_CNTR_STATE, it.S_SRC }).ExecuteCommand();
+                });
+                res = true;
+            }
+            return res;
+        }
+        public static bool ClearCntrInfo(string cntr) {
+            
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Container>().Where(a => a.S_CNTR_CODE == cntr).First();
+            if (model != null) {
+                model.S_SRC = "";
+                model.S_DEST = "";
+                model.S_CNTR_STATE = "";
+                model.T_MODIFY = DateTime.Now;
+
+            }
+            db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.S_DEST, it.S_CNTR_STATE, it.T_MODIFY }).ExecuteCommand();
+            return db.Deleteable<CntrItemRel>().Where(a => a.S_CNTR_CODE.Trim() == cntr.Trim()).ExecuteCommand() > 0;
+        }
+        internal static List<Container> GetCntrBySrc(string src, string state, string cntrType = "") {
+            var db = new SqlHelper<object>().GetInstance();
+            if (cntrType == "") {
+                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.S_CNTR_STATE == state).ToList();
+            }
+            else {
+                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.S_CNTR_STATE == state && a.S_TYPE == cntrType).ToList();
+            }
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/IntensiveArea.cs b/HH.WCS.NongFuChaYuan/WmsService/IntensiveArea.cs
new file mode 100644
index 0000000..d4c9adc
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/IntensiveArea.cs
@@ -0,0 +1,2647 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using HH.WCS.NongFuChaYuan.TaskController;
+using Newtonsoft.Json;
+using NLog.Fluent;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using static System.Runtime.CompilerServices.RuntimeHelpers;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    /// <summary>
+    /// 瀵嗛泦鍨嬪簱鍖�+    /// </summary>
+    internal class IntensiveArea
+    {
+        static IntensiveArea()
+        {
+            //InitRowLockTable(new List<string> { "PGKQ", "PGKTK" });
+        }
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鍜岀墿鏂欒幏鍙栧叆搴撶殑璐т綅锛堝爢鍙犲厛鑰冭檻鏍囧噯鐨勶紝瀹归噺閮芥槸涓�牱鐨勶紝渚嬪鍧囧窞閮芥槸3+3锛涗笉鑰冭檻宄ㄧ湁灞遍潪鏍�+2鍜�+1鍚屾椂瀛樺湪锛�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location GetLocation4In(string area, string itemCode, string itemBatch, int standardCarryQty = 1)
+        {
+            Location result = null;
+
+            try
+            {
+                //1.0 鑾峰彇姣忎竴鎺掓渶澶х殑鍒�+                //1.1 鍒ゆ柇褰撳墠鏁伴噺鏄笉鏄弧鐨勶紝濡傛灉鏄弧鐨勫苟涓旀槸鏈�ぇ鍒楋紝闇�鎺掗櫎
+                var listMaxCol = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+
+                //1.1 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+                if (list.Count > 0)
+                {
+                    for (int i = list.Count - 1; i >= 0; i--)
+                    {
+                        //鎺掗櫎宸茬粡閿佸畾鐨勮揣浣�鍜�鏀炬弧浜嗕笖鏄渶澶у垪鐨勮揣浣�+                        //鍏跺畠椤圭洰杩橀渶瑕佹煡璇㈡帓閿�+                        if (list[i].S_LOCK_STATE.Trim() != "鏃� || (list[i].N_CURRENT_NUM == list[i].N_CAPACITY && listMaxCol.Count(a => a.S_LOC_CODE == list[i].S_LOC_CODE) > 0))
+                        {
+                            list.Remove(list[i]);
+                        }
+                    }
+                    if (list.Count > 0)
+                    {
+                        //1.21 鍔犺浇璐т綅鐨勫鍣ㄤ俊鎭�(mapper涔嬪墠鍙兘鏄煡璇㈠師濮嬫暟鎹紝濡傛灉鏈夊叾浠栨煡璇�mapper澶辨晥)
+                        #region MyRegion
+                        /*
+                        //Console.WriteLine("鍔犺浇璐т綅鐨勫鍣ㄤ俊鎭�);
+                        db.ThenMapper(list, loc => {
+                            loc.LocCntrRel = db.Queryable<LocCntrRel>().SetContext(x => x.S_LOC_CODE, () => loc.S_LOC_CODE, loc).FirstOrDefault();
+                        });
+
+                        //1.22 鍔犺浇瀹瑰櫒鐨勭墿鏂欎俊鎭�+                        //Console.WriteLine("鍔犺浇瀹瑰櫒鐨勭墿鏂欎俊鎭�);
+                        db.ThenMapper(list.Select(loc => loc.LocCntrRel), lcr => {
+                            lcr.CntrItemRel = db.Queryable<CntrItemRel>().SetContext(x => x.S_CNTR_CODE, () => lcr.S_CNTR_CODE, lcr).FirstOrDefault();
+                        });
+                      */
+                        #endregion
+                        //1.3 閬嶅巻鍒ゆ柇鐗╂枡绫诲瀷鏄惁鐩稿悓
+                        for (int i = 0; i < list.Count; i++)
+                        {
+
+                            //todo 杩橀渶瑕佸垽鏂攣
+                            #region 绌哄鍣ㄦ垨鑰呮弧瀹瑰櫒鍒ゆ柇 ,濡傛灉鏄┖瀹瑰櫒 瀹瑰櫒鐗╂枡淇℃伅涓虹┖
+                            if (list[i].LocCntrRel != null)
+                            {
+                                //LogHelper.Info("itemCode=" + itemCode);
+                                if ((itemCode != null && list[i].LocCntrRel.CntrItemRel != null && list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE.Trim() == itemCode && list[i].LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() == itemBatch.Trim()) || (itemCode == null && list[i].LocCntrRel.CntrItemRel == null))
+                                {
+                                    if (list[i].N_CURRENT_NUM < list[i].N_CAPACITY)
+                                    {
+                                        //1.31 濡傛灉鎼繍鏁伴噺=1
+                                        //1.32 鎼繍澶氫釜瀹瑰櫒锛屼緥濡�+3妯″紡 锛屽繀椤诲綋鍓嶆暟閲�0鎴�;濡傛灉鏄�+3+锛屽繀椤诲綋鍓嶆暟閲�0鎴�鎴�
+                                        if (list[i].N_CURRENT_NUM % standardCarryQty == 0)
+                                        {
+                                            result = list[i];
+                                        }
+                                        else
+                                        {
+                                            //1.33 涓嶆弧瓒冲垯閫夋嫨鍚庝竴鍒楋紝鍚庝竴鍒楄偗瀹氭槸绌鸿揣浣�+                                            result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > list[i].N_COL).OrderBy(a => a.N_COL).First();
+                                        }
+                                    }
+                                    else
+                                    {
+                                        //褰撳墠璐т綅婊′簡锛屾瘮浠朿ol澶т竴浣嶇殑璐т綅锛屽悗涓�垪鑲畾鏄┖璐т綅
+                                        result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > list[i].N_COL).OrderBy(a => a.N_COL).First();
+                                    }
+
+                                    if (result != null)
+                                    {
+                                        break;
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                LogHelper.Info("璐т綅瀹瑰櫒鐗╂枡淇℃伅涓虹┖");
+                            }
+
+
+                            #endregion
+
+                        }
+                    }
+                }
+                if (result == null)
+                {
+                    //todo 杩橀渶瑕佸垽鏂攣
+                    #region 鏌ユ壘鎵�湁鏁伴噺鏄┖鐨勬帓
+                    //2.0 绠�寲鏌ヨ鍙煡姣忎竴鎺掔涓�垪
+                    list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList();
+                    //2.1 閫変竴涓┖鎺�+                    for (int i = 0; i < list.Count; i++)
+                    {
+                        if (list[i].S_LOCK_STATE.Trim() == "鏃�)
+                        {
+                            //浜屾鏍¢獙褰撳墠鎺掓墍鏈夎揣浣嶉兘鏄┖鐨勶紝闃叉绯荤粺鏁版嵁閿欎贡
+                            var rowSumInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                            if (rowSumInfo.sum == 0)
+                            {
+                                result = list[i];
+                                break;
+                            }
+                        }
+                    }
+                    #endregion
+                }
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine("GetLocation4In:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocation4In:" + ex.Message, ex);
+            }
+            return result;
+        }
+
+        internal static bool GetYiKuLocation(List<string> rowlist, WorkOrder WorkOrder, string BatchNo)
+        {
+            bool result = false;
+            string startbit = "";
+            string endbit = "";
+            string itemcode = "";
+            string batchNo = "";
+            int startley = 1;
+            int endley = 1;
+            var dic = new Dictionary<string, int>();
+            var strList = new List<string>();
+            //var intList = new List<int>();
+            var db = new SqlHelper<object>().GetInstance();
+            for (int i = 0; i < rowlist.Count(); i++)
+            {
+                string rowNo = rowlist[i];
+                var rowSum = db.Queryable<Location>().Where(a => a.N_ROW == rowNo && a.S_LOCK_STATE.Trim() != "鎶ュ簾").Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                dic.Add(rowNo, rowSum.sum);
+                strList.Add(rowNo);
+            }
+            LogHelper.Info($"灏嗘墍鏈夌殑鎺掓暟閲忔斁杩涘垪琛ㄨ繘琛屾帓搴�鍚勪釜鎺掓暟閲忎负{JsonConvert.SerializeObject(dic)}", "鑷姩绉诲簱");
+            for (int i = 0; i < strList.Count() - 1; i++)
+            {
+                for (int j = i + 1; j < strList.Count(); j++)
+                {
+                    int ts1 = 0;
+                    int ts2 = 0;
+                    dic.TryGetValue(strList[i], out ts1);
+                    dic.TryGetValue(strList[j], out ts2);
+
+                    if (ts1 > ts2)
+                    {
+                        string temp = strList[i];
+                        strList[i] = strList[j];
+                        strList[j] = temp;
+                    }
+                }
+            }
+            //LogHelper.Info($"鎺掑簭鍚庣殑鏁伴噺涓�{JsonConvert.SerializeObject(intList)}");
+            //for (int i = 0; i < intList.Count(); i++)
+            //{
+            //    string ts = "";
+            //    dic.TryGetValue(intList[i], out ts);
+            //    strList.Add(ts);
+            //}
+            LogHelper.Info($"閫氳繃鏁伴噺灏嗘帓鎻愬彇鍑烘潵 鎺掑彿鎺掑簭涓簕JsonConvert.SerializeObject(strList)}");
+            for (int i = 0; i < strList.Count(); i++)
+            {
+                string startrowNo = strList[i];
+                var start = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.N_ROW == startrowNo).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).First();
+                LogHelper.Info($"鍒ゆ柇璧风偣 璧风偣璐т綅缂栫爜={start.S_LOC_CODE} 鐗╂枡缂栫爜={start.LocCntrRel.CntrItemRel.S_ITEM_CODE} 鎵规鍙�{start.LocCntrRel.CntrItemRel.S_BATCH_NO}", "鑷姩绉诲簱");
+                for (int j = strList.Count() - 1; j > i; j--)
+                {
+                    string endrow = strList[j];
+                    var end = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.N_ROW == endrow).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).First();
+                    LogHelper.Info($"鍒ゆ柇缁堢偣 缁堢偣璐т綅缂栫爜={end.S_LOC_CODE} 鐗╂枡缂栫爜={end.LocCntrRel.CntrItemRel.S_ITEM_CODE} 鎵规鍙�{end.LocCntrRel.CntrItemRel.S_BATCH_NO}", "鑷姩绉诲簱");
+
+                    if (start.LocCntrRel.CntrItemRel.S_ITEM_CODE == end.LocCntrRel.CntrItemRel.S_ITEM_CODE && start.LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() == BatchNo && end.LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() == BatchNo)
+                    {
+                        itemcode = start.LocCntrRel.CntrItemRel.S_ITEM_CODE;
+                        batchNo = start.LocCntrRel.CntrItemRel.S_BATCH_NO;
+                        //鐗╂枡缂栫爜涓�牱鐨勬椂鍊欑‘璁よ捣鐐圭粓鐐�+                        if (end.N_CURRENT_NUM == end.N_CAPACITY)
+                        {
+                            //濡傛灉缁堢偣灞傛斁婊′簩灞�閫変笅涓�垪
+                            end = db.Queryable<Location>().Where(a => a.N_ROW == end.N_ROW && a.N_COL == end.N_COL + 1).First();
+                        }
+
+                    }
+                    else LogHelper.Info($"鐗╂枡缂栫爜涓嶅悓 鎴栨壒娆″彿寮傚父", "鑷姩绉诲簱");
+                }
+                if (!string.IsNullOrEmpty(startbit) && !string.IsNullOrEmpty(endbit))
+                {
+                    break;
+                }
+            }
+            if (result)
+            {
+                //鍒涘缓浠诲姟
+                var cntrList = LocationHelper.GetLocCntrRel(startbit);
+                if (cntrList.Count > 0)
+                {
+                    var trayInfo = new List<LocCntrRel>();
+                    string cntrs = "";
+                    trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(2).ToList();//鍙屾墭鍑哄簱
+                    trayInfo.ForEach(a => { cntrs = cntrs + "," + a.S_CNTR_CODE.Trim(); });
+                    var item = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrs.Split(',')[0]).First();
+                    if (item != null)
+                    {
+                        LogHelper.Info($"鑾峰彇鐗╂枡閰嶇疆 鐗╂枡={item.S_ITEM_CODE} 灞傛暟={item.S_ITEM_MODEL}", "鑷姩绉诲簱");
+                        var iteminfo = WCSHelper.GetItemrel(item.S_ITEM_CODE, item.S_ITEM_MODEL);
+                        DaMingShanCreateTransport(startbit, endbit, WorkOrder.S_ORDER_TYPE, cntrs, startley, endley, WorkOrder.S_PLineNo, 1, 1, int.Parse(iteminfo.S_ITEM_LAYER), WorkOrder.S_WorkNo, batchNo, itemcode);
+                    }
+
+                }
+                else
+                {
+                    LogHelper.Info($"鑾峰彇鎵樼洏寮傚父 鑷姩绉诲簱鑾峰彇涓嶅埌璧风偣鎵樼洏 璐т綅缂栫爜={startbit}", "鑷姩绉诲簱");
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 澶ф槑灞辫嚜鍔ㄧЩ搴�鍓旈櫎鎵�湁婊℃帓鍜岀┖鎺�+        /// </summary>
+        /// <param name="rowlist"></param>
+        internal static void ExcludeFullEmyRow(ref List<string> rowlist, string S_PLineNo)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            for (int i = 0; i < rowlist.Count; i++)
+            {
+                string rowNo = rowlist[i];
+                var rowSum = db.Queryable<Location>().Where(a => a.N_ROW == rowNo && a.S_LOCK_STATE.Trim() != "鎶ュ簾").Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                var MaxrowSum = db.Queryable<Location>().Where(a => a.N_ROW == rowNo && a.S_LOCK_STATE.Trim() != "鎶ュ簾").Select(a => new { sum = SqlFunc.AggregateSum(a.N_CAPACITY) }).First();
+                if (rowSum.sum == 0 || rowSum.sum == MaxrowSum.sum)
+                {
+                    //瑙i攣
+                    UnlockYiKu(rowNo);
+                    rowlist.Remove(rowNo);
+                    db.Deleteable<DaMingShanAnalysisMoveLib>().Where(a => a.DeviceName == S_PLineNo && a.RowNo == rowNo).ExecuteCommand();
+                }
+            }
+        }
+
+        internal static void ExcludeTaskRow(ref List<string> rowlist)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+
+        }
+
+        internal static void UnlockYiKu(string rowNo)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var lockinfo = db.Queryable<Location>().Where(a => a.N_ROW.Trim() == rowNo && a.S_LOCK_STATE.Trim() == "绉诲簱閿�).ToList();
+            if (lockinfo.Count > 0)
+            {
+                foreach (var item in lockinfo)
+                {
+                    item.S_LOCK_STATE = "鏃�;
+                    db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                }
+                TaskProcess.AreaRowLockState(rowNo, false);
+            }
+        }
+
+
+        internal static void LockYiKu(ref List<string> rowlist)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            for (int i = 0; i < rowlist.Count(); i++)
+            {
+                string rowNo = rowlist[i];
+                var lockinfo = db.Queryable<Location>().Where(a => a.N_ROW.Trim() == rowNo && a.S_LOCK_STATE.Trim() != "绉诲簱閿� && a.S_LOCK_STATE.Trim() != "鎶ュ簾" && a.S_LOCK_STATE.Trim() != "鏃�).First();
+                if (lockinfo == null)
+                {
+                    //濡傛灉娌℃湁绉诲簱閿侀渶閿佸畾鏁存帓璐т綅
+                    var YikuLockinfo = db.Queryable<Location>().Where(a => a.N_ROW.Trim() == rowNo && a.S_LOCK_STATE.Trim() == "绉诲簱閿�).ToList();
+                    if (YikuLockinfo.Count == 0)
+                    {
+                        //閿佸畾璇ユ帓
+                        var rowinfo = db.Queryable<Location>().Where(a => a.N_ROW.Trim() == rowNo).ToList();
+                        foreach (var item in rowinfo)
+                        {
+                            if (item.S_LOCK_STATE.Trim() != "鎶ュ簾")
+                            {
+                                item.S_LOCK_STATE = "绉诲簱閿�;
+                                db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand();
+                            }
+                        }
+                        TaskProcess.AreaRowLockState(rowNo);
+                    }
+                }
+                else
+                {
+                    rowlist.Remove(rowNo);
+                }
+            }
+
+        }
+
+
+        /// <summary>
+        /// 鍒ゆ柇浠诲姟琛ㄦ槸鍚﹀瓨鍦ㄥ綋鍓嶅簱鍖轰互鍙婂綋鍓嶅簱浣嶆湭瀹屾垚鐨勪换鍔�   鍧囧彇璐у畬鎴�true  鍙嶄箣-false
+        /// </summary>
+        /// <param name="AreaNo"></param>
+        /// <param name="RowNo"></param>
+        /// <param name="UnStart">true:浣滀负 璧风偣鍒ゆ柇 false:浣滀负缁堢偣鍒ゆ柇</param>
+        /// <returns></returns>
+        public static bool TaskTakeAreaOver2(List<string> rowlist)
+        {
+            bool result = true;
+            var db = new SqlHelper<object>().GetInstance();
+
+            var taskInfo = db.Queryable<WMSTask>().Where(a => a.S_TYPE.Trim() == "鑷姩绉诲簱" && a.S_B_STATE.Trim() != "瀹屾垚" && a.S_B_STATE.Trim() != "澶辫触" && a.S_B_STATE.Trim() != "鍙栨秷").OrderByDescending(a => a.T_CREATE).ToList();//WmsTaskAction
+            if (taskInfo.Count() > 0)
+            {
+                for (int i = 0; i < rowlist.Count; i++)
+                {
+                    string RowNo = rowlist[i];
+                    taskInfo.ForEach(it =>
+                    {
+                        //璧风偣灞炰簬 鏌ヨ搴撲綅 鍐咃紱鍗�鍒ゆ柇 姝や换鍔℃槸鍚︽湁鍙栬揣瀹屾垚
+                        var locInfo = db.Queryable<Location>().Where(a => a.N_ROW == RowNo && (a.S_LOC_CODE == it.S_START_LOC.Trim() || a.S_LOC_CODE == it.S_END_LOC.Trim())).First();
+                        if (locInfo != null)
+                        {
+                            result = false;
+                        }
+                    });
+                }
+            }
+            return result;
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鍜岀墿鏂欒幏鍙栧嚭搴撶殑璐т綅锛堝爢鍙犲厛鑰冭檻鏍囧噯鐨勶紝瀹归噺閮芥槸涓�牱鐨勶紝渚嬪鍧囧窞閮芥槸3+3锛涗笉鑰冭檻宄ㄧ湁灞遍潪鏍�+2鍜�+1鍚屾椂瀛樺湪锛�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        /// <returns></returns>
+        public static Location GetLocation4Out(string area, string itemCode, string itemBatch, int standardCarryQty = 1)
+        {
+            //Console.WriteLine($"area={area}");
+            Location result = null;
+            var db = new SqlHelper<Location>().GetInstance();
+
+            //1.0 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM>0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList();
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+            //1.1 鍒ゆ柇褰撳墠鏁伴噺鏄笉鏄弧鐨勶紝濡傛灉鏄弧鐨勫苟涓旀槸鏈�ぇ鍒楋紝闇�鎺掗櫎
+            if (list.Count > 0)
+            {
+                //LogHelper.Info("GetLocation4Out:" + JsonConvert.SerializeObject(list));
+                #region MyRegion
+                /*
+                      //1.21 鍔犺浇璐т綅鐨勫鍣ㄤ俊鎭�+                      db.ThenMapper(list, loc => {
+                          loc.LocCntrRel = db.Queryable<LocCntrRel>().SetContext(x => x.S_LOC_CODE, () => loc.S_LOC_CODE, loc).FirstOrDefault();
+                      });
+                      //1.22 鍔犺浇瀹瑰櫒鐨勭墿鏂欎俊鎭�+                      db.ThenMapper(list.Select(loc => loc.LocCntrRel), lcr => {
+                          lcr.CntrItemRel = db.Queryable<CntrItemRel>().SetContext(x => x.S_CNTR_CODE, () => lcr.S_CNTR_CODE, lcr).FirstOrDefault();
+                      });
+                      */
+                #endregion
+                //1.3 閬嶅巻鍒ゆ柇鐗╂枡绫诲瀷鏄惁鐩稿悓
+                for (int i = 0; i < list.Count; i++)
+                {
+
+                    //todo 杩橀渶瑕佸垽鏂攣
+
+                    #region 绌哄鍣ㄦ垨鑰呮弧瀹瑰櫒鍒ゆ柇 ,濡傛灉鏄┖瀹瑰櫒 瀹瑰櫒鐗╂枡淇℃伅涓虹┖
+                    if (list[i].S_LOCK_STATE.Trim() == "鏃� && list[i].LocCntrRel != null)
+                    {
+                        if ((itemCode != null && list[i].LocCntrRel.CntrItemRel != null && list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE.Trim() == itemCode && (itemBatch == null || list[i].LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() == itemBatch.Trim())) || (itemCode == null && list[i].LocCntrRel.CntrItemRel == null))
+                        {
+                            //鎼繍閫夋嫨璐т綅
+                            //濡傛灉褰撳墠鍑哄簱浣嶅悗闈㈡湁绌轰綅锛屼笉鑳芥槸鍏ュ簱涓�+                            var after = new SqlHelper<Location>().Get(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL == list[i].N_COL + 1);
+                            if (after == null || after.S_LOCK_STATE.Trim() == "鏃�)
+                            {
+                                result = list[i];
+                            }
+                            if (result != null)
+                            {
+                                break;
+                            }
+                        }
+                    }
+
+
+                    #endregion
+
+                }
+            }
+
+            return result;
+        }
+
+
+
+
+
+        /// <summary>
+        /// 鍒濆鍖栧瘑闆嗘帓閿佽〃鏍�+        /// </summary>
+        public static void InitRowLockTable(List<string> areas)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var listRowLocks = db.Queryable<RowLock>().ToList();
+            areas.ForEach(a =>
+            {
+                var list = db.Queryable<Location>().Where(l => l.S_AREA_CODE == a).Distinct().Select(it => it.N_ROW).ToList();
+                list.ForEach(r =>
+                {
+                    if (listRowLocks.Count(d => d.S_AREA_CODE.Trim() == a && d.N_ROW == r) == 0)
+                    {
+                        var res = db.Insertable<RowLock>(new RowLock { N_ROW = r, S_AREA_CODE = a, S_LOCK_STATE = "鏃�, S_LOCK_SRC = "", S_WORK_MODE = "姝e父" }).ExecuteCommand();
+                    }
+                });
+            });
+        }
+
+        internal static void Test()
+        {
+            //UnLockLoc("PGKQ-02-02");
+            //LockLoc("PGKQ-02-02", "鍏ュ簱閿�);
+            //Binding("PGKQ-02-03", "AAA", "", 3);
+            //UnBinding("PGKQ-02-03", 2);
+
+            //var full = GetLocation4In("PGKQ", "AAA");
+            //var empty = GetLocation4In("PGKQ", null);
+            //var fullOut = GetLocation4Out("PGKQ", "AAA");
+            //var emptyOut = GetLocation4Out("PGKQ", null);
+            //var Locations = new SqlHelper<Location>().GetList();
+            //var LocCntrRels = new SqlHelper<LocCntrRel>().GetList();
+            //var CntrItemRels = new SqlHelper<CntrItemRel>().GetList();
+
+            //var list = new SqlHelper<Location>().GetInstance().Queryable<Location>().LeftJoin<LocCntrRel>((l, lc) => l.S_LOC_CODE == lc.S_LOC_CODE).ToList();
+            //var results = context.Client.Queryable<Employee>().Mapper(t=>t.Person, p=>p.PersonId).ToList();
+            var db = new SqlHelper<object>().GetInstance();
+
+            //var list = db.Queryable<Location>().Mapper(l => l.LocCntrRel, lcr => lcr.S_LOC_CODE).Where(a=>a.S_LOC_CODE== "PGKQ-01-01").ToList();
+
+            //澶氱骇鏌ヨ浼氬祵濂�闇�鎸囧畾瀵艰埅灞炴�鍜屼富閿紝寰幆宓屽鏌ヨ涓嶅缓璁�+            //[Navigate(NavigateType.OneToOne, nameof(S_LOC_CODE))]銆�[Navigate(NavigateType.OneToOne, nameof(S_CNTR_CODE))]銆乕SugarColumn(IsPrimaryKey = true)]
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList();
+
+            #region MyRegion
+            /*
+            // SetContext涓嶄細鐢熸垚寰幆鎿嶄綔锛岄珮鎬ц兘  鍜岀洿鎺here鎬ц兘鏄笉涓�牱鐨�+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0).ToList();
+            //绗竴灞�+            db.ThenMapper(list, loc => {
+                loc.LocCntrRel = db.Queryable<LocCntrRel>().SetContext(x => x.S_LOC_CODE, () => loc.S_LOC_CODE, loc).FirstOrDefault();
+            });
+            //绗簩灞�+            db.ThenMapper(list.Select(loc => loc.LocCntrRel), lcr => {
+                lcr.CntrItemRel = db.Queryable<CntrItemRel>().SetContext(x => x.S_CNTR_CODE, () => lcr.S_CNTR_CODE, lcr).FirstOrDefault();
+            }); 
+            */
+            #endregion
+        }
+
+
+
+
+        #region   娣冲畨鍑哄叆搴撶畻娉�+
+
+
+        /// <summary>
+        /// 绉诲簱鍑哄叆搴撳鐞�+        /// </summary>
+        /// <param name="startArea"></param>
+        /// <param name="endArea"></param>
+        /// <param name="startRow"></param>
+        /// <param name="endRow"></param>
+        /// <param name="taskType"></param>
+        /// <param name="itemCode"></param>
+        /// <param name="batchNo"></param>
+        /// <param name="itemLayer"></param>
+        /// <returns></returns>
+        internal static bool DaMingShanYiKuTask(string startArea, string endArea, string startRow, string endRow, string taskType, string itemCode = "", string batchNo = "", string itemLayer = "", string workNo = "")
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            var endLocation = new Location();
+            try
+            {
+                var startLocation = GetYiKuLocationOut(startArea, startRow, itemCode, batchNo, itemLayer);
+                if (startLocation != null && !string.IsNullOrEmpty(startLocation.S_LOC_CODE))
+                    endLocation = GetYiKuLocationIn(endArea, endRow, itemCode, batchNo, 1, itemLayer, startLocation.S_LOC_CODE.Trim());
+                //else //Console.WriteLine($"{workNo}:绉诲簱澶勭悊寮傚父锛氭湭鑾峰彇鍒板嚭搴撹捣鐐逛俊鎭紒");
+                if (startLocation != null && endLocation != null && startLocation.S_LOCK_STATE.Trim() == "绉诲簱閿� && endLocation.S_LOCK_STATE.Trim() == "绉诲簱閿�)
+                {
+                    LogHelper.Info($"浜哄伐绉诲簱 绠楁硶缁撴潫鑾峰彇鐐逛綅鎴愬姛");
+                    var startLayer = startLocation.N_CURRENT_NUM;
+                    var endLayer = endLocation.N_CURRENT_NUM + 1;
+                    var taskNo = DateTime.Now.Ticks.ToString();
+                    //鍑哄簱瑕佷粠璧风偣鑾峰彇鎵樼洏
+                    var cntrList = LocationHelper.GetLocCntrRel(startLocation.S_LOC_CODE.Trim());
+                    LogHelper.Info($"浜哄伐绉诲簱 鑾峰彇鎵樼洏鏁伴噺={cntrList.Count()}");
+                    //娣冲畨涓や釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+                    if (cntrList.Count > 0)
+                    {
+                        var trayInfo = new List<LocCntrRel>();
+                        string cntrs = "";
+                        if (cntrList.Count % 2 == 0) trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(2).ToList();//鍙屾墭鍑哄簱
+                        else trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(1).ToList();//鍗曟墭鍑哄簱
+                        trayInfo.ForEach(a => { cntrs = cntrs + "," + a.S_CNTR_CODE.Trim(); });
+                        var cntr = trayInfo[0].S_CNTR_CODE;
+
+                        var iteminfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntr).First();
+                        if (iteminfo != null)
+                        {
+
+                            var cntrtype = db.Queryable<ItemArea>().Where(a => a.S_AREA_CODE == startArea).First();
+
+                            var info = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == iteminfo.S_ITEM_CODE && a.S_ITEM_MODEL == iteminfo.S_ITEM_MODEL).First();
+
+                            result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, endLocation.S_LOC_CODE, taskType, cntrs, startLayer, endLayer, cntrList[0].S_SRC, 1, 1, int.Parse(info.S_ITEM_LAYER), workNo, batchNo, itemCode, cntrtype.S_TRAY_TYPE);
+                        }
+                    }
+                    else
+                    {
+                        //Console.WriteLine($"璧风偣鎵樼洏鏁伴噺鍜岃揣浣嶅鍣ㄨ〃涓嶇鍚堬紝璇锋鏌ャ�璐т綅琛ㄣ�鍜屻�璐т綅瀹瑰櫒琛ㄣ�");
+                        LogHelper.Info($"璧风偣鎵樼洏鏁伴噺鍜岃揣浣嶅鍣ㄨ〃涓嶇鍚堬紝璇锋鏌ャ�璐т綅琛ㄣ�鍜屻�璐т綅瀹瑰櫒琛ㄣ�", "WMSAlgoRithm");
+                    }
+                }
+                else
+                {
+                    string lockStart = "";
+                    string lockEnd = "";
+                    string lockTaskNo = "";
+                    if (startLocation != null && startLocation.S_LOCK_STATE.Trim() != "鏃�) lockStart = startLocation.N_ROW.Trim();
+                    if (endLocation != null && endLocation.S_LOCK_STATE.Trim() != "鏃�) lockEnd = endLocation.N_ROW.Trim();
+                    //var db = new SqlHelper<object>().GetInstance();
+                    if (!string.IsNullOrEmpty(lockStart))
+                    {
+                        var taskInfo = db.Queryable<WMSTask>().Where(a => (a.S_START_LOC == lockStart || a.S_END_LOC == lockStart) && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触").OrderByDescending(a => a.T_CREATE).First();
+                        if (taskInfo != null) lockTaskNo = lockTaskNo + taskInfo.S_TASK_NO.Trim() + ",";
+                    }
+                    if (!string.IsNullOrEmpty(lockEnd))
+                    {
+                        var taskInfo = db.Queryable<WMSTask>().Where(a => (a.S_START_LOC == lockEnd || a.S_END_LOC == lockEnd) && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触").OrderByDescending(a => a.T_CREATE).First();
+                        if (taskInfo != null) lockTaskNo = lockTaskNo + taskInfo.S_TASK_NO.Trim() + ",";
+                    }
+                    //Console.WriteLine($"{workNo}:绉诲簱澶勭悊--璧风偣鎴栫粓鐐瑰簱浣嶈閿佸畾锛侀攣瀹氫换鍔″彿锛歿lockTaskNo}");
+                    LogHelper.Info($"{workNo}:绉诲簱澶勭悊--璧风偣鎴栫粓鐐瑰簱浣嶈閿佸畾锛侀攣瀹氫换鍔″彿锛歿lockTaskNo}", "WMSAlgoRithm");
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"浜哄伐绉诲簱绠楁硶寮傚父 寮傚父淇℃伅={ex.Message}");
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 澶囪揣绉诲簱鍑哄叆搴撳鐞�+        /// </summary>
+        /// <param name="startArea"></param>
+        /// <param name="endArea"></param>
+        /// <param name="startRow"></param>
+        /// <param name="endRow"></param>
+        /// <param name="taskType"></param>
+        /// <param name="itemCode"></param>
+        /// <param name="batchNo"></param>
+        /// <param name="itemLayer"></param>
+        /// <returns></returns>
+        internal static bool DaMingShanYiKuTask1(string startArea, string endArea, string startRow, string endRow, string taskType, string workNo = "")
+        {
+            string itemcode = "";
+            bool result = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var endLocation = new Location();
+            try
+            {
+                var startLocation = GetYiKuLocationOut(startArea, startRow);
+                if (startLocation != null && !string.IsNullOrEmpty(startLocation.S_LOC_CODE))
+                {
+
+                    itemcode = LocationHelper.GetCntrItemRel(startLocation.S_LOC_CODE);
+                    endLocation = GetYiKuLocationIn1(endArea, endRow, itemcode);
+                }
+                //else //Console.WriteLine($"{workNo}:绉诲簱澶勭悊寮傚父锛氭湭鑾峰彇鍒板嚭搴撹捣鐐逛俊鎭紒");
+                if (startLocation != null && endLocation != null && startLocation.S_LOCK_STATE.Trim() == "绉诲簱閿� && endLocation.S_LOCK_STATE.Trim() == "绉诲簱閿�)
+                {
+
+                    LogHelper.Info($"澶囪揣绉诲簱 绠楁硶缁撴潫鑾峰彇鐐逛綅鎴愬姛");
+                    var startLayer = startLocation.N_CURRENT_NUM;
+                    var endLayer = endLocation.N_CURRENT_NUM + 1;
+                    var taskNo = DateTime.Now.Ticks.ToString();
+                    //鍑哄簱瑕佷粠璧风偣鑾峰彇鎵樼洏
+                    var cntrList = LocationHelper.GetLocCntrRel(startLocation.S_LOC_CODE.Trim());
+                    LogHelper.Info($"澶囪揣绉诲簱 鑾峰彇鎵樼洏鏁伴噺={cntrList.Count()}");
+                    //娣冲畨涓や釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+                    if (cntrList.Count > 0)
+                    {
+                        var trayInfo = new List<LocCntrRel>();
+                        string cntrs = "";
+                        if (cntrList.Count % 2 == 0) trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(2).ToList();//鍙屾墭鍑哄簱
+                        else trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(1).ToList();//鍗曟墭鍑哄簱
+
+                        trayInfo.ForEach(a => { cntrs = cntrs + "," + a.S_CNTR_CODE.Trim(); });
+
+                        var iteminfo = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrs.Split(',')[0]).First();
+                        if (iteminfo != null)
+                        {
+                            var info = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == iteminfo.S_ITEM_CODE && a.S_ITEM_MODEL == iteminfo.S_ITEM_MODEL).First();
+                            result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, endLocation.S_LOC_CODE, taskType, cntrs, startLayer, endLayer, "", 1, 1, int.Parse(info.S_ITEM_LAYER), workNo, "", itemcode);
+
+                        }
+                    }
+                    else
+                    {
+                        //Console.WriteLine($"璧风偣鎵樼洏鏁伴噺鍜岃揣浣嶅鍣ㄨ〃涓嶇鍚堬紝璇锋鏌ャ�璐т綅琛ㄣ�鍜屻�璐т綅瀹瑰櫒琛ㄣ�");
+                        LogHelper.Info($"璧风偣鎵樼洏鏁伴噺鍜岃揣浣嶅鍣ㄨ〃涓嶇鍚堬紝璇锋鏌ャ�璐т綅琛ㄣ�鍜屻�璐т綅瀹瑰櫒琛ㄣ�", "WMSAlgoRithm");
+                    }
+
+                }
+                else
+                {
+                    string lockStart = "";
+                    string lockEnd = "";
+                    string lockTaskNo = "";
+                    if (startLocation != null && startLocation.S_LOCK_STATE.Trim() != "鏃�) lockStart = startLocation.N_ROW.Trim();
+                    if (endLocation != null && endLocation.S_LOCK_STATE.Trim() != "鏃�) lockEnd = endLocation.N_ROW.Trim();
+                    //var db = new SqlHelper<object>().GetInstance();
+                    if (!string.IsNullOrEmpty(lockStart))
+                    {
+                        var taskInfo = db.Queryable<WMSTask>().Where(a => (a.S_START_LOC == lockStart || a.S_END_LOC == lockStart) && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触").OrderByDescending(a => a.T_CREATE).First();
+                        if (taskInfo != null) lockTaskNo = lockTaskNo + taskInfo.S_TASK_NO.Trim() + ",";
+                    }
+                    if (!string.IsNullOrEmpty(lockEnd))
+                    {
+                        var taskInfo = db.Queryable<WMSTask>().Where(a => (a.S_START_LOC == lockEnd || a.S_END_LOC == lockEnd) && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "澶辫触").OrderByDescending(a => a.T_CREATE).First();
+                        if (taskInfo != null) lockTaskNo = lockTaskNo + taskInfo.S_TASK_NO.Trim() + ",";
+                    }
+                    //Console.WriteLine($"{workNo}:绉诲簱澶勭悊--璧风偣鎴栫粓鐐瑰簱浣嶈閿佸畾锛侀攣瀹氫换鍔″彿锛歿lockTaskNo}");
+                    LogHelper.Info($"{workNo}:绉诲簱澶勭悊--璧风偣鎴栫粓鐐瑰簱浣嶈閿佸畾锛侀攣瀹氫换鍔″彿锛歿lockTaskNo}", "WMSAlgoRithm");
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Info($"澶囪揣绉诲簱绠楁硶寮傚父 寮傚父淇℃伅={ex.Message}");
+            }
+            return result;
+        }
+
+
+        /// <summary>
+        /// 鍒ゆ柇浠诲姟琛ㄦ槸鍚﹀瓨鍦ㄥ綋鍓嶅簱鍖轰互鍙婂綋鍓嶅簱浣嶆湭瀹屾垚鐨勪换鍔�   鍧囧彇璐у畬鎴�true  鍙嶄箣-false
+        /// </summary>
+        /// <param name="AreaNo"></param>
+        /// <param name="RowNo"></param>
+        /// <param name="UnStart">true:浣滀负 璧风偣鍒ゆ柇 false:浣滀负缁堢偣鍒ゆ柇</param>
+        /// <returns></returns>
+        public static bool TaskTakeAreaOver(string AreaNo, string RowNo, bool UnStart = true, bool CmWork = true)
+        {
+            bool result = true;
+            var db = new SqlHelper<object>().GetInstance();
+            if (UnStart)
+            {
+                var taskInfo = db.Queryable<WMSTask>().Where(a => a.S_START_LAREA == AreaNo && a.S_B_STATE.Trim() != "瀹屾垚" && a.S_B_STATE.Trim() != "澶辫触" && a.S_B_STATE.Trim() != "鍙栨秷").OrderByDescending(a => a.T_CREATE).ToList();//WmsTaskAction
+                if (taskInfo.Count() > 0)
+                {
+                    taskInfo.ForEach(it =>
+                    {
+                        //璧风偣灞炰簬 鏌ヨ搴撲綅 鍐咃紱鍗�鍒ゆ柇 姝や换鍔℃槸鍚︽湁鍙栬揣瀹屾垚
+                        var locInfo = db.Queryable<Location>().Where(a => a.N_ROW == RowNo && a.S_LOC_CODE == it.S_START_LOC.Trim()).First();
+                        if (locInfo != null)
+                        {
+                            if (CmWork)
+                            {
+                                //闈炵紶鑶滅Щ搴撳伐鍗� 鎵ц涓换鍔℃湭鍙栬揣瀹屾垚 涓嶅厑璁镐娇鐢ㄥ綋鍓嶅簱浣�+                                var taskAction = db.Queryable<WmsTaskAction>().Where(a => a.S_ACTION_CODE == "4" && a.S_TASK_NO == it.S_TASK_NO).First();
+                                if (taskAction == null) result = false;
+                            }
+                        }
+                    });
+                }
+            }
+            else
+            {
+                var taskInfo = db.Queryable<WMSTask>().Where(a => a.S_END_LAREA == AreaNo && a.S_B_STATE.Trim() != "瀹屾垚" && a.S_B_STATE.Trim() != "澶辫触" && a.S_B_STATE.Trim() != "鍙栨秷").OrderByDescending(a => a.T_CREATE).ToList();//WmsTaskAction
+                taskInfo.ForEach(it =>
+                {
+                    //缁堢偣鏌ヨ  鍙湁 姝ゅ簱浣�鏈変竴鏉�浠诲姟鏈畬鎴愶紝鍗�杩斿洖false锛屼笉鍙娇鐢�+                    var locInfo = db.Queryable<Location>().Where(a => a.N_ROW == RowNo && a.S_LOC_CODE == it.S_END_LOC.Trim()).First();
+                    if (locInfo != null)
+                    {
+                        //Console.WriteLine($"绉诲簱浠诲姟鍒ゆ柇缁堢偣搴撲綅鏄惁鍙敤锛氬綋鍓嶄换鍔℃湭瀹屾垚锛屼换鍔″彿锛歿it.S_TASK_NO.Trim()}");
+                        result = false;
+                    }
+                });
+            }
+
+            return result;
+        }
+
+
+        /// <summary>
+        /// 鍒涘缓鎼繍浠诲姟
+        /// </summary>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="taskType"></param>
+        /// <param name="cntrs"></param>
+        /// <param name="startLayer"></param>
+        /// <param name="endLayer"></param>
+        /// <param name="trayCarryCount"></param>
+        /// <param name="priority"></param>
+        /// <returns></returns>
+        public static bool ChunAnCreateTransport(string start, string end, string taskType, string cntrs, int startLayer, int endLayer, string deviceName, int trayCarryCount = 1, int priority = 1, int itemLayer = 5, string workNo = "")
+        {
+            var result = false;
+            var taskNo = DateTime.Now.Ticks.ToString();
+            var res = TaskHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, cntrs, trayCarryCount, startLayer, endLayer, itemLayer, workNo);
+            if (res)
+            {
+                result = true;
+                //浠诲姟鍒涘缓鎴愬姛锛岃捣鐐硅揣浣嶅嚭搴撻攣瀹氾紝缁堢偣璐т綅鍏ュ簱閿佸畾
+                LocationHelper.LockLoc(start, "鍑哄簱閿�);
+                LocationHelper.LockLoc(end, "鍏ュ簱閿�);
+
+                //鎺掗攣瀹�+                var db = new SqlHelper<object>().GetInstance();
+                var Sinfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == start).First();
+                var Einfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE == end).First();
+                if (Sinfo != null && Einfo != null)
+                {
+                    string startRow = string.IsNullOrEmpty(Sinfo.N_ROW) ? "" : Sinfo.N_ROW.Trim();
+                    string sArea = string.IsNullOrEmpty(Sinfo.S_AREA_CODE) ? "" : Sinfo.S_AREA_CODE;
+                    string endRow = string.IsNullOrEmpty(Einfo.N_ROW) ? "" : Einfo.N_ROW.Trim();
+                    string eArea = string.IsNullOrEmpty(Einfo.S_AREA_CODE) ? "" : Einfo.S_AREA_CODE;
+                    LockRow(startRow, endRow, sArea, eArea, taskType);
+                    //if (taskType == "鎴愬搧涓嬬嚎")
+                    //{
+                    //    //鎴愬搧涓嬬嚎 浠诲姟绫诲瀷锛岄渶瑕佸湪缁堢偣搴撲綅鏍囪涓嬬嚎浜х嚎锛岀敤浜�浜х嚎宸ュ崟缁撴潫锛岃繘琛岃嚜鍔ㄧЩ搴�+                    //    SignRow(deviceName, endRow, eArea);
+                    //    //鎴愬搧涓嬬嚎浠诲姟鐢熶骇鎴愬姛  鍒犻櫎璁惧涓嬬嚎鏃堕棿鏁版嵁
+                    //    db.Deleteable<ChunAnDeviceState>().Where(a => a.DeviceName.Trim() == deviceName).ExecuteCommand();
+                    //}
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鍜岀墿鏂欒幏鍙栧叆搴撶殑璐т綅锛堝爢鍙犲厛鑰冭檻鏍囧噯鐨勶紝瀹归噺閮芥槸涓�牱鐨勶紝渚嬪鍧囧窞閮芥槸3+3锛涗笉鑰冭檻宄ㄧ湁灞遍潪鏍�+2鍜�+1鍚屾椂瀛樺湪锛�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location GetLocationIn(string area, string itemCode, string itemBatch, string deviceName, string itemLayer)
+        {
+            LogHelper.Info($"鍏ュ簱绠楁硶寮�", "杈撻�绾�);
+            Location result = null;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                //var info = Settings.GetDaMingShanItemNameList().Where(a => a.ItemName == itemCode).FirstOrDefault();
+                var info = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == itemCode && a.S_ITEM_MODEL == itemLayer).First();
+                if (info != null)
+                {
+                    LogHelper.Info("鑾峰彇鍒扮墿鏂欑紪鐮侀厤缃枃浠�, "杈撻�绾�);
+                    //1.0 鑾峰彇姣忎竴鎺掓渶澶х殑鍒�+                    //1.1 鍒ゆ柇褰撳墠鏁伴噺鏄笉鏄弧鐨勶紝濡傛灉鏄弧鐨勫苟涓旀槸鏈�ぇ鍒楋紝闇�鎺掗櫎
+                    var listMaxCol = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+                    //1.1 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�
+                    var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).OrderBy(a => a.N_OROW).Take(1).PartitionBy(a => a.N_ROW).ToList();
+                    if (list.Count > 0)
+                    {
+                        var time = DateTime.Now;
+                        for (int i = list.Count - 1; i >= 0; i--)
+                        {
+                            //鎺掗櫎宸茬粡閿佸畾鐨勮揣浣�鍜�鏀炬弧浜嗕笖鏄渶澶у垪鐨勮揣浣�      N_CAPACITY-璐т綅鏈�ぇ瀹归噺
+                            //鎺掗櫎宸查攣瀹氱殑鎺�+                            var rowInfo = db.Queryable<Location>().Where(a => a.N_ROW == list[i].N_ROW && a.S_LOCK_STATE.Trim() != "鏃� && a.S_LOCK_STATE.Trim() != "鎶ュ簾").ToList();
+                            if (list[i].S_LOCK_STATE.Trim() != "鏃� || rowInfo.Count() > 0 || (list[i].N_CURRENT_NUM == list[i].N_CAPACITY && listMaxCol.Count(a => a.S_LOC_CODE.Trim() == list[i].S_LOC_CODE.Trim()) > 0))
+                            {
+                                list.Remove(list[i]);
+                            }
+                        }
+                        var sum = DateTime.Now - time;
+                        LogHelper.Info($"搴撳尯={area}鍓旈櫎鎺�浣跨敤鏃堕棿={sum.TotalMilliseconds}");
+                        var time1 = DateTime.Now;
+                        if (list.Count > 0)
+                        {
+                            LogHelper.Info($"鏈夎揣鐗╃殑鎺掓暟閲�{list.Count}");
+                            //1.3 閬嶅巻鍒ゆ柇鐗╂枡绫诲瀷鏄惁鐩稿悓
+                            for (int i = 0; i < list.Count; i++)
+                            {
+                                //todo 杩橀渶瑕佸垽鏂攣
+                                #region 绌哄鍣ㄦ垨鑰呮弧瀹瑰櫒鍒ゆ柇 ,濡傛灉鏄┖瀹瑰櫒 瀹瑰櫒鐗╂枡淇℃伅涓虹┖
+                                if (list[i].LocCntrRel != null)
+                                {
+                                    LogHelper.Info($"璐т綅瀹瑰櫒鏁版嵁={JsonConvert.SerializeObject(list[i].LocCntrRel)}");
+                                    LogHelper.Info($"瀹瑰櫒璐у搧鏁版嵁={JsonConvert.SerializeObject(list[i].LocCntrRel.CntrItemRel)}");
+                                    //var oldinfo = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE && a.S_ITEM_MODEL == list[i].LocCntrRel.CntrItemRel.S_ITEM_MODEL).First();
+
+                                    LogHelper.Info($"鍒ゆ柇鐗╂枡鏄惁婊¤冻鏉′欢 Location={list[i].S_LOC_CODE} itemCode=" + itemCode, "杈撻�绾�);
+                                    //姝ゅ闇�鍒ゆ柇褰撳墠婊℃墭璐т綅鎵规鍙蜂笌鍗冲皢涓嬬嚎鐨勬壒娆″彿鏄惁鐩稿悓锛屼笉鍚岄渶瑕佸啀寰�悗鏌ヤ竴涓揣浣�+                                    //璐т綅-璐т綅鎵樼洏-鎵樼洏鐗╂枡锛堟壒娆″彿锛�+                                    if ((itemCode != null && list[i].LocCntrRel.CntrItemRel != null))
+                                    {
+                                        LogHelper.Info($"olditemcode={list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE.Trim()}", "杈撻�绾�);
+                                        //鐩稿悓鐗╂枡 鐩稿悓鎵规
+                                        //oldinfo = Settings.GetDaMingShanItemNameList().Where(a => a.ItemName == list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE.Trim()).FirstOrDefault();
+                                        //if (oldinfo != null)
+                                        //{
+                                        //LogHelper.Info($"绔欑偣{list[i].S_LOC_CODE} 鐗╂枡閰嶇疆 鐗╂枡缂栫爜={oldinfo.S_ITEM_CODE} 灞傛暟={oldinfo.S_ITEM_MODEL}", "杈撻�绾�);
+                                        //if (oldinfo.Package != info.Package)
+                                        //{
+                                        //    return result;
+                                        //}
+                                        if (itemCode.Trim() == list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE.Trim()
+                                            && list[i].LocCntrRel.S_SRC.Trim() == deviceName
+                                            && list[i].LocCntrRel.CntrItemRel.S_ITEM_MODEL.Trim() == itemLayer.Trim()
+                                            && list[i].LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() == itemBatch.Trim()
+                                            )
+                                        {
+                                            //if (list[i].LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() == itemBatch.Trim())
+                                            //{
+                                            if (list[i].N_CURRENT_NUM < list[i].N_CAPACITY)
+                                            {
+                                                string locCode = list[i].S_LOC_CODE.Trim();
+                                                var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == locCode).ToList();
+                                                if (trayInfo.Count() % 2 == 0)
+                                                {
+                                                    result = list[i];
+                                                }
+                                                else
+                                                {
+                                                    //1.33 涓嶆弧瓒冲垯閫夋嫨鍚庝竴鍒楋紝鍚庝竴鍒楄偗瀹氭槸绌鸿揣浣�+                                                    var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > list[i].N_COL).OrderBy(a => a.N_COL).First();
+                                                    if (locinfo != null)
+                                                    {
+                                                        result = locinfo;
+                                                    }
+                                                }
+                                            }
+                                            else
+                                            {
+                                                //褰撳墠璐т綅婊′簡锛屾瘮浠朿ol澶т竴浣嶇殑璐т綅锛屽悗涓�垪鑲畾鏄┖璐т綅
+                                                var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > list[i].N_COL).OrderBy(a => a.N_COL).First();
+                                                if (locinfo != null)
+                                                {
+                                                    result = locinfo;
+                                                }
+                                            }
+                                            //}
+                                            //else
+                                            //{
+                                            //    var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == list[i].N_ROW && a.N_COL > (list[i].N_COL + 1)).OrderBy(a => a.N_COL).First();
+                                            //    if (locinfo != null)
+                                            //    {
+                                            //        result = locinfo;
+                                            //    }
+                                            //}
+                                            if (result != null) break;
+                                        }
+                                    }
+                                }
+                                else LogHelper.Info("璐т綅瀹瑰櫒鐗╂枡淇℃伅涓虹┖", "杈撻�绾�);
+                                #endregion
+                            }
+                        }
+                        var sum1 = DateTime.Now - time1;
+                        LogHelper.Info($"搴撳尯={area}婊℃帓绠楁硶 浣跨敤鏃堕棿={sum1.TotalMilliseconds}");
+                    }
+                    if (result == null)
+                    {
+                        list = new List<Location>();
+                        var time2 = DateTime.Now;
+                        //todo 杩橀渶瑕佸垽鏂攣
+                        #region 鏌ユ壘鎵�湁鏁伴噺鏄┖鐨勬帓
+                        //2.0 绠�寲鏌ヨ鍙煡姣忎竴鎺掔涓�垪
+                        LogHelper.Info("鍒ゆ柇绌烘帓鏄惁婊¤冻鏉′欢", "杈撻�绾�);
+                        //list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderBy(a => a.N_COL).PartitionBy(a => a.N_ROW).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList();
+                        //list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).ToList().Where(a => a.N_CURRENT_NUM == 0).ToList();
+
+                        //鎵惧嚭搴撳尯鎵�湁鎺�绛涢�鎵�湁鏁伴噺涓虹┖鐨勬帓鏀惧叆闆嗗悎
+                        var emylist = new List<string>();
+                        list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).OrderBy(a => a.N_OROW).Take(1).PartitionBy(a => a.N_OROW).ToList();
+                        for (int i = 0; i < list.Count(); i++)
+                        {
+                            var emyinfo = db.Queryable<Location>().Where(a => a.N_ROW == list[i].N_ROW).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                            if (emyinfo.sum == 0)
+                            {
+                                emylist.Add(list[i].N_ROW);
+                            }
+                        }
+
+                        LogHelper.Info($"绌烘帓绛涢� 缁忚繃鎺掑簭鐨勭┖鎺掗『搴�{JsonConvert.SerializeObject(emylist)}");
+
+                        //2.1 閫変竴涓┖鎺�+                        //Console.WriteLine($"绌烘帓鏁伴噺涓簕emylist.Count}");
+                        LogHelper.Info($"绌烘帓鏁伴噺涓簕emylist.Count} ", "杈撻�绾�);
+                        for (int i = 0; i < emylist.Count; i++)
+                        {
+                            LogHelper.Info($"閬嶅巻鏌ユ壘鎺掞紝搴撳尯={area} 鎺掑彿={emylist[i]}", "杈撻�绾�);
+                            var state = db.Queryable<Location>().Where(a => a.N_ROW == emylist[i] && a.S_LOCK_STATE != "鏃� && a.S_LOCK_STATE != "鎶ュ簾").First();
+                            if (state == null)
+                            {
+                                var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == emylist[i] && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).First();
+                                if (locinfo != null)
+                                {
+                                    LogHelper.Info($"璐т綅缂栫爜={locinfo.S_LOC_CODE},璐т綅鐘舵�={locinfo.S_LOCK_STATE},璐т綅鏁伴噺={locinfo.N_CURRENT_NUM}", "杈撻�绾�);
+
+                                    //Console.WriteLine("寮�惎浜屾鏍¢獙");
+                                    //浜屾鏍¢獙褰撳墠鎺掓墍鏈夎揣浣嶉兘鏄┖鐨勶紝闃叉绯荤粺鏁版嵁閿欎贡
+                                    string row = locinfo.N_ROW.Trim();
+                                    var rowSumInfo = db.Queryable<Location>().Where(a => a.N_ROW == row).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First();
+                                    if (rowSumInfo.sum == 0)
+                                    {
+                                        result = locinfo;
+                                        break;
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info($"鎺抺row} 涓嶄负绌烘帓 褰撳墠鏁伴噺={rowSumInfo.sum}");
+                                    }
+                                }
+                            }
+                            #endregion
+                        }
+                        var sum2 = DateTime.Now - time2;
+                        LogHelper.Info($"搴撳尯={area}绌烘帓绠楁硶 浣跨敤鏃堕棿={sum2.TotalMilliseconds}");
+                    }
+                    else if (result.S_LOCK_STATE.Trim() != "鏃�)
+                    {
+                        result = null;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+                //Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocationIn:" + ex.Message, ex);
+            }
+            return result;
+        }
+
+
+
+
+
+        /// <summary>
+        /// 鏍规嵁搴撳尯鍜岀墿鏂欒幏鍙栧嚭搴撶殑璐т綅锛堝爢鍙犲厛鑰冭檻鏍囧噯鐨勶紝瀹归噺閮芥槸涓�牱鐨勶紝渚嬪鍧囧窞閮芥槸3+3锛涗笉鑰冭檻宄ㄧ湁灞遍潪鏍�+2鍜�+1鍚屾椂瀛樺湪锛�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        /// <returns></returns>
+        public static Location GetLocationOut(string area, string itemCode, string itemBatch, string itemLayer)
+        {
+            //Console.WriteLine($"area={area}");
+            Location result = null;
+            var db = new SqlHelper<Location>().GetInstance();
+            itemCode = itemCode + itemLayer;
+            //1.0 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM>0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList();
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+            //1.1 鍒ゆ柇褰撳墠鏁伴噺鏄笉鏄弧鐨勶紝濡傛灉鏄弧鐨勫苟涓旀槸鏈�ぇ鍒楋紝闇�鎺掗櫎
+            if (list.Count > 0)
+            {
+                //1.3 閬嶅巻鍒ゆ柇鐗╂枡绫诲瀷鏄惁鐩稿悓
+                for (int i = 0; i < list.Count; i++)
+                {
+
+                    //todo 杩橀渶瑕佸垽鏂攣
+
+                    #region 绌哄鍣ㄦ垨鑰呮弧瀹瑰櫒鍒ゆ柇 ,濡傛灉鏄┖瀹瑰櫒 瀹瑰櫒鐗╂枡淇℃伅涓虹┖
+                    if (list[i].S_LOCK_STATE.Trim() == "鏃� && list[i].LocCntrRel != null)
+                    {
+                        if ((itemCode != null && list[i].LocCntrRel.CntrItemRel != null && list[i].LocCntrRel.CntrItemRel.S_ITEM_CODE.Trim() == itemCode && (itemBatch == null || list[i].LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() == itemBatch.Trim())) || (itemCode == null && list[i].LocCntrRel.CntrItemRel == null))
+                        {
+                            //鎼繍閫夋嫨璐т綅
+                            //濡傛灉褰撳墠鍑哄簱浣嶅悗闈㈡湁绌轰綅锛屼笉鑳芥槸鍏ュ簱涓�+                            string row = list[i].N_ROW.Trim();
+                            int col = list[i].N_COL + 1;
+                            var after = new SqlHelper<Location>().Get(a => a.S_AREA_CODE == area && a.N_ROW == row && a.N_COL == col);
+                            if (after == null || after.S_LOCK_STATE.Trim() == "鏃�)
+                            {
+                                result = list[i];
+                            }
+                            if (result != null)
+                            {
+                                break;
+                            }
+                        }
+                    }
+                    #endregion
+                }
+            }
+
+            return result;
+        }
+
+
+        /// <summary>
+        /// 绉诲簱鑾峰彇鍏ュ簱璐т綅
+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location GetYiKuLocationIn(string area, string row, string itemCode = "", string itemBatch = "", int standardCarryQty = 0, string itemLayer = "", string startLoc = "")
+        {
+            //搴撳尯璐т綅绾﹀畾锛氬垪鍙疯秺灏忚秺闈犻噷
+            Location result = null;
+            Location res = null;
+            //itemCode = itemCode + itemLayer;
+            try
+            {
+                //Console.WriteLine($"绉诲簱浠诲姟鍏ュ簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!");
+                LogHelper.Info($"绉诲簱浠诲姟鍏ュ簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+
+                var db = new SqlHelper<object>().GetInstance();
+
+                //鍏ュ簱 闄嶅簭 浠庡寰�噷鏌ワ紝鑾峰彇 鏈�潬澶�鐨勬湁鎵樼洏鐨勮揣浣嶏紱鍒ゆ柇褰撳墠璐т綅 鎵樼洏鏁伴噺鏄惁 婊℃墭锛�+                //婊℃墭鑾峰彇鍚庨潰涓�釜璐т綅锛涘弽涔嬶紝浣跨敤姝よ揣浣�+                var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area && a.N_ROW == row).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).First();
+                if (list != null)
+                {
+                    //鑾峰彇褰撳墠璐т綅鎵�湁鎵樼洏鏁�+                    var trayInfo = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == list.S_LOC_CODE.Trim()).ToList();
+                    //鍒ゆ柇鍓嶄竴涓揣浣嶄笌褰撳墠鎵规鏄惁涓�牱锛屼笉涓�牱闇�绌轰竴涓揣浣�+                    bool batch = BatchBool(list.S_LOC_CODE.Trim(), startLoc, db);
+
+                    if (trayInfo.Count() == list.N_CAPACITY * 2 || trayInfo.Count() % 2 != 0 || batch)
+                    {
+                        //1.褰撳墠璐т綅婊′簡 鏌ヨ鍚庨潰涓�釜璐т綅 蹇呯劧鏄┖璐т綅
+                        //2.褰撳墠璐т綅涓�1+2 鎴�1 鐨勮揣浣嶏紝涓嶅彲鍐嶅叆搴擄紝鏌ヨ鍚庨潰鐨勮揣浣�+                        //3.涓嶅悓鎵规鍙风殑鐗╂枡闇�闅斾竴涓揣浣�+                        int Col = list.N_COL + 1;
+                        if (batch) Col = Col + 1;
+                        res = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == row && a.N_COL == Col).Take(1).First();
+                        result = res;
+                    }
+                    else
+                    {
+                        result = list;
+                    }
+                }
+                else
+                {
+                    LogHelper.Info($"缁堢偣搴撳尯={area} 鎺�{row}");
+                    var empty = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == row).OrderBy(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "绉诲簱閿�).First();
+                    //2.1 閫変竴涓┖鎺�+                    if (empty != null) result = empty;
+                    else
+                    {
+                        //Console.WriteLine($"绉诲簱浠诲姟鍏ュ簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!");
+                        LogHelper.Info($"绉诲簱浠诲姟鍏ュ簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocationIn:" + ex.Message, ex);
+            }
+            if (result != null) LogHelper.Info($"浜哄伐绉诲簱鍏ュ簱绠楁硶 缁堢偣璐т綅={result.S_LOC_CODE}");
+            return result;
+        }
+
+
+        /// <summary>
+        /// 绉诲簱鑾峰彇鍏ュ簱璐т綅
+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location GetYiKuLocationIn1(string area, string row, string itemCode = "")
+        {
+            //搴撳尯璐т綅绾﹀畾锛氬垪鍙疯秺灏忚秺闈犻噷
+            Location result = null;
+            Location res = null;
+            //itemCode = itemCode + itemLayer;
+            try
+            {
+                //Console.WriteLine($"绉诲簱浠诲姟鍏ュ簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!");
+                LogHelper.Info($"绉诲簱浠诲姟鍏ュ簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+
+                var db = new SqlHelper<object>().GetInstance();
+
+                //鍏ュ簱 闄嶅簭 浠庡寰�噷鏌ワ紝鑾峰彇 鏈�潬澶�鐨勬湁鎵樼洏鐨勮揣浣嶏紱鍒ゆ柇褰撳墠璐т綅 鎵樼洏鏁伴噺鏄惁 婊℃墭锛�+                //婊℃墭鑾峰彇鍚庨潰涓�釜璐т綅锛涘弽涔嬶紝浣跨敤姝よ揣浣�+                var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM == 0 && a.S_AREA_CODE == area && a.N_ROW == row).OrderBy(a => a.N_COL).First();
+                if (list != null)
+                {
+                    result = list;
+                }
+                else
+                {
+                    var empty = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area && a.N_ROW == row).OrderBy(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "绉诲簱閿�).First();
+                    //2.1 閫変竴涓┖鎺�+                    if (empty != null) result = empty;
+                    else
+                    {
+                        //Console.WriteLine($"绉诲簱浠诲姟鍏ュ簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!");
+                        LogHelper.Info($"绉诲簱浠诲姟鍏ュ簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                //Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocationIn:" + ex.Message, ex);
+            }
+            if (result != null) LogHelper.Info($"浜哄伐绉诲簱鍏ュ簱绠楁硶 缁堢偣璐т綅={result.S_LOC_CODE}");
+            return result;
+        }
+        private static bool BatchBool(string endLoc, string startLoc, SqlSugarClient db)
+        {
+            //Console.WriteLine($"绉诲簱鍏ュ簱鎵规鍙峰垽鏂細鍏ュ簱缁堢偣璐т綅锛歿endLoc},鍑哄簱璧风偣璐т綅锛歿startLoc}");
+            bool batch = false;
+            var endCntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == endLoc).First();
+            var startCntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc).First();
+            if (endCntr != null && startCntr != null)
+            {
+                var endItem = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == endCntr.S_CNTR_CODE.Trim()).First();
+                var startItem = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == startCntr.S_CNTR_CODE.Trim()).First();
+                if (endItem != null && startItem != null && !string.IsNullOrEmpty(endItem.S_BATCH_NO))
+                {
+                    if (endItem.S_BATCH_NO.Trim() != startItem.S_BATCH_NO.Trim())
+                        batch = true;
+                }
+                //else //Console.WriteLine($"绉诲簱鍏ュ簱鎵规鍙峰垽鏂細璧风偣鎴栫粓鐐�鎵樼洏鐗╂枡琛�涓虹┖锛�);
+            }
+            //else //Console.WriteLine($"绉诲簱鍏ュ簱鎵规鍙峰垽鏂細璧风偣鎴栫粓鐐�鎵樼洏璐т綅琛�涓虹┖锛�);
+
+            return batch;
+        }
+
+        /// <summary>
+        /// 鍑哄簱鑾峰彇鍑哄簱璐т綅
+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        /// <returns></returns>
+        public static Location GetYiKuLocationOut(string area, string row, string itemCode = "", string itemBatch = "", string itemLayer = "")
+        {
+            //Console.WriteLine($"绉诲簱浠诲姟鍑哄簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!");
+            LogHelper.Info($"绉诲簱浠诲姟鍑哄簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+            Location result = null;
+            var db = new SqlHelper<Location>().GetInstance();
+            //itemCode = itemCode + itemLayer;
+
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area && a.N_ROW == row).OrderByDescending(a => a.N_COL).Take(1).First();
+            if (list != null)
+            {
+                result = list;
+                LogHelper.Info($"绉诲簱鍑哄簱绠楁硶 璧风偣璐т綅={result.S_LOC_CODE}");
+            }
+            else
+            {
+                //Console.WriteLine($"绉诲簱浠诲姟鍑哄簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!");
+                LogHelper.Info($"绉诲簱浠诲姟鍑哄簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鍑哄簱鑾峰彇绌烘墭鍑哄簱璐т綅
+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        /// <returns></returns>
+        public static Location GetEmptyLocationOut(string area, string row, string trayType)
+        {
+            //Console.WriteLine($"绌烘墭浠诲姟鍑哄簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!");
+            LogHelper.Info($"绌烘墭浠诲姟鍑哄簱璁$畻:褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+            Location result = null;
+            var db = new SqlHelper<Location>().GetInstance();
+            //itemCode = itemCode + itemLayer;
+
+            var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area && a.N_ROW == row).OrderByDescending(a => a.N_COL).Take(1).First();
+            if (list != null)
+            {
+                string note = string.IsNullOrEmpty(list.S_NOTE) ? "" : list.S_NOTE.Trim();
+                if (string.IsNullOrEmpty(note) || note == trayType) result = list;
+                else LogHelper.Info($"绌烘墭浠诲姟鍑哄簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄笌鎵�渶鎵樼洏绫诲瀷涓嶄竴鑷淬�褰撳墠搴撳尯锛歿area},褰撳墠搴撲綅锛歿row}!鎵�渶鎵樼洏锛歿trayType},褰撳墠鎵樼洏锛歿note}", "WMSAlgoRithm");
+            }
+            else
+            {
+                //Console.WriteLine($"绌烘墭浠诲姟鍑哄簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!");
+                LogHelper.Info($"绌烘墭浠诲姟鍑哄簱璁$畻寮傚父锛氬綋鍓嶅簱浣嶄互鍙婂簱鍖烘棤鍙敤璐т綅锛佸綋鍓嶅簱鍖猴細{area},褰撳墠搴撲綅锛歿row}!", "WMSAlgoRithm");
+            }
+            return result;
+        }
+
+
+        /// <summary>
+        /// 缁戝畾璐т綅瀹瑰櫒琛�+        /// </summary>
+        /// <param name="cntr"></param>
+        /// <returns></returns>
+        internal static bool BindLocCntr(string loc, string cntr, string itemCode, string batchNo, string deviceName = "", string itemlayer = "", string ItemTrayType = "")
+        {
+            bool result = true;
+            List<string> list = new List<string>(cntr.Split(','));
+            var db = new SqlHelper<object>().GetInstance();
+            list.ForEach(it =>
+            {
+                if (!string.IsNullOrEmpty(it))
+                {
+                    string cntrCode = it.Trim();
+                    LogHelper.Info($"鏌ユ壘璐т綅{loc} 鏄惁瀛樺湪瀹瑰櫒{cntrCode}鐨勬墭鐩�);
+                    var Cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == loc && a.S_CNTR_CODE == cntrCode).First();
+                    if (Cntr == null)
+                    {
+                        LogHelper.Info("瀹瑰櫒涓嶅瓨鍦ㄥ噯澶囨彃鍏�);
+                        var cir = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntrCode, S_SRC = deviceName };
+                        db.Insertable<LocCntrRel>(cir).ExecuteCommand();
+                        LogHelper.Info($"瀹瑰櫒鎻掑叆鎴愬姛");
+                        IntensiveArea.BindCntrItem(cntrCode, itemCode, batchNo, itemlayer);
+                    }
+                    else
+                    {
+                        LogHelper.Info("瀹瑰櫒宸插瓨鍦�);
+                    }
+                }
+            });
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            return result;
+        }
+
+
+        /// <summary>
+        /// 缁戝畾瀹瑰櫒鐗╂枡琛�+        /// </summary>
+        /// <param name="itemCode"></param>
+        /// <param name="batchNo"></param>
+        /// <param name="qty"></param>
+        /// <returns></returns>
+        internal static bool BindCntrItem(string trayCode, string itemCode, string batchNo, string itemlayer = "")
+        {
+            LogHelper.Info($"瀹瑰櫒璐у搧缁戝畾 瀹瑰櫒{trayCode}");
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            try
+            {
+                db.BeginTran();
+                //db.Updateable(cntr).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
+                //1.灏嗗師鏈夊鍣ㄧ墿鏂欎俊鎭垹闄�+                //db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == cntr.S_CNTR_CODE.Trim()).ExecuteCommand();
+                //2.鎻掑叆鏂扮殑瀹瑰櫒鐗╂枡淇℃伅锛堝鍣ㄥ彿涓嶅彉锛�+                LogHelper.Info($"鏌ユ壘瀹瑰櫒璐у搧缁戝畾琛ㄤ腑鏄惁鏈夌浉鍚屽鍣ㄥ彿鐨勭墿鏂�);
+                var info = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == trayCode.Trim()).First();
+                if (info == null)
+                {
+                    LogHelper.Info($"鎻掑叆瀹瑰櫒璐у搧鏁版嵁");
+                    var cir = new CntrItemRel { S_CNTR_CODE = trayCode, S_BATCH_NO = batchNo, S_ITEM_CODE = itemCode, S_ITEM_MODEL = itemlayer };
+                    db.Insertable(cir).ExecuteCommand();
+                    LogHelper.Info($"鎻掑叆鎴愬姛");
+                }
+                else
+                {
+                    LogHelper.Info($"鎵樼洏鍙烽噸澶�);
+                }
+
+
+                db.Ado.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                db.Ado.RollbackTran();
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 浠诲姟鍒涘缓鏃堕攣瀹氭帓
+        /// </summary>
+        /// <param name="startRow"></param>
+        /// <param name="endRow"></param>
+        public static void LockRow(string startRow, string endRow, string SArea, string EArea, string taskType)
+        {
+            string startRowXB = startRow + "";
+            string endRowXB = endRow + "";
+            string SAreaXB = SArea + "";
+            string EAreaXB = EArea + "";
+            var db = new SqlHelper<object>().GetInstance();
+            string LockRow = "";
+            var Srow = db.Queryable<RowLock>().Where(a => a.N_ROW == startRow && a.S_AREA_CODE == SArea).First();
+            if (Srow != null && !Srow.S_LOCK_STATE.Trim().Contains("閿�))
+            {
+                Srow.S_LOCK_STATE = "鍑哄簱閿�;
+                db.Updateable(Srow).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand();
+                LockRow = LockRow + Srow.N_ROW.Trim().Replace("-XB", "") + ",";
+            }
+            var Erow = db.Queryable<RowLock>().Where(a => a.N_ROW == endRow && a.S_AREA_CODE == EArea).First();
+            if (Erow != null && !Erow.S_LOCK_STATE.Trim().Contains("閿�))
+            {
+                Erow.S_LOCK_STATE = "鍏ュ簱閿�;
+                db.Updateable(Erow).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand();
+                LockRow = LockRow + Erow.N_ROW.Trim().Replace("-XB", "") + ",";
+            }
+            if (!string.IsNullOrEmpty(LockRow) && taskType.Contains("绉诲簱")) TaskProcess.AreaRowLockState(LockRow);//绉诲簱浠诲姟 鍥炴姤瀵屽嫆搴撲綅閿佸畾
+        }
+
+        /// <summary>
+        /// 瑙i攣鎺�+        /// </summary>
+        /// <param name="startRow"></param>
+        /// <param name="endRow"></param>
+        public static void UnLockRow(string bit, string taskType)
+        {
+            if (!taskType.Contains("绉诲簱"))
+            {
+                string rowNo = ""; string areaCode = "";
+                var db = new SqlHelper<object>().GetInstance();
+
+                var Sinfo = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_LOC_CODE == bit).First();
+                if (Sinfo != null)
+                {
+                    rowNo = string.IsNullOrEmpty(Sinfo.N_ROW.Trim()) ? "" : Sinfo.N_ROW.ToString();
+                    areaCode = string.IsNullOrEmpty(Sinfo.S_AREA_CODE.Trim()) ? "" : Sinfo.S_AREA_CODE.Trim();
+                    var listRowLocks = db.Queryable<RowLock>().ToList();
+                    var Srow = db.Queryable<RowLock>().Where(a => a.N_ROW == rowNo && a.S_AREA_CODE == areaCode).First();
+                    if (Srow != null && Srow.S_LOCK_STATE.Trim().Contains("閿�))
+                    {
+                        Srow.S_LOCK_STATE = "鏃�;
+                        db.Updateable(Srow).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand();
+                        //TaskProcess.AreaRowLockState(Srow.N_ROW.Trim(), false);//鍥炴姤WMS搴撲綅閿佸畾淇℃伅--鏆備笉浣跨敤
+                    }
+                }
+                else LogHelper.Info($"褰撳墠璐т綅涓嶅瓨鍦ㄤ簬璐т綅琛紝璐т綅缂栫爜锛歿bit}", "WMSAlgoRithm");
+            }
+        }
+
+        /// <summary>
+        /// 鏇存柊宸ュ崟绉诲簱鏁伴噺
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static void UpdateWorkNum(WMSTask mst)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var workInfo = db.Queryable<WorkOrder>().Where(a => a.S_WorkNo == mst.S_SRC_NO.Trim()).First();
+            LogHelper.Info($"鏌ヨ宸ュ崟鍙蜂负{mst.S_SRC_NO} 鐨勭Щ搴撳伐鍗�);
+            if (workInfo != null)
+            {
+                LogHelper.Info($"鎵惧埌绉诲簱宸ュ崟 绉诲簱鏁伴噺涓簕workInfo.S_YiKuNum}");
+                if (workInfo.S_YiKuNum != 9999 && workInfo.S_YiKuNum > 0)
+                {
+                    workInfo.S_YiKuNum = workInfo.S_YiKuNum - 1;
+                    LogHelper.Info($"淇敼绉诲簱鏁伴噺涓簕workInfo.S_YiKuNum}");
+                    db.Updateable(workInfo).UpdateColumns(a => new { a.S_YiKuNum }).ExecuteCommand();
+                }
+            }
+            else
+            {
+                //Console.WriteLine($"鏇存柊宸ュ崟绉诲簱鏁伴噺寮傚父锛氭湭鏌ヨ鍒版宸ュ崟鐨勪俊鎭紝宸ュ崟鍙凤細{mst.S_SRC_NO.Trim()}");
+            }
+        }
+
+        #endregion
+
+        #region 澶ф槑灞卞嚭鍏ュ簱绠楁硶
+
+        /// <summary>
+        /// 娉ㄥ鏈哄叆搴�缈绘枟鏈哄叆搴�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location">璧风偣</param>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <param name="batchNo">鎵规鍙�/param>
+        /// <param name="v">true:娉ㄥ鏈哄叆搴�false:缈绘枟鏈哄叆搴�/param>
+        /// <returns></returns>
+        public static bool DaMingShanPLCIn(Settings.deviceInfo plc, string location, string trayCode, string batchNo, PGWorkOrder workorder, bool v)
+        {
+            LogHelper.Info($"鏌ヨ鐡跺澂婊$瓙鍏ュ簱绔欑偣", "娉ㄥ鏈�);
+            string endlocation = "";
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            //var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+            var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workorder.S_LinkLineNo && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+            if (v)
+            {
+                //鍗充骇鍗崇敤 浼樺厛閫佺炕鏂楁満缂撳瓨浣�+                if (info != null)
+                {
+                    string ItemName = workorder.S_ItemCode;
+                    //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                    if (info.ProductLocation.Count() > 0)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鐐圭殑鐘舵� result={result}", "娉ㄥ鏈�);
+                        foreach (var a in info.ProductLocation)
+                        {
+                            var endlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a && b.N_CURRENT_NUM == 0 && b.S_LOCK_STATE.Trim() == "鏃�).First();
+                            if (endlocationinfo != null)
+                            {
+                                endlocation = endlocationinfo.S_LOC_CODE.Trim();
+                                result = DaMingShanCreateTransport(location, endlocation, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡跺澂)", trayCode, 1, 1, plc.deviceName, 1);
+                                break;
+                            }
+                        }
+                    }
+                    LogHelper.Info($"閬嶅巻缂撳瓨鐐圭姸鎬佺粨鏉�result={result}");
+                    //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵剧┖闂茶揣浣�+                    if (!result)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鍖虹殑鐘舵� 缂撳瓨鍖洪厤缃�{JsonConvert.SerializeObject(info.ProductArea)}", "娉ㄥ鏈�);
+                        if (info.IsDense == 0)
+                        {
+                            for (int i = 0; i < info.ProductArea.Count(); i++)
+                            {
+                                string endarea = info.ProductArea[i];
+                                LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨浣�鏄惁鏈夌┖璐т綅 搴撳尯缂栫爜={endarea}");
+                                var endLocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                                if (endLocation != null)
+                                {
+                                    var endLayer = endLocation.N_CURRENT_NUM + 1;
+                                    result = DaMingShanCreateTransport(location, endLocation.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                    break;
+                                }
+                            }
+                        }
+                        else 
+                        {
+                            for (int i = 0; i < info.ProductArea.Count(); i++) 
+                            {
+                                string endarea = info.ProductArea[i];
+                                var endbitlist = db.Queryable<Location>()
+                                      .Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "鏃�)
+                                      .PartitionBy(a => a.N_OROW)
+                                      .Take(1)
+                                      .OrderBy(a => a.N_COL)
+                                      .ToList();
+                                foreach (var item in endbitlist)
+                                {
+                                    var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                                    if (lockinfo == null)
+                                    {
+                                        var endLayer = item.N_CURRENT_NUM + 1;
+                                        result = DaMingShanCreateTransport(location, item.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                        break;
+                                    }
+                                }
+                                if (result) break;
+                            }
+                        }
+
+                    }
+                    LogHelper.Info($"閬嶅巻缂撳瓨鍖虹姸鎬佺粨鏉�result={result}");
+
+                    if (!result)
+                    {
+                        if (info.IsDense == 0) 
+                        {
+                            var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+                            if (bitinfo != null)
+                            {
+                                var locinfo = db.Queryable<Location>().Where(q => q.S_AREA_CODE == bitinfo.location && q.N_CURRENT_NUM == 0 && q.S_LOCK_STATE.Trim() == "鏃�).First();
+                                if (locinfo != null)
+                                {
+                                    var endLayer = locinfo.N_CURRENT_NUM + 1;
+                                    result = DaMingShanCreateTransport(location, locinfo.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                }
+                            }
+                        }
+
+                    }
+                    LogHelper.Info($"閬嶅巻鍏ュ簱缂撳瓨浣嶇粨鏉�result={result}");
+
+                    if (result)
+                    {
+                        IntensiveArea.BindCntrItem(trayCode, ItemName, batchNo);
+                    }
+                }
+            }
+            else
+            {
+                //闈炲嵆浜у嵆鐢�鐩存帴鍏ュ簱缂撳瓨浣�3+2
+                var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+                if (info != null && bitinfo != null)
+                {
+                    string ItemName = info.ItemName;
+                    var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == bitinfo.location && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).First();
+                    if (locinfo != null)
+                    {
+                        var endLayer = locinfo.N_CURRENT_NUM + 1;
+                        result = DaMingShanCreateTransport(location, locinfo.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                    }
+                    if (result)
+                    {
+                        IntensiveArea.BindCntrItem(trayCode, ItemName, batchNo);
+                    }
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鐡剁洊鏈哄叆搴�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location">璧风偣</param>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <param name="batchNo">鎵规鍙�/param>
+        /// <param name="v">true:鍗充骇鍗崇敤 false:闈炲嵆浜у嵆鐢�/param>
+        /// <returns></returns>
+        public static bool DaMingShanPLCIn2(Settings.deviceInfo plc, string location, string trayCode, string batchNo, string itemcode, bool v)
+        {
+            LogHelper.Info($"鏌ヨ鐡剁洊婊$瓙鍏ュ簱绔欑偣", "鐡剁洊鏈�);
+            string endlocation = "";
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+            if (v)
+            {
+                //鍗充骇鍗崇敤 浼樺厛閫佺炕鏂楁満缂撳瓨浣�+                if (info != null)
+                {
+                    string ItemName = itemcode;
+                    //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                    if (info.ProductLocation.Count() > 0)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鐐圭殑鐘舵�", "鐡剁洊鏈�);
+                        foreach (var a in info.ProductLocation)
+                        {
+                            var endlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+                            if (endlocationinfo.N_CURRENT_NUM == 0 && endlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+                            {
+                                endlocation = endlocationinfo.S_LOC_CODE.Trim();
+                                result = DaMingShanCreateTransport(location, endlocation, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡剁洊)", trayCode, 1, 1, plc.deviceName, 1);
+                                break;
+                            }
+                        }
+                    }
+                    //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵剧┖闂茶揣浣�+                    if (!result)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鍖虹殑鐘舵�", "鐡剁洊鏈�);
+                        string endarea = info.ProductArea[0];
+                        LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨浣�鏄惁鏈夌┖璐т綅 搴撳尯缂栫爜={endarea}");
+                        var endLocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0).First();
+                        if (endLocation.S_LOCK_STATE.Trim() == "鏃�)
+                        {
+                            var endLayer = endLocation.N_CURRENT_NUM + 1;
+                            result = DaMingShanCreateTransport(location, endLocation.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡剁洊)", trayCode, 1, endLayer, plc.deviceName, 1);
+                        }
+                    }
+                    if (!result)
+                    {
+                        var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+                        if (bitinfo != null)
+                        {
+                            var locinfo = db.Queryable<Location>().Where(q => q.S_LOC_CODE == bitinfo.location).First();
+                            if (locinfo != null)
+                            {
+                                if (locinfo.S_LOCK_STATE == "鏃�)
+                                {
+                                    var endLayer = locinfo.N_CURRENT_NUM + 1;
+                                    result = DaMingShanCreateTransport(location, locinfo.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡剁洊)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                }
+                            }
+                        }
+                    }
+                    if (result)
+                    {
+                        IntensiveArea.BindCntrItem(trayCode, ItemName, batchNo);
+                    }
+                }
+            }
+            else
+            {
+                //闈炲嵆浜у嵆鐢�鐩存帴鍏ュ簱缂撳瓨浣�3+2
+                var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+                if (info != null && bitinfo != null)
+                {
+                    string ItemName = info.ItemName;
+                    var locinfo = db.Queryable<Location>().Where(q => q.S_LOC_CODE == bitinfo.location).First();
+                    if (locinfo != null)
+                    {
+                        if (locinfo.S_LOCK_STATE == "鏃� && locinfo.N_CURRENT_NUM < locinfo.N_CAPACITY)
+                        {
+                            var endLayer = locinfo.N_CURRENT_NUM + 1;
+                            result = DaMingShanCreateTransport(location, locinfo.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡剁洊)", trayCode, 1, endLayer, plc.deviceName, 1);
+                        }
+                    }
+                    if (result)
+                    {
+                        IntensiveArea.BindCntrItem(trayCode, ItemName, batchNo);
+                    }
+                }
+            }
+            return result;
+        }
+
+
+
+        /// <summary>
+        /// 鐡剁洊缈绘枟鏈哄叆搴�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location">璧风偣</param>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <param name="batchNo">鎵规鍙�/param>
+        /// <param name="v">true:鍗充骇鍗崇敤 false:闈炲嵆浜у嵆鐢�/param>
+        /// <returns></returns>
+        public static bool DaMingShanPLCIn3(Settings.deviceInfo plc, string location, string trayCode, string batchNo, bool v)
+        {
+            LogHelper.Info($"鏌ヨ鐡剁洊缈绘枟鏈虹┖绛愬叆搴撶珯鐐�, "缈绘枟鏈�);
+            string endlocation = "";
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+            if (v)
+            {
+                //鍗充骇鍗崇敤 浼樺厛閫佺炕鏂楁満缂撳瓨浣�+                if (info != null)
+                {
+                    //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                    if (info.ProductLocation.Count() > 0)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鐐圭殑鐘舵�", "缈绘枟鏈�);
+                        foreach (var a in info.ProductLocation)
+                        {
+                            var endlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+                            if (endlocationinfo != null)
+                            {
+                                if (endlocationinfo.N_CURRENT_NUM == 0 && endlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+                                {
+                                    endlocation = endlocationinfo.S_LOC_CODE.Trim();
+                                    result = DaMingShanCreateTransport(location, endlocation, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡剁洊)", trayCode, 1, 1, plc.deviceName, 1);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵剧┖闂茶揣浣�+                    if (!result)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鍖虹殑鐘舵�", "缈绘枟鏈�);
+                        string endarea = info.ProductArea[0];
+                        LogHelper.Info($"鏌ヨ绌虹瓙绛愮紦瀛樹綅 鏄惁鏈夌┖璐т綅 搴撳尯缂栫爜={endarea}");
+
+                        var endlocationlist = db.Queryable<Location>()
+                            .Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM < a.N_CAPACITY)
+                            .PartitionBy(a => a.N_ROW)
+                            .Take(1)
+                            .OrderBy(a => a.N_COL)
+                            .OrderBy(a => a.N_OROW)
+                            .ToList();
+
+                        foreach (var item in endlocationlist)
+                        {
+                            var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                            if (lockinfo == null)
+                            {
+                                var endLayer = item.N_CURRENT_NUM + 1;
+                                result = DaMingShanCreateTransport(location, item.S_LOC_CODE, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡剁洊)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                break;
+                            }
+                        }
+
+                        //var endLocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0).First();
+                        //if (endLocation.S_LOCK_STATE.Trim() == "鏃�)
+                        //{
+                        //
+                        //}
+                    }
+                    if (!result)
+                    {
+                        var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+                        if (bitinfo != null)
+                        {
+                            var endarea = bitinfo.ProductArea[0];
+                            var endbitlist = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0)
+                                .PartitionBy(a => a.N_ROW)
+                                .OrderBy(a => a.N_COL)
+                                .Take(1)
+                                .ToList();
+                            foreach (var item in endbitlist)
+                            {
+                                var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == a.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                                if (lockinfo == null)
+                                {
+                                    var endLayer = item.N_CURRENT_NUM + 1;
+                                    result = DaMingShanCreateTransport(location, item.S_LOC_CODE, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡剁洊)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    if (result)
+                    {
+                        IntensiveArea.UnBindLocCntr(trayCode);
+                    }
+                }
+            }
+            else
+            {
+                //闈炲嵆浜у嵆鐢�鐩存帴鍏ュ簱缂撳瓨浣�3+2
+                var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+                if (info != null && bitinfo != null)
+                {
+                    //var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+                    if (bitinfo != null)
+                    {
+                        var endarea = bitinfo.ProductArea[0];
+                        var endbitlist = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM <a.N_CAPACITY)
+                            .PartitionBy(a => a.N_ROW)
+                            .OrderBy(a => a.N_COL)
+                            .Take(1)
+                            .ToList();
+                        foreach (var item in endbitlist)
+                        {
+                            var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == a.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                            if (lockinfo == null)
+                            {
+                                var endLayer = item.N_CURRENT_NUM + 1;
+                                result = DaMingShanCreateTransport(location, item.S_LOC_CODE, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡剁洊)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                break;
+                            }
+                        }
+                    }
+                    if (result)
+                    {
+                        IntensiveArea.UnBindLocCntr(trayCode);
+                    }
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鐡跺澂缈绘枟鏈哄叆搴�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location">璧风偣</param>
+        /// <param name="trayCode">鎵樼洏鍙�/param>
+        /// <param name="batchNo">鎵规鍙�/param>
+        /// <param name="v">true:鍗充骇鍗崇敤 false:闈炲嵆浜у嵆鐢�/param>
+        /// <returns></returns>
+        public static bool DaMingShanPLCIn4(Settings.deviceInfo plc, string location, string trayCode, PGWorkOrder workorder, bool v)
+        {
+            LogHelper.Info($"鏌ヨ鐡跺澂缈绘枟鏈虹┖绛愬叆搴撶珯鐐�, "缈绘枟鏈�);
+            string endlocation = "";
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            //var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+            var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workorder.S_LinkLineNo && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+
+            if (v)
+            {
+                //鍗充骇鍗崇敤 浼樺厛閫佺炕鏂楁満缂撳瓨浣�+                if (info != null)
+                {
+                    //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                    if (info.ProductLocation.Count() > 0)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鐐圭殑鐘舵�", "缈绘枟鏈�);
+                        foreach (var a in info.ProductLocation)
+                        {
+                            var endlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+                            if (endlocationinfo != null)
+                            {
+                                if (endlocationinfo.N_CURRENT_NUM == 0 && endlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+                                {
+                                    endlocation = endlocationinfo.S_LOC_CODE.Trim();
+                                    result = DaMingShanCreateTransport(location, endlocation, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡跺澂)", trayCode, 1, 1, plc.deviceName, 1);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵剧┖闂茶揣浣�+                    if (!result)
+                    {
+                        LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鍖虹殑鐘舵�", "缈绘枟鏈�);
+                        string endarea = info.ProductArea[0];
+                        LogHelper.Info($"鏌ヨ绌虹瓙绛愮紦瀛樹綅 鏄惁鏈夌┖璐т綅 搴撳尯缂栫爜={endarea}");
+
+                        var endlocationlist = db.Queryable<Location>()
+                            .Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0)
+                            .PartitionBy(a => a.N_ROW)
+                            .Take(1)
+                            .OrderBy(a => a.N_COL)
+                            .OrderBy(a => a.N_OROW)
+                            .ToList();
+
+                        foreach (var item in endlocationlist)
+                        {
+                            var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                            if (lockinfo == null)
+                            {
+                                var endLayer = item.N_CURRENT_NUM + 1;
+                                result = DaMingShanCreateTransport(location, item.S_LOC_CODE, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                                break;
+                            }
+                        }
+
+                        //LogHelper.Info($"閬嶅巻鏌ヨ缂撳瓨鍖虹殑鐘舵�", "缈绘枟鏈�);
+                        //for (int i = 0; i < info.ProductArea.Count(); i++)
+                        //{
+                        //    string endarea = info.ProductArea[i];
+                        //    LogHelper.Info($"鏌ヨ绌虹瓙绛愮紦瀛樹綅 鏄惁鏈夌┖璐т綅 搴撳尯缂栫爜={endarea}");
+                        //    var endLocation = db.Queryable<Location>().Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�).First();
+                        //    if (endlocation != null)
+                        //    {
+                        //        var endLayer = endLocation.N_CURRENT_NUM + 1;
+                        //        result = DaMingShanCreateTransport(location, endLocation.S_LOC_CODE, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                        //        break;
+                        //    }
+                        //}
+                    }
+                    if (!result)
+                    {
+                        var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+                        if (bitinfo != null)
+                        {
+                            var locinfo = db.Queryable<Location>().Where(q => q.S_AREA_CODE == bitinfo.location && q.N_CURRENT_NUM == 0 && q.S_LOCK_STATE.Trim() == "鏃�).First();
+                            if (locinfo != null)
+                            {
+                                var endLayer = locinfo.N_CURRENT_NUM + 1;
+                                result = DaMingShanCreateTransport(location, locinfo.S_LOC_CODE, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                            }
+                        }
+                    }
+                    if (result)
+                    {
+                        IntensiveArea.UnBindLocCntr(trayCode);
+                    }
+                }
+            }
+            else
+            {
+                //闈炲嵆浜у嵆鐢�鐩存帴鍏ュ簱缂撳瓨浣�3+2
+                var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+                if (info != null && bitinfo != null)
+                {
+                    string ItemName = info.ItemName;
+                    var locinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == bitinfo.location && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "鏃�).OrderBy(a => a.N_COL).First();
+                    if (locinfo != null)
+                    {
+                        var endLayer = locinfo.N_CURRENT_NUM + 1;
+                        result = DaMingShanCreateTransport(location, locinfo.S_LOC_CODE, "缈绘枟鏈哄嵆浜х┖绛愪笅绾�鐡跺澂)", trayCode, 1, endLayer, plc.deviceName, 1);
+                    }
+                    if (result)
+                    {
+                        IntensiveArea.UnBindLocCntr(trayCode);
+                    }
+                }
+            }
+            return result;
+        }
+
+
+        /// <summary>
+        /// 瑙g粦鐗╂枡淇℃伅
+        /// </summary>
+        /// <param name="location"></param>
+        /// <param name="trayCode"></param>
+        /// <param name="itemName"></param>
+        /// <param name="batchNo"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        private static bool UnBindLocCntr(string trayCode)
+        {
+            bool result = true;
+            List<string> list = new List<string>(trayCode.Split(','));
+            var db = new SqlHelper<object>().GetInstance();
+            for (int i = 0; i < list.Count; i++)
+            {
+                if (db.Queryable<CntrItemRel>().Count(a => a.S_CNTR_CODE.Trim() == list[i]) > 0)
+                {
+                    db.Deleteable<CntrItemRel>().Where(a => a.S_CNTR_CODE == list[i]).ExecuteCommand();
+                }
+            }
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            return result;
+        }
+
+
+        /// <summary>
+        /// 鍒涘缓鎼繍浠诲姟
+        /// </summary>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="taskType"></param>
+        /// <param name="cntrs"></param>
+        /// <param name="startLayer"></param>
+        /// <param name="endLayer"></param>
+        /// <param name="trayCarryCount"></param>
+        /// <param name="priority"></param>
+        /// <returns></returns>
+        public static bool DaMingShanCreateTransport(string start, string end, string taskType, string cntrs, int startLayer, int endLayer, string deviceName, int trayCarryCount = 1, int priority = 1, int itemLayer = 0, string workNo = "", string batch = "", string itemcode = "", string traytype = "")
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var result = false;
+            var taskNo = DateTime.Now.Ticks.ToString();
+            var res = TaskHelper.DaMingShanCreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, cntrs, deviceName, trayCarryCount, startLayer, endLayer, itemLayer, workNo, batch, itemcode, traytype);
+            if (res)
+            {
+                result = true;
+                //浠诲姟鍒涘缓鎴愬姛锛岃捣鐐硅揣浣嶅嚭搴撻攣瀹氾紝缁堢偣璐т綅鍏ュ簱閿佸畾
+                LocationHelper.LockLoc(start, "鍑哄簱閿�);
+                LocationHelper.LockLoc(end, "鍏ュ簱閿�);
+                if (taskType == "鎴愬搧涓嬬嚎" && Settings.FULEenable == "1")
+                {
+                    //IntensiveArea.SLlock(end);
+                    //鎴愬搧涓嬬嚎浠诲姟鐢熸垚鎴愬姛锛屽垹闄ゅ綋鍓嶄笅绾挎墭鐩樹腑闂磋〃鏁版嵁
+                    List<string> cntr = cntrs.Split(',').ToList();
+
+                    db.Deleteable<DaMingShanDeviceState>().Where(a => a.DeviceName.Trim() == deviceName).ExecuteCommand();
+                    db.Deleteable<DaMingShanTrayInfo>().Where(it => cntr.Contains(it.trayCode)).ExecuteCommand();// && it.workNo == workNo.Trim()
+                }
+
+            }
+            else
+            {
+                if (taskType == "鎴愬搧涓嬬嚎" && Settings.FULEenable == "1")
+                {
+                    db.Deleteable<DaMingShanDeviceState>().Where(a => a.DeviceName.Trim() == deviceName).ExecuteCommand();
+                }
+            }
+            return result;
+        }
+
+        private static void SLlock(string end)
+        {
+            if (Settings.FULEenable == "1")
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                var info = db.Queryable<Location>().Where(a => a.S_LOC_CODE == end).First();
+                if (info != null)
+                {
+                    TaskProcess.AreaRowLockState(info.N_ROW);
+                }
+            }
+        }
+
+        public static void ULlock(string end)
+        {
+            if (Settings.FULEenable == "1")
+            {
+                var db = new SqlHelper<object>().GetInstance();
+                var info = db.Queryable<Location>().Where(a => a.S_LOC_CODE == end).First();
+                if (info != null)
+                {
+                    TaskProcess.AreaRowLockState(info.N_ROW, false);
+                }
+            }
+
+        }
+
+
+
+        /// <summary>
+        /// 缂撳瓨浣嶅叆搴�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location DaMingShanGetCacheLocationIn(string area)
+        {
+            //搴撳尯璐т綅绾﹀畾锛氬垪鍙疯秺灏忚秺闈犻噷
+            Location result = null;
+            try
+            {
+                //1.1 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area).ToList();
+                LogHelper.Info($"鏌ヨ搴撳尯{area} 鐨勮揣浣嶆暟閲忎负{list.Count()}");
+                if (list.Count > 0)
+                {
+                    foreach (var a in list)
+                    {
+                        if (a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "鏃�)
+                        {
+                            result = a;
+                            break;
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+                //Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocationIn:" + ex.Message, ex);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 杈撻�绾垮彨绌烘墭
+        /// </summary>
+        /// <param name="areaCode"></param>
+        /// <returns></returns>
+        internal static Location GetEmptyOut(string areaCode, string traytype)
+        {
+            LogHelper.Info($"杈撻�绾匡細绌烘墭搴撳尯鍑哄簱绠楁硶寮�", "杈撻�绾�);
+            Location result = null;
+            var list = new SqlHelper<Location>().GetInstance().Queryable<Location>().Where(a => a.S_AREA_CODE == areaCode && a.N_CURRENT_NUM > 0).Includes(a => a.LocCntrRel).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
+            LogHelper.Info($"杈撻�绾匡細璇ュ簱鍖哄彲鐢ㄥ簱浣嶆暟閲忎负{list.Count}", "杈撻�绾�);
+            for (int i = 0; i < list.Count; i++)
+            {
+                if (list[i].LocCntrRel != null)
+                {
+                    LogHelper.Info($"鍒ゆ柇璐т綅{list[i].S_LOC_CODE} 鏉垮瀷{list[i].LocCntrRel.S_TRAY_TYPE} 涓庡伐鍗曟澘鍨媨traytype} 鏄惁涓�嚧");
+                    if (list[i].LocCntrRel.S_TRAY_TYPE == traytype)
+                    {
+                        LogHelper.Info($"杈撻�绾匡細搴撲綅{list[i].S_LOC_CODE} 鍒ゆ柇鏄惁鏈夐攣锛歿list[i].S_LOCK_STATE.Trim()}", "杈撻�绾�);
+                        if (list[i].S_LOCK_STATE.Trim() == "鏃�)
+                        {
+                            result = list[i];
+                            break;
+                        }
+                    }
+
+                }
+
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 缂撳瓨浣嶅嚭搴�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location DaMingShanGetCacheLocationOut(string area)
+        {
+            //搴撳尯璐т綅绾﹀畾锛氬垪鍙疯秺灏忚秺闈犻噷
+            Location result = null;
+            try
+            {
+                //1.1 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�
+                LogHelper.Info($"鏌ヨ{area}搴撳尯鎵�湁鐨勮揣浣�);
+                var db = new SqlHelper<object>().GetInstance();
+                var trayList = new List<LocCntrRel>();
+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == area && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE.Trim() == "鏃�).ToList();
+                LogHelper.Info($"璐т綅鏁伴噺涓簕list.Count()}");
+                if (list.Count > 0)
+                {
+                    foreach (var a in list)
+                    {
+                        //if (a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE.Trim() == "鏃�)
+                        //{
+                        //result = a;
+                        var trayNo = LocationHelper.GetLocCntrRel(a.S_LOC_CODE);
+                        if (trayNo != null)
+                        {
+                            foreach (var item in trayNo)
+                            {
+                                trayList.Add(item);
+                            }
+                        }
+                        //break;
+                        //}
+                    }
+                    if (trayList.Count > 0)
+                    {
+                        var cntr = trayList.OrderBy(a => a.T_CREATE).First();
+                        result = db.Queryable<Location>().Where(a => a.S_LOC_CODE == cntr.S_LOC_CODE).Includes(a => a.LocCntrRel).First();
+                    }
+                }
+                LogHelper.Info($"绠楁硶缁撴潫 缁撴灉{result != null}");
+            }
+            catch (Exception ex)
+            {
+
+                //Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocationIn:" + ex.Message, ex);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 缂撳瓨浣嶅嚭搴�+        /// </summary>
+        /// <param name="area"></param>
+        /// <param name="itemCode">濡傛灉itemCode鏄┖琛ㄧず绌哄鍣�/param>
+        /// <param name="standardCarryQty">鏍囧噯鎼繍鏁伴噺</param>
+        /// <returns></returns>
+        public static Location DaMingShanGetCacheLocationOut2(string area, string itemcode)
+        {
+            //搴撳尯璐т綅绾﹀畾锛氬垪鍙疯秺灏忚秺闈犻噷
+            Location result = null;
+            try
+            {
+                //1.1 鏌ュ埌鎵�湁鏈夊鍣ㄧ殑鎺�
+                LogHelper.Info($"鏌ヨ{area}搴撳尯鎵�湁鐨勮揣浣�);
+                var db = new SqlHelper<object>().GetInstance();
+                var list = db.Queryable<Location>().Where(a => a.S_AREA_CODE.Trim() == area).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList();
+                LogHelper.Info($"璐т綅鏁伴噺涓簕list.Count()}");
+                if (list.Count > 0)
+                {
+                    foreach (var a in list)
+                    {
+                        if (a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE.Trim() == "鏃� && a.LocCntrRel.CntrItemRel.S_ITEM_CODE == itemcode)
+                        {
+                            result = a;
+                            break;
+                        }
+                    }
+                }
+                LogHelper.Info($"绠楁硶缁撴潫 缁撴灉{result != null}");
+            }
+            catch (Exception ex)
+            {
+
+                //Console.WriteLine("GetLocationIn:" + ex.Message + ex.StackTrace);
+                LogHelper.Error("GetLocationIn:" + ex.Message, ex);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 娉ㄥ鏈哄嚭搴撱�缈绘枟鏈哄嚭搴�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        /// <param name="v">true:娉ㄥ鏈�false:缈绘枟鏈�/param>
+        /// <returns></returns>
+        internal static bool DaMingShanPLCOut(Settings.deviceInfo plc, string location, bool v, PGWorkOrder workOrder)
+        {
+            string startlocation = "";
+            var tasktype = "";
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            if (v)
+            {
+                //娉ㄥ鏈哄嚭搴�+                var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workOrder.S_LinkLineNo && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+                if (info != null)
+                {
+                    //鐡剁洊鏈哄嵆浜у嵆鐢�+                    if (info != null)
+                    {
+                        string ItemName = info.ItemName;
+                        if (workOrder.S_UsingNow == "Y")
+                        {
+                            tasktype = "娉ㄥ鍗充骇绌虹瓙涓婄嚎(鐡惰儦)";
+                        }
+                        else
+                        {
+                            tasktype = "娉ㄥ搴撳瓨绌虹瓙涓婄嚎(鐡惰儦)";
+                        }
+                        //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                        if (info.ProductLocation.Count() > 0)
+                        {
+                            foreach (var a in info.ProductLocation)
+                            {
+                                var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+                                if (startlocationinfo != null)
+                                {
+                                    if (startlocationinfo.N_CURRENT_NUM > 0 && startlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+                                    {
+                                        startlocation = startlocationinfo.S_LOC_CODE.Trim();
+                                        result = DaMingShanCreateTransport(startlocation, location, tasktype, startlocationinfo.LocCntrRel.S_CNTR_CODE, 1, 1, plc.deviceName, 1);
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵捐揣浣�+                        if (!result)
+                        {
+                            if (info.IsDense == 0)
+                            {
+                                foreach (var item in info.ProductArea)
+                                {
+                                    var startLocation = DaMingShanGetCacheLocationOut(item);
+                                    if (startLocation != null)
+                                    {
+                                        var cntrList = LocationHelper.GetLocCntrRel(startLocation.S_LOC_CODE.Trim());
+                                        //娣冲畨涓や釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+                                        var trayInfo = new LocCntrRel();
+                                        if (cntrList.Count >= 1)
+                                        {
+                                            //string cntrs = "";
+                                            trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(1).First();//鍗曟墭鍑哄簱
+                                        }
+                                        result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, location, tasktype, trayInfo.S_CNTR_CODE, 1, 1, plc.deviceName, 1);
+                                        break;
+                                    }
+                                }
+                            }
+                            else 
+                            {
+                                for (int i = 0; i < info.ProductArea.Count(); i++)
+                                {
+                                    string startarea = info.ProductArea[i];
+                                    var startbitlist = db.Queryable<Location>()
+                                          .Where(a => a.S_AREA_CODE == startarea && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "鏃�)
+                                          .PartitionBy(a => a.N_OROW)
+                                          .Take(1)
+                                          .OrderByDescending(a => a.N_COL)
+                                          .ToList();
+                                    foreach (var item in startbitlist)
+                                    {
+                                        var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                                        if (lockinfo == null)
+                                        {
+                                            var cntrList = LocationHelper.GetLocCntrRel(item.S_LOC_CODE.Trim());
+                                            //娣冲畨涓や釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+                                            var trayInfo = new LocCntrRel();
+                                            if (cntrList.Count >= 1)
+                                            {
+                                                //string cntrs = "";
+                                                trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(1).First();//鍗曟墭鍑哄簱
+                                            }
+                                            result = DaMingShanCreateTransport(item.S_LOC_CODE, location, tasktype, trayInfo.S_CNTR_CODE, 1, 1, plc.deviceName, 1);
+                                            break;
+                                        }
+                                    }
+                                    if (result) break;
+                                }
+                            }
+
+                        }
+                    }
+                }
+            }
+            //else
+            //{
+            //    //缈绘枟鏈哄叆搴�+            //    LogHelper.Info($"缈绘枟鏈鸿ˉ婊$瓙");
+            //    var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+            //    if (info != null)
+            //    {
+            //        LogHelper.Info($"鏌ヨ鍒版弧绛愮紦瀛樺尯淇℃伅 location={JsonConvert.SerializeObject(info.ProductLocation)} area={JsonConvert.SerializeObject(info.ProductArea)}");
+            //        string ItemName = info.ItemName;
+            //        //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+            //        if (info.ProductLocation.Count() > 0)
+            //        {
+            //            foreach (var a in info.ProductLocation)
+            //            {
+            //                var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+            //                if (startlocationinfo != null)
+            //                {
+            //                    if (startlocationinfo.N_CURRENT_NUM > 0 && startlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+            //                    {
+            //                        startlocation = startlocationinfo.S_LOC_CODE.Trim();
+            //                        result = DaMingShanCreateTransport(startlocation, location, "缈绘枟鏈鸿ˉ婊$瓙", startlocationinfo.LocCntrRel.S_CNTR_CODE, 1, 1, plc.deviceName, 1, 1, 1);
+            //                        break;
+            //                    }
+            //                }
+            //            }
+            //        }
+            //        //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵捐揣浣�+            //        if (!result)
+            //        {
+            //            LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨鍖�);
+            //            foreach (var item in info.ProductArea)
+            //            {
+            //                var startLocation = DaMingShanGetCacheLocationOut(item);
+            //                if (startLocation != null)
+            //                {
+            //                    var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == startLocation.S_LOC_CODE).Includes(a => a.LocCntrRel, a => a.CntrItemRel).First();
+            //                    result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, location, "缈绘枟鏈鸿ˉ婊$瓙", startlocationinfo.LocCntrRel.S_CNTR_CODE, 1, 1, plc.deviceName, 1, 1, 1);
+            //                    break;
+            //                }
+            //            }
+            //        }
+            //    }
+            //}
+            return result;
+        }
+
+
+        /// <summary>
+        /// 鐡跺澂缈绘枟鏈�鐡剁洊缈绘枟鏈�+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        /// <param name="v">true:娉ㄥ鏈�false:缈绘枟鏈�/param>
+        /// <returns></returns>
+        internal static bool DaMingShanPLCOut3(Settings.deviceInfo plc, string location, bool v, PGWorkOrder workorder)
+        {
+            string startlocation = "";
+            var tasktype = "";
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            if (v)
+            {
+                //娉ㄥ缈绘枟鏈哄彨鏂�+                var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workorder.S_LinkLineNo && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+                if (info != null)
+                {
+                    LogHelper.Info($"鏌ヨ鍒版弧绛愮紦瀛樺尯淇℃伅 location={JsonConvert.SerializeObject(info.ProductLocation)} area={JsonConvert.SerializeObject(info.ProductArea)}");
+                    string ItemName = info.ItemName;
+                    if (workorder.S_UsingNow == "Y")
+                    {
+                        tasktype = "缈绘枟鏈哄嵆浜ф弧绛愪笂绾�鐡惰儦)";
+                    }
+                    else
+                    {
+                        tasktype = "缈绘枟鏈哄簱瀛樻弧绛愪笂绾�鐡惰儦)";
+                    }
+                    //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                    if (info.ProductLocation.Count() > 0)
+                    {
+                        foreach (var a in info.ProductLocation)
+                        {
+                            var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+                            if (startlocationinfo != null)
+                            {
+                                if (startlocationinfo.N_CURRENT_NUM > 0 && startlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+                                {
+                                    startlocation = startlocationinfo.S_LOC_CODE.Trim();
+                                    result = DaMingShanCreateTransport(startlocation, location, tasktype, startlocationinfo.LocCntrRel.S_CNTR_CODE, startlocationinfo.N_CURRENT_NUM, 1, plc.deviceName, 1, 1, 1);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵捐揣浣�+                    if (!result)
+                    {
+                        LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨鍖�);
+                        foreach (var item in info.ProductArea)
+                        {
+                            Location startLocation = null;
+                            if (plc.deviceName != "Y9鍧� && plc.deviceName != "Y7鐩�)
+                            {
+                                startLocation = DaMingShanGetCacheLocationOut(item);
+                            }
+                            else
+                            {
+                                //璧风偣瀵嗛泦鍨�+                                startLocation = DaMingShanGetCacheLocationOut1(item);
+                            }
+                            if (startLocation != null)
+                            {
+                                var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == startLocation.S_LOC_CODE).Includes(a => a.LocCntrRel, a => a.CntrItemRel).First();
+                                result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, location, tasktype, startlocationinfo.LocCntrRel.S_CNTR_CODE, startlocationinfo.N_CURRENT_NUM, 1, plc.deviceName, 1, 1, 1);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            else
+            {
+                //鐡剁洊缈绘枟鏈哄彨鏂�+                LogHelper.Info($"缈绘枟鏈鸿ˉ婊$瓙");
+                var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+                if (info != null)
+                {
+                    LogHelper.Info($"鏌ヨ鍒版弧绛愮紦瀛樺尯淇℃伅 location={JsonConvert.SerializeObject(info.ProductLocation)} area={JsonConvert.SerializeObject(info.ProductArea)}");
+                    string ItemName = info.ItemName;
+                    if (workorder.S_UsingNow == "Y")
+                    {
+                        tasktype = "缈绘枟鏈哄嵆浜ф弧绛愪笂绾�鐡剁洊)";
+                    }
+                    else
+                    {
+                        tasktype = "缈绘枟鏈哄簱瀛樻弧绛愪笂绾�鐡剁洊)";
+                    }
+                    //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                    if (info.ProductLocation.Count() > 0)
+                    {
+                        foreach (var a in info.ProductLocation)
+                        {
+                            var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+                            if (startlocationinfo != null)
+                            {
+                                if (startlocationinfo.N_CURRENT_NUM > 0 && startlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+                                {
+                                    startlocation = startlocationinfo.S_LOC_CODE.Trim();
+                                    result = DaMingShanCreateTransport(startlocation, location, tasktype, startlocationinfo.LocCntrRel.S_CNTR_CODE, startlocationinfo.N_CURRENT_NUM, 1, plc.deviceName, 1, 1, 1);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵捐揣浣�+                    if (!result)
+                    {
+                        LogHelper.Info($"鏌ヨ婊$瓙缂撳瓨鍖�);
+                        foreach (var item in info.ProductArea)
+                        {
+                            Location startLocation = null;
+                            if (plc.deviceName != "Y9鍧� && plc.deviceName != "Y7鐩�)
+                            {
+                                startLocation = DaMingShanGetCacheLocationOut(item);
+                            }
+                            else
+                            {
+                                //璧风偣瀵嗛泦鍨�+                                startLocation = DaMingShanGetCacheLocationOut1(item);
+                            }
+                            if (startLocation != null)
+                            {
+                                var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == startLocation.S_LOC_CODE).Includes(a => a.LocCntrRel, a => a.CntrItemRel).First();
+                                result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, location, tasktype, startlocationinfo.LocCntrRel.S_CNTR_CODE, startLocation.N_CURRENT_NUM, 1, plc.deviceName, 1, 1, 1);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            return result;
+        }
+
+        private static Location DaMingShanGetCacheLocationOut1(string areaNo)
+        {
+            Location result = null;
+            var db = new SqlHelper<object>().GetInstance();
+            var startbitlist = db.Queryable<Location>()
+                .Where(a => a.S_AREA_CODE == areaNo && a.N_CURRENT_NUM > 0)
+                .Select(it => new { sum = SqlFunc.AggregateSum(it.N_CURRENT_NUM), it.N_ROW })
+                .GroupBy(it => it.N_ROW)
+                .MergeTable()
+                .OrderByDescending(it => it.sum)
+                .ToList();
+            foreach (var item in startbitlist)
+            {
+                var lockinfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaNo && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "鏃�).First();
+                if (lockinfo == null)
+                {
+                    result = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaNo && a.N_ROW == item.N_ROW && a.N_CURRENT_NUM > 0)
+                        .OrderByDescending(a => a.N_COL)
+                        .Includes(a => a.LocCntrRel)
+                        .First();
+                    break;
+                }
+            }
+
+            return result;
+        }
+
+
+        /// <summary>
+        /// 鐡剁洊鏈鸿ˉ绌虹瓙
+        /// </summary>
+        /// <param name="plc"></param>
+        /// <param name="location"></param>
+        /// <param name="v">true:鍗充骇鍗崇敤 false:闈炲嵆浜у嵆鐢�/param>
+        /// <returns></returns>
+        internal static bool DaMingShanPLCOut2(Settings.deviceInfo plc, string location, bool v, PGWorkOrder workOrder)
+        {
+            string startlocation = "";
+            var tasktype = "";
+            var db = new SqlHelper<object>().GetInstance();
+            bool result = false;
+            var info = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == plc.deviceName && a.Enable == "1" && a.ItemTrayType == "绌�).FirstOrDefault();
+            if (v)
+            {
+                //鐡剁洊鏈哄嵆浜у嵆鐢�+                if (info != null)
+                {
+                    string ItemName = info.ItemName;
+                    if (workOrder.S_UsingNow == "Y")
+                    {
+                        tasktype = "娉ㄥ鍗充骇绌虹瓙涓婄嚎(鐡剁洊)";
+                    }
+                    else
+                    {
+                        tasktype = "娉ㄥ搴撳瓨绌虹瓙涓婄嚎(鐡剁洊)";
+                    }
+                    //鏌ヨ瀵瑰簲缁堢偣鐨勫簱浣嶇姸鎬�+                    if (info.ProductLocation.Count() > 0)
+                    {
+                        foreach (var a in info.ProductLocation)
+                        {
+                            var startlocationinfo = db.Queryable<Location>().Where(b => b.S_LOC_CODE == a).First();
+                            if (startlocationinfo != null)
+                            {
+                                if (startlocationinfo.N_CURRENT_NUM > 0 && startlocationinfo.S_LOCK_STATE.Trim() == "鏃�)
+                                {
+                                    startlocation = startlocationinfo.S_LOC_CODE.Trim();
+                                    result = DaMingShanCreateTransport(startlocation, location, tasktype, startlocationinfo.LocCntrRel.S_CNTR_CODE, 1, 1, plc.deviceName, 1);
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    //瀵瑰簲缁堢偣鎵句笉鍒扮┖闂茶揣浣�浠庡搴斿簱鍖哄鎵捐揣浣�+                    if (!result)
+                    {
+                        foreach (var item in info.ProductArea)
+                        {
+                            var startLocation = DaMingShanGetCacheLocationOut(item);
+                            if (startLocation != null)
+                            {
+                                var cntrList = LocationHelper.GetLocCntrRel(startLocation.S_LOC_CODE.Trim());
+                                //娣冲畨涓や釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+                                var trayInfo = new LocCntrRel();
+                                if (cntrList.Count >= 1)
+                                {
+                                    //string cntrs = "";
+                                    trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(1).First();//鍗曟墭鍑哄簱
+                                }
+                                result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, location, tasktype, trayInfo.S_CNTR_CODE, 1, 1, plc.deviceName, 1);
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            //else
+            //{
+            //    //鐡剁洊鏈洪潪鍗充骇鍗崇敤
+            //
+            //    //闈炲嵆浜у嵆鐢�鐩存帴鍏ュ簱缂撳瓨浣�3+2
+            //    var bitinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.Enable == "1" && a.ItemTrayType == "婊�).FirstOrDefault();
+            //    if (info != null && bitinfo != null)
+            //    {
+            //        string ItemName = info.ItemName;
+            //        var locinfo = db.Queryable<Location>().Where(q => q.S_LOC_CODE == bitinfo.location).First();
+            //        if (locinfo != null)
+            //        {
+            //            if (locinfo.S_LOCK_STATE == "鏃�)
+            //            {
+            //                var cntrList = LocationHelper.GetLocCntrRel(locinfo.S_LOC_CODE.Trim());
+            //                //娣冲畨涓や釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+            //                var trayInfo = new LocCntrRel();
+            //                if (cntrList.Count >= 1)
+            //                {
+            //                    string cntrs = "";
+            //                    trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Take(1).First();//鍗曟墭鍑哄簱
+            //                }
+            //                var startley = cntrList.Count();
+            //                result = DaMingShanCreateTransport(location, locinfo.S_LOC_CODE, "娉ㄥ鍗充骇婊$瓙涓嬬嚎(鐡跺澂)", trayInfo.S_CNTR_CODE, startley, 1, plc.deviceName, 1);
+            //            }
+            //        }
+            //    }
+            //}
+            return result;
+        }
+
+        /// <summary>
+        /// 鏍囧噯鍑哄叆搴撳鐞�+        /// </summary>
+        /// <param name="bit">璧风偣鐐逛綅 鎴�缁堢偣鐐逛綅</param>
+        /// <param name="taskType">浠诲姟绫诲瀷</param>
+        /// <param name="trayCode">鎵樼洏缂栫爜</param>
+        /// <param name="areaCode">搴撳尯缂栫爜</param>
+        /// <param name="itemCode">鐗╂枡缂栫爜</param>
+        /// <param name="batchNo">鎵规鍙�/param>
+        /// <param name="itemLayer">鐗╂枡灞傛暟</param>
+        /// <param name="itemTrayType">鐗╂枡鎵樼洏绫诲瀷</param>
+        /// <param name="actionType">鍔ㄤ綔绫诲瀷 True-鍏ュ簱 False-鍑哄簱</param>
+        /// <returns></returns>
+        internal static bool DaMingShanPlcTask(string bit, string taskType, string trayCode, string areaCode, string itemCode, string batchNo, string itemLayer, string itemTrayType, string deviceName, bool actionType, string workNo = "")
+        {
+            var result = false;
+            LogHelper.Info($"鎴愬搧鍏ュ簱绠楁硶鍖归厤缁堢偣锛屼骇绾垮彿={deviceName},搴撳尯={areaCode},鐗╂枡缂栫爜={itemCode},鎵规鍙�{batchNo}", "杈撻�绾�);
+            //1.浠诲姟鍒涘缓锛氶攣瀹氳捣鐐癸紝缁堢偣锛岀粓鐐规帓鍙�鎺掗攣瀹氳〃锛堜换鍔″畬鎴愯В閿侊級锛�+            //      浠诲姟鏁版嵁鎼哄甫-鎵樼洏鐮�渚夸簬鍥炴姤)--涓や釜鎵樼洏鐮佸瓨鍏ヤ换鍔¤〃 WMSTask 鐨�鎵樼洏瀛楁 S_CNTRS 
+            //      鐗╂枡灞傛暟(NDC涓嬪彂蹇呰鍙傛暟) --璧风偣灞傛暟 N_START_LAYER 锛氶粯璁や负1
+            //                                --缁堢偣灞傛暟 N_END_LAYER 锛氳幏鍙�璐т綅琛�缁堢偣璐т綅淇℃伅 N_CAPACITY + 1
+            //2.鎻掑叆 褰撳墠鎺掑彿銆佷骇绾垮彿 鑷�鑷姩绉诲簱涓棿琛紝绛夊緟宸ュ崟瀹屾垚鍗宠繘琛�鑷姩绉诲簱
+            var db = new SqlHelper<object>().GetInstance();
+            var info = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == itemCode && a.S_ITEM_MODEL == itemLayer).First();
+            if (info != null)
+            {
+                if (actionType)
+                {
+                    var endLocation = GetLocationIn(areaCode, itemCode, batchNo, deviceName, itemLayer);
+                    if (endLocation != null)
+                    {
+                        var endLayer = endLocation.N_CURRENT_NUM + 1;
+                        //DaMingShanAnalysisMoveLib model = new DaMingShanAnalysisMoveLib { RowNo = endLocation.N_ROW, Batch = batchNo, DeviceName = deviceName };
+                        //WCSHelper.DaMingShanInsertAnalysisMoveLib(model);
+                        result = DaMingShanCreateTransport(bit, endLocation.S_LOC_CODE, taskType, trayCode, 1, endLayer, deviceName, 1, 1, int.Parse(info.S_ITEM_LAYER), workNo, batchNo, itemCode, itemTrayType);
+                    }
+                    //else //Console.WriteLine($"MoboxHelperCreateTask: 鏈壘鍒扮粓鐐硅揣浣�);
+                }
+                else
+                {
+                    var startLocation = GetLocationOut(areaCode, itemCode, batchNo, itemLayer);
+                    if (startLocation != null)
+                    {
+                        var startLayer = startLocation.N_CURRENT_NUM;
+                        var taskNo = DateTime.Now.Ticks.ToString();
+                        //娣冲畨鍙渶瑕佷竴涓竴鎷�+                        //var carryCount = startLocation.N_CURRENT_NUM > 3 ? startLocation.N_CURRENT_NUM - 3 : startLocation.N_CURRENT_NUM;
+                        //鍑哄簱瑕佷粠璧风偣鑾峰彇鎵樼洏
+                        var cntrList = LocationHelper.GetLocCntr(startLocation.S_LOC_CODE);
+                        //娣冲畨涓や釜鎵樼洏涓�涓�釜 璐т綅褰撳墠瀹归噺
+                        if (cntrList.Count == startLocation.N_CURRENT_NUM * 2)
+                        {
+                            string cntrs = "";
+                            var trayInfo = cntrList.OrderByDescending(a => a.T_CREATE).Skip(2).ToList();
+                            trayInfo.ForEach(a =>
+                            {
+                                cntrs = cntrs + "," + a.S_CNTR_CODE.Trim();
+                            });
+                            result = DaMingShanCreateTransport(startLocation.S_LOC_CODE, bit, taskType, cntrs, startLayer, 1, deviceName, 1, 1);
+                        }
+                        else
+                        {
+                            //Console.WriteLine($"璧风偣鎵樼洏鏁伴噺鍜岃揣浣嶅鍣ㄨ〃涓嶇鍚堬紝璇锋鏌ャ�璐т綅琛ㄣ�鍜屻�璐т綅瀹瑰櫒琛ㄣ�");
+                        }
+                    }
+                }
+            }
+            LogHelper.Info($"鍒涘缓浠诲姟鏄惁鎴愬姛 {result}");
+            return result;
+        }
+        #endregion
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/JobHelper.cs b/HH.WCS.NongFuChaYuan/WmsService/JobHelper.cs
new file mode 100644
index 0000000..b7ffbef
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/JobHelper.cs
@@ -0,0 +1,46 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    internal class JobHelper
+    {
+        /// <summary>
+        /// 瀵嗛泦鍨嬪叆搴�+        /// </summary>
+        /// <returns></returns>
+        public Location IntensiveIn() {
+            Location location = null;
+            return location;
+        }
+        /// <summary>
+        /// 瀵嗛泦鍨嬪嚭搴�+        /// </summary>
+        /// <returns></returns>
+        public Location IntensiveOut() {
+            Location location = null;
+            return location;
+        }
+
+        /// <summary>
+        /// 鏅�鍏ュ簱
+        /// </summary>
+        /// <returns></returns>
+        public Location NormalIn() {
+            Location location = null;
+            return location;
+        }
+
+        /// <summary>
+        /// 鏅�鍑哄簱
+        /// </summary>
+        /// <returns></returns>
+        public Location NormalOut() {
+            Location location = null;
+            return location;
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/LocationHelper.cs b/HH.WCS.NongFuChaYuan/WmsService/LocationHelper.cs
new file mode 100644
index 0000000..3152512
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/LocationHelper.cs
@@ -0,0 +1,544 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using HH.WCS.NongFuChaYuan.TaskController;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    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 =>
+                {
+                    try
+                    {
+                        locations.Add(a.S_LOC_CODE.Trim(), a);
+                    }
+                    catch (Exception ex)
+                    {
+                        //Console.WriteLine($"绔欑偣{a.S_LOC_CODE}寮傚父,寮傚父淇℃伅={ex.Message}");
+                    }
+                });
+            }
+            ////鍒濆鍖杔ocationExt鍔犲叆鍒伴泦鍚堢紦瀛�+            //locationExts = new Dictionary<string, LocationExt>();
+            //var exts = GetAllLocExtList();
+            //if (exts.Count > 0) {
+            //    exts.ForEach(a => {
+            //        locationExts.Add($"{a.S_LOC_CODE.Trim()}_{a.S_PICKUP_POINT.Trim()}", a);
+            //    });
+            //}
+        }
+
+        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>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static int GetAgvSite(string loc)
+        {
+            var site = 0;
+            if (locations.Keys.Contains(loc.Trim()))
+            {
+                var location = locations[loc.Trim()];
+                site = location.N_AGV_CODE;
+            }
+            else
+            {
+                var location = GetLoc(loc.Trim());
+                if (location != null)
+                {
+                    locations.Add(loc.Trim(), location);
+                    site = location.N_AGV_CODE;
+                }
+            }
+            return site;
+        }
+
+        internal static int GetAgvSite(string loc, string actionType)
+        {
+            var site = 0;
+            var key = $"{loc.Trim()}_{actionType.Trim()}";
+            if (locationExts.Keys.Contains(loc.Trim()))
+            {
+                var location = locationExts[loc.Trim()];
+                site = int.Parse(location.S_AGV_SITE);
+            }
+            return site;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎵�湁璐т綅淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        internal static List<Location> GetAllLocList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().ToList();
+        }
+        internal static Location GetLoc(string code)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<Location>().Where(a => a.S_LOC_CODE.Trim() == code).First();
+        }
+
+        /// <summary>
+        ///鑾峰彇鎵�湁璐т綅鎵╁睍淇℃伅 
+        /// </summary>
+        /// <returns></returns>
+        internal static List<LocationExt> GetAllLocExtList()
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<LocationExt>().ToList();
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇娌℃湁鍏ュ簱閿佸拰鍑哄簱閿�+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        internal static bool CheckLocFree(string code)
+        {
+            var result = false;
+            var loc = GetLoc(code);
+            if (loc != null)
+            {
+                result = loc.S_LOCK_STATE.Trim() == "鏃�;
+            }
+            return result;
+        }
+        internal static List<LocCntrRel> GetLocCntr(string loc)
+        {
+            var result = new List<LocCntrRel>();
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == loc.Trim()).OrderBy(a => a.T_CREATE).ToList();
+            if (list.Count > 0)
+            {
+                list.ForEach(a =>
+                {
+                    //鑾峰彇瀹瑰櫒淇℃伅
+                    var cntr = db.Queryable<Container>().Where(b => b.S_CNTR_CODE == a.S_CNTR_CODE).First();
+                    if (cntr != null)
+                    {
+                        a.Container = cntr;
+                        result.Add(a);
+                    }
+                });
+            }
+            return result;
+        }
+        internal static List<LocCntrRel> GetLocCntrRel(string loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var result = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == loc.Trim()).ToList();
+            return result;
+        }
+
+
+        //internal static bool UpdateBit(string itemcode)
+        //{
+        //    bool result = true;
+        //    var db = new SqlHelper<object>().GetInstance();
+        //    if (!string.IsNullOrEmpty(itemcode))
+        //    {
+        //        var info = Settings.GetDaMingShanItemNameList().Where(a => a.ItemName == itemcode).FirstOrDefault();
+        //        if (info != null) 
+        //        {
+        //            if (info.Package == "绾稿寘") 
+        //            {
+        //                result = false;
+        //            }
+        //        }
+        //    }
+        //    return result;
+        //}
+
+        /// <summary>
+        /// 鏍规嵁璐т綅闆嗗悎鑾峰彇鏈夊鍣ㄧ殑璐т綅
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocList(List<string> loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_LOC_CODE) && a.N_CURRENT_NUM > 0).ToList();
+            return list;
+        }
+
+        /// <summary>
+        /// 鏍规嵁璐т綅缂栫爜鑾峰彇璐т綅淇℃伅锛屼笉绠℃湁娌℃湁瀹瑰櫒
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        internal static List<Location> GetLocListAny(List<string> loc)
+        {
+            //1.0 鏌ヨ揣浣嶅鍣ㄨ〃
+            var db = new SqlHelper<object>().GetInstance();
+            var list = db.Queryable<Location>().Where(a => loc.Contains(a.S_LOC_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_LOC_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_LOC_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_LOC_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_LOC_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)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == loc).First();
+            if (model != null)
+            {
+                //var info = Settings.GetAreaTypeList().Where(a => a.AreaCode.Contains(model.S_AREA_CODE)&&a.AreaType=="婊�).FirstOrDefault();
+                var info = db.Queryable<ItemArea>().Where(a => a.S_AREA_CODE == model.S_AREA_CODE).First();
+                if (info != null)
+                {
+                    //鎴愬搧搴撳尯鍚屾椂閿佸畾涓変釜璐т綅
+                    var loclist = db.Queryable<Location>().Where(a => a.N_ROW == model.N_ROW && a.N_COL == model.N_COL).ToList();
+                    loclist.ForEach(a =>
+                    {
+                        a.S_LOCK_STATE = lockState;
+                        res = db.Updateable(a).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
+                    });
+                }
+                else
+                {
+                    model.S_LOCK_STATE = lockState;
+                    res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
+                }
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 鍙栬揣瀹岃В閿佽捣鐐癸紝鍗歌揣瀹岃В閿佺粓鐐癸紝鍙楠岄攣鐨勬潵婧愶紝涔熷彲浠ヤ笉鏍¢獙
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <returns></returns>
+        public static bool UnLockLoc(string loc, string type = "")
+        {
+            LogHelper.Info("UnLockLoc:" + loc);
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == loc).First();
+            if (model != null)
+            {
+                //if (type.Contains("涓嬬嚎"))
+                //{
+                //    TaskProcess.AreaRowLockState(model.N_ROW, false);
+                //}
+
+                //var info = Settings.GetAreaTypeList().Where(a => a.AreaCode.Contains(model.S_AREA_CODE)&&a.AreaType=="婊�).FirstOrDefault();
+                var info = db.Queryable<ItemArea>().Where(a => a.S_AREA_CODE == model.S_AREA_CODE).First();
+                if (info != null)
+                {
+                    var yikulock = db.Queryable<Location>().Where(a => a.N_ROW == model.N_ROW && a.S_LOCK_STATE == "绉诲簱閿�).First();
+                    if (yikulock != null)
+                    {
+                        //绉诲簱浠诲姟 鍑哄簱閿佹敼鎴愮Щ搴撻攣
+                        db.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "绉诲簱閿� }).Where(a => a.N_ROW == model.N_ROW && a.N_COL == model.N_COL).ExecuteCommand();
+                    }
+                    else
+                    {
+                        db.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "鏃� }).Where(a => a.N_ROW == model.N_ROW && a.N_COL == model.N_COL).ExecuteCommand();
+                    }
+                }
+                else
+                {
+                    model.S_LOCK_STATE = "鏃�;
+                    res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
+                    LogHelper.Info($"UnLockLoc:璐т綅{model.S_LOC_CODE} 瑙i攣缁撴灉" + res);
+                }
+
+            }
+            else
+            {
+                LogHelper.Info("UnLockLoc 澶辫触");
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 鍒犻櫎璐т綅瀹瑰櫒琛ㄨ褰�淇敼璐т綅瀹瑰櫒鏁伴噺
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static bool UnBindingLoc(string loc, List<string> cntrs, WMSTask mst)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var location = db.Queryable<Location>().Where(a => a.S_LOC_CODE == loc).First();
+            int count = 0;
+            try
+            {
+                db.BeginTran();
+                if (cntrs.Count > 0)
+                {
+                    LogHelper.Info($"鍙栬揣瀹屾垚瑙g粦鎵樼洏锛氬叏閮ㄦ墭鐩樼爜锛歿JsonConvert.SerializeObject(cntrs)}");
+                    cntrs.ForEach(a =>
+                    {
+                        if (!string.IsNullOrEmpty(a))
+                        {
+                            string trayCode = a.Trim();
+                            db.Deleteable<LocCntrRel>().Where(it => it.S_CNTR_CODE == trayCode && it.S_LOC_CODE == loc).ExecuteCommand();
+                            count++;
+                            LogHelper.Info($"鍙栬揣瀹屾垚瑙g粦鎵樼洏锛氭墭鐩樼爜锛歿trayCode}");
+                        }
+                    });
+                }
+
+                if (mst.S_TYPE.Contains("鎴愬搧涓嬬嚎") || mst.S_TYPE.Contains("绉诲簱") || mst.S_TYPE.Contains("鏍堟澘涓婄嚎"))
+                {
+                    if (location.N_CURRENT_NUM != 0) location.N_CURRENT_NUM = location.N_CURRENT_NUM - 1;
+                }
+                else
+                {
+                    if (location.N_CURRENT_NUM != 0) location.N_CURRENT_NUM = location.N_CURRENT_NUM - count;
+                }
+
+                if (location.N_CURRENT_NUM < 0) location.N_CURRENT_NUM = 0;
+                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
+
+                var yikulock = db.Queryable<Location>().Where(a => a.N_ROW == location.N_ROW && a.S_LOCK_STATE == "绉诲簱閿�).First();
+                if (yikulock != null)
+                {
+                    //绉诲簱浠诲姟 鍑哄簱閿佹敼鎴愮Щ搴撻攣
+                    var result = db.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "绉诲簱閿� }).Where(a => a.N_ROW == location.N_ROW && a.N_COL == location.N_COL).ExecuteCommand() > 0;
+                    LogHelper.Info($"绉诲簱瑙i攣璐т綅 缁撴灉{result}");
+                }
+                else
+                {
+                    var result = db.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "鏃� }).Where(a => a.N_ROW == location.N_ROW && a.N_COL == location.N_COL).ExecuteCommand() > 0;
+                    LogHelper.Info($"鍏ュ簱瑙i攣璐т綅 缁撴灉={result}");
+                }
+
+
+                db.Ado.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"瑙g粦寮傚父={ex.Message}", ex);
+                db.Ado.RollbackTran();
+            }
+            return res;
+        }
+        /// <summary>
+        /// 璐т綅缁戝畾瀹瑰櫒
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static bool BindingLoc(string loc, List<string> cntrs, WMSTask mst)
+        {
+            LogHelper.Info($"浠诲姟{mst.S_TASK_NO} 瑙i攣缁堢偣璐т綅 缁戝畾缁堢偣璐т綅");
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var location = db.Queryable<Location>().Where(a => a.S_LOC_CODE == loc).First();
+            try
+            {
+                var lcrList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == loc).ToList();
+                db.BeginTran();
+                int count = 0;
+                string deviceName = "";
+                if (mst.S_TYPE.Contains("鎴愬搧涓嬬嚎") || mst.S_TYPE.Contains("绉诲簱"))
+                {
+                    deviceName = mst.S_SRC_SYS;
+                }
+                cntrs.ForEach(a =>
+                {
+                    if (lcrList.Count(b => b.S_CNTR_CODE.Trim() == a) == 0 && !string.IsNullOrEmpty(a))
+                    {
+                        db.Insertable<LocCntrRel>(new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = a, S_SRC = deviceName }).ExecuteCommand();
+                        count++;
+                    }
+                });
+                if ((mst.S_TYPE.Contains("鎴愬搧涓嬬嚎") || mst.S_TYPE.Contains("绉诲簱")) && count > 0)
+                {
+                    count = 1;
+                }
+                location.N_CURRENT_NUM = location.N_CURRENT_NUM + count;
+                //鍥犲嚭鐜板悓涓�潯浠诲姟澶氭缁戝畾鍚屼竴鐐逛綅鐨勬儏鍐碉紝鍥犳褰�褰撳墠璐т綅澶勭悊鍚庣殑鏁伴噺澶т簬褰撳墠瀹瑰櫒鏁伴噺锛屽嵆鏇存柊瀹瑰櫒鏁伴噺涓哄綋鍓嶆暟閲�+                if (location.N_CURRENT_NUM > location.N_CAPACITY) location.N_CURRENT_NUM = location.N_CAPACITY;
+
+
+                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
+
+
+
+                var yikulock = db.Queryable<Location>().Where(a => a.N_ROW == location.N_ROW && a.S_LOCK_STATE == "绉诲簱閿�).First();
+                if (yikulock != null)
+                {
+                    //绉诲簱浠诲姟 鍑哄簱閿佹敼鎴愮Щ搴撻攣
+                    db.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "绉诲簱閿� }).Where(a => a.N_ROW == location.N_ROW && a.N_COL == location.N_COL).ExecuteCommand();
+                }
+                else
+                {
+                    db.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "鏃� }).Where(a => a.N_ROW == location.N_ROW && a.N_COL == location.N_COL).ExecuteCommand();
+                }
+                //if (location.S_LOCK_STATE.Trim() != "绉诲簱閿�)
+                //{
+                //    LogHelper.Info($"浠诲姟{mst.S_TASK_NO} 瑙i攣缁堢偣 鎴愬搧搴撳尯鍚屾椂瑙i攣涓変釜璐т綅");
+                //    location.S_LOCK_STATE = "鏃�;
+                //    #region 鎴愬搧涓変釜搴撳尯閮藉緱瑙i攣
+                //    //var info = Settings.GetAreaTypeList().Where(a => a.AreaCode.Contains(location.S_AREA_CODE)&&a.AreaType=="婊�).FirstOrDefault();
+                //    var info = db.Queryable<ItemArea>().Where(a => a.S_AREA_CODE == location.S_AREA_CODE).First();
+                //    if (info != null)
+                //    {
+                //        var loclist = db.Queryable<Location>().Where(a => a.N_ROW == location.N_ROW && a.N_COL == location.N_COL).ToList();
+                //        loclist.ForEach(a =>
+                //        {
+                //            a.S_LOCK_STATE = "鏃�;
+                //            var bol = db.Updateable(a).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
+                //            LogHelper.Info($"浠诲姟{mst.S_TASK_NO} 瑙i攣璐т綅{a.S_LOC_CODE} 缁撴灉{bol}");
+                //
+                //        });
+                //    }
+                //    else
+                //    {
+                //        LogHelper.Info($"浠诲姟{mst.S_TASK_NO}缁堢偣搴撳尯涓嶅湪浼樺厛涓嬬嚎搴撳尯琛ㄤ腑");
+                //    }
+                //    #endregion
+                //}
+
+
+                db.Ado.CommitTran();
+                res = true;
+            }
+            catch (Exception ex)
+            {
+                db.Ado.RollbackTran();
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 浜х嚎璁惧鍙e浣�鏍堟澘涓婄嚎浠诲姟 璁惧鍙f暟閲忎繚鎸�
+        /// </summary>
+        /// <param name="loc"></param>
+        /// <param name="cntrs"></param>
+        /// <returns></returns>
+        public static bool SetPlcState(string loc, List<string> cntrs)
+        {
+            var res = false;
+            var db = new SqlHelper<object>().GetInstance();
+            var location = db.Queryable<Location>().Where(a => a.S_LOC_CODE == loc).First();
+            try
+            {
+                if (location != null)
+                {
+                    db.BeginTran();
+                    location.N_CURRENT_NUM = 0;
+                    location.S_LOCK_STATE = "鏃�;
+                    db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE }).ExecuteCommand();
+                    db.Ado.CommitTran();
+                    res = true;
+                }
+            }
+            catch (Exception ex)
+            {
+                db.Ado.RollbackTran();
+            }
+            return res;
+        }
+
+        internal static string GetCntrItemRel(string LOC_CODE)
+        {
+            var result = "";
+            var db = new SqlHelper<object>().GetInstance();
+            var info = db.Queryable<Location>().Where(a => a.S_LOC_CODE == LOC_CODE).Includes(a => a.LocCntrRel, b => b.CntrItemRel).First();
+            result = info.LocCntrRel.CntrItemRel.S_ITEM_CODE;
+            return result;
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/NormalArea.cs b/HH.WCS.NongFuChaYuan/WmsService/NormalArea.cs
new file mode 100644
index 0000000..341cad0
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/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.NongFuChaYuan.WmsService
+{
+    /// <summary>
+    /// 鏅�搴撳尯
+    /// </summary>
+    internal class NormalArea
+    {
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/SYSHelper.cs b/HH.WCS.NongFuChaYuan/WmsService/SYSHelper.cs
new file mode 100644
index 0000000..1c973f5
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/SYSHelper.cs
@@ -0,0 +1,63 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    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;
+        }
+        /// <summary>
+        /// 鐢熸垚鐗瑰畾浣嶆暟鐨勫敮涓�瓧绗︿覆
+        /// </summary>
+        /// <param name="num">鐗瑰畾浣嶆暟</param>
+        /// <returns></returns>
+        public static string GenerateUniqueText(int num)
+        {
+            string randomResult = string.Empty;
+            string readyStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+            char[] rtn = new char[num];
+            Guid gid = Guid.NewGuid();
+            var ba = gid.ToByteArray();
+            for (var i = 0; i < num; i++)
+            {
+                rtn[i] = readyStr[((ba[i] + ba[num + i]) % 35)];
+            }
+            foreach (char r in rtn)
+            {
+                randomResult += r;
+            }
+            return randomResult;
+        }
+        [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/HH.WCS.NongFuChaYuan/WmsService/TaskHelper.cs b/HH.WCS.NongFuChaYuan/WmsService/TaskHelper.cs
new file mode 100644
index 0000000..973e571
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/TaskHelper.cs
@@ -0,0 +1,259 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using HH.WCS.NongFuChaYuan.TaskController;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    internal class TaskHelper
+    {
+        internal static string GenerateTaskNo() {
+            var date = DateTime.Now.ToString("yyMMdd");
+            var id = SYSHelper.GetSerialNumber(date, "TN");
+            return $"TN{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;
+
+            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand();
+
+            return res;
+        }
+        internal static bool UpdateInfo(WMSTask task, string sourceNo, string endBit, string status) {
+            var res = false;
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            task.S_B_STATE = status;
+            task.S_SRC_NO = sourceNo;
+            task.S_END_LOC = endBit;
+            db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.S_SRC_NO, it.S_END_LOC }).ExecuteCommand();
+            return res;
+        }
+        internal static WMSTask GetTask(string no) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_TASK_NO.Trim() == no && a.S_B_STATE != "鍙栨秷" && a.S_B_STATE != "瀹屾垚" && a.S_B_STATE != "澶辫触").First();
+            return task;
+        }
+        internal static WMSTask GetTaskBySrcNo(string no) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_SRC_NO.Trim() == no).First();
+            return task;
+        }
+        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,int itemLayer = 5,string workNo = "") {
+            //寮傚父1锛氭澶勯渶瑕佽瀹炴柦鍒涘缓鏁版嵁琛ㄦ椂灏嗘暟鎹簱琛ㄥ瓧娈甸暱搴﹁缃暱涓�簺-64锛屼笉鐒惰皟鐢ㄦ帴鍙f墦鍗颁笉鍑鸿缁嗕俊鎭�+            bool result = false;
+            try
+            {
+                var fromLoc = LocationHelper.GetLocation(from);
+                var endLoc = LocationHelper.GetLocation(to);
+                if (fromLoc != null && endLoc != null)
+                {
+                    WMSTask wmsTask = new WMSTask()
+                    {
+                        S_TASK_NO = GenerateTaskNo(),
+                        S_SRC_SYS = workNo,
+                        S_START_LAREA = fromLoc.S_AREA_CODE,
+                        S_END_LAREA = endLoc.S_AREA_CODE,
+                        S_START_LOC = from,
+                        S_END_LOC = to,
+                        S_TYPE = taskType,
+                        S_SRC_NO = workNo,
+                        N_PRIORITY = pri,
+                        S_WORK_MODE = "agv",
+                        S_B_STATE = "鏈墽琛�,
+                        S_CNTRS = cntrInfo,
+                        N_START_LAYER = startLayer,
+                        N_END_LAYER = endLayer,
+                        N_CNTR_COUNT = cntrCount,
+                        S_NOTE = itemLayer.ToString()
+                    };
+                    result = CreateTask(wmsTask);
+                }
+                else
+                {
+                    //Console.WriteLine($"鍒涘缓浠诲姟寮傚父锛氳捣鐐规垨缁堢偣璐т綅鏁版嵁涓虹┖锛佽捣鐐癸細{fromLoc},缁堢偣锛歿endLoc}"); 
+                }
+            }
+            catch(Exception ex)
+            {
+                LogHelper.Error($"鍒涘缓浠诲姟寮傚父锛歿ex.Message}", ex);
+            }
+            
+            return result;
+        }
+
+        internal static void UpdateAgvNo(WMSTask wmsTask, string forkliftNo)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            wmsTask.S_EQ_NO = forkliftNo;
+            db.Updateable(wmsTask).UpdateColumns(it => new { it.S_EQ_NO }).ExecuteCommand();
+        }
+
+        internal static bool DaMingShanCreateTask(string no, string from, string to, string taskType, int pri, string cntrInfo, string deviceName, int cntrCount = 1, int startLayer = 1, int endLayer = 1, int itemLayer = 5, string workNo = "", string Batch = "", string itemcode = "",string traytype="")
+        {
+            //寮傚父1锛氭澶勯渶瑕佽瀹炴柦鍒涘缓鏁版嵁琛ㄦ椂灏嗘暟鎹簱琛ㄥ瓧娈甸暱搴﹁缃暱涓�簺-64锛屼笉鐒惰皟鐢ㄦ帴鍙f墦鍗颁笉鍑鸿缁嗕俊鎭�+            bool result = false;
+            try
+            {
+                var fromLoc = LocationHelper.GetLocation(from);
+                var endLoc = LocationHelper.GetLocation(to);
+                if (fromLoc != null && endLoc != null)
+                {
+                    WMSTask wmsTask = new WMSTask()
+                    {
+                        S_TASK_NO = GenerateTaskNo(),
+                        S_SRC_SYS = deviceName,
+                        S_START_LAREA = fromLoc.S_AREA_CODE,
+                        S_END_LAREA = endLoc.S_AREA_CODE,
+                        S_START_LOC = from,
+                        S_END_LOC = to,
+                        S_TYPE = taskType,
+                        S_SRC_NO = workNo,
+                        N_PRIORITY = pri,
+                        S_WORK_MODE = "agv",
+                        S_B_STATE = "鏈墽琛�,
+                        S_CNTRS = cntrInfo,
+                        N_START_LAYER = startLayer,
+                        N_END_LAYER = endLayer,
+                        N_CNTR_COUNT = cntrCount,
+                        S_NOTE = itemLayer.ToString(),
+                        S_BATCH_NO = Batch,
+                        S_ITEM_CODE = itemcode,
+                        S_CNTR_TYPE=traytype
+                    };
+                    LogHelper.Info($"鍒涘缓浠诲姟淇℃伅={JsonConvert.SerializeObject(wmsTask)}");
+                    result = CreateTask(wmsTask);
+                    LogHelper.Info($"鍒涘缓浠诲姟缁撴灉 {result}");
+                    if (result) TaskProcess.GeneralInterFaceFunc(wmsTask, "8");
+                }
+                else
+                {
+                    //Console.WriteLine($"鍒涘缓浠诲姟寮傚父锛氳捣鐐规垨缁堢偣璐т綅鏁版嵁涓虹┖锛佽捣鐐癸細{fromLoc},缁堢偣锛歿endLoc}");
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Error($"鍒涘缓浠诲姟寮傚父锛歿ex.Message}", ex);
+            }
+
+            return result;
+        }
+        internal static bool CheckExist(string no) {
+            return GetTask(no.Trim())!=null;
+        }
+
+        internal static bool CheckExistSrc(string no)
+        {
+            return GetTaskBySrcNo(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_TASK_NO.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;
+        }
+
+        /// <summary>
+        /// 浠诲姟鏈帹閫佹垨鑰呮帹閫佹湭鎵ц鏃舵洿鏂拌〃鏁版嵁
+        /// </summary>
+        /// <param name="no"></param>
+        /// <param name="priority"></param>
+        /// <returns></returns>
+        internal static bool UpdatePriority(string no, int priority)
+        {
+            var res = false;
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            var task = db.Queryable<WMSTask>().Where(a => a.S_TASK_NO.Trim() == no).First();
+            if (task != null)
+            {
+                task.N_PRIORITY = priority;
+                //闇�鍒ゆ柇浠诲姟鏄惁澶辫触鎴栬�宸插畬鎴愶紝涓嶅厑璁稿啀淇敼
+                res = db.Updateable(task).UpdateColumns(it => new { it.N_PRIORITY }).ExecuteCommand() > 0;
+            }
+            return res;
+        }
+        internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData) {
+            var db = new SqlHelper<WmsTaskAction>().GetInstance();
+            var action = new WmsTaskAction() {
+                S_ACTION_CODE = state.ToString(),
+                S_TASK_NO = no,
+                S_EQ_NO = forkliftNo,
+                S_EQ_TYPE = "agv",
+                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_NO.Trim() == no.Trim() && a.S_ACTION_CODE == code) > 0;
+        }
+        internal static void Begin(WMSTask task,string agvNo) {
+            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 = agvNo;
+                    db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.T_START_TIME,it.S_EQ_NO}).ExecuteCommand();
+                }
+            }
+        }
+        internal static void End(WMSTask task) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            if (task != null) {
+                task.S_B_STATE = "瀹屾垚";
+                task.T_END_TIME = DateTime.Now;
+                if (task.S_TYPE.Trim().Contains("绉诲簱") && !string.IsNullOrEmpty(task.S_SRC_NO.Trim())) IntensiveArea.UpdateWorkNum(task);
+                db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.T_END_TIME }).ExecuteCommand();
+            }
+
+        }
+        internal static void Fail(WMSTask task) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            if (task != null) {
+                //鍒ゆ柇鏈夋病鏈夊彇璐у畬鎴愶紝娌℃湁灏卞彉鎴愬け璐ャ�鏈夊彇璐у畬鎴愰粯璁ゅ畬鎴愪簡锛堣窡鎹」鐩�瀹氾紝鏈変簺椤圭洰浜哄伐鎷夎蛋浜嗕篃娌℃湁鏀惧埌缁堢偣锛夈�
+                task.S_B_STATE = "澶辫触";
+                db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand();
+            }
+        }
+        internal static bool CreateTask(WMSTask wmsTask) {
+            var db = new SqlHelper<WMSTask>().GetInstance();
+            return db.Insertable(wmsTask).ExecuteCommand() > 0;
+        }
+
+        /// <summary>
+        /// 鏍规嵁浠诲姟鐘舵�鑾峰彇浠诲姟
+        /// </summary>
+        /// <param name="state"></param>
+        /// <returns></returns>
+        internal static List<WMSTask> GetTaskListByState(string state) {
+            var db = new SqlHelper<object>().GetInstance();
+            return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state).ToList();
+        }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/WCSHelper.cs b/HH.WCS.NongFuChaYuan/WmsService/WCSHelper.cs
new file mode 100644
index 0000000..3d2ae3b
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/WCSHelper.cs
@@ -0,0 +1,234 @@
+锘縰sing HH.WCS.NongFuChaYuan.OtherService;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    /// <summary>
+    /// 宸ュ崟銆佽澶囩姸鎬佺鐞�+    /// </summary>
+    public class WCSHelper
+    {
+        static WCSHelper()
+        {
+        }
+
+
+
+        #region 澶ф槑灞盬CS涓氬姟澶勭悊
+
+
+        /// <summary>
+        /// 澶ф槑涓�鏌ヨ宸ュ崟淇℃伅--鎵ц涓�+        /// </summary>
+        /// <param name="orderType"></param>
+        /// <returns></returns>
+        public static List<WorkOrder> GetDaMingShanAnalysisOrderWork(string orderType)
+        {
+            var order = new SqlHelper<WorkOrder>().GetList(a => a.S_ORDER_TYPE == orderType && a.S_WorkState == "鎵ц涓�);
+            return order;
+        }
+
+        /// <summary>
+        /// 澶ф槑灞�鏌ヨ宸ュ崟淇℃伅
+        /// </summary>
+        /// <param name="orderType"></param>
+        /// <returns></returns>
+        public static List<WorkOrder> GetDaMingShanAnalysisOrderWorkType(string orderType, string newbatch, string deviceName)
+        {
+            var order = new SqlHelper<WorkOrder>().GetList(a => a.S_ORDER_TYPE == orderType && a.S_BatchNo == newbatch && a.S_PLineNo == deviceName);
+            return order;
+        }
+
+        /// <summary>
+        /// 鎻掑叆宸ュ崟淇℃伅
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        /// <returns></returns>
+        internal static bool DaMingShanInsertWork(WorkOrder wmsTask)
+        {
+            var db = new SqlHelper<WorkOrder>().GetInstance();
+            return db.Insertable(wmsTask).ExecuteCommand() > 0;
+        }
+
+
+        /// <summary>
+        /// 鏇存敼宸ュ崟淇℃伅锛氭墭瑙勩�鎵规鍙枫�鐗╂枡灞傛暟
+        /// </summary>
+        /// <param name="task"></param>
+        /// <param name="status"></param>
+        /// <returns></returns>
+        internal static bool UpdateWorkInfo(WorkOrder task, string batchNo = "", string itemLayer = "")
+        {
+            var res = false;
+            var db = new SqlHelper<WorkOrder>().GetInstance();
+            //task.S_TrayRules = trayRule;
+            task.S_BatchNo = batchNo;
+            task.S_ItemLayer = itemLayer;
+            db.Updateable(task).UpdateColumns(it => new { it.S_BatchNo, it.S_ItemLayer }).ExecuteCommand();
+            return res;
+        }
+        /// <summary>
+        /// 鏌ヨ鎵樼洏淇℃伅-鍏ㄩ儴-涓轰簡瀵规瘮褰撳墠鏄惁涓烘甯镐笅绾�+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static List<DaMingShanTrayInfo> GetDaMingShanTrayInfoAllList(string deviceName)
+        {
+            var order = new SqlHelper<DaMingShanTrayInfo>().GetList(a => a.deviceName == deviceName);
+            return order;
+        }
+
+        /// <summary>
+        /// 鍒涘缓鏁版嵁涓棿琛ㄨ〃
+        /// </summary>
+        /// <returns></returns>
+        public static void CreateMiddleTable()
+        {
+            //var order = new SqlHelper<ChunAnTrayInfo>().CreateTable();//瀵屽嫆浼犺緭鎵樼洏淇℃伅琛�+            //var order1 = new SqlHelper<ChunAnDeviceState>().CreateTable();//璁惧淇″彿鏃堕棿涓棿琛�+            var order2 = new SqlHelper<DaMingShanAnalysisMoveLib>().CreateTable();//鎴愬搧涓嬬嚎搴撲綅涓棿琛�+        }
+
+
+        /// <summary>
+        /// 娣冲畨-鎻掑叆璁惧淇℃伅
+        /// </summary>
+        /// <param name="wmsTask"></param>
+        /// <returns></returns>
+        internal static bool DaMingShangInsertDeviceState(DaMingShanDeviceState deviceState)
+        {
+            var db = new SqlHelper<DaMingShanDeviceState>().GetInstance();
+            return db.Insertable(deviceState).ExecuteCommand() > 0;
+        }
+        /// <summary>
+        /// 娣冲畨-鏇存敼璁惧鐘舵�:鏃堕棿-鐘舵�
+        /// </summary>
+        /// <param name="deviceInfo"></param>
+        /// <param name="status">0-榛樿鏃犲姩浣�1-绗竴娆℃敹鍒颁笅绾夸俊鍙�/param>
+        /// <param name="dateTime">绗竴娆℃敹鍒颁俊鍙锋椂鏇存柊鏃堕棿锛涘彇璐у畬鎴愬浣嶆椂闂�/param>
+        /// <returns></returns>
+        internal static bool UpdateDaMingShanDeviceState(DaMingShanDeviceState deviceInfo, string status, string dateTime, string extData = "")
+        {
+            var res = false;
+            var db = new SqlHelper<DaMingShanDeviceState>().GetInstance();
+            deviceInfo.DeviceState = status;
+            deviceInfo.DeviceTime = dateTime;
+            db.Updateable(deviceInfo).UpdateColumns(it => new { it.DeviceState, it.DeviceTime }).ExecuteCommand();
+            return res;
+        }
+        /// <summary>
+        /// 鏌ヨ褰撳墠璁惧淇℃伅
+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static DaMingShanDeviceState GetDaMingShanDeviceState(string deviceName)
+        {
+            var order = new SqlHelper<DaMingShanDeviceState>().Get(a => a.DeviceName == deviceName, a => a.DeviceTime, true);
+            return order;
+        }
+        /// <summary>
+        /// 鏌ヨ鎵樼洏淇℃伅-涓嬬嚎鏃堕棿涔嬪墠鐨勬暟鎹�+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static List<DaMingShanTrayInfo> GetDaMingShanTrayInfoList(string positionCode, string deviceName)
+        {
+            var exp = Expressionable.Create<DaMingShanTrayInfo>();
+            exp.And(it => it.deviceName == deviceName);
+            exp.AndIF(!string.IsNullOrEmpty(positionCode), it => it.positionCode == positionCode);
+            //var order = new SqlHelper<DaMingShanTrayInfo>().GetList(a => Convert.ToDateTime(a.dateTime.Trim()) < Convert.ToDateTime(dateTime) && a.deviceName == deviceName);
+            var order = new SqlHelper<DaMingShanTrayInfo>().GetList(exp.ToExpression());
+            return order;
+        }
+        /// <summary>
+        /// 澶ф槑灞�鏌ヨ宸ュ崟淇℃伅--鎵ц涓垨鑰呮殏鍋�+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static WorkOrder GetWorkOrder(string lineNo)
+        {
+            var order = new SqlHelper<WorkOrder>().Get(a => a.S_PLineNo.Trim() == lineNo && (a.S_WorkState == "鎵ц涓�), a => a.T_CREATE, true);
+            return order;
+        }
+
+        /// <summary>
+        /// 澶ф槑灞�鏌ヨ宸ュ崟淇℃伅--鎵ц涓垨鑰呮殏鍋�+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public static PGWorkOrder GetPGWorkOrder(string lineNo)
+        {
+            var order = new SqlHelper<PGWorkOrder>().Get(a => a.S_PLineNo.Trim() == lineNo && (a.S_WorkState == "鎵ц涓�), a => a.T_CREATE, true);
+            return order;
+        }
+
+        public static List<WorkOrder> GetWorkOrder1(string lineNo)
+        {
+            var db = new SqlHelper<WorkOrder>().GetInstance();
+            var order = db.Queryable<WorkOrder>().Where(a => a.S_PLineNo.Trim() == lineNo && a.S_WorkState == "鎵ц涓�).ToList();
+            return order;
+        }
+
+        public static ItemRel GetItemrel(string itemcode, string itemmodel)
+        {
+            var db = new SqlHelper<ItemRel>().GetInstance();
+            var order = db.Queryable<ItemRel>().Where(a => a.S_ITEM_CODE == itemcode && a.S_ITEM_MODEL == itemmodel).First();
+
+            return order;
+        }
+
+
+        internal static bool DaMingShanInsertAnalysisMoveLib(DaMingShanAnalysisMoveLib info)
+        {
+            var db = new SqlHelper<DaMingShanAnalysisMoveLib>().GetInstance();
+            var oldinfo = db.Queryable<DaMingShanAnalysisMoveLib>().Where(a => a.DeviceName == info.DeviceName && a.Batch == info.Batch && a.RowNo == info.RowNo).First();
+            if (oldinfo == null)
+            {
+                return db.Insertable(info).ExecuteCommand() > 0;
+            }
+            else
+            {
+                return true;
+            }
+        }
+
+        /// <summary>
+        /// 閫氳繃浜х嚎鍙风粨鏉熻嚜鍔ㄧЩ搴撳伐鍗�骞跺垹闄や腑闂磋〃淇℃伅
+        /// </summary>
+        /// <param name="WorkOrder"></param>
+        internal void EndYiKuWorkOrder(string S_PLineNo, string BatchNo, string oldbatch)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var info = db.Deleteable<DaMingShanAnalysisMoveLib>().Where(a => a.DeviceName == S_PLineNo && a.Batch == oldbatch).ExecuteCommand();
+            var workorder = db.Queryable<WorkOrder>().Where(a => a.S_PLineNo == S_PLineNo && a.S_BatchNo == BatchNo && a.S_WorkState.Trim() == "鎵ц涓� && a.S_ORDER_TYPE.Trim() == "鑷姩绉诲簱").ToList();
+            workorder.ForEach(a =>
+            {
+                a.S_WorkState = "宸插畬鎴�;
+                db.Updateable(a).UpdateColumns(it => new { it.S_WorkState }).ExecuteCommand();
+            });
+        }
+
+        internal static void UpdateDaMingShanInsertAnalysisMoveLib(string endbit)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            var oldinfo = db.Queryable<Location>().Where(a => a.S_LOC_CODE.Trim() == endbit).First();
+            if (oldinfo != null)
+            {
+                string rowNo = oldinfo.N_ROW;
+                var info = db.Queryable<Location>().Where(a => a.N_ROW == rowNo && a.N_CURRENT_NUM > 0).First();
+                if (info == null)
+                {
+                    //鍒犻櫎涓棿琛ㄥ搴旂殑鏁版嵁
+                    var Libinfo = db.Queryable<DaMingShanAnalysisMoveLib>().Where(a => a.RowNo == rowNo).First();
+                    if (Libinfo != null)
+                    {
+                        db.Deleteable<DaMingShanAnalysisMoveLib>().Where(a => a.RowNo == rowNo).ExecuteCommand();
+                    }
+                }
+            }
+        }
+        #endregion
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/WCSModel.cs b/HH.WCS.NongFuChaYuan/WmsService/WCSModel.cs
new file mode 100644
index 0000000..a420526
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/WCSModel.cs
@@ -0,0 +1,386 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ST = HH.WCS.NongFuChaYuan.OtherService.STAttribute;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    [SugarTable("dbo.HangChaAGV")]
+    public class HangChaAGV : BaseModel
+    {
+        public string ext4 { get; set; }
+        public string ext3 { get; set; }
+        public string ext2 { get; set; }
+        public string ext1 { get; set; }
+        public DateTime createDate { get; set; }
+        public string agvErrMsg { get; set; }
+        public string faildCode { get; set; }
+        public string ext5 { get; set; }
+        public string errCode2 { get; set; }
+        public string agvRunStatus { get; set; }
+        public string agvCurrTaskInfo { get; set; }
+        public string agvBattery { get; set; }
+        public string agvYPos { get; set; }
+        public string agvXPos { get; set; }
+        public string agvNo { get; set; }
+        public string agvErrCode { get; set; }
+        public string ext6 { get; set; }
+    }
+
+
+    //---------------------------------------宸ュ崟淇℃伅---------------------------------------
+
+
+    #region 澶ф槑灞变腑闂磋〃
+
+    [SugarTable("dbo.MarginAGV")]
+    public class MarginAGV : BaseModel
+    {
+        public int agvNo { get; set; }
+        public int marginGroup { get; set; }
+        /// <summary>
+        /// 鐘舵�  0-鏃犵姸鎬�  1-鍏呯數涓�  2-鍏呯數瀹屾垚
+        /// </summary>
+        public int state { get; set; }
+        public DateTime dateTime { get; set; }
+        public string singNo { get; set; } = "1";
+    }
+
+    [ST("鎴愬搧宸ュ崟琛�)]
+    public class WorkOrder : BaseModel
+    {
+        //public DateTime T_CREATE { get; set; }
+        /// <summary>
+        /// 鏁版嵁缂栧彿ID
+        /// </summary>
+        //public string SQL_id { get; set; }
+        /// <summary>
+        /// 鍗充骇鍗崇敤
+        /// </summary>
+        //public string S_UsingNo { get; set; }//鐩墠涓嶄娇鐢紝鏃犲嵆浜у嵆鐢ㄩ渶姹�+        /// <summary>
+        /// 鎵规鍙�+        /// </summary>
+        public string S_BatchNo { get; set; }
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public string S_PLineNo { get; set; }
+        /// <summary>
+        /// 鐡剁洊鏈烘満鏃狅紝缈绘枟鏈虹嚎杈瑰尯杩炴帴鍒扮炕鏂楁満鏆傚瓨鍖�+        /// </summary>
+        //public string S_LinkLineNO { get; set; }//
+
+        public string S_ItemLayer { get; set; } //鐗╂枡灞傛暟
+
+        public string S_ORDER_TYPE { get; set; }//宸ュ崟绫诲瀷
+        /// <summary>
+        /// 宸ュ崟鐘舵�
+        /// </summary>
+        public string S_WorkState { get; set; }//S_WorkState
+        /// <summary>
+        /// 宸ュ崟鍙�+        /// </summary>
+        public string S_WorkNo { get; set; }//S_WorkNo
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ItemCode { get; set; }
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        //public string S_ItemName { get; set; }//S_ItemName
+        /// <summary>
+        /// 褰撳墠宸ュ崟鎵ц鏃堕棿
+        /// </summary>
+        //public string S_Modify { get; set; }//S_Modify
+        /// <summary>
+        /// 褰撳墠宸ュ崟缁撴潫鏃堕棿
+        /// </summary>
+        //public string S_PLAN_END { get; set; }//
+        /// <summary>
+        /// 涓嬬嚎鎵樼洏绫诲瀷
+        /// </summary>
+        public string S_TrayType { get; set; }
+        public string S_StartLoca { get; set; }
+        public string S_EndLoca { get; set; }
+        public int S_YiKuNum { get; set; }
+        /// <summary>
+        /// 鎵樿
+        /// </summary>
+        public string S_TrayRules { get; set; }
+        public string S_ItemName { get; set; }
+    }
+
+
+    [ST("鍧洊宸ュ崟琛�)]
+    public class PGWorkOrder : BaseModel
+    {
+        /// <summary>
+        /// 宸ュ崟鍙�+        /// </summary>
+        public string S_WorkNo { get; set; }
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public string S_PLineNo { get; set; }
+        /// <summary>
+        /// 宸ュ崟绫诲瀷
+        /// </summary>
+        public string S_ORDER_TYPE { get; set; }
+        /// <summary>
+        /// 宸ュ崟鐘舵�
+        /// </summary>
+        public string S_WorkState { get; set; }
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ItemCode { get; set; }
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ItemName { get; set; }
+        /// <summary>
+        /// 鎬绘暟
+        /// </summary>
+        public string S_Total { get; set; }
+        /// <summary>
+        /// 鏄惁鍗充骇鍗崇敤
+        /// </summary>
+        public string S_UsingNow { get; set; }
+        /// <summary>
+        /// 杩炴帴浜х嚎
+        /// </summary>
+        public string S_LinkLineNo { get; set; }
+        /// <summary>
+        /// 杩炴帴鍖哄煙
+        /// </summary>
+        public string S_Area { get; set; }
+        /// <summary>
+        /// 杩炴帴浜х嚎2
+        /// </summary>
+        public string S_LinkLineNo2 { get; set; }
+        /// <summary>
+        /// 杩炴帴鍖哄煙2
+        /// </summary>
+        public string S_Area2 { get; set; }
+        /// <summary>
+        /// 鍗充骇姣忕瓙鎶ュ伐鏁伴噺
+        /// </summary>
+        public string S_PCNumber { get; set; }
+        /// <summary>
+        /// 闈炲嵆浜ф瘡绛愭姤宸ユ暟閲�+        /// </summary>
+        public string S_PCNumber1 { get; set; }
+        /// <summary>
+        /// 鑷姩缁撴潫宸ュ崟
+        /// </summary>
+        public string S_AutoComplete { get; set; }
+        /// <summary>
+        /// 宸叉墽琛屾暟閲�+        /// </summary>
+        public string S_Current { get; set; }
+        /// <summary>
+        /// 鍏宠仈宸ュ崟鍙�+        /// </summary>
+        public string S_Order_WorkNo { get; set; }
+    }
+
+
+    [ST("AGV璁惧淇℃伅")]
+    public class AGVDeviceDataTable : BaseModel
+    {
+        /// <summary>
+        /// 杞﹁締绫诲瀷
+        /// </summary>
+        public string equipmentType { get; set; }
+        /// <summary>
+        /// 杞﹁締鍨嬪彿
+        /// </summary>
+        public string equipmentMold { get; set; }
+        /// <summary>
+        /// 杞﹁締閾墝鍙�+        /// </summary>
+        public string equipmentCode { get; set; }
+        /// <summary>
+        /// 杞﹁締鍖哄煙
+        /// </summary>
+        public string equipmentArea { get; set; }
+        /// <summary>
+        /// 瀵瑰簲宸ュ巶缂栧彿
+        /// </summary>
+        public string orgCode { get; set; }
+        /// <summary>
+        /// 杞﹁締鎶曟斁鐘舵�
+        /// </summary>
+        public string equipmentStatus { get; set; }
+        /// <summary>
+        /// 鍞竴鏍囪瘑鐮�+        /// </summary>
+        public string proxyInterfaceCode { get; set; }
+        /// <summary>
+        /// 宸ュ巶鍚嶇О
+        /// </summary>
+        public string orgName { get; set; }
+        /// <summary>
+        /// 杞﹁締缂栫爜
+        /// </summary>
+        public string equipmentNo { get; set; }
+    }
+
+    [ST("浠诲姟绫诲瀷杞崲琛�)]
+    public class TaskTypeConvTable : BaseModel
+    {
+        public string taskTypeName { get; set; }
+        public string taskType { get; set; }
+    }
+
+    [ST("瀵屽嫆涓嬬嚎琛�)]
+    public class DaMingShanDeviceState : BaseModel
+    {
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public string DeviceName { get; set; }
+        /// <summary>
+        /// 绗竴娆℃敹鍒颁骇绾夸笅绾夸俊鍙锋椂闂�浠呮洿鏂颁竴娆�+        /// </summary>
+        public string DeviceTime { get; set; }
+        /// <summary>
+        /// 璁惧鐘舵�鏍囪瘑
+        /// --0-榛樿鍊硷細鏀跺埌涓嬬嚎淇″彿鍙互鏇存柊 DeviceStartTime
+        /// --1-閿佸畾鍊硷細鏇存柊 DeviceStartTime 鍊间箣鍚庯紝鏇存敼姝ゅ�锛屾鏃朵笉鍏佽鏇存柊 DeviceStartTime 鍊硷紝绛夊埌鍙栬揣瀹屾垚鎭㈠涓�
+        /// </summary>
+        public string DeviceState { get; set; }
+    }
+
+
+    [SugarTable("dbo.DaMingShanAnalysisMoveLib")]
+    public class DaMingShanAnalysisMoveLib : BaseModel
+    {
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public string DeviceName { get; set; }
+        /// <summary>
+        /// 鎺掑彿
+        /// </summary>
+        public string RowNo { get; set; }
+        public string Batch { get; set; }
+
+        //public string AreaCode { get; set; }
+    }
+
+
+
+    [ST("鐩樺簱涓棿琛�)]
+    public class DaMingShanPanKuTask : BaseModel
+    {
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public string S_PLineNo { get; set; }
+        /// <summary>
+        /// 鎵规鍙�+        /// </summary>
+        public string S_BatchNo { get; set; }
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ItemCode { get; set; }
+        /// <summary>
+        /// 鍝侀」
+        /// </summary>
+        public string SQL_Condition { get; set; }
+        /// <summary>
+        /// 鎺�+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true)]
+        public string N_ROW { get; set; }
+        /// <summary>
+        /// 鏁伴噺
+        /// </summary>
+        public int N_CURRENT_NUM { get; set; }
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+    }
+
+
+    [SugarTable("dbo.HttpRepeatSend")]
+    public class HttpRepeatSend : BaseModel
+    {
+        /// <summary>
+        /// 鍙戦�URL
+        /// </summary>
+        public string Url { get; set; }
+        /// <summary>
+        /// 鎺ュ彛鍚�+        /// </summary>
+        public string UrlName { get; set; }
+        /// <summary>
+        /// 鍙戦�鍙傛暟
+        /// </summary>
+        public string SendMsg { get; set; }
+        /// <summary>
+        /// 鍙戦�娆℃暟
+        /// </summary>
+        public int SendNum { get; set; }
+    }
+
+    [ST("澶ф槑灞卞瘜鍕掓墭鐩樿〃")]
+    public class DaMingShanTrayInfo : BaseModel
+    {
+        /// <summary>
+        /// 浜х嚎鍙�+        /// </summary>
+        public string deviceName { get; set; }
+        /// <summary>
+        /// 宸ュ崟鍙�+        /// </summary>
+        public string workNo { get; set; }
+        /// <summary>
+        /// 鎵樼洏鐮�+        /// </summary>
+        public string trayCode { get; set; }
+        /// <summary>
+        /// 鎵樼洏鏁伴噺
+        /// </summary>
+        public string trayNum { get; set; }
+        /// <summary>
+        /// 瀵屽嫆鎺ユ敹鍒版墭鐩樼爜鐨勬椂闂�+        /// </summary>
+        public string dateTime { get; set; }
+        /// <summary>
+        /// 鎵规鍙�-鍚屾爣鍑嗘墭瑙�+        /// </summary>
+        public string batchNo { get; set; }
+        /// <summary>
+        /// 鏍囧噯鎵樿
+        /// --鎴愬搧涓嬬嚎锛氬洜瀛樺湪涓�鍒囨崲 鐢熶骇鐗╂枡 鍔ㄤ綔锛涘洜姝ゅ皢 鎵规鍙枫�鐗╂枡灞傞珮浠ュ強鎵樿 瀛樺湪浜庣墿鏂欎俊鎭帴鍙�+        /// --涓嶄竴瀹氭瘡娆¢兘鏈夊�锛屽綋棣栨鎵樿涓�trayNum 鐩稿悓鏃讹紝闇�洿鏂拌嚦 Mobox 宸ュ崟瀵瑰簲瀛楁
+        /// --鍚庣画鏀跺埌鎵樿鏃讹紝鍏堝垽鏂綋鍓嶇墿鏂欐墭瑙�涓�宸ュ崟鎵樿鏄惁鐩稿悓锛屼笉鍚屽嵆浠h〃鎹㈢墿鏂欎簡
+        /// </summary>
+        public string trayRule { get; set; }
+        /// <summary>
+        /// 鐗╂枡灞傞珮-6銆�銆�--鍚屾爣鍑嗘墭瑙�+        /// </summary>
+        public string itemLayer { get; set; }
+        public string positionCode { get; set; }
+    }
+
+    [ST("澶ф槑灞卞瘜鍕掗攣瀹氳〃")]
+    public class FuleLock : BaseModel
+    {
+        public string RowNo { get; set; }
+        /// <summary>
+        /// 1:閿佸畾 2:瑙i攣
+        /// </summary>
+        public string LockState { get; set; }
+    }
+    #endregion
+}
diff --git a/HH.WCS.NongFuChaYuan/WmsService/WMSModel.cs b/HH.WCS.NongFuChaYuan/WmsService/WMSModel.cs
new file mode 100644
index 0000000..92680bb
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/WmsService/WMSModel.cs
@@ -0,0 +1,446 @@
+锘縰sing HH.WCS.NongFuChaYuan.TaskController;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ST = HH.WCS.NongFuChaYuan.OtherService.STAttribute;
+
+namespace HH.WCS.NongFuChaYuan.WmsService
+{
+    //---------------------------------------浠撳簱淇℃伅---------------------------------------
+    public class BaseModel
+    {
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_ID { get; set; } = Guid.NewGuid().ToString("D");
+        public string S_CREATOR_ID { get; set; } = "sa";
+        public string S_CREATOR_NAME { get; set; } = "瓒呯骇鐢ㄦ埛";
+        public DateTime T_CREATE { get; set; } = DateTime.Now;
+        public DateTime T_MODIFY { get; set; } = DateTime.Now;
+    }
+
+    /// <summary>
+    /// 璐т綅琛�+    /// 娴嬭瘯鐜1:146-TN_0036
+    /// 娴嬭瘯鐜2:198-TN_0038
+    /// 鍐滃か鍧囧窞:TN_0038
+    /// </summary>
+    [ST("璐т綅琛�)]
+    //[SugarTable("dbo.TN_0036")]
+    public class Location : BaseModel
+    {
+        public string S_LOC_CODE { get; set; }
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 浠撳簱鍚�涓嶅彲鐢�+        /// </summary>
+        public string S_WH_CODE { get; set; }
+        public int N_CAPACITY { get; set; }
+        public string S_AGV_SITE { get; set; }
+        /// <summary>
+        /// 闇�娉ㄦ剰
+        /// </summary>
+        //[SugarColumn(IsIgnore = true)]
+        public int N_AGV_CODE { get; set; }
+        public int N_CURRENT_NUM { get; set; }
+        public DateTime T_FULL_TIME { get; set; }
+        public int N_ROADWAY { get; set; }
+        public string N_ROW { get; set; }
+        public int N_OROW { get; set; }
+        public int N_COL { get; set; }
+        public int N_LAYER { get; set; }
+        /// <summary>
+        /// 鏃�鍏ュ簱閿�鍑哄簱閿�鍏跺畠閿�+        /// </summary>
+        public string S_LOCK_STATE { get; set; }
+        /// <summary>
+        /// 娣冲畨鐗规畩瀛楁--鐢ㄤ簬鏍囪璐т綅涓婃斁缃殑鎵樼洏绫诲瀷  澶ф澘-灏忔澘
+        /// </summary>
+        public string S_NOTE { get; set; }
+
+
+        [SugarColumn(IsIgnore = true)]
+        [Navigate(NavigateType.OneToOne, nameof(S_LOC_CODE))]
+        public LocCntrRel LocCntrRel { get; set; }
+    }
+    /// <summary>
+    /// 璐т綅瀹瑰櫒琛�+    /// 娴嬭瘯鐜1:146-TN_0038
+    /// 娴嬭瘯鐜2:198-TN_0130
+    /// 鍐滃か鍧囧窞:TN_0039
+    /// </summary>
+    //[SugarTable("dbo.TN_0038")]
+    [ST("璐т綅瀹瑰櫒琛�)]
+    public class LocCntrRel : BaseModel
+    {
+        /// <summary>
+        /// 娉ㄦ剰锛宮apper鏂瑰紡涓嶉渶瑕�+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_LOC_CODE { get; set; }
+        public string S_CNTR_CODE { 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; }
+        /// <summary>
+        /// 鎵樼洏鏉ユ簮
+        /// </summary>
+        public string S_SRC { get; set; }
+        public string S_TRAY_TYPE { get; set; }
+    }
+    /// <summary>
+    /// 瀹瑰櫒鐗╂枡琛�+    /// 娴嬭瘯鐜1:146-TN_0030
+    /// 娴嬭瘯鐜2:198-TN_0116
+    /// 鍐滃か鍧囧窞:TN_0028
+    /// </summary>
+    //[SugarTable("dbo.TN_0030")]
+    [ST("瀹瑰櫒鐗╂枡琛�)]
+    public class CntrItemRel : BaseModel
+    {
+        [SugarColumn(IsPrimaryKey = true)]
+        public string S_CNTR_CODE { get; set; }
+        public string S_ITEM_CODE { get; set; }
+        public string S_BATCH_NO { get; set; }
+        public string F_QTY { get; set; }
+        /// <summary>
+        /// 鐗╂枡瑙勬牸/灞傞珮
+        /// </summary>
+        public string S_ITEM_MODEL { get; set; }
+        public string S_ITEM_STATE { get; set; }
+        public string D_INSTOCK_DATE { get; set; }
+        /// <summary>
+        /// 鍒嗛厤閲�+        /// </summary>
+        public double F_ALLOCATION { get; set; }
+        public string S_ORDER_NO { get; set; }
+        public string S_SRC { get; set; }
+
+    }
+
+
+
+    /// <summary>
+    /// 鐗╂枡琛�+    /// 娴嬭瘯鐜1:146-TN_0030
+    /// 娴嬭瘯鐜2:198-TN_0116
+    /// 鍐滃か鍧囧窞:TN_0028
+    /// </summary>
+    //[SugarTable("dbo.TN_0030")]
+    [ST("鐗╂枡琛�)]
+    public class ItemRel : BaseModel
+    {
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+        /// <summary>
+        /// 鐗╂枡瑙勬牸/灞傞珮
+        /// </summary>
+        public string S_ITEM_MODEL { get; set; }
+        /// <summary>
+        /// 涓嬪彂TS楂樺害鍊�+        /// </summary>
+        public string S_ITEM_LAYER { get; set; }
+        /// <summary>
+        /// 鏍堟澘绫诲瀷
+        /// </summary>
+        public string S_TRAY_TYPE { get; set; }
+
+    }
+    /// <summary>
+    /// 鎺掗攣琛�+    /// 娴嬭瘯鐜1:146-TN_0031
+    /// 娴嬭瘯鐜2:198-TN_0117
+    /// 鍐滃か鍧囧窞:TN_0029
+    /// </summary>
+    //[SugarTable("dbo.TN_0031")]
+    [ST("鎺掗攣琛�)]
+    public class RowLock : BaseModel
+    {
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 鎺掑彿
+        /// </summary>
+        public string N_ROW { get; set; }
+        /// <summary>
+        /// 閿佸畾鐘舵�--榛樿锛氭棤
+        /// </summary>
+        public string S_LOCK_STATE { get; set; }
+        /// <summary>
+        /// 宸ヤ綔妯″紡
+        /// </summary>
+        public string S_WORK_MODE { get; set; }
+        /// <summary>
+        /// 閿佹潵婧�+        /// </summary>
+        public string S_LOCK_SRC { get; set; }
+        /// <summary>
+        /// 閿佸畾鏃堕棿
+        /// </summary>
+        public DateTime T_LOCK_TIME { get; set; }
+        /// <summary>
+        /// 瑙i攣鏃堕棿
+        /// </summary>
+        public DateTime T_UNLOCK_TIME { get; set; }
+    }
+
+    /// <summary>
+    /// 瀹瑰櫒琛�+    /// 娴嬭瘯鐜1:146-TN_0028
+    /// 娴嬭瘯鐜2:198-TN_0114
+    /// 鍐滃か鍧囧窞:TN_0026
+    /// </summary>
+    //[SugarTable("dbo.TN_0028")]
+    [ST("瀹瑰櫒琛�)]
+    public class Container : BaseModel
+    {
+        /// <summary>
+        /// 瀹瑰櫒缂栫爜
+        /// </summary>
+        public string S_CNTR_CODE { get; set; }
+        /// <summary>
+        /// 閾佹墭鐩樸�濉戞枡鎵樼洏
+        /// </summary>
+        public string S_TYPE { get; set; }
+        /// <summary>
+        /// 瑙勬牸
+        /// </summary>
+        public string S_SPEC { get; set; }
+        /// <summary>
+        /// 瀹瑰櫒鐢ㄩ�
+        /// </summary>
+        public string N_PURPOSE { get; set; }
+        /// <summary>
+        /// 瀹瑰櫒鏉ユ簮
+        /// </summary>
+        public string S_SRC { get; set; }
+        /// <summary>
+        /// 瀹瑰櫒鐩殑鍦�+        /// </summary>
+        public string S_DEST { get; set; }
+        /// <summary>
+        /// 瀹瑰櫒鐘舵�(绌�宸叉竻娲�鏃�杞繍-寰呯敓浜�
+        /// </summary>
+        public string S_CNTR_STATE { get; set; }
+    }
+
+    /// <summary>
+    /// 浠诲姟琛�+    /// 娴嬭瘯鐜1:146-TN_0026
+    /// 娴嬭瘯鐜2:198-TN_0098
+    /// </summary>
+    //[SugarTable("dbo.TN_0026")]
+    [ST("浠诲姟琛�)]
+    public class WMSTask : BaseModel
+    {
+        public string S_TASK_NO { get; set; }
+        public string S_START_LAREA { get; set; }
+        public string S_END_LAREA { get; set; }
+        public string S_START_LOC { get; set; }
+        public string S_END_LOC { get; set; }
+        public string S_TYPE { get; set; }
+        /// <summary>
+        /// 娣冲畨鐢ㄤ簬鏍囪-鐗╂枡灞傛暟 6锛�锛�
+        /// </summary>
+        public string S_NOTE { get; set; }
+        /// <summary>
+        /// 宸ュ崟鍙�绉诲簱浠诲姟鍙栬揣瀹屾垚锛岄渶瑕佸噺鍘诲伐鍗�绉诲簱鏁伴噺锛氬洜娣冲畨鏃犵涓夋柟涓嬪彂浠诲姟锛屽洜姝�鏉ユ簮鍙�瀛樻斁 宸ュ崟鍙�+        /// </summary>
+        public string S_SRC_SYS { get; set; }
+        public string S_SRC_NO { get; set; }
+        /// <summary>
+        /// agv/浜哄伐/杈撻�绾�+        /// </summary>
+        public string S_WORK_MODE { get; set; }
+        /// <summary>
+        /// ?-璁剧疆鍏佽绌哄�
+        /// </summary>
+        public DateTime? T_START_TIME { get; set; }
+        public DateTime? T_END_TIME { get; set; }
+        /// <summary>
+        /// 浠诲姟鐘舵�
+        /// </summary>
+        public string S_B_STATE { get; set; }
+        public int N_PRIORITY { get; set; }
+        /// <summary>
+        /// 鎼繍鐨勬墭鐩樺彿锛屽涓敤鑻辨枃閫楀彿鍒嗗紑
+        /// </summary>
+        public string S_CNTRS { get; set; }
+        /// <summary>
+        /// 璧风偣灞�+        /// </summary>
+        public int N_START_LAYER { get; set; }
+        /// <summary>
+        /// 缁堢偣灞�+        /// </summary>
+        public int N_END_LAYER { get; set; }
+        /// <summary>
+        /// 鎼繍鐨勬墭鐩樻暟閲�+        /// </summary>
+        public int N_CNTR_COUNT { get; set; }
+        /// <summary>
+        /// 璁惧鍙�+        /// </summary>
+        public string S_EQ_NO { get; set; }
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+        /// <summary>
+        /// 鎵规鍙�+        /// </summary>
+        public string S_BATCH_NO { get; set; }
+        public string S_CNTR_TYPE { get; set; }
+    }
+
+    /// <summary>
+    /// 浠诲姟鍔ㄤ綔琛�+    /// 娴嬭瘯鐜1:146-TN_0040
+    /// 娴嬭瘯鐜2:198-TN_0146
+    /// </summary>
+    //[SugarTable("dbo.TN_0040")]
+    [ST("浠诲姟鍔ㄤ綔琛�)]
+    public class WmsTaskAction : BaseModel
+    {
+        public string S_TASK_NO { get; set; }
+        public string S_ACTION_CODE { get; set; }
+        /// <summary>
+        /// 璁惧鍙�+        /// </summary>
+        public string S_EQ_NO { get; set; }
+        /// <summary>
+        /// 璁惧绫诲瀷
+        /// </summary>
+        public string S_EQ_TYPE { get; set; }
+        /// <summary>
+        /// 鍏跺畠鏁版嵁
+        /// </summary>
+        public string S_DATA { get; set; }
+    }
+
+    /// <summary>
+    /// 鎵╁睍璐т綅琛�+    /// 娴嬭瘯鐜1:146-TN_0041
+    /// 娴嬭瘯鐜2:198-TN_0132
+    /// </summary>
+    //[SugarTable("dbo.TN_0041")]
+    [ST("鎵╁睍璐т綅琛�)]
+    public class LocationExt : BaseModel
+    {
+        /// <summary>
+        /// 璐т綅
+        /// </summary>
+        public string S_LOC_CODE { get; set; }
+        /// <summary>
+        /// agv绔欑偣
+        /// </summary>
+        public string S_AGV_SITE { get; set; }
+        /// <summary>
+        /// 鏍囪瘑
+        /// </summary>
+        public string S_PICKUP_POINT { get; set; }
+    }
+
+    /// <summary>
+    /// 鑷敱绾挎绔欑偣琛�+    /// </summary>
+    //[SugarTable("dbo.TN_0041")]
+    [ST("鑷敱绾挎绔欑偣琛�)]
+    public class flexibilloction : BaseModel
+    {
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 鎺掑彿
+        /// </summary>
+        public string N_ROW { get; set; }
+        /// <summary>
+        /// 绾挎璧风偣鍒�+        /// </summary>
+        public int S_START_COL { get; set; }
+        /// <summary>
+        /// 绾挎缁堢偣鍒�+        /// </summary>
+        public int S_END_COL { get; set; }
+        /// <summary>
+        /// 绾哥璧风偣鍒�+        /// </summary>
+        //public int S_ZXSTART_COL { get; set; }
+        ///// <summary>
+        ///// 绾哥缁堢偣鍒�+        ///// </summary>
+        //public int S_ZXEND_COL { get; set; }
+        /// <summary>
+        /// 涓�眰绔欑偣
+        /// </summary>
+        public string S_First_Bit { get; set; }
+        /// <summary>
+        /// 浜屽眰绔欑偣
+        /// </summary>
+        public string S_Second_Bit { get; set; }
+    }
+
+
+    [ST("鐗╂枡浼樺厛涓嬬嚎搴撳尯琛�)]
+    public class ItemArea : BaseModel
+    {
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string S_ITEM_CODE { get; set; }
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string S_ITEM_NAME { get; set; }
+        /// <summary>
+        /// 浼樺厛绾�+        /// </summary>
+        public int S_PRIORITY { get; set; }
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        /// <summary>
+        /// 鏍堟澘绫诲瀷
+        /// </summary>
+        public string S_TRAY_TYPE { get; set; }
+    }
+
+    /// <summary>
+    /// 搴撳尯琛�+    /// 娴嬭瘯鐜1:146-dbo.TN_0034
+    /// </summary>
+    //[SugarTable("dbo.TN_0034")]
+    [ST("搴撳尯琛�)]
+    public class AreaNoTable : BaseModel
+    {
+        /// <summary>
+        /// 浠撳簱缂栫爜
+        /// </summary>
+        public string S_WH_CODE { get; set; }
+        /// <summary>
+        /// 搴撳尯缂栫爜
+        /// </summary>
+        public string S_AREA_CODE { get; set; }
+        public string S_NOTE { get; set; }
+        public int N_FLOOR { get; set; }
+        public string S_STRUCTURE { get; set; }
+        public string S_EXT_DATA { get; set; }
+        public string S_LOC_TYPE { get; set; }
+        public string S_AREA_NAME { get; set; }
+    }
+}
diff --git a/HH.WCS.NongFuChaYuan/packages.config b/HH.WCS.NongFuChaYuan/packages.config
new file mode 100644
index 0000000..c797298
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/packages.config
@@ -0,0 +1,17 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.AspNet.WebApi.OwinSelfHost" version="5.2.9" targetFramework="net461" />
+  <package id="Microsoft.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.2" targetFramework="net461" />
+  <package id="NLog" version="5.1.1" targetFramework="net452" requireReinstallation="true" />
+  <package id="Owin" version="1.0" targetFramework="net461" />
+  <package id="SqlSugar" version="5.1.3.47" targetFramework="net461" />
+  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net452" />
+  <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/HH.WCS.NongFuChaYuan/readme.txt b/HH.WCS.NongFuChaYuan/readme.txt
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/readme.txt
@@ -0,0 +1 @@
+锘�\ No newline at end of file
diff --git a/HH.WCS.NongFuChaYuan/settings.xml b/HH.WCS.NongFuChaYuan/settings.xml
new file mode 100644
index 0000000..686f8e7
--- /dev/null
+++ b/HH.WCS.NongFuChaYuan/settings.xml
@@ -0,0 +1,269 @@
+锘�?xml version="1.0" encoding="utf-8" ?>
+<Custom>
+
+	<!--椤圭洰缂栫爜閰嶇疆鈥旂洰鍓嶆敮鎸侀」鐩唬鐮侊細璋冭瘯妯″紡,姹熻嫃瑗块棬瀛�鍐滃か娣冲畨,鍐滃か鍧囧窞-->
+	<!--姹熻嫃瑗块棬瀛�椤圭洰鏈噰鐢ㄩ」鐩唬鐮侀厤缃紝鐜板満鏇存柊闇�娉ㄦ剰閰嶇疆-->
+	<ProjectName>鍐滃か澶ф槑灞�/ProjectName>
+
+
+	<!--鏁版嵁搴撻厤缃�->
+	<!--
+		198-Mobox:Data Source=192.168.1.198\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015
+		146-Mobox:Data Source=192.168.1.146;Initial Catalog=OIMobox2;User ID=sa;Password=test?123
+		鏈湴:Data Source=127.0.0.1;Initial Catalog=OIMobox;User ID=sa;Password=123456
+	-->
+	<SqlServer>Data Source=10.136.32.1;Initial Catalog=OIMobox;User ID=sa;Password=qaz-123456</SqlServer>
+
+
+	<!--椤圭洰SQL琛ㄥ悕閰嶇疆-->
+	<!--
+		TableName 閰嶇疆淇℃伅:												鍙橀噺淇℃伅锛歍ableProType	椤圭洰琛ㄧ被鍨嬶細鏍规嵁 椤圭洰缂栫爜閰嶇疆 鑾峰彇瀵瑰簲椤圭洰琛ㄥ悕	
+		TableProType:1	146鏈嶅姟鍣�											  TableSignNo	琛ㄦ爣璇嗚褰曪細鐢ㄤ簬 瀹炴柦 浜哄憳鑷繁鏍囪瘑鈥旈殢鎰忛厤缃�+		TableProType:2	198鏈嶅姟鍣�											  TableName	    涓枃琛ㄥ悕
+		TableProType:3	娣冲畨鐜板満												  TableSqlName	鏁版嵁搴撳疄闄呰〃鍚�+																				  Enable		鏄惁鍚敤
+	-->
+	<TableProType>1</TableProType>
+	<TableName>
+		<![CDATA[
+		[
+			{"TableSignNo":"1","TableName":"璐т綅琛�,"TableSqlName":"dbo.TN_0019","TableProType":"1","Enable":1},
+			{"TableSignNo":"2","TableName":"璐т綅瀹瑰櫒琛�,"TableSqlName":"dbo.TN_0020","TableProType":"1","Enable":1},
+			{"TableSignNo":"3","TableName":"瀹瑰櫒鐗╂枡琛�,"TableSqlName":"dbo.TN_0027","TableProType":"1","Enable":1},
+			{"TableSignNo":"4","TableName":"鎺掗攣琛�,"TableSqlName":"dbo.TN_0031","TableProType":"1","Enable":0},
+			{"TableSignNo":"5","TableName":"瀹瑰櫒琛�,"TableSqlName":"dbo.TN_0026","TableProType":"1","Enable":1},
+			{"TableSignNo":"6","TableName":"浠诲姟琛�,"TableSqlName":"dbo.TN_0025","TableProType":"1","Enable":1},
+			{"TableSignNo":"7","TableName":"浠诲姟鍔ㄤ綔琛�,"TableSqlName":"dbo.TN_0030","TableProType":"1","Enable":1},
+			{"TableSignNo":"9","TableName":"搴撳尯琛�,"TableSqlName":"dbo.TN_0024","TableProType":"1","Enable":1},
+			{"TableSignNo":"10","TableName":"宸ュ崟琛�,"TableSqlName":"dbo.TN_0022","TableProType":"1","Enable":1},
+			{"TableSignNo":"11","TableName":"鐩樺簱涓棿琛�,"TableSqlName":"dbo.TN_0039","TableProType":"1","Enable":1},
+			{"TableSignNo":"13","TableName":"鑷敱绾挎绔欑偣琛�,"TableSqlName":"dbo.TN_0042","TableProType":"1","Enable":1},
+			{"TableSignNo":"14","TableName":"澶ф槑灞卞瘜鍕掓墭鐩樿〃","TableSqlName":"dbo.TN_0043","TableProType":"1","Enable":1},
+			{"TableSignNo":"15","TableName":"澶ф槑灞卞瘜鍕掗攣瀹氳〃","TableSqlName":"dbo.TN_0044","TableProType":"1","Enable":1}
+		]]]>
+	</TableName>
+
+
+	<!--鏈嶅姟绫籙RL閰嶇疆-->
+	<HostToAgvServerUrl>http://10.136.32.1:9988/HostToAGV.cgi</HostToAgvServerUrl>
+	<OITcpServerUrl>http://127.0.0.1:5102</OITcpServerUrl>
+	<!--API寮�斁绔彛(渚涘閮ㄧ▼搴忚皟鐢�-->
+	<HttpUrlPort>http://+:8001</HttpUrlPort>
+	<!--TCP鏈嶅姟绔彛(渚汸LC璁惧杩炴帴浣跨敤)-->
+	<TcpPort>2023</TcpPort>
+
+
+	<!--绗笁鏂筓RL閰嶇疆 UrlNo:url缂栧彿鍞竴  UrlName:浠呯敤浜庢爣璁� Url:瀹為檯闇�璋冪敤鐨勫湴鍧�Enable:鏄惁鍚敤-->
+	<ThirdPartyUrl>
+		<![CDATA[
+		[
+			{"UrlNo":"2","UrlName":"瀵屽嫆WMS","Url":"http://127.0.0.2:5101/","Enable":1}
+		]]]>
+	</ThirdPartyUrl>
+
+	<!--鏄惁鍚敤瀵屽嫆WMS-->
+	<FULEenable>0</FULEenable>
+
+
+	<!--鍙傛暟璇存槑锛�+		VerifyNo			楠岃瘉缂栫爜	1-Header Token楠岃瘉(MD5鍔犲瘑鏂瑰紡)鈥斺�寮�彂鎸囧畾(涓嶅厑璁镐慨鏀�
+		Project				椤圭洰缂栫爜	瀵瑰簲 ProjectName 閰嶇疆椤瑰唴瀹�闇�畬鍏ㄤ竴鑷�锛岀敤浜庢寚瀹氭楠岃瘉鏂瑰紡褰掑睘椤圭洰
+		Extend				鎵╁睍缂栫爜	鏍规嵁椤圭洰瀹為檯闇�眰杩涜閰嶇疆
+		Enable				鏄惁鍚敤	1-鍚敤 0-涓嶅惎鐢�+	-->
+	<!--Http鎺ュ彛楠岃瘉閰嶇疆椤�->
+	<HttpApiVerify>
+		<![CDATA[
+		[
+			{"VerifyNo":"1","Project":"鍐滃か澶ф槑灞�,"Extend":["securityKey閴存潈鐮�,"瀵屽嫆WMS"],"Enable":1}
+		]]]>
+	</HttpApiVerify>
+
+
+	<!--鍙傛暟璇存槑锛�+		TCPServer-Plc閰嶇疆淇℃伅:											鍙橀噺淇℃伅锛�address		璁惧IP
+		deviceType:1	鑷姩闂╛閫氱敤椤圭洰											  deviceName	浜х嚎鍙�+		deviceType:2    娉ㄥ鏈�鍐滃か澶ф槑灞�					                      deviceNo	    浜ょ缂栧彿
+		deviceType:3	缈绘枟鏈�鍐滃か澶ф槑灞�								          location		璐т綅缂栫爜
+		deviceType:4	鐡剁洊鏈�鍐滃か澶ф槑灞�								          deviceType    璁惧绫诲瀷
+		deviceType:5    杈撻�绾�鍐滃か澶ф槑灞�                              			  enable        璁惧褰撳墠鏄惁宸茬粡鍚敤
+	-->
+	<deviceInfo>
+		<![CDATA[
+		[
+			{"address":"10.136.32.41","deviceName":"涓�彿杈撻�绾�,"deviceNo":[],"location":["MTXXK01-01","MTXXK01-02","MTXXK01-03"],"deviceType":5,"enable":1},
+			{"address":"","deviceName":"涓�彿杈撻�绾�,"deviceNo":[],"location":["MTXXK01-01"],"deviceType":5,"enable":1},
+			{"address":"","deviceName":"涓�彿杈撻�绾�,"deviceNo":[],"location":["MTXXK01-02"],"deviceType":5,"enable":1},
+			{"address":"","deviceName":"涓�彿杈撻�绾�,"deviceNo":[],"location":["MTXXK01-03"],"deviceType":5,"enable":1},
+
+			
+			{"address":"10.136.32.36","deviceName":"1鍙风摱鐩栨敞濉戞満","deviceNo":[],"location":["PGZSJ01-A","PGZSJ01-B"],"deviceType":4,"enable":1},
+			{"address":"10.136.32.39","deviceName":"1鍙风摱鐩栫炕鏂楁満","deviceNo":[],"location":["FDJ01-01"],"deviceType":3,"enable":1},
+	
+			{"address":"10.136.32.34","deviceName":"1鍙风摱鍧敞濉戞満","deviceNo":[],"location":["PPZSJ01-A","PPZSJ01-B"],"deviceType":2,"enable":1},
+			{"address":"10.136.32.35","deviceName":"2鍙风摱鍧敞濉戞満","deviceNo":[],"location":["PPZSJ02-A","PPZSJ02-B"],"deviceType":2,"enable":1},
+			{"address":"10.136.32.37","deviceName":"1鍙风摱鍧炕鏂楁満","deviceNo":[],"location":["PPFDJ01-01"],"deviceType":6,"enable":1},
+			{"address":"10.136.32.38","deviceName":"2鍙风摱鍧炕鏂楁満","deviceNo":[],"location":["PPFDJ02-01"],"deviceType":6,"enable":1},
+			
+			{"address":"10.136.32.31","deviceName":"杞﹂棿-浠撳簱鍗峰笜闂�,"deviceNo":["5"],"location":[],"deviceType":1,"enable":1},
+			{"address":"10.136.32.32","deviceName":"缈绘枟鏈哄嵎甯橀棬","deviceNo":["4"],"location":[],"deviceType":1,"enable":1},
+			{"address":"10.136.32.33","deviceName":"鐡剁洊娉ㄥ鏈哄嵎甯橀棬","deviceNo":["3"],"location":[],"deviceType":1,"enable":1},
+			{"address":"10.136.32.30","deviceName":"2鍙风摱鍧炕鏂楁満鍗峰笜闂�,"deviceNo":["2"],"location":[],"deviceType":1,"enable":1},
+			{"address":"10.136.32.29","deviceName":"1鍙风摱鍧炕鏂楁満鍗峰笜闂�,"deviceNo":["1"],"location":[],"deviceType":1,"enable":1}
+			
+			
+			
+		]]]>
+	</deviceInfo>
+
+
+
+	<!--鍙傛暟璇存槑锛�+	deviceName:涓虹┖鍒欎笉闇�鍒ゆ柇宸ュ崟鏄惁鎵ц 鍙垽鏂槸鍚︽弧瓒宠浆杩愭潯浠�+	CacheAreaNo:璧风偣搴撳尯
+	ProductArea:缁堢偣搴撳尯
+	CacheAreaNoLock:璧风偣搴撳尯鏄惁涓哄瘑闆嗗瀷搴撳尯 1/0
+	ProductAreaLock:缁堢偣搴撳尯鏄惁涓哄瘑闆嗗瀷搴撳尯 1/0
+	Priority:浼樺厛绾�榛樿涓�
+	Enable:鏄惁鍚敤
+	-->
+	<inStockCacheArea>
+		<![CDATA[
+		[
+			{"deviceName":"涓�彿鐡剁洊娉ㄥ鏈�,"CacheAreaNo":"MKRKQ01","CacheAreaNoLock":"","ProductArea":"MKRKQ01","ProductAreaLock":"","Priority":1,"TaskType":"","enable":1},
+
+		]]]>
+	</inStockCacheArea>
+
+
+
+	<ItemCacheArea>
+		<![CDATA[
+		[
+			{"ItemCode":"","AreaCode":""},
+
+		]]]>
+	</ItemCacheArea>
+	
+	
+
+	<!--鍙傛暟璇存槑锛�+	location:鍑哄叆搴撳尯
+	ItemTrayType:绌�婊�+	ProductArea:绌虹瓙搴撳尯/婊$瓙搴撳尯
+	deviceType:璁惧绫诲瀷 1:鐡剁洊娉ㄥ鏈�2:缈绘枟鏈�+	Enable:鏄惁鍚敤
+	-->
+	<inStockCacheBit>
+		<![CDATA[
+		[
+			{"location":"MKRKQ01-01","ItemTrayType":"婊�,"ProductArea":["PGMKQ"],"deviceType":"1","enable":1},
+			{"location":"MKCKQ01-01","ItemTrayType":"婊�,"ProductArea":["PGMKQ"],"deviceType":"2","enable":1},
+			{"location":"KKCKQ01-01","ItemTrayType":"绌�,"ProductArea":["PGKKQ"],"deviceType":"1","enable":1},
+			{"location":"KKRKQ01-01","ItemTrayType":"绌�,"ProductArea":["PGKKQ"],"deviceType":"2","enable":1},
+			
+			{"location":"PPMKRKQ","ItemTrayType":"婊�,"ProductArea":[""],"deviceType":"3","enable":1},
+			{"location":"PPMKCKQ","ItemTrayType":"婊�,"ProductArea":[""],"deviceType":"4","enable":1},
+			{"location":"PPKKRKQ","ItemTrayType":"绌�,"ProductArea":[""],"deviceType":"4","enable":1},
+			{"location":"PPKKCKQ","ItemTrayType":"绌�,"ProductArea":[""],"deviceType":"3","enable":1}
+
+		]]]>
+	</inStockCacheBit>
+
+
+	<!--鍙傛暟璇存槑锛�+		deviceName:浜х嚎鍙� 
+		ItemName:鐗╂枡鍚嶇О(姝ゅ缁存姢瀵屽嫆涓嬪彂鐨勭墿鏂欑紪鐮�
+		ItemTrayType:绫诲瀷(绌�婊�
+		ProductLocation:浼樺厛閫佽揪涓嬬嚎缂撳瓨浣�+		ProductArea:浼樺厛涓嬬嚎搴撳尯缂栫爜-浼樺厛绾ц秺楂樹綅缃秺鍓� 
+		Enable:鏄惁鍚敤
+	-->
+	<DaMingShanPriProLine>
+		<![CDATA[
+		[
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"","ItemTrayType":"绌�,"ProductLocation":["",""],"ProductArea":["KTQ"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"","ItemTrayType":"绌�,"ProductLocation":["",""],"ProductArea":["KTQ"],"Enable":"1"},
+			
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"11110101101","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"11110102384","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"11110101100","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"11110101223","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"11110106125","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"11110106125","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"11110101101","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"11110102384","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"11110101100","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"11110101223","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"],"Enable":"1"},
+			
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"11110101098","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK04","CPK05","CPK06","CPK09"],"Enable":"1"},
+			{"deviceName":"涓�彿杈撻�绾�,"ItemName":"11110101094","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK04","CPK05","CPK06","CPK09"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"11110101098","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK04","CPK05","CPK06","CPK09"],"Enable":"1"},
+			{"deviceName":"浜屽彿杈撻�绾�,"ItemName":"11110101094","ItemTrayType":"婊�,"ProductLocation":["",""],"ProductArea":["CPK04","CPK05","CPK06","CPK09"],"Enable":"1"},
+			
+			{"deviceName":"1鍙风摱鐩栨敞濉戞満","ItemName":"","ItemTrayType":"绌�,"ProductLocation":[""],"ProductArea":["KKHCQ"],"Enable":"1"},
+			{"deviceName":"1鍙风摱鐩栨敞濉戞満","ItemName":"","ItemTrayType":"婊�,"ProductLocation":[""],"ProductArea":["MKHCQ"],"Enable":"1"},
+			{"deviceName":"1鍙风摱鐩栫炕鏂楁満","ItemName":"","ItemTrayType":"婊�,"ProductLocation":[""],"ProductArea":["MKHCQ"],"Enable":"1"},
+			{"deviceName":"1鍙风摱鐩栫炕鏂楁満","ItemName":"","ItemTrayType":"绌�,"ProductLocation":[""],"ProductArea":["KKHCQ"],"Enable":"1"},
+			
+			{"deviceName":"1鍙风摱鍧敞濉戞満","ItemName":"","ItemTrayType":"绌�,"ProductLocation":[""],"ProductArea":["PPKKHCQ"],"Enable":"1"},
+			{"deviceName":"1鍙风摱鍧敞濉戞満","ItemName":"","ItemTrayType":"婊�,"ProductLocation":[""],"ProductArea":["PPMKHCQ"],"Enable":"1"},
+			{"deviceName":"2鍙风摱鍧敞濉戞満","ItemName":"","ItemTrayType":"绌�,"ProductLocation":[""],"ProductArea":["PPKKHCQ"],"Enable":"1"},
+			{"deviceName":"2鍙风摱鍧敞濉戞満","ItemName":"","ItemTrayType":"婊�,"ProductLocation":[""],"ProductArea":["PPMKHCQ"],"Enable":"1"},
+			{"deviceName":"1鍙风摱鍧炕鏂楁満","ItemName":"","ItemTrayType":"婊�,"ProductLocation":[""],"ProductArea":["PPMKHCQ"],"Enable":"1"},
+			{"deviceName":"1鍙风摱鍧炕鏂楁満","ItemName":"","ItemTrayType":"绌�,"ProductLocation":[""],"ProductArea":["PPKKHCQ"],"Enable":"1"},
+			{"deviceName":"2鍙风摱鍧炕鏂楁満","ItemName":"","ItemTrayType":"婊�,"ProductLocation":[""],"ProductArea":["PPMKHCQ"],"Enable":"1"},
+			{"deviceName":"2鍙风摱鍧炕鏂楁満","ItemName":"","ItemTrayType":"绌�,"ProductLocation":[""],"ProductArea":["PPKKHCQ"],"Enable":"1"},
+			
+			
+			
+			
+			{"deviceName":"杩炴帴鍖哄煙1-涓�彿缈绘枟鏈哄","ItemName":"","ItemTrayType":"婊�,"ProductLocation":[""],"ProductArea":["PPKKHCQ"],"Enable":"1"}
+			{"deviceName":"杩炴帴鍖哄煙1-涓�彿缈绘枟鏈哄","ItemName":"","ItemTrayType":"绌�,"ProductLocation":[""],"ProductArea":["PPKKHCQ"],"Enable":"1"}
+	
+			
+	
+	
+		]]]>
+	</DaMingShanPriProLine>
+
+
+
+
+
+	<!--鑼跺洯鎴愬搧涓嬬嚎搴撳尯-->
+	<AreaType>
+		<![CDATA[[
+		
+		{"AreaName":"灏忔澘","AreaType":"婊�,"AreaCode":["CP01","CP02"]},
+		{"AreaName":"澶ф澘","AreaType":"婊�,"AreaCode":["CP01","CP02"]},
+		{"AreaName":"闆嗗寲鏉�,"AreaType":"婊�,"AreaCode":["CP01","CP02"]},
+		
+		
+		]]]>
+	</AreaType>
+
+
+	<!--鍓嶇Щ杞�->
+	<updateCacheBit>
+		<![CDATA[
+		[
+			{"location":"KKCKQ01-01","AGVlocation":"12578"},
+			{"location":"KKRKQ01-01","AGVlocation":"12581"},
+			{"location":"MKCKQ01-01","AGVlocation":"12587"},
+			{"location":"MKRKQ01-01","AGVlocation":"12593"}
+		 ]]]>
+	</updateCacheBit>
+
+
+	<!--鐩樺簱-->
+	<PanKu>
+		<![CDATA[["CPK01","CPK02","CPK03","CPK04","CPK05","CPK06","CPK07","CPK08","CPK09","CPK10","CPK11","CPK12"]]]>
+	</PanKu>
+
+
+	<!--鑷敱绾挎鏄惁鍚敤-->
+	<flexibilityenable>1</flexibilityenable>
+
+</Custom>
+

--
Gitblit v1.9.1