RelationTypeManager.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using SAGA.DotNetUtils;
  7. using SAGA.DotNetUtils.NPOI;
  8. using SAGA.Models;
  9. namespace SAGA.GplotRelationComputerManage
  10. {
  11. /// <summary>
  12. /// 关联类型管理
  13. /// </summary>
  14. public class RelationTypeManager
  15. {
  16. //暂时不用字典
  17. public static List<RelationItem> Items { get; private set; }
  18. static RelationTypeManager()
  19. {
  20. try
  21. {
  22. InitItems();
  23. }
  24. catch (Exception ex)
  25. {
  26. }
  27. }
  28. #region 私有方法
  29. private static void InitItems()
  30. {
  31. List<RelationItem> items = new List<RelationItem>();
  32. string file = StaticData.GdRelationship;
  33. var relationInfos = NPOIHelper.ConvertExcelSheetToModel<RelationRow>(file);
  34. var useRelationInfos = relationInfos.Where(c => !string.IsNullOrEmpty(c.RelationshipType));
  35. var group = useRelationInfos.GroupBy(c => c.RelationshipType);
  36. foreach (var item in group)
  37. {
  38. var relationItem = new RelationItem();
  39. relationItem.Type = item.Key;
  40. var childItems = item.ToList();
  41. var firstItem = childItems[0];
  42. relationItem.Name = firstItem.RelationName;
  43. #region 遍历边类型
  44. foreach (var child in childItems)
  45. {
  46. EdgeItem edgeItem = new EdgeItem();
  47. edgeItem.Type = child.EdgeType;
  48. edgeItem.Name = child.EdgeName;
  49. edgeItem.IsDirected = "1".Equals(child.EdgeDirection);
  50. relationItem.EdgeTypes.Add(edgeItem);
  51. }
  52. #endregion
  53. #region 对象相关处理
  54. var strObjects = firstItem.Objects;
  55. ParseObjects(relationItem, strObjects);
  56. #endregion
  57. #region 系统相关处理
  58. var strSystem = firstItem.Systems;
  59. ParseSystems(relationItem, strSystem);
  60. #endregion
  61. if (firstItem.SystemType == "0")
  62. {
  63. relationItem.SystemType = SystemType.Pipe;
  64. }
  65. else if (firstItem.SystemType == "1")
  66. {
  67. relationItem.SystemType = SystemType.Duct;
  68. }
  69. items.Add(relationItem);
  70. }
  71. Items = items;
  72. }
  73. /// <summary>
  74. /// 解析对象数据
  75. /// </summary>
  76. /// <param name="item"></param>
  77. /// <param name="strObject"></param>
  78. private static void ParseObjects(RelationItem item, string strObject)
  79. {
  80. #region 描述
  81. /*
  82. * 1,object以;或->分割
  83. * 2,对象类型与名称以 -划分
  84. * 3,如果两个对象之间是→,则表示对象关系中,应该是描述的关系
  85. *例子:高压开关柜-TDHS→直流屏-TDDS;
  86. */
  87. #endregion
  88. if (string.IsNullOrEmpty(strObject))
  89. {
  90. return;
  91. }
  92. List<ObjectItem> objectIems = new List<ObjectItem>();
  93. List<BinaryItem<ObjectItem>> relationItems = new List<BinaryItem<ObjectItem>>();
  94. #region 核心解析
  95. var objectArrays = strObject.Split(';');
  96. foreach (var objectArray in objectArrays)
  97. {
  98. List<ObjectItem> useObjects = new List<ObjectItem>();
  99. List<BinaryItem<ObjectItem>> useRelations = new List<BinaryItem<ObjectItem>>();
  100. var singleObjects = objectArray.Split('→');
  101. foreach (var singleObject in singleObjects)
  102. {
  103. ObjectItem objectIem = new ObjectItem();
  104. var propertyArray = singleObject.Split('-');
  105. if (propertyArray.Length == 1)
  106. {
  107. objectIem.Type = propertyArray[0].Trim();
  108. objectIem.Name = propertyArray[0].Trim();
  109. }
  110. else if (propertyArray.Length == 2)
  111. {
  112. objectIem.Type = propertyArray[1].Trim();
  113. objectIem.Name = propertyArray[0].Trim();
  114. }
  115. useObjects.Add(objectIem);
  116. }
  117. for (int i = 1; i < useObjects.Count; i++)
  118. {
  119. BinaryItem<ObjectItem> relationItem = new BinaryItem<ObjectItem>(useObjects[i - 1], useObjects[i]);
  120. useRelations.Add(relationItem);
  121. }
  122. objectIems.AddRange(useObjects);
  123. relationItems.AddRange(useRelations);
  124. }
  125. #endregion
  126. item.Objects.AddRange(objectIems);
  127. item.ObjectRelations.AddRange(relationItems);
  128. }
  129. /// <summary>
  130. /// 解析对象系统类型
  131. /// </summary>
  132. /// <param name="item"></param>
  133. /// <param name="strSystem">系统字符串</param>
  134. private static void ParseSystems(RelationItem item, string strSystem)
  135. {
  136. #region 描述
  137. /*
  138. * 1,系统对象使用;分割
  139. * 2,系统以标志信息开始的流向,1,0,-1;
  140. * 3,系统关联的边类型子集
  141. * 例子:系统名称1|1|1,2,3
  142. */
  143. #endregion
  144. if (string.IsNullOrEmpty(strSystem))
  145. {
  146. return;
  147. }
  148. #region 核心解析
  149. List<SystemItem> systemIems = new List<SystemItem>();
  150. var objectArrays = strSystem.Split(';');
  151. foreach (var objectArray in objectArrays)
  152. {
  153. SystemItem useSystem = new SystemItem();
  154. var systemProperties = objectArray.Split('|');
  155. for (int i = 0; i < systemProperties.Length; i++)
  156. {
  157. SetSystemProperty(useSystem, i, systemProperties[i]);
  158. }
  159. systemIems.Add(useSystem);
  160. }
  161. #endregion
  162. item.Systems.AddRange(systemIems);
  163. }
  164. private static void SetSystemProperty(SystemItem system, int index, string useValue)
  165. {
  166. switch (index)
  167. {
  168. case 0:
  169. system.Name = useValue.Trim();
  170. break;
  171. case 1:
  172. #region 动态解析枚举
  173. system.FlowType = FlowType.Undefine;
  174. if ("-1" == useValue)
  175. {
  176. system.FlowType = FlowType.Out;
  177. }
  178. else if ("1" == useValue)
  179. {
  180. system.FlowType = FlowType.In;
  181. }
  182. #endregion
  183. break;
  184. case 2:
  185. system.ContainEdgeTypes.AddRange(useValue.Split(',').Select(c => c.Trim()));
  186. break;
  187. }
  188. }
  189. #endregion
  190. /// <summary>
  191. /// 获取指定名称图类型
  192. /// </summary>
  193. /// <param name="relationType"></param>
  194. /// <returns></returns>
  195. public static RelationItem GetRelationTypeItem(string relationType)
  196. {
  197. return Items.FirstOrDefault(c => c.Type == relationType);
  198. }
  199. /// <summary>
  200. /// 获取全部系统的关系类型
  201. /// </summary>
  202. /// <returns></returns>
  203. public static List<RelationItem> GetSystemRelationTypes()
  204. {
  205. return Items.Where(r => r.SystemType!=SystemType.Unknown).ToList();
  206. }
  207. /// <summary>
  208. /// 获取全部系统的关系类型
  209. /// </summary>
  210. /// <returns></returns>
  211. public static List<string> GetSystemRelationTypeNames()
  212. {
  213. return new List<string>() { "ChillWaterLoop" };
  214. return GetSystemRelationTypes().Select(r => r.Type).ToList() ;
  215. }
  216. }
  217. }