This commit is contained in:
xingheng 2025-09-28 10:43:45 +08:00
parent b84f7d9d0f
commit dc8b37ca6e

View File

@ -53,6 +53,9 @@ namespace Learun.Application.Web.AppApi
/// <param name="iOType"></param>
private ec_PanelStripEntity CreatePanelStripByProfile2(string projId, string TSname, string panelId, GlobalEnum.IOType iOType)
{
var setTb = ProjectSugar.TableName<ec_projectSettingsEntity>(projId);
var allSettings = SqlSugarHelper.Db.Queryable<ec_projectSettingsEntity>().AS(setTb).ToList();
//IO_CardProfile
return new ec_PanelStripEntity();
}
/// <summary>
@ -525,7 +528,16 @@ namespace Learun.Application.Web.AppApi
var signalTb = ProjectSugar.TableName<ec_Wire_GroupEntity>(projId);
var allSignals = SqlSugarHelper.Db.Queryable<ec_Wire_GroupEntity>().AS(signalTb).ToList();
var connTb = ProjectSugar.TableName<ec_WireTerminalEntity>(projId);
var termTb = ProjectSugar.TableName<ec_PanelStripTermEntity>(projId);
var allConnedTerms = SqlSugarHelper.Db.Queryable<ec_WireTerminalEntity>().AS(connTb)
.InnerJoin<ec_PanelStripTermEntity>((a, b) => a.TermID == b.TermID).AS<ec_PanelStripTermEntity>(termTb)
.Select((a, b) => b.ChannelID).Distinct().ToList();
var allUsedCH = allSignals.Where(x => !string.IsNullOrEmpty(x.ChannelID)).Select(x => x.ChannelID).Distinct().ToList();
allUsedCH.AddRange(allConnedTerms);
//??这里有问题。通道是否被占用需要看signal和set双重在io分配界面
//1. 信号有, 电缆set有占了
//2.信号no电缆set有占了
@ -588,7 +600,11 @@ namespace Learun.Application.Web.AppApi
#endregion
#region inputNew
var resIn = AutoAssignCore(GlobalEnum.inOrOut., setsIn, setsSpared);
if (setsIn.Count > 0)
{
var resIn = AutoAssignCore(GlobalEnum.inOrOut., setsIn, setsSpared);
}
#endregion
#region input
//ec_PanelStripEntity curStrip = null;
@ -724,23 +740,19 @@ namespace Learun.Application.Web.AppApi
//}
#endregion
#region output
var resOut = AutoAssignCore(GlobalEnum.inOrOut., setsOut, setsSpared);
if (setsOut.Count > 0)
{
var resOut = AutoAssignCore(GlobalEnum.inOrOut., setsOut, setsSpared);
}
#endregion
#endregion
//in 和 out都会执行这个
bool AutoAssignCore(GlobalEnum.inOrOut inOrOut, List<ec_CableSetEntity> sets, List<ec_CableSetEntity> sets_Spared)
{
GlobalEnum.IOType ioTypeOnC = default;
ec_PanelStripEntity curStrip = null;
var matchedStrips = curStrips.Where(x => x.IO_TYPE == ioTypeOnC.ToString()).ToList();
if (matchedStrips != null && lastUsedStrip != null && lastUsedStrip.IO_TYPE == ioTypeOnC.ToString())
{
//1.2.2 优先使用上一个模块,直到模块满了再用下一个模块。
matchedStrips.Insert(0, lastUsedStrip);
}
string PanelName = cable.AssignedPanel.TagNumber;//当前电缆预分配的箱子名称
switch (cable.PreAssignIOType.ToLower())
{
case "digital":
@ -779,23 +791,22 @@ namespace Learun.Application.Web.AppApi
//通讯类 485 422啥的
return false;
}
ec_PanelStripEntity curStrip = null;
var matchedStrips = curStrips.Where(x => x.IO_TYPE == ioTypeOnC.ToString()).ToList();
if (matchedStrips != null && lastUsedStrip != null && lastUsedStrip.IO_TYPE == ioTypeOnC.ToString())
{
//1.2.2 优先使用上一个模块,直到模块满了再用下一个模块。
matchedStrips.Insert(0, lastUsedStrip);
}
string PanelName = cable.AssignedPanel.TagNumber;//当前电缆预分配的箱子名称
if (sets.Count == 0)
{
//相当于没有
}
//else if (sets.Count + setsSpared.Count() > 10)
//{
//}
else
{
var totalSets = sets.Count + setsSpared.Count();
//另外如果电缆对数大于10对即像12*2*0.75这种无论它预分配了多少根电缆对永远预留4个以下的空白通道。
//意思就是一个模块里面够4个或4个以上空白通道就留4个空白通道
//如果不够4个就留4个以下即可。
//1.2 流程图 箱子里是否已经存在端子排io匹配
bool alreadyInsertNewTs = false;
@ -822,7 +833,7 @@ namespace Learun.Application.Web.AppApi
{
//1.2.3 (1) 非通讯如果空的通道大于整个模块的5%则可以利用利用到小于5%了则停止利用如果本身空通道数占的比例就小于5%,则不利用。
curStrip = FindNextAvailableTS(matchedStrips, allUsedCH);
curStrip = FindNextAvailableTS(cable.Sets.Count,totalSets, matchedStrips, allUsedCH);
if (curStrip == null)
{
@ -846,7 +857,7 @@ namespace Learun.Application.Web.AppApi
return false;
}
else
{
{
//相当于前面5%的判断过了但是呢放不下所有需要的set
var newTS = CreatePanelStripByProfile2(projId, "TS_" + ioTypeOnC.ToString() + "_" + newTSSeq++, curPanelId, ioTypeOnC);
alreadyInsertNewTs = true;
@ -862,31 +873,23 @@ namespace Learun.Application.Web.AppApi
}
}
lastUsedStrip = curStrip;
//能放下
if (cable.Sets.Count > 10)
for (int i = 0; i < sets.Count; i++)
{
//另外如果电缆对数大于10对即像12*2*0.75这种无论它预分配了多少根电缆对永远预留4个以下的空白通道。意思就是一个模块里面够4个或4个以上空白通道就留4个空白通道如果不够4个就留4个以下即可
var set = sets[i];
var ch = notUsedChs[i];
set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排){curStrip.StripName}/通道:{ch.ChannelName}";
//更新全局已使用通道
allUsedCH.Add(ch.ChannelID);
}
else
var chOffIdx = sets.Count;
for (int i = 0; i < setsSpared.Count(); i++)
{
for (int i = 0; i < sets.Count; i++)
{
var set = sets[i];
var ch = notUsedChs[i];
set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排){curStrip.StripName}/通道:{ch.ChannelName}";
//更新全局已使用通道
allUsedCH.Add(ch.ChannelID);
}
var chOffIdx = sets.Count;
for (int i = 0; i < setsSpared.Count(); i++)
{
var set = setsSpared[i];
var ch = notUsedChs[chOffIdx + i];
set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排){curStrip.StripName}/通道:{ch.ChannelName}/冗余";
//更新全局已使用通道
allUsedCH.Add(ch.ChannelID);
}
var set = setsSpared[i];
var ch = notUsedChs[chOffIdx + i];
set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排){curStrip.StripName}/通道:{ch.ChannelName}/冗余";
//更新全局已使用通道
allUsedCH.Add(ch.ChannelID);
}
#endregion
@ -908,10 +911,11 @@ namespace Learun.Application.Web.AppApi
/// <summary>
/// 找到下一个可用的端子排
/// </summary>
/// <param name="setCount">电缆总set</param>
/// <param name="TSs">所有的端子排</param>
/// <param name="allUsedCH">使用过的channelId</param>
/// <returns></returns>
private ec_PanelStripEntity FindNextAvailableTS(List<ec_PanelStripEntity> TSs, List<string> allUsedCH)
private ec_PanelStripEntity FindNextAvailableTS(int setCount,int setPreAssigned, List<ec_PanelStripEntity> TSs, List<string> allUsedCH)
{
foreach (var TS in TSs)
{
@ -921,14 +925,25 @@ namespace Learun.Application.Web.AppApi
double sparedRate = notUsedChs.Count * 1.0 / validChs.Count * 1.0;
if (sparedRate < 0.05)
if (sparedRate < 0.05 || notUsedChs.Count < setPreAssigned)
{
//没有空闲通道 next
//或者空闲通道不够放下这个电缆的所有set
}
else
{
TS.Channels = validChs.OrderBy(X => X.Channel_Seq).ToList();
var seq = TSs.IndexOf(TS);
if (setCount > 10)
{
//另外如果电缆对数大于10对即像12 * 2 * 0.75这种无论它预分配了多少根电缆对永远预留4个以下的空白通道。意思就是一个模块里面够4个或4个以上空白通道就留4个空白通道如果不够4个就留4个以下即可。
if (notUsedChs.Count < 4)
{
//没有足够的空闲通道 next
continue;
}
}
return TS;//找到了
}