| | |
| | | public static int I = 0; |
| | | public List<Location> EmptyFullPercentageBalance(List<Location> lstTrueLocation, LogicTrue logicModel) |
| | | { |
| | | var chi = new SqlHelper<object>().GetInstance(); |
| | | var newDb = chi.CopyNew(); |
| | | Dictionary<int, double> percentage = new Dictionary<int, double>(); |
| | | var location_roadray = lstTrueLocation.OrderBy(o => o.N_ROADWAY).Select(o => o.N_ROADWAY).Distinct().ToList(); |
| | | if (logicModel != null && logicModel?.lstLocationCode?.Count() > 0) |
| | |
| | | var Inloca = Expressionable.Create<Location>(); |
| | | Inloca.And(it => logicModel.lstLocationCode.Contains(it.S_LOC_CODE)); |
| | | Inloca.And(it => it.C_ENABLE == "Y"); |
| | | var locationInLock = SqlSugarHelper.Db.Queryable<Location>().Where(Inloca.ToExpression()).ToList(); |
| | | var locationInLock = newDb.Queryable<Location>().Where(Inloca.ToExpression()).ToList(); |
| | | foreach (var item in location_roadray) |
| | | { |
| | | LogHelper.Info("入库算法", $"开始巷道:{item}"); |
| | |
| | | LogHelper.Info("入库算法", $"巷道:{item} 空满比例{Bfb}%"); |
| | | percentage.Add(item, Bfb); |
| | | } |
| | | var abc = percentage.OrderByDescending(e => e.Value).ToDictionary(x => x.Key, x => x.Value); |
| | | var roa = abc.First().Key; |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == roa).ToList(); |
| | | } |
| | | else |
| | | { |
| | |
| | | Inloca.And(it => it.S_WH_CODE == model.S_WH_CODE); |
| | | Inloca.And(it => it.S_AREA_CODE == model.S_AREA_CODE); |
| | | Inloca.And(it => it.C_ENABLE == "Y"); |
| | | var locationInLock = SqlSugarHelper.Db.Queryable<Location>().Where(Inloca.ToExpression()).ToList(); |
| | | var locationInLock = newDb.Queryable<Location>().Where(Inloca.ToExpression()).ToList(); |
| | | foreach (var item in location_roadray) |
| | | { |
| | | LogHelper.Info("入库算法", $"开始巷道:{item}"); |
| | |
| | | LogHelper.Info("入库算法", $"巷道:{item} 空满比例{Bfb}%"); |
| | | percentage.Add(item, Bfb); |
| | | } |
| | | var abc = percentage.OrderByDescending(e => e.Value).ToDictionary(x => x.Key, x => x.Value); |
| | | var roa = abc.First().Key; |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == roa).ToList(); |
| | | } |
| | | if (lstTrueLocation.FirstOrDefault()?.S_AREA_CODE == "LC11T") |
| | | { |
| | | LogHelper.Info("入库算法", $"库区编码:LC11T 判断是否超过阈值"); |
| | | //判断两个巷道的空满比值 查看字段第一条数据是否是大于0 |
| | | var Bz = percentage.OrderBy(e => e.Value).ToDictionary(x => x.Key, x => x.Value).FirstOrDefault(); |
| | | LogHelper.Info("入库算法", $"空货位少的巷道是{Bz.Key} 有空货位(空满比值) {Bz.Value}"); |
| | | var BzT = percentage.OrderBy(e => e.Value).ToDictionary(x => x.Key, x => x.Value).LastOrDefault(); |
| | | LogHelper.Info("入库算法", $"空货位多的巷道是{BzT.Key} 有空货位(空满比值){BzT.Value}"); |
| | | if (Bz.Value > 0 && BzT.Value > 0) |
| | | { |
| | | if (Bz.Value <= 20) //查询最小的值是否小于等于20 |
| | | { |
| | | LogHelper.Info("入库算法", $"空货位少的巷道是{BzT.Key} 有空货位(空满比值){BzT.Value} 小于等于20% 启动任务比值均衡算法(自动)"); |
| | | double BzNumb = Math.Round((double)Bz.Value / BzT.Value * 100, 0); |
| | | LogHelper.Info("入库算法", $"两个巷道的空货位比值为 {BzNumb}% 换算成百分比 1/2就是50% 1/3就是33%"); |
| | | var model = lstTrueLocation.FirstOrDefault(); |
| | | var Roadray = lstTrueLocation.Select(e => e.N_ROADWAY).Distinct().ToList(); |
| | | var Inloca = Expressionable.Create<Location>(); |
| | | Inloca.And(it => it.S_WH_CODE == model.S_WH_CODE); |
| | | Inloca.And(it => it.S_AREA_CODE == model.S_AREA_CODE); |
| | | Inloca.And(it => Roadray.Contains(it.N_ROADWAY)); |
| | | Inloca.And(it => it.S_LOCK_STATE == "入库锁"); |
| | | var locationInLock = newDb.Queryable<Location>().Where(Inloca.ToExpression()).ToList(); |
| | | if (BzNumb <= 25) |
| | | { |
| | | LogHelper.Info("入库算法", $"比值小于等于25 则按照最大比例1/4下达任务 "); |
| | | // 1/4 |
| | | var OneTask = locationInLock.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | LogHelper.Info("入库算法", $"空货位最多的巷道{BzT.Key} 任务数为:{OneTask.Count()}"); |
| | | var TwoTask = locationInLock.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | LogHelper.Info("入库算法", $"空货位最少的巷道{Bz.Key} 任务数为:{TwoTask.Count()}"); |
| | | if (OneTask.Count() <= 3) |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | if (TwoTask.Count() == 0)// |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | if (OneTask.Count() / 4 == TwoTask.Count())//空货位少的/空货位多的 看是否大于25%大于则下到空货位多的 否则下到空货位少的 |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else if (25 < BzNumb && BzNumb <= 33) |
| | | { |
| | | // 1/3 |
| | | LogHelper.Info("入库算法", $"比值大于25小于等于33 则按照最大比例1/3下达任务 "); |
| | | var OneTask = locationInLock.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | LogHelper.Info("入库算法", $"空货位最多的巷道{BzT.Key} 任务数为:{OneTask.Count()}"); |
| | | var TwoTask = locationInLock.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | LogHelper.Info("入库算法", $"空货位最少的巷道{BzT.Key} 任务数为:{TwoTask.Count()}"); |
| | | if (OneTask.Count() <= 2) |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | if (TwoTask.Count() == 0)// |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | if (OneTask.Count() / 3 == TwoTask.Count()) |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else if (33 < BzNumb && BzNumb <= 50) |
| | | { |
| | | // 1/2 |
| | | LogHelper.Info("入库算法", $"比值大于33小于等于50 则按照最大比例1/2下达任务 "); |
| | | var OneTask = locationInLock.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | LogHelper.Info("入库算法", $"空货位最多的巷道{BzT.Key} 任务数为:{OneTask.Count()}"); |
| | | var TwoTask = locationInLock.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | LogHelper.Info("入库算法", $"空货位最少的巷道{BzT.Key} 任务数为:{TwoTask.Count()}"); |
| | | if (OneTask.Count() <= 1) |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | if (TwoTask.Count() == 0)// |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | if (OneTask.Count() / 2 == TwoTask.Count()) |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == BzT.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | else |
| | | { |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == Bz.Key).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | var abc = percentage.OrderByDescending(e => e.Value).ToDictionary(x => x.Key, x => x.Value); |
| | | var roa = abc.First().Key; |
| | | lstTrueLocation = lstTrueLocation.FindAll(e => e.N_ROADWAY == roa).ToList(); |
| | | return lstTrueLocation; |
| | | } |
| | | } |