CellItemManager.cs 14 KB

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