Browse Source

xls:sqlite应用升级,风口计算

xulisong 6 năm trước cách đây
mục cha
commit
a47b0290b6

BIN
MBI/MBIResource/BaseDB/SqliteVersion.xml


BIN
MBI/MBIResource/Config/物理世界关系定义列表-2019-1.xlsx


+ 46 - 2
MBI/SAGA.DotNetUtils/DB/SQLiteUpdateUtil.cs

@@ -10,14 +10,58 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Saga.Framework.DB.Sqlite;
+using SAGA.DotNetUtils.Data.Framework.Sqlite;
 
 namespace SAGA.DotNetUtils.DB
 {
     public static class SQLiteUpdateUtil
     {
-        public static void UpdateDb(int oldVersion, int newVersion)
+        private static int chekTimes = 1;
+        /// <summary>
+        /// 更新默认数据库
+        /// </summary>
+        public static void UpdateDb()
         {
-           // SQLiteHelper.exno
+            //return;
+            try
+            {
+                if (chekTimes > 0)
+                {
+                    SqliteDatabase dataBase = new SqliteDatabase(SQLiteHelper.ConnectionString);
+                    VersionManager.Default.UpdateDatabaseVersion(dataBase);
+                    chekTimes--;
+                }
+            }
+            catch (Exception)
+            {
+
+            }         
+        }
+
+        /// <summary>
+        /// 使用指定配置文件更新数据库
+        /// </summary>
+        /// <param name="versionPath">配置文件路径</param>
+        public static void UpdateDb(string versionPath)
+        {
+            //return;
+            try
+            {
+                if (chekTimes > 0)
+                {
+                    var manager = new VersionManager(versionPath);
+                    //VersionManager.Init(() => new VersionManager(versionPath));
+                    SqliteDatabase dataBase = new SqliteDatabase(SQLiteHelper.ConnectionString);
+                    //VersionManager.Default.UpdateDatabaseVersion(dataBase);
+                    manager.UpdateDatabaseVersion(dataBase);
+                    chekTimes--;
+                }
+            }
+            catch (Exception)
+            {
+
+            }
         }
     }
 }

+ 40 - 0
MBI/SAGA.DotNetUtils/Data.Framework/Sqlite/SqliteUtil.cs

@@ -0,0 +1,40 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:SqliteUtil
+ * 作者:xulisong
+ * 创建时间: 2019/4/12 10:47:04
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Saga.Framework.DB.Sqlite
+{
+    public static class SqliteUtil
+    {
+        /// <summary>
+        /// 获取用户版本信息
+        /// </summary>
+        /// <param name="database"></param>
+        /// <returns></returns>
+        public static int GetUserVersionNum(this SqliteDatabase database)
+        {
+            string sqlText = "PRAGMA user_version";
+            var result = database.ExecuteScalar(sqlText);
+            return Convert.ToInt32(result);
+        }
+        /// <summary>
+        /// 设置用户版本信息
+        /// </summary>
+        /// <param name="database"></param>
+        /// <param name="versionNum"></param>
+        public static void SetUserVersionNum(this SqliteDatabase database, int versionNum)
+        {
+            string sqlText = "PRAGMA user_version="+versionNum;
+            database.ExecuteNonQuery(sqlText);
+        }
+    }
+}

+ 27 - 0
MBI/SAGA.DotNetUtils/Data.Framework/Sqlite/Version/ExecutionStatement.cs

@@ -0,0 +1,27 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:ExecutionStatementcs
+ * 作者:xulisong
+ * 创建时间: 2019/4/12 10:43:16
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SAGA.DotNetUtils.Data.Framework.Sqlite
+{
+    public class ExecutionStatement
+    {
+        /// <summary>
+        /// 语句串
+        /// </summary>
+        public string SqlText { get; set; }
+        /// <summary>
+        /// 执行顺序
+        /// </summary>
+        public int Index { get; set; }
+    }
+}

+ 37 - 0
MBI/SAGA.DotNetUtils/Data.Framework/Sqlite/Version/VersionItem.cs

@@ -0,0 +1,37 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:VersionItem
+ * 作者:xulisong
+ * 创建时间: 2019/4/12 10:40:29
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+
+namespace SAGA.DotNetUtils.Data.Framework.Sqlite
+{
+    [XmlType("Version")]
+    [XmlRoot("Version")]
+    public class VersionItem
+    {
+        public VersionItem()
+        {
+            Statements = new List<ExecutionStatement>();
+        }
+        /// <summary>
+        /// 版本信息
+        /// </summary>
+        [XmlAttribute]
+        public int Num { get; set; }
+
+        /// <summary>
+        /// 需要执行的语句
+        /// </summary>
+        [XmlArrayItem("Statement")]
+        public List<ExecutionStatement> Statements { get;private set; }
+    }
+}

