From 1242b32386079068ce554f59ba366240b43d851d Mon Sep 17 00:00:00 2001 From: xingheng Date: Tue, 2 Sep 2025 20:47:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E6=9D=90=E6=96=99?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E6=8E=A5=E5=8F=A3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppApi/PlotBOMApiController.cs | 161 ++++++++++++------ .../ZZDT_EC/Views/ec_objecttype/Form.cshtml | 34 ++-- .../Areas/ZZDT_EC/Views/ec_objecttype/Form.js | 8 + .../Learun.Application.Web.csproj | 2 + .../SQL/250902/Project/ec_objecttype.sql | 1 + .../ec_enginedata/ec_enginedataEntity.cs | 55 +++++- .../ec_objecttype/ec_objecttypeEntity.cs | 6 + 7 files changed, 202 insertions(+), 65 deletions(-) create mode 100644 Learun.Application.Web/SQL/250902/Project/ec_objecttype.sql diff --git a/Learun.Application.Web/AppApi/PlotBOMApiController.cs b/Learun.Application.Web/AppApi/PlotBOMApiController.cs index 4130353c..1f4f4bd9 100644 --- a/Learun.Application.Web/AppApi/PlotBOMApiController.cs +++ b/Learun.Application.Web/AppApi/PlotBOMApiController.cs @@ -4,12 +4,14 @@ using Learun.Util.SqlSugar; using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.PTG; using NPOI.Util.Collections; +using OfficeOpenXml.Drawing.Vml; using Pipelines.Sockets.Unofficial.Arenas; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime; +using System.Text.RegularExpressions; using System.Web; using System.Web.Http; using System.Windows.Controls; @@ -31,15 +33,18 @@ namespace Learun.Application.Web.AppApi [HttpGet] public IHttpActionResult GetBOMGroupInfo(string ProjectId = "c151f5d4-cbe1-4522-945c-501b1ad990d5", string drawingId = "277d883d-e271-45e4-990b-926585321fa8") { - var res = new List(); + var res = new List();//声明结果 + #region 表名 var typeTbName = ProjectSugar.TableName(ProjectId); var pixelTbName = ProjectSugar.TableName(ProjectId); var tagTbName = ProjectSugar.TableName(ProjectId); var propTbName = ProjectSugar.TableName(ProjectId); - + var fileTbName = ProjectSugar.TableName(ProjectId); + #endregion + #region 全局数据 var allTag = SqlSugarHelper.Db.Queryable().AS(tagTbName) .InnerJoin((t, p) => t.EngineDataID == p.EngineDataID && p.DrawingFileID == drawingId) .AS(pixelTbName) @@ -50,6 +55,15 @@ namespace Learun.Application.Web.AppApi .Where(x => allTag.Select(t => t.EngineDataID).Contains(x.EngineDataID)) .ToList(); + var allType = SqlSugarHelper.Db.Queryable().AS(typeTbName) + .Where(x => allTag.Select(t => t.ObjectTypeID).Contains(x.ObjectTypeID)) + .ToList(); + + var allLib = SqlSugarHelper.Db.Queryable().AS(fileTbName) + .ToList(); + + #endregion + //1.先按类型分组 //2.去除tagnumber下的右侧数字 @@ -58,82 +72,84 @@ namespace Learun.Application.Web.AppApi //设备型号 和 厂商 - var TagsInBOM = new List(); + var TagsInBOM = new List(); + + #region 预处理每个位号,然后进行分组 foreach (ec_enginedataEntity tag in allTag) { var matchedTypes = new List(); + var idx = 0; + var GroupName = TrimTagNubmer(tag.TagNumber, out idx);// 如 A-B1,A-B2,取出来的group就是A-B,idx为0 + var seq = tag.TagNumber.Substring(idx).Replace(GroupName, "");// 1,2 + var BOMTagInfo = new BOMTagInfo() + { + objectTypeId = tag.ObjectTypeID, + TagNumber = tag.TagNumber, + Group = GroupName,// 如 A-B1,A-B2, + vendor = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == "厂商")?.PropertyValue ?? "", + Spec = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == "设备型号")?.PropertyValue ?? "", + Name = "", + Seq = seq + }; //???特定类型的,还需要额外根据”中文名称“来分组,比如照明设备类型下的所有设备 if (matchedTypes.Contains(tag.ObjectTypeID)) { //如照明下的。比如10个照明的灯,4个中文名称是“顶灯”,6个中文名称是“壁灯” - TagsInBOM.Add(new TagInBOM() - { - objectTypeId = tag.ObjectTypeID, - TagNumber = TrimTagNubmer(tag.TagNumber),// 如 A-B1,A-B2, - vendor = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == "厂商")?.PropertyValue ?? "", - model = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == "设备型号")?.PropertyValue ?? "", - Name = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == GlobalObject.propName_NameCN)?.PropertyValue ?? "" - }); - } - else - { - TagsInBOM.Add(new TagInBOM() - { - objectTypeId = tag.ObjectTypeID, - TagNumber = TrimTagNubmer(tag.TagNumber),// 如 A-B1,A-B2, - vendor = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == "厂商")?.PropertyValue ?? "", - model = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == "设备型号")?.PropertyValue ?? "", - Name = "" - }); + BOMTagInfo.Name = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == GlobalObject.propName_NameCN)?.PropertyValue ?? ""; + + } + TagsInBOM.Add(BOMTagInfo); + + } - var groups = TagsInBOM.GroupBy(x => new { x.objectTypeId, x.TagNumber, x.vendor, x.model, x.Name }).ToList(); - + var groups = TagsInBOM.GroupBy(x => new { x.objectTypeId, x.Group, x.vendor, x.Spec, x.Name }).ToList(); + #endregion foreach (var group in groups) { - var text = group.Key.TagNumber; //A-ABC, 正常情况下A是system,放下面;B是tag,放上面 - var upper_text_Part1 = text.Split('-')[1];//ABC + List allTagsInThisGroup = group.ToList(); + var GroupName = group.Key.Group; //A-ABC, 正常情况下A是system,放下面;B是tag,放上面 + var upper_text_Part1 = GroupName.Split('-')[1];//ABC var upper_text_Part2 = "";//seq #region seq的不同情况 - //TAG如果一样的就取这个TAG就行??? + //得到每个位号下的seq + var allSeqText = allTagsInThisGroup.OrderBy(x => x.Seq).Select(x => x.Seq).ToList(); + var allSeq = ExtractNumbers(allSeqText);//把1A 1B 这种情况也处理了,变成1,1 + if (allSeq.Distinct().Count() == 1) + { + //TAG如果一样的就取这个TAG就行??? + upper_text_Part2 = allSeqText.First(); + } //数里小于等于2个 - if (group.Count() <= 2) + else if (allTagsInThisGroup.Count <= 2) { //遍历每一个group下的原始 ec_enginedataEntity.TagNumber里的数字。比如2个分别是 1 2 那么就显示1,2 - upper_text_Part2 = "1,2"; + //就是这里就是2个,因为1个的话第一个if已经处理了 + upper_text_Part2 = allSeqText[0] + "," + allSeqText[1]; } else { //遍历每一个group下的原始 ec_enginedataEntity.TagNumber里的数字 - bool isContinue = true;//是否是连续的 - if (isContinue) - { - //如果是连续的就显示 1~5 - upper_text_Part2 = "1~5"; - } - else - { - //还要分段去判断是否有部分连续的。如1~3,5,7~9 + //有一种情况还需要明确 1A 1B 1C这种??????? + upper_text_Part2 = ec_enginedataEntity.FindConsecutiveSequences(allSeq).ToString(); - upper_text_Part2 = "1~3,5,7~9"; - } } #endregion - + var typeInfo = allType.FirstOrDefault(x => x.ObjectTypeID == group.Key.objectTypeId); var BOMGroupInfo = new BOMGroupInfo { upper_text = upper_text_Part1 + upper_text_Part2, - lower_text = text.Split('-')[0],//A + lower_text = GroupName.Split('-')[0],//A Count = group.Count(), Remark = group.Key.vendor, - Spec = group.Key.model, - FileId = GetSymbolForBOM(group.Key.objectTypeId) + Spec = group.Key.Spec, + FileId = GetSymbolForBOM(typeInfo, allLib) }; if (BOMGroupInfo.upper_text == BOMGroupInfo.lower_text) @@ -147,35 +163,82 @@ namespace Learun.Application.Web.AppApi return Success(res); } /// + /// 从字符串中提取数字(可能出现1A 1B这样的情况) + /// + private static List ExtractNumbers(List stringNumbers) + { + var numbers = new List(); + if (stringNumbers == null || !stringNumbers.Any()) + return numbers; + + // 正则表达式:匹配字符串中的所有数字 + var regex = new Regex(@"\d+"); + + foreach (var str in stringNumbers) + { + if (string.IsNullOrWhiteSpace(str)) + continue; + + // 提取字符串中的第一个数字(如"1a"提取1,"a2b3"提取2) + var match = regex.Match(str); + if (match.Success && int.TryParse(match.Value, out int num)) + { + numbers.Add(num); + } + } + + return numbers; + } + /// /// 决定应该用哪个symbol /// /// /// - string GetSymbolForBOM(string objectTypeId) + string GetSymbolForBOM(ec_objecttypeEntity T, List allLib) { + var fileId = "default"; + //3个level, + //1.插件端文件夹下的某个默认symbol + var fileIdOnType = allLib.FirstOrDefault(x => x.LibraryFileID == T.DefaultBOMFileID); + if (fileIdOnType != null) + { + return fileIdOnType.LibraryFileID; + } + //2.对象类型下的默认symbol + //3.满足某个细分类型的symbol(比如按中文名称来分组的一些特别东西) //马达,圆形 //通讯设备-外通设备-天线,三角形 - return ""; + + + return fileId; } /// /// 去除tagnumber下的右侧数字 /// /// + /// 去除数字后的段落,是整个tagNumber的第几位 /// - string TrimTagNubmer(string tagNumber) + string TrimTagNubmer(string tagNumber, out int replaceStartIdx) { //1MAC-PT1 和 1MAC-PT2 归为一组,剩下的是1MAC-PT ,而不是MAC-PT // 还要考虑1A 1B这种后缀情况 //1MAC-PT1A 1MAC-PT1B 归为一组,剩下的是1MAC-PT,而不是变成1MAC-PT1A 和 1MAC-PT1B + + replaceStartIdx = 0; return tagNumber; } } - public class TagInBOM + public class BOMTagInfo { public string objectTypeId { set; get; } public string TagNumber { set; get; } + public string Group { set; get; } + /// + /// 正常情况下 Group + Seq = TagNumber + /// + public string Seq { set; get; } public string vendor { set; get; } - public string model { set; get; } + public string Spec { set; get; } /// /// 中文名称 /// diff --git a/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.cshtml b/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.cshtml index c3b5b32b..bbdc17e8 100644 --- a/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.cshtml +++ b/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.cshtml @@ -26,9 +26,13 @@
-
默认的布置图图例(库文件)
+
默认布置图图例
+
+
默认材料表图例
+
+
排序*
@@ -46,20 +50,20 @@
@*
-
- +
+ +
-
-
-
- -
-
*@ +
+
+ +
+
*@ @Html.AppendJsFile("/Areas/ZZDT_EC/Views/ec_objecttype/Form.js") diff --git a/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.js b/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.js index b1cc0c16..f83d8ff2 100644 --- a/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.js +++ b/Learun.Application.Web/Areas/ZZDT_EC/Views/ec_objecttype/Form.js @@ -8,6 +8,7 @@ var acceptClick; var keyValue = request('keyValue'); var UpObjectTypeID = request('UpObjectTypeID'); var ProjectId = request('ProjectId'); +var DefaultBOMFileID = ''; var selectedSpecialType = ''; var bootstrap = function ($, learun) { "use strict"; @@ -32,6 +33,13 @@ var bootstrap = function ($, learun) { allowSearch: true, maxHeight: 225 }).lrselectSet(DefaultLayoutLibFileID);//lrselectSet获取下拉框选择的值,传入UpObjectTypeID + $('#DefaultBOMFileID').lrselect({ + url: top.$.rootUrl + '/ZZDT_EC/ec_library_file/GetTreeDataByObjectType',//获取数据地址 + param: { ProjectId: ProjectId, ObjectTypeID: keyValue }, //请求后台参数 + type: 'tree',//数据展示类型: 1.default:普通;2.tree:树形数据;3. treemultiple:树形多选;multiple:普通多选 + allowSearch: true, + maxHeight: 225 + }).lrselectSet(DefaultBOMFileID); }, initData: function () { // 初始化下拉列表并配置数据 diff --git a/Learun.Application.Web/Learun.Application.Web.csproj b/Learun.Application.Web/Learun.Application.Web.csproj index 11ae6f30..75876b25 100644 --- a/Learun.Application.Web/Learun.Application.Web.csproj +++ b/Learun.Application.Web/Learun.Application.Web.csproj @@ -3434,6 +3434,7 @@ + @@ -3661,6 +3662,7 @@ + diff --git a/Learun.Application.Web/SQL/250902/Project/ec_objecttype.sql b/Learun.Application.Web/SQL/250902/Project/ec_objecttype.sql new file mode 100644 index 00000000..9875af30 --- /dev/null +++ b/Learun.Application.Web/SQL/250902/Project/ec_objecttype.sql @@ -0,0 +1 @@ +ALTER TABLE ec_objecttype ADD DefaultBOMFileID varchar(100) NULL; diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/ec_enginedataEntity.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/ec_enginedataEntity.cs index 803efd84..50ff8185 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/ec_enginedataEntity.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_enginedata/ec_enginedataEntity.cs @@ -1,7 +1,9 @@ -using Learun.Util; +using DocumentFormat.OpenXml.EMMA; +using Learun.Util; using SqlSugar; using System; using System.Collections.Generic; +using System.Linq; namespace Learun.Application.TwoDevelopment.ZZDT_EC { @@ -15,6 +17,57 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC [SugarTable(TableName = "ec_enginedata")] public class ec_enginedataEntity { + #region 处理seq + /// + /// 找出数字集合中所有连续的子序列 + /// + /// 输入的数字集合 + /// 连续子序列的列表,每个元素是一个包含起始和结束的数组 + public static List FindConsecutiveSequences(IEnumerable numbers) + { + var result = new List(); + + // 处理空集合或null + if (numbers == null || !numbers.Any()) + return new List(); + + // 去重并排序 + var sortedNumbers = numbers.Distinct().OrderBy(n => n).ToList(); + + // 初始化第一个区间 + int start = sortedNumbers[0]; + int end = sortedNumbers[0]; + + // 遍历剩余数字 + for (int i = 1; i < sortedNumbers.Count; i++) + { + // 检查当前数字是否与上一个连续 + if (sortedNumbers[i] == end + 1) + { + // 连续则扩展当前区间 + end = sortedNumbers[i]; + } + else + { + // 不连续则结束当前区间,并开始新区间 + result.Add(new[] { start, end }); + start = sortedNumbers[i]; + end = sortedNumbers[i]; + } + } + + // 添加最后一个区间 + result.Add(new[] { start, end }); + + + return result.Select(seq => + seq[0] == seq[1] ? $"{seq[0]}" : $"{seq[0]}~{seq[1]}" + ).ToList(); + + } + + + #endregion public ec_enginedataEntity() { CaseID = "0"; diff --git a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_objecttype/ec_objecttypeEntity.cs b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_objecttype/ec_objecttypeEntity.cs index d2447228..448d117b 100644 --- a/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_objecttype/ec_objecttypeEntity.cs +++ b/Learun.Framework.Module/Learun.Application.Module/Learun.Application.TwoDevelopment/ZZDT_EC/ec_objecttype/ec_objecttypeEntity.cs @@ -31,6 +31,12 @@ namespace Learun.Application.TwoDevelopment.ZZDT_EC /// /// public string DefaultLayoutLibFileID { get; set; } = ""; + + /// + /// 默认的材料表的图例 + /// + /// + public string DefaultBOMFileID { get; set; } = ""; ///// ///// 默认为0。1代表属于Panel类,要处理ec_panel /////