using DocumentFormat.OpenXml.Drawing.Spreadsheet; using DocumentFormat.OpenXml.Office2010.Excel; using DocumentFormat.OpenXml.Spreadsheet; using Learun.Application.TwoDevelopment.ZZDT_EC; using Learun.Util; using Learun.Util.SqlSugar; using NPOI.XWPF.UserModel; using SqlSugar.DistributedSystem.Snowflake; using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.Description; using static Learun.Application.TwoDevelopment.ZZDT_EC.ec_enginedataBLL; using ec_projectEntity = Learun.Application.TwoDevelopment.ZZDT_EC.ec_projectEntity; namespace Learun.Application.Web.AppApi { /// /// 工程数据 /// [RoutePrefix("api/EnginedataApi")] [HandlerApiLogin(FilterMode.Enforce)] [TokenAuthorize] public class EnginedataApiController : WebApiControllerBase { /// /// 更新工程数据属性默认值 /// /// [HttpPost] public IHttpActionResult UpdateEnginedataPropertyByDefaultValue() { try { new ec_enginedataBLL().UpdateEngineDataByDefaultValue(); return Success("更新成功"); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 获取位号的pixel对象(仅有位号). /// 插件端的设计浏览处用到 /// /// 项目ID /// 对象类型ID /// [HttpGet] [ResponseType(typeof(TreeModelLite))] public IHttpActionResult GetTagPixelsById(string projectId, string EngineDataID) { try { List res = new List(); var ec_enginedata_pixelBLL = new ec_enginedata_pixelBLL(); var data = ec_enginedata_pixelBLL.GetList("{\"ProjectId\":\"" + projectId + "\",\"EngineDataID\":\"" + EngineDataID + "\"}",projectId); return Success(data); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 查询一个系统内的所有设备的所有电缆连接关系,用于如系统图的绘制 /// /// /// 所属系统的名字 /// 开关类型 /// 需要绘制的图纸风格,0(电力一次),1(驾控台),2(集控台) /// [HttpPost] public async Task GetTagCableConnsBySystemAsync(string projectId, string systemName, string breakerType, string StyleType, [FromBody] string DwgIDs) { var res = new List(); if (DwgIDs == null) { return Success(null) ; } var relBll = new ec_enginedata_relBLL(); switch (StyleType) { case "0": break; case "1": breakerType = ""; break; case "2": breakerType = ""; break; default: break; } res = await relBll.GetTagCableConnsBySystem(projectId, systemName, breakerType, DwgIDs); return Success(res); } /// /// 查询一个“设备单元”内的所有设备的所有电缆连接关系,用于如系统图的绘制 /// /// /// 设备单元 wcc ecc /// 开关类型 /// 需要绘制的图纸风格,0(电力一次),1(驾控台),2(集控台) /// [HttpPost] public async Task GetTagCableConnsByUnitAsync(string projectId, string unitName, string breakerType,string StyleType, [FromBody] string DwgIDs) { var res = new List(); var relBll = new ec_enginedata_relBLL(); unitName = WebHelper.UrlDecode(unitName); Stopwatch stopwatch = Stopwatch.StartNew(); stopwatch.Start(); switch (StyleType) { case "0": break; case "1": breakerType = ""; break; case "2": breakerType = ""; break; default: break; } res = await relBll.GetTagCableConnsByUnit(projectId, unitName, breakerType,DwgIDs); stopwatch.Stop(); var time = stopwatch.ElapsedMilliseconds.ToString(); return Success(res); } /// /// 查询多个设备上的所有电缆连接关系,用于如系统图的绘制 /// /// /// 开关类型 /// 需要绘制的图纸风格,0(电力一次),1(驾控台),2(集控台) /// [HttpPost] public async Task GetTagCableConnsByIdsAsync(string projectId, string breakerType, string StyleType, [FromBody] List Ids) { // var asyncContent = Request.Content.ReadAsStringAsync().Result; // List body = asyncContent.ToObject>(); string Enginedataids = Ids[0]; var DwgIds = Ids[1]; var res = new List(); var relBll = new ec_enginedata_relBLL(); var propTbName = ProjectSugar.TableName(projectId); var TbName = ProjectSugar.TableName(projectId); var allTag = SqlSugarHelper.Db.Queryable().AS(TbName).ToList(); var RefCBs = SqlSugarHelper.Db.Queryable(). Where(x => x.breakerType == "MCCB"). OrderBy(x => x.Capacity_Max).ToList(); var cbTbName = ProjectSugar.TableName(projectId); var allCBs =SqlSugarHelper.Db.Queryable().AS(cbTbName).ToList(); var relTbName = ProjectSugar.TableName(projectId); var allRels = SqlSugarHelper.Db.Queryable().AS(relTbName).ToList(); var pixelTbName = ProjectSugar.TableName(projectId); var allPixels = SqlSugarHelper.Db.Queryable().AS(pixelTbName). Where(x => x.DeleteFlg != 1).ToList(); var relTypeTbName = ProjectSugar.TableName(projectId); var relType = SqlSugarHelper.Db.Queryable().AS(relTypeTbName).ToList().FirstOrDefault(x => x.RelType == ((int)enum_RelType.设备_电缆).ToString()); var propBll = new ec_enginedata_propertyBLL(); var allTagProps = SqlSugarHelper.Db.Queryable().AS(propTbName).ToList(); var tagIds = new List(); tagIds.AddRange(Enginedataids.Split(',')); #region 图纸过滤 var tagsOnDwgRange = new List(); if (!string.IsNullOrEmpty(DwgIds) && DwgIds.Split(',').Count() > 0) { tagsOnDwgRange = allPixels.Where(x => DwgIds.Split(',').Contains(x.DrawingFileID)).Select(x => x.EngineDataID).Distinct().ToList(); tagIds = tagIds.Intersect(tagsOnDwgRange).ToList(); } #endregion switch (StyleType) { case "0": break; case "1": breakerType = ""; break; case "2": breakerType = ""; break; default: break; } var dataitembll = new ec_dataitemBLL(); var systems = dataitembll.GetDetailList(GlobalObject.enumlist_System, "", projectId); foreach (var id in tagIds) { var CBs = allCBs.Where(x => x.PDBId == id).ToList(); var res2 = await relBll.GetTagCableConns(projectId, id, breakerType, RefCBs, allTag, CBs, allRels, allPixels, relType, allTagProps, tagsOnDwgRange, systems); res.Add(res2); } return Success(res.OrderBy(X => X.SystemName).ToList()); } /// /// 查询多个设备上的所有电缆连接关系,用于如系统图的绘制 /// /// /// /// /// public async Task GetTagCableConnsByPixelsAsync(string projectId, string Pixels, string dwgId) { var res = new List(); var relBll = new ec_enginedata_relBLL(); var pixelTbName = ProjectSugar.TableName(projectId); var list_pixel = Pixels.Split(',').ToList(); var Ids = SqlSugarHelper.Db.Queryable().AS(pixelTbName). Where(x => x.DrawingFileID == dwgId && list_pixel.Contains(x.PixelCode)). Select(X => X.EngineDataID).Distinct().ToList(); var propTBName = ProjectSugar.TableName(projectId); var TbName = ProjectSugar.TableName(projectId); var allTag = SqlSugarHelper.Db.Queryable().AS(TbName).ToList(); var RefCBs = SqlSugarHelper.Db.Queryable(). Where(x => x.breakerType == "MCCB"). OrderBy(x => x.Capacity_Max).ToList(); var cbTbName = ProjectSugar.TableName(projectId); var allCBs = SqlSugarHelper.Db.Queryable().AS(cbTbName).ToList(); var relTbName = ProjectSugar.TableName(projectId); var allRels = SqlSugarHelper.Db.Queryable().AS(relTbName).ToList(); var allPixels = SqlSugarHelper.Db.Queryable().AS(pixelTbName). Where(x => x.DeleteFlg != 1).ToList(); var relTypeTbName = ProjectSugar.TableName(projectId); var relType = SqlSugarHelper.Db.Queryable().AS(relTypeTbName).ToList().FirstOrDefault(x => x.RelType == ((int)enum_RelType.设备_电缆).ToString()); //var propBll = new ec_enginedata_propertyBLL(); var allTagProps = SqlSugarHelper.Db.Queryable().AS(propTBName).ToList(); var dataitembll = new ec_dataitemBLL(); var systems = dataitembll.GetDetailList(GlobalObject.enumlist_System, "", projectId); foreach (var id in Ids) { var CBs = allCBs.Where(x => x.PDBId == id).ToList(); var res2 = await relBll.GetTagCableConns(projectId, id, "", RefCBs, allTag, CBs, allRels, allPixels, relType, allTagProps,null, systems); res.Add(res2); } return Success(res.OrderBy(X => X.SystemName).ToList()); } /// /// 查询一个设备上的所有电缆连接关系,用于如系统图的绘制 /// /// /// /// public async Task GetTagCableConnsByIdAsync(string projectId, string Enginedataid, string breakerType) { var res = new ec_enginedataEquipBrief(); var relBll = new ec_enginedata_relBLL(); var propTbName = ProjectSugar.TableName(projectId); var TbName = ProjectSugar.TableName(projectId); var allTag =SqlSugarHelper.Db.Queryable().AS(TbName).ToList(); var RefCBs = SqlSugarHelper.Db.Queryable(). Where(x => x.breakerType == "MCCB"). OrderBy(x => x.Capacity_Max).ToList(); var cbTbName = ProjectSugar.TableName(projectId); var allCBs = SqlSugarHelper.Db.Queryable().AS(cbTbName).ToList(); var relTbName = ProjectSugar.TableName(projectId); var allRels = SqlSugarHelper.Db.Queryable().AS(relTbName).ToList(); var pixelTbName = ProjectSugar.TableName(projectId); var allPixels = SqlSugarHelper.Db.Queryable().AS(pixelTbName). Where(x => x.DeleteFlg != 1).ToList(); var relTypeTbName = ProjectSugar.TableName(projectId); var relType = SqlSugarHelper.Db.Queryable().AS(relTypeTbName).ToList().FirstOrDefault(x => x.RelType == ((int)enum_RelType.设备_电缆).ToString()); var propBll = new ec_enginedata_propertyBLL(); var CBs = allCBs.Where(x => x.PDBId == Enginedataid).ToList(); var allTagProps = SqlSugarHelper.Db.Queryable().AS(propTbName).ToList(); var dataitembll = new ec_dataitemBLL(); var systems = dataitembll.GetDetailList(GlobalObject.enumlist_System, "", projectId); res = await relBll.GetTagCableConns(projectId, Enginedataid, breakerType, RefCBs, allTag, CBs, allRels, allPixels, relType, allTagProps,null, systems); return Success(res); } /// /// 查询所有 /// /// /// public IHttpActionResult GetAllTagsAsync(string projectId) { var bll = new ec_enginedataBLL(); var res = bll.GetList("{\"ProjectId\":\"" + projectId + "\"}"); return Success(res); } /// /// 查询多个设备上的所有端子连接关系,用于如端子图的绘制 /// /// /// 逗号分开 /// 是否为监测系统 /// public async Task GetTagTermConnsByIdsAsync(string projectId, string Enginedataids, string dwgId, bool IsAlarmSystem = true) { var res = new List(); var relBll = new ec_enginedata_relBLL(); foreach (var id in Enginedataids.Split(',')) { var res2 = await relBll.GetTagTermConns(projectId, id, dwgId, IsAlarmSystem); res.Add(res2); } return Success(res); } /// /// 解锁、加锁 /// /// /// 逗号分开 /// 加锁1或解锁0 /// public async Task LockTag(string projectId, string Enginedataids, string action) { var res = new List(); var Bll = new ec_enginedataBLL(); foreach (var id in Enginedataids.Split(',')) { await Bll.LockTag(projectId, id, action); } return Success("OK"); } /// /// 查询多个设备上的所有端子连接关系,用于如端子图的绘制 /// /// /// 逗号分开 /// 是否为监测系统 /// public async Task GetTagTermConnsByPixelsAsync(string projectId, string pixels, string dwgId, bool IsAlarmSystem = true) { var res = new List(); var relBll = new ec_enginedata_relBLL(); // var pixelTbName = ProjectSugar.TableName(projectId); var list_pixel = pixels.Split(',').ToList(); var Ids = SqlSugarHelper.Db.Queryable().AS(pixelTbName). Where(x => x.DrawingFileID == dwgId && list_pixel.Contains(x.PixelCode)). Select(X => X.EngineDataID).Distinct().ToList(); foreach (var id in Ids) { var res2 = await relBll.GetTagTermConns(projectId, id, dwgId, IsAlarmSystem); res.Add(res2); } return Success(res); } /// /// 获取最新流水号 /// /// 项目ID /// 位号前面的内容 /// [HttpGet] public IHttpActionResult GetLatestSerialNumber(string projectId, string TagLeftPart, int Number = 1) { try { // && Regex.IsMatch(x.TagNumber.Substring(TagLeftPart.Length), @"^\d+$") // Select(x => int.Parse(x.TagNumber.ToUpper().Substring(TagLeftPart.Length))). var res = new List(); TagLeftPart = TagLeftPart.ToUpper() + "-"; var tbName = ProjectSugar.TableName(projectId); var existTagsNumber = SqlSugarHelper.Db.Queryable().AS(tbName). Where(x => x.TagNumber.ToUpper().StartsWith(TagLeftPart)). Select(x => x.TagNumber). ToList(); List seqs = new List(); foreach (var id in existTagsNumber) { var RightPart = id.Substring(TagLeftPart.Length); if (int.TryParse(RightPart, out int seq)) { seqs.Add(seq); } } int minMissingNumber = 1; for (int i = 0; i < Number; i++) { while (seqs.Contains(minMissingNumber)) { minMissingNumber++;//已有这个序号 }; res.Add(minMissingNumber.ToString("D5")); minMissingNumber++;//本来需要循环+1 } // 将最小缺失数字格式化为5位数字字符串,前面补0 return Success(res); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 获取位号的工程属性(根据位号) /// /// 项目ID /// 位号 /// [HttpGet] [ResponseType(typeof(ec_enginedataEntity))] public IHttpActionResult GetTagsByTag(string projectId, string tagNumber, string caseId = "") { try { var ec_enginedataIBLL = new ec_enginedataBLL(); var ec_enginedata_propertyIBLL = new ec_enginedata_propertyBLL(); var data = ec_enginedataIBLL.GetList("{\"ProjectId\":\"" + projectId + "\",\"TagNumber\":\"" + tagNumber + "\"}").ToList(); if (data != null && data.Count > 0) { //获取工程数据属性 data[0].EngineDataProperty = ec_enginedata_propertyIBLL.GetEnginePropById(projectId, data[0].EngineDataID).ToList(); } return Success(data); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 获取某个图上的所有pixel对象 /// /// /// /// [HttpGet] public IHttpActionResult GetTagPixelsByDrawing(string projectId, string drawingFileID) { try { //var engineData = new ec_enginedataBLL().GetList("{\"ProjectId\":\"" + projectId + "\",\"DrawingFileID\":\"" + drawingFileID + "\",\"PixelCodes\":\"" + pixels + "\"}").ToList(); var res = new ec_enginedata_pixelBLL().GetDrawingEnginePixel("{\"ProjectId\":\"" + projectId + "\",\"DrawingFileID\":\"" + drawingFileID + "\"}").ToList(); return Success(res); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 成品导出(xlsx) /// /// 项目编号 /// 图纸ID /// 0=web,1=app /// [HttpGet] public IHttpActionResult CheckIsRequiredPropsByDrawing(string projectId, string drawingId, int mode = 1) { try { var BLL = new ec_enginedataBLL(); var bytes = BLL.CheckIsRequiredPropsByDrawing(projectId, drawingId); if (mode == 1) { //app var stream = new MemoryStream(bytes); FileDownHelper.DownLoad(stream, $"必填属性缺失检查{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx");//自动化平台导出excel } else { //web ExcelHelper.DownloadIWorkbook(bytes, $"必填属性缺失检查{DateTime.Now.ToString("yyyyMMddHHmmss")}"); } return Success("数据已导出"); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 获取某个图上的所有位号(前端再根据情况进行过滤) /// /// /// /// [HttpGet] public IHttpActionResult GetTagsByDrawing(string projectId, string drawingFileID) { try { //var engineData = new ec_enginedataBLL().GetList("{\"ProjectId\":\"" + projectId + "\",\"DrawingFileID\":\"" + drawingFileID + "\",\"PixelCodes\":\"" + pixels + "\"}").ToList(); var res = new ec_enginedataBLL().GetListByDrawing(projectId, drawingFileID); return Success(res); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 根据图纸ID, CAD图元句柄获取该图元在数据库中对应的位号、对象类型ID、对象类型名称、对象EngineDataID。 /// 系统图识别,和求设备连接关系时会用到。 /// /// /// /// 多个逗号隔开 /// public IHttpActionResult GetTagInfoByPixels(string projId, string drawingFileID, string pixelIds) { try { var res2 = new List(); var Ids = pixelIds.Split(','); var pixelTbName = ProjectSugar.TableName(projId); var tagTbName = ProjectSugar.TableName(projId); var typeTbName = ProjectSugar.TableName(projId); var propTbName = ProjectSugar.TableName(projId); var allPixels = SqlSugarHelper.Db.Queryable().AS(pixelTbName). Where(x => x.DrawingFileID == drawingFileID && Ids.Contains(x.PixelCode)).ToList(); var TagIds = allPixels.Select(x => x.EngineDataID).Distinct().ToList(); var allProps = SqlSugarHelper.Db.Queryable().AS(propTbName). Where(x => TagIds.Contains(x.EngineDataID)).ToList(); if (TagIds != null) { foreach (var TagId in TagIds) { //对应的句柄有哪些 var tagPixelsOnThisDwg = allPixels.Where(x => x.EngineDataID == TagId).Select(x => x.PixelCode).ToList(); if (tagPixelsOnThisDwg == null) { tagPixelsOnThisDwg = new List(); } var stringPixels = string.Join(",", tagPixelsOnThisDwg); var desc = allProps.FirstOrDefault(x => x.EngineDataID == TagId && x.PropertyName == "中文名称")?.PropertyValue; var descEN = allProps.FirstOrDefault(x => x.EngineDataID == TagId && x.PropertyName == "英文名称")?.PropertyValue; var supplyBy = allProps.FirstOrDefault(x => x.EngineDataID == TagId && x.PropertyName == "电缆供货类型")?.PropertyValue; var TagObj = SqlSugarHelper.Db.Queryable().AS(tagTbName). LeftJoin((a, b) => a.ObjectTypeID == b.ObjectTypeID).AS(typeTbName). Select((a, b) => new { a.TagNumber, a.EngineDataID, a.ObjectTypeID, b.ObjectTypeName, stringPixels, desc, descEN, supplyBy }). First(a => a.EngineDataID == TagId); //var allPixels = SqlSugarHelper.Db.Queryable().AS(pixelTbName). //Where(x => x.EngineDataID == TagId). //Select(x => new //{ // x.PixelCode, // x.DrawingFileID //}). //ToList(); if (TagObj != null) { res2.Add(TagObj); } } return Success(res2); } else { return Success(null); } } catch (Exception) { return Success(null); } } /// /// 获取某个所属系统的所有位号 /// /// /// /// [HttpGet] public IHttpActionResult GetTagsBySystem(string projectId, string system) { try { //var engineData = new ec_enginedataBLL().GetList("{\"ProjectId\":\"" + projectId + "\",\"DrawingFileID\":\"" + drawingFileID + "\",\"PixelCodes\":\"" + pixels + "\"}").ToList(); var res = new object(); return Success(res); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 获取某个设备单元(如wcc、ecc)的所有位号 /// /// /// /// [HttpGet] public IHttpActionResult GetTagsByUnit(string projectId, string unit) { try { var res = new object(); return Success(res); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 批量反向关联 /// /// /// ID是设备的,而不是开关的 /// [HttpPost] public IHttpActionResult QuickAssign(string projId, [FromBody] IEnumerable entity) { #region 根据传过来的图元集合 if (entity == null) { return Success("OK"); } var ProjectEntity = SqlSugarHelper.Db.Queryable().Single(x => x.ProjectId == projId); foreach (var pixel in entity) { var existPixel = SqlSugarHelper.Db.Queryable().AS($"ec_enginedata_pixel_{ProjectEntity.ProjectIndex}"). First(x => x.DrawingFileID == pixel.DrawingFileID && x.PixelCode == pixel.PixelCode); if (existPixel != null) { existPixel.Modify(existPixel.EngineDataPixelID); existPixel.DeleteFlg = 0; existPixel.EngineDataID = pixel.EngineDataID; existPixel.LibraryFileID = pixel.LibraryFileID; existPixel.MaxPointX = pixel.MaxPointX; existPixel.MinPointX = pixel.MinPointX; existPixel.MaxPointY = pixel.MaxPointY; existPixel.MinPointY = pixel.MinPointY; SqlSugarHelper.Db.Updateable(existPixel).AS($"ec_enginedata_pixel_{ProjectEntity.ProjectIndex}").ExecuteCommand(); } else { pixel.Create(); pixel.DeleteFlg = 0; pixel.EngineDataID = pixel.EngineDataID; SqlSugarHelper.Db.Insertable(pixel).AS($"ec_enginedata_pixel_{ProjectEntity.ProjectIndex}").ExecuteCommand(); } //SqlSugarHelper.Db.Ado.ExecuteCommand($" DELETE FROM ec_enginedata_pixel_{ProjectEntity.ProjectIndex} WHERE DrawingFileID = '{pixel.DrawingFileID}' AND PixelCode = '{pixel.PixelCode}';"); } return Success("OK"); //db.InsertByNoMap(entity.EngineDataPixel, $"ec_enginedata_pixel_{ProjectEntity.ProjectIndex}"); #endregion } /// /// 成品导出(xlsx),用于二三维联动用的,三维坐标信息。 /// /// 项目编号 /// /// [HttpGet] public void ExportExcel(string projectId, ExportType exportType) { var BLL = new ec_enginedataBLL(); var bytes = BLL.ExportExcel(projectId, exportType); var stream = new MemoryStream(bytes); FileDownHelper.DownLoad(stream, $"BricsCAD_Coordinates_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"); } /// /// 批量的去判断位号是否存在 /// /// /// 每个元素都是aaa,BBB。aaa为位号,bbb为对象类型ID /// public IHttpActionResult CheckTagsExist(string projId, List tagInfo) { var tagBll = new ec_enginedataBLL(); var resAll = new List(); foreach (string tag in tagInfo) { int lastCommaIndex = tag.LastIndexOf(','); if (lastCommaIndex != -1) { } else { return Fail("http请求格式错误。没有逗号"); } } var allDistinctTag = tagInfo.Select(x => x.Split(',')[0]).Distinct().ToList(); foreach (string tag in allDistinctTag) { var type = tagInfo.Where(x => x.Split(',')[0] == tag).Select(x => x.Split(',')[1]).Distinct().ToList(); if (type.Count > 1) { return Fail($"不同类型对象位号有重复,如{tag}"); } } foreach (string tag in tagInfo) { int lastCommaIndex = tag.LastIndexOf(','); if (lastCommaIndex != -1) { Console.WriteLine($"最右侧的逗号位置是: {lastCommaIndex}"); string LeftPart = tag.Substring(0, lastCommaIndex); string lastPart = tag.Substring(lastCommaIndex + 1); if (LeftPart.Length == 0 || lastPart.Length == 0) { return Fail("http请求格式错误。逗号两侧的长度有为0的"); } var res = ""; var res2 = tagBll.CheckTagExist(projId, LeftPart, lastPart, out res); if (res2) { resAll.Add(LeftPart + "," + res); } } else { return Fail("http请求格式错误。没有逗号"); } } return Success(resAll); } /// /// 检查同一根电缆是否存在于2份图纸中 /// /// 项目编号 /// 图纸编号 /// [HttpGet] public IHttpActionResult CheckIsNotExistInOtherDrawings(string projectId, string drawingFileID) { try { var res = new ec_enginedata_pixelBLL().CheckTagIsNotExistInOtherDrawings(projectId, drawingFileID); if (res.IsEmpty()) { return Fail("没有错误数据"); } var stream = new MemoryStream(res); FileDownHelper.DownLoad(stream, $"BricsCAD_ShortageOfCables_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx" , "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); return Success("数据已导出"); } catch (Exception ex) { return Fail(ex.Message); } } } }