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