using Aitex.Core.Common.DeviceData; using Caliburn.Micro; using Caliburn.Micro.Core; using FurnaceUI.Models; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig; using MECF.Framework.UI.Client.CenterViews.Dialogs; using MECF.Framework.UI.Client.CenterViews.Editors.Recipe; using RecipeEditorLib.RecipeModel.Params; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using System.Windows.Controls; namespace FurnaceUI.Views.Editors { public class RecipeGASSettingViewModel : FurnaceUIViewModelBase { public ObservableCollection ValveSets { get; set; } = new ObservableCollection(); public Dictionary ExternalOutSets { get; set; } = new Dictionary(); //public Dictionary MFCSets { get; set; } = new Dictionary(); public ObservableCollection MFCSets { get; set; } = new ObservableCollection(); public Dictionary MFMSets { get; set; } = new Dictionary(); //public MFMValue MFMSets { get; set; } = new MFMValue(); public bool IsSave { get; set; } = false; private bool _eXOU1 = false; public bool EXOU1 { get => _eXOU1; set { _eXOU1 = value; NotifyOfPropertyChange("EXOU1"); } } private bool _eXOU2 = false; public bool EXOU2 { get => _eXOU2; set { _eXOU2 = value; NotifyOfPropertyChange("EXOU2"); } } private bool _eXOU3 = false; public bool EXOU3 { get => _eXOU3; set { _eXOU3 = value; NotifyOfPropertyChange("EXOU3"); } } private bool _eXOU4 = false; public bool EXOU4 { get => _eXOU4; set { _eXOU4 = value; NotifyOfPropertyChange("EXOU4"); } } private bool _eXOU5 = false; public bool EXOU5 { get => _eXOU5; set { _eXOU5 = value; NotifyOfPropertyChange("EXOU5"); } } private bool _eXOU6 = false; public bool EXOU6 { get => _eXOU6; set { _eXOU6 = value; NotifyOfPropertyChange("EXOU6"); } } private Visibility _gridMFCVisibility = Visibility.Hidden; public Visibility GridMFCVisibility { get => _gridMFCVisibility; set { _gridMFCVisibility = value; NotifyOfPropertyChange("GridMFCVisibility"); } } private Visibility _gridMFMVisibility = Visibility.Hidden; public Visibility GridMFMVisibility { get => _gridMFMVisibility; set { _gridMFMVisibility = value; NotifyOfPropertyChange("GridMFMVisibility"); } } private Visibility _gridValveVisibility = Visibility.Hidden; public Visibility GridValveVisibility { get => _gridValveVisibility; set { _gridValveVisibility = value; NotifyOfPropertyChange("GridValveVisibility"); } } private string _Value; public string Value { get => _Value; set { _Value = value; NotifyOfPropertyChange("Value"); } } public Dictionary> _recipeTemplate; public Dictionary> RecipeTemplate { get => _recipeTemplate; set { _recipeTemplate = value; ValveTemplateColumn = RecipeTemplate["Valve"]; if (RecipeType != "Sub" && RecipeType != "Abort Sub" && RecipeType != "Abort") { foreach (var valve in ValveTemplateColumn) { valve.IsEnable = IsEnable; int iCount = valve.Options.Count; for (int i = 0; i < iCount; i++) { if (valve.Options[i].ControlName.Contains("Continue")) valve.Options.RemoveAt(i); } } } MFMTemplateColumn = RecipeTemplate["MFM"]; MFMDataList.Clear(); foreach (var item in MFMTemplateColumn) { MFMDataList.Add(new MFMData() { ControlName = item.ControlName, DisplayName = item.DisplayName, SetValue = new StringParam() { Name = "SetValue", Value = MFMSets[item.ControlName].Value.ToString() }, AlarmValue = MFMSets[item.ControlName].AlarmValue, Name = SystemConfigProvider.Instance.GetValueByName($"PM1.MFM.{item.ModuleName}.Name"), Unit = SystemConfigProvider.Instance.GetValueByName($"PM1.MFM.{item.ModuleName}.FlowUnit"), MaxValue = new DoubleParam() { Name = "MaxValue", Value = SystemConfigProvider.Instance.GetValueByName($"PM1.MFM.{item.ModuleName}.N2Scale")}, IsEnable = IsEnable }); } MFCTemplateColumn = RecipeTemplate["MFC"]; foreach (var item in MFCTemplateColumn) { var isInstalled = QueryDataClient.Instance.Service.GetConfig($"PM1.MFC.{item.ModuleName}.IsMFCInstalled"); if (!(bool)isInstalled) continue; var mfc = MFCSets.FirstOrDefault(x => x.ControlName == item.ModuleName); if (mfc != null) { mfc.SetValue.Value = item.Value.ToString(); mfc.DisplayName = SystemConfigProvider.Instance.GetValueByName($"PM1.MFC.{item.ModuleName}.GasName"); mfc.Unit = SystemConfigProvider.Instance.GetValueByName($"PM1.MFC.{item.ModuleName}.FlowUnit"); mfc.MaxValue.Value = SystemConfigProvider.Instance.GetValueByName($"PM1.MFC.{item.ModuleName}.N2Scale"); mfc.IsEnable = IsEnable; } } NotifyOfPropertyChange("RecipeTemplate"); } } private ObservableCollection _valveTemplateColumn; public ObservableCollection ValveTemplateColumn { get => _valveTemplateColumn; set { _valveTemplateColumn = value; CreateDictDefault(); NotifyOfPropertyChange("ValveTemplateColumn"); } } private ObservableCollection _mFMTemplateColumn; public ObservableCollection MFMTemplateColumn { get => _mFMTemplateColumn; set { _mFMTemplateColumn = value; NotifyOfPropertyChange("MFMTemplateColumn"); } } private ObservableCollection _mFCTemplateColumn; public ObservableCollection MFCTemplateColumn { get => _mFCTemplateColumn; set { _mFCTemplateColumn = value; NotifyOfPropertyChange("MFCTemplateColumn"); } } private ObservableCollection _mFMDatas = new ObservableCollection(); public ObservableCollection MFMDataList { get => _mFMDatas; set { _mFMDatas = value; NotifyOfPropertyChange("MFMDataList"); } } private void CreateDictDefault() { foreach (var item in _valveTemplateColumn) { var tempVal = ValveSets.FirstOrDefault(x => x.Name == item.ControlName); if (tempVal==null) { ValveSets.Add(new BoolParam() { Name = item.ControlName ,Value=false}); } } } public bool IsEnable => CGlobal.RecipeProcessEditViewEnable;//是否是View模式 public string RecipeType { get; set; } public RecipeGASSettingViewModel() { for (int i = 1; i < 7; i++) { ExternalOutSets.Add($"EXOU{i}", false); } } protected override void OnViewLoaded(object view) { base.OnViewLoaded(view); GridMFCVisibility = Visibility.Visible; RefreshUpdate(); } private string ShowNumberKeyboard(Control control, string defaultValue) { NumberKeyboard numberKeyboard = new NumberKeyboard("", defaultValue); var point = control.PointFromScreen(new Point(0, 0)); double wx = SystemParameters.WorkArea.Width; double hy = SystemParameters.WorkArea.Height; if (-point.Y + control.ActualHeight + 5 + numberKeyboard.Height < hy) { numberKeyboard.Top = -point.Y + control.ActualHeight + 5; } else { numberKeyboard.Top = -point.Y - numberKeyboard.Height - 5; } if (-point.X + numberKeyboard.Width < wx) { numberKeyboard.Left = -point.X; } else { numberKeyboard.Left = -point.X - (numberKeyboard.Width - control.ActualWidth); } if ((bool)numberKeyboard.ShowDialog()) return numberKeyboard.ValueString; else return "Cancel"; } public void MFCChangedCmd(object senderName, object sender, object typeName) { var controlName = (string)senderName; var tempMFCTemplateColumn = MFCTemplateColumn.Where(x => x.ModuleName == controlName).FirstOrDefault(); if (tempMFCTemplateColumn != null) { switch (typeName.ToString()) { //case "Status": // SwitchDialog dlg = new SwitchDialog(); // dlg.IsOpen = MFCDataList.Where(x => x.ControlName == controlName).FirstOrDefault().Status == "Open"; // dlg.WindowStartupLocation = WindowStartupLocation.CenterScreen; // dlg.ShowDialog(); // if (dlg.IsSave) // { // MFCDataList.Where(x => x.ControlName == controlName).FirstOrDefault().Status = dlg.IsOpen ? "Open" : "Close"; // } // break; case "Value": string strRetValue = ShowNumberKeyboard(sender as Button, ""); if (strRetValue != "Cancel") { //MFCTemplateColumn.Where(x => x.ControlName == controlName).FirstOrDefault().Value = double.Parse(strRetValue); MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().SetValue.Value = strRetValue; } break; case "Rampng": strRetValue = ShowNumberKeyboard(sender as Button, ""); if (strRetValue != "Cancel") { MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().Rampng.Value = strRetValue; } break; case "AlarmValue": RecipeGASSettingMFCAlarmViewModel view = new RecipeGASSettingMFCAlarmViewModel(MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue.ToString()); WindowManager wm = IoC.Get() as WindowManager; if (!(bool)wm.ShowDialogWithTitle(view, null, "Select Flow Alarm Table")) break; MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue = view.CurrentValue; break; default: break; } var mfcData = MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault(); if (mfcData != null) { InvokeClient.Instance.Service.DoOperation($"PM1.{controlName}.SetMfcVirtualValue", $"{mfcData.SetValue};{mfcData.Rampng};{mfcData.AlarmValue}"); } NotifyOfPropertyChange("MFCTemplateColumn"); } } public void MFMChangedCmd(object senderName, object sender, object typeName) { var controlName = (string)senderName; var control = (Button)sender; var tempMFMTemplateColumn = MFMTemplateColumn.Where(x => x.ControlName == controlName).FirstOrDefault(); if (tempMFMTemplateColumn != null) { switch (typeName.ToString()) { case "Value": string strRetValue = ShowNumberKeyboard(sender as Button, $"{tempMFMTemplateColumn.Value}"); if (strRetValue != "Cancel") { MFMTemplateColumn.Where(x => x.ControlName == controlName).FirstOrDefault().Value = double.Parse(strRetValue); MFMDataList.Where(x => x.ControlName == controlName).FirstOrDefault().SetValue.Value = strRetValue; NotifyOfPropertyChange("MFMTemplateColumn"); } break; case "AlarmValue": RecipeGASSettingMFCAlarmViewModel view = new RecipeGASSettingMFCAlarmViewModel(MFMDataList.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue.ToString()); WindowManager wm = IoC.Get() as WindowManager; if (!(bool)wm.ShowDialogWithTitle(view, null, "Select Flow Alarm Table")) break; MFMDataList.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue = view.CurrentValue; break; } } } public void GASValveSelectionChanged(object sender, object e) { var obj = (RecipeTemplateColumnBase)((ComboBox)sender).DataContext; bool isOpen = false; if (obj.SelectedValueIndex == 0) { isOpen = false; } else if (obj.SelectedValueIndex == 1) { isOpen = true; } InvokeClient.Instance.Service.DoOperation($"PM1.{obj.ControlName}.{AITValveOperation.GVVirtualTurnValve}", isOpen); } public void MFCShowVauleCmd(object senderName, object sender, object maxValue) { var windowManager = IoC.Get(); var controlName = (string)senderName; var control = (Button)sender; RecipeFlowSettingViewModel recipeFlowSettingViewModel = new RecipeFlowSettingViewModel(); recipeFlowSettingViewModel.RecipeType = RecipeType; recipeFlowSettingViewModel.SelectMfcFlow = controlName; recipeFlowSettingViewModel.SelectFlowValue = control.Content.ToString().Contains("Force") ? "0.0" : control.Content.ToString(); recipeFlowSettingViewModel.MaxValue = Convert.ToDouble(maxValue); if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(recipeFlowSettingViewModel, null, "Recipe Flow Setting")) { Value = recipeFlowSettingViewModel.SelectFlow; MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().SetValue.Value = recipeFlowSettingViewModel.SelectFlow; var mfcData = MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault(); if (mfcData != null) { InvokeClient.Instance.Service.DoOperation($"PM1.{controlName}.SetMfcVirtualValue", $"{mfcData.SetValue};{mfcData.Rampng};{mfcData.AlarmValue}"); } NotifyOfPropertyChange("MFCTemplateColumn"); } } public void GASSettingSave() { IsSave = true; if (_valveTemplateColumn != null) { foreach (var item in _valveTemplateColumn) { var tempVal = ValveSets?.FirstOrDefault(x => x.Name == item.ControlName); if (tempVal != null) { switch (item.SelectedValueIndex) { case 0: tempVal.Value = false; break; case 1: tempVal.Value = true; break; case 2: tempVal.Value = false;//"Continue" break; } //ValveSets[item.ControlName] = item.SelectedValueIndex == 0 ? "Close" : "Open"; } else { BoolParam valveSet = new BoolParam() { Name = item.ControlName, Value = false }; switch (item.SelectedValueIndex) { case 0: valveSet.Value = false; break; case 1: valveSet.Value = true; break; case 2: valveSet.Value = false;// "Continue"; break; } ValveSets.Add(valveSet); } } if (_mFCTemplateColumn != null) { } if (_mFMTemplateColumn != null) { foreach (var item in MFMDataList) { if (MFMSets != null) { //MFMSets.Value = item.Value.ToString(); //MFMSets.AlarmValue = item.AlarmValue.ToString(); if (MFMSets.ContainsKey(item.ControlName)) { MFMSets[item.ControlName].Value = item.SetValue.ToString(); MFMSets[item.ControlName].AlarmValue = item.AlarmValue.ToString(); } else { MFMSets.Add(item.ControlName, new MFMValue() { Value = item.SetValue.Value, AlarmValue = item.AlarmValue.ToString(), Name = item.Name, }); } } } } ExternalOutSets["EXOU1"] = EXOU1; ExternalOutSets["EXOU2"] = EXOU2; ExternalOutSets["EXOU3"] = EXOU3; ExternalOutSets["EXOU4"] = EXOU4; ExternalOutSets["EXOU5"] = EXOU5; ExternalOutSets["EXOU6"] = EXOU6; ((Window)GetView()).DialogResult = true; } } public void GASSettingCancel() { ((Window)GetView()).DialogResult = false; } public void GASSettingSelectCmd(string cmd) { GridMFCVisibility = Visibility.Hidden; GridMFMVisibility = Visibility.Hidden; GridValveVisibility = Visibility.Hidden; switch (cmd) { case "MFC": GridMFCVisibility = Visibility.Visible; break; case "MFM": GridMFMVisibility = Visibility.Visible; break; case "Valve": GridValveVisibility = Visibility.Visible; break; default: break; } } public void RefreshUpdate() { foreach (var item in ValveTemplateColumn) { var tempVal = ValveSets.FirstOrDefault(x => x.Name == item.ControlName); if (ValveSets != null && tempVal != null) { if (tempVal.Value) { item.SelectedValueIndex = 0; } else { item.SelectedValueIndex = 1; } //case "Continue": // item.SelectedValueIndex = 2; // break; } //item.SelectedValueIndex = ValveSets[item.ControlName] == "Close" ? 0 : 1; } //if (MFCSets != null) //{ // foreach (var item in MFCSets) // { // string getMFCName = item.Replace(".Flow", "").Trim(); // if (MFCDataList.Where(x => x.ControlName== getMFCName).FirstOrDefault() != null) // { // MFCDataList.Where(x => x.ControlName == getMFCName).FirstOrDefault().SetValueParam = MFCSets[item].SetValueParam; // } // } //} if (ExternalOutSets != null && ExternalOutSets.Count > 0) { foreach (var item in ExternalOutSets.Keys) { switch (item) { case "EXOU1": EXOU1 = ExternalOutSets[item]; break; case "EXOU2": EXOU2 = ExternalOutSets[item]; break; case "EXOU3": EXOU3 = ExternalOutSets[item]; break; case "EXOU4": EXOU4 = ExternalOutSets[item]; break; case "EXOU5": EXOU5 = ExternalOutSets[item]; break; case "EXOU6": EXOU6 = ExternalOutSets[item]; break; default: break; } } } } } }