浏览代码

重构AGV站台获取逻辑,新增多个私有方法

增加了一个私有方法 `GetAgvStation`,用于获取AGV的目标站台。该方法根据任务信息和数据库操作对象,确定AGV的目标站台,并考虑了仓库与站台的映射关系、任务数量限制等因素。
增加了一个私有方法 `GetStationTaskCount`,用于获取指定站台的任务数量。
增加了一个私有方法 `GetNorthAndSouthTaskCounts`,用于获取北侧和南侧的任务数量。
修改了原有的 `GetAgvStation` 方法,将其重命名为 `GetAgvStation1`,并对其实现进行了重构,优化了任务分配逻辑。
增加了一个公共方法 `GetAgvStation`,用于获取AGV返空可用的目标站台。该方法根据仓库和方向,返回对应的目标站台列表。
林豪 左 10 月之前
父节点
当前提交
f29a07914c
共有 1 个文件被更改,包括 211 次插入31 次删除
  1. 211 31
      YWGC/FJK/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

+ 211 - 31
YWGC/FJK/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -527,13 +527,120 @@ namespace WCS.WorkEngineering.Systems
             return dev.Code == nameof(NoInteractionSystems);
         }
 
+
+        /// <summary>
+        ///     获取AGV的目标站台
+        /// </summary>
+        /// <param name="task">任务信息</param>
+        /// <param name="db">数据库操作对象</param>
+        /// <returns>目标站台</returns>
+        private string GetAgvStation(WCS_TaskInfo task, SqlSugarHelper db)
+        {
+            // 默认站台
+            var defaultStation = "2501";
+            var sta = defaultStation;
+
+            // 定义仓库与站台的映射关系
+            var stationMap = new Dictionary<string, (string N, string S)>
+            {
+                ["1"] = ("2501", "2701"),
+                ["2"] = ("2901", "3101"),
+                ["3"] = ("3301", "3501")
+            };
+
+            // 检查是否需要更新 warehouseCode
+            if (task.BusType == TaskBusType.皮盘入库.GetDescription() || task.BusType == TaskBusType.车间叫料.GetDescription())
+                task.WarehouseCode = task.MaterialCode switch
+                {
+                    "分拣库1北" => "1N",
+                    "分拣库1南" => "1S",
+                    "分拣库2北" => "2N",
+                    "分拣库2南" => "2S",
+                    "分拣库3北" => "3N",
+                    "分拣库3南" => "3S",
+                    _ => task.WarehouseCode
+                };
+
+            // 确定站台初始值
+            if (stationMap.TryGetValue(task.WarehouseCode[0].ToString(), out var stationPair))
+                sta = task.WarehouseCode.Contains("N") ? stationPair.N : stationPair.S;
+
+            // 配置值获取
+            var num = db.Default.Queryable<fjSysConfig>()
+                .NoLock()
+                .First(x => x.Code == "SameSideTaskNum")?.SContent.ToInt() ?? 5;
+
+            // 判断当前侧任务数量是否超出限制
+            var currentTaskCount = GetStationTaskCount(db, sta);
+            if (currentTaskCount > num)
+            {
+                // 同一分拣库的两侧均分任务
+                if (task.WarehouseCode.StartsWith("1") || task.WarehouseCode.StartsWith("2") ||
+                    task.WarehouseCode.StartsWith("3"))
+                {
+                    var (northCount, southCount) = GetNorthAndSouthTaskCounts(db, stationPair);
+                    sta = northCount > southCount ? stationPair.S : stationPair.N;
+                }
+                else
+                {
+                    return defaultStation;
+                }
+            }
+
+            // 配置值获取
+            num = db.Default.Queryable<fjSysConfig>()
+                .NoLock()
+                .First(x => x.Code == "TasksInSameWarehouse")?.SContent.ToInt() ?? 10;
+
+            // 判断是否需要在三个分拣中心中选取任务数量较少的一侧进行分配
+            currentTaskCount = GetStationTaskCount(db, sta);
+            if (currentTaskCount > num)
+                sta = db.Default.Queryable<WCS_AgvTaskInfo>()
+                    .NoLock()
+                    .Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 &&
+                                v.TaskType == AGVTaskType.EnterDepot &&
+                                (v.Station != "2535" && v.Station != "2735" && v.Station != "2935"  && v.Station != "3135" && !v.Station.StartsWith("9")))
+                    .SplitTable(v => v.Take(2))
+                    .ToList()
+                    .GroupBy(x => x.Station)
+                    .Select(g => new { Station = g.Key, Count = g.Count() })
+                    .OrderBy(x => x.Count)
+                    .FirstOrDefault()?.Station ?? defaultStation;
+
+            return sta;
+        }
+
+        /// <summary>
+        ///     获取指定站台的任务数量
+        /// </summary>
+        private int GetStationTaskCount(SqlSugarHelper db, string station)
+        {
+            return db.Default.Queryable<WCS_AgvTaskInfo>()
+                .NoLock()
+                .Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 &&
+                            v.TaskType == AGVTaskType.EnterDepot && v.Station == station)
+                .SplitTable(v => v.Take(2))
+                .Count();
+        }
+
+        /// <summary>
+        ///     获取北侧和南侧的任务数量
+        /// </summary>
+        private (int NorthCount, int SouthCount) GetNorthAndSouthTaskCounts(SqlSugarHelper db,
+            (string N, string S) stationPair)
+        {
+            var northCount = GetStationTaskCount(db, stationPair.N);
+            var southCount = GetStationTaskCount(db, stationPair.S);
+            return (northCount, southCount);
+        }
+
         /// <summary>
         ///  获取AGV的目标站台
         /// </summary>
         /// <param name="task"></param>
         /// <param name="db"></param>
         /// <returns></returns>
