From b544d5cccd76735e034c8055918a50927b437474 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期二, 10 十一月 2026 08:29:04 +0800
Subject: [PATCH] fix: 维护模式重复进入失败与按钮灰死 + Broker 并发验证用例

---
 HMI.ParameterManage/ParameterSetting.xaml.cs |  235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 233 insertions(+), 2 deletions(-)

diff --git a/HMI.ParameterManage/ParameterSetting.xaml.cs b/HMI.ParameterManage/ParameterSetting.xaml.cs
index 8b8c0a0..643bd8b 100644
--- a/HMI.ParameterManage/ParameterSetting.xaml.cs
+++ b/HMI.ParameterManage/ParameterSetting.xaml.cs
@@ -1,8 +1,14 @@
 锘縰sing HMI.Base;
+using HMI.Core.Entity;
+using HMI.Core.Manager;
+using HMI.Core.Setting;
 using HMI.Core.Util;
 using HMI.UI.Util;
+using HMI.Util;
+using Microsoft.Win32;
 using System;
 using System.Collections.Generic;
+using System.Collections.ObjectModel;
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
@@ -15,9 +21,20 @@
     public partial class ParameterSetting : PluginControl
     {
 
+        private ObservableCollection<ParameterData> datasource;
+        public ObservableCollection<ParameterData> Datasource
+        {
+            get => datasource;
+            set
+            {
+                Set(ref datasource, value);
+            }
+        }
+
+        public List<string> groups = new List<string>();
+
         public ParameterSetting()
         {
-           
             this.DataContext = this;
             InitializeComponent();
         }
@@ -25,13 +42,227 @@
         private void Button_Click(object sender, RoutedEventArgs e)
         {
             var btn = ((Button)sender);
-            
+            ParameterData data = btn.DataContext as ParameterData;
+            switch (btn.Name)
+            {
+                case "addBtn":
+                    OpenDataModal(null, false);
+                    break;
+                case "editBtn":
+                    OpenDataModal(data, true);
+                    break;
+                case "refreshBtn":
+                    LoadData();
+                    break;
+                case "delBatchBtn":
+                    DeleteBatch();
+                    break;
+                case "exportBtn":
+                    ExportData();
+                    break;
+                case "importBtn":
+                    ImportData();
+                    break;
+                case "delBtn":
+                    DeleteData(data);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        /// <summary>
+        /// 鍔犺浇鏁版嵁
+        /// </summary>
+        public void LoadData()
+        {
+            try
+            {
+                Datasource = ParameterManager.GetCommonParameter<ObservableCollection<ParameterData>>()
+                ?? new ObservableCollection<ParameterData>();
+                groups = Datasource.Where(d => !string.IsNullOrEmpty(d.ShowGroup)).Select(d => d.ShowGroup).Distinct().ToList();
+            }
+            catch (Exception ex)
+            {
+                Datasource = new ObservableCollection<ParameterData>();
+                groups = new List<string>();
+                log.Error("Refresh Data Failed.", ex);
+                ToastHelper.Error(Window.GetWindow(this), $"{this.lang("App.RefreshFailed")}: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鎵撳紑鏂板鎴栫紪杈戠獥鍙�
+        /// </summary>
+        /// <param name="data"></param>
+        public void OpenDataModal(ParameterData data, bool isUpdate)
+        {
+            try
+            {
+                int index = isUpdate ? Datasource.IndexOf(data) : -1;
+                string title = isUpdate ? $"{this.lang("App.Edit")}" : $"{this.lang("App.Add")}";
+                SettingModal modal = new SettingModal()
+                {
+                    Title = title,
+                    Owner = Window.GetWindow(this)
+                };
+                if (modal.Open(data ?? new ParameterData(), Datasource, groups) == true)
+                {
+                    if (index == -1)
+                    {
+                        Datasource.Add(modal.Data);
+                        ParameterManager.SaveCommonParameter(Datasource);
+                    }
+                    else
+                    {
+                        ParameterManager.SaveCommonParameter(Datasource);
+                    }
+                    LoadData();
+                }
+            }
+            catch (Exception ex)
+            {
+                if (isUpdate)
+                {
+                    log.Error("Edit Data Failed.", ex);
+                    MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.EditFailed")}: {ex.Message}");
+                }
+                else
+                {
+                    log.Error("Add Data Failed.", ex);
+                    MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.AddFailed")}: {ex.Message}");
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鎵归噺鍒犻櫎
+        /// </summary>
+        public void DeleteBatch()
+        {
+            try
+            {
+                var count = Datasource.Where(d => d.IsSelected).Count();
+                if (count <= 0)
+                {
+                    ToastHelper.Warning(this, this.lang("HMI.NoDeleteData"));
+                    return;
+                }
+                if (MsgBoxHelper.WarnMessage(this, this.lang("HMI.MakeSureDeletes", count))
+                    == MessageBoxResult.OK)
+                {
+                    var temp = Datasource.Where(d => !d.IsSelected).ToList();
+                    ParameterManager.SaveCommonParameter(temp);
+                    LoadData();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Delete Batch Data Failed.", ex);
+                ToastHelper.Error(Window.GetWindow(this), $"{this.lang("App.DeleteFailed")}: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鍙傛暟
+        /// </summary>
+        /// <param name="data"></param>
+        private void DeleteData(ParameterData data)
+        {
+            try
+            {
+                if (MsgBoxHelper.WarnMessage(this, this.lang("HMI.MakeSureDeleteSingle", data.Name))
+                    == MessageBoxResult.OK)
+                {
+                    int index = Datasource.IndexOf(data);
+                    if (index < 0)
+                    {
+                        ToastHelper.Error(this, this.lang("App.ParameterException"));
+                        return;
+                    }
+                    var temp = XmlHelper.DeepClone(Datasource);
+                    temp.RemoveAt(index);
+                    ParameterManager.SaveCommonParameter(temp);
+                    LoadData();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Delete Parameter Failed.", ex);
+                ToastHelper.Error(this, $"{this.lang("App.DeleteFailed")}: {ex.Message}");
+                return;
+            }
+        }
+
+        /// <summary>
+        /// 瀵煎嚭鏁版嵁
+        /// </summary>
+        private void ExportData()
+        {
+            try
+            {
+                SaveFileDialog sfd = new SaveFileDialog();
+
+                sfd.Filter = "";
+                sfd.DefaultExt = "xls";
+                sfd.FileName = this.lang("Pm.Setting.Title");
+                if (sfd.ShowDialog() == true)
+                {
+                    string targetPath = sfd.FileName;
+                    ExcelHelper.ExportExcel(targetPath, Datasource);
+                    ToastHelper.Success(Window.GetWindow(this), this.lang("App.ExportSuccess"));
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Export Data Failed.", ex);
+                MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.ExportFailed")}: {ex.Message}");
+            }
+        }
+
+        private void ImportData()
+        {
+            try
+            {
+                OpenFileDialog openFileDialog = new OpenFileDialog();
+                openFileDialog.Filter = "execl(*.xlsx;*.xls)|*.xlsx;*.xls";
+                openFileDialog.Title = this.lang("App.SelectFile");
+                openFileDialog.Multiselect = false;
+                if (openFileDialog.ShowDialog() == true)
+                {
+                    List<ParameterData> datas = ExcelHelper.ReadFromExcel<ParameterData>(openFileDialog.FileName);
+                    ParameterManager.SaveCommonParameter(datas);
+                    LoadData();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Export Data Failed.", ex);
+                MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.ExportFailed")}: {ex.Message}");
+            }
         }
 
         private void UserControl_Loaded(object sender, RoutedEventArgs e)
         {
+            LoadData();
             Loaded -= UserControl_Loaded;
         }
 
+        public override bool CanActive()
+        {
+            if (ParamSetting.IsOptRequirePassword)
+            {
+                var win = new RequirePasswordWindow
+                {
+                    Owner = Window.GetWindow(this),
+                    WindowStartupLocation = WindowStartupLocation.CenterScreen
+                };
+                return win.ShowDialog() == true;
+            }
+            else
+            {
+                return true;
+            }
+        }
     }
 }

--
Gitblit v1.9.1