From 5883a139074dd7493d9f0d776540f196d55d1034 Mon Sep 17 00:00:00 2001
From: chengsc <11752@DESKTOP-DS49RCP>
Date: 星期五, 25 四月 2025 20:42:30 +0800
Subject: [PATCH] 添加分配下发任务方法

---
 Admin.NET/WCS.Application/Util/HttpService.cs                          |   13 
 Admin.NET/WCS.Application/Entity/WcsTask.cs                            |   10 
 Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs                    |   21 
 Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksDto.cs    |   89 ++
 Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksInput.cs  |  170 ++++
 Admin.NET/WCS.Application/PLC/PLCService.cs                            |  401 +++------
 Web/src/views/wcs/wcsCarTasks/component/editDialog.vue                 |  156 +++
 Admin.NET/WCS.Application/Util/FourWayCarUtil.cs                       |  490 +++++++++++
 Admin.NET/WCS.Application/OpenApi/OpenApi.cs                           |  200 ----
 Web/src/views/wcs/wcsCarTasks/index.vue                                |  212 +++++
 Admin.NET/WCS.Application/Enum/TaskEnum.cs                             |    6 
 Admin.NET/WCS.Application/Entity/WcsCarTasks.cs                        |   57 +
 Admin.NET/WCS.Application/PLC/PLCTaskAction.cs                         |  375 ++++++++
 Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksOutput.cs |   91 ++
 Admin.NET/WCS.Application/Service/WcsCarTasks/WcsCarTasksService.cs    |  127 +++
 Web/src/api/wcs/wcsCarTasks.ts                                         |   50 +
 16 files changed, 2,023 insertions(+), 445 deletions(-)

diff --git a/Admin.NET/WCS.Application/Entity/WcsCarTasks.cs b/Admin.NET/WCS.Application/Entity/WcsCarTasks.cs
new file mode 100644
index 0000000..5e78859
--- /dev/null
+++ b/Admin.NET/WCS.Application/Entity/WcsCarTasks.cs
@@ -0,0 +1,57 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Application.Entity;
+
+/// <summary>
+/// 鍥涘悜杞︿换鍔℃槑缁嗚〃
+/// </summary>
+[SugarTable("WCSCarTasks", "鍥涘悜杞︿换鍔℃槑缁嗚〃")]
+public class WcsCarTasks : EntityBaseData
+{
+    /// <summary>
+    /// 浠诲姟鍙�
+    /// </summary>
+    [SugarColumn(ColumnName = "TaskNo", ColumnDescription = "浠诲姟鍙�", Length = 20)]
+    public string? TaskNo { get; set; }
+
+    /// <summary>
+    /// 灏忚溅浠诲姟鍙�
+    /// </summary>
+    [SugarColumn(ColumnName = "CarTaskNo", ColumnDescription = "灏忚溅浠诲姟鍙�")]
+    public int? CarTaskNo { get; set; }
+
+    /// <summary>
+    /// 鍓嶇疆灏忚溅浠诲姟ID 鍙互鏈夊涓� 鐢�;闅斿紑
+    /// </summary>
+    [SugarColumn(ColumnName = "PreId", ColumnDescription = "鍓嶇疆灏忚溅浠诲姟ID", Length = 200)]
+    public string? PreId { get; set; }
+
+    /// <summary>
+    /// 浜や簰璺緞
+    /// </summary>
+    [SugarColumn(ColumnName = "ExecutionPath", ColumnDescription = "浜や簰璺緞", Length = 200)]
+    public string? ExecutionPath { get; set; }
+
+    /// <summary>
+    /// 鎵�鏈夎矾寰�
+    /// </summary>
+    [SugarColumn(ColumnName = "Path", ColumnDescription = "鎵�鏈夎矾寰�", Length = 20)]
+    public string? Path { get; set; }
+
+    /// <summary>
+    /// 灏忚溅缂栧彿
+    /// </summary>
+    [SugarColumn(ColumnName = "CarNo", ColumnDescription = "灏忚溅缂栧彿")]
+    public string? CarNo { get; set; }
+
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    [SugarColumn(ColumnName = "Status", ColumnDescription = "鐘舵��")]
+    public TaskStatusEnum? Status { get; set; }
+
+}
diff --git a/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs b/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs
index cebf8ef..4f7ae77 100644
--- a/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs
+++ b/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs
@@ -106,11 +106,28 @@
     /// </summary>
     [SugarColumn(ColumnName = "SkuNo", ColumnDescription = "鐗╂枡鍙�", Length = 32)]
     public string? SkuNo { get; set; }
-    
+
     /// <summary>
     /// 鎵樼洏鍙�
     /// </summary>
     [SugarColumn(ColumnName = "PalletNo", ColumnDescription = "鎵樼洏鍙�", Length = 32)]
     public string? PalletNo { get; set; }
-    
+
+    /// <summary>
+    /// 閫氶亾鍙�1
+    /// </summary>
+    [SugarColumn(ColumnName = "AisleOne", ColumnDescription = "閫氶亾鍙�1", Length = 32)]
+    public string? AisleOne { get; set; }
+
+    /// <summary>
+    /// 閫氶亾鍙�2
+    /// </summary>
+    [SugarColumn(ColumnName = "AisleTwo", ColumnDescription = "閫氶亾鍙�2", Length = 32)]
+    public string? AisleTwo { get; set; }
+
+    /// <summary>
+    /// 鍌ㄤ綅绫诲瀷 1鍌ㄤ綅 0閫氶亾
+    /// </summary>
+    [SugarColumn(ColumnName = "Make", ColumnDescription = "鍌ㄤ綅绫诲瀷", Length = 32)]
+    public string? Make { get; set; }
 }
diff --git a/Admin.NET/WCS.Application/Entity/WcsTask.cs b/Admin.NET/WCS.Application/Entity/WcsTask.cs
index 4bb39e1..df6477c 100644
--- a/Admin.NET/WCS.Application/Entity/WcsTask.cs
+++ b/Admin.NET/WCS.Application/Entity/WcsTask.cs
@@ -42,13 +42,19 @@
     /// </summary>
     [SugarColumn(ColumnName = "Origin", ColumnDescription = "鏉ユ簮", Length = 20)]
     public string? Origin { get; set; }
-    
+
+    /// <summary>
+    /// 浠撳簱鍙�
+    /// </summary>
+    [SugarColumn(ColumnName = "WareHouseNo", ColumnDescription = "浠撳簱鍙�", Length = 20)]
+    public string? WareHouseNo { get; set; }
+
     /// <summary>
     /// 璧峰浣嶇疆
     /// </summary>
     [SugarColumn(ColumnName = "StartLocate", ColumnDescription = "璧峰浣嶇疆", Length = 20)]
     public string? StartLocate { get; set; }
-    
+
     /// <summary>
     /// 璧峰宸烽亾
     /// </summary>
diff --git a/Admin.NET/WCS.Application/Enum/TaskEnum.cs b/Admin.NET/WCS.Application/Enum/TaskEnum.cs
index 78bf5f4..7f57413 100644
--- a/Admin.NET/WCS.Application/Enum/TaskEnum.cs
+++ b/Admin.NET/WCS.Application/Enum/TaskEnum.cs
@@ -73,6 +73,12 @@
     /// </summary>
     [Description("浠诲姟鍙栨秷")]
     Cancell = 4,
+    /// <summary>
+    /// 浠诲姟鍙栨秷
+    /// </summary>
+    [Description("鎵嬪姩瀹屾垚浠诲姟")]
+    CompleteHand = 5,
+
 }
 
 /// <summary>
diff --git a/Admin.NET/WCS.Application/OpenApi/OpenApi.cs b/Admin.NET/WCS.Application/OpenApi/OpenApi.cs
index 7652479..62c9a4d 100644
--- a/Admin.NET/WCS.Application/OpenApi/OpenApi.cs
+++ b/Admin.NET/WCS.Application/OpenApi/OpenApi.cs
@@ -377,33 +377,8 @@
                 {
                     case "end"://浠诲姟瀹屾垚
                         {
-                            PLCService.AGVStatus = false;
-                            //鎶婃垚鍝佽揣鐗╂媺鍒扮紦瀛樺伐浣嶅悗锛屼笅涓�涓换鍔℃妸鎵樼洏鎷夊幓鎻愬崌鏈烘垨鑰呯紦瀛樺尯锛堜紭鍏堢骇浣庝竴鐐癸級
-                            if (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString())
-                            {
-                                var strEndLocate = "";
-                                Enum.TryParse(await _sysConfigService.GetConfigValue<string>("workshop_Trend"), out WorkshopEnum workshop);
-                                if (workshop == WorkshopEnum.Storage)
-                                    strEndLocate = AGVStaionEnum.A1.ToString();
-                                else
-                                    strEndLocate = AGVStorageUtil.GetProductInStorage();
-                                WcsTask modInsertTask = new WcsTask()
-                                {
-                                    TaskNo = _taskService.GetTaskCode(),
-                                    TaskType = TaskTypeEnum.Move,
-                                    Type = PLCTypeEnum.AGV,
-                                    StartLocate = modTask.EndLocate,//缂撳瓨鍖�
-                                    EndLocate = strEndLocate,
-                                    PalletNo = modTask.PalletNo,
-                                    Status = TaskStatusEnum.Wait,
-                                    Levels = 6,
-                                    Origin = "WCS"
-                                };
-                                await _db.Insertable(modInsertTask).ExecuteCommandAsync();
-                                HubUtil.PublicTask(modInsertTask.Adapt<WcsTaskOutput>());
-                            }
-
-                            //璐у搧鎷夊埌鐢垫鍙i渶瑕佸悜杈撻�佺嚎鍐欏叆100
+                            
+                            //璐у搧鎷夊埌瀵嗛泦搴撳叆搴撳彛闇�瑕佸悜杈撻�佺嚎鍐欏叆鍊�
                             if (modTask.EndLocate == AGVStaionEnum.A1.ToString())
                             {
                                 var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "杈撻�佺嚎");
@@ -431,52 +406,6 @@
                                     Log.Error("C鍙g敵璇峰叆搴撳啓鍏ュ��100澶辫触");
                                 }
                             }
-                            //鏀惧叆鎷嗘墭鏈哄悗锛屽悜鎷嗘墭鏈哄啓鍏ュ畬鎴愪俊鍙�
-                            if (modTask.EndLocate == AGVStaionEnum.D1.ToString())
-                            {
-                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine);
-                                var modConn = new PLCUtil(modPlc);
-                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.Text == "鎷嗘墭鏈�");
-                                var res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "0");
-                                var modTaskMonitorPLC = new WcsTaskMonitor()
-                                {
-                                    TaskNo = modTask.TaskNo,
-                                    PlcId = modDevice.PlcId,
-                                    PlcName = modDevice.WcsPos,
-                                    Status = TaskStatusEnum.Doing,
-                                    InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆瀹屾垚淇″彿0锛岀粨鏋渰res.IsSucceed}",
-                                };
-                                _db.Insertable(modTaskMonitorPLC).ExecuteCommand();
-                                HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>());
-                                modConn.Close();
-                            }
-                            //if (modTask.EndLocate == AGVStaionEnum.B1.ToString() || modTask.EndLocate == AGVStaionEnum.B2.ToString())
-                            //{
-                            //    var num = modTask.EndLocate.Substring(1, 1);
-                            //    var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == num);
-                            //    var modConn = new PLCUtil(modPlc);
-                            //    var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB);
-                            //    var res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0");
-                            //    var modTaskMonitorPLC = new WcsTaskMonitor()
-                            //    {
-                            //        TaskNo = modTask.TaskNo,
-                            //        PlcId = modDevice.PlcId,
-                            //        PlcName = modDevice.PlcPos,
-                            //        Status = TaskStatusEnum.Doing,
-                            //        InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆鏀炬墭瀹屾垚淇″彿锛岀粨鏋渰res.IsSucceed}",
-                            //    };
-                            //    _db.Insertable(modTaskMonitorPLC).ExecuteCommand();
-                            //    HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>());
-                            //    modConn.Close();
-                            //}
-                            if (modTask.EndLocate == AGVStaionEnum.F1.ToString())
-                            {
-                                await _sysConfigService.UpdateConfigValue("cache_Materal", true);
-                            }
-                            if (modTask.StartLocate == AGVStaionEnum.F1.ToString())
-                            {
-                                await _sysConfigService.UpdateConfigValue("cache_Materal", false);
-                            }
                             modTask.Status = TaskStatusEnum.Complete;
                             modTask.FinishDate = DateTime.Now;
                             await _db.Updateable(modTask).ExecuteCommandAsync();
@@ -493,6 +422,7 @@
                             await _db.Insertable(modTaskMonitor).ExecuteCommandAsync();
                             HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                             HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
+                            //鍙嶉WMS浠诲姟瀹屾垚
                             if (modTask.Origin == "WMS")
                             {
                                 HttpService httpService = new HttpService();
@@ -503,125 +433,23 @@
                                 inputs.TaskStatus = "2";
                                 var modResponseTask = httpService.RequestTask(inputs).Result;
                             }
