This commit is contained in:
xingheng 2025-09-16 09:51:40 +08:00
parent 1f6ac157b7
commit e6d949afe9
8 changed files with 258 additions and 70 deletions

View File

@ -1,6 +1,7 @@
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using Learun.Application.Organization;
using Learun.Application.TwoDevelopment.ZZDT_EC;
using Learun.Application.TwoDevelopment.ZZDT_EC.Frame;
using Learun.Loger;
using Learun.Util;
using Learun.Util.SqlSugar;
@ -14,6 +15,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web.Http;
using static Learun.Application.TwoDevelopment.ZZDT_EC.GlobalEnum;
using static Learun.Application.TwoDevelopment.ZZDT_EC.IO_WorkFlowService;
namespace Learun.Application.Web.AppApi
@ -236,6 +238,129 @@ namespace Learun.Application.Web.AppApi
}
/// <summary>
/// 找到某一个预分配箱子 附近的某一个箱子
/// <param name="frameLists"/>
/// <param name="allPanel"/>
/// <param name="IOTypeOnCable">Digital,4-20mA,10v,pt100,pulse</param>
/// <param name="PreAssignPanelID"/>
/// </summary>
private ec_PanelEntity FindPanelNearby(List<FrameBll.FrameList> frameLists, List<ec_PanelEntity> allPanel, List<ec_enginedata_propertyEntity> allPanelProps
, string IOTypeOnCable, string PreAssignPanelID)
{
//当前预分配的箱子的位置
var AssignPanelProps = allPanelProps.Where(x => x.EngineDataID == PreAssignPanelID).ToList();
var AssignPanelX = AssignPanelProps.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;
if (AssignPanelXValue < 400)
{
// 小于400我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm400mm的肋位号似乎也太小了。
AssignPanelXValue = 1000 * AssignPanelXValue; // 转成mm
}
var AssignPanelXOff = AssignPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue;
var AssignPanelY = AssignPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue;
foreach (var panel in allPanel)
{
//拿到每一个的xy属性
//然后和预分配箱子进行对比
}
//然后排序一次
//根据电缆上的信号,去找匹配的排序第一位(已经按照距离排序过)的箱子
switch (IOTypeOnCable.ToUpper())
{
case "DIGITAL":
//其他就近箱子的 allowIOTypes里有DI DO
break;
default:
break;
}
return null;
}
/// <summary>
/// 自动分配通道(点表信号自动分配)
/// </summary>
/// <param name="projId"></param>
/// <param name="AcceptUnmatchedPanel">如果没有匹配的采集箱则提示“未找到具有XX类型的采集箱请新增后再次分配是否取消自动分配进程</param>
/// <returns></returns>
public IHttpActionResult AutoAssignCable2Channel(string projId, bool AcceptUnmatchedPanel)
{
#region
var cbll = new ec_CableBLL();
var panelTable = ProjectSugar.TableName<ec_PanelEntity>(projId);
var stripTable = ProjectSugar.TableName<ec_PanelStripEntity>(projId);
#endregion
#region
var cablesNeedAssigned = cbll.GetCablesPreAssign(projId, true);
#endregion
//涉及到哪些箱子
var panelsNeed = SqlSugarHelper.Db.Queryable<ec_PanelEntity>().AS(panelTable).
Where(x => cablesNeedAssigned.Select(xx => xx.PanelID).Contains(x.PanelID)).ToList();
var stripsNeed = SqlSugarHelper.Db.Queryable<ec_PanelStripEntity>().AS(stripTable).
Where(x => panelsNeed.Select(xx => xx.PanelID).Contains(x.PanelID)).
ToList();
#region 1.1()
var cablesNotMatchIO = cablesNeedAssigned.Where(x => !x.IOTypeMatch).ToList(); // GetCablesPreAssign 查询时已经处理过io是否匹配了
if (cablesNotMatchIO != null && cablesNotMatchIO.Count > 0)
{
if (!AcceptUnmatchedPanel)//允许进行
{
//
}
else
{
//不继续自动分配,中断进程,等添加完正确的模块后再继续自动分配
return Fail("等电缆的预分配IO类型和其预分配的采集箱的IO类型无法匹配。等添加完正确的模块后再继续自动分配。");
}
}
#endregion
#region 1.2
#region 1.2.2
cablesNeedAssigned = cablesNeedAssigned.OrderBy(x => new { x.PreAssignIOType, x.System, x.PanelID }).ToList();
var curPanel = new ec_PanelEntity();
curPanel = panelsNeed.FirstOrDefault(x => x.PanelID == cablesNeedAssigned[0].PanelID);//先定位到第一个电缆所在的箱子
curPanel.strips = stripsNeed.Where(x => x.PanelID == curPanel.PanelID).ToList();
var curStrip = new ec_PanelStripEntity();
#endregion
for (var i = 0; i < cablesNeedAssigned.Count; i++)
{
#region 1.2.1
if (curPanel.PanelID != cablesNeedAssigned[i].PanelID)
{
curPanel = panelsNeed.FirstOrDefault(x => x.PanelID == cablesNeedAssigned[0].PanelID);//切换箱子
curPanel.strips = stripsNeed.Where(x => x.PanelID == curPanel.PanelID).ToList();
}
foreach (var set in cablesNeedAssigned[i].Sets)
{
var availableStrips = curPanel.strips.Where(x => x.IO_TYPE.ToUpper() == set.IOType.ToString().ToUpper()).ToList();
if (availableStrips != null && availableStrips.Count > 0)
{
//已经存在端子排
}
else
{
//没有端子排根据信号数里自动新建端子排通道数里根据端子io模板的默认值获得
//
}
}
cable循环好strip循环好
#endregion
}
#endregion
return Success("自动关联完成");
}
/// <summary>
/// 把电缆分配到空余的模块的通道上。
/// </summary>
/// <param name="projId"></param>