+ 153 - 0
MBI/SAGA.DotNetUtils/Data.Framework/Sqlite/Version/VersionManager.cs

@@ -0,0 +1,153 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:VersionManager
+ * 作者:xulisong
+ * 创建时间: 2019/4/12 10:52:51
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+using System.Xml.Serialization;
+using Saga.Framework.DB.Sqlite;
+
+namespace SAGA.DotNetUtils.Data.Framework.Sqlite
+{
+   public  class VersionManager
+    {
+        private static VersionManager m_Default;
+        public static VersionManager Default
+        {
+            get
+            {
+                if (m_Default == null)
+                {
+                    m_Default = m_InitManager?.Invoke();
+                }
+                if (m_Default == null)
+                {                  
+                    string defaultPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SqliteVersion.xml");
+                    m_Default = new VersionManager(defaultPath);
+                }
+                return m_Default;
+            }
+        }
+        private static Func<VersionManager> m_InitManager;
+        public static void Init(Func<VersionManager> initManager)
+        {
+            m_Default = null;
+            m_InitManager = initManager;
+        }
+        #region 加载保存版本信息
+        private static XmlSerializer CreateSerializer<T>()
+        {
+            Type type = typeof(T);
+            string useRootName = null;
+            if (type.IsGenericType)
+            {
+                var attribute = type.GetGenericArguments()[0].GetCustomAttribute(typeof(XmlRootAttribute)) as XmlRootAttribute;
+                if (attribute != null)
+                {
+                    useRootName = attribute.ElementName + "s";
+                }
+            }
+            XmlSerializer xs = null;
+            if (string.IsNullOrEmpty(useRootName))
+            {
+                xs = new XmlSerializer(type);
+            }
+            else
+            {
+                xs = new XmlSerializer(type, new XmlRootAttribute(useRootName));
+            }
+           
+            return xs;
+        }
+        public static void SaveVersions(List<VersionItem> versions, string path)
+        {
+            StringBuilder sb = new StringBuilder();
+            using (TextWriter writer = new StringWriter(sb))
+            {
+                XmlTextWriter xtw = new XmlTextWriter(writer);
+                xtw.Formatting = Formatting.Indented;
+                var serializer = CreateSerializer<List<VersionItem>>();
+                serializer.Serialize(xtw, versions);
+                if (!File.Exists(path))
+                {
+                    var directory = Path.GetDirectoryName(path);
+                    if (!Directory.Exists(directory))
+                    {
+                        Directory.CreateDirectory(directory);
+                    }
+                }
+                File.WriteAllText(path, sb.ToString());
+            }
+              
+        }
+
+        public static List<VersionItem> GetVersions(string path)
+        {
+            List<VersionItem> items = new List<VersionItem>();
+            if (!File.Exists(path))
+            {
+                return items;
+            }
+            using (TextReader tr = new StreamReader(path))
+            {
+                XmlTextReader xtr = new XmlTextReader(tr);
+               
+                var serializer = CreateSerializer<List<VersionItem>>();
+                items = serializer.Deserialize(xtr) as List<VersionItem>;
+            }
+            return items??new List<VersionItem>();
+        }
+        #endregion
+        public VersionManager(List<VersionItem> versions)
+        {
+            //可以在配置文件加载
+            //需要整理版本顺序,和语句执行顺序
+            VersionItems = versions;
+        }
+
+        public VersionManager(string configPath)
+        {
+            VersionItems = GetVersions(configPath);
+        }
+        public List<VersionItem> VersionItems { get; private set; }
+
+        /// <summary>
+        /// 更新给定库,到版本集合中的最高版本
+        /// </summary>
+        /// <param name="database"></param>
+        public void UpdateDatabaseVersion(SqliteDatabase database)
+        {
+            var oldNum = database.GetUserVersionNum();
+            var orderVersionItems=VersionItems.OrderBy(v => v.Num).ToList();
+            foreach (var orderVersionItem in orderVersionItems)
+            {
+                if (orderVersionItem.Num <= oldNum)
+                {
+                    continue;
+                }
+
+                var orderStatements =
+                    (orderVersionItem.Statements ?? new List<ExecutionStatement>()).OrderBy(s => s.Index);
+                foreach (var executionStatement in orderStatements)
+                {
+                    if (string.IsNullOrWhiteSpace(executionStatement.SqlText))
+                    {
+                        continue;
+                    }
+                    database.ExecuteNonQuery(executionStatement.SqlText);
+                }
+
+                database.SetUserVersionNum(orderVersionItem.Num);
+            }
+        }
+    }
+}