-                            //鎵樼洏杩涘嚭缂撳瓨鍖� 闇�瑕佽褰�
-                            if (new[] { "Z", "C" }.Contains(modTask.EndLocate.Substring(0, 1)))
-                            {
-                                await _sysConfigService.UpdateConfigValue($"cache_{modTask.EndLocate}", true);
-                            }
-                            if (new[] { "Z", "C" }.Contains(modTask.StartLocate.Substring(0, 1)))
-                            {
-                                await _sysConfigService.UpdateConfigValue($"cache_{modTask.StartLocate}", false);
-                            }
+                            
                         }
                         break;
                     case "outbin"://璧板嚭鍌ㄤ綅
                         {
-                            //鍙栫┖鎵樺畬鎴愬悗锛屽悜鎷嗘墭鏈哄啓鍏ュ畬鎴愪俊鍙�
-                            if (modTask.StartLocate == AGVStaionEnum.D1.ToString() && (modTask.EndLocate == AGVStaionEnum.B1.ToString() || modTask.EndLocate == AGVStaionEnum.B2.ToString()))
+                            //鍙嶉WMS浠诲姟鍙栬揣瀹屾垚銆乄MS鍒ゆ柇鏄钩搴撳偍浣嶅氨鏇存柊鍌ㄤ綅鐘舵��
+                            if (modTask.Origin == "WMS")
                             {
-                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine);
-                                var modConn = new PLCUtil(modPlc);
-                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.Text == "鎷嗘墭鏈�");
-                                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "鍙栨墭淇″彿");
-                                var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "0");
-                                WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
-                                {
-                                    TaskNo = modTask.TaskNo,
-                                    PlcId = modDevice.PlcId,
-                                    PlcName = modPos.PlcPos,
-                                    Status = TaskStatusEnum.Doing,
-                                    InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆鍙栨墭淇″彿0锛岀粨鏋渰res.IsSucceed}",
-                                };
-                                _db.Insertable(modTaskMonitor).ExecuteCommand();
-                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
-                                modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "鍙栨墭瀹屾垚");
-                                res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1");
-                                modTaskMonitor = new WcsTaskMonitor()
-                                {
-                                    TaskNo = modTask.TaskNo,
-                                    PlcId = modDevice.PlcId,
-                                    PlcName = modPos.PlcPos,
-                                    Status = TaskStatusEnum.Doing,
-                                    InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆鍙栨墭瀹屾垚1锛岀粨鏋渰res.IsSucceed}",
-                                };
-                                _db.Insertable(modTaskMonitor).ExecuteCommand();
-                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
-                                modConn.Close();
+                                HttpService httpService = new HttpService();
+                                var inputs = new TaskRequestWMS();
+                                inputs.TaskNo = modTask.TaskNo;
+                                inputs.PalletNo = modTask.PalletNo;
+                                inputs.TaskType = "2";
+                                inputs.TaskStatus = "2";
+                                var modResponseTask = httpService.RequestTaskQh(inputs).Result;
                             }
-                            //todo:鍘荤爜鍨涘伐浣嶅彇璐у畬鎴愬悗锛岄渶瑕佸啓PLC淇″彿寮�鍚厜骞�
-                            if ((modTask.StartLocate == AGVStaionEnum.B1.ToString() || modTask.StartLocate == AGVStaionEnum.B2.ToString())
-                                && (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString()))
-                            {
-                                var num = modTask.StartLocate.Substring(1, 1);
-                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == num);
-                                var modConn = new PLCUtil(modPlc);
-                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB);
-                                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "寮�鍚厜骞�");
-                                var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1");
-                                var modTaskMonitor = new WcsTaskMonitor()
-                                {
-                                    TaskNo = modTask.TaskNo,
-                                    PlcId = modDevice.PlcId,
-                                    PlcName = modPos.PlcPos,
-                                    Status = TaskStatusEnum.Doing,
-                                    InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆寮�鍚厜骞�1锛岀粨鏋渰res.IsSucceed}",
-                                };
-                                _db.Insertable(modTaskMonitor).ExecuteCommand();
-                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
-                                //鍐欏叆鍏夊箷0
-                                Task.Run(() =>
-                                {
-                                    var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB);
-                                    var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "寮�鍚厜骞�");
-                                    Thread.Sleep(1000);
-                                    var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "0");
-                                    var modTaskMonitor = new WcsTaskMonitor()
-                                    {
-                                        TaskNo = modTask.TaskNo,
-                                        PlcId = modDevice.PlcId,
-                                        PlcName = modPos.PlcPos,
-                                        Status = TaskStatusEnum.Doing,
-                                        InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆寮�鍚厜骞�0锛岀粨鏋渰res.IsSucceed}",
-                                    };
-                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
-                                    HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
-                                });
 
-                                //鍚戠爜鍨涙満鍣ㄤ汉鍐欏彇鎵樺畬鎴愪俊鍙�
-                                modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.Station);
-                                res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0");
-                                modTaskMonitor = new WcsTaskMonitor()
-                                {
-                                    TaskNo = modTask.TaskNo,
-                                    PlcId = modDevice.PlcId,
-                                    PlcName = modPos.PlcPos,
-                                    Status = TaskStatusEnum.Doing,
-                                    InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆鍙栨墭瀹屾垚淇″彿锛岀粨鏋渰res.IsSucceed}",
-                                };
-                                _db.Insertable(modTaskMonitor).ExecuteCommand();
-                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
-                                modConn.Close();
-                            }
-                            //璧峰宸ヤ綅鏄彁鍗囨満鍙栬揣宸ヤ綅
-                            if (modTask.StartLocate == AGVStaionEnum.A1.ToString())
-                            {
-                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.ConveyorLine);
-                                var modConn = new PLCUtil(modPlc);
-                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Text == "C鍙�");
-                                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "鍙栬蛋纭");
-                                var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1");
-                                Log.Information($"鍚憄lc{modDevice.PlcId}鍐欏叆1-鍙栬蛋纭锛岀粨鏋滐細{res.ToJson()}");
-                                var modTaskMonitor = new WcsTaskMonitor()
-                                {
-                                    TaskNo = modTask.TaskNo,
-                                    PlcId = modDevice.PlcId,
-                                    PlcName = modPos.PlcPos,
-                                    Status = TaskStatusEnum.Doing,
-                                    InteractiveMsg = $"鍚憑modDevice.Text}鍐欏叆鍙栬蛋纭锛岀粨鏋渰res.IsSucceed}",
-                                };
-                                _db.Insertable(modTaskMonitor).ExecuteCommand();
-                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
-                            }
                         }
                         break;
                     case "apply"://鏀捐揣鐢宠
@@ -687,7 +515,7 @@
                             HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
                         }
                         break;
-                    case "cancel"://浠诲姟缁撴潫
+                    case "cancel"://浠诲姟鍙栨秷
                         {
                             PLCService.AGVStatus = false;
                             modTask.IsSuccess = TaskSuccessEnum.Fail;
diff --git a/Admin.NET/WCS.Application/PLC/PLCService.cs b/Admin.NET/WCS.Application/PLC/PLCService.cs
index 1fc0cd8..ee43c9c 100644
--- a/Admin.NET/WCS.Application/PLC/PLCService.cs
+++ b/Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -5,6 +5,8 @@
 using DocumentFormat.OpenXml.Spreadsheet;
 using Furion.Logging;
 using IoTClient;
+using NewLife.Reflection;
+using WCS.Application.Entity;
 using WCS.Application.Util;
 
 namespace WCS.Application;
@@ -154,52 +156,70 @@
                     sysCacheService.HashAddOrUpdate("AlarmInfo_Car", plcConn.PlcIP, -1);
                     var modPosTaskStatus = modDevice.listStation.FirstOrDefault(s => s.Text == "浠诲姟鐘舵��");
                     var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos);
+                    //鍒ゆ柇璇诲彇浠诲姟鐘舵�佹槸鍚︽垚鍔� 骞朵笖浠诲姟鐘舵�佹槸1  0:鏈┖闂�,1:绌洪棽,2:寮傚父  3锛氬厖鐢典腑
+                    
+                    WcsCarTasks carTask2 = null;//null 鏂颁换鍔�  not null 璺緞2浠诲姟
                     if (resultTaskStatus.IsSucceed && valueTaskStatus == 1)
                     {
                         var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "浠诲姟鍙�");
                         var (resultTask, valueTask) = plcConn.GetDBValue(modPosTask.PosType, modPosTask.PlcPos);
-                        string valueTaskStr = Convert.ToString(valueTask);
-                        string strNo = "";
-                        var boNo = dicTaskNo.TryGetValue(modDevice.Id.ToString(), out strNo);
-                        if (valueTaskStr != "0" && strNo != valueTaskStr)
+                        //璇诲彇浠诲姟鍙�
+                        int valueTaskStr = Convert.ToInt32(valueTask);
+                        //鑾峰彇浠诲姟淇℃伅 鏍规嵁  浠诲姟鍙枫�佸皬杞︾紪鍙�
+                        var carTask = _db.Queryable<WcsCarTasks>().First(m=>m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.CarTaskNo == valueTaskStr && m.CarNo == modDevice.PlcIdIP);
+                        if (carTask == null)
                         {
-                            var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.Id.ToString().EndsWith(valueTaskStr));
-                            if (modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
-                            {
-                                //12.4鍑哄簱鏀规垚璋冪敤WMS瀹屾垚浠诲姟鎺ュ彛锛沇MS鎿嶆帶PDA鎵樼洏涓嬫灦鍚庯紝WCS浠诲姟鐘舵�佹墠瀹屾垚锛堥伩鍏嶅皬杞︾户缁窇锛�
-                                if (modFinshTask.TaskType == TaskTypeEnum.In)
-                                {
-                                    modFinshTask.Status = TaskStatusEnum.Complete;
-                                    modFinshTask.FinishDate = DateTime.Now;
-                                    _db.Updateable(modFinshTask).ExecuteCommand();
-                                    var taskMonitor = new WcsTaskMonitor()
-                                    {
-                                        TaskNo = modFinshTask.TaskNo,
-                                        PlcName = modDevice.Text,
-                                        InteractiveMsg = $"绌挎杞﹀弽棣堜换鍔″畬鎴�"
-                                    };
-                                    _db.Insertable(taskMonitor).ExecuteCommand();
-                                    //涓嬪彂浠诲姟鏃ュ織
-                                    HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>());
-                                    HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
-                                }
-                                HttpService httpService = new HttpService();
-                                var requestMode = new TaskRequestWMS()
-                                {
-                                    TaskNo = modFinshTask.TaskNo,
-                                    PalletNo = modFinshTask.PalletNo,
-                                    TaskType = ((int)modFinshTask.TaskType).ToString(),
-                                    TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
-                                };
-                                var modResponseTask = httpService.RequestTask(requestMode).Result;
-                                modFinshTask.IsSuccess = TaskSuccessEnum.Success;
-                                _db.Updateable(modFinshTask).ExecuteCommand();
-
-                                if (dicTaskNo.ContainsKey(modDevice.Id.ToString()))
-                                    dicTaskNo.Remove(modDevice.Id.ToString());
-                                dicTaskNo.Add(modDevice.Id.ToString(), valueTaskStr);
-                            }
+                            return;//娌℃湁鎵惧埌浠诲姟
                         }
+                         
+                        var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.TaskNo == carTask.TaskNo);
+                        if (modFinshTask == null)
+                        {
+                            return;//娌℃湁鏌ヨ鍒版�讳换鍔�
+                        }
+                        //鑾峰彇璺緞2鐨勪换鍔� 涓嬪彂
+                        carTask2 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.PreId.Contains(carTask.Id.ToString())).OrderBy(m=>m.CreateTime).First();
+                        
+                        if (carTask != null && carTask.Status != TaskStatusEnum.Complete)
+                        {
+                            carTask.Status = TaskStatusEnum.Complete;
+                            carTask.UpdateTime = DateTime.Now;
+                            _db.Updateable(carTask).ExecuteCommand();
+                            //娣诲姞浠诲姟鏄庣粏
+                            var taskMonitor = new WcsTaskMonitor()
+                            {
+                                TaskNo = carTask.TaskNo,
+                                PlcName = modDevice.Text,
+                                InteractiveMsg = $"绌挎杞﹀弽棣堜换鍔″畬鎴�"
+                            };
+                            _db.Insertable(taskMonitor).ExecuteCommand();
+                            //涓嬪彂浠诲姟鏃ュ織
+                            
+                            HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
+                        }
+                        //娌℃湁璺緞2鐨勪换鍔� 鍙樻洿鎬讳换鍔′俊鎭�
+                        if (carTask2 == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
+                        {
+                            modFinshTask.Status = TaskStatusEnum.Complete;
+                            modFinshTask.FinishDate = DateTime.Now;
+                            _db.Updateable(modFinshTask).ExecuteCommand();
+                            
+                            //鍙嶉WMS绯荤粺 浠诲姟瀹屾垚
+                            //HttpService httpService = new HttpService();
+                            //var requestMode = new TaskRequestWMS()
+                            //{
+                            //    TaskNo = modFinshTask.TaskNo,
+                            //    PalletNo = modFinshTask.PalletNo,
+                            //    TaskType = ((int)modFinshTask.TaskType).ToString(),
+                            //    TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
+                            //};
+                            //var modResponseTask = httpService.RequestTask(requestMode).Result;
+                            //modFinshTask.IsSuccess = TaskSuccessEnum.Success;
+                            //_db.Updateable(modFinshTask).ExecuteCommand();
+                            HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>());
+                            
+                        }
+                        
                     }
 
                     var modStationX = modDevice.listStation.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(X)");
@@ -210,35 +230,52 @@
                     var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos);
 
                     // 鑾峰彇浠诲姟淇℃伅
-                    var stationStart = ((int)valuex).ToString().PadLeft(2, '0');
-                    var stationEnd = ((int)valuez).ToString().PadLeft(2, '0') + "01";
-                    var listTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime)
-                        .Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar
-                        && s.StartLocate.StartsWith(stationStart) && s.StartLocate.EndsWith(stationEnd)).ToList();
-                    var modTask = listTask.FirstOrDefault();
-                    //return;
-                    if (modTask == null)
-                        return;
-                    if (modTask.StartLocate == modTask.EndLocate)
+                    var modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime).First();
+
+                    //瑕佷笅鍙戣矾寰�2浠诲姟
+                    if (carTask2 == null)
                     {
-                        modTask.Status = TaskStatusEnum.Doing;
-                        _db.Updateable(modTask).ExecuteCommand();
-                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
+                        modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTask2.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar);
+
+                        carTask2= _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First();
+                    }
+
+                    //return;
+                    if (modTask == null || carTask2 == null)
+                    {
                         return;
                     }
-                    if (modTask.Status == TaskStatusEnum.Doing)
+                    
+                    if (carTask2.Status == TaskStatusEnum.Doing)
                     {
                         Thread.Sleep(3000);
                         return;
+                    }
+                    //鍒ゆ柇褰撳墠浠诲姟鏄惁杩樻湁鍓嶇疆浠诲姟鏈畬鎴�
+                    var preStrs = carTask2.PreId.Split(';');
+                    foreach (var preStr in preStrs)
+                    {
+                        if (string.IsNullOrWhiteSpace(preStr))
+                        {
+                            continue;
+                        }
+                        var preId = long.Parse(preStr);
+                        var CarTaskPre = _db.Queryable<WcsCarTasks>().First(m => m.Id == preId);
+                        if (CarTaskPre.Status <= TaskStatusEnum.Doing)
+                        {
+                            return;//鍓嶇疆浠诲姟鏈畬鎴�
+                        }
                     }
                     //鍏堝浣�
                     var modRest = modDevice.listStation.FirstOrDefault(s => s.Text == "澶嶄綅");
                     plcConn.SetDBValue(modRest.PosType, modRest.PlcPos, "1");
 
                     List<Result> listResult = new List<Result>();
