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/PLC/PLCService.cs | 40 +- Admin.NET/WCS.Application/Util/FourWayCarUtil.cs | 422 ++++++++++++++++++++++++++---- Admin.NET/WCS.Application/OpenApi/OpenApi.cs | 48 +- Admin.NET/WCS.Application/PLC/PLCTaskAction.cs | 272 ++----------------- Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs | 2 5 files changed, 441 insertions(+), 343 deletions(-) diff --git a/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs b/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs index 4f7ae77..ecc7f62 100644 --- a/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs +++ b/Admin.NET/WCS.Application/Entity/WcsStorageLocat.cs @@ -126,7 +126,7 @@ public string? AisleTwo { get; set; } /// <summary> - /// 鍌ㄤ綅绫诲瀷 1鍌ㄤ綅 0閫氶亾 + /// 鍌ㄤ綅绫诲瀷 1瀛愰�氶亾 0涓婚�氶亾 2 杈撻�佺嚎鍙� /// </summary> [SugarColumn(ColumnName = "Make", ColumnDescription = "鍌ㄤ綅绫诲瀷", Length = 32)] public string? Make { get; set; } diff --git a/Admin.NET/WCS.Application/OpenApi/OpenApi.cs b/Admin.NET/WCS.Application/OpenApi/OpenApi.cs index 91917e5..c394ccf 100644 --- a/Admin.NET/WCS.Application/OpenApi/OpenApi.cs +++ b/Admin.NET/WCS.Application/OpenApi/OpenApi.cs @@ -42,38 +42,38 @@ { throw Oops.Bah("浠诲姟:" + models.TaskNo + ";涓嶅瓨鍦�!"); } - var data1 = FourWayCarUtil.GetCarPath(taskInfo.StartLocate, taskInfo.EndLocate); + var data1 = FourWayCarUtil.GetCarPath("090501", "080501","0"); if (data1 == null) //|| data1.Count == 0 { throw Oops.Bah("鍒嗛厤璺緞涓嶅瓨鍦�!"); } // 鏍规嵁浠诲姟鐘舵�� 琛ュ厖璧峰缁撴潫鑺傜偣鐘舵�� - var data2 = FourWayCarUtil.GetCarPathUp(data1, 1); + var data2 = FourWayCarUtil.GetCarPathUp(data1, 0); var path = ""; var executionPath1 = ""; - foreach (var item in data1) - { - //璺緞鑺傜偣 - var pathXYZ = item.X.ToString().PadLeft(2, '0') + item.Y.ToString().PadLeft(2, '0') + item.Z.ToString().PadLeft(2, '0') + item.NodeCom.ToString(); - path += pathXYZ + ";"; - if (item.IsSendPlc) - { - executionPath1 += pathXYZ + ";"; - } - } - // 鎻掑叆鍥涘悜杞︿换鍔¤〃 - var carTask1 = new WcsCarTasks() - { - TaskNo = taskInfo.TaskNo, - PreId = "", - ExecutionPath = executionPath1, - Path = path, - CarNo = "", - Status = TaskStatusEnum.Wait - }; - var i = _db.Insertable(carTask1).ExecuteCommand(); - Console.WriteLine(""+i); + //foreach (var item in data1) + //{ + // //璺緞鑺傜偣 + // var pathXYZ = item.X.ToString().PadLeft(2, '0') + item.Y.ToString().PadLeft(2, '0') + item.Z.ToString().PadLeft(2, '0') + item.NodeCom.ToString(); + // path += pathXYZ + ";"; + // if (item.IsSendPlc) + // { + // executionPath1 += pathXYZ + ";"; + // } + //} + //// 鎻掑叆鍥涘悜杞︿换鍔¤〃 + //var carTask1 = new WcsCarTasks() + //{ + // TaskNo = taskInfo.TaskNo, + // PreId = "", + // ExecutionPath = executionPath1, + // Path = path, + // CarNo = "", + // Status = TaskStatusEnum.Wait + //}; + //var i = _db.Insertable(carTask1).ExecuteCommand(); + //Console.WriteLine(""+i); } /// WCS鎺ュ彈WMS涓嬪彂鐨勪换鍔�(澶� diff --git a/Admin.NET/WCS.Application/PLC/PLCService.cs b/Admin.NET/WCS.Application/PLC/PLCService.cs index 670f1e5..72c8d93 100644 --- a/Admin.NET/WCS.Application/PLC/PLCService.cs +++ b/Admin.NET/WCS.Application/PLC/PLCService.cs @@ -159,8 +159,8 @@ var (resultTaskStatus, valueTaskStatus) = plcConn.GetDBValue(modPosTaskStatus.PosType, modPosTaskStatus.PlcPos); //鍒ゆ柇璇诲彇浠诲姟鐘舵�佹槸鍚︽垚鍔� 骞朵笖浠诲姟鐘舵�佹槸1 0:鏃犱换鍔�,1:浠诲姟瀹屾垚,2:浠诲姟鍙栨秷,3:浠诲姟鏆傚仠锛�4锛氫换鍔″紓甯� 5锛氫换鍔℃墽琛屼腑 - WcsCarTasks carTask2 = null;//null 鏂颁换鍔� not null 璺緞2浠诲姟 - + WcsCarTasks carTaskNext = null;//null 鏂颁换鍔� not null 褰撳墠灏忚溅&&褰撳墠浠诲姟 涓嬩竴鑺備换鍔� + if (resultTaskStatus.IsSucceed && valueTaskStatus == 1) { var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "浠诲姟鍙�"); @@ -182,7 +182,7 @@ break;//娌℃湁鏌ヨ鍒版�讳换鍔� } //鑾峰彇璺緞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(); + carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == carTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status <= TaskStatusEnum.Doing).OrderBy(m=>m.CreateTime).First(); if (carTask != null && carTask.Status != TaskStatusEnum.Complete) { @@ -201,8 +201,8 @@ HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>()); } - //娌℃湁璺緞2鐨勪换鍔� 鍙樻洿鎬讳换鍔′俊鎭� - if (carTask2 == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete) + //鎬讳换鍔′笅娌℃湁鍏朵粬鏈墽琛屽皬杞︾殑浠诲姟 鍙樻洿鎬讳换鍔′俊鎭� + if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete) { modFinshTask.Status = TaskStatusEnum.Complete; modFinshTask.FinishDate = DateTime.Now; @@ -233,40 +233,40 @@ var modStationZ = modDevice.listStation.FirstOrDefault(s => s.Text == "鍥涘悜杞︿綅缃�(Z)"); var (resultz, valuez) = plcConn.GetDBValue(modStationZ.PosType, modStationZ.PlcPos); - + WcsTask modTask; //瑕佷笅鍙戣矾寰�2浠诲姟 - if (carTask2 != null) + if (carTaskNext != null) { - modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTask2.TaskNo && s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar); + modTask = _db.Queryable<WcsTask>().First(s => s.IsDelete == false && s.TaskNo == carTaskNext.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(); + carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First(); } else { // 鑾峰彇浠诲姟淇℃伅 - 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(); + modTask = _db.Queryable<WcsTask>().Where(s => s.Status <= TaskStatusEnum.Doing && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(m => m.Levels).OrderBy(m => m.CreateTime).First(); if (modTask == null) { return; } - carTask2 = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP).OrderBy(m => m.CreateTime).First(); + carTaskNext = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == modTask.TaskNo && m.CarNo == modDevice.PlcIdIP && m.Status == TaskStatusEnum.Wait).OrderBy(m => m.CreateTime).First(); } //return; - if (modTask == null || carTask2 == null) + if (modTask == null || carTaskNext == null) { //鍒ゆ柇灏忚溅鏄惁鏈夌┖闂叉椂闂磋褰� 娌℃湁锛氭坊鍔� 鏈夛細鍒ゆ柇褰撳墠鏃堕棿涓庤褰曟椂闂存槸鍚︽弧瓒�5鍒嗛挓 婊¤冻锛氭坊鍔犺灏忚溅鍘诲厖鐢典换鍔� return; } - if (carTask2.Status == TaskStatusEnum.Doing) + if (carTaskNext.Status == TaskStatusEnum.Doing) { Thread.Sleep(3000); return; } //鍒ゆ柇褰撳墠浠诲姟鏄惁杩樻湁鍓嶇疆浠诲姟鏈畬鎴� - var preStrs = carTask2.PreId.Split(';'); + var preStrs = carTaskNext.PreId.Split(';'); foreach (var preStr in preStrs) { if (string.IsNullOrWhiteSpace(preStr)) @@ -301,7 +301,7 @@ int posStatus = Convert.ToInt32(modNodeStatus.PlcPos); //浜や簰璺緞 - var execuPath = carTask2.ExecutionPath.Split(';'); + var execuPath = carTaskNext.ExecutionPath.Split(';'); if (Convert.ToInt32(valuex) != Convert.ToInt32(execuPath[0].Substring(0, 2)) || Convert.ToInt32(valuey) != Convert.ToInt32(execuPath[0].Substring(2, 2)) || Convert.ToInt32(valuez) != Convert.ToInt32(execuPath[0].Substring(4, 2))) { return; //灏忚溅浣嶇疆涓庤矾寰勮捣濮嬩綅缃笉鍚� @@ -343,15 +343,15 @@ var result = plcConn.SetDBValue(modStart.PosType, modStart.PlcPos, "1"); if (result.IsSucceed) { - carTask2.Status = TaskStatusEnum.Doing; - carTask2.CarTaskNo = carTaskNo; - _db.Updateable(carTask2).ExecuteCommand(); + carTaskNext.Status = TaskStatusEnum.Doing; + carTaskNext.CarTaskNo = carTaskNo; + _db.Updateable(carTaskNext).ExecuteCommand(); //娓呴櫎灏忚溅绌洪棽鏃堕棿 var taskMonitor = new WcsTaskMonitor() { - TaskNo = carTask2.TaskNo, + TaskNo = carTaskNext.TaskNo, PlcName = modDevice.Text, - InteractiveMsg = $"鍚戠┛姊溅涓嬪彂浠诲姟{carTask2.TaskNo}" + InteractiveMsg = $"鍚戠┛姊溅涓嬪彂浠诲姟{carTaskNext.TaskNo}" }; _db.Insertable(taskMonitor).ExecuteCommand(); //涓嬪彂浠诲姟鏃ュ織 diff --git a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs index 17bcb90..f22caec 100644 --- a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs +++ b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs @@ -90,7 +90,7 @@ /// <summary> /// 鍒濆鍖朠LC杩炴帴 /// </summary> - public static void Init() + public static void Init() { cts.Cancel(); listPlc = _db.Queryable<WcsPlc>() @@ -338,7 +338,7 @@ - Thread.Sleep(1000); + Thread.Sleep(3000); } catch (OperationCanceledException) { @@ -460,266 +460,58 @@ #endregion - #region 鑾峰彇閫傚悎鎵ц褰撳墠浠诲姟鐨勫皬杞� 鐢熸垚璺緞锛堥渶鑰冭檻灏忚溅闃婚樆鎸★級 + // 鑾峰彇閫傚悎鎵ц褰撳墠浠诲姟鐨勫皬杞� 鐢熸垚璺緞锛堥渶鑰冭檻灏忚溅闃婚樆鎸★級 var assignCar = kXCarList.OrderBy(m => m.Level).FirstOrDefault(); if (assignCar == null) { continue;//娌℃湁绌洪棽灏忚溅 } - 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); - var datas = FourWayCarUtil.GetCarPathUp(data1, 0); - data.AddRange(datas); + var datas1 = FourWayCarUtil.GetCarPathUp(data1, 0); + if (datas1 == null) + { + continue; + } + else + { + var bl = FourWayCarUtil.AddCarTask(datas1, kXCarList, assignCar, waitTask,0); + //鍒嗛厤閿欒锛屽垹闄ゅ垎閰嶄俊鎭� + if (!bl) + { + var carTask = _db.Queryable<WcsCarTasks>().Where(m => m.IsDelete == false && m.TaskNo == waitTask.TaskNo).ToList(); + _db.Deleteable(carTask).ExecuteCommand(); + } + } } //鑾峰彇灏忚溅鍘绘斁璐у偍浣嶄换鍔¤矾寰� var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, "1"); var datas2 = FourWayCarUtil.GetCarPathUp(data2, 1); - data.AddRange(datas2); - if (data == null) { continue; } - - 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 + ";"; - } - - } - + + if (datas2 == null) + { + continue; } - - #endregion - - #region 鍒ゆ柇鏄惁鏈夌┖闂插皬杞﹂樆鎸¤矾寰� 3 - var preId3 = "";//鍓嶇疆浠诲姟Id - foreach (var item in kXCarList) + else { - if (item == assignCar) + var bl = FourWayCarUtil.AddCarTask(datas2,kXCarList,assignCar,waitTask,1); + //鍒嗛厤閿欒锛屽垹闄ゅ垎閰嶄俊鎭� + if (!bl) { - 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 = 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 + ";"; + waitTask.Status = TaskStatusEnum.Wait; + _db.Updateable(waitTask).ExecuteCommand(); + var carTask = _db.Queryable<WcsCarTasks>().Where(m=>m.IsDelete == false && m.TaskNo == waitTask.TaskNo).ToList(); + _db.Deleteable(carTask).ExecuteCommand(); } } - #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 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 = 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); } 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