using Aitex.Core.Common; using Aitex.Core.RT.Log; using Aitex.Core.Util; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Jobs; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.Common.WaferHolder; using CyberX8_RT.Modules.PUF; using CyberX8_RT.Modules; using CyberX8_RT.Schedulers; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Markup; namespace CyberX8_RT.Dispatch { public class WaferTaskManager : Singleton { #region 内部变量 /// /// FA回复 /// private SchedulerFACallback _schedulerFACallback = new SchedulerFACallback(); /// /// 任务锁 /// private object _taskLocker = new object(); /// /// 任务集合 /// private List _waferTaskList = new List(); /// /// Wafer task字典 /// private ConcurrentDictionary _waferTasksDic = new ConcurrentDictionary(); /// /// Wafer配对字典(key-自身WaferId,value-配对WaferId) /// private ConcurrentDictionary _waferTaskMatchDic = new ConcurrentDictionary(); /// /// Wafer--WaferHolder任务字典(key-自身WaferId,value-WaferHolder任务) /// private ConcurrentDictionary _waferWaferHolderTaskDic = new ConcurrentDictionary(); #endregion /// /// 初始化Task /// /// public void InitializeTask(WaferTask task) { _waferTasksDic[task.WaferId] = task; lock(_taskLocker) { _waferTaskList.Add(task); } } /// /// 获取WaferTask /// /// /// public WaferTask GetWaferTask(string waferId) { return _waferTasksDic.ContainsKey(waferId) ? _waferTasksDic[waferId] : null; } /// /// 是否包含 /// /// /// public bool Contains(string waferId) { return _waferTasksDic.ContainsKey(waferId); } /// /// 移除任务 /// /// public void RemoveWaferTask(string waferId) { if(_waferTasksDic.ContainsKey(waferId)) { _waferTasksDic.TryRemove(waferId, out var task); task.Dispose(); task.OnTaskComplete -= WaferTask_OnTaskComplete; LOG.WriteBackgroundLog(eEvent.EV_SCHEDULER, "Scheduler", $"remove wafer {waferId} task"); } if(_waferTaskMatchDic.ContainsKey(waferId)) { _waferTaskMatchDic.TryRemove(waferId,out var taskMath); } lock(_taskLocker) { int index = _waferTaskList.FindIndex(O => O.WaferId == waferId); if (index >= 0) { _waferTaskList.RemoveAt(index); } } } /// /// 加载Wafer Task集合 /// /// public List LoadWaferTaskList() { return _waferTaskList.ToList(); } /// /// 创建Wafer任务 /// public void CreateWaferTask(List processJobInfos, WaferHolderInfo waferHolderInfo,WaferHolderTask waferHolderTask) { int count = 0; string mateWaferTask = ""; List wafers = new List(); for(int i=0; i dummyWafers = DummyWaferManager.Instance.LoadDummyWafersByWaferHolder(waferHolderInfo); if (dummyWafers.Count != 0) { CreateWaferTaskSchedulerSequence(waferInfo, pufModuleName, waferHolderInfo, waferInfo.ProcessJob.SequenceRecipe, ""); WaferInfo dummyInfo = null; if (dummyWafers.Count > 1) { foreach (WaferInfo info in dummyWafers) { //最后一片Wafer使用B面,那么dummy片使用0 slot if (lastSingleWaferToSideB && info.OriginSlot == 0) { dummyInfo = info; break; } //最后一片Wafer使用A面,那么dummy片使用1 slot if (!lastSingleWaferToSideB && info.OriginSlot == 1) { dummyInfo = info; break; } } if (dummyInfo == null) { dummyInfo=dummyWafers[0]; } } else { dummyInfo = dummyWafers[0]; } CreateDummyWaferTaskSchedulerSequence(waferHolderInfo.SequenceRecipe, dummyInfo, dummyModuleName, waferInfo.WaferID); _waferTaskMatchDic[waferInfo.WaferID] = dummyWafers[0].WaferID; _waferTaskMatchDic[dummyWafers[0].WaferID] = waferInfo.WaferID; _waferWaferHolderTaskDic[waferInfo.WaferID] = waferHolderTask; _waferWaferHolderTaskDic[dummyWafers[0].WaferID] = waferHolderTask; } else { CreateWaferTaskSchedulerSequence(waferInfo, pufModuleName, waferHolderInfo, waferInfo.ProcessJob.SequenceRecipe, ""); _waferWaferHolderTaskDic[waferInfo.WaferID] = waferHolderTask; } } else { for (int i = 0; i < 2; i++) { WaferInfo waferInfo = wafers[i]; ModuleName pufModuleName = ModuleName.Unknown; if (i == 0) { pufModuleName = ModuleName.PUF1; mateWaferTask = wafers[0].WaferID; CreateWaferTaskSchedulerSequence(waferInfo, pufModuleName, waferHolderInfo, waferInfo.ProcessJob.SequenceRecipe, ""); } else { pufModuleName = ModuleName.PUF2; CreateWaferTaskSchedulerSequence(waferInfo, pufModuleName, waferHolderInfo, waferInfo.ProcessJob.SequenceRecipe, mateWaferTask); } } _waferTaskMatchDic[wafers[0].WaferID] = wafers[1].WaferID; _waferTaskMatchDic[wafers[1].WaferID] = wafers[0].WaferID; _waferWaferHolderTaskDic[wafers[0].WaferID] = waferHolderTask; _waferWaferHolderTaskDic[wafers[1].WaferID] = waferHolderTask; } } /// /// 检验WaferHolder是否存在两片生产片 /// /// /// private bool CheckWaferHolderHasTwoProductionWafers(WaferHolderInfo waferHolderInfo) { int count = 0; WaferInfo waferAInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferAId); if (waferAInfo != null && waferAInfo.WaferType==WaferType.Production) { count++; } WaferInfo waferBInfo = WaferManager.Instance.GetWaferByWaferId(waferHolderInfo.WaferBId); if (waferBInfo != null && waferBInfo.WaferType == WaferType.Production) { count++; } return count >= 2; } /// /// 创建WaferTask SchedulerSequence /// /// /// /// /// private void CreateWaferTaskSchedulerSequence(WaferInfo waferInfo, ModuleName pufModuleName, WaferHolderInfo waferHolderInfo, SequenceRecipe sequenceRecipe, string mateWafeTask) { List sequences = SchedulerSequenceManager.Instance.AnalyWaferAllSchedulerSequence(waferInfo, pufModuleName, waferHolderInfo, sequenceRecipe); PUFEntity pufEntity = Singleton.Instance.GetModule(pufModuleName.ToString()); WaferTask waferTask = new WaferTask(waferInfo, pufEntity, sequences); if (!string.IsNullOrEmpty(mateWafeTask)) { waferTask.MateWaferTask = mateWafeTask; } waferTask.OnTaskComplete += WaferTask_OnTaskComplete; LOG.WriteLog(eEvent.EV_SEQUENCE, "Scheduler", $"Create wafer {waferInfo.WaferID} task"); InitializeTask(waferTask); } /// /// 创建DummyWaferTask /// /// public void CreateDummyWaferTask(List waferInfos,SequenceRecipe sequenceRecipe,WaferHolderTask waferHolderTask) { string mateWaferTask = ""; for (int i = 0; i < waferInfos.Count; i++) { WaferInfo waferInfo = waferInfos[i]; int orginalSlot = waferInfo.OriginSlot; ModuleName pufModuleName = orginalSlot == 0 ? ModuleName.PUF1 : ModuleName.PUF2; if (!Contains(waferInfo.WaferID)) { if (i == 0) { mateWaferTask = waferInfo.WaferID; CreateDummyWaferTaskSchedulerSequence(sequenceRecipe,waferInfo, pufModuleName, ""); _waferWaferHolderTaskDic[waferInfo.WaferID] = waferHolderTask; } else { CreateDummyWaferTaskSchedulerSequence(sequenceRecipe,waferInfo, pufModuleName, mateWaferTask); _waferTaskMatchDic[mateWaferTask] = waferInfo.WaferID; _waferTaskMatchDic[waferInfo.WaferID] = mateWaferTask; _waferWaferHolderTaskDic[waferInfo.WaferID]= waferHolderTask; break; } } } } /// /// 创建Dummy Wafer Task 调度工序 /// /// /// /// private void CreateDummyWaferTaskSchedulerSequence(SequenceRecipe sequenceRecipe,WaferInfo waferInfo,ModuleName pufModuleName,string mateWaferTask) { List sequences = SchedulerSequenceManager.Instance.AnalyDummyWaferAllSchedulerSequence(sequenceRecipe,waferInfo, pufModuleName); PUFEntity pufEntity = Singleton.Instance.GetModule(pufModuleName.ToString()); WaferTask waferTask = new WaferTask(waferInfo, pufEntity,sequences); if (!string.IsNullOrEmpty(mateWaferTask)) { waferTask.MateWaferTask = mateWaferTask; } LOG.WriteLog(eEvent.EV_SEQUENCE, "Scheduler", $"Create Dummy wafer {waferInfo.WaferID} task"); waferTask.OnTaskStart += WaferTask_OnTaskStart; waferTask.OnTaskComplete += WaferTask_OnTaskComplete; InitializeTask(waferTask); } /// /// 任务开始 /// /// /// private void WaferTask_OnTaskStart(string id) { WaferInfo waferInfo = WaferManager.Instance.GetWaferByWaferId(id); if (waferInfo != null && waferInfo.WaferType == WaferType.Production) { ModuleName moduleName = (ModuleName)waferInfo.OriginStation; if (ModuleHelper.IsLoadPort(moduleName)) { CycleManager.Instance.UpdateCycleWaferCount(moduleName.ToString()); } _schedulerFACallback.JobWaferStart(JobProcesser.Instance.GetControlJobInfoByProcessJob(waferInfo.ProcessJob), waferInfo.SequenceName, waferInfo.OriginSlot); } } /// /// Wafer task完成事件 /// /// private void WaferTask_OnTaskComplete(string id) { WaferInfo waferInfo=WaferManager.Instance.GetWaferByWaferId(id); if (waferInfo != null&&waferInfo.WaferType==WaferType.Production) { ModuleName moduleName = (ModuleName)waferInfo.OriginStation; if (ModuleHelper.IsLoadPort(moduleName)) { CycleManager.Instance.UpdateCycleWaferCount(moduleName.ToString()); } _schedulerFACallback.JobWaferEnd(JobProcesser.Instance.GetControlJobInfoByProcessJob(waferInfo.ProcessJob), waferInfo.SequenceName, waferInfo.OriginSlot); } RemoveWaferTask(id); } /// /// 暂停 /// public void PauseAllTask() { List waferTasks = _waferTaskList.ToList(); foreach(WaferTask item in waferTasks) { item.Pause(); } } /// /// 恢复所有任务 /// public void ResumeAllTask() { List waferTasks = _waferTaskList.ToList(); foreach (WaferTask item in waferTasks) { item.Resume(); } } /// /// 恢复所有任务 /// public void RemoveAllTask() { List waferTasks = _waferTaskList.ToList(); foreach (WaferTask item in waferTasks) { RemoveWaferTask(item.WaferId); } } /// /// 根据WaferId获取配对另一个WaferId /// /// /// public string GetMatchWaferIdByWaferId(string waferId) { return _waferTaskMatchDic.ContainsKey(waferId) ? _waferTaskMatchDic[waferId] : ""; } /// /// 移除WaferId匹配WaferHolderTask字典 /// /// public void RemoveWaferIdMatchWaferHolderTaskDic(string waferId) { if(_waferWaferHolderTaskDic.ContainsKey(waferId)) { _waferWaferHolderTaskDic.TryRemove(waferId, out var waferHolderTask); } } /// /// 获取WaferId匹配WaferHolderTask字典 /// /// /// public WaferHolderTask GetWaferHolderTaskByWaferId(string waferId) { return _waferWaferHolderTaskDic.ContainsKey(waferId) ? _waferWaferHolderTaskDic[waferId] : null; } /// /// 获取WaferHolder Task对应的Wafer Task WaferId集合 /// /// /// public List GetWaferHolderMathWaferId(string waferHolderId) { List keys = _waferWaferHolderTaskDic.Keys.ToList(); List result = new List(); foreach(string item in keys) { if(_waferWaferHolderTaskDic[item].WaferHolderInfo.Id==waferHolderId) { result.Add(item); } } return result; } } }