View File

@ -1,4 +1,5 @@
using Learun.Application.TwoDevelopment.ZZDT_EC;
using Learun.Application.TwoDevelopment.ZZDT_EC.Frame;
using Learun.Util;
using Learun.Util.SqlSugar;
using NPOI.SS.Formula.Functions;
@ -54,36 +55,11 @@ namespace Learun.Application.Web.AppApi
return Fail("找不到基点这个对象类型。");
}
#region frame
List<FrameList> frameLists = new List<FrameList>();
frameLists.Add(new FrameList()
{ Num = "", Value = 0 });
var settings = new ec_projectSettingsBLL();
var ec_dataitemBLL = new ec_dataitemBLL();
var FrameListFlg = settings.GetEntity(GlobalObject.projSetting_enumlist_Frame, ProjectId);
if (FrameListFlg != null)
var frameBll = new FrameBll();
var frameLists = frameBll.GetFrameList(ProjectId);
if (frameLists == null)
{
var FrameDetail = ec_dataitemBLL.GetDetailList(FrameListFlg.SettingValue, "", ProjectId, false);
if (FrameDetail == null)
{
return Fail("项目数据字典中,没有找到【肋位号】的下拉项中。");// 或者 无法从数据字典中找到对应的那个下拉
}
foreach (var item in FrameDetail)
{
double value;
if (double.TryParse(item.DataItemCode, out value))
{
frameLists.Add(new FrameList() { Num = item.DataItemName, Value = value });
}
}
frameLists = frameLists.OrderBy(t => t.Value).ToList();
}
else
{
return Fail("项目设置中projectSettings表没有找到【肋位号】的设置项。");// 或者 无法从数据字典中找到对应的那个下拉
return Fail("项目数据字典中,没有找到【肋位号】的下拉项中。");// 或者 无法从数据字典中找到对应的那个下拉
}
#endregion
@ -361,40 +337,21 @@ namespace Learun.Application.Web.AppApi
[HttpGet]
public IHttpActionResult GetFrameList(string ProjectId)
{
var ec_dataitemBLL = new ec_dataitemBLL();
var settings = new ec_projectSettingsBLL();
var FrameListFlg = settings.GetEntity(GlobalObject.projSetting_enumlist_Frame, ProjectId);
if (FrameListFlg != null)
var bll = new FrameBll();
var res = bll.GetFrameList(ProjectId);
if (res == null)
{
List<FrameList> frameLists = new List<FrameList>();
return Fail("项目设置中projectSettings表没有找到【肋位号】的设置项中对应的那个下拉。");// 或者 无法从数据字典中找到对应的那个下拉
var res = ec_dataitemBLL.GetDetailList(FrameListFlg.SettingValue, "", ProjectId, false);
if (res == null)
{
return Fail("项目设置中projectSettings表没有找到【肋位号】的设置项中对应的那个下拉。");// 或者 无法从数据字典中找到对应的那个下拉
}
foreach (var item in res)
{
double value;
if (double.TryParse(item.DataItemCode, out value))
{
frameLists.Add(new FrameList() { Num = item.DataItemName, Value = value });
}
}
frameLists = frameLists.OrderBy(t => t.Value).ToList();
return Success(frameLists);
}
else
{
return Fail("项目设置中projectSettings表没有找到【肋位号】的设置项。");// 或者 无法从数据字典中找到对应的那个下拉
return Success(res);
}
}
/// <summary>
/// 根据ObjectTypeID查绘制布置图时的图例
/// </summary>
@ -467,20 +424,6 @@ namespace Learun.Application.Web.AppApi
}
/// <summary>
/// 肋位号
/// </summary>
public class FrameList
{
/// <summary>
/// 号
/// </summary>
public string Num { get; set; }
/// <summary>
/// 值。单位是m
/// </summary>
public double Value { get; set; }
}
}