-        public string GetAgvStation(WCS_TaskInfo task, SqlSugarHelper db)
+        private string GetAgvStation1(WCS_TaskInfo task, SqlSugarHelper db)
         {
             string sta = "";
             var n = 0;
@@ -552,56 +659,129 @@ namespace WCS.WorkEngineering.Systems
                     _ => task.WarehouseCode
                 };
             }
-            //同侧之间均分
-            if (warehouseCode.Contains("1"))
-            {
-                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("25") && !v.Station.EndsWith("35"))
-                           .SplitTable(v => v.Take(2)).Count();
-                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("27") && !v.Station.EndsWith("35"))
-                           .SplitTable(v => v.Take(2)).Count();
-                sta = n > s ? "2701" : "2501";
-            }
-            else if (warehouseCode.Contains("2"))
+
+            #region 判断是否需要在同一分拣库的两侧进行均分
+            //获取配置值
+            var num = 5;
+            var config = db.Default.Queryable<fjSysConfig>().NoLock().First(x => x.Code == "SameSideTaskNum");
+            if (config != null)
             {
-                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("29") && !v.Station.EndsWith("35"))
-                           .SplitTable(v => v.Take(2)).Count();
-                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("31") && !v.Station.EndsWith("35"))
-                           .SplitTable(v => v.Take(2)).Count();
-                sta = n > s ? "3101" : "2901";
+                num = config.SContent.ToInt();
             }
-            else if (warehouseCode.Contains("3"))
+
+            sta = warehouseCode switch
             {
-                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("33"))
-                           .SplitTable(v => v.Take(2)).Count();
-                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("35"))
-                               .SplitTable(v => v.Take(2)).Count();
-                sta = n > s ? "3501" : "3301";
-            }
-            else
+                "1N" => "2501",
+                "1S" => "2701",
+                "2N" => "2901",
+                "2S" => "3101",
+                "3N" => "3301",
+                "3S" => "3501",
+                _ => "2501",
+            };
+
+            //获取当前侧的已有任务数量
+            var staNumber = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v =>
+                    v.Status >= AGVTaskStatus.Confirm &&
+                    v.Status < AGVTaskStatus.Complete1 &&
+                    v.TaskType == AGVTaskType.EnterDepot && v.Station == sta)
+                .SplitTable(v => v.Take(2)).Count();
+            //当前侧任务数量已大于配置任务数量
+            if (staNumber > num) 
             {
-                return default;
+                //同侧之间均分
+                if (warehouseCode.Contains("1"))
+                {
+                    n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station=="2501")
+                        .SplitTable(v => v.Take(2)).Count();
+                    s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station=="2701")
+                        .SplitTable(v => v.Take(2)).Count();
+                    sta = n > s ? "2701" : "2501";
+                }
+                else if (warehouseCode.Contains("2"))
+                {
+                    n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station=="2901")
+                        .SplitTable(v => v.Take(2)).Count();
+                    s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station=="3101")
+                        .SplitTable(v => v.Take(2)).Count();
+                    sta = n > s ? "3101" : "2901";
+                }
+                else if (warehouseCode.Contains("3"))
+                {
+                    n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station=="3301")
+                        .SplitTable(v => v.Take(2)).Count();
+                    s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station=="3501")
+                        .SplitTable(v => v.Take(2)).Count();
+                    sta = n > s ? "3501" : "3301";
+                }
+                else
+                {
+                    return default;
+                }
             }
 
