|
@@ -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>();
|
|
|
+ }
|
|
|
}
|
|
|
}
|