-                    //鍐欏叆浠诲姟鍙稩d鐨勬湯4浣嶏紝2涓皬杞︿竴璧疯窇鏈夋瀬浣庢鐜囬噸澶�
+                    //鑾峰彇灏忚溅浠诲姟鍙�
+                    var carTaskNo = FourWayCarUtil.GetTaskNo();
+                    
                     var modWriteTask = modDevice.listStation.FirstOrDefault(s => s.Text == "鍐欏叆浠诲姟鍙�");
-                    listResult.Add(plcConn.SetDBValue(modWriteTask.PosType, modWriteTask.PlcPos, modTask.Id.ToString().Substring(modTask.Id.ToString().Length - 4)));
+                    listResult.Add(plcConn.SetDBValue(modWriteTask.PosType, modWriteTask.PlcPos, carTaskNo.ToString()));
 
                     var modNodeX = modDevice.listStation.FirstOrDefault(s => s.Text == "鑺傜偣鍧愭爣X");
                     var modNodeY = modDevice.listStation.FirstOrDefault(s => s.Text == "鑺傜偣鍧愭爣Y");
@@ -256,29 +293,21 @@
                         listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), Convert.ToString(valuez)));
                         listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), "3"));
                     }
-                    //鍐欏叆璧峰浣嶇疆鍙栬揣
-                    listResult.Add(plcConn.SetDBValue(modNodeX.PosType, posX++.ToString(), modTask.StartLocate.Substring(0, 2)));
-                    listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), modTask.StartLocate.Substring(2, 2)));
-                    listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), modTask.StartLocate.Substring(4, 2)));
-                    listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), "2"));
-                    //鍐欏叆鐩爣浣嶇疆鏀捐揣
-                    listResult.Add(plcConn.SetDBValue(modNodeX.PosType, posX++.ToString(), modTask.EndLocate.Substring(0, 2)));
-                    listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), modTask.EndLocate.Substring(2, 2)));
-                    listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), modTask.EndLocate.Substring(4, 2)));
-                    listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), "3"));
-                    string endPos = "";
-                    if (modTask.StartLocate.Substring(0, 2).ToInt() >= 14)
-                        endPos = "01";
-                    else
-                        endPos = "21";
-                    if (listTask.Count == 1 && modTask.EndLocate.Substring(2, 2) != endPos)
+                    //浜や簰璺緞
+                    var execuPath = carTask2.ExecutionPath.Split(';');
+                    foreach (var ePath in execuPath)
                     {
-                        //濡傛灉鍚庣画娌℃湁浠诲姟锛屽氨璁╁皬杞﹀洖鍒板師浣�
-                        listResult.Add(plcConn.SetDBValue(modNodeX.PosType, posX++.ToString(), modTask.EndLocate.Substring(0, 2)));
-                        listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), endPos));//todo:杩欓噷浣嶇疆寰呭畾
-                        listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), modTask.EndLocate.Substring(4, 2)));
-                        listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), "3"));
+                        if (string.IsNullOrWhiteSpace(ePath))
+                        {
+                            continue;
+                        }
+                        //鍐欏叆浜や簰浣嶇疆
+                        listResult.Add(plcConn.SetDBValue(modNodeX.PosType, posX++.ToString(), ePath.Substring(0, 2)));
+                        listResult.Add(plcConn.SetDBValue(modNodeY.PosType, posY++.ToString(), ePath.Substring(2, 2)));
+                        listResult.Add(plcConn.SetDBValue(modNodeZ.PosType, posZ++.ToString(), ePath.Substring(4, 2)));
+                        listResult.Add(plcConn.SetDBValue(modNodeStatus.PosType, posStatus++.ToString(), ePath.Substring(5, 1)));
                     }
+                    
                     //杩欓噷鏄妸鍚庨潰鐨勫潗鏍囧叏鍐�0锛堜负浜嗛槻姝笂娆′换鍔″潗鏍囨病琚鐩栵級
                     while (posX <= 43097)
                     {
@@ -293,17 +322,17 @@
                         var result = plcConn.SetDBValue(modStart.PosType, modStart.PlcPos, "1");
                         if (result.IsSucceed)
                         {
-                            modTask.Status = TaskStatusEnum.Doing;
-                            _db.Updateable(modTask).ExecuteCommand();
+                            carTask2.Status = TaskStatusEnum.Doing;
+                            carTask2.CarTaskNo = carTaskNo;
+                            _db.Updateable(carTask2).ExecuteCommand();
                             var taskMonitor = new WcsTaskMonitor()
                             {
-                                TaskNo = modTask.TaskNo,
+                                TaskNo = carTask2.TaskNo,
                                 PlcName = modDevice.Text,
-                                InteractiveMsg = $"鍚戠┛姊溅涓嬪彂浠诲姟{modTask.TaskNo}"
+                                InteractiveMsg = $"鍚戠┛姊溅涓嬪彂浠诲姟{carTask2.TaskNo}"
                             };
                             _db.Insertable(taskMonitor).ExecuteCommand();
                             //涓嬪彂浠诲姟鏃ュ織
-                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                             HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
                         }
                     }
@@ -314,42 +343,42 @@
                     //灏忚溅鐘舵�佸紓甯�
                     var modPosTaskStatus = modDevice.listStation.FirstOrDefault(s => s.Text == "浠诲姟鐘舵��");
                     var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos);
+                    
+                    if (resultTaskStatus.IsSucceed && valueTaskStatus == 1)
                     {
-                        if (resultTaskStatus.IsSucceed && valueTaskStatus == 1)
+                        var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "浠诲姟鍙�");
+                        var (resultTask, valueTask) = plcConn.GetDBValue(modPosTask.PosType, modPosTask.PlcPos);
+                        string valueTaskStr = Convert.ToString(valueTask);
+                        string strNo = "";
+                        var boNo = dicTaskNo.TryGetValue(modDevice.Id.ToString(), out strNo);
+                        if (valueTaskStr != "0" && strNo != valueTaskStr)
                         {
-                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "浠诲姟鍙�");
-                            var (resultTask, valueTask) = plcConn.GetDBValue(modPosTask.PosType, modPosTask.PlcPos);
-                            string valueTaskStr = Convert.ToString(valueTask);
-                            string strNo = "";
-                            var boNo = dicTaskNo.TryGetValue(modDevice.Id.ToString(), out strNo);
-                            if (valueTaskStr != "0" && strNo != valueTaskStr)
+                            var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.Id.ToString().EndsWith(valueTaskStr));
+                            if (modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
                             {
-                                var modFinshTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar && s.Id.ToString().EndsWith(valueTaskStr));
-                                if (modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
+                                HttpService httpService = new HttpService();
+                                var requestMode = new TaskRequestWMS()
                                 {
-                                    HttpService httpService = new HttpService();
-                                    var requestMode = new TaskRequestWMS()
-                                    {
-                                        TaskNo = modFinshTask.TaskNo,
-                                        PalletNo = modFinshTask.PalletNo,
-                                        TaskType = ((int)modFinshTask.TaskType).ToString(),
-                                        TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
-                                    };
-                                    var modResponseTask = httpService.RequestTask(requestMode).Result;
-                                    modFinshTask.IsSuccess = TaskSuccessEnum.Success;
-                                    _db.Updateable(modFinshTask).ExecuteCommand();
-                                    //涓嬪彂浠诲姟鏃ュ織
-                                    //HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>());
-                                    //HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
+                                    TaskNo = modFinshTask.TaskNo,
+                                    PalletNo = modFinshTask.PalletNo,
+                                    TaskType = ((int)modFinshTask.TaskType).ToString(),
+                                    TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
+                                };
+                                var modResponseTask = httpService.RequestTask(requestMode).Result;
+                                modFinshTask.IsSuccess = TaskSuccessEnum.Success;
+                                _db.Updateable(modFinshTask).ExecuteCommand();
+                                //涓嬪彂浠诲姟鏃ュ織
+                                //HubUtil.PublicTask(modFinshTask.Adapt<WcsTaskOutput>());
+                                //HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
 
-                                    if (dicTaskNo.ContainsKey(modDevice.Id.ToString()))
-                                        dicTaskNo.Remove(modDevice.Id.ToString());
-                                    dicTaskNo.Add(modDevice.Id.ToString(), valueTaskStr);
-                                }
+                                if (dicTaskNo.ContainsKey(modDevice.Id.ToString()))
+                                    dicTaskNo.Remove(modDevice.Id.ToString());
+                                dicTaskNo.Add(modDevice.Id.ToString(), valueTaskStr);
                             }
-
                         }
+
                     }
+                    
                     Console.WriteLine($"绌挎杞modDevice.PlcIdIP}寮傚父");
                     var modPosError = modDevice.listStation.FirstOrDefault(s => s.Text == "閿欒鐮�");
                     var (result, valueError) = plcConn.GetDBValue(modPosError.PosType, modPosError.PlcPos);
@@ -599,160 +628,22 @@
     /// <param name="modDevice"></param>
     private static void AGV(WcsDeviceDto modDevice)
     {
-        if (AGVStatus)
-        {
-            return;
-        }
-        //杩欓噷鎵惧嚭鏉GV寰呮墽琛屽拰姝e湪鎵ц鐨勪换鍔★紝濡傛灉鏈夋鍦ㄦ墽琛岀殑浠诲姟灏辫烦鍑猴紝娌℃湁鐨勮瘽灏辨寜鐓т紭鍏堢骇涓嬪彂涓�涓换鍔$粰AGV
-        var listTask = _db.Queryable<WcsTask>()
-                        .Where(s => (s.Status == TaskStatusEnum.Doing || s.Status == TaskStatusEnum.Wait) && s.Type == PLCTypeEnum.AGV)
-                        .OrderBy(s => s.Levels).ToList();
+        
+        //杩欓噷鎵惧嚭鏉GV寰呮墽琛岀殑浠诲姟銆佹寜鐓т紭鍏堢骇涓嬪彂涓�涓换鍔$粰AGV
+        var listTask = _db.Queryable<WcsTask>().Where(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.Type == PLCTypeEnum.AGV).OrderBy(s => s.Levels).ToList();
         if (listTask.Count == 0)
-            return;
-        if (listTask.Any(s => s.Status == TaskStatusEnum.Doing))
         {
-            //鏈変换鍔℃墽琛屼腑 鏆備笉涓嬪彂浠诲姟
             return;
         }
-        //WcsTask modTask = listTask.FirstOrDefault();
+        
         foreach (var modTask in listTask)
         {
-            //鍏ョ紦瀛樺尯鏃讹紝妫�楠屼竴涓嬬紦瀛樺尯浣嶇疆
-            if (modTask.EndLocate.Substring(0, 1) == "Z")
+            if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV ))
             {
-                if (modTask.EndLocate.Substring(1, 1) == "5")
-                {
-                    string end = AGVStorageUtil.GetPalletInStorage(modTask.TaskNo);
-                    if (end.IsNullOrEmpty())
-                        continue;
-                    if (modTask.EndLocate != end)
-                    {
-                        modTask.EndLocate = end;
-                    }
-                }
-                else
-                {
-                    string end = AGVStorageUtil.GetProductInStorage(modTask.TaskNo);
-                    if (end.IsNullOrEmpty())
-                        continue;
-                    if (modTask.EndLocate != end)
-                    {
-                        modTask.EndLocate = end;
-                    }
-                }
+                continue; // 鏈夌洰鐨勪綅缃竴鑷翠笖姝e湪鎵ц鐨勪换鍔�
             }
-            //鍑虹紦瀛樺尯鏃讹紝妫�楠屼竴涓嬬紦瀛樺尯浣嶇疆
-            if (modTask.StartLocate.Substring(0, 1) == "Z")
-            {
-                if (modTask.StartLocate.Substring(1, 1) == "5")
-                {
-                    string start = AGVStorageUtil.GetPalletOutStorage();
-                    if (start.IsNullOrEmpty())
-                        continue;
-                    if (modTask.StartLocate != start)
-                    {
-                        modTask.StartLocate = start;
-                    }
-                }
-                else
-                {
-                    string start = AGVStorageUtil.GetProductOutStorage();
-                    if (start.IsNullOrEmpty())
-                        continue;
-                    if (modTask.StartLocate != start)
-                    {
-                        modTask.StartLocate = start;
-                    }
-                }
-            }
-            //鎶婃墭鐩樻媺鍒扮紦瀛樹綅 鍏堝垽鏂繖閲屾湁娌℃湁
-            if (modTask.EndLocate.Substring(0, 1) == "C")
-            {
-                var bo = _sysConfigService.GetConfigValue<bool>("cache_" + modTask.EndLocate).Result;
-                if (bo)
-                    continue;
-            }
-            //濡傛灉鎷夋墭鐩樺幓鎴愬搧宸ヤ綅锛屽厛妫�鏌ユ湁娌℃湁缂烘墭
-            if (modTask.StartLocate.Substring(0, 1) == "D" && modTask.EndLocate.Substring(0, 1) == "B")
-            {
-                //鍒ゆ柇鐩爣浣嶇疆鏄媶鎵樻満鐨勪换鍔℃湁娌℃湁锛屾湁灏辫烦杩囨媶鎵樻満鍒版垚鍝佸伐浣嶇殑浠诲姟
-                if (listTask.Any(s => s.EndLocate.Substring(0, 1) == "D"))
-                    continue;
-            }
-            //濡傛灉鐩殑宸ヤ綅鏄師鏂欎粨锛屽厛妫�鏌ュ師鏂欎粨鍌ㄤ綅鐘舵��
-            if (modTask.EndLocate == AGVStaionEnum.F1.ToString())
-            {
-                if (_sysConfigService.GetConfigValue<bool>("cache_Materal").Result)
-                    continue;
-            }
-            //if (modTask.StartLocate == AGVStaionEnum.F1.ToString())
-            //{
-            //    if (!_sysConfigService.GetConfigValue<bool>("cache_Materal").Result)
-            //        continue;
-            //}
             
