自动分配(就近找采集箱逻辑完成)

This commit is contained in:
xingheng 2025-09-22 15:44:15 +08:00
parent b37d04a1e6
commit 2e665e9f3d
3 changed files with 113 additions and 83 deletions

View File

@ -1,4 +1,5 @@
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using DocumentFormat.OpenXml.Spreadsheet;
using Learun.Application.Organization;
using Learun.Application.TwoDevelopment.ZZDT_EC;
using Learun.Application.TwoDevelopment.ZZDT_EC.Frame;
@ -47,7 +48,7 @@ namespace Learun.Application.Web.AppApi
/// <summary>
/// 找到某一个预分配箱子 附近的某一个箱子
/// 找到某一个预分配箱子 附近的某一个箱子。且io类型能匹配上
/// <param name="curPanelId"/>
/// <param name="frameLists"/>
/// <param name="allPanel"/>
@ -55,9 +56,10 @@ namespace Learun.Application.Web.AppApi
/// <param name="IOTypeOnCable">Digital,4-20mA,10v,pt100,pulse</param>
/// </summary>
private ec_PanelEntity FindPanelNearby(string curPanelId, List<FrameBll.FrameList> frameLists, List<ec_PanelEntity> allPanel,
private ec_PanelEntity FindPanelNearby(ec_CableEntity cableObj, List<FrameBll.FrameList> frameLists, List<ec_PanelEntity> allPanel,
Dictionary<string, List<ec_enginedata_propertyEntity>> allPanelProps, string IOTypeOnCable)
{
var curPanelId = cableObj.PanelID;
double GetPanelXYDistance2Target(string panelId, double targetX, double targetY)
{
var nearPanel = allPanel.FirstOrDefault(x => x.PanelID == panelId);
@ -88,7 +90,7 @@ namespace Learun.Application.Web.AppApi
return -1;//无效的x off导致的
}
if (double.TryParse(nearPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue,
, out double YOffValue))
out double YOffValue))
{
}
@ -129,7 +131,7 @@ namespace Learun.Application.Web.AppApi
return null;//无效的x off导致的
}
if (double.TryParse(curPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue,
, out double AssignPanelYValue))
out double AssignPanelYValue))
{
}
@ -141,32 +143,48 @@ namespace Learun.Application.Web.AppApi
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)
var IOMatched = true;
var IOsOnPanel = panel.allowedIOTypes.Split(',').ToList();
//剩下的感觉都可以是set上的参数
foreach (var set in cableObj.Sets)
{
minDistance = DISTANCE; nearestPanel = panel;
}
else if (DISTANCE < minDistance && DISTANCE > 0)
{
minDistance = DISTANCE; nearestPanel = panel;
#region io匹配程度
var setNew = ec_CableBLL.SetIOMatchPanel(cableObj.PreAssignIOType, set, IOsOnPanel);
if (IOsOnPanel.Contains(setNew.IOType.ToString()))
{
setNew.IOTypeMatch = true;
}
else
{
setNew.IOTypeMatch = false; IOMatched = false;
//不匹配
break;
}
#endregion
}
#endregion
if (IOMatched)
{
//如果io匹配了再找附近的
#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())
{
case "DIGITAL":
//其他就近箱子的 allowIOTypes里有DI DO
break;
default:
break;
}
return nearestPanel;
}
@ -421,7 +439,7 @@ namespace Learun.Application.Web.AppApi
bool nearbyFound = false;
foreach (var cable in cablesNotMatchIO)
{
var nearPanel = FindPanelNearby(cable.PanelID, allFrames, allPanel, allPanelProp, cable.PreAssignIOType);
var nearPanel = FindPanelNearby(cable, allFrames, allPanel, allPanelProp, cable.PreAssignIOType);
if (nearPanel == null)
{
nearbyFound = false;

View File

@ -1,4 +1,5 @@
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using DocumentFormat.OpenXml.Spreadsheet;
using Learun.Util;
using Learun.Util.SqlSugar;
using SqlSugar;
@ -7,6 +8,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Windows;
namespace Learun.Application.TwoDevelopment.ZZDT_EC
{
@ -314,70 +316,27 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC
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 (cable.PreAssignIOType == GlobalEnum.signalType.PT100.ToString())
{
set.IOType = GlobalEnum.IOType.PT100;
}
//下面是通讯的
else
{
var setNew = SetIOMatchPanel(cable.PreAssignIOType, set, IOsOnPanel);
}
if (IOsOnPanel.Contains(set.IOType.ToString()))
if (IOsOnPanel.Contains(setNew.IOType.ToString()))
{
set.IOTypeMatch = true;
setNew.IOTypeMatch = true;
}
else
{
set.IOTypeMatch = false;
cable.IOTypesNotMatchedList.Add(set.IOType.ToString());//从电缆上就能知道哪些io是匹配补上的
setNew.IOTypeMatch = false;
cable.IOTypesNotMatchedList.Add(setNew.IOType.ToString());//从电缆上就能知道哪些io是匹配补上的
}
#endregion
var wires = Wires.Where(x => x.CableSetID == set.CableSetID);
set.Wires = wires.ToList();
var wires = Wires.Where(x => x.CableSetID == setNew.CableSetID);
setNew.Wires = wires.ToList();
cable.Sets.Add(setNew);
}
cable.Sets = sets;
//if (cable.Sets.Any(x => !x.IOTypeMatch))
//{
// cable.IOTypeMatch = true;
//}
//else
//{
// cable.IOTypeMatch = false;
//}
//cable.Sets = sets;
}
//分组
//排序
preAssignedCables = preAssignedCables.OrderBy(x => x.PreAssignIOType).ToList();
@ -397,7 +356,59 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC
else { ec_CableService.DeleteEntity(ProjectId, CableID); }
}
/// <summary>
/// 预分配的电缆上的io是否和电缆上的io能匹配
/// </summary>
/// <returns></returns>
public static ec_CableSetEntity SetIOMatchPanel(string signalOnCable, ec_CableSetEntity set, List<string> IOsOnPanel)
{
//var IOsOnPanel = panelObj.allowedIOTypes.Split(',').ToList();
//剩下的感觉都可以是set上的参数
#region io匹配程度
if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && signalOnCable.ToLower() == "digital")
{
set.IOType = GlobalEnum.IOType.DI;
}
else if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && signalOnCable.ToLower() == "digital")
{
set.IOType = GlobalEnum.IOType.DO;
}
else if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && signalOnCable == "4~20mA")
{
set.IOType = GlobalEnum.IOType.AI;
}
else if (set.PreAssignInOrOut == GlobalEnum.inOrOut..ToString() && signalOnCable == "4~20mA")
{
set.IOType = GlobalEnum.IOType.AO;
}
else if (signalOnCable == "10v")
{
set.IOType = GlobalEnum.IOType.TenVolt;
}
else if (signalOnCable == GlobalEnum.signalType.PT100.ToString())
{
set.IOType = GlobalEnum.IOType.PT100;
}
else if (signalOnCable.ToUpper() == GlobalEnum.signalType.PULSE.ToString())
{
set.IOType = GlobalEnum.IOType.PULSE;
}
else if (signalOnCable == GlobalEnum.signalType.PT100.ToString())
{
set.IOType = GlobalEnum.IOType.PT100;
}
//下面是通讯的
else
{
}
#endregion
return set;
}
/// <summary>
/// 保存实体数据(新增、修改)
/// <param name="keyValue">主键</param>

View File

@ -147,7 +147,8 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC
/// <summary>
/// From连接处的工程位号信息。同时也表达下预分配电缆panelid对应的柜子信息。
/// From连接处的工程位号信息。
/// 同时也表达下预分配电缆panelid对应的柜子信息。
/// </summary>
[SugarColumn(IsIgnore = true)]
public ec_PanelEntity ToPanel { set; get; }