diff --git a/Learun.Application.Web/AppApi/IOModuleApiController.cs b/Learun.Application.Web/AppApi/IOModuleApiController.cs index 95e49413..a7caf92b 100644 --- a/Learun.Application.Web/AppApi/IOModuleApiController.cs +++ b/Learun.Application.Web/AppApi/IOModuleApiController.cs @@ -1,4 +1,6 @@ using DocumentFormat.OpenXml.Drawing.Spreadsheet; +using DocumentFormat.OpenXml.Math; +using DocumentFormat.OpenXml.Spreadsheet; using Learun.Application.Organization; using Learun.Application.TwoDevelopment.ZZDT_EC; using Learun.Application.TwoDevelopment.ZZDT_EC.Frame; @@ -10,6 +12,10 @@ using Learun.Util.SqlSugar; using log4net.Config; using Microsoft.Practices.ObjectBuilder2; using Newtonsoft.Json; +using NPOI.POIFS.Crypt; +using NPOI.SS.Formula.Functions; +using OfficeOpenXml; +using OfficeOpenXml.Style; using Org.BouncyCastle.Bcpg.OpenPgp; using Pipelines.Sockets.Unofficial.Arenas; using SqlSugar; @@ -17,9 +23,13 @@ using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using System.Diagnostics; +using System.IO; using System.Linq; using System.Web.Http; +using System.Windows; +using System.Windows.Input; using static Learun.Application.TwoDevelopment.ZZDT_EC.IO_WorkFlowService; +using static Learun.Application.Web.Areas.ZZDT_EC.Controllers.ec_objecttypeController; namespace Learun.Application.Web.AppApi { @@ -44,10 +54,63 @@ namespace Learun.Application.Web.AppApi #endregion - - /// - /// 找到某一个预分配箱子 附近的某一个箱子 + /// 根据模板自动创建端子排 + /// + /// + /// + /// + /// + /// + private ec_PanelStripEntity CreatePanelStripByProfile2(string projId, ec_PanelEntity panelObj, int seq, GlobalEnum.IOType iOType) + { + var setTb = ProjectSugar.TableName(projId); + var allSettings = SqlSugarHelper.Db.Queryable().AS(setTb).ToList(); + allSettings = allSettings.FindAll(x => x.SettingName.StartsWith(GlobalObject.projSetting_IOCardProfile + iOType.ToString())); + //IO_CardProfile + //IO_CardProfile_DO_TermNoPerCh + //IO_CardProfile_DO_CHNoPerStrip + //IO_CardProfile_DO_ChNamePrefix + //IO_CardProfile_DO_ChNameStartIndex + var sName = GlobalObject.projSetting_IOCardProfile + iOType.ToString() + "_TermNoPerCh"; + var TermNoPerCh = allSettings.FirstOrDefault(x => x.SettingName == sName)?.SettingValue; + sName = GlobalObject.projSetting_IOCardProfile + iOType.ToString() + "_CHNoPerStrip"; + var CHNoPerStrip = allSettings.FirstOrDefault(x => x.SettingName == sName)?.SettingValue; + sName = GlobalObject.projSetting_IOCardProfile + iOType.ToString() + "_ChNamePrefix"; + var ChNamePrefix = allSettings.FirstOrDefault(x => x.SettingName == sName)?.SettingValue; + if (int.TryParse(TermNoPerCh, out int iTermNoPerCh)) + { + //err + } + if (int.TryParse(CHNoPerStrip, out int iCHNoPerStrip)) + { + //err + } + var newTs = new ec_PanelStripEntity() + { + IO_TYPE = iOType.ToString(), + PanelID = panelObj.PanelID, + Panel_Strip_Seq = seq, + StripName = "TS_" + iOType.ToString() + "_" + seq, + TagNumber = "CreatePanelStripByProfile2" + }; + newTs.Create(); + for (int i = 0; i < iCHNoPerStrip; i++) + { + var newCh = new ec_PanelChannelEntity() + { + ChannelName = ChNamePrefix + (i + 1).ToString(), + Channel_Seq = i + 1, + StripID = newTs.StripID, + + }; + newCh.Create(); + newTs.Channels.Add(newCh); + } + return newTs; + } + /// + /// 找到某一个预分配箱子 附近的某一个箱子。且io类型能匹配上 /// /// /// @@ -55,9 +118,10 @@ namespace Learun.Application.Web.AppApi /// Digital,4-20mA,10v,pt100,pulse /// - private ec_PanelEntity FindPanelNearby(string curPanelId, List frameLists, List allPanel, + private ec_PanelEntity FindPanelNearby(ec_CableEntity cableObj, List frameLists, List allPanel, Dictionary> 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 +152,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 +193,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 +205,48 @@ namespace Learun.Application.Web.AppApi foreach (var panel in allPanel.Where(x => x.PanelID != curPanelId)) { #region io + var IOMatched = true; + var IOsOnPanel = panel.allowedIOTypes.Split(',').ToList(); + //剩下的感觉都可以是set上的参数? + foreach (var set in cableObj.Sets) + { + #region 判断下io匹配程度 + var setNew = ec_CableBLL.SetIOMatchPanel(cableObj.PreAssignIOType, set, IOsOnPanel); - #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; + 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; } @@ -365,6 +445,36 @@ namespace Learun.Application.Web.AppApi } ICache redisObj = CacheFactory.CaChe(); + + /// + /// 导出分配结果 + /// + /// + /// 是否为真实结果。step2时为false,step3后为true + [HttpGet] + public void AutoAssignCable2Channel_ResExport(string projectId, bool flg) + { + var BLL = new ec_Wire_GroupBLL(); + var bytes = new byte[] { }; + try + { + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + + using (var package = new ExcelPackage())//新建 + { + var sheet = package.Workbook.Worksheets.Add("test"); + sheet.Cells[1, 1].Value = "test"; + bytes = package.GetAsByteArray(); + } + } + catch (Exception ex) + { + log4net.LogManager.GetLogger("ERROR").Error("ec_PanelChannelBLL,IOModuleExportExcel 监控系统表导出" + ex.Message + ex.StackTrace); + bytes = System.Text.Encoding.UTF8.GetBytes(ex.Message + ex.StackTrace); + } + var stream = new MemoryStream(bytes); + FileDownHelper.DownLoad(stream, $"自动分配结果{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx");//自动化平台导出excel + } /// /// 自动分配通道(点表信号自动分配)。 /// @@ -396,10 +506,22 @@ namespace Learun.Application.Web.AppApi cablesNeedAssigned = cablesNeedAssigned.Where(x => CableIds.Contains(x.CableID)).ToList(); #endregion //涉及到哪些箱子 - var allPanel = SqlSugarHelper.Db.Queryable().AS(panelTable). + List allPanel = SqlSugarHelper.Db.Queryable().AS(panelTable). InnerJoin((a, b) => a.EngineerDataID == b.EngineDataID).AS(tagTable). InnerJoin((a, b, c) => b.ObjectTypeID == c.ObjectTypeID).AS(typeTable). Where((a, b, c) => c.specialType == GlobalEnum.specialType.系统柜). + Select((a, b, c) => new ec_PanelEntity + { + allowedIOTypes = a.allowedIOTypes, + DefaultBreakerType = a.DefaultBreakerType, + EngineerDataID = a.EngineerDataID, + MaxStripNumber = a.MaxStripNumber, + ObjectTypeName = c.ObjectTypeName, + PanelID = a.PanelID, + Panel_Loc_ID = a.Panel_Loc_ID, + TagNumber = b.TagNumber, + + }). ToList();//这里要过滤一下,根据object type里的specialType,而不是所有的panel var allPanelProp = SqlSugarHelper.Db.Queryable().AS(propTable) @@ -418,27 +540,25 @@ namespace Learun.Application.Web.AppApi { //有不匹配的,但是用户允许继续 //如果选是,则在之后的自动分配过程中会自动寻找匹配的采集箱,原则上从就近的开始找,如果没有匹配的采集箱,则提示“未找到具有XX类型的采集箱,请新增后再次分配,是否取消自动分配进程?” - bool nearbyFound = false; + foreach (var cable in cablesNotMatchIO) { - 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>("IOModule_AutoAssign2Ch_" + projId, cablesNeedAssigned, CacheId.IOModule_AutoAssign2Ch); - return Fail($"在附近未找到具有{cable.PreAssignIOType}类型的采集箱,请新增后再次分配,是否取消自动分配进程?"); - //之后插件端进行选择。 - //如果不想新增,则选择否,继续自动分配,没有分配到的信号在备注上填写由于何种原因没有被分配,弹出未被分配的信号列表供查看。 - //也就是这里要等所有循环结束后才能return结果,而不是目前一个nearByFound = false时就退出了。 - } - else - { - nearbyFound = true; - } - } + var nearPanel = FindPanelNearby(cable, allFrames, allPanel, allPanelProp, cable.PreAssignIOType); + cable.AssignedPanel = nearPanel; + + } + var cableNotFoundNearPanel = cablesNotMatchIO.FindAll(x => x.AssignedPanel == null); + if (cableNotFoundNearPanel != null && cableNotFoundNearPanel.Count > 0) + { + redisObj.Remove("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch); + redisObj.Write>("IOModule_AutoAssign2Ch_" + projId, cablesNeedAssigned, CacheId.IOModule_AutoAssign2Ch); + + return Fail($"在电缆{string.Join(",", cableNotFoundNearPanel.Select(x => x.TagNumber))}附近未找到具有IO类型匹配的采集箱,请新增后再次分配,是否取消自动分配进程?"); + //之后插件端进行选择。 + //如果不想新增,则选择否,继续自动分配,没有分配到的信号在备注上填写由于何种原因没有被分配,弹出未被分配的信号列表供查看。 + //也就是这里要等所有循环结束后才能return结果,而不是目前一个nearByFound = false时就退出了。 + } } @@ -483,63 +603,664 @@ namespace Learun.Application.Web.AppApi ICache redisObj = CacheFactory.CaChe(); var cablesNeedAssigned = redisObj.Read>("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch); - //#region 1.2 开始自动分配(不保存到数据库) - #region 先分组 1.2.2 - var cablesGrouped = cablesNeedAssigned.OrderBy(x => x.PanelID).ThenBy(x => x.PreAssignIOType).ThenBy(x => x.System).ToList(); - foreach (var item in cablesNeedAssigned) + + var signalTb = ProjectSugar.TableName(projId); + var allSignals = SqlSugarHelper.Db.Queryable().AS(signalTb).ToList(); + + var connTb = ProjectSugar.TableName(projId); + var termTb = ProjectSugar.TableName(projId); + var allConnedTerms = SqlSugarHelper.Db.Queryable().AS(connTb) + .InnerJoin((a, b) => a.TermID == b.TermID).AS(termTb) + .Select((a, b) => b.ChannelID).Distinct().ToList(); + + //包括2部分,1是已经被信号占用的通道,2是已经被接线端子占用的通道 + var allUsedCHBySignalOrSet = allSignals.Where(x => !string.IsNullOrEmpty(x.ChannelID)).Select(x => x.ChannelID).Distinct().ToList(); + allUsedCHBySignalOrSet.AddRange(allConnedTerms); + //??这里有问题。通道是否被占用,需要看signal和set双重(在io分配界面) + //1. 信号有, 电缆set有,占了 + //2.信号no,电缆set有,占了 + //3.信号有,电缆setno,没占 + //4.信号no,电缆setno,没占 + + //1.2 流程图 分组原则为同一信号类型、同一系统的为一组 + var cablesGrouped = cablesNeedAssigned.OrderBy(x => x.AssignedPanel?.PanelID).ThenBy(x => x.PreAssignIOType).ThenBy(x => x.System).ToList(); + var cNotPanel = cablesGrouped.FindAll(x => x.AssignedPanel == null); + cablesGrouped = cablesNeedAssigned.FindAll(x => x.AssignedPanel != null); + //cablesGrouped = cablesGrouped.Where(x => x.Sets != null && x.Sets.Count() > 0 && x.AssignedPanel != null).ToList();//过滤掉没有set的,或者没有找到箱子的 + //cablesGrouped = cablesGrouped.Where(x => x.Sets.Where(xx => !string.IsNullOrEmpty(xx.PreAssignGroup_Desc)).Count() > 0).ToList();//过滤掉set没有分配信号的 + + + var allPanelIds = cablesGrouped.Select(x => x.AssignedPanel).Select(x => x.PanelID).Distinct().ToList(); + var stripBll = new ec_PanelStripBLL(); + var allStrips = stripBll.GetList("{ProjectId:\"" + projId + "\"}", OnlySelf: false) + .Where(x => allPanelIds.Contains(x.PanelID)) + .GroupBy(x => x.PanelID) + .ToDictionary(x => x.Key, x => x.ToList());//带出strip下的channel + + + foreach (var c in cNotPanel) { - if (item.Sets == null || item.Sets.Count() == 0) + foreach (var set in c.Sets) { - //也归类到未成功 + set.ConnectionInfo = "err:没有找到合适的采集箱"; } - else + } + foreach (var curPanelId in allPanelIds) + { + int newTSSeq = 10001; + + var existedStrips = allStrips[curPanelId];//已经存在的所有模块 + var cablesOnThisPanel = cablesGrouped.Where(x => x.AssignedPanel.PanelID == curPanelId).ToList(); + if (cablesOnThisPanel == null || cablesOnThisPanel.Count == 0) continue;//next panel + var lastUsedStrip = (ec_PanelStripEntity)null; + foreach (var cable in cablesOnThisPanel) { - foreach (var set in item.Sets) + //1.2.2 分组原则为同一信号类型、同一系统的为一组,系统属性从电缆的from端上的设备中取设备的系统,同组的优先放到同一个箱子的同一个模块里面, + //如果一组放完后发现模块还有多余的通道可以放则下一个系统继续从这个模块开始分配。 + //???总感觉这句话,总结后:可以无脑用上一个模块,直到模块满了再用下一个模块。 + #region 判断是否是同一组 + //bool sameGroup = true; + //if (lastCableSystemAndIOType != cable.System + cable.PreAssignIOType) + //{ + // sameGroup = false;//换组了 + //} + #endregion + //1.2 流程图 读取有提前选好箱子的信号 + var setsSpared = cable.Sets.Where(x => string.IsNullOrEmpty(x.PreAssignGroup_Desc) || string.IsNullOrEmpty(x.PreAssignInOrOut)).ToList(); + var setsIn = cable.Sets.Where(x => !string.IsNullOrEmpty(x.PreAssignGroup_Desc) && x.PreAssignInOrOut == SWS.Share.Enum.inOrOut.输入.ToString()).ToList(); + var setsOut = cable.Sets.Where(x => !string.IsNullOrEmpty(x.PreAssignGroup_Desc) && x.PreAssignInOrOut == SWS.Share.Enum.inOrOut.输出.ToString()).ToList(); + + #region 1.2.4 同一根电缆,如果带公共端的报警信号,必须接到一个模块里面 + if (cable.PreAssignIOType.ToLower() == GlobalEnum.signalType.Digital.ToString().ToLower()) { - set.ConnectionInfo = $"采集箱:{item.ToPanel.TagNumber}/模块(端子排):{"test_ts"}/通道:{"test_ch"}"; - set.AssignedTerms = set.Wires.Select(x => x.PreAssignChannelTermNo).ToList();// new List() { "test_term1", "test_term2" };//假数据 + + if (setsIn.Count > 0 && setsOut.Count > 0) + { + foreach (var set in setsIn) + { + set.ConnectionInfo = "err:digital类型的电缆,无法同时配置输入和输出。"; + } + foreach (var set in setsOut) + { + set.ConnectionInfo = "err:digital类型的电缆,无法同时配置输入和输出。"; + } + continue; + //from cjj 25 09 23 wechat:一根电缆可能会出现既有输入也有输出,如果碰到就放到两个端子排里面,公共端不会出现一个输出,一个输入的 + } + } + #endregion + + #region inputNew + if (setsIn.Count > 0) + { + var resIn = AutoAssignCore(GlobalEnum.inOrOut.输入, setsIn); + } + + #endregion + #region output + else if (setsOut.Count > 0) + { + var resOut = AutoAssignCore(GlobalEnum.inOrOut.输出, setsOut); + + } + else + { + //all zero + foreach (var set in cable.Sets.Where(x => !setsSpared.Select(c => c.CableSetID).Contains(x.CableSetID))) + { + set.ConnectionInfo = "err:信号描述为空"; + } + foreach (var set in setsSpared) + { + set.ConnectionInfo = "err:电缆无任一set被分配"; + } + } + + + #endregion + + //in 和 out都会执行这个 + bool AutoAssignCore(GlobalEnum.inOrOut inOrOut, List sets) + { + GlobalEnum.IOType ioTypeOnC = default; + switch (cable.PreAssignIOType.ToLower()) + { + case "digital": + //数字量 + if (inOrOut == GlobalEnum.inOrOut.输入) + { + ioTypeOnC = GlobalEnum.IOType.DI; + } + else + { + ioTypeOnC = GlobalEnum.IOType.DO; + } + break; + case "4~20ma": + //模拟量4-20mA + if (inOrOut == GlobalEnum.inOrOut.输入) + { + ioTypeOnC = GlobalEnum.IOType.AI; + } + else + { + ioTypeOnC = GlobalEnum.IOType.AO; + } + + break; + case "10v": + ioTypeOnC = GlobalEnum.IOType.TenVolt; + break; + case "pt100": + ioTypeOnC = GlobalEnum.IOType.PT100; + break; + case "pulse": + ioTypeOnC = GlobalEnum.IOType.PULSE; + break; + default: + //通讯类 485 422啥的 + return false; + } + + + var matchedStrips = existedStrips.Where(x => x.IO_TYPE == ioTypeOnC.ToString()).ToList();//这个电缆下符合的模块 + if (matchedStrips != null && lastUsedStrip != null && lastUsedStrip.IO_TYPE == ioTypeOnC.ToString()) + { + //1.2.2 优先使用上一个模块,直到模块满了再用下一个模块。 + matchedStrips.Remove(lastUsedStrip); + matchedStrips.Insert(0, lastUsedStrip);//??????? + } + + if (matchedStrips == null || matchedStrips.Count == 0) + { + #region NewTS + + //1.2 流程图 根据信号数里自动新建端子排,端子排通道数里根据箱子模板中的默认值获得 + var newTS = CreatePanelStripByProfile2(projId, cable.AssignedPanel, newTSSeq++, ioTypeOnC); + + matchedStrips.Add(newTS); + + #endregion + + } + + string PanelName = cable.AssignedPanel.TagNumber;//当前电缆预分配的箱子名称 + if (sets.Count == 0) return false; + + + //1.2 流程图 箱子里是否已经存在端子排(io匹配) + List usedChs = new List(); + List notUsedChs = new List(); + + #region 1.2 流程图 按规则先放几个信号进去(放不下就延到下一个模块) + //if (cable.Sets.Count > 10) + //{ + // //另外如果电缆对数大于10对,即像12 * 2 * 0.75这种,无论它预分配了多少根电缆对,永远预留4个以下的空白通道。意思就是一个模块里面够4个或4个以上空白通道就留4个空白通道,如果不够4个就留4个以下即可。 + // #region FindNextAvailableTS(可能多个) + // //还分2种情况判断模块是否符合: + // //case1,. 占满可用通道后,还剩至少一个预分配的set和spared的set。 //这种时候要spared不用考虑 + // //case2,. 占满可用通道后(或者没占满通道,预分配set已经没了),只剩下spared的set。 //这种时候要确保spared也能放下 + + // bool NeedNextTS = false; + // do + // { + // #region FindNextAvailableTS + // var availableTS = new List(); + // foreach (var TS in matchedStrips) + // { + // var allCh = TS.Channels; + // //被占用的(wt里有或者信号里或有),或者被锁定的,都算占用 + // usedChs = allCh.Where(x => allUsedCHBySignalOrSet.Contains(x.ChannelID) || x.lock_flg == 1).ToList(); + // notUsedChs = allCh.Where(x => !usedChs.Select(c => c.ChannelID).Contains(x.ChannelID)).ToList(); + // if (notUsedChs.Count < sets.Count) + // { + // //case1,能顺利接完,set还有多 + // //这种时候不需要考虑spared + // } + // else + // { + // //case2,占满可用通道后(或者没占满通道,预分配set已经没了),只剩下spared的set + // //想办法留出4个 + // //这种时候要确保spared也能放下 + // if (notUsedChs.Count < sets.Count + setsSpared.Count) + // { + // //放不下,换下一个模块 + // continue; + // } + // var sparedSetFor10 = notUsedChs.Count - sets.Count - setsSpared.Count;//16-9-5=2 + // if (sparedSetFor10 > 4) + // { + // //固定流出后面4个,相当于不要了 + // var last4 = allCh.Skip(allCh.Count - 4).ToList(); + // usedChs = allCh.Take(allCh.Count - 4).Where(x => allUsedCHBySignalOrSet.Contains(x.ChannelID) || x.lock_flg == 1).ToList(); + // usedChs.AddRange(last4); + // notUsedChs = allCh.Take(allCh.Count - 4).Where(x => !usedChs.Select(c => c.ChannelID).Contains(x.ChannelID)).ToList(); + // } + // else + // { + // //不够4个,就留多少是多少 + // var lastN = allCh.Skip(allCh.Count - sparedSetFor10).ToList(); + // usedChs = allCh.Take(allCh.Count - sparedSetFor10).Where(x => allUsedCHBySignalOrSet.Contains(x.ChannelID) || x.lock_flg == 1).ToList(); + // usedChs.AddRange(lastN); + // notUsedChs = allCh.Take(allCh.Count - sparedSetFor10).Where(x => !usedChs.Select(c => c.ChannelID).Contains(x.ChannelID)).ToList(); + // } + // } + // //1.2 流程图 空的通道数够不够 + // double sparedRate = notUsedChs.Count * 1.0 / allCh.Count * 1.0; + // if (sparedRate < 0.05) + // { + // //没有空闲通道 next + // //或者空闲通道不够放下这个电缆的所有set + // } + // else + // { + // TS.Channels = allCh.OrderBy(X => X.Channel_Seq).ToList();//不能像之前一样过滤掉,否则下一个电缆进来时,总数就不对了。 + + // TS.ChannelsSpared = notUsedChs.Count; + // TS.ChannelsUsed = usedChs.Count; + // availableTS.Add(TS);//所有5%以上空闲通道的模块 + // break; + // } + + + // } + // #endregion + // #region NewTS + // if (availableTS.Count() == 0) + // { + // //1.2 流程图 根据信号数里自动新建端子排,端子排通道数里根据箱子模板中的默认值获得 + // var newTS = CreatePanelStripByProfile2(projId, cable.AssignedPanel, newTSSeq++, ioTypeOnC); + // //matchedStrips.Add(newTS); + // var allCh = newTS.Channels; + // notUsedChs = newTS.Channels.ToList(); + // newTS.ChannelsSpared = notUsedChs.Count; + // newTS.ChannelsUsed = 0; + // usedChs = new List();//新建的没有被占用的 + // availableTS.Add(newTS); + + // if (notUsedChs.Count < sets.Count) + // { + // //case1,能顺利接完,set还有多 + // //这种时候不需要考虑spared + // } + // else + // { + // //case2,占满可用通道后(或者没占满通道,预分配set已经没了),只剩下spared的set + // //想办法留出4个 + // //这种时候要确保spared也能放下 + // if (notUsedChs.Count < sets.Count + setsSpared.Count) + // { + // //放不下,换下一个模块 + // continue; + // } + // var sparedSetFor10 = notUsedChs.Count - sets.Count - setsSpared.Count;//16-9-5=2 + // if (sparedSetFor10 > 4) + // { + // //固定流出后面4个,相当于不要了 + // var last4 = allCh.Skip(allCh.Count - 4).ToList(); + // usedChs = allCh.Take(allCh.Count - 4).Where(x => allUsedCHBySignalOrSet.Contains(x.ChannelID) || x.lock_flg == 1).ToList(); + // usedChs.AddRange(last4); + // notUsedChs = allCh.Take(allCh.Count - 4).Where(x => !usedChs.Select(c => c.ChannelID).Contains(x.ChannelID)).ToList(); + // } + // else + // { + // //不够4个,就留多少是多少 + // var lastN = allCh.Skip(allCh.Count - sparedSetFor10).ToList(); + // usedChs = allCh.Take(allCh.Count - sparedSetFor10).Where(x => allUsedCHBySignalOrSet.Contains(x.ChannelID) || x.lock_flg == 1).ToList(); + // usedChs.AddRange(lastN); + // notUsedChs = allCh.Take(allCh.Count - sparedSetFor10).Where(x => !usedChs.Select(c => c.ChannelID).Contains(x.ChannelID)).ToList(); + // } + // } + // } + // #endregion + // lastUsedStrip = availableTS.Last(); + + // if (notUsedChs.Count < sets.Count) + // { + // //case1,分配完后,还有多的set和可能的spared + // //先这部分填完 + // //到5%为止的数量 + // var countOnThisTS = Math.Round(0.5 + notUsedChs.Count * 0.95); + // for (int i = 0; i < countOnThisTS; i++) + // { + // var set = sets[i]; + // var ch = notUsedChs[i]; + // if (lastUsedStrip.TagNumber == "CreatePanelStripByProfile2") + // { + // set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(自动创建){lastUsedStrip.StripName}/通道:{ch.ChannelName}"; + // } + // else + // { + // set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(原本存在){lastUsedStrip.StripName}/通道:{ch.ChannelName}"; + // } + // ch.FakeGroupDesc = set.PreAssignGroup_Desc; + // ch.FakeSignalType = set.IOType.ToString(); + // ch.lock_flg = 1; + // set.IsConned = true; + // //更新全局已使用通道 + // allUsedCHBySignalOrSet.Add(ch.ChannelID); + + // } + // //set会剩 + // NeedNextTS = true; + // } + // else + // { + // //case2,分配完后,没有多的set了,可能还有spared + // //上面已经判断过了,确保spared也是够的 + // var countMin = Math.Min(sets.Count, notUsedChs.Count); + // for (int i = 0; i < countMin; i++) + // { + // var set = sets[i]; + // var ch = notUsedChs[i]; + // if (lastUsedStrip.TagNumber == "CreatePanelStripByProfile2") + // { + // set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(自动创建){lastUsedStrip.StripName}/通道:{ch.ChannelName}"; + // } + // else + // { + // set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(原本存在){lastUsedStrip.StripName}/通道:{ch.ChannelName}"; + // } + // ch.FakeGroupDesc = set.PreAssignGroup_Desc; + // ch.FakeSignalType = set.IOType.ToString(); + // ch.lock_flg = 1; + // set.IsConned = true; + // //更新全局已使用通道 + // allUsedCHBySignalOrSet.Add(ch.ChannelID); + + // } + // #region spared + // for (int i = 0; i < setsSpared.Count(); i++) + // { + // var set = setsSpared[i]; + // var ch = notUsedChs[countMin + i]; + // if (lastUsedStrip.TagNumber == "CreatePanelStripByProfile2") + // { + // set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(自动创建){lastUsedStrip.StripName}/通道:{ch.ChannelName}/冗余"; + // } + // else + // { + // set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(原本存在){lastUsedStrip.StripName}/通道:{ch.ChannelName}/冗余"; + // } + // ch.FakeGroupDesc = "预留"; + // ch.lock_flg = 1; + // //更新全局已使用通道 + // allUsedCHBySignalOrSet.Add(ch.ChannelID); + // } + // NeedNextTS = false; + // #endregion + // } + // sets = sets.Where(x => !x.IsConned).ToList();//移除已经分配过的set + // } while (NeedNextTS); + + // #endregion + + //} + //else + //{ + //5%的空白通道 + #region FindNextAvailableTS(可能多个) + //还分2种情况判断模块是否符合: + //case1,. 占满可用通道后,还剩至少一个预分配的set和spared的set。 //这种时候要spared不用考虑 + //case2,. 占满可用通道后(或者没占满通道,预分配set已经没了),只剩下spared的set。 //这种时候要确保spared也能放下 + //case3, 刚好,只有spared可能多 + bool NeedNextTS = false; + + #region FindNextAvailableTS + int idx = 0; + while (idx < matchedStrips.Count) + { + NeedNextTS = false; + var TS = matchedStrips[idx]; + var allCh = TS.Channels; + var allChCount = allCh.Count; + if (allChCount == 0) + { + NeedNextTS = true; + //同时又是最后一个了 + if (idx == matchedStrips.Count - 1) + { + var newTS = CreatePanelStripByProfile2(projId, cable.AssignedPanel, newTSSeq++, ioTypeOnC); + if (newTS.Channels.Count() < setsSpared.Count + 1)//1代表至少要放一个set + { + //有问题了 panel的io模板,估计会导致无限循环了 + break; + } + matchedStrips.Add(newTS); + } + idx++; continue;//本模块没有一个ch + } + //被占用的(wt里有或者信号里或有),或者被锁定的,都算占用 + usedChs = allCh.Where(x => allUsedCHBySignalOrSet.Contains(x.ChannelID) || x.lock_flg == 1).ToList(); + notUsedChs = allCh.Where(x => !usedChs.Select(c => c.ChannelID).Contains(x.ChannelID)).ToList(); + + var ChNeedConn = 0; + var SparedNeedConn = 0; + + if (cable.CableClass.ToLower() == SWS.Share.Enum.cableClass.homerun.ToString()) + { + //1.2.3(2)如果模块是通讯信号(像RS485这种就是通讯信号),则不用管预留空白通道这个事情,看到有空的通道就放。 + + if (allChCount < sets.Count) + { + //case1,能顺利接完,set还有多,还要再do循环一次,多余的set和spared都要放到下一个模块 + NeedNextTS = true; + ChNeedConn = allChCount; SparedNeedConn = 0; + } + else if (allChCount == sets.Count) + { + //case3,刚好,只有spared可能多 + ChNeedConn = allChCount; + SparedNeedConn = 0; //homerun不用考虑预留一个set去配合后续的spared + } + else + { + ChNeedConn = sets.Count; + SparedNeedConn = 0; + } + } + else + { + //1.2 流程图 空的通道数够不够 + double sparedRate = notUsedChs.Count * 1.0 / allChCount * 1.0; + if (sparedRate < 0.05) + { + NeedNextTS = true; + //同时又是最后一个了 + if (idx == matchedStrips.Count - 1) + { + var newTS = CreatePanelStripByProfile2(projId, cable.AssignedPanel, newTSSeq++, ioTypeOnC); + if (newTS.Channels.Count() < setsSpared.Count + 1)//1代表至少要放一个set + { + //有问题了 panel的io模板,估计会导致无限循环了 + break; + } + matchedStrips.Add(newTS); + } + idx++; continue;//本模块可用的模块小于5% + } + //没有空闲通道 next + //或者空闲通道不够放下这个电缆的所有set + //算一下5%是多少个通道 + var trueAvailableChs = notUsedChs.Count - (allChCount - FindMaxNumberChannel(allChCount));//真正能用的(没接过的,然后去掉5%) + + if (trueAvailableChs < sets.Count) + { + //case1,能顺利接完,set还有多,还要再do循环一次,多余的set和spared都要放到下一个模块 + NeedNextTS = true; + ChNeedConn = trueAvailableChs; SparedNeedConn = 0; + } + else if (trueAvailableChs == sets.Count) + { + //case3,刚好,只有spared可能多 + if (setsSpared.Count > 0) + { + //自己的感觉(非客户word需求里的原话):spared不能自己单独占用一个模块 + NeedNextTS = true; + ChNeedConn = trueAvailableChs - 1;//留一个给spared + SparedNeedConn = 0; + } + else + { + ChNeedConn = trueAvailableChs; SparedNeedConn = 0; + } + + } + else + { + //maxCh > sets.Count + //case2,占满可用通道后(或者没占满通道,预分配set已经没了),只剩下spared的set + if (setsSpared.Count == 0) + { + //ok + ChNeedConn = sets.Count; SparedNeedConn = 0; + } + //这种时候要确保spared也能放下 + else if (trueAvailableChs < sets.Count + setsSpared.Count) + { + //自己的感觉(非客户word需求里的原话):spared不能自己单独占用一个模块 + ChNeedConn = sets.Count - 1;//留一个给spared + NeedNextTS = true; + SparedNeedConn = 0; + } + else + { + //ok,set和spared都能放下 + ChNeedConn = sets.Count; + SparedNeedConn = setsSpared.Count; + } + } + } + + + //到这里,说明本模块至少都是可用的 + + TS.Channels = allCh.OrderBy(X => X.Channel_Seq).ToList();//不能像之前一样过滤掉,否则下一个电缆进来时,总数就不对了。 + + lastUsedStrip = TS; + + + #region conn + + for (int i = 0; i < ChNeedConn; i++) + { + var set = sets[i]; + var ch = notUsedChs[i]; + if (lastUsedStrip.TagNumber == "CreatePanelStripByProfile2") + { + set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(自动创建){lastUsedStrip.StripName}/通道:{ch.ChannelName}"; + } + else + { + set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(原本存在){lastUsedStrip.StripName}/通道:{ch.ChannelName}"; + } + ch.FakeGroupDesc = set.PreAssignGroup_Desc; + ch.FakeSignalType = set.IOType.ToString(); + ch.lock_flg = 1; + set.IsConned = true; + //更新全局已使用通道 + allUsedCHBySignalOrSet.Add(ch.ChannelID); + + } + #endregion + #region spared + for (int i = 0; i < SparedNeedConn; i++) + { + var set = setsSpared[i]; + var ch = notUsedChs[ChNeedConn + i]; + if (lastUsedStrip.TagNumber == "CreatePanelStripByProfile2") + { + set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(自动创建){lastUsedStrip.StripName}/通道:{ch.ChannelName}/冗余"; + } + else + { + set.ConnectionInfo = $"采集箱:{PanelName}/模块(端子排):(原本存在){lastUsedStrip.StripName}/通道:{ch.ChannelName}/冗余"; + } + ch.lock_flg = 1; + //更新全局已使用通道 + allUsedCHBySignalOrSet.Add(ch.ChannelID); + } + + #endregion + //shi否要继续 + TS.ChannelsSpared = notUsedChs.Where(x => x.lock_flg != 1).Count(); + TS.ChannelsUsed = allChCount - TS.ChannelsSpared;// usedChs.Count + (notUsedChs.Where(x => x.lock_flg == 1).Count()); + if (NeedNextTS) + { + sets = sets.Where(x => !x.IsConned ?? false).ToList();//移除已经分配过的set + //同时又是最后一个了 + if (idx == matchedStrips.Count - 1) + { + var newTS = CreatePanelStripByProfile2(projId, cable.AssignedPanel, newTSSeq++, ioTypeOnC); + if (newTS.Channels.Count() < setsSpared.Count + 1)//1代表至少要放一个set + { + //有问题了 panel的io模板,估计会导致无限循环了 + break; + } + matchedStrips.Add(newTS); + } + idx++; continue;// 需要下一个模块接着放本电缆 + // 手动递增索引,避免无限循环 + } + else + { + break; + } + } + #endregion + + + #endregion + + //} + + + + + + + #endregion + + + return true; + } + } } - //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(cablesNeedAssigned); } + /// + /// 找到满足5%空闲通道的最大数 + /// + /// 模块的所有通道数 + /// + /// + /// + static int FindMaxNumberChannel(int ChCount) + { + if (ChCount < 1) + { + throw new ArgumentException("模块数量必须大于等于1", nameof(ChCount)); + } + + // 从A-1开始向下寻找 + for (int i = 0; i < ChCount; i++) + { + // 检查是否大于5% + if ((double)i / ChCount < 0.05 && (double)(i + 1) / ChCount > 0.05) + { + return ChCount - i; + } + } + + return ChCount; + } /// /// 根据step2的预分配结果,进行实际的分配,修改数据库。 @@ -732,9 +1453,8 @@ namespace Learun.Application.Web.AppApi } } /// - /// 通过预设模式,批量创建端子排 通道 端子 - /// - /// + /// 通过预设模式,批量创建端子排 通道 端子。此时strip数里 set数里已经根据profile给定好了。 + /// /// [HttpPost] [HandlerApiLogin(FilterMode.Enforce)] diff --git a/Learun.Application.Web/AppApi/ObjectTypeApiController.cs b/Learun.Application.Web/AppApi/ObjectTypeApiController.cs index 8fe7effb..7aa15d4a 100644 --- a/Learun.Application.Web/AppApi/ObjectTypeApiController.cs +++ b/Learun.Application.Web/AppApi/ObjectTypeApiController.cs @@ -631,10 +631,17 @@ namespace Learun.Application.Web.AppApi //每个位号的属性信息 foreach (var tag in objectType.tags) { - if (userDict.TryGetValue(tag.CreateUserID, out string createUserName)) + if (!string.IsNullOrEmpty(tag.CreateUserID)) { - tag.CreateUserName = createUserName;// 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; + } + } + else + { + tag.CreateUserName = string.Empty; } tag.EngineDataProperty = tagPropDictByTag[tag.EngineDataID];// tagPropAll.Where(x => x.EngineDataID == tag.EngineDataID).ToList(); diff --git a/Learun.Application.Web/AppApi/PlotLayoutApiController.cs b/Learun.Application.Web/AppApi/PlotLayoutApiController.cs index e219c15f..9755394b 100644 --- a/Learun.Application.Web/AppApi/PlotLayoutApiController.cs +++ b/Learun.Application.Web/AppApi/PlotLayoutApiController.cs @@ -61,11 +61,17 @@ namespace Learun.Application.Web.AppApi { return Fail("项目数据字典中,没有找到【肋位号】的下拉项中。");// 或者 无法从数据字典中找到对应的那个下拉 } + ec_dataitemBLL ec_DataitemBLL = new ec_dataitemBLL(); + var roomLists = ec_DataitemBLL.GetDetailList("RoomNo", "", ProjectId, false); + if (roomLists == null) + { + return Fail("项目数据字典中,没有找到【房间号】的下拉项中。");// 或者 无法从数据字典中找到对应的那个下拉 + } #endregion var pointsOnDwg = SqlSugarHelper.Db.Queryable().AS(pixelTbName). - Where(x => x.DrawingFileID == drawingId).ToList(); + Where(x => x.DrawingFileID == drawingId && x.DeleteFlg==0).ToList(); var pointTags = SqlSugarHelper.Db.Queryable().AS(tagTbName). Where(x => pointsOnDwg.Select(y => y.EngineDataID).Distinct().Contains(x.EngineDataID) && x.ObjectTypeID == pointType.ObjectTypeID).ToList(); @@ -85,10 +91,17 @@ namespace Learun.Application.Web.AppApi { Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN + } + var Prop_Room = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Room)?.PropertyValue; + if (Prop_Room != null) + { + Prop_Room = Prop_Room.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN + } var matchedFrame = frameLists.FirstOrDefault(X => X.Num == Prop_Frame); - if (matchedFrame == null) + var matchedRoom = roomLists.FirstOrDefault(X => X.DataItemName == Prop_Room); + if (matchedFrame == null && matchedRoom == null) { //没有 //无效的基点 @@ -104,12 +117,22 @@ namespace Learun.Application.Web.AppApi res.Add(layoutTagInvalid); continue; } - var xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value; - if (xValue < 400) + double xValue = 0 ; + if (matchedFrame != null) { - // 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。 - xValue = 1000 * xValue; // 转成mm + xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value; + if (xValue < 400) + { + // 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。 + xValue = 1000 * xValue; // 转成mm + } } + string strRoom = string.Empty; + if (matchedRoom != null) + { + strRoom = matchedRoom.DataItemName; + } + 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 DECK = tagProps.FirstOrDefault(x => x.PropertyName == "甲板号")?.PropertyValue; @@ -128,9 +151,10 @@ namespace Learun.Application.Web.AppApi YOff = Prop_YOff, deck = DECK, area = AREA, - Scale = BasePointProp_scale == null ? 1 : (double.TryParse(BasePointProp_scale.PropertyValue, out double scale) ? scale : 1) + Scale = BasePointProp_scale == null ? 1 : (double.TryParse(BasePointProp_scale.PropertyValue, out double scale) ? scale : 1), + RoomNo = strRoom }; - + layoutTag.Scale = 1.0 / layoutTag.Scale; // 这里的比例是放大多少倍,所以取倒数。 @@ -138,12 +162,12 @@ namespace Learun.Application.Web.AppApi } // 找出area和deck列组合重复的行 var duplicateGroups = res - .GroupBy(r => new { r.area, r.deck }) + .GroupBy(r => new { r.area, r.deck, r.RoomNo }) .Where(g => g.Count() > 1) .ToList(); if (duplicateGroups.Any()) { - return Fail("该图纸上有区域和甲板信息重复的基点存在。"); + return Fail("该图纸上有甲板、房间号信息重复的基点存在。"); } //这里要考虑下拉列表 带 ||的问题 @@ -181,7 +205,7 @@ namespace Learun.Application.Web.AppApi { #region 每个基点关联的设备 //甲板 区域都和基点一致的设备 - var DeckMatchedTagIds = EquipPropAll.Where(x => x.PropertyName == "甲板号" && x.PropertyValue == basePoint.deck).Select(X => X.EngineDataID).ToList(); + var DeckMatchedTagIds = EquipPropAll.Where(x => x.PropertyName == "甲板号" && (x.PropertyValue?.Split(new[] { "||" }, StringSplitOptions.None)[0] == basePoint.deck)).Select(X => X.EngineDataID).ToList(); //var AreaMatchedTagIds = EquipPropAll.Where(x => x.PropertyName == "区域" && x.PropertyValue == basePoint.area).Select(X => X.EngineDataID).ToList(); //#task 9542 var matchPointTagIds = DeckMatchedTagIds;//.Intersect(AreaMatchedTagIds).ToList(); @@ -195,8 +219,14 @@ namespace Learun.Application.Web.AppApi { Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN } + var Prop_RoomNo = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Room)?.PropertyValue; + if (Prop_RoomNo != null) + { + Prop_RoomNo = Prop_RoomNo.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN + } var matchedFrame = frameLists.FirstOrDefault(X => X.Num == Prop_Frame); - if (matchedFrame == null) + var matchedRoom = roomLists.FirstOrDefault(x => x.DataItemName == Prop_RoomNo); + if (matchedFrame == null && matchedRoom == null) { var layoutTagInfoInvalid = new layoutTagInfoBrief() { @@ -208,11 +238,20 @@ namespace Learun.Application.Web.AppApi basePoint.Tags.Add(layoutTagInfoInvalid); continue; } - var xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value; - if (xValue < 400) + double xValue = 0; + if (matchedFrame != null) { - // 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。 - xValue = 1000 * xValue; // 转成mm + xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value; + if (xValue < 400) + { + // 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。 + xValue = 1000 * xValue; // 转成mm + } + } + string strRoom = string.Empty; + if (matchedRoom != null) + { + strRoom = matchedRoom.DataItemName; } var Prop_FrameOff = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue; var Prop_YOff = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue; @@ -309,7 +348,8 @@ namespace Learun.Application.Web.AppApi YOff = Prop_YOff, deck = basePoint.deck, area = basePoint.area, - Scale = basePoint.Scale + Scale = basePoint.Scale, + RoomNo = strRoom }; basePoint.Tags.Add(layoutTagInfo); } diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/GlobalObject.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/GlobalObject.cs index ba3fc7f8..0da8373d 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/GlobalObject.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/GlobalObject.cs @@ -80,6 +80,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC public const string propName_FrameOff = "肋位号偏移量(mm)"; public const string propName_YOff = "纵骨偏移量(mm)"; public const string propName_TagNumber = "TagNumber"; + public const string propName_Room = "房间号"; #endregion #region projSetting diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableBLL.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableBLL.cs index 46cc3663..8c3d554e 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableBLL.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableBLL.cs @@ -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 { @@ -307,77 +309,34 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC - cable.ToPanel = panelObj;//暂用一下topanel属性,相当于电缆预分配的采集箱背后的Panel对象。 + cable.AssignedPanel = panelObj; var IOsOnPanel = panelObj.allowedIOTypes.Split(',').ToList(); //剩下的感觉都可以是set上的参数? foreach (var set in sets) { #region 判断下io匹配程度 - if (set.PreAssignInOrOut == GlobalEnum.inOrOut.输入.ToString() && cable.PreAssignIOType.ToLower() == "digital") + var setNew = SetIOMatchPanel(cable.PreAssignIOType, set, IOsOnPanel); + + if (IOsOnPanel.Contains(setNew.IOType.ToString())) { - 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 - { - - } - - if (IOsOnPanel.Contains(set.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); } } + /// + /// 预分配的电缆上的io,是否和电缆上的io能匹配 + /// + /// + public static ec_CableSetEntity SetIOMatchPanel(string signalOnCable, ec_CableSetEntity set, List 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; + } /// /// 保存实体数据(新增、修改) /// 主键 diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableEntity.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableEntity.cs index bea6c0f0..d66ffd38 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableEntity.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableEntity.cs @@ -87,6 +87,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC } + /// /// 编辑调用 /// @@ -109,7 +110,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC /// /// [SugarColumn(IsIgnore = true)] - public List Sets { set; get; } + public List Sets { set; get; } = new List(); /// /// 平行电缆数据 @@ -147,12 +148,15 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC /// - /// From连接处的工程位号信息。同时,也表达下预分配电缆panelid对应的柜子信息。 + /// From连接处的工程位号信息。 /// [SugarColumn(IsIgnore = true)] public ec_PanelEntity ToPanel { set; get; } - - + /// + /// 根据算出来的实际分配的箱子,当然也能和panelid不同,而是就近的另外一个采集箱 + /// + [SugarColumn(IsIgnore = true)] + public ec_PanelEntity AssignedPanel { set; get; } #endregion } } diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableSetEntity.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableSetEntity.cs index a91e4334..caf8e3f5 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableSetEntity.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_cable/ec_CableSetEntity.cs @@ -148,7 +148,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC /// 是否被连接 /// [SugarColumn(IsIgnore = true)] - public bool? IsConned { set; get; } + public bool? IsConned { set; get; } = false; /// /// 当前这个set的连接情况 @@ -168,8 +168,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC #endregion public ec_CableSetEntity() - { - IsConned = null; + { } } } diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_drawing_file/ec_drawing_fileBLL.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_drawing_file/ec_drawing_fileBLL.cs index fb143fc1..d469531f 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_drawing_file/ec_drawing_fileBLL.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_drawing_file/ec_drawing_fileBLL.cs @@ -986,7 +986,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC #region 工程数据和图面 - var resourcePixelList = ec_enginedata_pixelService.GetList("{ProjectId:\"" + item.ProjectId + "\",DrawingFileID:\"" + item.DrawingFileID + "\"}",ProjectId).ToList(); + var resourcePixelList = ec_enginedata_pixelService.GetList("{ProjectId:\"" + item.ProjectId + "\",DrawingFileID:\"" + item.DrawingFileID + "\"}", item.ProjectId).ToList(); if (resourcePixelList != null && resourcePixelList.Count() > 0)//不包含deleteflg的 { //获取拷贝图纸所有的工程数据ID diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/layoutTagInfoBrief.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/layoutTagInfoBrief.cs index 22b918fb..dd397a01 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/layoutTagInfoBrief.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/layoutTagInfoBrief.cs @@ -59,9 +59,10 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC /// 基点从属的、或者说附近的设备位号 /// public List Tags { get; set; } = new List(); + public string RoomNo { get; set; } #endregion - + } } diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_channel/ec_PanelChannelEntity.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_channel/ec_PanelChannelEntity.cs index b7bb2ba2..febe37d5 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_channel/ec_PanelChannelEntity.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_channel/ec_PanelChannelEntity.cs @@ -117,7 +117,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC this.ChannelID = Guid.NewGuid().ToString(); this.CreateTime = Time.MySqlTime; UserInfo userInfo = LoginUserInfo.Get(); - this.CreateUserID = userInfo.userId; + this.CreateUserID = userInfo?.userId; } diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_strip/ec_PanelStripEntity.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_strip/ec_PanelStripEntity.cs index 864821c6..e5bc04cf 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_strip/ec_PanelStripEntity.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_panel_strip/ec_PanelStripEntity.cs @@ -73,7 +73,7 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC this.StripID = Guid.NewGuid().ToString(); this.CreateTime = Time.MySqlTime; UserInfo userInfo = LoginUserInfo.Get(); - this.CreateUserID = userInfo.userId; + this.CreateUserID = userInfo?.userId; } @@ -96,15 +96,23 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC /// [SugarColumn(IsIgnore = true)] public List Channels { set; get; } = new List(); - + /// + /// channel在里有,同时也有 + /// [SugarColumn(IsIgnore = true)] public int ChannelsUsed { set; get; } = 0; - + /// + /// channel在里有,但是没有信号 + /// [SugarColumn(IsIgnore = true)] public int ChannelsUsedNoSignal { set; get; } = 0; + /// + /// channel在里没有 + /// [SugarColumn(IsIgnore = true)] public int ChannelsSpared { set; get; } = 0; + [SugarColumn(IsIgnore = true)] public string TagNumber { set; get; } diff --git a/SWSDBSchemeUpgradeTool/obj/Debug/SWSDBSchemeUpgradeTool_MarkupCompile.lref b/SWSDBSchemeUpgradeTool/obj/Debug/SWSDBSchemeUpgradeTool_MarkupCompile.lref index 2fe5958e..84466716 100644 --- a/SWSDBSchemeUpgradeTool/obj/Debug/SWSDBSchemeUpgradeTool_MarkupCompile.lref +++ b/SWSDBSchemeUpgradeTool/obj/Debug/SWSDBSchemeUpgradeTool_MarkupCompile.lref @@ -1,5 +1,5 @@  -FD:\陈进步\项目\009\SWSDBSchemeUpgradeTool\MainWindow.xaml;; -FD:\陈进步\项目\009\SWSDBSchemeUpgradeTool\SQLPreview.xaml;; +FE:\Di-Electrical\SWSDBSchemeUpgradeTool\MainWindow.xaml;; +FE:\Di-Electrical\SWSDBSchemeUpgradeTool\SQLPreview.xaml;; diff --git a/newFront/c#前端/CAD.Extend/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/newFront/c#前端/CAD.Extend/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 5158d93a..bc671bf5 100644 Binary files a/newFront/c#前端/CAD.Extend/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/newFront/c#前端/CAD.Extend/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/newFront/c#前端/SWS.CAD/CADFunc/General.cs b/newFront/c#前端/SWS.CAD/CADFunc/General.cs index 4f85ae1d..21a66224 100644 --- a/newFront/c#前端/SWS.CAD/CADFunc/General.cs +++ b/newFront/c#前端/SWS.CAD/CADFunc/General.cs @@ -5,6 +5,7 @@ using Bricscad.Global; using SWS.CAD.CADFunc.Editor; using SWS.CAD.Helper; using SWS.CAD.Views.CustomControl; +using SWS.Commons; using System; using System.Collections.Generic; using System.Drawing; diff --git a/newFront/c#前端/SWS.CAD/SWS.CAD.csproj b/newFront/c#前端/SWS.CAD/SWS.CAD.csproj index 1419120f..109ea715 100644 --- a/newFront/c#前端/SWS.CAD/SWS.CAD.csproj +++ b/newFront/c#前端/SWS.CAD/SWS.CAD.csproj @@ -181,12 +181,8 @@ - - - - @@ -534,11 +530,17 @@ {51cb6f5b-16e9-4ee0-baa4-144dd1ec8580} SWS.Service + + {87E71797-E60A-4637-BA32-C8B57154ABC3} + SWS.Share + {7aff9117-78e7-4395-9f23-6dcfe09f9299} SWS.WPF - + + + \ No newline at end of file diff --git a/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignPreviewViewModel.cs b/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignPreviewViewModel.cs index c70099f6..559e4fb0 100644 --- a/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignPreviewViewModel.cs +++ b/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignPreviewViewModel.cs @@ -53,7 +53,7 @@ namespace SWS.CAD.ViewModels } private List CablePreAssigns; - public async void OnDialogOpened(IDialogParameters parameters) + public void OnDialogOpened(IDialogParameters parameters) { //title = parameters.GetValue(GlobalObject.dialogPar.title.ToString()); title = "待分配的信号预览和统计"; @@ -128,7 +128,7 @@ namespace SWS.CAD.ViewModels IDialogParameters para = new Prism.Services.Dialogs.DialogParameters(); para.Add(GlobalObject.dialogPar.para1.ToString(), PreAssignCables); var _dialogService = GlobalObject._prismContainer.Resolve(); - _dialogService.ShowDialog(nameof(DialogCablePreAssignResult), para, async (RES) => + _dialogService.ShowDialog(nameof(DialogCablePreAssignResult), para, (RES) => { if (RES.Result == ButtonResult.Yes) { @@ -182,7 +182,7 @@ namespace SWS.CAD.ViewModels /// 页面左侧按钮 /// /// - public virtual async void Button_Click(object parameter) + public virtual void Button_Click(object parameter) { if (parameter.ToString().Equals("全选")) { @@ -288,7 +288,7 @@ namespace SWS.CAD.ViewModels TagNumber = ec_Cable.TagNumber; PreAssignIOType = ec_Cable.PreAssignIOType; CableClass = ec_Cable.CableClass.Equals("homerun") ? "是" : "否"; - ToPanel_TagNumber = ec_Cable.ToPanel != null ? ec_Cable.ToPanel.TagNumber : null; + ToPanel_TagNumber = ec_Cable.AssignedPanel != null ? ec_Cable.AssignedPanel.TagNumber : null; } #endregion diff --git a/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignResultViewModel.cs b/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignResultViewModel.cs index a7b1498b..af171f8f 100644 --- a/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignResultViewModel.cs +++ b/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogCablePreAssignResultViewModel.cs @@ -108,6 +108,7 @@ namespace SWS.CAD.ViewModels public override async void ExecuteOKCommandAsync(object para) { + //只传入分配成功的电缆 var Cables = new List(); if (AllPreAssignCables != null) { @@ -153,7 +154,7 @@ namespace SWS.CAD.ViewModels { foreach (var PreAssignCable in AllPreAssignCables) { - if (PreAssignCable.Sets != null && !string.IsNullOrEmpty(PreAssignCable.Sets.FirstOrDefault().ConnectionInfo)) + if (PreAssignCable.AssignedPanel!=null) { PreAssignCables.Add(PreAssignCable); } @@ -163,7 +164,7 @@ namespace SWS.CAD.ViewModels { foreach (var PreAssignCable in AllPreAssignCables) { - if (PreAssignCable.Sets == null || string.IsNullOrEmpty(PreAssignCable.Sets.FirstOrDefault().ConnectionInfo)) + if (PreAssignCable.AssignedPanel == null) { PreAssignCables.Add(PreAssignCable); } @@ -179,14 +180,14 @@ namespace SWS.CAD.ViewModels PreAllocationResultls = new ObservableCollection(); if (cable == null) return; - if (cable.Sets != null) + if (cable.AssignedPanel != null) { foreach (var Set in cable.Sets) { PreAllocationResult preAllocationResult = new PreAllocationResult(); preAllocationResult.CablePair = Set.CableSetName; preAllocationResult.IOType = cable.PreAssignIOType; - preAllocationResult.ToPanel_TagNumber = cable.ToPanel == null ? "" : cable.ToPanel.TagNumber; + preAllocationResult.ToPanel_TagNumber = cable.AssignedPanel == null ? "" : cable.AssignedPanel.TagNumber; preAllocationResult.Panel_TagNumber = string.IsNullOrEmpty(Set.ConnectionInfo) ? "" : Set.ConnectionInfo.Split('/')[0].Split(':')[1].Trim(); preAllocationResult.StripName = string.IsNullOrEmpty(Set.ConnectionInfo) ? "" : Set.ConnectionInfo.Split('/')[1].Split(':')[1].Trim(); preAllocationResult.Terms = new ObservableCollection(Set.AssignedTerms); @@ -220,7 +221,9 @@ namespace SWS.CAD.ViewModels public string CablePair { get { return _CablePair; } - set { _CablePair = value; } + set { _CablePair = value; + RaisePropertyChanged(nameof(CablePair)); + } } private string _IOType; @@ -230,7 +233,9 @@ namespace SWS.CAD.ViewModels public string IOType { get { return _IOType; } - set { _IOType = value; } + set { _IOType = value; + RaisePropertyChanged(nameof(IOType)); + } } @@ -241,7 +246,9 @@ namespace SWS.CAD.ViewModels public string ToPanel_TagNumber { get { return _ToPanel_TagNumber; } - set { _ToPanel_TagNumber = value; } + set { _ToPanel_TagNumber = value; + RaisePropertyChanged(nameof(ToPanel_TagNumber)); + } } private string _Panel_TagNumber; @@ -251,7 +258,9 @@ namespace SWS.CAD.ViewModels public string Panel_TagNumber { get { return _Panel_TagNumber; } - set { _Panel_TagNumber = value; } + set { _Panel_TagNumber = value; + RaisePropertyChanged(nameof(Panel_TagNumber)); + } } private string _StripName; @@ -261,7 +270,9 @@ namespace SWS.CAD.ViewModels public string StripName { get { return _StripName; } - set { _StripName = value; } + set { _StripName = value; + RaisePropertyChanged(nameof(StripName)); + } } private ObservableCollection _Terms; @@ -271,7 +282,9 @@ namespace SWS.CAD.ViewModels public ObservableCollection Terms { get { return _Terms; } - set { _Terms = value; } + set { _Terms = value; + RaisePropertyChanged(nameof(Terms)); + } } diff --git a/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogIODistributionViewModel.cs b/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogIODistributionViewModel.cs index f0f93dd9..935edecd 100644 --- a/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogIODistributionViewModel.cs +++ b/newFront/c#前端/SWS.CAD/ViewModels/DialogIODistributionVM/DialogIODistributionViewModel.cs @@ -410,7 +410,7 @@ namespace SWS.CAD.ViewModels #endregion #region 改变关联和解除信号按钮的可用状态 - private async void UpdateButtonEnabled() + private void UpdateButtonEnabled() { if (SelectedChannelInfo != null) { @@ -2723,7 +2723,7 @@ namespace SWS.CAD.ViewModels IDialogParameters para = new Prism.Services.Dialogs.DialogParameters(); para.Add(GlobalObject.dialogPar.para1.ToString(), PreAssignCables); var _dialogService = GlobalObject._prismContainer.Resolve(); - _dialogService.ShowDialog(nameof(DialogCablePreAssignPreview), para, async (RES) => + _dialogService.ShowDialog(nameof(DialogCablePreAssignPreview), para, (RES) => { if (RES.Result == ButtonResult.Yes) { diff --git a/newFront/c#前端/SWS.CAD/ViewModels/DialogSignalPredistributionViewModel.cs b/newFront/c#前端/SWS.CAD/ViewModels/DialogSignalPredistributionViewModel.cs index 8f100e4e..5b96a500 100644 --- a/newFront/c#前端/SWS.CAD/ViewModels/DialogSignalPredistributionViewModel.cs +++ b/newFront/c#前端/SWS.CAD/ViewModels/DialogSignalPredistributionViewModel.cs @@ -22,6 +22,9 @@ using Unity; namespace SWS.CAD.ViewModels { + /// + /// 信号预分配页面的模型类 + /// public class DialogSignalPredistributionViewModel : DialogBase, IDialogAware { #region 字段 diff --git a/newFront/c#前端/SWS.CAD/ViewModels/LeftPanelViewModel.cs b/newFront/c#前端/SWS.CAD/ViewModels/LeftPanelViewModel.cs index ec98813f..89930e29 100644 --- a/newFront/c#前端/SWS.CAD/ViewModels/LeftPanelViewModel.cs +++ b/newFront/c#前端/SWS.CAD/ViewModels/LeftPanelViewModel.cs @@ -506,7 +506,7 @@ namespace SWS.CAD.ViewModels foreach (var id in listObjectTypeId) { //获取节点 - Model.TreeModel node = Helper.TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, id); + Model.TreeModel node = TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, id); if (node != null) { var node1 = (Model.TreeModel)node.Clone(); @@ -531,7 +531,7 @@ namespace SWS.CAD.ViewModels GlobalObject.AllDwgName.Clear(); foreach (var dwg in Drawings) { - Helper.TreeHelper.GetTreeText(dwg); + TreeHelper.GetTreeText(dwg); } #endregion @@ -1975,7 +1975,7 @@ namespace SWS.CAD.ViewModels foreach (var dto in historyDrawingsTree) { //获取节点下的图纸 - node = Helper.TreeHelper.GetTreeModel(dto, item.DrawingFileID); + node = TreeHelper.GetTreeModel(dto, item.DrawingFileID); if (node != null) { break; @@ -2283,7 +2283,7 @@ namespace SWS.CAD.ViewModels if (string.IsNullOrEmpty(strRecentObjectType)) { //获取节点 - Model.TreeModel node = Helper.TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, selectType.ID); + Model.TreeModel node = TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, selectType.ID); var addNode = (Model.TreeModel)node.Clone(); var firstNode = objectTypeTree[0]; //UI添加到最近使用 @@ -2304,7 +2304,7 @@ namespace SWS.CAD.ViewModels } listObjectTypeId.Insert(0, selectType.ID); //获取节点 - Model.TreeModel node = Helper.TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, selectType.ID); + Model.TreeModel node = TreeHelper.GetTreeModel(GlobalObject.objectTypeTree, selectType.ID); var addNode = (Model.TreeModel)node.Clone(); firstNode.ChildNodes.Insert(0, addNode);//UI添加到最近使用 ids = string.Join(",", listObjectTypeId); diff --git a/newFront/c#前端/SWS.CAD/ViewModels/NewDrawingViewModel.cs b/newFront/c#前端/SWS.CAD/ViewModels/NewDrawingViewModel.cs index 72fc86f9..8c032e26 100644 --- a/newFront/c#前端/SWS.CAD/ViewModels/NewDrawingViewModel.cs +++ b/newFront/c#前端/SWS.CAD/ViewModels/NewDrawingViewModel.cs @@ -254,7 +254,7 @@ namespace SWS.CAD.ViewModels //所属系统下拉框 foreach (var item in dwgSystem) { - var node = Helper.TreeHelper.GetTreeModel(item, dwgFile.DrawingSystem); + var node = TreeHelper.GetTreeModel(item, dwgFile.DrawingSystem); if (node != null) { SelectedSystemItem = node; @@ -264,7 +264,7 @@ namespace SWS.CAD.ViewModels //图纸目录下拉框 foreach (var item in dwgCatalogueID) { - var node = Helper.TreeHelper.GetTreeModel(item, dwgFile.DrawingCatalogueID); + var node = TreeHelper.GetTreeModel(item, dwgFile.DrawingCatalogueID); if (node != null) { SelectedCatalogueIDItem = node; @@ -476,7 +476,7 @@ namespace SWS.CAD.ViewModels foreach (var catalogueId in tempCatalogueID) { //遍历获取当前节点数据 - node = Helper.TreeHelper.GetTreeModel(catalogueId, dwgNode.ID); + node = TreeHelper.GetTreeModel(catalogueId, dwgNode.ID); if (node != null) { break; } } diff --git a/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogCablePreAssignResult.xaml b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogCablePreAssignResult.xaml index 27116793..b7e290ff 100644 --- a/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogCablePreAssignResult.xaml +++ b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogCablePreAssignResult.xaml @@ -92,7 +92,13 @@ ShowGroupPanel="False" telerik:StyleManager.Theme="Office_Blue" ItemsSource="{Binding PreAllocationResultls}" SelectedItem="{Binding SelectedChannelInfo, Mode=TwoWay}" > - + + + + diff --git a/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogIODistribution.xaml b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogIODistribution.xaml index d9d29926..2efec14a 100644 --- a/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogIODistribution.xaml +++ b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogIODistributions/DialogIODistribution.xaml @@ -241,7 +241,7 @@ - + @@ -364,135 +364,135 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + - - - - - - - + + + + + + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - + + + + + - - - - - - + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + + - - - - + + + - - - - + + + + - - - + + + diff --git a/newFront/c#前端/SWS.CAD/Views/Dialog/DialogSectionBox.xaml b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogSectionBox.xaml new file mode 100644 index 00000000..df6bae5f --- /dev/null +++ b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogSectionBox.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/newFront/c#前端/SWS.CAD/Views/Dialog/DialogSectionBox.xaml.cs b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogSectionBox.xaml.cs new file mode 100644 index 00000000..c608167c --- /dev/null +++ b/newFront/c#前端/SWS.CAD/Views/Dialog/DialogSectionBox.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace SWS.CAD.Views.Dialog +{ + /// + /// DialogSectionBox.xaml 的交互逻辑 + /// + public partial class DialogSectionBox : UserControl + { + public DialogSectionBox() + { + InitializeComponent(); + } + } +} diff --git a/newFront/c#前端/SWS.CAD/Views/Login.xaml b/newFront/c#前端/SWS.CAD/Views/Login.xaml index d78fbf72..c7c8fc51 100644 --- a/newFront/c#前端/SWS.CAD/Views/Login.xaml +++ b/newFront/c#前端/SWS.CAD/Views/Login.xaml @@ -4,8 +4,8 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:local="clr-namespace:SWS.CAD.Views.CustomControl" - xmlns:local2="clr-namespace:SWS.CAD.Helper" - xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" + xmlns:local2="clr-namespace:SWS.Commons;assembly=SWS.Commons" + xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" Width="300" Height="250" AllowsTransparency="True" diff --git a/newFront/c#前端/SWS.CAD/Views/Style/CustomStyles.xaml b/newFront/c#前端/SWS.CAD/Views/Style/CustomStyles.xaml index 223f6291..0a8922b5 100644 --- a/newFront/c#前端/SWS.CAD/Views/Style/CustomStyles.xaml +++ b/newFront/c#前端/SWS.CAD/Views/Style/CustomStyles.xaml @@ -39,6 +39,10 @@ + + + +