完善自动分配(就近找采集箱)
This commit is contained in:
parent
63ab9f2a4a
commit
cde4be8f13
@ -48,36 +48,117 @@ namespace Learun.Application.Web.AppApi
|
||||
|
||||
/// <summary>
|
||||
/// 找到某一个预分配箱子 附近的某一个箱子
|
||||
/// <param name="curPanelId"/>
|
||||
/// <param name="frameLists"/>
|
||||
/// <param name="allPanel"/>
|
||||
/// <param name="IOTypeOnCable">Digital,4-20mA,10v,pt100,pulse</param>
|
||||
/// <param name="PreAssignPanelID"/>
|
||||
/// <param name="allPanelProps">所有柜子的属性</param>
|
||||
/// <param name="IOTypeOnCable">Digital,4-20mA,10v,pt100,pulse</param>
|
||||
/// </summary>
|
||||
|
||||
private ec_PanelEntity FindPanelNearby(List<FrameBll.FrameList> frameLists, List<ec_PanelEntity> allPanel, List<ec_enginedata_propertyEntity> allPanelProps
|
||||
, string IOTypeOnCable)
|
||||
private ec_PanelEntity FindPanelNearby(string curPanelId, List<FrameBll.FrameList> frameLists, List<ec_PanelEntity> allPanel,
|
||||
Dictionary<string, List<ec_enginedata_propertyEntity>> allPanelProps, string IOTypeOnCable)
|
||||
{
|
||||
double GetPanelXYDistance2Target(string panelId, double targetX, double targetY)
|
||||
{
|
||||
var nearPanel = allPanel.FirstOrDefault(x => x.PanelID == panelId);
|
||||
var nearPanelProps = allPanelProps[nearPanel.EngineerDataID];
|
||||
var X = nearPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue;
|
||||
X = X.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
|
||||
var validFrme2 = frameLists.FirstOrDefault(f => f.Num == X);
|
||||
if (validFrme2 == null)
|
||||
{
|
||||
return -1;//无效的肋位号导致的
|
||||
}
|
||||
|
||||
|
||||
var XValue = validFrme2.Value;
|
||||
|
||||
if (XValue < 400)//null也没事
|
||||
{
|
||||
// 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。
|
||||
XValue = 1000 * XValue; // 转成mm
|
||||
}
|
||||
if (double.TryParse(nearPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue,
|
||||
out double XOffValue))
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;//无效的x off导致的
|
||||
}
|
||||
if (double.TryParse(nearPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue,
|
||||
, out double YOffValue))
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;//无效的y off导致的
|
||||
}
|
||||
|
||||
var distance = Math.Sqrt(Math.Pow(targetX - XValue - XOffValue, 2) + Math.Pow(targetY - YOffValue, 2));
|
||||
return distance;
|
||||
}
|
||||
var curPanel = allPanel.FirstOrDefault(x => x.PanelID == curPanelId);
|
||||
var curPanelProps = allPanelProps[curPanel.EngineerDataID];
|
||||
//当前预分配的箱子的位置
|
||||
var AssignPanelX = allPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue;
|
||||
var AssignPanelX = curPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue;
|
||||
AssignPanelX = AssignPanelX.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
|
||||
var AssignPanelXValue = frameLists.FirstOrDefault(X => X.Num == AssignPanelX)?.Value;
|
||||
var validFrme = frameLists.FirstOrDefault(X => X.Num == AssignPanelX);
|
||||
if (validFrme == null)
|
||||
{
|
||||
return null;//无效的肋位号导致的
|
||||
}
|
||||
|
||||
|
||||
var AssignPanelXValue = validFrme.Value;
|
||||
|
||||
if (AssignPanelXValue < 400)//null也没事
|
||||
{
|
||||
// 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。
|
||||
AssignPanelXValue = 1000 * AssignPanelXValue; // 转成mm
|
||||
}
|
||||
var AssignPanelXOff = allPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue;
|
||||
|
||||
var AssignPanelY = allPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue;
|
||||
|
||||
foreach (var panel in allPanel)
|
||||
if (double.TryParse(curPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue,
|
||||
out double AssignPanelXOffValue))
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;//无效的x off导致的
|
||||
}
|
||||
if (double.TryParse(curPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue,
|
||||
, out double AssignPanelYValue))
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;//无效的y off导致的
|
||||
}
|
||||
double minDistance = 0.1; ec_PanelEntity nearestPanel = null;
|
||||
foreach (var panel in allPanel.Where(x => x.PanelID != curPanelId))
|
||||
{
|
||||
#region io
|
||||
|
||||
#endregion
|
||||
#region distance
|
||||
//拿到每一个的xy属性
|
||||
//然后和预分配箱子进行对比
|
||||
//这也太耗时了把
|
||||
}
|
||||
//然后排序一次
|
||||
var DISTANCE = GetPanelXYDistance2Target(panel.PanelID, AssignPanelXValue + AssignPanelXOffValue, AssignPanelYValue);
|
||||
|
||||
if (0.1 == minDistance && DISTANCE > 0)
|
||||
{
|
||||
minDistance = DISTANCE; nearestPanel = panel;
|
||||
}
|
||||
else if (DISTANCE < minDistance && DISTANCE > 0)
|
||||
{
|
||||
minDistance = DISTANCE; nearestPanel = panel;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
//根据电缆上的信号,去找匹配的排序第一位(已经按照距离排序过)的箱子
|
||||
switch (IOTypeOnCable.ToUpper())
|
||||
{
|
||||
@ -87,7 +168,7 @@ namespace Learun.Application.Web.AppApi
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
return nearestPanel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -282,6 +363,8 @@ namespace Learun.Application.Web.AppApi
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ICache redisObj = CacheFactory.CaChe();
|
||||
/// <summary>
|
||||
/// 自动分配通道(点表信号自动分配)。
|
||||
///
|
||||
@ -334,15 +417,21 @@ namespace Learun.Application.Web.AppApi
|
||||
if (AcceptNearbyPanel)//允许进行
|
||||
{
|
||||
//有不匹配的,但是用户允许继续
|
||||
//在之后的自动分配过程中会自动寻找匹配的采集箱,原则上从就近的开始找,如果没有匹配的采集箱,则提示“未找到具有XX类型的采集箱,请新增后再次分配,是否取消自动分配进程?”
|
||||
//如果选是,则在之后的自动分配过程中会自动寻找匹配的采集箱,原则上从就近的开始找,如果没有匹配的采集箱,则提示“未找到具有XX类型的采集箱,请新增后再次分配,是否取消自动分配进程?”
|
||||
bool nearbyFound = false;
|
||||
foreach (var cable in cablesNotMatchIO)
|
||||
{
|
||||
var nearPanel = FindPanelNearby(allFrames, allPanel, allPanelProp[cable.ToPanel.EngineerDataID], cable.PreAssignIOType);
|
||||
var nearPanel = FindPanelNearby(cable.PanelID, allFrames, allPanel, allPanelProp, cable.PreAssignIOType);
|
||||
if (nearPanel == null)
|
||||
{
|
||||
nearbyFound = false;
|
||||
//必要的数据存入redis,以便后续步骤使用
|
||||
redisObj.Remove("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch);
|
||||
redisObj.Write<List<ec_CableEntity>>("IOModule_AutoAssign2Ch_" + projId, cablesNeedAssigned, CacheId.IOModule_AutoAssign2Ch);
|
||||
return Fail($"在附近未找到具有{cable.PreAssignIOType}类型的采集箱,请新增后再次分配,是否取消自动分配进程?");
|
||||
//之后插件端进行选择。
|
||||
//如果不想新增,则选择否,继续自动分配,没有分配到的信号在备注上填写由于何种原因没有被分配,弹出未被分配的信号列表供查看。
|
||||
//也就是这里要等所有循环结束后才能return结果,而不是目前一个nearByFound = false时就退出了。
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -355,7 +444,7 @@ namespace Learun.Application.Web.AppApi
|
||||
}
|
||||
else
|
||||
{
|
||||
//不继续自动分配,中断进程,等添加完正确的模块后再继续自动分配
|
||||
//如果选否,则不继续自动分配,中断进程,等添加完正确的模块后再继续自动分配
|
||||
var cableNamesNotMatched = string.Join(",", cablesNotMatchIO.Select(x => x.TagNumber).ToList());
|
||||
var panelIOMissing = new List<string>();
|
||||
foreach (ec_CableEntity cableNotMatchIO in cablesNotMatchIO)
|
||||
@ -373,7 +462,6 @@ namespace Learun.Application.Web.AppApi
|
||||
|
||||
}
|
||||
//必要的数据存入redis,以便后续步骤使用
|
||||
ICache redisObj = CacheFactory.CaChe();
|
||||
redisObj.Remove("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch);
|
||||
redisObj.Write<List<ec_CableEntity>>("IOModule_AutoAssign2Ch_" + projId, cablesNeedAssigned, CacheId.IOModule_AutoAssign2Ch);
|
||||
|
||||
@ -385,26 +473,35 @@ namespace Learun.Application.Web.AppApi
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
///
|
||||
/// 根据step1的初步采集箱判断情况,来进行分配预览。
|
||||
/// </summary>
|
||||
/// <param name="projId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public IHttpActionResult AutoAssignCable2Channel_step2(string projId)
|
||||
{
|
||||
ICache redisObj = CacheFactory.CaChe();
|
||||
var cablesNeedAssigned = redisObj.Read<List<ec_CableEntity>>("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch);
|
||||
|
||||
//#region 1.2
|
||||
//#region 1.2 开始自动分配(不保存到数据库)
|
||||
#region 先分组 1.2.2
|
||||
cablesNeedAssigned = cablesNeedAssigned.OrderBy(x => new { x.PanelID, x.PreAssignIOType, x.System }).ToList();
|
||||
var cablesGrouped = cablesNeedAssigned.OrderBy(x => x.PanelID).ThenBy(x => x.PreAssignIOType).ThenBy(x => x.System).ToList();
|
||||
|
||||
foreach (var item in cablesNeedAssigned)
|
||||
{
|
||||
foreach (var set in item.Sets)
|
||||
if (item.Sets == null || item.Sets.Count() == 0)
|
||||
{
|
||||
set.ConnectionInfo = $"采集箱:{item.ToPanel.TagNumber}/模块(端子排):{"test_ts"}/通道:{"test_ch"}";
|
||||
set.AssignedTerms = set.Wires.Select(x => x.PreAssignChannelTermNo).ToList();// new List<string>() { "test_term1", "test_term2" };//假数据
|
||||
//也归类到未成功
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var set in item.Sets)
|
||||
{
|
||||
set.ConnectionInfo = $"采集箱:{item.ToPanel.TagNumber}/模块(端子排):{"test_ts"}/通道:{"test_ch"}";
|
||||
set.AssignedTerms = set.Wires.Select(x => x.PreAssignChannelTermNo).ToList();// new List<string>() { "test_term1", "test_term2" };//假数据
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//var curPanel = new ec_PanelEntity();
|
||||
//curPanel = panelsNeed.FirstOrDefault(x => x.PanelID == cablesNeedAssigned[0].PanelID);//先定位到第一个电缆所在的箱子
|
||||
@ -442,6 +539,21 @@ namespace Learun.Application.Web.AppApi
|
||||
return Success(cablesNeedAssigned);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据step2的预分配结果,进行实际的分配,修改数据库。
|
||||
/// </summary>
|
||||
/// <param name="projId"></param>
|
||||
/// <param name="cables">传入有效的cable即可,未成功分配的cable不需要</param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public IHttpActionResult AutoAssignCable2Channel_step3(string projId, [FromBody] List<ec_CableEntity> cables)
|
||||
{
|
||||
//大原则:同一根电缆的信号不能跨采集箱,跨模块可以。
|
||||
return Success(cables);
|
||||
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 把电缆分配到空余的模块的通道上。
|
||||
|
@ -631,7 +631,11 @@ namespace Learun.Application.Web.AppApi
|
||||
//每个位号的属性信息
|
||||
foreach (var tag in objectType.tags)
|
||||
{
|
||||
tag.CreateUserName = userDict[tag.CreateUserID];// allUser.FirstOrDefault(x => x.F_UserId == item.CreateUserID)?.F_RealName;
|
||||
if (userDict.TryGetValue(tag.CreateUserID, out string createUserName))
|
||||
{
|
||||
tag.CreateUserName = createUserName;// allUser.FirstOrDefault(x => x.F_UserId == item.CreateUserID)?.F_RealName;
|
||||
|
||||
}
|
||||
|
||||
tag.EngineDataProperty = tagPropDictByTag[tag.EngineDataID];// tagPropAll.Where(x => x.EngineDataID == tag.EngineDataID).ToList();
|
||||
tag.ObjectTypeName = objectType.ObjectTypeName;
|
||||
|
@ -81,7 +81,29 @@ namespace Learun.Application.Web.AppApi
|
||||
{
|
||||
var tagProps = propAll.FindAll(x => x.EngineDataID == pointTag.EngineDataID);
|
||||
var Prop_Frame = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue;
|
||||
Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
|
||||
if (Prop_Frame != null)
|
||||
{
|
||||
Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
|
||||
|
||||
}
|
||||
|
||||
var matchedFrame = frameLists.FirstOrDefault(X => X.Num == Prop_Frame);
|
||||
if (matchedFrame == null)
|
||||
{
|
||||
//没有
|
||||
//无效的基点
|
||||
var layoutTagInvalid = new layoutTagInfoBrief()
|
||||
{
|
||||
|
||||
EngineDataID = pointTag.EngineDataID,
|
||||
FileId = "",
|
||||
PixelOnDwg = pointsOnDwg.FirstOrDefault(x => x.EngineDataID == pointTag.EngineDataID)?.PixelCode,
|
||||
TagNumber = pointTag.TagNumber,
|
||||
area = "ERR"
|
||||
};
|
||||
res.Add(layoutTagInvalid);
|
||||
continue;
|
||||
}
|
||||
var xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value;
|
||||
if (xValue < 400)
|
||||
{
|
||||
@ -126,26 +148,28 @@ namespace Learun.Application.Web.AppApi
|
||||
|
||||
//这里要考虑下拉列表 带 ||的问题
|
||||
List<string> matchedTagIds = new List<string>();
|
||||
if (keyProp == GlobalObject.propName_System)
|
||||
{
|
||||
//#task 9536
|
||||
// 筛选出所有以 "a||" 或 "b||" 开头的元素
|
||||
var validSystems = keyValue.Split().ToList();
|
||||
matchedTagIds = propAll.Where(item =>
|
||||
validSystems.Any(prefix => item.PropertyValue == prefix) || validSystems.Any(prefix => item.PropertyValue.StartsWith(prefix + GlobalObject.enum_separator))
|
||||
).Select(X => X.EngineDataID).Distinct().ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
matchedTagIds = propAll.Where(x => x.PropertyName == keyProp
|
||||
&& (x.PropertyValue == keyValue || x.PropertyValue.StartsWith(keyValue + GlobalObject.enum_separator))).
|
||||
Select(X => X.EngineDataID).Distinct().ToList();
|
||||
}
|
||||
//if (keyProp == GlobalObject.propName_System)
|
||||
//{
|
||||
//#task 9536
|
||||
// 筛选出所有以 "a||" 或 "b||" 开头的元素
|
||||
var validSystems = keyValue.Split(';').ToList();
|
||||
matchedTagIds = propAll.Where(item =>
|
||||
item.PropertyName == keyProp &&
|
||||
validSystems.Any(prefix => item.PropertyValue == prefix) || validSystems.Any(prefix => item.PropertyValue.StartsWith(prefix + GlobalObject.enum_separator))
|
||||
).Select(X => X.EngineDataID).Distinct().ToList();
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// matchedTagIds = propAll.Where(x => x.PropertyName == keyProp
|
||||
// && (x.PropertyValue == keyValue || x.PropertyValue.StartsWith(keyValue + GlobalObject.enum_separator))).
|
||||
// Select(X => X.EngineDataID).Distinct().ToList();
|
||||
//}
|
||||
|
||||
|
||||
//有效范围的设备
|
||||
var matchedTags = SqlSugarHelper.Db.Queryable<ec_enginedataEntity>().AS(tagTbName).
|
||||
InnerJoin<ec_objecttypeEntity>((a, b) => a.ObjectTypeID == b.ObjectTypeID).AS<ec_objecttypeEntity>(typeTbName).
|
||||
|
||||
Where(a => matchedTagIds.Contains(a.EngineDataID)
|
||||
&& a.ObjectTypeID != pointType.ObjectTypeID)
|
||||
.Select((a, b) => new { a.EngineDataID, a.TagNumber, a.ObjectTypeID, b.DefaultLayoutLibFileID })
|
||||
@ -164,9 +188,26 @@ namespace Learun.Application.Web.AppApi
|
||||
|
||||
foreach (var matchPointTagId in matchPointTagIds)
|
||||
{
|
||||
var tagInfo = matchedTags.FirstOrDefault(X => X.EngineDataID == matchPointTagId);
|
||||
var tagProps = EquipPropAll.Where(x => x.EngineDataID == matchPointTagId).ToList();
|
||||
var Prop_Frame = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue;
|
||||
Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
|
||||
if (Prop_Frame != null)
|
||||
{
|
||||
Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
|
||||
}
|
||||
var matchedFrame = frameLists.FirstOrDefault(X => X.Num == Prop_Frame);
|
||||
if (matchedFrame == null)
|
||||
{
|
||||
var layoutTagInfoInvalid = new layoutTagInfoBrief()
|
||||
{
|
||||
EngineDataID = matchPointTagId,
|
||||
PixelOnDwg = "",
|
||||
TagNumber = tagInfo.TagNumber,
|
||||
area = "ERR",
|
||||
};
|
||||
basePoint.Tags.Add(layoutTagInfoInvalid);
|
||||
continue;
|
||||
}
|
||||
var xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value;
|
||||
if (xValue < 400)
|
||||
{
|
||||
@ -176,7 +217,7 @@ namespace Learun.Application.Web.AppApi
|
||||
var Prop_FrameOff = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue;
|
||||
var Prop_YOff = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue;
|
||||
|
||||
var tagInfo = matchedTags.FirstOrDefault(X => X.EngineDataID == matchPointTagId);
|
||||
|
||||
var systemProp = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_System)?.PropertyValue;
|
||||
var tagProp = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Tag)?.PropertyValue;
|
||||
#region 判断是否满足特定条件
|
||||
@ -243,13 +284,13 @@ namespace Learun.Application.Web.AppApi
|
||||
var lastDashPos = tagInfo.TagNumber.LastIndexOf('-');//最后一个'-'的位置
|
||||
if (lastDashPos > 0 && lastDashPos < tagInfo.TagNumber.Length - 1)
|
||||
{
|
||||
TagNumber_Upper = tagInfo.TagNumber.Substring(0, lastDashPos);
|
||||
TagNumber_Lower = tagInfo.TagNumber.Substring(lastDashPos + 1);
|
||||
}
|
||||
TagNumber_Upper = tagInfo.TagNumber.Substring(lastDashPos + 1);//tag
|
||||
TagNumber_Lower = tagInfo.TagNumber.Substring(0, lastDashPos);//system
|
||||
}
|
||||
else
|
||||
{
|
||||
TagNumber_Upper = tagInfo.TagNumber;
|
||||
TagNumber_Lower = "";
|
||||
TagNumber_Upper = tagInfo.TagNumber;//tag
|
||||
TagNumber_Lower = ""; //system
|
||||
}
|
||||
#endregion
|
||||
var layoutTagInfo = new layoutTagInfoBrief()
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<LastActiveSolutionConfig>Release|Any CPU</LastActiveSolutionConfig>
|
||||
<LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>
|
||||
<NameOfLastUsedPublishProfile>C:\repo\CODE\009_DI-Elec\Learun.Application.Web\Properties\PublishProfiles\FolderProfile3.pubxml</NameOfLastUsedPublishProfile>
|
||||
<UseIISExpress>true</UseIISExpress>
|
||||
<Use64BitIISExpress />
|
||||
|
@ -254,19 +254,19 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC
|
||||
Where(x => panels.Select(xx => xx.EngineerDataID).Contains(x.EngineDataID)).ToList().ToDictionary(x => x.EngineDataID);
|
||||
var FromRels = new Dictionary<string, string>();//key是cable,value是from设备的id
|
||||
var allpropOnFrom = new List<ec_enginedata_propertyEntity>();
|
||||
|
||||
var relTypeObj = SqlSugarHelper.Db.Queryable<ec_reltypeEntity>().AS(relTypeTable).ToList().
|
||||
FirstOrDefault(x => x.RelType == enum_RelType.设备_电缆);
|
||||
|
||||
FromRels = SqlSugarHelper.Db.Queryable<ec_enginedata_relEntity>().AS(relTable).
|
||||
Where(x => x.RelTypeID == relTypeObj.RelTypeID && preAssignedCables.Select(c => c.EngineerDataID).Contains(x.RelEngineData2ID)).
|
||||
Distinct().
|
||||
ToList().ToDictionary(x => x.RelEngineData2ID, x => x.RelEngineData1ID);
|
||||
|
||||
//设备上的属性
|
||||
//电缆在2,因为1.2.2里用于取的是from端的设备(设备在1,电缆在2)
|
||||
if (needProp)
|
||||
{
|
||||
var relTypeObj = SqlSugarHelper.Db.Queryable<ec_reltypeEntity>().AS(relTypeTable).ToList().
|
||||
FirstOrDefault(x => x.RelType == enum_RelType.设备_电缆);
|
||||
|
||||
FromRels = SqlSugarHelper.Db.Queryable<ec_enginedata_relEntity>().AS(relTable).
|
||||
Where(x => x.RelTypeID == relTypeObj.RelTypeID && preAssignedCables.Select(c => c.EngineerDataID).Contains(x.RelEngineData2ID)).
|
||||
Distinct().
|
||||
ToList().ToDictionary(x => x.RelEngineData2ID, x => x.RelEngineData1ID);
|
||||
|
||||
//设备上的属性
|
||||
//电缆在2,因为1.2.2里用于取的是from端的设备(设备在1,电缆在2)
|
||||
|
||||
allpropOnFrom = SqlSugarHelper.Db.Queryable<ec_enginedata_propertyEntity>().AS(propTable).
|
||||
Where(x => FromRels.Values.Contains(x.EngineDataID)).ToList();
|
||||
|
||||
@ -284,23 +284,29 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC
|
||||
|
||||
|
||||
cable.TagNumber = tags[cable.EngineerDataID]?.TagNumber;
|
||||
var panelObj = panelDict[cable.PanelID];
|
||||
if (panelObj == null)
|
||||
ec_PanelEntity panelObj;
|
||||
if (panelDict.TryGetValue(cable.PanelID, out panelObj))
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;//分配就已经不合理了
|
||||
}
|
||||
else if (panelObj != null)
|
||||
{
|
||||
panelObj.TagNumber = panelTags[panelObj.EngineerDataID]?.TagNumber;
|
||||
|
||||
//1.2.2 系统属性从电缆的from端上的设备中取设备的系统
|
||||
var panelId = FromRels[cable.EngineerDataID];
|
||||
panelObj.TagNumber = panelTags[panelObj.EngineerDataID]?.TagNumber;
|
||||
|
||||
//1.2.2 系统属性从电缆的from端上的设备中取设备的系统
|
||||
var panelId = FromRels[cable.EngineerDataID];
|
||||
if (needProp)
|
||||
{
|
||||
var panelProps = allPropOnFromDict[panelId];
|
||||
cable.System = panelProps[GlobalObject.propName_System]?.PropertyValue;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
cable.ToPanel = panelObj;//暂用一下topanel属性,相当于电缆预分配的采集箱背后的Panel对象。
|
||||
|
||||
var IOsOnPanel = panelObj.allowedIOTypes.Split(',').ToList();
|
||||
|
Loading…
x
Reference in New Issue
Block a user