+ 1 - 1
MBI/SAGA.DotNetUtils/NPOI/WorkbookExtension.cs

@@ -90,7 +90,7 @@ namespace SAGA.DotNetUtils.NPOI
                     break;
                 }
                 //todo 待完善
-                useCell.SetCellValue(value.ToString());
+                useCell.SetCellValue((value??string.Empty).ToString());
                 break;
             } while (false);
             return useCell;

+ 4 - 1
MBI/SAGA.DotNetUtils/SAGA.DotNetUtils.csproj

@@ -280,6 +280,10 @@
     <Compile Include="Data.Framework\IDal.cs" />
     <Compile Include="Data.Framework\Sqlite\SqliteDal.cs" />
     <Compile Include="Data.Framework\Sqlite\SqliteDatabase.cs" />
+    <Compile Include="Data.Framework\Sqlite\SqliteUtil.cs" />
+    <Compile Include="Data.Framework\Sqlite\Version\ExecutionStatement.cs" />
+    <Compile Include="Data.Framework\Sqlite\Version\VersionItem.cs" />
+    <Compile Include="Data.Framework\Sqlite\Version\VersionManager.cs" />
     <Compile Include="Data\EdgesArray\EdgesArrayBase.cs" />
     <Compile Include="Data\EdgesArray\DBCollection.cs" />
     <Compile Include="Data\EdgesArray\EAEdge.cs" />
@@ -559,7 +563,6 @@
   <ItemGroup>
     <Resource Include="Image\search.jpg" />
   </ItemGroup>
-  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="..\packages\MrAdvice.2.5.24\build\MrAdvice.targets" Condition="Exists('..\packages\MrAdvice.2.5.24\build\MrAdvice.targets')" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

+ 18 - 10
MBI/SAGA.GplotManage/TopologyApplication/SpaceAirSupply/SpaceAirSupplyDocUtil.cs

@@ -25,25 +25,33 @@ namespace SAGA.GplotManage.TopologyApplication
         /// <param name="results"></param>
         public static void Save(string path, List<SpaceAirSupplyResultItem> results)
         {
-            IWorkbook book = new XSSFWorkbook(path);
+            var orderResults = results.OrderBy(s => s.Floor?.FloorSequenceID).ThenBy(s => s.AirVent?.Id).ToList();
+            IWorkbook book = new XSSFWorkbook();
             ISheet sheet = book.CreateSheet("Sheet1");
-            List<string> headNames = new List<string>() { "空间id", "空间revitId", "风口id", "风口revitId", "供风设备Id", "供风设备revitId" };
+            List<string> headNames = new List<string>() {"楼层id","楼层名称", "供风设备Id", "供风设备revitId", "风口id", "风口revitId", "空间id", "空间revitId" };
             for (int i = 0; i < headNames.Count; i++)
             {
                 sheet.SetCellValue(0,i,headNames[i]);
             }
 
             int baseRowIndex = 1;
-            for (int i = 0; i < results.Count; i++)
+            int baseColumnIndex = 0;
+            for (int i = 0; i < orderResults.Count; i++)
             {
-                var useResult = results[i];
+                var useResult = orderResults[i];
                 int useIndex = baseRowIndex + i;
-                sheet.SetCellValue(useIndex, 0, useResult.Space.Id);
-                sheet.SetCellValue(useIndex, 1, useResult.Space.RevitId);
-                sheet.SetCellValue(useIndex, 2, useResult.AirVent.Id);
-                sheet.SetCellValue(useIndex, 3, useResult.AirVent.RevitId);
-                sheet.SetCellValue(useIndex, 4, useResult.AirSupply.Id);
-                sheet.SetCellValue(useIndex, 5, useResult.AirSupply.RevitId);
+                //使用++来替代原始的0,1,2,3的顺序
+                int flag = 0;
+                sheet.SetCellValue(useIndex, baseColumnIndex+ flag++, useResult.Floor?.Id);
+                sheet.SetCellValue(useIndex, baseColumnIndex + flag++, useResult.Floor?.LocalName);
+                sheet.SetCellValue(useIndex, baseColumnIndex + flag++, useResult.AirSupply?.Id);
+                sheet.SetCellValue(useIndex, baseColumnIndex + flag++, useResult.AirSupply?.RevitId);
+                sheet.SetCellValue(useIndex, baseColumnIndex + flag++, useResult.AirVent?.Id);
+                sheet.SetCellValue(useIndex, baseColumnIndex + flag++, useResult.AirVent?.RevitId);
+                sheet.SetCellValue(useIndex, baseColumnIndex + flag++, useResult.Space?.Id);
+                sheet.SetCellValue(useIndex, baseColumnIndex + flag++, useResult.Space?.RevitId);
+               
+              
             }
             book.Save(path);
         }

