using Aitex.Core.RT.Log; using Aitex.Core.Util; using Caliburn.Micro; using Caliburn.Micro.Core; using FurnaceUI.Common; using FurnaceUI.Models; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.UI.Client.CenterViews.Editors.Recipe; using MECF.Framework.UI.Client.CenterViews.Editors.Sequence; using OpenSEMI.ClientBase; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Xml; namespace FurnaceUI.Views.Jobs { public class CreateJobViewModel : FurnaceModuleUIViewModelBase { public string JobType { get; set; } public string JobText => JobType == "PJ" ? "PJ ID" : "CJ ID"; public string PCarrierPara { get; set; } public string M1CarrierPara { get; set; } public string M2CarrierPara { get; set; } public bool IsOnlyCharge { get; set; } public ObservableCollection SelectCarrierList { get; set; } = new ObservableCollection(); private string _jobID; public string JobID { get { return _jobID; } set { _jobID = value; NotifyOfPropertyChange("JobID"); } } private string _cjID; public string CJID { get { return _cjID; } set { _cjID = value; NotifyOfPropertyChange("CJID"); } } private string _pjID; public string PJID { get { return _pjID; } set { _pjID = value; NotifyOfPropertyChange("PJID"); } } public CreateJobViewModel() { } private readonly RecipeProvider _recipeProvider = new RecipeProvider(); public RecipeDataJob CurrentRecipe { get; set; } = new RecipeDataJob(); public string ExecCommand { get; set; } #region Stocker Carrier Info [Subscription("Stocker1.Carrier")] public CarrierInfo Stocker1CarrierData { get; set; } [Subscription("Stocker2.Carrier")] public CarrierInfo Stocker2CarrierData { get; set; } [Subscription("Stocker3.Carrier")] public CarrierInfo Stocker3CarrierData { get; set; } [Subscription("Stocker4.Carrier")] public CarrierInfo Stocker4CarrierData { get; set; } [Subscription("Stocker5.Carrier")] public CarrierInfo Stocker5CarrierData { get; set; } [Subscription("Stocker6.Carrier")] public CarrierInfo Stocker6CarrierData { get; set; } [Subscription("Stocker7.Carrier")] public CarrierInfo Stocker7CarrierData { get; set; } [Subscription("Stocker8.Carrier")] public CarrierInfo Stocker8CarrierData { get; set; } [Subscription("Stocker9.Carrier")] public CarrierInfo Stocker9CarrierData { get; set; } [Subscription("Stocker10.Carrier")] public CarrierInfo Stocker10CarrierData { get; set; } [Subscription("Stocker11.Carrier")] public CarrierInfo Stocker11CarrierData { get; set; } [Subscription("Stocker12.Carrier")] public CarrierInfo Stocker12CarrierData { get; set; } [Subscription("Stocker13.Carrier")] public CarrierInfo Stocker13CarrierData { get; set; } [Subscription("Stocker14.Carrier")] public CarrierInfo Stocker14CarrierData { get; set; } [Subscription("Stocker15.Carrier")] public CarrierInfo Stocker15CarrierData { get; set; } [Subscription("Stocker16.Carrier")] public CarrierInfo Stocker16CarrierData { get; set; } [Subscription("Stocker17.Carrier")] public CarrierInfo Stocker17CarrierData { get; set; } [Subscription("Stocker18.Carrier")] public CarrierInfo Stocker18CarrierData { get; set; } #endregion List _carrierlist = new List(); ObservableCollection _stockerList = new ObservableCollection(); protected override void OnInitialize() { base.OnInitialize(); } protected override void InvokeAfterUpdateProperty(Dictionary data) { base.InvokeAfterUpdateProperty(data); _stockerList.Clear(); if (Stocker1CarrierData != null) { Stocker1CarrierData.StockerIndex = 1; _stockerList.Add(Stocker1CarrierData); } if (Stocker2CarrierData != null) { Stocker2CarrierData.StockerIndex = 2; _stockerList.Add(Stocker2CarrierData); } if (Stocker3CarrierData != null) { Stocker3CarrierData.StockerIndex = 3; _stockerList.Add(Stocker3CarrierData); } if (Stocker4CarrierData != null) { Stocker4CarrierData.StockerIndex = 4; _stockerList.Add(Stocker4CarrierData); } if (Stocker5CarrierData != null) { Stocker5CarrierData.StockerIndex = 5; _stockerList.Add(Stocker5CarrierData); } if (Stocker6CarrierData != null) { Stocker6CarrierData.StockerIndex = 6; _stockerList.Add(Stocker6CarrierData); } if (Stocker7CarrierData != null) { Stocker7CarrierData.StockerIndex = 7; _stockerList.Add(Stocker7CarrierData); } if (Stocker8CarrierData != null) { Stocker8CarrierData.StockerIndex = 8; _stockerList.Add(Stocker8CarrierData); } if (Stocker9CarrierData != null) { Stocker9CarrierData.StockerIndex = 9; _stockerList.Add(Stocker9CarrierData); } if (Stocker10CarrierData != null) { Stocker10CarrierData.StockerIndex = 10; _stockerList.Add(Stocker10CarrierData); } if (Stocker11CarrierData != null) { Stocker11CarrierData.StockerIndex = 11; _stockerList.Add(Stocker11CarrierData); } if (Stocker12CarrierData != null) { Stocker12CarrierData.StockerIndex = 12; _stockerList.Add(Stocker12CarrierData); } if (Stocker13CarrierData != null) { Stocker13CarrierData.StockerIndex = 13; _stockerList.Add(Stocker13CarrierData); } if (Stocker14CarrierData != null) { Stocker14CarrierData.StockerIndex = 14; _stockerList.Add(Stocker14CarrierData); } if (Stocker15CarrierData != null) { Stocker15CarrierData.StockerIndex = 15; _stockerList.Add(Stocker15CarrierData); } if (Stocker16CarrierData != null) { Stocker16CarrierData.StockerIndex = 16; _stockerList.Add(Stocker16CarrierData); } if (Stocker17CarrierData != null) { Stocker17CarrierData.StockerIndex = 17; _stockerList.Add(Stocker17CarrierData); } if (Stocker18CarrierData != null) { Stocker18CarrierData.StockerIndex = 18; _stockerList.Add(Stocker18CarrierData); } } public void SwitchPage(string operation) { var windowManager = IoC.Get(); switch (operation) { case "MaterialSelect": { _carrierlist.Clear(); foreach (var item in _stockerList) { string StockerType = (string)QueryDataClient.Instance.Service.GetConfig($"System.Stocker.Stocker{item.StockerIndex}WaferType"); var boolP = StockerType.StartsWith(CarrierType.P.ToString()) && !item.IsEmpty; var boolNone = StockerType.StartsWith(CarrierType.None.ToString()) && !item.IsEmpty&&item.CarrierType.ToString().StartsWith(CarrierType.P.ToString()); if (boolNone || boolP) { _carrierlist.Add(item); } } SelectMaterialViewModel selectmaterialViewModel = new SelectMaterialViewModel(); selectmaterialViewModel.carrierlist = _carrierlist; selectmaterialViewModel.CarrierType = "P"; selectmaterialViewModel.SelectCarrierItemList.Clear(); foreach (var item in SelectCarrierList) { selectmaterialViewModel.SelectCarrierItemList.Add(new CarrierMaterialInformation() { ModuleName = item.ModuleName, No = item.No, CarrierType = item.Type, StrSlot = item.StrSlot, CarrierId = item.CarrierID, }); }; if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(selectmaterialViewModel, null, "Select P")) { for (int j = 0; j < SelectCarrierList.Count; j++) { if (SelectCarrierList[j].Type.StartsWith(CarrierType.P.ToString())|| SelectCarrierList[j].Type.StartsWith(CarrierType.None.ToString())) { SelectCarrierList.RemoveAt(j); j--; } } PCarrierPara = ""; foreach (CarrierMaterialInformation item in selectmaterialViewModel.SelectCarrierItemList) { CarrierInformation carrierInfo = new CarrierInformation(); carrierInfo.No = item.No; carrierInfo.ModuleName = item.ModuleName; carrierInfo.Type = item.CarrierType; carrierInfo.CarrierID = item.CarrierId; carrierInfo.StrSlot = item.StrSlot; carrierInfo.LoadPortName = ""; PCarrierPara += item.ModuleName + "," + (item.CarrierId == null ? "" : item.CarrierId) + "," + item.StrSlot + ";"; SelectCarrierList.Add(carrierInfo); } } } break; case "SelectM": { _carrierlist.Clear(); foreach (var item in _stockerList) { string StockerType = (string)QueryDataClient.Instance.Service.GetConfig($"System.Stocker.Stocker{item.StockerIndex}WaferType"); var boolM = StockerType.StartsWith(CarrierType.M.ToString()) && !item.IsEmpty; var boolNone = StockerType.StartsWith(CarrierType.None.ToString()) && !item.IsEmpty&& item.CarrierType.ToString().Contains(CarrierType.M.ToString()); if (boolNone || boolM) { _carrierlist.Add(item); } } SelectMaterialViewModel selectmaterialViewModel = new SelectMaterialViewModel(); selectmaterialViewModel.carrierlist = _carrierlist; selectmaterialViewModel.CarrierType = "M"; selectmaterialViewModel.SelectCarrierItemList.Clear(); foreach (var item in SelectCarrierList) { selectmaterialViewModel.SelectCarrierItemList.Add(new CarrierMaterialInformation() { ModuleName = item.ModuleName, No = item.No, CarrierType = item.Type, CarrierId = item.CarrierID, StrSlot = item.StrSlot }); }; if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(selectmaterialViewModel, null, "Select M")) { int i = 0; for (int j = 0; j < SelectCarrierList.Count; j++) { if (SelectCarrierList[j].Type.Contains(ConstantsCommon.M)) { SelectCarrierList.RemoveAt(j); j--; } } M1CarrierPara = ""; M2CarrierPara = ""; foreach (CarrierMaterialInformation item in selectmaterialViewModel.SelectCarrierItemList) { CarrierInformation carrierInfo = new CarrierInformation(); carrierInfo.No = item.No; carrierInfo.ModuleName = item.ModuleName; carrierInfo.Type = item.CarrierType; carrierInfo.CarrierID = item.CarrierId; carrierInfo.StrSlot = item.StrSlot; carrierInfo.LoadPortName = ""; if(item.CarrierType == "M1") M1CarrierPara += item.ModuleName + "," + (item.CarrierId == null ? "" : item.CarrierId) + "," + item.StrSlot + ";"; else if(item.CarrierType == "M2") M2CarrierPara += item.ModuleName + "," + (item.CarrierId == null ? "" : item.CarrierId) + "," + item.StrSlot + ";"; SelectCarrierList.Add(carrierInfo); } } } break; } } public void SelectJobRecipe() { RecipeSelectDialogViewModel dialog = new RecipeSelectDialogViewModel(); dialog.DisplayName = "Select Job Recipe"; var recipeProvider = new RecipeProvider(); var processType = QueryDataClient.Instance.Service.GetConfig("System.Recipe.SupportedJobType"); if (processType == null) { processType = "Job Recipe"; } var ProcessTypeFileList = new ObservableCollection(); string[] recipeProcessType = ((string)processType).Split(','); for (int i = 0; i < recipeProcessType.Length; i++) { var type = new ProcessTypeFileItem(); type.ProcessType = recipeProcessType[i]; var prefix = $"Furnace\\{recipeProcessType[i]}"; var recipes = recipeProvider.GetXmlRecipeList(prefix); type.FileListByProcessType = RecipeSequenceTreeBuilder.BuildFileNode(prefix, "", false, recipes)[0].Files; ProcessTypeFileList.Add(type); } dialog.ProcessTypeFileList = ProcessTypeFileList; WindowManager wm = new WindowManager(); bool? bret = wm.ShowDialog(dialog); if ((bool)bret) { CurrentRecipe.Clear(); CurrentRecipe.PrefixPath = $"Furnace\\{processType}"; CurrentRecipe.Name = dialog.DialogResult; var recipeContent = _recipeProvider.LoadRecipe(CurrentRecipe.PrefixPath, CurrentRecipe.Name); if (string.IsNullOrEmpty(recipeContent)) { System.Windows.MessageBox.Show($"{CurrentRecipe.PrefixPath}\\{CurrentRecipe.Name} is empty, please confirm the file is valid."); return; } CurrentRecipe.RecipeChamberType = "OriginChamber"; CurrentRecipe.InitData(CurrentRecipe.PrefixPath, CurrentRecipe.Name, recipeContent, "PM1"); CheckIsExistRecipe(CurrentRecipe.ProcessRecipe, CurrentRecipe.LayoutRecipe); } } private void CheckIsExistRecipe(string processName, string layoutName) { var processPrefixPath = $"Furnace\\Process"; var layoutPrefixPath = $"Furnace\\Layout"; var processContent = _recipeProvider.LoadRecipe(processPrefixPath, processName); var layoutContent = _recipeProvider.LoadRecipe(layoutPrefixPath, layoutName); if (string.IsNullOrEmpty(processContent)) { DialogBox.ShowWarning($"Process Recipe:{processName} is empty, please confirm the file is valid."); } if (string.IsNullOrEmpty(layoutContent)) { DialogBox.ShowWarning($"Layout Recipe:{layoutName} is empty, please confirm the file is valid."); } } public void EXECCmd(string cmdPar) { if (string.IsNullOrEmpty(CurrentRecipe.Name)) { DialogBox.ShowWarning("Process recipe is empty"); return; } if (!DialogBox.Confirm("Are you sure to execute?")) return; if (string.IsNullOrEmpty(CurrentRecipe.ProcessRecipe)) { DialogBox.ShowWarning("Process recipe is empty"); return; } if (string.IsNullOrEmpty(CurrentRecipe.LayoutRecipe)) { DialogBox.ShowWarning("Layout recipe is empty"); return; } if (string.IsNullOrEmpty(CurrentRecipe.CoolTime)) { DialogBox.ShowWarning("Cool time is empty"); return; } if (string.IsNullOrEmpty(PJID)) { DialogBox.ShowWarning("PJ ID is empty"); return; } if (string.IsNullOrEmpty(CJID)) { DialogBox.ShowWarning("CJ ID is empty"); return; } string cjID = CJID;//根据输入 string pjID = PJID;//根据输入 string pjVariable = "";//后续完善 string pCarrierPara = string.IsNullOrEmpty(PCarrierPara) ? "" : PCarrierPara.Trim(';'); string m1CarrierPara = string.IsNullOrEmpty(M1CarrierPara) ? "" : M1CarrierPara.TrimEnd(';'); string m2CarrierPara = string.IsNullOrEmpty(M2CarrierPara) ? "" : M2CarrierPara.TrimEnd(';'); Dictionary param = new Dictionary() { {"PJID",pjID }, {"CJID",cjID }, {"JobRecipe", CurrentRecipe.Name}, {"CarrierPara", pCarrierPara}, {"m1CarrierPara", m1CarrierPara}, {"m2CarrierPara", m2CarrierPara}, {"PJVariable", pjVariable}, {"Charge", IsOnlyCharge }, }; SetValueToSC(param); InvokeClient.Instance.Service.DoOperation($"System.{ExecCommand}", param); ((Window)GetView()).DialogResult = true; } private void SetValueToSC(Dictionary param) { //foreach (var item in param.Keys) //{ // InvokeClient.Instance.Service.DoOperation($"System.SetConfig", $"System.Job.CreateJob.{item}", param[item]); //} } public void Check() { } public void ClosedCmd(string cmdPar) { (GetView() as Window).Close(); } } }