修改 路径算法, 当出现多个载具同时出库,可能需要进入电梯时,需要均匀分配电梯
This commit is contained in:
@@ -66,6 +66,14 @@ namespace Tnb.WarehouseMgr.Interfaces
|
|||||||
/// /// <param name="input"></param>
|
/// /// <param name="input"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task TaskExecuteAfter(TaskExecuteAfterUpInput input);
|
Task TaskExecuteAfter(TaskExecuteAfterUpInput input);
|
||||||
|
/// <summary>
|
||||||
|
/// 路径算法(同时出库多个载具)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="pStartId"></param>
|
||||||
|
/// <param name="pEndId"></param>
|
||||||
|
/// <param name="ele"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<WmsPointH>> PathAlgorithmsEle(string pStartId, string pEndId, int ele);
|
||||||
Func<string, int, Task> AddUnExecuteTask { get; set; }
|
Func<string, int, Task> AddUnExecuteTask { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1017,7 +1017,79 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
return points;
|
return points;
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 路径算法 当出现多个载具同时出库,可能需要进入电梯时
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="pStartId"></param>
|
||||||
|
/// <param name="pEndId"></param>
|
||||||
|
/// <param name="ele"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[NonAction]
|
||||||
|
public async Task<List<WmsPointH>> PathAlgorithmsEle(string pStartId, string pEndId,int ele)
|
||||||
|
{
|
||||||
|
List<WmsRoad> roads = await _db.Queryable<WmsRoad>().Where(it => it.status == 1).ToListAsync();
|
||||||
|
List<WmsPointH> 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<WmsElevatorD> curEleDs = await _db.Queryable<WmsElevatorD>().Where(it => points.Select(x => x.id).Contains(it.point_id)).ToListAsync();
|
||||||
|
//如果有电梯点,则会进行电梯的均匀分配
|
||||||
|
if (curEleDs?.Count > 0)
|
||||||
|
{
|
||||||
|
//当前电梯
|
||||||
|
WmsElevatorH curEle = await _db.Queryable<WmsElevatorH>().SingleAsync(it => it.id == curEleDs.First().bill_id && it.status == 1);
|
||||||
|
//同电梯组电梯
|
||||||
|
List<WmsElevatorH> sGpEle = await _db.Queryable<WmsElevatorH>().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<WmsElevatorD> sGpDs = await _db.Queryable<WmsElevatorD>().Where(it => it.bill_id == sGpEle.First().id).ToListAsync();
|
||||||
|
if (sGpDs?.Count > 0)
|
||||||
|
{
|
||||||
|
List<WmsPointH> sGpPoints = await _db.Queryable<WmsPointH>().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<WmsPointH> sFPoints = await LocPathCalcAlgorithms(pStartId, sFEndId, roads);
|
||||||
|
List<WmsPointH> elePoints = new();
|
||||||
|
foreach (WmsElevatorD pt in curEleDs)
|
||||||
|
{
|
||||||
|
WmsPointH? elePoint = sGpPoints.Find(x => x.floor == pt.floor);
|
||||||
|
if (elePoint != null)
|
||||||
|
{
|
||||||
|
elePoints.Add(elePoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<WmsPointH> 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
|
#region PrivateMethods
|
||||||
|
|
||||||
private async Task<List<WmsPointH>> LocPathCalcAlgorithms(string pStartId, string pEndId, List<WmsRoad> roads)
|
private async Task<List<WmsPointH>> LocPathCalcAlgorithms(string pStartId, string pEndId, List<WmsRoad> roads)
|
||||||
|
|||||||
@@ -111,6 +111,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
if (carrys?.Count > 0)
|
if (carrys?.Count > 0)
|
||||||
{
|
{
|
||||||
int min = (carrys.Count > setQty.qty) ? setQty.qty : carrys.Count;
|
int min = (carrys.Count > setQty.qty) ? setQty.qty : carrys.Count;
|
||||||
|
//当出现多个载具同时出库,可能需要进入电梯时
|
||||||
|
int ele = 3;
|
||||||
for (int i = 0; i < min; i++)
|
for (int i = 0; i < min; i++)
|
||||||
{
|
{
|
||||||
sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == carrys[i].location_id);
|
sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == carrys[i].location_id);
|
||||||
@@ -118,7 +120,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
bool isOk = false;
|
bool isOk = false;
|
||||||
if (sPoint != null && ePoint != null)
|
if (sPoint != null && ePoint != null)
|
||||||
{
|
{
|
||||||
List<WmsPointH> points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
List<WmsPointH> points = await _wareHouseService.PathAlgorithmsEle(sPoint.id, ePoint.id ,ele);
|
||||||
if (points.Count <= 2)
|
if (points.Count <= 2)
|
||||||
{
|
{
|
||||||
throw new AppFriendlyException("该路径不存在", 500);
|
throw new AppFriendlyException("该路径不存在", 500);
|
||||||
@@ -167,6 +169,12 @@ namespace Tnb.WarehouseMgr
|
|||||||
preTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值
|
preTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值
|
||||||
}
|
}
|
||||||
isOk = await _wareHouseService.GenPreTask(preTasks, null!);
|
isOk = await _wareHouseService.GenPreTask(preTasks, null!);
|
||||||
|
//判断当前任务中 是否有电梯任务。有的话ele+1
|
||||||
|
var eleP = preTasks.Find(x => x.area_code.Contains("ELE"));
|
||||||
|
if (eleP != null)
|
||||||
|
{
|
||||||
|
ele++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (isOk)
|
if (isOk)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -265,8 +265,11 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
List<WmsPretaskH> preTasks = new();
|
List<WmsPretaskH> preTasks = new();
|
||||||
List<string> locIds = new();
|
List<string> locIds = new();
|
||||||
|
//当出现多个载具同时出库,可能需要进入电梯时
|
||||||
|
int ele = 3;
|
||||||
foreach (WmsCarryH carry in carrys)
|
foreach (WmsCarryH carry in carrys)
|
||||||
{
|
{
|
||||||
|
|
||||||
bool isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc);
|
bool isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc);
|
||||||
if (!isMatch)
|
if (!isMatch)
|
||||||
{
|
{
|
||||||
@@ -286,7 +289,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
if (sPoint != null && ePoint != null)
|
if (sPoint != null && ePoint != null)
|
||||||
{
|
{
|
||||||
List<WmsPointH> points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
List<WmsPointH> points = await _wareHouseService.PathAlgorithmsEle(sPoint.id, ePoint.id, ele);
|
||||||
locIds.AddRange(points.Select(x => x.location_id).ToList()!);
|
locIds.AddRange(points.Select(x => x.location_id).ToList()!);
|
||||||
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
||||||
if (points?.Count > 0)
|
if (points?.Count > 0)
|
||||||
@@ -334,6 +337,12 @@ namespace Tnb.WarehouseMgr
|
|||||||
curPreTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值
|
curPreTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值
|
||||||
}
|
}
|
||||||
preTasks.AddRange(curPreTasks);
|
preTasks.AddRange(curPreTasks);
|
||||||
|
//判断当前任务中 是否有电梯任务。有的话ele+1
|
||||||
|
var eleP = curPreTasks.Find(x => x.area_code.Contains("ELE"));
|
||||||
|
if (eleP != null)
|
||||||
|
{
|
||||||
|
ele++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user