009_DI-Elec/Learun.Application.Web/AppApi/PlotBOMApiController.cs

261 lines
10 KiB
C#
Raw Normal View History

2025-09-02 16:14:43 +08:00
using Learun.Application.TwoDevelopment.ZZDT_EC;
using Learun.Util;
using Learun.Util.SqlSugar;
using NPOI.SS.Formula.Functions;
using NPOI.SS.Formula.PTG;
using NPOI.Util.Collections;
2025-09-02 20:47:47 +08:00
using OfficeOpenXml.Drawing.Vml;
2025-09-02 16:14:43 +08:00
using Pipelines.Sockets.Unofficial.Arenas;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime;
2025-09-02 20:47:47 +08:00
using System.Text.RegularExpressions;
2025-09-02 16:14:43 +08:00
using System.Web;
using System.Web.Http;
using System.Windows.Controls;
namespace Learun.Application.Web.AppApi
{
/// <summary>
/// 绘制材料表相关的By YuXH
/// </summary>
[HandlerApiLogin(FilterMode.Ignore)]
public class PlotBOMApiController : WebApiControllerBase
{
/// <summary>
/// 获取材料表绘制所需的分组信息、symbol信息
/// </summary>
/// <param name="ProjectId"></param>
/// <param name="drawingId"></param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetBOMGroupInfo(string ProjectId = "c151f5d4-cbe1-4522-945c-501b1ad990d5", string drawingId = "277d883d-e271-45e4-990b-926585321fa8")
{
2025-09-02 20:47:47 +08:00
var res = new List<BOMGroupInfo>();//声明结果
2025-09-02 16:14:43 +08:00
2025-09-02 20:47:47 +08:00
#region
2025-09-02 16:14:43 +08:00
var typeTbName = ProjectSugar.TableName<ec_objecttypeEntity>(ProjectId);
var pixelTbName = ProjectSugar.TableName<ec_enginedata_pixelEntity>(ProjectId);
var tagTbName = ProjectSugar.TableName<ec_enginedataEntity>(ProjectId);
var propTbName = ProjectSugar.TableName<ec_enginedata_propertyEntity>(ProjectId);
2025-09-02 20:47:47 +08:00
var fileTbName = ProjectSugar.TableName<ec_library_fileEntity>(ProjectId);
#endregion
2025-09-02 16:14:43 +08:00
2025-09-02 20:47:47 +08:00
#region
2025-09-02 16:14:43 +08:00
var allTag = SqlSugarHelper.Db.Queryable<ec_enginedataEntity>().AS(tagTbName)
.InnerJoin<ec_enginedata_pixelEntity>((t, p) => t.EngineDataID == p.EngineDataID && p.DrawingFileID == drawingId)
.AS<ec_enginedata_pixelEntity>(pixelTbName)
.GroupBy(t => t.ObjectTypeID)
.ToList();
var allProp = SqlSugarHelper.Db.Queryable<ec_enginedata_propertyEntity>().AS(propTbName)
.Where(x => allTag.Select(t => t.EngineDataID).Contains(x.EngineDataID))
.ToList();
2025-09-02 20:47:47 +08:00
var allType = SqlSugarHelper.Db.Queryable<ec_objecttypeEntity>().AS(typeTbName)
.Where(x => allTag.Select(t => t.ObjectTypeID).Contains(x.ObjectTypeID))
.ToList();
var allLib = SqlSugarHelper.Db.Queryable<ec_library_fileEntity>().AS(fileTbName)
.ToList();
#endregion
2025-09-02 16:14:43 +08:00
//1.先按类型分组
//2.去除tagnumber下的右侧数字
//3.再按几个属性分组
//设备型号 和 厂商
2025-09-02 20:47:47 +08:00
var TagsInBOM = new List<BOMTagInfo>();
#region
2025-09-02 16:14:43 +08:00
foreach (ec_enginedataEntity tag in allTag)
{
var matchedTypes = new List<string>();
2025-09-02 20:47:47 +08:00
var idx = 0;
var GroupName = TrimTagNubmer(tag.TagNumber, out idx);// 如 A-B1,A-B2,取出来的group就是A-Bidx为0
var seq = tag.TagNumber.Substring(idx).Replace(GroupName, "");// 1,2
2025-09-02 16:14:43 +08:00
2025-09-02 20:47:47 +08:00
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
};
2025-09-02 16:14:43 +08:00
//???特定类型的,还需要额外根据”中文名称“来分组,比如照明设备类型下的所有设备
if (matchedTypes.Contains(tag.ObjectTypeID))
{
//如照明下的。比如10个照明的灯4个中文名称是“顶灯”6个中文名称是“壁灯”
2025-09-02 20:47:47 +08:00
BOMTagInfo.Name = allProp.FirstOrDefault(x => x.EngineDataID == tag.EngineDataID && x.PropertyName == GlobalObject.propName_NameCN)?.PropertyValue ?? "";
2025-09-02 16:14:43 +08:00
}
2025-09-02 20:47:47 +08:00
TagsInBOM.Add(BOMTagInfo);
2025-09-02 16:14:43 +08:00
2025-09-02 20:47:47 +08:00
}
var groups = TagsInBOM.GroupBy(x => new { x.objectTypeId, x.Group, x.vendor, x.Spec, x.Name }).ToList();
#endregion
2025-09-02 16:14:43 +08:00
foreach (var group in groups)
{
2025-09-02 20:47:47 +08:00
List<BOMTagInfo> allTagsInThisGroup = group.ToList();
var GroupName = group.Key.Group; //A-ABC, 正常情况下A是system放下面B是tag放上面
var upper_text_Part1 = GroupName.Split('-')[1];//ABC
2025-09-02 16:14:43 +08:00
var upper_text_Part2 = "";//seq
#region seq的不同情况
2025-09-02 20:47:47 +08:00
//得到每个位号下的seq
2025-09-02 16:14:43 +08:00
2025-09-02 20:47:47 +08:00
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();
}
2025-09-02 16:14:43 +08:00
//数里小于等于2个
2025-09-02 20:47:47 +08:00
else if (allTagsInThisGroup.Count <= 2)
2025-09-02 16:14:43 +08:00
{
//遍历每一个group下的原始 ec_enginedataEntity.TagNumber里的数字。比如2个分别是 1 2 那么就显示1,2
2025-09-02 20:47:47 +08:00
//就是这里就是2个因为1个的话第一个if已经处理了
upper_text_Part2 = allSeqText[0] + "," + allSeqText[1];
2025-09-02 16:14:43 +08:00
}
else
{
//遍历每一个group下的原始 ec_enginedataEntity.TagNumber里的数字
2025-09-02 20:47:47 +08:00
//有一种情况还需要明确 1A 1B 1C这种
upper_text_Part2 = ec_enginedataEntity.FindConsecutiveSequences(allSeq).ToString();
2025-09-02 16:14:43 +08:00
}
#endregion
2025-09-02 20:47:47 +08:00
var typeInfo = allType.FirstOrDefault(x => x.ObjectTypeID == group.Key.objectTypeId);
2025-09-02 16:14:43 +08:00
var BOMGroupInfo = new BOMGroupInfo
{
upper_text = upper_text_Part1 + upper_text_Part2,
2025-09-02 20:47:47 +08:00
lower_text = GroupName.Split('-')[0],//A
2025-09-02 16:14:43 +08:00
Count = group.Count(),
Remark = group.Key.vendor,
2025-09-02 20:47:47 +08:00
Spec = group.Key.Spec,
FileId = GetSymbolForBOM(typeInfo, allLib)
2025-09-02 16:14:43 +08:00
};
if (BOMGroupInfo.upper_text == BOMGroupInfo.lower_text)
{
//如果SYSTEM等于TAG那么隐藏SYSTEM
BOMGroupInfo.lower_text = "";//
}
res.Add(BOMGroupInfo);
}
return Success(res);
}
/// <summary>
2025-09-02 20:47:47 +08:00
/// 从字符串中提取数字可能出现1A 1B这样的情况
/// </summary>
private static List<int> ExtractNumbers(List<string> stringNumbers)
{
var numbers = new List<int>();
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;
}
/// <summary>
2025-09-02 16:14:43 +08:00
/// 决定应该用哪个symbol
/// </summary>
/// <param name="objectTypeId"></param>
/// <returns></returns>
2025-09-02 20:47:47 +08:00
string GetSymbolForBOM(ec_objecttypeEntity T, List<ec_library_fileEntity> allLib)
2025-09-02 16:14:43 +08:00
{
2025-09-02 20:47:47 +08:00
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比如按中文名称来分组的一些特别东西
2025-09-02 16:14:43 +08:00
//马达,圆形
//通讯设备-外通设备-天线,三角形
2025-09-02 20:47:47 +08:00
return fileId;
2025-09-02 16:14:43 +08:00
}
/// <summary>
/// 去除tagnumber下的右侧数字
/// </summary>
/// <param name="tagNumber"></param>
2025-09-02 20:47:47 +08:00
/// <param name="replaceStartIdx">去除数字后的段落是整个tagNumber的第几位</param>
2025-09-02 16:14:43 +08:00
/// <returns></returns>
2025-09-02 20:47:47 +08:00
string TrimTagNubmer(string tagNumber, out int replaceStartIdx)
2025-09-02 16:14:43 +08:00
{
//1MAC-PT1 和 1MAC-PT2 归为一组剩下的是1MAC-PT 而不是MAC-PT
// 还要考虑1A 1B这种后缀情况
//1MAC-PT1A 1MAC-PT1B 归为一组剩下的是1MAC-PT而不是变成1MAC-PT1A 和 1MAC-PT1B
2025-09-02 20:47:47 +08:00
replaceStartIdx = 0;
2025-09-02 16:14:43 +08:00
return tagNumber;
}
}
2025-09-02 20:47:47 +08:00
public class BOMTagInfo
2025-09-02 16:14:43 +08:00
{
public string objectTypeId { set; get; }
public string TagNumber { set; get; }
2025-09-02 20:47:47 +08:00
public string Group { set; get; }
/// <summary>
/// 正常情况下 Group + Seq = TagNumber
/// </summary>
public string Seq { set; get; }
2025-09-02 16:14:43 +08:00
public string vendor { set; get; }
2025-09-02 20:47:47 +08:00
public string Spec { set; get; }
2025-09-02 16:14:43 +08:00
/// <summary>
/// 中文名称
/// </summary>
public string Name { set; get; }
}
public class BOMGroupInfo
{
public string upper_text { set; get; }
public string lower_text { set; get; }
/// <summary>
/// 每一行用的symbol是什么
/// </summary>
public string FileId { set; get; }
public int Count { set; get; }
public string Remark { set; get; }
public string Spec { set; get; }
}
}