using Aitex.Core.Util; using Aitex.Core.Utilities; using Caliburn.Micro; using Caliburn.Micro.Core; using ExcelLibrary.BinaryFileFormat; using FurnaceUI.Models; using FurnaceUI.Views.Scheduled; using MECF.Framework.Common.CommonData.EnumData; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.Utilities; using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig; using MECF.Framework.UI.Client.CenterViews.Dialogs; using MECF.Framework.UI.Client.CenterViews.Editors; using MECF.Framework.UI.Client.CenterViews.Editors.Recipe; using MECF.Framework.UI.Client.CenterViews.Editors.Sequence; using OpenSEMI.ClientBase; using SciChart.Core.Extensions; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Text; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window; namespace FurnaceUI.Views.Editors { public class ScheduledMaintenanceMonitorViewModel : FurnaceUIViewModelBase { #region 构造函数 /// /// 构造函数 /// /// public ScheduledMaintenanceMonitorViewModel(ScheduleMaintenanceDataItem dataItem) { EditModel = CloneUtil.CloneObject(dataItem) as ScheduleMaintenanceDataItem; EnumLoop.ForEach((item) => { MaintenanceProcessingList.Add(item.ToString()); }); } private bool _jobAutoStartCommandVisibility = false; public bool JobAutoStartCommandVisibility { get => _jobAutoStartCommandVisibility; set { _jobAutoStartCommandVisibility = value; NotifyOfPropertyChange("JobAutoStartCommandVisibility"); } } private string _selectStepIdName = string.Empty; public string SelectStepIdName { get => _selectStepIdName; set { _selectStepIdName = value; NotifyOfPropertyChange("SelectStepIdName"); } } private List _maintenanceProcessingList = new List(); public List MaintenanceProcessingList { get => _maintenanceProcessingList; set { _maintenanceProcessingList = value; NotifyOfPropertyChange("MaintenanceProcessingList"); } } #endregion #region 属性 EditModel /// /// EditModel /// public ScheduleMaintenanceDataItem EditModel { get; set; } #endregion public bool IsEnable { get { return _isEnable; } set { _isEnable = value; NotifyOfPropertyChange("IsEnable"); } } private bool _isEnable; public void TimeSelect(object cmdName, object value) { var windowManager = IoC.Get(); RecipeStepTimeViewModel recipeStepTimeViewModel = new RecipeStepTimeViewModel("StepTime"); bool isCurrentValue = value.ToString() == "CurrentValue"; bool isStartValue = value.ToString() == "StartValue"; bool isLimitValue = value.ToString() == "LimitValue"; if (isCurrentValue) { recipeStepTimeViewModel.SelectValueTime = DateTimeUtil.SecondToHHmmss(EditModel.CurrentValue.ToString()); } else if (isStartValue) { recipeStepTimeViewModel.SelectValueTime = DateTimeUtil.SecondToHHmmss(EditModel.StartValue.ToString()); } else if (isLimitValue) { recipeStepTimeViewModel.SelectValueTime = DateTimeUtil.SecondToHHmmss(EditModel.LimitValue.ToString()); } (windowManager as WindowManager)?.ShowDialogWithTitle(recipeStepTimeViewModel, null, "Standby Time Setting"); if (recipeStepTimeViewModel.IsSave) { if (recipeStepTimeViewModel.SelectTime == "Value") { var allSecond = DateTimeUtil.GetSecond(recipeStepTimeViewModel.SelectValueTime); if (isCurrentValue) { EditModel.CurrentValue = allSecond; } else if (isStartValue) { EditModel.StartValue = allSecond; } else if (isLimitValue) { EditModel.LimitValue = allSecond; } } } } #region 方法 CurrentValueChange /// /// CurrentValueChange /// public void SetCurrentValue(object obj, MouseButtonEventArgs e) { e.Handled = true; NumberKeyboard fullKeyboard = new NumberKeyboard("", "0"); if ((bool)fullKeyboard.ShowDialog()) { var data = fullKeyboard.ValueString; if (EditModel.Path == "Reactor.StepRunTime") { var dataStrs = data.Split('.').ToList(); if (dataStrs.Count > 1) { EditModel.CurrentValue = float.Parse(dataStrs.FirstOrDefault()) * 3600 + float.Parse(dataStrs.LastOrDefault()) * 60; } else { EditModel.CurrentValue = float.Parse(dataStrs.FirstOrDefault()) * 3600; } } else { EditModel.CurrentValue = float.Parse(data); } } //if ((bool)fullKeyboard.ShowDialog()) //{ // //InvokeClient.Instance.Service.DoOperation($"{SystemName}.SetConfig", path, fullKeyboard.ValueString); // //currentValue = fullKeyboard.ValueString; // //EditModel.CurrentValue = fullKeyboard.ValueString; //} } public void CurrentValueChange() { IsEnable = !IsEnable; } #endregion protected override void InvokeAfterUpdateProperty(Dictionary data) { if (EditModel != null && !string.IsNullOrEmpty(EditModel.MaintenanceProcessing) && EditModel.MaintenanceProcessing == MaintenanceProcessingCommandEnum.JobAutoStart.ToString()) { JobAutoStartCommandVisibility = true; } else { EditModel.AssociationProcessRecipeName = ""; JobAutoStartCommandVisibility = false; } } protected override void OnViewLoaded(object view) { base.OnViewLoaded(view); var isReator = EditModel.DataItemType == DataItemEnum.Reactor; if (isReator && (EditModel.ReactorsType == ReactorsEnum.StepRunTime || EditModel.ReactorsType == ReactorsEnum.StepRunFreq) && !string.IsNullOrEmpty(EditModel.AdditionInformationDisplay)) { SelectStepIdName = $":{(string)QueryDataClient.Instance.Service.GetConfig($"PM1.RecipeEditParameter.StepName.{EditModel.AdditionInformationDisplay}")}"; } if (isReator && EditModel.ReactorsType == ReactorsEnum.StepThickness) { CompareConfigurations(); } } public void SelectStepIDMethod() { var windowManager = IoC.Get(); RecipeStepNameViewModel recipeStepNameViewModel = new RecipeStepNameViewModel() { CheckNumber = true, SelectedStepName = EditModel.AdditionInformationDisplay }; if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(recipeStepNameViewModel, null, "Select Step ID")) { var strs = recipeStepNameViewModel.SelectedStepName.Split(':'); if (IsExist(strs.FirstOrDefault())) { DialogBox.ShowWarning($"Step: {strs.FirstOrDefault()} repeated selection!"); return; } EditModel.AdditionInformationDisplay = strs.FirstOrDefault(); if (strs.Length > 1) { SelectStepIdName = $":{strs.LastOrDefault()}"; } } } private bool IsExist(string stepId) { string sql = $"SELECT addition_information_display FROM \"schedule_maintenance\" WHERE path='{EditModel.DataItemType}.{EditModel.ReactorsType}' AND addition_information_display='{stepId}'"; DataTable dt = QueryDataClient.Instance.Service.QueryData(sql); if (dt != null && dt.Rows != null) { return dt.Rows.Count >= 1; } return false; } private void CompareConfigurations() { var groupValue = (string)QueryDataClient.Instance.Service.GetConfig($"PM1.RecipeEditParameter.StepGroup.{EditModel.AdditionInformationDisplay}"); if (!string.IsNullOrEmpty(EditModel.AdditionInformationDisplaySupplement)) { if (string.IsNullOrEmpty(groupValue)) { DialogBox.ShowWarning($"The selected {EditModel.AdditionInformationDisplay} does not match the Config {EditModel.AdditionInformationDisplay}. Please confirm!"); } else { var oldDatas = EditModel.AdditionInformationDisplaySupplement.Split(',').ToList(); var newDatas = groupValue.Split(',').ToList(); // 判断 oldDatas 中有但 newDatas 中没有的元素 var differenceOldToNew = oldDatas.Except(newDatas).ToList(); // 判断 newDatas 中有但 oldDatas 中没有的元素 var differenceNewToOld = newDatas.Except(oldDatas).ToList(); // 检查是否存在差集 bool hasDifference = differenceOldToNew.Any() || differenceNewToOld.Any(); if (hasDifference) { DialogBox.ShowWarning($"The selected {EditModel.AdditionInformationDisplay} does not match the Config {EditModel.AdditionInformationDisplay}. Please confirm!"); } } } else { if (!string.IsNullOrEmpty(groupValue)) { DialogBox.ShowWarning($"The selected {EditModel.AdditionInformationDisplay} does not match the Config {EditModel.AdditionInformationDisplay}. Please confirm!"); } } } public void SelectStepGroupMethod() { var windowManager = IoC.Get(); StepGroupSelectViewModel recipeStepNameViewModel = new StepGroupSelectViewModel() { SelectedGroupName = EditModel.AdditionInformationDisplay }; if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(recipeStepNameViewModel, null, "Select Step Group")) { EditModel.AdditionInformationDisplay = recipeStepNameViewModel.SelectedGroupName; var gropuDataStr = (string)QueryDataClient.Instance.Service.GetConfig($"PM1.RecipeEditParameter.StepGroup.{recipeStepNameViewModel.SelectedGroupName}"); if (!string.IsNullOrEmpty(gropuDataStr)) { var datas = QueryDataClient.Instance.Service.PollConfig(gropuDataStr.Split(',').ToList().Select(a => $"PM1.RecipeEditParameter.StepName.{a}")); var recipeNames = datas.Select(a => $"{a.Key.Split('.').LastOrDefault()}"); EditModel.AdditionInformationDisplaySupplement = string.Join(",", recipeNames); } else { EditModel.AdditionInformationDisplaySupplement = ""; } } } public void SelectProcessRecipe(string value) { RecipeSelectDialogViewModel dialog = new RecipeSelectDialogViewModel(); dialog.DisplayName = "Select Recipe"; var recipeProvider = new RecipeProvider(); var processType = QueryDataClient.Instance.Service.GetConfig($"System.Recipe.SupportedProcessType"); if (processType == null) { processType = "Process"; } var ProcessTypeFileList = new ObservableCollection(); string[] recipeProcessType = ((string)processType).Split(','); var type = new ProcessTypeFileItem(); type.ProcessType = recipeProcessType[0]; var prefix = $"Furnace\\{recipeProcessType[0]}"; 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) { if (value == "AssociationProcessRecipeName") { EditModel.AssociationProcessRecipeName = dialog.DialogResult; } if (value == "AdditionInformationDisplay") { EditModel.AdditionInformationDisplay = dialog.DialogResult; } } } #region 方法 ClearCurrentValue /// /// ClearCurrentValue /// public void ClearCurrentValue() { if (EditModel != null) { EditModel.CurrentValue = 0; } } #endregion #region 方法 SetSave public void SetSave() { this.TryClose(true); } #endregion #region 方法 SetCancel public void SetCancel() { TryClose(); } #endregion } }