using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.Common; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.DBCore; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Jobs; using MECF.Framework.Common.SubstrateTrackings; using FurnaceRT.Equipments.PMs.RecipeExecutions; using Aitex.Core.RT.Log; namespace FurnaceRT.Equipments.Schedulers { class SchedulerDBCallback : ISchedulerDBCallback { private ProcessJobInfo _processJobInfo; public void LotCreated(ControlJobInfo cj) { if (string.IsNullOrEmpty(cj.Module)) return; ModuleName module = ModuleHelper.Converter(cj.Module); Guid carrierGuid = CarrierManager.Instance.GetCarrier(cj.Module).InnerId; LotDataRecorder.StartLot(cj.LotInnerId.ToString(), carrierGuid.ToString(), "", cj.LotName, cj.Module, cj.Module, cj.LotWafers.Count); foreach (var waferInfo in cj.LotWafers) { LotDataRecorder.InsertLotWafer(cj.LotInnerId.ToString(), waferInfo.InnerId.ToString()); WaferDataRecorder.SetWaferSequence(waferInfo.InnerId.ToString(), waferInfo.PPID); } } public void LotFinished(ControlJobInfo cj) { int unprocessed = 0; int aborted = 0; foreach (var waferInfo in cj.LotWafers) { if (waferInfo.ProcessState == EnumWaferProcessStatus.Failed) { aborted++; continue; } if (waferInfo.ProcessState != EnumWaferProcessStatus.Completed) { unprocessed++; continue; } } LotDataRecorder.EndLot(cj.LotInnerId.ToString(), aborted, unprocessed); } public void PjCreated(params object[] objs) { var param = (Dictionary)objs[0]; string jobName = (string)param["JobRecipe"]; string recipeName = (string)param["ProcessRecipe"]; string layoutName = (string)param["LayoutRecipe"]; string form = (string)param["Form"]; string batchId = ""; if (param.ContainsKey("Batch")) { batchId = $"Batch{(string)param["Batch"]}{DateTime.Now.ToString("yyyyMMddHHmmssffff")}"; } else { batchId = DateTime.Now.ToString("yyyyMMddHHmmssffff"); } _processJobInfo = new ProcessJobInfo(); _processJobInfo.Name = jobName; _processJobInfo.LotName = jobName; _processJobInfo.InnerId = Guid.NewGuid(); RecipeParser.LayoutRecipeParse(layoutName, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason); string layoutData = String.Join(",", layoutRecipeDataExpert.Items); JobDataRecorder.CreatePJ(_processJobInfo.InnerId.ToString(), batchId, jobName, recipeName, layoutName, layoutData, form); } public void PjCreated(string batch, string jobRecipe, string processRecipe, string layoutRecipe) { string batchId = ""; if (!string.IsNullOrEmpty(batch)) { batchId = $"Batch{batch}{DateTime.Now.ToString("yyyyMMddHHmmssffff")}"; } else { batchId = DateTime.Now.ToString("yyyyMMddHHmmssffff"); } _processJobInfo = new ProcessJobInfo(); _processJobInfo.Name = jobRecipe; _processJobInfo.LotName = jobRecipe; _processJobInfo.InnerId = Guid.NewGuid(); RecipeParser.LayoutRecipeParse(layoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason); string layoutData = String.Join(",", layoutRecipeDataExpert.Items); JobDataRecorder.CreatePJ(_processJobInfo.InnerId.ToString(), batchId, jobRecipe, processRecipe, layoutRecipe, layoutData, "Normal"); } public void PjCreated(ProcessJobInfo pj) { _processJobInfo = new ProcessJobInfo(); _processJobInfo.Name = pj.Name; _processJobInfo.LotName = pj.LotName; _processJobInfo.InnerId = pj.InnerId; _processJobInfo.JobRecipe = pj.JobRecipe; _processJobInfo.ProcessRecipe = pj.ProcessRecipe; _processJobInfo.LayoutRecipe = pj.LayoutRecipe; var batchId = DateTime.Now.ToString("yyyyMMddHHmmssffff"); RecipeParser.LayoutRecipeParse(_processJobInfo.LayoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason); string layoutData = String.Join(",", layoutRecipeDataExpert.Items); JobDataRecorder.CreatePJ(_processJobInfo.InnerId.ToString(), batchId, _processJobInfo.JobRecipe, _processJobInfo.ProcessRecipe, _processJobInfo.LayoutRecipe, layoutData, "Normal"); } public void PjCreated(string processName) { string form = "process"; string batchId = $"process{DateTime.Now.ToString("yyyyMMddHHmmssffff")}"; _processJobInfo = new ProcessJobInfo(); _processJobInfo.Name = processName; _processJobInfo.LotName = processName; _processJobInfo.InnerId = Guid.NewGuid(); JobDataRecorder.CreatePJ(_processJobInfo.InnerId.ToString(), batchId, "", processName, "", "", form); } public void PjStart() { JobDataRecorder.StartPJ(_processJobInfo.InnerId.ToString()); } public void PjUpdated() { var wafers = WaferManager.Instance.GetWafers(ModuleName.PM1); List layoutDatas = new List(); List waferDatas = new List(); //StringBuilder waferData = new StringBuilder(); int waferCount = 0; for (int i = 0; i < wafers.Length; i++) { if (wafers[i].IsEmpty) { layoutDatas.Add(""); continue; } switch (wafers[i].WaferType) { case WaferType.P: case WaferType.M: case WaferType.M1: case WaferType.M2: case WaferType.SD: case WaferType.ED: layoutDatas.Add($"{wafers[i].WaferType}-{wafers[i].LotId}-{wafers[i].WaferOrigin.Replace("Stocker", "")}"); //layoutDatas.Add($"{wafers[i].WaferType}-{wafers[i].WaferOrigin}"); break; default: layoutDatas.Add(""); break; } waferDatas.Add($"{wafers[i].WaferType}:{wafers[i].WaferOrigin}:{wafers[i].LotId}"); //waferData.Append(wafers[i].WaferType.ToString() + ":"); //waferData.Append(wafers[i].WaferOrigin + ","); waferCount++; } string layoutData = String.Join(",", layoutDatas); string waferData = String.Join(",", waferDatas); if(_processJobInfo != null) JobDataRecorder.UpdatePJ(_processJobInfo.InnerId.ToString(), layoutData, waferData, waferCount); } public void PjFinished(string endStatus = "Normal") { if (_processJobInfo != null) JobDataRecorder.EndPJ(_processJobInfo.InnerId.ToString(), endStatus); } public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj) { List carrierInnerIdLst = new List(); List stockerModuleLst = new List(); List stockerWaferCountLst = new List(); foreach (var s in pj.Stockers) { var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType"); if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M"))) { ModuleName module = ModuleHelper.Converter(s.Item1); var carrier = CarrierManager.Instance.GetCarrier(s.Item1, 0); if (carrier != null && !carrier.IsEmpty) { var waferCount = WaferManager.Instance.GetWafers(module).ToList().Where(x => !x.IsEmpty).Count(); carrierInnerIdLst.Add(carrier.InnerId.ToString()); stockerModuleLst.Add(s.Item1); stockerWaferCountLst.Add(waferCount); } } } JobDataRecorder.StartPJ(pj.InnerId.ToString(), string.Join(";", carrierInnerIdLst), cj.InnerId.ToString(), cj.LotName, pj.Name, string.Join(";", stockerModuleLst), string.Join(";", stockerModuleLst), stockerWaferCountLst.Sum(), pj.JobRecipe); } } }