+ 26 - 5
MBI/SAGA.GplotManage/TopologyApplication/SpaceAirSupply/SpaceAirSupplyHandler.cs

@@ -23,6 +23,7 @@ namespace SAGA.GplotManage.TopologyApplication
         {
             EquipmentItems = TopologyApplicationUtil.CreateEquipmentItems();
             Rooms= TopologyApplicationUtil.CreateRoomItems();
+            Floors = TopologyApplicationUtil.CreateFloorItems();
         }
         #region 数据获取
         /// <summary>
@@ -33,7 +34,8 @@ namespace SAGA.GplotManage.TopologyApplication
         /// 缓存空间对象
         /// </summary>
         public CacheItems<string, RoomItem> Rooms { get; private set; }
-       
+
+        public CacheItems<string, FloorItem> Floors { get; private set; }
         /// <summary>
         /// 获取图关系
         /// </summary>
@@ -73,10 +75,11 @@ namespace SAGA.GplotManage.TopologyApplication
             foreach (var graphType in graphTypes)
             {
                 var graph = GetGraph(graphType);
-                var airPorts = graph.Vertexes.Where(v => v.Data == MBIBuiltInCategory.ATIO).ToList();
+                var airPorts = graph.Vertexes.Where(v => v.Data == MBIBuiltInCategory.ATIO||v.Data== MBIBuiltInCategory.VTIO).ToList();
                 foreach (var airPort in airPorts)
                 {
                     var paths=graph.GetPaths2(airPort, v => supplyEquipmentCategories.Contains(v.Data));
+                    List<SpaceAirSupplyResultItem> useItems = new List<SpaceAirSupplyResultItem>();
                     foreach (var endPathNode in paths)
                     {
                         var useEdge = endPathNode.LastOrDefault();
@@ -88,22 +91,40 @@ namespace SAGA.GplotManage.TopologyApplication
                             {
                                 equipinElementSp = GetGraph("EquipinElementSp");
                             }
-
                             SpaceAirSupplyResultItem item = new SpaceAirSupplyResultItem();
                             item.AirVent = EquipmentItems.GetItem(airPort.Id);
+                            if (item.AirVent != null)
+                            {
+                                item.Floor = Floors.GetItem(item.AirVent.FloorId);
+                            }
                             item.AirSupply = EquipmentItems.GetItem(useEdge.NextNode.Id);
                             var spaceRelations = equipinElementSp.GetOutVertexes(airPort.Id);
                             if (spaceRelations != null && spaceRelations.Any())
                             {
                                 item.Space = Rooms.GetItem(spaceRelations[0].Id);
                             }
-                            result.Add(item);
+                            useItems.Add(item);
+                        }
+                    }
+
+                    if (!useItems.Any())
+                    {
+                        SpaceAirSupplyResultItem item = new SpaceAirSupplyResultItem();
+                        item.AirVent = EquipmentItems.GetItem(airPort.Id);
+                        if (item.AirVent != null)
+                        {
+                            item.Floor = Floors.GetItem(item.AirVent.FloorId);
                         }
+
+                        useItems.Add(item);
                     }
+
+                    result.AddRange(useItems);
+
                 }
             }
 
-            SpaceAirSupplyDocUtil.Save(@"c:\airport.xlsx",result);
+            SpaceAirSupplyDocUtil.Save(@"E:\airport.xlsx",result);
             return false;
         }
         public static bool ShellExecute()

+ 4 - 0
MBI/SAGA.GplotManage/TopologyApplication/SpaceAirSupply/SpaceAirSupplyResultItem.cs

@@ -17,6 +17,10 @@ namespace SAGA.GplotManage.TopologyApplication
     public class SpaceAirSupplyResultItem
     {
         /// <summary>
+        /// 风口所在楼层
+        /// </summary>
+        public FloorItem Floor { get; set; }
+        /// <summary>
         /// 风口所在空间信息
         /// </summary>
         public RoomItem Space { get; set; }

+ 29 - 0
MBI/SAGA.GplotManage/TopologyApplication/TopologyApplicationUtil.cs

@@ -62,6 +62,10 @@ namespace SAGA.GplotManage.TopologyApplication
             return items;
         }
 
+        /// <summary>
+        /// 获取设备缓存类
+        /// </summary>
+        /// <returns></returns>
         public static CacheItems<string, EquipmentItem> CreateEquipmentItems()
         {
             CacheItems<string, EquipmentItem> items = new CacheItems<string, EquipmentItem>((s) =>
@@ -82,5 +86,30 @@ namespace SAGA.GplotManage.TopologyApplication
             });
             return items;
         }