-            n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v =>
+            #endregion
+
+            #region 判断是否需要在三个分拣中心中选取任务数量较少的一侧进行分配
+
+            staNumber = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v =>
                     v.Status >= AGVTaskStatus.Confirm &&
                     v.Status < AGVTaskStatus.Complete1 &&
                     v.TaskType == AGVTaskType.EnterDepot && v.Station == sta)
                 .SplitTable(v => v.Take(2)).Count();
-            //任务数量配置
-            int num = 5;
-            var config = db.Default.Queryable<fjSysConfig>().NoLock().First(x => x.Code == "SameSideTaskNum");
+            num = 10; 
+            config = db.Default.Queryable<fjSysConfig>().NoLock().First(x => x.Code == "TasksInSameWarehouse");
             if (config != null)
             {
                 num = config.SContent.ToInt();
             }
-            if (n > num)
+            if (staNumber > num)
             {
                 sta = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot
-                && (v.Station != "2535" && v.Station != "2735" && v.Station != "2935"  && v.Station != "3135" && !v.Station.StartsWith("9")))//过滤掉人工满托入库和重绕区任务
+                        && (v.Station != "2535" && v.Station != "2735" && v.Station != "2935"  && v.Station != "3135" && !v.Station.StartsWith("9")))//过滤掉人工满托入库和重绕区任务
                     .SplitTable(v => v.Take(2)).ToList().GroupBy(x => x.Station).Select(x => new { x.Key, Count = x.Count() }).MinBy(x => x.Count).Key;
             }
 
+            #endregion
+
             return sta;
         }
+
+
+        /// <summary>
+        /// 获取AGV返空可用目标站台
+        /// </summary>
+        /// <param name="warehouseCode">仓库</param>
+        /// <param name="direction">需要获取的方向</param>
+        /// <returns>目标站台列表</returns>
+        public List<string> GetAgvStation(string warehouseCode, string direction)
+        {
+            // 定义方向和仓库与站台的映射关系
+            var stationMap = new Dictionary<string, Dictionary<string, List<string>>>
+            {
+                ["N"] = new()
+                {
+                    ["1"] = new List<string> { "2501", "2505", "2509", "2513" },
+                    ["2"] = new List<string> { "2901", "2905", "2909", "2913" },
+                    ["3"] = new List<string> { "3301", "3305", "3309", "3313" }
+                },
+                ["S"] = new()
+                {
+                    ["1"] = new List<string> { "2701", "2705", "2709", "2713" },
+                    ["2"] = new List<string> { "3101", "3105", "3109", "3113" },
+                    ["3"] = new List<string> { "3501", "3505", "3509", "3513" }
+                }
+            };
+
+            // 查找方向和仓库对应的站台
+            if (stationMap.TryGetValue(direction, out var warehouseStations))
+            {
+                var warehouseKey = warehouseStations.Keys.FirstOrDefault(warehouseCode.Contains);
+                if (warehouseKey != null) return warehouseStations[warehouseKey];
+            }
+
+            // 如果没有找到匹配的站台,则返回空列表
+            return new List<string>();
+        }
     }
 }