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++;
+ }
}
}