CellItemManager.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.Util;
  3. using DocumentFormat.OpenXml.Spreadsheet;
  4. using MECF.Framework.Common.Equipment;
  5. using System;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace MECF.Framework.Common.ToolLayout
  12. {
  13. public class CellItemManager : Singleton<CellItemManager>
  14. {
  15. #region 常量
  16. private const string PWT = "PWT";
  17. #endregion
  18. #region 内部变量
  19. /// <summary>
  20. /// cell数组
  21. /// </summary>
  22. private LayoutCellItem[] _layoutCellItems = new LayoutCellItem[50];
  23. /// <summary>
  24. /// cell模块Id字典(key-模块名称,value-cellId)
  25. /// </summary>
  26. private Dictionary<string,int> _layoutCellModuleIdDic= new Dictionary<string,int>();
  27. /// <summary>
  28. /// 安装好的cell项集合
  29. /// </summary>
  30. private List<LayoutCellItem> _installedLayoutCellItems = new List<LayoutCellItem>();
  31. /// <summary>
  32. /// CellId模块名称字典
  33. /// </summary>
  34. private Dictionary<string, string> _cellIdModuleNameDic = new Dictionary<string, string>();
  35. /// <summary>
  36. /// Metal-Rinse字典(key-Metal名称,value-Rinse集合)
  37. /// </summary>
  38. private Dictionary<string, List<LayoutCellItem>> _metalRinseDictionary = new Dictionary<string, List<LayoutCellItem>>();
  39. /// <summary>
  40. /// 共享Rinse集合
  41. /// </summary>
  42. private List<string> _sharedRinseList = new List<string>();
  43. /// <summary>
  44. /// Rinse-Metal集合字典(key-rinse,value--共享使用的Metal)
  45. /// </summary>
  46. private Dictionary<string, List<string>> _shardRinseMetals = new Dictionary<string, List<string>>();
  47. /// <summary>
  48. /// 共享Rinse Reservoir集合字典(key-rinse,value--共享使用的Reservoir)
  49. /// </summary>
  50. private Dictionary<string, List<string>> _shardRinseReservoirs = new Dictionary<string, List<string>>();
  51. #endregion
  52. /// <summary>
  53. /// 初始化LayoutCellItem
  54. /// </summary>
  55. /// <param name="item"></param>
  56. public void InitialLayoutCellItem(LayoutCellItem item)
  57. {
  58. if(item.CellID==0||!item.Installed)
  59. {
  60. return;
  61. }
  62. if(item.CellID<_layoutCellItems.Length)
  63. {
  64. _layoutCellItems[item.CellID] = item;
  65. if (!string.IsNullOrEmpty(item.ModuleName))
  66. {
  67. _layoutCellModuleIdDic[item.ModuleName] = item.CellID;
  68. }
  69. _cellIdModuleNameDic[$"Cell{item.CellID}"] = item.ModuleName;
  70. }
  71. }
  72. /// <summary>
  73. /// 获取metal旁边的rinse集合
  74. /// </summary>
  75. /// <param name="metalName"></param>
  76. /// <returns></returns>
  77. private List<LayoutCellItem> GetMetalNearbyRinseItems(string metalName)
  78. {
  79. List<LayoutCellItem> layoutCellItems = new List<LayoutCellItem>();
  80. if (_layoutCellModuleIdDic.ContainsKey(metalName))
  81. {
  82. int cellId = _layoutCellModuleIdDic[metalName];
  83. bool checkBackRinse = false;
  84. for (int i = cellId - 1; i >= 0; i--)
  85. {
  86. LayoutCellItem item = _layoutCellItems[i];
  87. if (item == null)
  88. {
  89. continue;
  90. }
  91. if (item.ModuleType == ModuleType.Rinse.ToString())
  92. {
  93. RinseItem rinseItem = RinseItemManager.Instance.GetRinseItem(item.ModuleName);
  94. if (rinseItem == null)
  95. {
  96. continue;
  97. }
  98. if (rinseItem.SubType == PWT)
  99. {
  100. continue;
  101. }
  102. if (item.Installed)
  103. {
  104. layoutCellItems.Add(item);
  105. checkBackRinse = true;
  106. break;
  107. }
  108. }
  109. else if (item.ModuleType == ModuleType.Metal.ToString())
  110. {
  111. if (!checkBackRinse)
  112. {
  113. continue;
  114. }
  115. else
  116. {
  117. break;
  118. }
  119. }
  120. else
  121. {
  122. break;
  123. }
  124. }
  125. bool checkForwardRinse = false;
  126. for (int i = cellId; i < _layoutCellItems.Length; i++)
  127. {
  128. LayoutCellItem item = _layoutCellItems[i];
  129. if (item == null)
  130. {
  131. continue;
  132. }
  133. if (item.ModuleType == ModuleType.Rinse.ToString())
  134. {
  135. RinseItem rinseItem = RinseItemManager.Instance.GetRinseItem(item.ModuleName);
  136. if (rinseItem == null)
  137. {
  138. continue;
  139. }
  140. if (rinseItem.SubType == PWT)
  141. {
  142. continue;
  143. }
  144. if (item.Installed)
  145. {
  146. layoutCellItems.Add(item);
  147. checkForwardRinse = true;
  148. break;
  149. }
  150. }
  151. else if (item.ModuleType == ModuleType.Metal.ToString())
  152. {
  153. if (!checkForwardRinse)
  154. {
  155. continue;
  156. }
  157. else
  158. {
  159. break;
  160. }
  161. }
  162. else
  163. {
  164. break;
  165. }
  166. }
  167. }
  168. return layoutCellItems;
  169. }
  170. /// <summary>
  171. /// 获取所有Layout Cell项
  172. /// </summary>
  173. /// <returns></returns>
  174. public void InitializeLayoutCellItems()
  175. {
  176. foreach (LayoutCellItem item in _layoutCellItems)
  177. {
  178. if (item != null&&item.Installed)
  179. {
  180. _installedLayoutCellItems.Add(item);
  181. }
  182. }
  183. AnalyseMetalRinse();
  184. DATA.Subscribe("System.LayoutCellItems", () => _installedLayoutCellItems.Select(obj => obj.ModuleName).ToList(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
  185. }
  186. /// <summary>
  187. /// 解析Metal Rinse的关系
  188. /// </summary>
  189. private void AnalyseMetalRinse()
  190. {
  191. List<string> reservoir = ReservoirItemManager.Instance.InstalledModules;
  192. List<string> rinseList = new List<string>();
  193. foreach (var item in reservoir)
  194. {
  195. List<string> metals=ReservoirItemManager.Instance.GetMetalsByReservoir(item);
  196. List<string> reservoirRinse = new List<string>();
  197. foreach(string metalItem in metals)
  198. {
  199. List<LayoutCellItem> cellItems=GetMetalNearbyRinseItems(metalItem);
  200. _metalRinseDictionary[metalItem] = cellItems;
  201. foreach(LayoutCellItem cellItem in cellItems)
  202. {
  203. if(!reservoirRinse.Contains(cellItem.ModuleName))
  204. {
  205. reservoirRinse.Add(cellItem.ModuleName);
  206. }
  207. }
  208. }
  209. //解析所有共享Rinse集合
  210. foreach (string rinseItem in reservoirRinse)
  211. {
  212. if(!rinseList.Contains(rinseItem))
  213. {
  214. rinseList.Add(rinseItem);
  215. }
  216. else
  217. {
  218. _sharedRinseList.Add(rinseItem);
  219. }
  220. }
  221. }
  222. //解析共享Rinse所有Metal集合
  223. foreach (var item in _sharedRinseList)
  224. {
  225. List<string> lst = new List<string>();
  226. _shardRinseMetals[item]=lst;
  227. List<string> lstReservoirs = new List<string>();
  228. _shardRinseReservoirs[item]=lstReservoirs;
  229. foreach (string metalItem in _metalRinseDictionary.Keys)
  230. {
  231. List<LayoutCellItem> rinseItems = _metalRinseDictionary[metalItem];
  232. if(rinseItems.Find(O=>O.ModuleName== item) != null)
  233. {
  234. lst.Add(metalItem);
  235. string reservoirName = ReservoirItemManager.Instance.GetReservoirByMetal(metalItem);
  236. if (!lstReservoirs.Contains(reservoirName))
  237. {
  238. lstReservoirs.Add(reservoirName);
  239. }
  240. }
  241. }
  242. }
  243. }
  244. /// <summary>
  245. /// 根据CellId获取Cell名称
  246. /// </summary>
  247. /// <param name="cellId"></param>
  248. /// <returns></returns>
  249. public string GetModuleNameByCellId(string cellId)
  250. {
  251. return _cellIdModuleNameDic.ContainsKey(cellId) ? _cellIdModuleNameDic[cellId] : "";
  252. }
  253. /// <summary>
  254. /// 根据模块名称获取cellId
  255. /// </summary>
  256. /// <param name="moduleName"></param>
  257. /// <returns></returns>
  258. public int GetCellIdByModuleName(string moduleName)
  259. {
  260. return _layoutCellModuleIdDic.ContainsKey(moduleName) ? _layoutCellModuleIdDic[moduleName] : 0;
  261. }
  262. /// <summary>
  263. /// 根据Metal获取关联Rinse集合
  264. /// </summary>
  265. /// <param name="metalName"></param>
  266. /// <returns></returns>
  267. public List<LayoutCellItem> GetRinseItemsByMetal(string metalName)
  268. {
  269. return _metalRinseDictionary.ContainsKey(metalName) ? _metalRinseDictionary[metalName] : null;
  270. }
  271. /// <summary>
  272. /// 检验Rinse是否共享
  273. /// </summary>
  274. /// <param name="rinseName"></param>
  275. /// <returns></returns>
  276. public bool CheckRinseIsShared(string rinseName)
  277. {
  278. return _sharedRinseList.Contains(rinseName);
  279. }
  280. /// <summary>
  281. /// 根据共享Rinse获取所有Metals
  282. /// </summary>
  283. /// <param name="sharedRinseName"></param>
  284. /// <returns></returns>
  285. public List<string> GetMetalsBySharedRinse(string sharedRinseName)
  286. {
  287. return _shardRinseMetals.ContainsKey(sharedRinseName)?_shardRinseMetals[sharedRinseName] : null;
  288. }
  289. /// <summary>
  290. /// 根据共享Rinse获取所有Reservoirs
  291. /// </summary>
  292. /// <param name="sharedRinseName"></param>
  293. /// <returns></returns>
  294. public List<string> GetReservoirsBySharedRinse(string sharedRinseName)
  295. {
  296. return _shardRinseReservoirs.ContainsKey(sharedRinseName) ? _shardRinseReservoirs[sharedRinseName] : null;
  297. }
  298. /// <summary>
  299. /// 根据Reservoir获取Rinse集合
  300. /// </summary>
  301. /// <param name="reservoirName"></param>
  302. /// <returns></returns>
  303. public List<string> GetRinsesByReservoir(string reservoirName)
  304. {
  305. List<string> metals = ReservoirItemManager.Instance.GetMetalsByReservoir(reservoirName);
  306. List<string> rinses= new List<string>();
  307. foreach (string metal in metals)
  308. {
  309. List<LayoutCellItem> metalRinses = _metalRinseDictionary[metal];
  310. foreach (LayoutCellItem rinseItem in metalRinses)
  311. {
  312. if(!rinses.Contains(rinseItem.ModuleName))
  313. {
  314. rinses.Add(rinseItem.ModuleName);
  315. }
  316. }
  317. }
  318. return rinses;
  319. }
  320. }
  321. }