diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index e78df528..a79e8faa 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs @@ -66,6 +66,14 @@ namespace Tnb.WarehouseMgr.Interfaces /// /// /// Task TaskExecuteAfter(TaskExecuteAfterUpInput input); + /// + /// 路径算法(同时出库多个载具) + /// + /// + /// + /// + /// + Task> PathAlgorithmsEle(string pStartId, string pEndId, int ele); Func AddUnExecuteTask { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index bfc3d27c..247c8b0e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -1017,7 +1017,79 @@ namespace Tnb.WarehouseMgr return points; } + /// + /// 路径算法 当出现多个载具同时出库,可能需要进入电梯时 + /// + /// + /// + /// + /// + [NonAction] + public async Task> PathAlgorithmsEle(string pStartId, string pEndId,int ele) + { + List roads = await _db.Queryable().Where(it => it.status == 1).ToListAsync(); + List points = await LocPathCalcAlgorithms(pStartId, pEndId, roads); + try + { + if (points.FindAll(x => x.location_code != null && x.location_code.Contains("dt", StringComparison.OrdinalIgnoreCase))?.Count > 0) + { + //查询当前电梯点 + List curEleDs = await _db.Queryable().Where(it => points.Select(x => x.id).Contains(it.point_id)).ToListAsync(); + //如果有电梯点,则会进行电梯的均匀分配 + if (curEleDs?.Count > 0) + { + //当前电梯 + WmsElevatorH curEle = await _db.Queryable().SingleAsync(it => it.id == curEleDs.First().bill_id && it.status == 1); + //同电梯组电梯 + List sGpEle = await _db.Queryable().Where(it => it.elevator_group == curEle.elevator_group && it.id != curEle.id && it.status == 1).ToListAsync(); + if (curEle == null && sGpEle?.Count > 0) + { + throw new AppFriendlyException("电梯被禁用或未配置", 500); + } + if(Math.Abs(ele) % 2 == 1) + { + //判断电梯组中各电梯任务数 + if (curEle == null || sGpEle.FindAll(x => Math.Abs(x.task_nums - curEle.task_nums) % 2 == 1)?.Count > 0) + { + List sGpDs = await _db.Queryable().Where(it => it.bill_id == sGpEle.First().id).ToListAsync(); + if (sGpDs?.Count > 0) + { + List sGpPoints = await _db.Queryable().Where(it => sGpDs.Select(x => x.point_id).Contains(it.id)).ToListAsync(); + string sFEndId = sGpDs.Single(x => x.floor == curEleDs.First().floor).point_id; + string eFStartId = sGpDs.Single(x => x.floor == curEleDs.Last().floor).point_id; + List sFPoints = await LocPathCalcAlgorithms(pStartId, sFEndId, roads); + List elePoints = new(); + foreach (WmsElevatorD pt in curEleDs) + { + WmsPointH? elePoint = sGpPoints.Find(x => x.floor == pt.floor); + if (elePoint != null) + { + elePoints.Add(elePoint); + } + } + List eFPoints = await LocPathCalcAlgorithms(eFStartId, pEndId, roads); + _ = elePoints.Remove(elePoints.First()); + _ = elePoints.Remove(elePoints.Last()); + points.Clear(); + points.AddRange(sFPoints); + points.AddRange(elePoints); + points.AddRange(eFPoints); + } + } + } + + } + } + } + catch (Exception ex) + { + Logger.Error("路径算法异常", ex); + throw; + } + + return points; + } #region PrivateMethods private async Task> LocPathCalcAlgorithms(string pStartId, string pEndId, List roads) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs index ba4fcd7d..60724da2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs @@ -111,6 +111,8 @@ namespace Tnb.WarehouseMgr if (carrys?.Count > 0) { int min = (carrys.Count > setQty.qty) ? setQty.qty : carrys.Count; + //当出现多个载具同时出库,可能需要进入电梯时 + int ele = 3; for (int i = 0; i < min; i++) { sPoint = await _db.Queryable().FirstAsync(it => it.location_id == carrys[i].location_id); @@ -118,7 +120,7 @@ namespace Tnb.WarehouseMgr bool isOk = false; if (sPoint != null && ePoint != null) { - List points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id); + List points = await _wareHouseService.PathAlgorithmsEle(sPoint.id, ePoint.id ,ele); if (points.Count <= 2) { throw new AppFriendlyException("该路径不存在", 500); @@ -167,6 +169,12 @@ namespace Tnb.WarehouseMgr preTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值 } isOk = await _wareHouseService.GenPreTask(preTasks, null!); + //判断当前任务中 是否有电梯任务。有的话ele+1 + var eleP = preTasks.Find(x => x.area_code.Contains("ELE")); + if (eleP != null) + { + ele++; + } } if (isOk) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs index e88b7040..383b73ca 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs @@ -265,8 +265,11 @@ namespace Tnb.WarehouseMgr List preTasks = new(); List locIds = new(); + //当出现多个载具同时出库,可能需要进入电梯时 + int ele = 3; foreach (WmsCarryH carry in carrys) { + bool isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc); if (!isMatch) { @@ -286,7 +289,7 @@ namespace Tnb.WarehouseMgr if (sPoint != null && ePoint != null) { - List points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id); + List points = await _wareHouseService.PathAlgorithmsEle(sPoint.id, ePoint.id, ele); locIds.AddRange(points.Select(x => x.location_id).ToList()!); //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) if (points?.Count > 0) @@ -334,6 +337,12 @@ namespace Tnb.WarehouseMgr curPreTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值 } preTasks.AddRange(curPreTasks); + //判断当前任务中 是否有电梯任务。有的话ele+1 + var eleP = curPreTasks.Find(x => x.area_code.Contains("ELE")); + if (eleP != null) + { + ele++; + } } }