using Aitex.Core.RT.DataCenter; using Aitex.Core.Util; using DocumentFormat.OpenXml.Spreadsheet; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.WaferHolder; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.Common.ToolLayout { public class CellItemManager : Singleton { #region 内部变量 /// /// cell数组 /// private LayoutCellItem[] _layoutCellItems = new LayoutCellItem[50]; /// /// cell模块Id字典(key-模块名称,value-cellId) /// private Dictionary _layoutCellModuleIdDic= new Dictionary(); /// /// 安装好的cell项集合 /// private List _installedLayoutCellItems = new List(); /// /// CellId模块名称字典 /// private Dictionary _cellIdModuleNameDic = new Dictionary(); /// /// Cell Wafer字典 /// private ConcurrentDictionary _cellWaferHolderDictionary = new ConcurrentDictionary(); /// /// Metal-Rinse字典(key-Metal名称,value-Rinse集合) /// private Dictionary> _metalRinseDictionary = new Dictionary>(); /// /// 共享Rinse集合 /// private List _sharedRinseList = new List(); /// /// Rinse-Metal集合字典(key-rinse,value--共享使用的Metal) /// private Dictionary> _shardRinseMetals = new Dictionary>(); /// /// 共享Rinse Reservoir集合字典(key-rinse,value--共享使用的Reservoir) /// private Dictionary> _shardRinseReservoirs = new Dictionary>(); #endregion /// /// 初始化LayoutCellItem /// /// public void InitialLayoutCellItem(LayoutCellItem item) { if(item.CellID==0||!item.Installed) { return; } if(item.CellID<_layoutCellItems.Length) { _layoutCellItems[item.CellID] = item; if (!string.IsNullOrEmpty(item.ModuleName)) { _layoutCellModuleIdDic[item.ModuleName] = item.CellID; } _cellIdModuleNameDic[$"Cell{item.CellID}"] = item.ModuleName; } } /// /// 获取metal旁边的rinse集合 /// /// /// private List GetMetalNearbyRinseItems(string metalName) { List layoutCellItems = new List(); if(_layoutCellModuleIdDic.ContainsKey(metalName)) { int cellId = _layoutCellModuleIdDic[metalName]; bool checkBackRinse = false; for (int i = cellId - 1; i >= 0; i--) { LayoutCellItem item = _layoutCellItems[i]; if (item == null) { continue; } if (item.ModuleType == ModuleType.Rinse.ToString()) { if (item.Installed) { layoutCellItems.Add(item); checkBackRinse = true; break; } } else if (item.ModuleType == ModuleType.Metal.ToString()) { if (!checkBackRinse) { continue; } else { break; } } else { break; } } bool checkForwardRinse = false; for (int i = cellId; i < _layoutCellItems.Length; i++) { LayoutCellItem item = _layoutCellItems[i]; if(item==null) { continue; } if (item.ModuleType == ModuleType.Rinse.ToString()) { if (item.Installed) { layoutCellItems.Add(item); checkForwardRinse = true; break; } } else if (item.ModuleType == ModuleType.Metal.ToString()) { if (!checkForwardRinse) { continue; } else { break; } } else { break; } } } return layoutCellItems; } /// /// 获取所有Layout Cell项 /// /// public void InitializeLayoutCellItems() { foreach (LayoutCellItem item in _layoutCellItems) { if (item != null&&item.Installed) { if (WaferHolderManager.Instance.HasWaferHolder(item.ModuleName)) { _cellWaferHolderDictionary[item.ModuleName] = true; } else { _cellWaferHolderDictionary[item.ModuleName] = false; } _installedLayoutCellItems.Add(item); } } AnalyseMetalRinse(); DATA.Subscribe("System.LayoutCellItems", () => _installedLayoutCellItems.Select(obj => obj.ModuleName).ToList(), SubscriptionAttribute.FLAG.IgnoreSaveDB); _cellWaferHolderDictionary[ModuleName.Transporter2.ToString()] = WaferHolderManager.Instance.HasWaferHolder(ModuleName.Transporter2.ToString()); _cellWaferHolderDictionary[ModuleName.Transporter1.ToString()] = WaferHolderManager.Instance.HasWaferHolder(ModuleName.Transporter1.ToString()); _cellWaferHolderDictionary["Loader"] = WaferHolderManager.Instance.HasWaferHolder("Loader"); DATA.Subscribe("System.CellWaferHolderDictionary", () => _cellWaferHolderDictionary,SubscriptionAttribute.FLAG.IgnoreSaveDB); } /// /// 解析Metal Rinse的关系 /// private void AnalyseMetalRinse() { List reservoir = ReservoirItemManager.Instance.InstalledModules; List rinseList = new List(); foreach (var item in reservoir) { List metals=ReservoirItemManager.Instance.GetMetalsByReservoir(item); List reservoirRinse = new List(); foreach(string metalItem in metals) { List cellItems=GetMetalNearbyRinseItems(metalItem); _metalRinseDictionary[metalItem] = cellItems; foreach(LayoutCellItem cellItem in cellItems) { if(!reservoirRinse.Contains(cellItem.ModuleName)) { reservoirRinse.Add(cellItem.ModuleName); } } } //解析所有共享Rinse集合 foreach (string rinseItem in reservoirRinse) { if(!rinseList.Contains(rinseItem)) { rinseList.Add(rinseItem); } else { _sharedRinseList.Add(rinseItem); } } } //解析共享Rinse所有Metal集合 foreach (var item in _sharedRinseList) { List lst = new List(); _shardRinseMetals[item]=lst; List lstReservoirs = new List(); _shardRinseReservoirs[item]=lstReservoirs; foreach (string metalItem in _metalRinseDictionary.Keys) { List rinseItems = _metalRinseDictionary[metalItem]; if(rinseItems.Find(O=>O.ModuleName== item) != null) { lst.Add(metalItem); string reservoirName = ReservoirItemManager.Instance.GetReservoirByMetal(metalItem); if (!lstReservoirs.Contains(reservoirName)) { lstReservoirs.Add(reservoirName); } } } } } /// /// 根据CellId获取Cell名称 /// /// /// public string GetModuleNameByCellId(string cellId) { return _cellIdModuleNameDic.ContainsKey(cellId) ? _cellIdModuleNameDic[cellId] : ""; } /// /// 根据模块名称获取cellId /// /// /// public int GetCellIdByModuleName(string moduleName) { return _layoutCellModuleIdDic.ContainsKey(moduleName) ? _layoutCellModuleIdDic[moduleName] : 0; } /// /// 更新Cell 存在WaferHolder状态 /// /// /// public void UpdateCellWaferHolder(string cellName, bool hasWaferHolder) { if (_cellWaferHolderDictionary.ContainsKey(cellName)) { _cellWaferHolderDictionary[cellName] = hasWaferHolder; } } /// /// 根据Metal获取关联Rinse集合 /// /// /// public List GetRinseItemsByMetal(string metalName) { return _metalRinseDictionary.ContainsKey(metalName) ? _metalRinseDictionary[metalName] : null; } /// /// 检验Rinse是否共享 /// /// /// public bool CheckRinseIsShared(string rinseName) { return _sharedRinseList.Contains(rinseName); } /// /// 根据共享Rinse获取所有Metals /// /// /// public List GetMetalsBySharedRinse(string sharedRinseName) { return _shardRinseMetals.ContainsKey(sharedRinseName)?_shardRinseMetals[sharedRinseName] : null; } /// /// 根据共享Rinse获取所有Reservoirs /// /// /// public List GetReservoirsBySharedRinse(string sharedRinseName) { return _shardRinseReservoirs.ContainsKey(sharedRinseName) ? _shardRinseReservoirs[sharedRinseName] : null; } /// /// 根据Reservoir获取Rinse集合 /// /// /// public List GetRinsesByReservoir(string reservoirName) { List metals = ReservoirItemManager.Instance.GetMetalsByReservoir(reservoirName); List rinses= new List(); foreach (string metal in metals) { List metalRinses = _metalRinseDictionary[metal]; foreach (LayoutCellItem rinseItem in metalRinses) { if(!rinses.Contains(rinseItem.ModuleName)) { rinses.Add(rinseItem.ModuleName); } } } return rinses; } } }