CellItemManager.cs 13 KB

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