RelationTypeManager.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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 == "1")
  62. {
  63. relationItem.SystemType = SystemType.Duct;
  64. }
  65. items.Add(relationItem);
  66. }
  67. Items = items;
  68. }
  69. /// <summary>
  70. /// 解析对象数据
  71. /// </summary>
  72. /// <param name="item"></param>
  73. /// <param name="strObject"></param>
  74. private static void ParseObjects(RelationItem item, string strObject)
  75. {
  76. #region 描述
  77. /*
  78. * 1,object以;或->分割
  79. * 2,对象类型与名称以 -划分
  80. * 3,如果两个对象之间是→,则表示对象关系中,应该是描述的关系
  81. *例子:高压开关柜-TDHS→直流屏-TDDS;
  82. */
  83. #endregion
  84. if (string.IsNullOrEmpty(strObject))
  85. {
  86. return;
  87. }
  88. List<ObjectItem> objectIems = new List<ObjectItem>();
  89. List<BinaryItem<ObjectItem>> relationItems = new List<BinaryItem<ObjectItem>>();
  90. #region 核心解析
  91. var objectArrays = strObject.Split(';');
  92. foreach (var objectArray in objectArrays)
  93. {
  94. List<ObjectItem> useObjects = new List<ObjectItem>();
  95. List<BinaryItem<ObjectItem>> useRelations = new List<BinaryItem<ObjectItem>>();
  96. var singleObjects = objectArray.Split('→');
  97. foreach (var singleObject in singleObjects)
  98. {
  99. ObjectItem objectIem = new ObjectItem();
  100. var propertyArray = singleObject.Split('-');
  101. if (propertyArray.Length == 1)
  102. {
  103. objectIem.Type = propertyArray[0].Trim();
  104. objectIem.Name = propertyArray[0].Trim();
  105. }
  106. else if (propertyArray.Length == 2)
  107. {
  108. objectIem.Type = propertyArray[1].Trim();
  109. objectIem.Name = propertyArray[0].Trim();
  110. }
  111. useObjects.Add(objectIem);
  112. }
  113. for (int i = 1; i < useObjects.Count; i++)
  114. {
  115. BinaryItem<ObjectItem> relationItem = new BinaryItem<ObjectItem>(useObjects[i - 1], useObjects[i]);
  116. useRelations.Add(relationItem);
  117. }
  118. objectIems.AddRange(useObjects);
  119. relationItems.AddRange(useRelations);
  120. }
  121. #endregion
  122. item.Objects.AddRange(objectIems);
  123. item.ObjectRelations.AddRange(relationItems);
  124. }
  125. /// <summary>
  126. /// 解析对象系统类型
  127. /// </summary>
  128. /// <param name="item"></param>
  129. /// <param name="strSystem">系统字符串</param>
  130. private static void ParseSystems(RelationItem item, string strSystem)
  131. {
  132. #region 描述
  133. /*
  134. * 1,系统对象使用;分割
  135. * 2,系统以标志信息开始的流向,1,0,-1;
  136. * 3,系统关联的边类型子集
  137. * 例子:系统名称1|1|1,2,3
  138. */
  139. #endregion
  140. if (string.IsNullOrEmpty(strSystem))
  141. {
  142. return;
  143. }
  144. #region 核心解析
  145. List<SystemItem> systemIems = new List<SystemItem>();
  146. var objectArrays = strSystem.Split(';');
  147. foreach (var objectArray in objectArrays)
  148. {
  149. SystemItem useSystem = new SystemItem();
  150. var systemProperties = objectArray.Split('|');
  151. for (int i = 0; i < systemProperties.Length; i++)
  152. {
  153. SetSystemProperty(useSystem, i, systemProperties[i]);
  154. }
  155. systemIems.Add(useSystem);
  156. }
  157. #endregion
  158. item.Systems.AddRange(systemIems);
  159. }
  160. private static void SetSystemProperty(SystemItem system, int index, string useValue)
  161. {
  162. switch (index)
  163. {
  164. case 0:
  165. system.Name = useValue.Trim();
  166. break;
  167. case 1:
  168. #region 动态解析枚举
  169. system.FlowType = FlowType.Undefine;
  170. if ("-1" == useValue)
  171. {
  172. system.FlowType = FlowType.Out;
  173. }
  174. else if ("1" == useValue)
  175. {
  176. system.FlowType = FlowType.In;
  177. }
  178. #endregion
  179. break;
  180. case 2:
  181. system.ContainEdgeTypes.AddRange(useValue.Split(',').Select(c => c.Trim()));
  182. break;
  183. }
  184. }
  185. #endregion
  186. /// <summary>
  187. /// 获取指定名称图类型
  188. /// </summary>
  189. /// <param name="relationType"></param>
  190. /// <returns></returns>
  191. public static RelationItem GetRelationTypeItem(string relationType)
  192. {
  193. return Items.FirstOrDefault(c => c.Type == relationType);
  194. }
  195. }
  196. }