-            //濡傛灉璧峰宸ヤ綅鏄媶鎵樻満
-            if (modTask.StartLocate == AGVStaionEnum.D1.ToString())
-            {
-                //鑾峰彇鍙犳媶鎵樻満IP
-                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine);
-                //鑾峰彇鍙犳媶鎵樻満宸ヤ綅
-                var modDevice2 = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Text == "鎷嗘墭鏈�");
-                //鎵撳紑杩炴帴
-                var modConn = new PLCUtil(modPlc);
-                //鏄惁鍏佽鍙栨墭淇″彿
-                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice2.Id && s.Text == "鍏佽鍙栨墭");
-                var (result, value) = modConn.GetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos);
-                if (result.IsSucceed)
-                {
-                    if (value)
-                    {
-                        //濡傛灉鏈畬鎴愬氨鍒ゆ柇涓嬪彇鎵樹俊鍙锋湁娌℃湁鍐欙紝瀹屾垚灏卞彨灏忚溅鍙栨墭鐩�
-                        modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice2.Id && s.Text == "鍙栨墭淇″彿");
-                        (result, value) = modConn.GetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos);
-                        //濡傛灉娌″啓鍏ュ彇鎵樹俊鍙凤紝灏卞啓鍏�
-                        if (result.IsSucceed && !value)
-                        {
-                            result = modConn.SetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos, "1");
-                            WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
-                            {
-                                TaskNo = modTask.TaskNo,
-                                PlcId = modDevice2.PlcId,
-                                PlcName = modPos.PlcPos,
-                                Status = TaskStatusEnum.Doing,
-                                InteractiveMsg = $"鍚憑modDevice2.Text}鍐欏叆鍙栨墭淇″彿1锛岀粨鏋渰result.IsSucceed}",
-                            };
-                            _db.Insertable(modTaskMonitor).ExecuteCommand();
-                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
-                            Thread.Sleep(5000);
-                        }
-                        break;
-
-                    }
-                    else
-                    {
-                        //涓嶅厑璁稿彇鎵橈紝鍒ゆ柇鏄惁鎷嗘墭鏈哄噯澶囧畬鎴�
-                        modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice2.Id && s.Text == "鍑嗗瀹屾垚");
-                        (result, value) = modConn.GetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos);
-                        if (!value)
-                        {
-                            continue;
-                        }
-                    }
-                }
-                else
-                {
-                    Console.WriteLine("杩炴帴鎷嗘墭鏈轰俊鍙峰け璐�");
-                    continue;
-                }
-            }
-            //濡傛灉鐩殑宸ヤ綅鏄彁鍗囨満鏀捐揣宸ヤ綅锛屽厛妫�鏌ユ湁娌℃湁鎵樼洏绾跨殑浠诲姟
-            if (modTask.EndLocate == AGVStaionEnum.A1.ToString())
-            {
-                if (_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.Status == TaskStatusEnum.Doing).Any())
-                    continue;
-            }
-
+            //涓嬪彂AGV浠诲姟
             AgvTaskInput input = new AgvTaskInput()
             {
                 ReqCode = modTask.Id.ToString(),
diff --git a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
index 7bd5530..e6932f9 100644
--- a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
+++ b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -2,13 +2,18 @@
 using DocumentFormat.OpenXml.Bibliography;
 using DocumentFormat.OpenXml.Drawing;
 using DocumentFormat.OpenXml.Drawing.Charts;
+using Elastic.Clients.Elasticsearch.Snapshot;
 using Furion.Logging;
 using Microsoft.AspNetCore.SignalR;
 using NewLife.Serialization;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
+using OnceMi.AspNetCore.OSS;
 using System;
 using System.Drawing.Drawing2D;
 using System.Net.NetworkInformation;
+using WCS.Application.Entity;
+using WCS.Application.Util;
 using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types;
 //using WCS.Application.Util;
 
@@ -35,6 +40,7 @@
     private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
     private static readonly SysCacheService sysCacheService = App.GetRequiredService<SysCacheService>();
     private static readonly SysConfigService _sysConfigService = App.GetService<SysConfigService>();
+    private static readonly WcsTaskService _taskService = App.GetService<WcsTaskService>();
 
     private static List<WcsPlc> listPlc = new List<WcsPlc>();
     private static List<WcsDevice> listPlcDevice = new List<WcsDevice>();
@@ -137,6 +143,7 @@
             StartRead();
             ConnectionStatus();
             StartWatchAlarm();
+            //AssignTasks();
             //StartWatchPosition();
         }
     }
@@ -334,6 +341,370 @@
             }, cts.Token);
         }
     }
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔″垎閰�
+    /// </summary>
+    private static void AssignTasks()
+    {
+        
+        Task.Run(() =>
+        {
+            while (true)
+            {
+                Console.WriteLine("寮�鍚洓鍚戣溅浠诲姟鑷垎閰�");
+                //鍙栨秷绾跨▼ 鍏抽棴PLC杩炴帴
+                if (cts.Token.IsCancellationRequested)
+                {
+                    foreach (var modModBusUtil in listModbusUtil)
+                    {
+                        if (modModBusUtil != null && modModBusUtil.Connected)
+                            modModBusUtil.Close();
+                    }
+                    break;
+                }
+                try
+                {
+                    // 鑾峰彇瀵嗛泦搴撴湭鎵ц浠诲姟 鏍规嵁鍒涘缓鏃堕棿鎺掑簭
+                    var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => s.CreateTime).First();
+
+                    //01010101: 01鎺� 01鍒� 01灞� 01娣卞害-姝ら」鐩笉鍋氬垽鏂�
+                    var taskpai = int.Parse(waitTask.StartLocate.Substring(4, 2));
+                    var tasklie = int.Parse(waitTask.StartLocate.Substring(4, 2));
+                    var taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2));
+
+                    #region 鑾峰彇褰撳墠浠诲姟鎵�鍦ㄥ眰鎵�鏈夌┖闂插皬杞�
+
+                    // 鑾峰彇鏈変换鍔$殑灏忚溅缂栧彿
+                    var taskCarList = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.Status == TaskStatusEnum.Wait).Select(m => m.CarNo).Distinct().ToList();
+
+                    // 鑾峰彇褰撳墠浠诲姟鎵�鍦ㄥ眰鎵�鏈夌┖闂插皬杞︼紙鏍规嵁灏忚溅浠诲姟琛ㄦ槸鍚︽湁浠诲姟鍜屽皬杞︾姸鎬佸叡鍚屽垽鏂皬杞︽槸鍚︾┖闂�)
+                    var kXCarList = new List<CarInfo>();
+                    foreach (var modbusUtil in listModbusUtil)
+                    {
+                        //濡傛灉灏忚溅鏈夋湭鎵ц鐨勪换鍔★紝璺冲嚭
+                        if (taskCarList.Contains(modbusUtil.PlcIP))
+                        {
+                            continue;
+                        }
+                        //鑾峰彇灏忚溅鐨刉csDevice淇℃伅
+                        var listDevice = listPlcDevice.Where(s => s.PlcId == modbusUtil.PlcId && s.DeviceType == DeviceTypeEnum.Business).ToList();
+                        //寰幆璇昏澶�
+                        foreach (var modDevice in listDevice)
+                        {
+                            var (result, value) = modbusUtil.GetDBValue(modDevice.PosType, modDevice.PlcPos);
+                            if (result.IsSucceed)
+                            {
+                                //鑾峰彇宸ヤ綅WCSPLCPosition淇℃伅
+                                var plcPosition = listPlcPosition.Where(s => s.DeviceId == modDevice.Id).ToList();
+                                //灏忚溅绌洪棽鍔犲叆闆嗗悎
+                                if (value == 1)
+                                {
+                                    var modStationX = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(X)");
+                                    var (resultx, valuex) = modbusUtil.GetDBValue(modStationX.PosType, modStationX.PlcPos);
+                                    var modStationY = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Y)");
+                                    var (resulty, valuey) = modbusUtil.GetDBValue(modStationY.PosType, modStationY.PlcPos);
+                                    var modStationZ = plcPosition.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Z)");
+                                    var (resultz, valuez) = modbusUtil.GetDBValue(modStationZ.PosType, modStationZ.PlcPos);
+                                    //灏忚溅褰撳墠灞�
+                                    var carZ = (int)valuez;
+                                    //浠诲姟灞備笌灏忚溅灞傜浉鍚�
+                                    if (taskceng == carZ)
+                                    {
+                                        if (!kXCarList.Any(m => m.CarPlcIp == modbusUtil.PlcIP))
+                                        {
+                                            var carVal = ((int)valuex).ToString().PadLeft(2, '0') + ((int)valuey).ToString().PadLeft(2, '0') + ((int)valuez).ToString().PadLeft(2, '0');
+                                            var d = FourWayCarUtil.GetCarPath(carVal, waitTask.StartLocate, 0);
+                                            kXCarList.Add(new CarInfo()
+                                            {
+                                                CarPlcIp = modbusUtil.PlcIP,
+                                                X = (int)valuex,
+                                                Y = (int)valuey,
+                                                Z = (int)valuez,
+                                                Level = d.Count,
+                                            });
+                                        }
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                Console.WriteLine($"璇诲彇鍥涘悜杞modbusUtil.PlcIP}鐘舵�佸け璐�");
+                                return;//鏈変竴涓皬杞﹁鍙栧け璐ヨ烦鍑烘柟娉曪紝鏆傜紦鍒嗛厤锛岄槻姝㈠悓灞傚皬杞﹀叧鏈烘垨澶辫仈瀵艰嚧闃绘尅璺緞
+                            }
+                        }
+                    }
+
+                    #endregion
+
+                    #region 鑾峰彇閫傚悎鎵ц褰撳墠浠诲姟鐨勫皬杞� 鐢熸垚璺緞锛堥渶鑰冭檻灏忚溅闃婚樆鎸★級
+
+                    var assignCar = kXCarList.OrderBy(m => m.Level).FirstOrDefault();
+                    if (assignCar == null)
+                    {
+                        break;//娌℃湁绌洪棽灏忚溅
+                    }
+                    var data = new List<CarModel>();
+                    if (assignCar.Level != 0)
+                    {
+                        //鍒ゆ柇灏忚溅浣嶇疆鏄惁涓庝换鍔$殑璧峰鍌ㄤ綅鐩稿悓,涓嶇浉鍚岋細鑾峰彇灏忚溅鍒板彇璐у偍浣嶈矾寰�
+                        var carLocate = assignCar.X.ToString().PadLeft(2, '0')+assignCar.Y.ToString().PadLeft(2, '0')+ assignCar.Z.ToString().PadLeft(2, '0');
+                        //鑾峰彇灏忚溅鍘诲彇璐у偍浣嶄换鍔¤矾寰�
+                        var data1 = FourWayCarUtil.GetCarPath(carLocate, waitTask.StartLocate, 0);
+                        data.AddRange(data1);
+                    }
+                    //鑾峰彇灏忚溅鍘绘斁璐у偍浣嶄换鍔¤矾寰�
+                    var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, 2, "1");
+                    
+                    data.AddRange(data2);
+                    if (data == null) { break; }
+
+                    var preId1 = "";//鍓嶇疆浠诲姟Id
+                    var executionPath1 = "";//浜や簰璺緞
+                    var executionPath2 = "";//浜や簰璺緞
+                    var path = "";//鎵�鏈夎矾寰�
+                    var isOk = "1"; //鏄惁瀹屾暣璺緞  1瀹屾暣 2 涓ゆ潯璺緞
+                    for (int i = 0; i < data.Count; i++)
+                    {
+                        //璺緞鑺傜偣
+                        var pathXYZ = data[i].X.ToString().PadLeft(2, '0') + data[i].Y.ToString().PadLeft(2, '0') + data[i].Z.ToString().PadLeft(2, '0')+ data[i].NodeCom.ToString();
+                        path += pathXYZ + ";";
+                        
+                        //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟
+                        var taskList = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.Path.Contains(pathXYZ)).Select(m => m.Id).Distinct().ToList();
+
+                        foreach (var item in taskList)
+                        {
+                            //鍒ゆ柇濡傛灉鏄畬鏁磋矾寰� 璁板綍浜や簰璺緞
+                            if (isOk == "1")
+                            {
+                                if (i == 0)
+                                {
+                                    return;//绗竴涓妭鐐规湁鍜屽叾浠栦换鍔¤矾寰勫啿绐侊紝鏃犳硶閬垮厤
+                                }
+                                var pathXYZQian = data[i - 1].X.ToString().PadLeft(2, '0') + data[i - 1].Y.ToString().PadLeft(2, '0') + data[i - 1].Z.ToString().PadLeft(2, '0') + data[i].NodeCom.ToString();
+                                if (!executionPath1.Contains(pathXYZQian))
+                                {
+                                    executionPath1 += pathXYZQian + ";";
+                                }
+                                executionPath2 += pathXYZQian + ";";
+                            }
+                            //鍒ゆ柇娣诲姞鍓嶇疆浠诲姟Id
+                            if (!preId1.Contains(item + ""))
+                            {
+                                preId1 += item + ";";
+                            }
+                            
+                            isOk = "2";
+                        }
+                        
+                        if (data[i].IsSendPlc)
+                        {
+                            if (isOk == "1")
+                            {
+                                executionPath1 += pathXYZ + ";";
+                            }
+                            else
+                            {
+                                executionPath2 += pathXYZ + ";";
+                            }
+
+                        }
+
+                    }
+
+                    #endregion
+
+                    #region 鍒ゆ柇鏄惁鏈夌┖闂插皬杞﹂樆鎸¤矾寰� 3
+                    var preId3 = "";//鍓嶇疆浠诲姟Id
+                    foreach (var item in kXCarList)
+                    {
+                        if (item == assignCar)
+                        {
+                            continue;//鎺掗櫎褰撳墠鍒嗛厤浠诲姟鐨勫皬杞�
+                        }
+                        //灏忚溅浣嶇疆
+                        var carXYZ = item.X.ToString().PadLeft(2, '0') + item.Y.ToString().PadLeft(2, '0') + item.Z.ToString().PadLeft(2, '0') ;
+                        //鍒嗛厤鐨勪换鍔¤矾寰勪腑 褰撳墠灏忚溅鏄惁闃绘尅
+                        if (path.Contains(carXYZ))
+                        {
+                            //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟锛屼笉浼氭湁澶浠诲姟锛屽悓灞傛湁鍑犱釜灏忚溅鏈�澶氭湁鍑犱釜浠诲姟
+                            var taskList3 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)).ToList();
+                            
+                            var str3 = "";//鎵�鏈夊凡鍒嗛厤鎴栨墽琛岀殑浠诲姟鍏ㄨ矾寰勪箣鍜�
+
+                            foreach (var item2 in taskList3)
+                            {
+                                str3 += item2.Path;
+                            }
+                            var endLocate3 = "";
+                            var executionPath3 = "";
+                            var path3 = ""; 
+                            var data3 = new List<CarModel>();
+                            //鏌ユ壘鐩爣浣嶇疆
+                            while (endLocate3 == "" || data3.Count == 0 || data3 == null)
+                            {
+                                endLocate3 = FourWayCarUtil.GetCarEndLocation(carXYZ, str3);
+                                data3 = FourWayCarUtil.GetCarPath(carXYZ, endLocate3, 0, "0");
+                            }
+                            foreach (var itemPath in data3)
+                            {
+                                var pathXYZ = itemPath.X.ToString().PadLeft(2, '0') + itemPath.Y.ToString().PadLeft(2, '0') + itemPath.Z.ToString().PadLeft(2, '0') + itemPath.NodeCom.ToString();
+
+                                path3 += pathXYZ + ";";
+                                if (itemPath.IsSendPlc)
+                                {
+                                    executionPath3 += pathXYZ + ";";
+                                }
+                            }
+                            WcsTask modTask = new WcsTask()
+                            {
+                                TaskNo = _taskService.GetTaskCode(),
+                                TaskType = TaskTypeEnum.Move,
+                                Type = PLCTypeEnum.ShuttleCar,
+                                StartLocate = carXYZ,
+                                EndLocate = endLocate3,
+                                PalletNo = "",
+                                Status = TaskStatusEnum.Wait,
+                                Levels = 2,
+                                Origin = "WCS"
+                            };
+                            _db.Insertable(modTask).ExecuteCommand();
+                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
+                            //绉诲姩灏忚溅
+                            var carTaskYC = new WcsCarTasks()
+                            {
+                                TaskNo = modTask.TaskNo,
+                                PreId = "",
+                                ExecutionPath = executionPath3,
+                                Path = path3,
+                                CarNo = item.CarPlcIp,
+                                Status = TaskStatusEnum.Wait
+                            };
+                            var idLong = _db.Insertable(carTaskYC).ExecuteReturnBigIdentity();
+                            preId3 += idLong + ";";
+                        }
+                    }
+
+                    #endregion
+
+                    #region 鍒ゆ柇鐜版湁浠诲姟涓渶缁堣妭鐐规槸鍚﹀湪褰撳墠鍒嗛厤璺緞涓紝濡傛湁 娣诲姞绉昏蛋灏忚溅浠诲姟骞跺姞鍏ュ墠缃换鍔� 4
+
+                    //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟锛屼笉浼氭湁澶浠诲姟锛屽悓灞傛湁鍑犱釜灏忚溅鏈�澶氭湁鍑犱釜浠诲姟
+                    var taskList4 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)).ToList();
+                    var preId4 = "";//鍓嶇疆浠诲姟Id
+                    var str4 = "";//鎵�鏈夊凡鍒嗛厤鎴栨墽琛岀殑浠诲姟鍏ㄨ矾寰勪箣鍜�
+
+                    foreach (var item in taskList4)
+                    {
+                        str4 += item.Path;
+                    } 
+                    //鍒ゆ柇鐜版湁浠诲姟涓渶缁堣妭鐐规槸鍚﹀湪褰撳墠鍒嗛厤璺緞涓紝濡傛湁 娣诲姞绉昏蛋灏忚溅浠诲姟骞跺姞鍏ュ墠缃换鍔� 
+                    foreach (var item in taskList4)
+                    {
+                        var lastPathList = item.ExecutionPath.Split(';');
+                        //  a;b;c; 鏈�鍚庝竴涓綅鏄�溾�濓紝鎵�浠astPathList.Length - 2
+                        var lastPath = lastPathList[lastPathList.Length - 2];
+
+                        //濡傛灉姝ゆ鍒嗛厤璺緞鍖呭惈閱夎垶涓渶缁堣妭鐐硅矾寰勶紝娣诲姞绉昏蛋灏忚溅
+                        if (path.Contains(lastPath))
+                        {
+                            var endLocate = "";
+                            var executionPath4 = "";
+                            var path4 = "";
+                            var data4 = new List<CarModel>();
+                            //鏌ユ壘鐩爣浣嶇疆
+                            while (endLocate == "" || data4.Count == 0 || data4 == null)
+                            {
+                                endLocate = FourWayCarUtil.GetCarEndLocation(lastPath, str4);
+                                data4 = FourWayCarUtil.GetCarPath(lastPath, endLocate, 0, "0");
+                            }
+                            foreach (var itemPath in data4)
+                            {
+                                var pathXYZ = itemPath.X.ToString().PadLeft(2, '0') + itemPath.Y.ToString().PadLeft(2, '0') + itemPath.Z.ToString().PadLeft(2, '0') + itemPath.NodeCom.ToString();
+
+                                path4 += pathXYZ + ";";
+                                if (itemPath.IsSendPlc)
+                                {
+                                    executionPath4 += pathXYZ + ";";
+                                }
+                            }
+                            WcsTask modTask = new WcsTask()
+                            {
+                                TaskNo = _taskService.GetTaskCode(),
+                                TaskType = TaskTypeEnum.Move,
+                                Type = PLCTypeEnum.ShuttleCar,
+                                StartLocate = lastPath,
+                                EndLocate = endLocate,
+                                PalletNo = "",
+                                Status = TaskStatusEnum.Wait,
+                                Levels = 2,
+                                Origin = "WCS"
+                            };
+                            _db.Insertable(modTask).ExecuteCommand();
+                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
+                            //绉诲姩灏忚溅
+                            var carTaskYC = new WcsCarTasks()
+                            {
+                                TaskNo = modTask.TaskNo,
+                                PreId = "",
+                                ExecutionPath = executionPath4,
+                                Path = path4,
+                                CarNo = item.CarNo,
+                                Status = TaskStatusEnum.Wait
+                            };
+                            var idLong = _db.Insertable(carTaskYC).ExecuteReturnBigIdentity();
+                            preId4 += idLong + ";";
+                        }
+                    }
+
+                    #endregion
+
+                    #region 鎻掑叆浠诲姟鏁版嵁  鏀瑰彉浠诲姟鐘舵��
+
+                    // 鎻掑叆鍥涘悜杞︿换鍔¤〃
+                    var carTask1 = new WcsCarTasks()
+                    {
+                        TaskNo = waitTask.TaskNo,
+                        PreId = preId1+ preId3+preId4,
+                        ExecutionPath = executionPath1,
+                        Path = path,
+                        CarNo = assignCar.CarPlcIp,
+                        Status = TaskStatusEnum.Wait
+                    };
+                    _db.Insertable(carTask1).ExecuteCommand();
+                    if (!string.IsNullOrWhiteSpace(executionPath1) && isOk == "2")
+                    {
+                        // 鎻掑叆鍥涘悜杞︿换鍔¤〃
+                        var carTask2 = new WcsCarTasks()
+                        {
+                            TaskNo = waitTask.TaskNo,
+                            PreId = preId1,
+                            ExecutionPath = executionPath2,
+                            Path = path,
+                            CarNo = assignCar.CarPlcIp,
+                            Status = TaskStatusEnum.Wait
+                        };
+                        _db.Insertable(carTask2).ExecuteCommand();
+                    }
+                    // 鏀瑰彉鎬讳换鍔¤〃鐘舵��
+                    waitTask.Status = TaskStatusEnum.Doing;
+                    waitTask.UpdateTime = DateTime.Now;
+                    _db.Updateable(waitTask).ExecuteCommand();
+                    HubUtil.PublicTask(waitTask.Adapt<WcsTaskOutput>());
+
+                    #endregion
+
+                    Thread.Sleep(3000);
+                }
+                catch (Exception ex)
+                {
+                    Log.Error("浠诲姟鍒嗛厤鍙戠敓寮傚父", ex);
+                }
+            }
+        },cts.Token);
+    }
+
 
     /// <summary>
     /// 杩炴帴鐘舵�佺嚎绋�
@@ -692,6 +1063,10 @@
             }
         });
     }
+    /// <summary>
+    /// 淇敼浣嶇疆淇℃伅
+    /// </summary>
+    /// <param name="modInfo"></param>
     private static void UpdatePosition(PlcPositionInfo modInfo)
     {
         var modTemp = listPositionInfo.FirstOrDefault(s => s.StationNum == modInfo.StationNum && modInfo.Type == s.Type);
diff --git a/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksDto.cs b/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksDto.cs
new file mode 100644
index 0000000..7d95d26
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksDto.cs
@@ -0,0 +1,89 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace WCS.Application;
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔℃槑缁嗚〃杈撳嚭鍙傛暟
+    /// </summary>
+    public class WcsCarTasksDto
+    {
+        /// <summary>
+        /// 涓婚敭Id
+        /// </summary>
+        public long Id { get; set; }
+        
+        /// <summary>
+        /// 浠诲姟鍙�
+        /// </summary>
+        public string? TaskNo { get; set; }
+        
+        /// <summary>
+        /// 鍓嶇疆灏忚溅浠诲姟ID
+        /// </summary>
+        public string? PreId { get; set; }
+        
+        /// <summary>
+        /// 浜や簰璺緞
+        /// </summary>
+        public string? ExecutionPath { get; set; }
+        
+        /// <summary>
+        /// 鎵�鏈夎矾寰�
+        /// </summary>
+        public string? Path { get; set; }
+        
+        /// <summary>
+        /// 灏忚溅缂栧彿
+        /// </summary>
+        public string? CarNo { get; set; }
+        
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        public int? Status { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        public DateTime? CreateTime { get; set; }
+        
+        /// <summary>
+        /// 鏇存柊鏃堕棿
+        /// </summary>
+        public DateTime? UpdateTime { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰匢d
+        /// </summary>
+        public long? CreateUserId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呭鍚�
+        /// </summary>
+        public string? CreateUserName { get; set; }
+        
+        /// <summary>
+        /// 淇敼鑰匢d
+        /// </summary>
+        public long? UpdateUserId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂↖d
+        /// </summary>
+        public long? CreateOrgId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂ㄥ悕绉�
+        /// </summary>
+        public string? CreateOrgName { get; set; }
+        
+        /// <summary>
+        /// 杞垹闄�
+        /// </summary>
+        public bool IsDelete { get; set; }
+        
+    }
diff --git a/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksInput.cs b/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksInput.cs
new file mode 100644
index 0000000..45f4a79
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksInput.cs
@@ -0,0 +1,170 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using System.ComponentModel.DataAnnotations;
+
+namespace WCS.Application;
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔℃槑缁嗚〃鍩虹杈撳叆鍙傛暟
+    /// </summary>
+    public class WcsCarTasksBaseInput
+    {
+        /// <summary>
+        /// 浠诲姟鍙�
+        /// </summary>
+        public virtual string? TaskNo { get; set; }
+        
+        /// <summary>
+        /// 鍓嶇疆灏忚溅浠诲姟ID
+        /// </summary>
+        public virtual string? PreId { get; set; }
+        
+        /// <summary>
+        /// 浜や簰璺緞
+        /// </summary>
+        public virtual string? ExecutionPath { get; set; }
+        
+        /// <summary>
+        /// 鎵�鏈夎矾寰�
+        /// </summary>
+        public virtual string? Path { get; set; }
+        
+        /// <summary>
+        /// 灏忚溅缂栧彿
+        /// </summary>
+        public virtual string? CarNo { get; set; }
+        
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        public virtual TaskStatusEnum? Status { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        public virtual DateTime? CreateTime { get; set; }
+        
+        /// <summary>
+        /// 鏇存柊鏃堕棿
+        /// </summary>
+        public virtual DateTime? UpdateTime { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰匢d
+        /// </summary>
+        public virtual long? CreateUserId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呭鍚�
+        /// </summary>
+        public virtual string? CreateUserName { get; set; }
+        
+        /// <summary>
+        /// 淇敼鑰匢d
+        /// </summary>
+        public virtual long? UpdateUserId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂↖d
+        /// </summary>
+        public virtual long? CreateOrgId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂ㄥ悕绉�
+        /// </summary>
+        public virtual string? CreateOrgName { get; set; }
+        
+        /// <summary>
+        /// 杞垹闄�
+        /// </summary>
+        public virtual bool IsDelete { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔℃槑缁嗚〃鍒嗛〉鏌ヨ杈撳叆鍙傛暟
+    /// </summary>
+    public class PageWcsCarTasksInput : BasePageInput
+    {
+        /// <summary>
+        /// 鍏抽敭瀛楁煡璇�
+        /// </summary>
+        public string? SearchKey { get; set; }
+
+        /// <summary>
+        /// 浠诲姟鍙�
+        /// </summary>
+        public string? TaskNo { get; set; }
+        
+        /// <summary>
+        /// 鍓嶇疆灏忚溅浠诲姟ID
+        /// </summary>
+        public string? PreId { get; set; }
+        
+        /// <summary>
+        /// 浜や簰璺緞
+        /// </summary>
+        public string? ExecutionPath { get; set; }
+        
+        /// <summary>
+        /// 鎵�鏈夎矾寰�
+        /// </summary>
+        public string? Path { get; set; }
+        
+        /// <summary>
+        /// 灏忚溅缂栧彿
+        /// </summary>
+        public string? CarNo { get; set; }
+        
+        /// <summary>
+        /// 鐘舵��
+        /// </summary>
+        public TaskStatusEnum? Status { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔℃槑缁嗚〃澧炲姞杈撳叆鍙傛暟
+    /// </summary>
+    public class AddWcsCarTasksInput : WcsCarTasksBaseInput
+    {
+        /// <summary>
+        /// 杞垹闄�
+        /// </summary>
+        [Required(ErrorMessage = "杞垹闄や笉鑳戒负绌�")]
+        public override bool IsDelete { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔℃槑缁嗚〃鍒犻櫎杈撳叆鍙傛暟
+    /// </summary>
+    public class DeleteWcsCarTasksInput : BaseIdInput
+    {
+    }
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔℃槑缁嗚〃鏇存柊杈撳叆鍙傛暟
+    /// </summary>
+    public class UpdateWcsCarTasksInput : WcsCarTasksBaseInput
+    {
+        /// <summary>
+        /// 涓婚敭Id
+        /// </summary>
+        [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+        public long Id { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鍥涘悜杞︿换鍔℃槑缁嗚〃涓婚敭鏌ヨ杈撳叆鍙傛暟
+    /// </summary>
+    public class QueryByIdWcsCarTasksInput : DeleteWcsCarTasksInput
+    {
+
+    }
diff --git a/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksOutput.cs b/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksOutput.cs
new file mode 100644
index 0000000..4ce2f11
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsCarTasks/Dto/WcsCarTasksOutput.cs
@@ -0,0 +1,91 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace WCS.Application;
+
+/// <summary>
+/// 鍥涘悜杞︿换鍔℃槑缁嗚〃杈撳嚭鍙傛暟
+/// </summary>
+public class WcsCarTasksOutput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+    
+    /// <summary>
+    /// 浠诲姟鍙�
+    /// </summary>
+    public string? TaskNo { get; set; }
+    
+    /// <summary>
+    /// 鍓嶇疆灏忚溅浠诲姟ID
+    /// </summary>
+    public string? PreId { get; set; }
+    
+    /// <summary>
+    /// 浜や簰璺緞
+    /// </summary>
+    public string? ExecutionPath { get; set; }
+    
+    /// <summary>
+    /// 鎵�鏈夎矾寰�
+    /// </summary>
+    public string? Path { get; set; }
+    
+    /// <summary>
+    /// 灏忚溅缂栧彿
+    /// </summary>
+    public string? CarNo { get; set; }
+    
+    /// <summary>
+    /// 鐘舵��
+    /// </summary>
+    public int? Status { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鏃堕棿
+    /// </summary>
+    public DateTime? CreateTime { get; set; }
+    
+    /// <summary>
+    /// 鏇存柊鏃堕棿
+    /// </summary>
+    public DateTime? UpdateTime { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰匢d
+    /// </summary>
+    public long? CreateUserId { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰呭鍚�
+    /// </summary>
+    public string? CreateUserName { get; set; }
+    
+    /// <summary>
+    /// 淇敼鑰匢d
+    /// </summary>
+    public long? UpdateUserId { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰呴儴闂↖d
+    /// </summary>
+    public long? CreateOrgId { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰呴儴闂ㄥ悕绉�
+    /// </summary>
+    public string? CreateOrgName { get; set; }
+    
+    /// <summary>
+    /// 杞垹闄�
+    /// </summary>
+    public bool IsDelete { get; set; }
+    
+    }
+ 
+
diff --git a/Admin.NET/WCS.Application/Service/WcsCarTasks/WcsCarTasksService.cs b/Admin.NET/WCS.Application/Service/WcsCarTasks/WcsCarTasksService.cs
new file mode 100644
index 0000000..9c55a3a
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsCarTasks/WcsCarTasksService.cs
@@ -0,0 +1,127 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core.Service;
+using Microsoft.AspNetCore.Http;
+using WCS.Application.Entity;
+namespace WCS.Application;
+
+/// <summary>
+/// 鍥涘悜杞︿换鍔℃槑缁嗚〃鏈嶅姟
+/// </summary>
+[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
+public class WcsCarTasksService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<WcsCarTasks> _wcsCarTasksRep;
+    public WcsCarTasksService(SqlSugarRepository<WcsCarTasks> wcsCarTasksRep)
+    {
+        _wcsCarTasksRep = wcsCarTasksRep;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ鍥涘悜杞︿换鍔℃槑缁嗚〃
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("鍒嗛〉鏌ヨ鍥涘悜杞︿换鍔℃槑缁嗚〃")]
+    public async Task<SqlSugarPagedList<WcsCarTasksOutput>> Page(PageWcsCarTasksInput input)
+    {
+		input.SearchKey = input.SearchKey?.Trim();
+        var query = _wcsCarTasksRep.AsQueryable()
+            .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u =>
+                u.TaskNo.Contains(input.SearchKey)
+                || u.PreId.Contains(input.SearchKey)
+                || u.ExecutionPath.Contains(input.SearchKey)
+                || u.Path.Contains(input.SearchKey)
+                || u.CarNo.Contains(input.SearchKey)
+            )
+            .WhereIF(!string.IsNullOrWhiteSpace(input.TaskNo), u => u.TaskNo.Contains(input.TaskNo.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.PreId), u => u.PreId.Contains(input.PreId.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.ExecutionPath), u => u.ExecutionPath.Contains(input.ExecutionPath.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Path), u => u.Path.Contains(input.Path.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.CarNo), u => u.CarNo.Contains(input.CarNo.Trim()))
+            .WhereIF(input.Status>0, u => u.Status == input.Status)
+            .Select<WcsCarTasksOutput>();
+		return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 澧炲姞鍥涘悜杞︿换鍔℃槑缁嗚〃
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("澧炲姞鍥涘悜杞︿换鍔℃槑缁嗚〃")]
+    public async Task<long> Add(AddWcsCarTasksInput input)
+    {
+        var entity = input.Adapt<WcsCarTasks>();
+        await _wcsCarTasksRep.InsertAsync(entity);
+        return entity.Id;
+    }
+
+    /// <summary>
+    /// 鍒犻櫎鍥涘悜杞︿换鍔℃槑缁嗚〃
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("鍒犻櫎鍥涘悜杞︿换鍔℃槑缁嗚〃")]
+    public async Task Delete(DeleteWcsCarTasksInput input)
+    {
+        var entity = await _wcsCarTasksRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+        await _wcsCarTasksRep.FakeDeleteAsync(entity);   //鍋囧垹闄�
+        //await _wcsCarTasksRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鏇存柊鍥涘悜杞︿换鍔℃槑缁嗚〃
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("鏇存柊鍥涘悜杞︿换鍔℃槑缁嗚〃")]
+    public async Task Update(UpdateWcsCarTasksInput input)
+    {
+        var entity = input.Adapt<WcsCarTasks>();
+        await _wcsCarTasksRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鑾峰彇鍥涘悜杞︿换鍔℃槑缁嗚〃
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet]
+    [ApiDescriptionSettings(Name = "Detail")]
+    [DisplayName("鑾峰彇鍥涘悜杞︿换鍔℃槑缁嗚〃")]
+    public async Task<WcsCarTasks> Detail([FromQuery] QueryByIdWcsCarTasksInput input)
+    {
+        return await _wcsCarTasksRep.GetFirstAsync(u => u.Id == input.Id);
+    }
+
+    /// <summary>
+    /// 鑾峰彇鍥涘悜杞︿换鍔℃槑缁嗚〃鍒楄〃
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet]
+    [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("鑾峰彇鍥涘悜杞︿换鍔℃槑缁嗚〃鍒楄〃")]
+    public async Task<List<WcsCarTasksOutput>> List([FromQuery] PageWcsCarTasksInput input)
+    {
+        return await _wcsCarTasksRep.AsQueryable().Select<WcsCarTasksOutput>().ToListAsync();
+    }
+
+
+
+
+
+}
diff --git a/Admin.NET/WCS.Application/Util/FourWayCarUtil.cs b/Admin.NET/WCS.Application/Util/FourWayCarUtil.cs
new file mode 100644
index 0000000..aaa4238
--- /dev/null
+++ b/Admin.NET/WCS.Application/Util/FourWayCarUtil.cs
@@ -0,0 +1,490 @@
+锘縰sing AngleSharp.Dom;
+using Furion.Logging;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Application.Entity;
+
+namespace WCS.Application.Util;
+
+public static class FourWayCarUtil
+{
+    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
+
+    
+    /// <summary>
+    /// 鑾峰彇灏忚溅璺緞
+    /// </summary>
+    /// <param name="startLocation">璧峰浣嶇疆</param>
+    /// <param name="endLocation">鐩爣浣嶇疆</param>
+    /// <param name="moveType">绉诲姩绫诲瀷 0:绉诲姩 1:鍙栬揣 2:鏀捐揣</param>
+    /// <param name="isLoad">鏄惁杞借揣0锛氭湭杞借揣  1锛氬凡杞借揣</param>
+    /// <returns></returns>
+    public static List<CarModel> GetCarPath(string startLocation, string endLocation, int moveType, string isLoad = "0")
+    {
+        if (string.IsNullOrEmpty(startLocation) || string.IsNullOrEmpty(endLocation))
+        {
+            return null;
+        }
+
+        // 璧峰浣嶇疆
+        CarModel start = new CarModel()
+        {
+            X = int.Parse(startLocation.Substring(0, 2)),
+            Y = int.Parse(startLocation.Substring(2, 2)),
+            Z = int.Parse(startLocation.Substring(4, 2)),
+            NodeCom = 0
+        };
+
+        // 鐩爣浣嶇疆
+        CarModel end = new CarModel()
+        {
+            X = int.Parse(endLocation.Substring(0, 2)),
+            Y = int.Parse(endLocation.Substring(2, 2)),
+            Z = int.Parse(endLocation.Substring(4, 2)),
+            NodeCom = 0
+        };
+
+        // 鑾峰彇鍌ㄤ綅琛ㄤ俊鎭瓨鍌ㄥ埌闆嗗悎閲�
+        var layer = int.Parse(startLocation.Substring(4, 2));
+
+        //  鑾峰彇褰撳墠灞傚偍浣嶄俊鎭�
+        var locationModels = _db.Queryable<WcsStorageLocat>()
+            .Where(m => m.WareHouseNo == "W01" && m.Layer == layer && m.IsDelete == false)
+            .ToList();
+
+        #region 浣跨敤绠楁硶璁$畻灏忚溅璺緞
+        try
+        {
+            // 瀹氫箟寮�鍙戝垪琛ㄥ瓨鍌ㄨ矾寰勮妭鐐�
+            var openSet = new SortedSet<(int fscore, CarModel pos)>();
+            // 瀹氫箟鍏抽棴鑺傜偣瀛楀吀
+            var closeSet = new Dictionary<CarModel, CarModel>();
+            // 瀹氫箟涓婁竴浣嶇疆涓庣洰鏍囦綅缃瓧鍏�
+            var cameFrom = new Dictionary<CarModel, CarModel>();
+            // 瀹氫箟涓婁竴浣嶇疆涓庣洰鏍囦綅缃殑瀹為檯璺濈瀛楀吀
+            var gScore = new Dictionary<CarModel, int>();
+            // 瀹氫箟涓婁竴浣嶇疆涓庣洰鏍囦綅缃殑棰勪及璺濈瀛楀吀
+            var fScore = new Dictionary<CarModel, int>();
+
+            // 瀛樺偍鏈�浼樿窛绂伙紝鍙婅捣濮嬭妭鐐�
+            openSet.Add((Heuristic(start, end), start));
+            gScore[start] = 0;
+            fScore[start] = Heuristic(start, end);
+
+            // 寰幆鏌ユ壘璺緞
+            while (openSet.Count > 0)
+            {
+                var current = openSet.Min.pos;
+                openSet.Remove(openSet.Min);
+
+                if (current.Equals(end))
+                {
+                    Log.Error(ReconstructPath(cameFrom, current).ToString());
+                    return ReconstructPath(cameFrom, current);
+                }
+
+                // 瀛樺偍灏忚溅鍙繍琛岀殑鏂瑰悜
+                var validDirections = new List<CarModel>();
+                var currentLocation = locationModels.FirstOrDefault(m => m.Row == current.X && m.Column == current.Y);
+                if (currentLocation.Make == "0")
+                {
+                    // 涓婚�氶亾
+                    validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 鍙�
+                    validDirections.Add(new CarModel() { X = -1, Y = 0 }); // 宸�
+                    validDirections.Add(new CarModel() { X = 0, Y = 1 }); // 涓�
+                    validDirections.Add(new CarModel() { X = 0, Y = -1 }); // 涓�
+                }
+
+                if (currentLocation.Make == "1")
+                {
+                    // 瀛愰�氶亾
+                    // 鍏堟媶鍒嗗嚭鍙�
+                    var outNode = currentLocation.AisleOne;
+                    if (string.IsNullOrEmpty(outNode))
+                    {
+                        throw new Exception("褰撳墠浣嶇疆娌℃湁缁存姢鍑哄彛锛�");
+                    }
+                    int outX = int.Parse(outNode.Substring(0, 2));
+                    int outY = int.Parse(outNode.Substring(2, 2));
+                    if (current.X == outX)
+                    {
+                        validDirections.Add(new CarModel() { X = 0, Y = 1 }); // 涓�
+                        validDirections.Add(new CarModel() { X = 0, Y = -1 }); // 涓�
+
+                    }
+                    else
+                    {
+                        validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 鍙�
+                        validDirections.Add(new CarModel() { X = -1, Y = 0 }); // 宸�
+                    }
+                }
+
+                // 寰幆杩炴帴鑺傜偣銆�
+                bool isNextNode = false;
+                foreach (var dir in validDirections)
+                {
+                    CarModel neighbor = new CarModel() { X = current.X + dir.X, Y = current.Y + dir.Y, Z = layer };
+
+                    // 楠岃瘉涓嬩竴鑺傜偣浣嶇疆鏄惁鍙�氳骞朵笖鍒ゆ柇鏄惁琚叾浠栧皬杞﹀崰鐢�
+
+
+                    // 鍒ゆ柇涓嬩竴鑺傜偣鏄惁鍏抽棴
+                    if (closeSet.ContainsKey(neighbor))
+                    {
+                        closeSet[neighbor] = neighbor;
+                    }
+
+                    // 褰撳墠鑺傜偣
+                    var currentModel = locationModels.FirstOrDefault(it => it.Row == current.X && it.Column == current.Y);
+                    // 涓嬩竴鑺傜偣
+                    var locationModel = locationModels.FirstOrDefault(it => it.Row == neighbor.X && it.Column == neighbor.Y);
+
+                    // 涓嶅瓨鍦ㄦ浣嶇疆淇℃伅
+                    if (locationModel == null)
+                    {
+                        closeSet[neighbor] = neighbor;
+                        continue;
+                    }
+                    // 鍌ㄤ綅鐘舵�佷负鎹熷潖涓嶅彲閫氳 鍌ㄤ綅鐘舵�佷负灞忚斀涓哄彲閫氳涓嶅彲瀛樺偍鎵樼洏
+                    if (locationModel.Flag == "2")
+                    {
+                        closeSet[neighbor] = neighbor;
+                        continue;
+                    }
+                    // 鍒ゆ柇涓嬩竴鑺傜偣涓婃槸鍚︽湁鎵樼洏
+                    if (!string.IsNullOrEmpty(locationModel.PalletNo))
+                    {
+                        // 鍒ゆ柇灏忚溅鏄惁杞芥墭鐩樼洏
+                        if (isLoad == "1")
+                        {
+                            closeSet[neighbor] = neighbor;
+                            // 灏忚溅涓婅浇鎵樼洏涓嶅彲閫氳璺宠繃
+                            continue;
+                        }
+                    }
+                    // 浼樺寲椤癸紝楠岃瘉涓嬩竴鑺傜偣鏄惁琚埆鐨勫皬杞﹀崰鐢� liudl锛氬湪姝ゆ坊鍔犱紭鍖栦唬鐮�
+
+                    // 鏇存柊瀹為檯璺濈
+                    int tentativeGScore = gScore[current] + 1;
+                    // 鍒ゆ柇浣嶇疆鏄惁宸插寘鍚湪璺緞鍐� 涓� 鏄惁鏇磋繎鑺傜偣
+                    if (!gScore.ContainsKey(neighbor) || tentativeGScore < gScore[neighbor])
+                    {
+                        neighbor.IsSendPlc = false;
+                        // 琛ュ厖鍙傛暟
+                        if (neighbor.Equals(end))
+                        {
+                            neighbor.NodeCom = moveType;
+                            neighbor.IsSendPlc = true;
+                        }
+                        else if (currentModel.Make != locationModel.Make)
+                        {
+                            if (current.X == neighbor.X)
+                            {
+                                neighbor.NodeCom = 3;
+                            }
+                            else if (current.Y == neighbor.Y)
+                            {
+                                neighbor.NodeCom = 2;
+                            }
+
+                            neighbor.IsSendPlc = true;
+                        }
+
+                        // 鏇存柊瀹為檯璺濈涓庨浼拌窛绂�
+                        cameFrom[neighbor] = current;
+                        gScore[neighbor] = tentativeGScore;
+                        fScore[neighbor] = tentativeGScore + Heuristic(neighbor, end);
+                        openSet.Add((fScore[neighbor], neighbor));
+                        isNextNode = true;
+                    }
+                }
+
+                if (!isNextNode)
+                {
+                    closeSet[current] = current;
+                }
+            }
+            #endregion
+        }
+        catch (Exception)
+        {
+            throw;
+        }
+
+        return null;
+    }
+
+    /// <summary>
+    /// 鑾峰彇灏忚溅绉诲姩鐨勭洰鏍囦綅缃�
+    /// </summary>
+    /// <param name="startLocation">璧峰浣嶇疆</param>
+    /// <param name="noPathStr">涓嶈兘瀛樻斁鐨勫偍浣嶅瓧绗︿覆</param>
+    /// <returns></returns>
+    public static string GetCarEndLocation(string startLocation,string noPathStr)
+    {
+        if (string.IsNullOrEmpty(startLocation))
+        {
+            return null;
+        }
+
+        // 璧峰浣嶇疆
+        CarModel start = new CarModel()
+        {
+            X = int.Parse(startLocation.Substring(0, 2)),
+            Y = int.Parse(startLocation.Substring(2, 2)),
+            Z = int.Parse(startLocation.Substring(4, 2)),
+            NodeCom = 0
+        };
+
+        // 鑾峰彇鍌ㄤ綅琛ㄤ俊鎭瓨鍌ㄥ埌闆嗗悎閲�
+        var layer = int.Parse(startLocation.Substring(4, 2));
+
+        //  鑾峰彇褰撳墠灞傚偍浣嶄俊鎭�
+        var locationModels = _db.Queryable<WcsStorageLocat>()
+            .Where(m => m.WareHouseNo == "W01" && m.Layer == layer && m.IsDelete == false)
+        .ToList();
+
+        #region MyRegion
+
+        var list = locationModels.Where(m => !noPathStr.Contains(m.LocatNo)).OrderBy(m=> Math.Abs(start.X - m.Row) + Math.Abs(start.Y - m.Column)).ToList();
+        var locateStr = "";
+        foreach (var item in list)
+        {
+            // 鍌ㄤ綅鐘舵�佷负鎹熷潖涓嶅彲閫氳 鍌ㄤ綅鐘舵�佷负灞忚斀涓哄彲閫氳涓嶅彲瀛樺偍鎵樼洏
+            if (item.Flag == "2")
+            {
+                continue;
+            }
+            locateStr = item.LocatNo;
+            break;
+        }
+        return locateStr;
+        #endregion
+
+        #region 浣跨敤绠楁硶璁$畻灏忚溅鍙Щ鍔ㄧ殑鐩爣璺緞
+        //try
+        //{
+
+        //    // 瀹氫箟鍏抽棴鑺傜偣瀛楀吀
+        //    var closeSet = new Dictionary<CarModel, CarModel>();
+
+        //    // 瀛樺偍灏忚溅鍙繍琛岀殑鏂瑰悜
+        //    var validDirections = new List<CarModel>();
+        //    var currentLocation = locationModels.FirstOrDefault(m => m.Row == start.X && m.Column == start.Y);
+        //    if (currentLocation.Make == "0")
+        //    {
+        //        // 涓婚�氶亾
+        //        validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 鍙�
+        //        validDirections.Add(new CarModel() { X = -1, Y = 0 }); // 宸�
+        //        validDirections.Add(new CarModel() { X = 0, Y = 1 }); // 涓�
+        //        validDirections.Add(new CarModel() { X = 0, Y = -1 }); // 涓�
+        //    }
+
+        //    if (currentLocation.Make == "1")
+        //    {
+        //        // 瀛愰�氶亾
+        //        // 鍏堟媶鍒嗗嚭鍙�
+        //        var outNode = currentLocation.AisleOne;
+        //        if (string.IsNullOrEmpty(outNode))
+        //        {
+        //            throw new Exception("褰撳墠浣嶇疆娌℃湁缁存姢鍑哄彛锛�");
+        //        }
+        //        int outX = int.Parse(outNode.Substring(0, 2));
+        //        int outY = int.Parse(outNode.Substring(2, 2));
+        //        if (start.X == outX)
+        //        {
+        //            validDirections.Add(new CarModel() { X = 0, Y = 1 }); // 涓�
+        //            validDirections.Add(new CarModel() { X = 0, Y = -1 }); // 涓�
+
+        //        }
+        //        else
+        //        {
+        //            validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 鍙�
+        //            validDirections.Add(new CarModel() { X = -1, Y = 0 }); // 宸�
+        //        }
+        //    }
+
+        //    foreach (var dir in validDirections)
+        //    {
+        //        CarModel neighbor = new CarModel() { X = start.X + dir.X, Y = start.Y + dir.Y, Z = layer };
+
+        //        // 楠岃瘉涓嬩竴鑺傜偣浣嶇疆鏄惁鍙�氳骞朵笖鍒ゆ柇鏄惁琚叾浠栧皬杞﹀崰鐢�
+
+
+        //        // 鍒ゆ柇涓嬩竴鑺傜偣鏄惁鍏抽棴
+        //        if (closeSet.ContainsKey(neighbor))
+        //        {
+        //            closeSet[neighbor] = neighbor;
+        //        }
+
+        //        // 褰撳墠鑺傜偣
+        //        var currentModel = locationModels.FirstOrDefault(it => it.Row == start.X && it.Column == start.Y);
+        //        // 涓嬩竴鑺傜偣
+        //        var locationModel = locationModels.FirstOrDefault(it => it.Row == neighbor.X && it.Column == neighbor.Y);
+
+        //        // 涓嶅瓨鍦ㄦ浣嶇疆淇℃伅
+        //        if (locationModel == null)
+        //        {
+        //            closeSet[neighbor] = neighbor;
+        //            continue;
+        //        }
+        //        // 鍌ㄤ綅鐘舵�佷负鎹熷潖涓嶅彲閫氳 鍌ㄤ綅鐘舵�佷负灞忚斀涓哄彲閫氳涓嶅彲瀛樺偍鎵樼洏
+        //        if (locationModel.Flag == "2")
+        //        {
+        //            closeSet[neighbor] = neighbor;
+        //            continue;
+        //        }
+
+        //    }
+
+
+
+        //}
+        //catch (Exception)
+        //{
+        //    throw;
+        //}
+
+        //return null;
+        #endregion
+    }
+
+    public static int GetTaskNo()
+    {
+        var list = _db.Queryable<WcsCarTasks>().ToList();
+        var maxNo = list.Max(m => m.CarTaskNo);
+        
+        if (maxNo!=null && maxNo > 0)
+        {
+            if (maxNo++ > 65535)
+            {
+                return 1;
+            }
+             
+            return (int)maxNo++;
+        }
+        return 1;
+          
+    }
+
+    /// <summary>
+    /// 璁$畻鏇煎搱椤胯窛绂�
+    /// </summary>
+    /// <param name="start">璧峰浣嶇疆</param>
+    /// <param name="end">鐩爣浣嶇疆</param>
+    /// <returns>浣嶇疆璺濈</returns>
+    private static int Heuristic(CarModel start, CarModel end)
+    {
+        return Math.Abs(start.X - end.X) + Math.Abs(start.Y - end.Y);
+    }
+
+    /// <summary>
+    /// 閲嶆瀯瀹屾暣璺緞
+    /// </summary>
+    /// <param name="cameFrom"></param>
+    /// <param name="current"></param>
+    /// <returns></returns>
+    private static List<CarModel> ReconstructPath(Dictionary<CarModel, CarModel> cameFrom, CarModel current)
+    {
+        var path = new List<CarModel> { current };
+        while (cameFrom.ContainsKey(current))
+        {
+            current = cameFrom[current];
+            path.Insert(0, current);
+        }
+        return path;
+    }
+}
+
+public class CarModel : IComparable<CarModel>
+{
+    /// <summary>
+    /// 琛�=X
+    /// </summary>
+    public int X { get; set; }
+
+    /// <summary>
+    /// 鍒�=Y
+    /// </summary>
+    public int Y { get; set; }
+
+    /// <summary>
+    /// 灞�=Z
+    /// </summary>
+    public int Z { get; set; }
+
+    /// <summary>
+    /// 鑺傜偣鍛戒护 1:椤惰揣  2:瀛愰�氶亾杩愯  3:涓婚�氶亾杩愯  4:鏀捐揣
+    /// </summary>
+    public int NodeCom { get; set; }
+
+    /// <summary>
+    /// 鏄惁涓嬪彂plc
+    /// </summary>
+    public bool IsSendPlc { get; set; }
+
+    public int CompareTo(CarModel other)
+    {
+        if (other == null)
+            return 1;
+
+        // 杩欓噷鏍规嵁 X銆乊銆乑 鍧愭爣杩涜姣旇緝
+        int result = X.CompareTo(other.X);
+        if (result != 0)
+            return result;
+
+        result = Y.CompareTo(other.Y);
+        if (result != 0)
+            return result;
+
+        return Z.CompareTo(other.Z);
+    }
+
+    // 閲嶅啓 Equals 鏂规硶
+    public override bool Equals(object obj)
+    {
+        if (obj == null || GetType() != obj.GetType())
+            return false;
+
+        CarModel other = (CarModel)obj;
+        return X == other.X && Y == other.Y && Z == other.Z;
+    }
+
+    // 閲嶅啓 GetHashCode 鏂规硶
+    public override int GetHashCode()
+    {
+        return HashCode.Combine(X, Y, Z);
+    }
+}
+
+public class CarInfo
+{
+    /// <summary>
+    /// 灏忚溅IP
+    /// </summary>
+    public string CarPlcIp { get; set; }
+
+    /// <summary>
+    /// 椤哄簭绛夌骇
+    /// </summary>
+    public int Level { get; set; }
+
+    /// <summary>
+    /// 琛�=X
+    /// </summary>
+    public int X { get; set; }
+
+    /// <summary>
+    /// 鍒�=Y
+    /// </summary>
+    public int Y { get; set; }
+
+    /// <summary>
+    /// 灞�=Z
+    /// </summary>
+    public int Z { get; set; }
+}
diff --git a/Admin.NET/WCS.Application/Util/HttpService.cs b/Admin.NET/WCS.Application/Util/HttpService.cs
index a2d08ad..e37a36d 100644
--- a/Admin.NET/WCS.Application/Util/HttpService.cs
+++ b/Admin.NET/WCS.Application/Util/HttpService.cs
@@ -246,6 +246,19 @@
     }
 
     /// <summary>
+    /// 璋冪敤WMS鎺ュ彛 鍙嶉浠诲姟鍙栬揣瀹屾垚鎺ュ彛
+    /// </summary>
+    /// <param name="model">浠诲姟瀹屾垚鐘舵��</param>
+    /// <returns></returns>
+    public async Task<ResponseModel> RequestTaskQh(TaskRequestWMS model)
+    {
+        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
+        var result = await (url + "/api/DownAPi/ReceiveWcsSignal").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseModel>();
+        Log.Information("璋冪敤WMS鎺ュ彛-鍙嶉浠诲姟鍙栬揣瀹屾垚鎺ュ彛" + result.ToJson());
+        return result;
+    }
+
+    /// <summary>
     /// 璋冪敤WMS鎺ュ彛鍙嶉绌哄彇寮傚父鎺ュ彛
     /// </summary>
     /// <param name="model">浠诲姟淇℃伅</param>
diff --git a/Web/src/api/wcs/wcsCarTasks.ts b/Web/src/api/wcs/wcsCarTasks.ts
new file mode 100644
index 0000000..b574c7f
--- /dev/null
+++ b/Web/src/api/wcs/wcsCarTasks.ts
@@ -0,0 +1,50 @@
+锘縤mport request from '/@/utils/request';
+enum Api {
+  AddWcsCarTasks = '/api/wcsCarTasks/add',
+  DeleteWcsCarTasks = '/api/wcsCarTasks/delete',
+  UpdateWcsCarTasks = '/api/wcsCarTasks/update',
+  PageWcsCarTasks = '/api/wcsCarTasks/page',
+  DetailWcsCarTasks = '/api/wcsCarTasks/detail',
+}
+
+// 澧炲姞鍥涘悜杞︿换鍔℃槑缁嗚〃
+export const addWcsCarTasks = (params?: any) =>
+	request({
+		url: Api.AddWcsCarTasks,
+		method: 'post',
+		data: params,
+	});
+
+// 鍒犻櫎鍥涘悜杞︿换鍔℃槑缁嗚〃
+export const deleteWcsCarTasks = (params?: any) => 
+	request({
+			url: Api.DeleteWcsCarTasks,
+			method: 'post',
+			data: params,
+		});
+
+// 缂栬緫鍥涘悜杞︿换鍔℃槑缁嗚〃
+export const updateWcsCarTasks = (params?: any) => 
+	request({
+			url: Api.UpdateWcsCarTasks,
+			method: 'post',
+			data: params,
+		});
+
+// 鍒嗛〉鏌ヨ鍥涘悜杞︿换鍔℃槑缁嗚〃
+export const pageWcsCarTasks = (params?: any) => 
+	request({
+			url: Api.PageWcsCarTasks,
+			method: 'post',
+			data: params,
+		});
+
+// 璇︽儏鍥涘悜杞︿换鍔℃槑缁嗚〃
+export const detailWcsCarTasks = (id: any) => 
+	request({
+			url: Api.DetailWcsCarTasks,
+			method: 'get',
+			data: { id },
+		});
+
+
diff --git a/Web/src/views/wcs/wcsCarTasks/component/editDialog.vue b/Web/src/views/wcs/wcsCarTasks/component/editDialog.vue
new file mode 100644
index 0000000..de4ab50
--- /dev/null
+++ b/Web/src/views/wcs/wcsCarTasks/component/editDialog.vue
@@ -0,0 +1,156 @@
+锘�<template>
+	<div class="wcsCarTasks-container">
+		<el-dialog v-model="isShowDialog" :width="800" draggable="" :close-on-click-modal="false">
+			<template #header>
+				<div style="color: #fff">
+					<!--<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon>-->
+					<span>{{ props.title }}</span>
+				</div>
+			</template>
+			<el-form :model="ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules">
+				<el-row :gutter="35">
+					<el-form-item v-show="false">
+						<el-input v-model="ruleForm.id" />
+					</el-form-item>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="浠诲姟鍙�" prop="taskNo">
+							<el-input v-model="ruleForm.taskNo" placeholder="璇疯緭鍏ヤ换鍔″彿" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="鍓嶇疆灏忚溅浠诲姟ID" prop="preId">
+							<el-input v-model="ruleForm.preId" placeholder="璇疯緭鍏ュ墠缃皬杞︿换鍔D" maxlength="200" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="浜や簰璺緞" prop="executionPath">
+							<el-input v-model="ruleForm.executionPath" placeholder="璇疯緭鍏ヤ氦浜掕矾寰�" maxlength="200" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="鎵�鏈夎矾寰�" prop="path">
+							<el-input v-model="ruleForm.path" placeholder="璇疯緭鍏ユ墍鏈夎矾寰�" maxlength="2147483647" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="灏忚溅缂栧彿" prop="carNo">
+							<el-input v-model="ruleForm.carNo" placeholder="璇疯緭鍏ュ皬杞︾紪鍙�" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="鐘舵��" prop="status">
+							<el-input-number v-model="ruleForm.status" placeholder="璇疯緭鍏ョ姸鎬�" clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel">鍙� 娑�</el-button>
+					<el-button type="primary" @click="submit">纭� 瀹�</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+<style lang="scss" scoped>
+:deep(.el-select),
+:deep(.el-input-number) {
+	width: 100%;
+}
+</style>
+<script lang="ts" setup>
+	import { ref,onMounted } from "vue";
+	import { ElMessage } from "element-plus";
+	import type { FormRules } from "element-plus";
+  	import { formatDate } from '/@/utils/formatTime';
+	import { addWcsCarTasks, updateWcsCarTasks, detailWcsCarTasks } from "/@/api/wcs/wcsCarTasks";
+
+	//鐖剁骇浼犻�掓潵鐨勫弬鏁�
+	var props = defineProps({
+		title: {
+		type: String,
+		default: "",
+	},
+	});
+	//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+	const emit = defineEmits(["reloadTable"]);
+	const ruleFormRef = ref();
+	const isShowDialog = ref(false);
+	const ruleForm = ref<any>({});
+	//鑷娣诲姞鍏朵粬瑙勫垯
+	const rules = ref<FormRules>({
+	});
+
+	// 椤甸潰鍔犺浇鏃�
+	onMounted(() => {
+
+	});
+
+	// 鎵撳紑寮圭獥
+	const openDialog = async (row: any) => {
+		// ruleForm.value = JSON.parse(JSON.stringify(row));
+		// 鏀圭敤detail鑾峰彇鏈�鏂版暟鎹潵缂栬緫
+		let rowData = JSON.parse(JSON.stringify(row));
+		if (rowData.id)
+			ruleForm.value = (await detailWcsCarTasks(rowData.id)).data.result;
+		else
+			ruleForm.value = rowData;
+		isShowDialog.value = true;
+	};
+
+	// 鍏抽棴寮圭獥
+	const closeDialog = () => {
+		emit("reloadTable");
+		isShowDialog.value = false;
+	};
+
+	// 鍙栨秷
+	const cancel = () => {
+		isShowDialog.value = false;
+	};
+
+	// 鎻愪氦
+	const submit = async () => {
+		ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => {
+			if (isValid) {
+				let values = ruleForm.value;
+				if (ruleForm.value.id == undefined || ruleForm.value.id == null || ruleForm.value.id == "" || ruleForm.value.id == 0) {
+					await addWcsCarTasks(values);
+				} else {
+					await updateWcsCarTasks(values);
+				}
+				closeDialog();
+			} else {
+				ElMessage({
+					message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+					type: "error",
+				});
+			}
+		});
+	};
+
+
+
+
+
+
+	//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+	defineExpose({ openDialog });
+</script>
+
+
+
+
diff --git a/Web/src/views/wcs/wcsCarTasks/index.vue b/Web/src/views/wcs/wcsCarTasks/index.vue
new file mode 100644
index 0000000..e56ea04
--- /dev/null
+++ b/Web/src/views/wcs/wcsCarTasks/index.vue
@@ -0,0 +1,212 @@
+锘�<template>
+  <div class="wcsCarTasks-container">
+    <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> 
+      <el-form :model="queryParams" ref="queryForm" labelWidth="90">
+        <el-row>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+            <el-form-item label="鍏抽敭瀛�">
+              <el-input v-model="queryParams.searchKey" clearable="" placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="浠诲姟鍙�">
+              <el-input v-model="queryParams.taskNo" clearable="" placeholder="璇疯緭鍏ヤ换鍔″彿"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="鍓嶇疆灏忚溅浠诲姟ID">
+              <el-input v-model="queryParams.preId" clearable="" placeholder="璇疯緭鍏ュ墠缃皬杞︿换鍔D"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="浜や簰璺緞">
+              <el-input v-model="queryParams.executionPath" clearable="" placeholder="璇疯緭鍏ヤ氦浜掕矾寰�"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="鎵�鏈夎矾寰�">
+              <el-input v-model="queryParams.path" clearable="" placeholder="璇疯緭鍏ユ墍鏈夎矾寰�"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="灏忚溅缂栧彿">
+              <el-input v-model="queryParams.carNo" clearable="" placeholder="璇疯緭鍏ュ皬杞︾紪鍙�"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="鐘舵��">
+              <el-input-number v-model="queryParams.status"  clearable="" placeholder="璇疯緭鍏ョ姸鎬�"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+            <el-form-item >
+              <el-button-group style="display: flex; align-items: center;">
+                <el-button type="primary"  icon="ele-Search" @click="handleQuery" v-auth="'wcsCarTasks:page'"> 鏌ヨ </el-button>
+                      <el-button icon="ele-Refresh" @click="() => queryParams = {}"> 閲嶇疆 </el-button>
+                        <el-button icon="ele-ZoomIn" @click="changeAdvanceQueryUI" v-if="!showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button>
+                        <el-button icon="ele-ZoomOut" @click="changeAdvanceQueryUI" v-if="showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="openAddWcsCarTasks" v-auth="'wcsCarTasks:add'"> 鏂板 </el-button>
+                
+              </el-button-group>
+            </el-form-item>
+            
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card class="full-table" shadow="hover" style="margin-top: 5px">
+      <el-table
+				:data="tableData"
+				style="width: 100%"
+				v-loading="loading"
+				tooltip-effect="light"
+                				row-key="id"
+                @sort-change="sortChange"
+				border="">
+        <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+        <el-table-column prop="taskNo" label="浠诲姟鍙�"  show-overflow-tooltip="" />
+        <el-table-column prop="preId" label="鍓嶇疆灏忚溅浠诲姟ID"  show-overflow-tooltip="" />
+        <el-table-column prop="executionPath" label="浜や簰璺緞"  show-overflow-tooltip="" />
+        <el-table-column prop="path" label="鎵�鏈夎矾寰�"  show-overflow-tooltip="" />
+        <el-table-column prop="carNo" label="灏忚溅缂栧彿"  show-overflow-tooltip="" />
+        <el-table-column prop="status" label="鐘舵��"  show-overflow-tooltip="" />
+        <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip="" v-if="auth('wcsCarTasks:update') || auth('wcsCarTasks:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text="" type="primary" @click="openEditWcsCarTasks(scope.row)" v-auth="'wcsCarTasks:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text="" type="primary" @click="delWcsCarTasks(scope.row)" v-auth="'wcsCarTasks:delete'"> 鍒犻櫎 </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+				v-model:currentPage="tableParams.page"
+				v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total"
+				:page-sizes="[10, 20, 50, 100, 200, 500]"
+				size="small"
+				background=""
+				@size-change="handleSizeChange"
+				@current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper"
+	/>
+      <printDialog
+        ref="printDialogRef"
+        :title="printWcsCarTasksTitle"
+        @reloadTable="handleQuery" />
+      <editDialog
+        ref="editDialogRef"
+        :title="editWcsCarTasksTitle"
+        @reloadTable="handleQuery"
+      />
+    </el-card>
+  </div>
+</template>
+
+<script lang="ts" setup="" name="wcsCarTasks">
+  import { ref } from "vue";
+  import { ElMessageBox, ElMessage } from "element-plus";
+  import { auth } from '/@/utils/authFunction';
+
+  import { formatDate } from '/@/utils/formatTime';
+
+
+  import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
+  import editDialog from '/@/views/wcs/wcsCarTasks/component/editDialog.vue'
+  import { pageWcsCarTasks, deleteWcsCarTasks } from '/@/api/wcs/wcsCarTasks';
+
+  const showAdvanceQueryUI = ref(false);
+  const printDialogRef = ref();
+  const editDialogRef = ref();
+  const loading = ref(false);
+  const tableData = ref<any>([]);
+  const queryParams = ref<any>({});
+  const tableParams = ref({
+    page: 1,
+    pageSize: 10,
+    total: 0,
+  });
+
+  const printWcsCarTasksTitle = ref("");
+  const editWcsCarTasksTitle = ref("");
+
+  // 鏀瑰彉楂樼骇鏌ヨ鐨勬帶浠舵樉绀虹姸鎬�
+  const changeAdvanceQueryUI = () => {
+    showAdvanceQueryUI.value = !showAdvanceQueryUI.value;
+  }
+
+  // 鏌ヨ鎿嶄綔
+  const handleQuery = async () => {
+    loading.value = true;
+    var res = await pageWcsCarTasks(Object.assign(queryParams.value, tableParams.value));
+    tableData.value = res.data.result?.items ?? [];
+    tableParams.value.total = res.data.result?.total;
+    loading.value = false;
+  };
+
+  // 鍒楁帓搴�
+  const sortChange = async (column: any) => {
+	queryParams.value.field = column.prop;
+	queryParams.value.order = column.order;
+	await handleQuery();
+  };
+
+  // 鎵撳紑鏂板椤甸潰
+  const openAddWcsCarTasks = () => {
+    editWcsCarTasksTitle.value = '娣诲姞鍥涘悜杞︿换鍔℃槑缁嗚〃';
+    editDialogRef.value.openDialog({});
+  };
+
+  // 鎵撳紑鎵撳嵃椤甸潰
+  const openPrintWcsCarTasks = async (row: any) => {
+    printWcsCarTasksTitle.value = '鎵撳嵃鍥涘悜杞︿换鍔℃槑缁嗚〃';
+  }
+  
+  // 鎵撳紑缂栬緫椤甸潰
+  const openEditWcsCarTasks = (row: any) => {
+    editWcsCarTasksTitle.value = '缂栬緫鍥涘悜杞︿换鍔℃槑缁嗚〃';
+    editDialogRef.value.openDialog(row);
+  };
+
+  // 鍒犻櫎
+  const delWcsCarTasks = (row: any) => {
+    ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+  .then(async () => {
+    await deleteWcsCarTasks(row);
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  })
+  .catch(() => {});
+  };
+
+  // 鏀瑰彉椤甸潰瀹归噺
+  const handleSizeChange = (val: number) => {
+    tableParams.value.pageSize = val;
+    handleQuery();
+  };
+
+  // 鏀瑰彉椤电爜搴忓彿
+  const handleCurrentChange = (val: number) => {
+    tableParams.value.page = val;
+    handleQuery();
+  };
+
+  handleQuery();
+</script>
+<style scoped>
+:deep(.el-input),
+:deep(.el-select),
+:deep(.el-input-number) {
+	width: 100%;
+}
+</style>
+

--
Gitblit v1.8.0