+
+        /// <summary>
+        /// 获取楼层缓存类
+        /// </summary>
+        /// <returns></returns>
+        public static CacheItems<string, FloorItem> CreateFloorItems()
+        {
+            CacheItems<string, FloorItem> items = new CacheItems<string, FloorItem>((s) =>
+            {
+                var floorItems = new Dictionary<string, FloorItem>();
+                var types = new string[] { MBIBuiltInCategory.Fl };
+                List<JObject> equipDatas = CommonConvert.QueryObjectInfoByTypes(types);
+                foreach (var jobject in equipDatas)
+                {
+                    var item = MBIItemFactory.Create<FloorItem>(jobject);
+                    if (item != null && !string.IsNullOrWhiteSpace(item.Id))
+                    {
+                        floorItems[item.Id] = item;
+                    }
+                }
+
+                return floorItems;
+            });
+            return items;
+        }
     }
 }

+ 3 - 0
MBI/SAGA.GplotManage/TopologyApplicationCommand.cs

@@ -14,6 +14,7 @@ using Autodesk.Revit.Attributes;
 using Autodesk.Revit.DB;
 using Autodesk.Revit.UI;
 using SAGA.GplotManage.TopologyApplication;
+using SAGA.RevitUtils;
 using SAGA.RevitUtils.Extends;
 
 namespace SAGA.GplotManage
@@ -32,6 +33,7 @@ namespace SAGA.GplotManage
         public override Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
         {
             SearchShaftHandler.ShellExecute();
+            MessageShow.Infomation("完成");
             return Result.Succeeded;
         }
     }
@@ -49,6 +51,7 @@ namespace SAGA.GplotManage
         public override Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
         {
             SpaceAirSupplyHandler.ShellExecute();
+            MessageShow.Infomation("完成");
             return Result.Succeeded;
         }
     }

+ 2 - 1
MBI/SAGA.GplotRelationComputerManage/SystemRelation/SystemComputerHandler.cs

@@ -26,7 +26,8 @@ namespace SAGA.GplotRelationComputerManage
             List<string> testFiles = new List<string>();
 #if DEBUG
             //testFiles.Add("Fl420105000119b7c08edcee11e8a553abe8a598be93.rvt");
-            testFiles.Add("Fl420105000103457586dcf211e8a553531a211276f8.rvt");
+            testFiles.Add("Fl42010500012ca5c61ddcf511e8a5535bb85ffaee3b.rvt");
+            testFiles.Add("Fl42010500015f8ce4eddcf411e8a5532f436ae9c161.rvt");
 #endif
             var fileInfos = RevitModelPath.GetAllRevitFiles();
             foreach (var fileInfo in fileInfos)

+ 9 - 0
MBI/SAGA.MBI/Common/MBIAssistHelper.cs

@@ -31,6 +31,15 @@ namespace SAGA.MBI.Common
                 File.Copy(basePath, targetPath);
             }
             SQLiteHelper.SetDBPath(targetPath);
+            //更新数据库表结构
+            try
+            {
+                string vsrsionPath = Path.Combine(MBIConst.MBIResourcePath, "BaseDB", MBIConst.MBIAssistDBVersion);
+                SQLiteUpdateUtil.UpdateDb(vsrsionPath);
+            }
+            catch (Exception)
+            {
+            }
         }
         /// <summary>
         /// 删除指定层的Duty和BIMID的数据

+ 1 - 1
MBI/SAGA.MBI/Common/MBIConst.cs

@@ -22,7 +22,7 @@ namespace SAGA.MBI.Common
     {
         public static readonly string ManageCur = "ManageCurLocalize.json";
         public static readonly string MBIAssistDBName = "MBIAssistData.db";
-        
+        public static readonly string MBIAssistDBVersion = "SqliteVersion.xml";
         public static readonly string MBITempSettingPath = Path.Combine(AppBaseInfo.AppTempFilePath, "MBI\\SettingsTemp");
 
         public static readonly string MBIImagePath = AppBaseInfo.ImagePath;

+ 5 - 0
MBI/SAGA.Models/MBIItem/MBIBuiltInCategory.cs

@@ -67,6 +67,11 @@ namespace SAGA.Models
         /// 空调风口
         /// </summary>
         public readonly static string ATIO = "ATIO";
+
+        /// <summary>
+        /// 通风风口
+        /// </summary>
+        public readonly static string VTIO = "VTIO";
         /// <summary>
         /// 新风机组
         /// </summary>