View File

@ -28,6 +28,7 @@ using System.Text.RegularExpressions;
using System.Web.Helpers;
using System.Web.Mvc;
using static Learun.Application.TwoDevelopment.ZZDT_EC.ec_enginedata_pixelService;
using static Learun.Application.TwoDevelopment.ZZDT_EC.GlobalEnum;
using SystemIO = System.IO;
namespace Learun.Application.Web.Areas.ZZDT_EC.Controllers

View File

@ -274,6 +274,7 @@
<Compile Include="ZZDT_EC\ec_operate_log\ec_operate_logIBLL.cs" />
<Compile Include="ZZDT_EC\ec_operate_log\ec_operate_logBLL.cs" />
<Compile Include="ZZDT_EC\ec_Wire_Group\signalGroup.cs" />
<Compile Include="ZZDT_EC\Frame\FrameBll.cs" />
<Compile Include="ZZDT_EC\GlobalEnum.cs" />
<Compile Include="ZZDT_EC\GlobalObject.cs" />
<Compile Include="ZZDT_EC\ec_template_catalogue\ec_template_catalogueEntity.cs" />

View File

@ -0,0 +1,64 @@
using DocumentFormat.OpenXml.Bibliography;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Learun.Application.TwoDevelopment.ZZDT_EC.Frame
{
public class FrameBll
{
/// <summary>
/// 肋位号
/// </summary>
public class FrameList
{
/// <summary>
/// 号
/// </summary>
public string Num { get; set; }
/// <summary>
/// 值。单位是m
/// </summary>
public double Value { get; set; }
}
public List<FrameList> GetFrameList(string ProjectId)
{
var ec_dataitemBLL = new ec_dataitemBLL();
var settings = new ec_projectSettingsBLL();
var FrameListFlg = settings.GetEntity(GlobalObject.projSetting_enumlist_Frame, ProjectId);
if (FrameListFlg != null)
{
List<FrameList> frameLists = new List<FrameList>();
var res = ec_dataitemBLL.GetDetailList(FrameListFlg.SettingValue, "", ProjectId, false);
if (res == null)
{
return null;// 或者 无法从数据字典中找到对应的那个下拉
}
foreach (var item in res)
{
double value;
if (double.TryParse(item.DataItemCode, out value))
{
frameLists.Add(new FrameList() { Num = item.DataItemName, Value = value });
}
}
frameLists = frameLists.OrderBy(t => t.Value).ToList();
return frameLists;
}
else
{
return null;// 或者 无法从数据字典中找到对应的那个下拉
}
}
}
}

View File

@ -246,7 +246,51 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC
//剩下的感觉都可以是set上的参数
foreach (var set in sets)
{
{
#region io匹配程度
if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && cable.PreAssignIOType.ToLower() == "digital")
{
set.IOType = GlobalEnum.IOType.DI;
}
else if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && cable.PreAssignIOType.ToLower() == "digital")
{
set.IOType = GlobalEnum.IOType.DO;
}
else if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && cable.PreAssignIOType == "4~20mA")
{
set.IOType = GlobalEnum.IOType.AI;
}
else if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && cable.PreAssignIOType == "4~20mA")
{
set.IOType = GlobalEnum.IOType.AO;
}
else if (cable.PreAssignIOType == "10v")
{
set.IOType = GlobalEnum.IOType.TenVolt;
}
else if (cable.PreAssignIOType == GlobalEnum.signalType.PT100.ToString())
{
set.IOType = GlobalEnum.IOType.PT100;
}
else if (cable.PreAssignIOType.ToUpper() == GlobalEnum.signalType.PULSE.ToString())
{
set.IOType = GlobalEnum.IOType.PULSE;
}
//下面是通讯的
else
{
}
if (IOsOnPanel.Contains(set.IOType.ToString()))
{
set.IOTypeMatch = true;
}
else
{
set.IOTypeMatch = false;
}
#endregion
var wires = Wires.Where(x => x.CableSetID == set.CableSetID);
set.Wires = wires.ToList();
}

View File

@ -129,6 +129,16 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC
#region
/// <summary>
/// 根据<see cref="PreAssignInOrOut"/> 和 <see cref="ec_CableEntity.PreAssignIOType"/> 算出来的比如4-20mA + 输入得到AI
/// </summary>
[SugarColumn(IsIgnore = true)]
public GlobalEnum.IOType IOType { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(IsIgnore = true)]
public bool IOTypeMatch { get; set; }
/// <summary>
///
/// </summary>
[SugarColumn(IsIgnore = true)]