From 2ecd9c5db603efcde9e6e51a500b3c2b1162fb85 Mon Sep 17 00:00:00 2001
From: bklLiudl <673013083@qq.com>
Date: 星期一, 28 四月 2025 17:15:44 +0800
Subject: [PATCH] 冲突合并

---
 Admin.NET/WCS.Application/Util/FourWayCarUtil.cs |  422 +++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 364 insertions(+), 58 deletions(-)

diff --git a/Admin.NET/WCS.Application/Util/FourWayCarUtil.cs b/Admin.NET/WCS.Application/Util/FourWayCarUtil.cs
index 25c77d6..a86c60e 100644
--- a/Admin.NET/WCS.Application/Util/FourWayCarUtil.cs
+++ b/Admin.NET/WCS.Application/Util/FourWayCarUtil.cs
@@ -8,6 +8,7 @@
 using System.Threading.Tasks;
 using WCS.Application.Entity;
 using static Elastic.Clients.Elasticsearch.JoinField;
+using static SKIT.FlurlHttpClient.Wechat.Api.Models.CustomServiceKfSessionGetWaitCaseResponse.Types;
 
 namespace WCS.Application.Util;
 
@@ -15,17 +16,19 @@
 {
     private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
 
+    private static readonly WcsTaskService _taskService = App.GetService<WcsTaskService>();
+
     /// <summary>
-    /// 
+    /// 瀹屽杽灏忚溅涓嬪彂鑺傜偣銆佽妭鐐瑰懡浠�
     /// </summary>
     /// <param name="list">闆嗗悎</param>
     /// <param name="moveType">绉诲姩绫诲瀷 0:绉诲姩 1:绉昏揣 </param>
     /// <returns></returns>
-    public static List<CarModel> GetCarPathUp(List<CarModel> list,int moveType)
+    public static List<CarModel> GetCarPathUp(List<CarModel> list, int moveType)
     {
         for (int i = 0; i < list.Count; i++)
         {
-            if (i > 0 && i < list.Count - 1)
+            if (i >= 0 && i < list.Count - 1)
             {
                 if (list[i].X == list[i + 1].X)
                 {
@@ -35,8 +38,23 @@
                 {
                     list[i].NodeCom = 3;
                 }
+
             }
-            if (i== 0)
+            if (i > 0 && i < list.Count - 1)
+            {
+                if (list[i].Make != list[i - 1].Make || list[i].Make != list[i + 1].Make)
+                {
+                    if (list[i].X != list[i - 1].X || list[i].X != list[i + 1].X)
+                    {
+                        list[i].IsSendPlc = true;
+                    }
+
+                    //list[i - 1].IsSendPlc = true;
+
+                }
+
+            }
+            if (i == 0)
             {
                 list[i].IsSendPlc = true;
                 if (moveType == 0)
@@ -45,19 +63,26 @@
                     {
                         continue;
                     }
-                    
+
                 }
-                else 
+                else
                 {
                     list[i].NodeCom = 1;
                 }
             }
-            if (i == list.Count-1)
+            if (i == list.Count - 1)
             {
                 list[i].IsSendPlc = true;
                 if (moveType == 0)
                 {
-                    list[i].NodeCom = list[i + 1].NodeCom;
+                    if (list[i].X == list[i - 1].X)
+                    {
+                        list[i].NodeCom = 2;
+                    }
+                    else if (list[i].Y == list[i - 1].Y)
+                    {
+                        list[i].NodeCom = 3;
+                    }
                 }
                 else
                 {
@@ -67,6 +92,328 @@
         }
         return list;
     }
+
+    /// <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
+    }
+
+    /// <summary>
+    /// 鑾峰彇浠诲姟鍙�
+    /// </summary>
+    /// <returns></returns>
+    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;
+
+    }
+
+    public static bool AddCarTask(List<CarModel> data, List<CarInfo> kXCarList, CarInfo assignCar, WcsTask waitTask,int moveType)
+    {
+        #region 鑾峰彇閫傚悎鎵ц褰撳墠浠诲姟鐨勫皬杞� 鐢熸垚璺緞锛堥渶鑰冭檻灏忚溅闃婚樆鎸★級
+        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();
+            var pathXYZ2 = data[i].X.ToString().PadLeft(2, '0') + data[i].Y.ToString().PadLeft(2, '0') + data[i].Z.ToString().PadLeft(2, '0');
+            path += pathXYZ + ";";
+
+            //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟
+            var taskList = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.Path.Contains(pathXYZ2) && m.CarNo != assignCar.CarPlcIp).Select(m => m.Id).Distinct().ToList();
+
+            foreach (var item in taskList)
+            {
+                //鍒ゆ柇濡傛灉鏄畬鏁磋矾寰� 璁板綍浜や簰璺緞
+                if (isOk == "1")
+                {
+                    if (i == 0)
+                    {
+                        continue;
+                    }
+                    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 - 1].NodeCom.ToString();
+                    var pathXYZQian2 = data[i - 1].X.ToString().PadLeft(2, '0') + data[i - 1].Y.ToString().PadLeft(2, '0') + data[i - 1].Z.ToString().PadLeft(2, '0');
+                    if (!executionPath1.Contains(pathXYZQian2))
+                    {
+                        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 datas3 = new List<CarModel>();
+                //鏌ユ壘鐩爣浣嶇疆
+                while (endLocate3 == "" || datas3.Count == 0 || datas3 == null)
+                {
+                    endLocate3 = FourWayCarUtil.GetCarEndLocation(carXYZ, str3);
+                    var data3 = FourWayCarUtil.GetCarPath(carXYZ, endLocate3, "0");
+                    datas3 = FourWayCarUtil.GetCarPathUp(data3, 0);
+                }
+                foreach (var itemPath in datas3)
+                {
+                    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 = 999,
+                    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).ExecuteReturnSnowflakeId();
+                preId3 += idLong + ";";
+            }
+        }
+
+        #endregion
+
+        #region 鍒ゆ柇鐜版湁浠诲姟涓渶缁堣妭鐐规槸鍚﹀湪褰撳墠鍒嗛厤璺緞涓紝濡傛湁 娣诲姞绉昏蛋灏忚溅浠诲姟骞跺姞鍏ュ墠缃换鍔� 4
+
+        //鑾峰彇绛夊緟鎴栨鍦ㄦ墽琛岀殑浠诲姟涓寘鍚綋鍓嶈妭鐐圭殑灏忚溅浠诲姟锛屼笉浼氭湁澶浠诲姟锛屽悓灞傛湁鍑犱釜灏忚溅鏈�澶氭湁鍑犱釜浠诲姟
+        var taskList4 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.CarNo!=assignCar.CarPlcIp).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];
+            var lastPath2 = lastPath.Substring(0,6);
+
+            //濡傛灉姝ゆ鍒嗛厤璺緞鍖呭惈閱夎垶涓渶缁堣妭鐐硅矾寰勶紝娣诲姞绉昏蛋灏忚溅
+            if (path.Contains(lastPath2))
+            {
+                var endLocate = "";
+                var executionPath4 = "";
+                var path4 = "";
+                var datas4 = new List<CarModel>();
+                //鏌ユ壘鐩爣浣嶇疆
+                while (endLocate == "" || datas4.Count == 0 || datas4 == null)
+                {
+                    endLocate = FourWayCarUtil.GetCarEndLocation(lastPath, str4);
+                    var data4 = FourWayCarUtil.GetCarPath(lastPath, endLocate);
+                    datas4 = FourWayCarUtil.GetCarPathUp(data4, 0);
+                }
+                foreach (var itemPath in datas4)
+                {
+                    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 = 999,
+                    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).ExecuteReturnSnowflakeId();
+                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();
+        }
+        if (moveType == 1)
+        {
+            // 鏀瑰彉鎬讳换鍔¤〃鐘舵��
+            waitTask.Status = TaskStatusEnum.Doing;
+            waitTask.UpdateTime = DateTime.Now;
+            _db.Updateable(waitTask).ExecuteCommand();
+            HubUtil.PublicTask(waitTask.Adapt<WcsTaskOutput>());
+        }
+        
+        return true;
+        #endregion
+    }
+
+
 
     /// <summary>
     /// 鑾峰彇灏忚溅璺緞
