1
pulg
2025-06-26 06a54c7ac91fed8ece7dd6bedf724539af3c38ff
HH.WCS.ZCQTJ/Bll/In_AlgorBLL.cs
@@ -838,6 +838,8 @@
        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)
@@ -845,7 +847,7 @@
                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}");
@@ -858,9 +860,6 @@
                    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
            {
@@ -870,7 +869,7 @@
                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}");
@@ -883,10 +882,141 @@
                    LogHelper.Info("入库算法", $"巷道:{item} 空满比例{Bfb}%");
                    percentage.Add(item, Bfb);
                }
            }
            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;
        }
    }