using Learun.Application.TwoDevelopment.ZZDT_EC; using Learun.Application.TwoDevelopment.ZZDT_EC.Frame; using Learun.Util; using Learun.Util.SqlSugar; using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.PTG; using NPOI.Util.Collections; using Pipelines.Sockets.Unofficial.Arenas; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime; using System.Web; using System.Web.Http; using System.Windows.Controls; namespace Learun.Application.Web.AppApi { /// /// 绘制布置图相关的(By YuXH) /// [HandlerApiLogin(FilterMode.Ignore)] public class PlotLayoutApiController : WebApiControllerBase { /// /// 查找一个图上的所有基点 /// /// 所属系统 甲板号 区域 的其中一个 /// /// /// /// /// [HttpGet] public IHttpActionResult GetBasePointByDwg(string keyProp, string keyOperator, string keyValue, string ProjectId = "c151f5d4-cbe1-4522-945c-501b1ad990d5", string drawingId = "277d883d-e271-45e4-990b-926585321fa8") { var typeTbName = ProjectSugar.TableName(ProjectId); var pixelTbName = ProjectSugar.TableName(ProjectId); var tagTbName = ProjectSugar.TableName(ProjectId); var propTbName = ProjectSugar.TableName(ProjectId); var listTbName = ProjectSugar.TableName(ProjectId); var detailTbName = ProjectSugar.TableName(ProjectId); var typeFilterTbName = ProjectSugar.TableName(ProjectId); var typeFilterPTbName = ProjectSugar.TableName(ProjectId); var allFilter = SqlSugarHelper.Db.Queryable().AS(typeFilterTbName).ToList(); var allFilterP = SqlSugarHelper.Db.Queryable().AS(typeFilterPTbName).ToList(); var allType = SqlSugarHelper.Db.Queryable().AS(typeTbName).ToList(); var pointType = allType.First(x => x.ObjectTypeName == GlobalObject.objectType_Base); if (pointType == null) { return Fail("找不到基点这个对象类型。"); } #region frame var frameBll = new FrameBll(); var frameLists = frameBll.GetFrameList(ProjectId); if (frameLists == null) { return Fail("项目数据字典中,没有找到【肋位号】的下拉项中。");// 或者 无法从数据字典中找到对应的那个下拉 } #endregion var pointsOnDwg = SqlSugarHelper.Db.Queryable().AS(pixelTbName). Where(x => x.DrawingFileID == drawingId).ToList(); var pointTags = SqlSugarHelper.Db.Queryable().AS(tagTbName). Where(x => pointsOnDwg.Select(y => y.EngineDataID).Distinct().Contains(x.EngineDataID) && x.ObjectTypeID == pointType.ObjectTypeID).ToList(); var propAll = SqlSugarHelper.Db.Queryable().AS(propTbName).ToList(); //Where(x => x.PropertyName == GlobalObject.propName_Frame //|| x.PropertyName == GlobalObject.propName_FrameOff //|| x.PropertyName == GlobalObject.propName_YOff //|| x.PropertyName == GlobalObject.propName_System //|| x.PropertyName == "甲板号" //|| x.PropertyName == "区域").ToList(); List res = new List(); foreach (var pointTag in pointTags) { var tagProps = propAll.FindAll(x => x.EngineDataID == pointTag.EngineDataID); var Prop_Frame = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue; Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN var xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value; if (xValue < 400) { // 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。 xValue = 1000 * xValue; // 转成mm } 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; var AREA = tagProps.FirstOrDefault(x => x.PropertyName == "区域")?.PropertyValue; var BasePointProp_scale = tagProps.FirstOrDefault(x => x.PropertyName == "比例"); var layoutTag = new layoutTagInfoBrief() { EngineDataID = pointTag.EngineDataID, FileId = "", PixelOnDwg = pointsOnDwg.FirstOrDefault(x => x.EngineDataID == pointTag.EngineDataID)?.PixelCode, TagNumber = pointTag.TagNumber, X = xValue, XOff = Prop_FrameOff, YOff = Prop_YOff, deck = DECK, area = AREA, Scale = BasePointProp_scale == null ? 1 : (double.TryParse(BasePointProp_scale.PropertyValue, out double scale) ? scale : 1) }; res.Add(layoutTag); } // 找出area和deck列组合重复的行 var duplicateGroups = res .GroupBy(r => new { r.area, r.deck }) .Where(g => g.Count() > 1) .ToList(); if (duplicateGroups.Any()) { return Fail("该图纸上有区域和甲板信息重复的基点存在。"); } //这里要考虑下拉列表 带 ||的问题 var matchedTagIds = propAll.Where(x => x.PropertyName == keyProp && (x.PropertyValue == keyValue || x.PropertyValue.StartsWith(keyValue + GlobalObject.enum_separator))). Select(X => X.EngineDataID).Distinct().ToList(); //有效范围的设备 var matchedTags = SqlSugarHelper.Db.Queryable().AS(tagTbName). InnerJoin((a, b) => a.ObjectTypeID == b.ObjectTypeID).AS(typeTbName). Where(a => matchedTagIds.Contains(a.EngineDataID) && a.ObjectTypeID != pointType.ObjectTypeID) .Select((a, b) => new { a.EngineDataID, a.TagNumber, a.ObjectTypeID, b.DefaultLayoutLibFileID }) .ToList(); //有效范围的设备的所有属性 var EquipPropAll = propAll.Where(x => matchedTags.Select(y => y.EngineDataID).Contains(x.EngineDataID)).ToList(); foreach (var basePoint in res) { #region 每个基点关联的设备 //甲板 区域都和基点一致的设备 var DeckMatchedTagIds = EquipPropAll.Where(x => x.PropertyName == "甲板号" && x.PropertyValue == basePoint.deck).Select(X => X.EngineDataID).ToList(); var AreaMatchedTagIds = EquipPropAll.Where(x => x.PropertyName == "区域" && x.PropertyValue == basePoint.area).Select(X => X.EngineDataID).ToList(); var matchPointTagIds = DeckMatchedTagIds.Intersect(AreaMatchedTagIds).ToList(); foreach (var matchPointTagId in matchPointTagIds) { var tagProps = EquipPropAll.Where(x => x.EngineDataID == matchPointTagId).ToList(); var Prop_Frame = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue; Prop_Frame = Prop_Frame.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN var xValue = frameLists.FirstOrDefault(X => X.Num == Prop_Frame).Value; if (xValue < 400) { // 小于400,我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm,400mm的肋位号似乎也太小了。 xValue = 1000 * xValue; // 转成mm } 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 tagInfo = matchedTags.FirstOrDefault(X => X.EngineDataID == matchPointTagId); var systemProp = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_System)?.PropertyValue; var tagProp = tagProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Tag)?.PropertyValue; #region 判断是否满足特定条件 var fileId = tagInfo.DefaultLayoutLibFileID; var matched = false; var isNotDefaultSymbol = true; foreach (var filter in allFilter.Where(x => x.ObjectTypeId == tagInfo.ObjectTypeID)) { if (matched) { //有一个满足就可以了 break; } var filterOp = filter.Operator;//and or var filterPs = allFilterP.Where(x => x.FilterID == filter.SP_ID).ToList(); foreach (var filterP in filterPs) { var prop = tagProps.FirstOrDefault(x => x.PropertyName == filterP.PropertyName); if (prop != null) { if (prop.PropertyValue.ToUpper() == filterP.Value.ToUpper()) { if (filterOp.ToUpper() == "OR") { //一个满足即可 matched = true; fileId = filter.LayoutLibFileID; isNotDefaultSymbol = false; break; } //如果是and,继续看下面的属性,先给图例,如果有一个不满足会break的,主要是避免只有一个条件的时候 fileId = filter.LayoutLibFileID; matched = true; isNotDefaultSymbol = false; } else { if (filterOp.ToUpper() == "AND") { matched = false; isNotDefaultSymbol = true; //一个不满足都不满足 break; } } } else { //压根没这个属性,认为不符合 if (filterOp.ToUpper() == "AND") { matched = false; isNotDefaultSymbol = true; break; } } } } #endregion #region 拆tag number var TagNumber_Upper = ""; var TagNumber_Lower = ""; var lastDashPos = tagInfo.TagNumber.LastIndexOf('-');//最后一个'-'的位置 if (lastDashPos > 0 && lastDashPos < tagInfo.TagNumber.Length - 1) { TagNumber_Upper = tagInfo.TagNumber.Substring(0, lastDashPos); TagNumber_Lower = tagInfo.TagNumber.Substring(lastDashPos + 1); } else { TagNumber_Upper = tagInfo.TagNumber; TagNumber_Lower = ""; } #endregion var layoutTagInfo = new layoutTagInfoBrief() { EngineDataID = matchPointTagId, FileId = fileId, //2个优先级 IsNotDefaultSymbol = isNotDefaultSymbol, PixelOnDwg = "", TagNumber = tagInfo.TagNumber, TagNumber_Upper = TagNumber_Upper, TagNumber_Lower = TagNumber_Lower, System = systemProp, Tag = tagProp, X = xValue, XOff = Prop_FrameOff, YOff = Prop_YOff, deck = basePoint.deck, area = basePoint.area, Scale = basePoint.Scale }; basePoint.Tags.Add(layoutTagInfo); } #endregion } return Success(res); } ///// ///// 拿项目的所属系统。所属系统是一个特定的数据字典。至于哪个作为所属系统,则从settingAPI里查询 ///// ///// ///// 返回TreeModel //[HttpGet] //public IHttpActionResult GetSystemList(string ProjectId) //{ // var ec_propertyBLL = new ec_propertyBLL(); // var ec_dataitemBLL = new ec_dataitemBLL(); // var settings = new ec_projectSettingsBLL(); // List treeList = new List(); // var FrameListFlg = settings.GetEntity("所属系统", ProjectId);//???感觉不需要啊 // if (FrameListFlg != null) // { // //从setting找属性 // var property = ec_propertyBLL.GetList("{PropertyName:\"" + FrameListFlg.SettingValue + "\",ProjectId:\"" + ProjectId + "\"}").FirstOrDefault(); // if (property != null) // { // //从属性去找数据字典 // var res = ec_dataitemBLL.GetDetailList(property.EnumData, "", ProjectId, false); // foreach (var item in res) // { // TreeModel node = new TreeModel(); // node.id = item.DataItemDetailID; // node.text = item.DataItemName + "," + item.DataItemCode; //名字 + 编码 20230512; // node.value = item.DataItemCode; // node.showcheck = false; // node.checkstate = 0; // node.isexpand = true; // node.parentId = item.UpDataItemDetailID == null ? "0" : item.UpDataItemDetailID; // treeList.Add(node); // } // treeList = treeList.ToTree(); // return Success(treeList); // } // else // { // return Fail($"属性中(property表),没有找到【{FrameListFlg.SettingValue}】的属性。"); // } // } // else // { // return Fail("项目设置中(projectSettings表),没有找到【所属系统】的设置项。"); // } //} /// /// 根据选中的所属系统,返回位号id,fileid和md5 /// /// /// 数据字典里的枚举值,以逗号分开,不需要带引号 /// 返回List,id是对象id,text是fileId,value是MD5 [HttpGet] [Obsolete] public IHttpActionResult GetLibraryFileBySelectedSystem(string ProjectId, string DataItemNames) { var res = new ec_library_fileService().GetFileOnSystemDwgByTagId(ProjectId, DataItemNames); return Success(res); } /// /// 拿项目的肋位号。肋位号是一个特定的数据字典。至于哪个作为肋位号,则从settingAPI里查询 /// /// /// [HttpGet] public IHttpActionResult GetFrameList(string ProjectId) { var bll = new FrameBll(); var res = bll.GetFrameList(ProjectId); if (res == null) { return Fail("项目设置中(projectSettings表),没有找到【肋位号】的设置项中,对应的那个下拉。");// 或者 无法从数据字典中找到对应的那个下拉 } else { return Success(res); } } /// /// 根据ObjectTypeID,查绘制布置图时的图例 /// /// /// /// 返回一个LibraryFileID属性的json对象 [HttpGet] public IHttpActionResult GetLibraryFileByType(string ProjectId, string objectTypeID) { //DefaultLayoutLibFileID var res = new ec_objecttypeBLL().GetEntity(objectTypeID, ProjectId); if (res == null) { return Fail("无效的ObjectTypeID"); } if (string.IsNullOrEmpty(res.DefaultLayoutLibFileID)) { return Success("0"); } else { var fileObj = new ec_library_fileBLL().GetEntity(res.DefaultLayoutLibFileID, ProjectId); if (fileObj != null) { return Success(("{LibraryFileID:\"" + res.DefaultLayoutLibFileID + "\"}").ToJObject()); } else { return Success("0"); } } } /// /// 查绘制布置图时的图例。 /// /// /// 返回所有有DefaultLayoutLibFileID的对象类型集合 [HttpGet] public IHttpActionResult GetLibraryFileAll(string ProjectId) { //获取当前项目的所有对象类型数据 var allObjectData = new ec_objecttypeBLL().GetList("{ProjectId:\"" + ProjectId + "\"}").ToList(); List resAll = new List(); var fileBlll = new ec_library_fileBLL(); foreach (var res in allObjectData) { if (string.IsNullOrEmpty(res.DefaultLayoutLibFileID)) { continue; } else { var fileObj = fileBlll.GetEntity(res.DefaultLayoutLibFileID, ProjectId); if (fileObj != null) { resAll.Add(res); } else { continue; } } } return Success(resAll); } } }