@@ -142,7 +489,7 @@
                 // 瀛樺偍灏忚溅鍙繍琛岀殑鏂瑰悜
                 var validDirections = new List<CarModel>();
                 var currentLocation = locationModels.FirstOrDefault(m => m.Row == current.X && m.Column == current.Y);
-                if (currentLocation.Make == "0")
+                if (currentLocation.Make == "0"|| currentLocation.Make == "2")
                 {
                     // 涓婚�氶亾
                     validDirections.Add(new CarModel() { X = 1, Y = 0 }); // 鍙�
@@ -227,55 +574,9 @@
                     {
                         neighbor.IsSendPlc = false;
 
-                        //if (current.X == neighbor.X)
-                        //{
-                        //    current.NodeCom = 2;
-                        //}
-                        //else if (current.Y == neighbor.Y)
-                        //{
-                        //    current.NodeCom = 3;
-                        //}
-
-                        //// 琛ュ厖鍙傛暟
-                        //if (current.Equals(start))
-                        //{
-                        //    current.NodeCom = moveType;
-                        //    current.IsSendPlc = true;
-                        //}
-                        //if (neighbor.Equals(end))
-                        //{
-                        //    //neighbor.NodeCom = moveType != 0 ? 2:0 ;
-                        //    if (moveType == 1)
-                        //    {
-                        //        neighbor.NodeCom = 4;
-                        //    }
-                        //    else 
-                        //    {
-                        //        neighbor.NodeCom = current.NodeCom;
-                        //    }
-
-                        //    neighbor.IsSendPlc = true;
-                        //}
-                        if (currentModel.Make != locationModel.Make)
-                        {
-                            //if (current.X != neighbor.X) 
-                            //{
-                            //    current.IsSendPlc = true;
-                            //}
-
-                            if (current.Y > neighbor.Y)
-                            {
-                                current.IsSendPlc = true;
-                            }
-                            else if (current.Y < neighbor.Y)
-                            {
-                                neighbor.IsSendPlc = true;
-                            }
-                            
-                            //current.IsSendPlc = true;
-                        }
-                                                
-
+                        neighbor.Make = locationModel.Make;
+                        current.Make = currentModel.Make;
+                        
                         // 鏇存柊瀹為檯璺濈涓庨浼拌窛绂�
                         cameFrom[neighbor] = current;
                         gScore[neighbor] = tentativeGScore;
@@ -531,6 +832,11 @@
     /// </summary>
     public bool IsSendPlc { get; set; }
 
+    /// <summary>
+    /// 0閫氶亾 1 鍌ㄤ綅
+    /// </summary>
+    public string Make { get; set; }
+
     public int CompareTo(CarModel other)
     {
         if (other == null)

--
Gitblit v1.8.0