From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点

---
 HMI.ParameterManage/TestItem.xaml.cs |  318 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 318 insertions(+), 0 deletions(-)

diff --git a/HMI.ParameterManage/TestItem.xaml.cs b/HMI.ParameterManage/TestItem.xaml.cs
new file mode 100644
index 0000000..f6c1308
--- /dev/null
+++ b/HMI.ParameterManage/TestItem.xaml.cs
@@ -0,0 +1,318 @@
+锘縰sing HMI.Base;
+using HMI.Core.Entity;
+using HMI.Core.Manager;
+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;
+
+namespace HMI.ParameterManage
+{
+    /// <summary>
+    /// UserControl1.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class TestItem : PluginControl
+    {
+        public TestItem()
+        {
+            DataContext = this;
+            InitializeComponent();
+        }
+
+        private ObservableCollection<ProductData> products;
+        public ObservableCollection<ProductData> Products
+        {
+            get => products;
+            set { Set(ref products, value); }
+        }
+
+        private ObservableCollection<TestItemData> testItems;
+        public ObservableCollection<TestItemData> TestItems
+        {
+            get => testItems;
+            set { Set(ref testItems, value); }
+        }
+
+        private ProductData selectedProduct;
+        public ProductData SelectedProduct
+        {
+            get => selectedProduct;
+            set
+            {
+                Set(ref selectedProduct, value);
+                LoadTestItems();
+            }
+        }
+
+        bool isActivated;
+        public static string FileFolder { get; private set; }
+        public override void Active()
+        {
+           
+        }
+
+        private void Button_Click(object sender, RoutedEventArgs e)
+        {
+            System.Windows.Controls.Button btn = sender as System.Windows.Controls.Button;
+            TestItemData data = btn.DataContext as TestItemData;
+            switch (btn.Name)
+            {
+                case "addBtn":
+                    OpenTestItemModal(null, false);
+                    break;
+                case "editBtn":
+                    OpenTestItemModal(data, true);
+                    break;
+                case "refreshBtn":
+                    LoadProducts();
+                    break;
+                case "delBtn":
+                    DeleteData(data);
+                    break;
+                case "delBatchBtn":
+                    DeleteBatch();
+                    break;
+                case "exportBtn":
+                    ExportData();
+                    break;
+                case "importBtn":
+                    ImportData();
+                    break;
+                default:
+                    break;
+            }
+        }
+        /// <summary>
+        /// 鍔犺浇鏁版嵁
+        /// </summary>
+        public void LoadTestItems()
+        {
+            if (SelectedProduct == null)
+            {
+                TestItems = new ObservableCollection<TestItemData>();
+                return;
+            }
+            try
+            {
+                TestItems =
+                    TestItemManager.GetTestItemByProduct<ObservableCollection<TestItemData>>(SelectedProduct.Name)
+                ?? new ObservableCollection<TestItemData>();
+            }
+            catch (Exception ex)
+            {
+                TestItems = new ObservableCollection<TestItemData>();
+                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 OpenTestItemModal(TestItemData data, bool isUpdate)
+        {
+            try
+            {
+                if (SelectedProduct == null)
+                {
+                    ToastHelper.Warning(this, this.lang("Pm.Ti.PleaseSelectProduct"));
+                    return;
+                }
+
+                int index = isUpdate ? TestItems.IndexOf(data) : -1;
+                string title = isUpdate ? $"{this.lang("App.Edit")}" : $"{this.lang("App.Add")}";
+                TestItemModal modal = new TestItemModal()
+                {
+                    Title = title,
+                    Owner = Window.GetWindow(this)
+                };
+                if (modal.Open(data ?? new TestItemData(), TestItems) == true)
+                {
+                    if (index == -1)
+                    {
+                        TestItems.Add(modal.Data);
+                        TestItemManager.SaveTestItemByProduct(SelectedProduct.Name, TestItems);
+                    }
+                    else
+                    {
+                        TestItemManager.SaveTestItemByProduct(SelectedProduct.Name, TestItems);
+                    }
+                    LoadTestItems();
+                }
+            }
+            catch (Exception ex)
+            {
+                if (isUpdate)
+                {
+                    log.Error("Edit Test Item Failed.", ex);
+                    MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.EditFailed")}: {ex.Message}");
+                }
+                else
+                {
+                    log.Error("Add Test Item Failed.", ex);
+                    MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.AddFailed")}: {ex.Message}");
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鎵归噺鍒犻櫎
+        /// </summary>
+        public void DeleteBatch()
+        {
+            try
+            {
+                if (SelectedProduct == null)
+                {
+                    ToastHelper.Warning(this, this.lang("Pm.Ti.PleaseSelectProduct"));
+                    return;
+                }
+
+                var count = TestItems.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 = TestItems.Where(d => !d.IsSelected).ToList();
+                    TestItemManager.SaveTestItemByProduct(SelectedProduct.Name, temp);
+                    LoadTestItems();
+                }
+            }
+            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(TestItemData data)
+        {
+            try
+            {
+                if (SelectedProduct == null)
+                {
+                    ToastHelper.Warning(this, this.lang("Pm.Ti.PleaseSelectProduct"));
+                    return;
+                }
+
+                if (MsgBoxHelper.WarnMessage(this, this.lang("HMI.MakeSureDeleteSingle", data.Name))
+                    == MessageBoxResult.OK)
+                {
+                    int index = TestItems.IndexOf(data);
+                    if (index < 0)
+                    {
+                        ToastHelper.Error(this, this.lang("App.ParameterException"));
+                        return;
+                    }
+                    var temp = XmlHelper.DeepClone(TestItems);
+                    temp.RemoveAt(index);
+                    TestItemManager.SaveTestItemByProduct(SelectedProduct.Name, temp);
+                    LoadTestItems();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Delete Test Item Data Failed.", ex);
+                ToastHelper.Error(this, $"{this.lang("App.DeleteFailed")}: {ex.Message}");
+                return;
+            }
+        }
+
+        /// <summary>
+        /// 瀵煎嚭鏁版嵁
+        /// </summary>
+        private void ExportData()
+        {
+            try
+            {
+                if (SelectedProduct == null)
+                {
+                    ToastHelper.Warning(this, this.lang("Pm.Ti.PleaseSelectProduct"));
+                    return;
+                }
+
+                SaveFileDialog sfd = new SaveFileDialog();
+
+                sfd.Filter = "";
+                sfd.DefaultExt = "xls";
+                sfd.FileName = $"{SelectedProduct.Name}{this.lang("Pm.Ti.Title")}";
+                if (sfd.ShowDialog() == true)
+                {
+                    string targetPath = sfd.FileName;
+                    ExcelHelper.ExportExcel(targetPath, TestItems);
+                    ToastHelper.Success(Window.GetWindow(this), this.lang("App.ExportSuccess"));
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Export Test Item Failed.", ex);
+                MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.ExportFailed")}: {ex.Message}");
+            }
+        }
+
+        private void ImportData()
+        {
+            try
+            {
+                if (SelectedProduct == null)
+                {
+                    ToastHelper.Warning(this, this.lang("Pm.Ti.PleaseSelectProduct"));
+                    return;
+                }
+
+                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<TestItemData> datas = ExcelHelper.ReadFromExcel<TestItemData>(openFileDialog.FileName);
+                    TestItemManager.SaveTestItemByProduct(SelectedProduct.Name, TestItems);
+                    LoadTestItems();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Export Test Item Failed.", ex);
+                MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("App.ExportFailed")}: {ex.Message}");
+            }
+        }
+
+        private void LoadProducts()
+        {
+            try
+            {
+                ObservableCollection<ProductData> products =
+                ProductManager.GetProducts<ObservableCollection<ProductData>>()
+                ?? new ObservableCollection<ProductData>();
+                Products = products;
+            }
+            catch (Exception ex)
+            {
+                Products = new ObservableCollection<ProductData>();
+                log.Error("Load Products Failed.", ex);
+                ToastHelper.Error(this, this.lang("App.RefreshFailed"));
+            }
+        }
+
+        private void PluginControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            LoadProducts();
+            Loaded -= PluginControl_Loaded;
+        }
+    }
+}

--
Gitblit v1.9.1