123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- 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<CellItemManager>
- {
- #region 内部变量
- /// <summary>
- /// cell数组
- /// </summary>
- private LayoutCellItem[] _layoutCellItems = new LayoutCellItem[50];
- /// <summary>
- /// cell模块Id字典(key-模块名称,value-cellId)
- /// </summary>
- private Dictionary<string,int> _layoutCellModuleIdDic= new Dictionary<string,int>();
- /// <summary>
- /// 安装好的cell项集合
- /// </summary>
- private List<LayoutCellItem> _installedLayoutCellItems = new List<LayoutCellItem>();
- /// <summary>
- /// CellId模块名称字典
- /// </summary>
- private Dictionary<string, string> _cellIdModuleNameDic = new Dictionary<string, string>();
- /// <summary>
- /// Cell Wafer字典
- /// </summary>
- private ConcurrentDictionary<string, bool> _cellWaferHolderDictionary = new ConcurrentDictionary<string, bool>();
- /// <summary>
- /// Metal-Rinse字典(key-Metal名称,value-Rinse集合)
- /// </summary>
- private Dictionary<string, List<LayoutCellItem>> _metalRinseDictionary = new Dictionary<string, List<LayoutCellItem>>();
- /// <summary>
- /// 共享Rinse集合
- /// </summary>
- private List<string> _sharedRinseList = new List<string>();
- /// <summary>
- /// Rinse-Metal集合字典(key-rinse,value--共享使用的Metal)
- /// </summary>
- private Dictionary<string, List<string>> _shardRinseMetals = new Dictionary<string, List<string>>();
- /// <summary>
- /// 共享Rinse Reservoir集合字典(key-rinse,value--共享使用的Reservoir)
- /// </summary>
- private Dictionary<string, List<string>> _shardRinseReservoirs = new Dictionary<string, List<string>>();
- #endregion
- /// <summary>
- /// 初始化LayoutCellItem
- /// </summary>
- /// <param name="item"></param>
- 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;
- }
- }
- /// <summary>
- /// 获取metal旁边的rinse集合
- /// </summary>
- /// <param name="metalName"></param>
- /// <returns></returns>
- private List<LayoutCellItem> GetMetalNearbyRinseItems(string metalName)
- {
- List<LayoutCellItem> layoutCellItems = new List<LayoutCellItem>();
- 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;
- }
- /// <summary>
- /// 获取所有Layout Cell项
- /// </summary>
- /// <returns></returns>
- 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);
- }
- /// <summary>
- /// 解析Metal Rinse的关系
- /// </summary>
- private void AnalyseMetalRinse()
- {
- List<string> reservoir = ReservoirItemManager.Instance.InstalledModules;
- List<string> rinseList = new List<string>();
- foreach (var item in reservoir)
- {
- List<string> metals=ReservoirItemManager.Instance.GetMetalsByReservoir(item);
- List<string> reservoirRinse = new List<string>();
- foreach(string metalItem in metals)
- {
- List<LayoutCellItem> 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<string> lst = new List<string>();
- _shardRinseMetals[item]=lst;
- List<string> lstReservoirs = new List<string>();
- _shardRinseReservoirs[item]=lstReservoirs;
- foreach (string metalItem in _metalRinseDictionary.Keys)
- {
- List<LayoutCellItem> 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);
- }
- }
- }
- }
- }
- /// <summary>
- /// 根据CellId获取Cell名称
- /// </summary>
- /// <param name="cellId"></param>
- /// <returns></returns>
- public string GetModuleNameByCellId(string cellId)
- {
- return _cellIdModuleNameDic.ContainsKey(cellId) ? _cellIdModuleNameDic[cellId] : "";
- }
- /// <summary>
- /// 根据模块名称获取cellId
- /// </summary>
- /// <param name="moduleName"></param>
- /// <returns></returns>
- public int GetCellIdByModuleName(string moduleName)
- {
- return _layoutCellModuleIdDic.ContainsKey(moduleName) ? _layoutCellModuleIdDic[moduleName] : 0;
- }
- /// <summary>
- /// 更新Cell 存在WaferHolder状态
- /// </summary>
- /// <param name="cellName"></param>
- /// <param name="hasWaferHolder"></param>
- public void UpdateCellWaferHolder(string cellName, bool hasWaferHolder)
- {
- if (_cellWaferHolderDictionary.ContainsKey(cellName))
- {
- _cellWaferHolderDictionary[cellName] = hasWaferHolder;
- }
- }
- /// <summary>
- /// 根据Metal获取关联Rinse集合
- /// </summary>
- /// <param name="metalName"></param>
- /// <returns></returns>
- public List<LayoutCellItem> GetRinseItemsByMetal(string metalName)
- {
- return _metalRinseDictionary.ContainsKey(metalName) ? _metalRinseDictionary[metalName] : null;
- }
- /// <summary>
- /// 检验Rinse是否共享
- /// </summary>
- /// <param name="rinseName"></param>
- /// <returns></returns>
- public bool CheckRinseIsShared(string rinseName)
- {
- return _sharedRinseList.Contains(rinseName);
- }
- /// <summary>
- /// 根据共享Rinse获取所有Metals
- /// </summary>
- /// <param name="sharedRinseName"></param>
- /// <returns></returns>
- public List<string> GetMetalsBySharedRinse(string sharedRinseName)
- {
- return _shardRinseMetals.ContainsKey(sharedRinseName)?_shardRinseMetals[sharedRinseName] : null;
- }
- /// <summary>
- /// 根据共享Rinse获取所有Reservoirs
- /// </summary>
- /// <param name="sharedRinseName"></param>
- /// <returns></returns>
- public List<string> GetReservoirsBySharedRinse(string sharedRinseName)
- {
- return _shardRinseReservoirs.ContainsKey(sharedRinseName) ? _shardRinseReservoirs[sharedRinseName] : null;
- }
- /// <summary>
- /// 根据Reservoir获取Rinse集合
- /// </summary>
- /// <param name="reservoirName"></param>
- /// <returns></returns>
- public List<string> GetRinsesByReservoir(string reservoirName)
- {
- List<string> metals = ReservoirItemManager.Instance.GetMetalsByReservoir(reservoirName);
- List<string> rinses= new List<string>();
- foreach (string metal in metals)
- {
- List<LayoutCellItem> metalRinses = _metalRinseDictionary[metal];
- foreach (LayoutCellItem rinseItem in metalRinses)
- {
- if(!rinses.Contains(rinseItem.ModuleName))
- {
- rinses.Add(rinseItem.ModuleName);
- }
- }
- }
- return rinses;
- }
- }
- }
|