alielie
2025-06-12 c1c3772a11b1f3fbad8846cc714120771d85fa53
HMI.MenuManage/Modal/MenuModal.xaml.cs
@@ -1,14 +1,17 @@
using System;
using System.ComponentModel;
using System.Reflection;
using System.Windows;
using Microsoft.Win32;
using Panuon.WPF.UI;
using HMI.Core.Annotation;
using HMI.Core.Entity;
using HMI.Core.Exceptions;
using HMI.Core.Annotation;
using HMI.Core.Util;
using HMI.MenuManage.Entity;
using HMI.UI.DpUtil;
using HMI.UI.Util;
using Microsoft.Win32;
using Panuon.WPF.UI;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
namespace HMI.MenuManage
{
@@ -19,6 +22,7 @@
    {
        public MenuModal()
        {
            DataContext = this;
            InitializeComponent();
        }
@@ -26,6 +30,14 @@
        public SqliteHelper sqliteHelper { get; set; }
        private bool _isProcessing;
        private ObservableCollection<MenuData> parentSource;
        public ObservableCollection<MenuData> ParentSource
        {
            get { return parentSource; }
            set { Set(ref parentSource, value); }
        }
        protected override void OnClosing(CancelEventArgs e)
        {
@@ -52,7 +64,7 @@
                }
                catch (Exception ex)
                {
                    Panuon.WPF.UI.Toast.Show(this, "Error!", ToastPosition.Top);
                    ToastHelper.Error(this, "Error!");
                    e.Cancel = true;
                    return;
                }
@@ -65,141 +77,84 @@
            base.OnClosing(e);
        }
        private bool ValidateForm()
        public bool ValidateCode(object value, out string err)
        {
            try
            err = null;
            string segment = string.IsNullOrEmpty(Data.Id) ? "" : $" AND id!='{Data.Id}'";
            string sql = $"SELECT 1 FROM menu WHERE code='{TbCode.Text}'{segment};";
            if (sqliteHelper.HasData(sql))
            {
                FormValidateException ex = new FormValidateException();
                string segment = string.IsNullOrEmpty(Data.Id) ? "" : $" AND id!='{Data.Id}'";
                string sql = $"SELECT 1 FROM menu WHERE code='{TbCode.Text}'{segment};";
                if (string.IsNullOrEmpty(TbCode.Text))
                {
                    ex.Result.Add(new FormGroupValidateResult("请输入菜单编号", FgCode));
                }
                else if (sqliteHelper.HasData(sql))
                {
                    ex.Result.Add(new FormGroupValidateResult("菜单编号不能重复", FgCode));
                }
                else
                {
                    FgCode.ValidateResult = ValidateResult.None;
                    FgCode.Message = null;
                }
                if (string.IsNullOrEmpty(TbName.Text))
                {
                    ex.Result.Add(new FormGroupValidateResult("请输入菜单名称", FgName));
                }
                else
                {
                    FgName.ValidateResult = ValidateResult.None;
                    FgName.Message = null;
                }
                if(string.IsNullOrEmpty(TbIcon.Text))
                {
                    ex.Result.Add(new FormGroupValidateResult("请选择菜单图标", FgIcon));
                }
                else
                {
                    FgIcon.ValidateResult = ValidateResult.None;
                    FgIcon.Message = null;
                }
                if (string.IsNullOrEmpty(TbLevel.Text))
                {
                    ex.Result.Add(new FormGroupValidateResult("请选择菜单级别", FgLevel));
                }
                else
                {
                    FgLevel.ValidateResult = ValidateResult.None;
                    FgLevel.Message = null;
                }
                if (TbLevel.Text == "2")
                {
                    if (string.IsNullOrEmpty(TbType.Text))
                    {
                        ex.Result.Add(new FormGroupValidateResult("请选择菜单类型", FgType));
                    }
                    else
                    {
                        FgType.ValidateResult = ValidateResult.None;
                        FgType.Message = null;
                    }
                    if (string.IsNullOrEmpty(TbParentCode.Text))
                    {
                        ex.Result.Add(new FormGroupValidateResult("请选择上级菜单", FgParentCode));
                    }
                    else
                    {
                        FgParentCode.ValidateResult = ValidateResult.None;
                        FgParentCode.Message = null;
                    }
                    if (string.IsNullOrEmpty(TbDllPath.Text))
                    {
                        ex.Result.Add(new FormGroupValidateResult("请选择Dll路径", FgDllPath));
                    }
                    else
                    {
                        FgDllPath.ValidateResult = ValidateResult.None;
                        FgDllPath.Message = null;
                    }
                    if (string.IsNullOrEmpty(TbClassName.Text))
                    {
                        ex.Result.Add(new FormGroupValidateResult("请输入类名", FgClassName));
                    }
                    else
                    {
                        FgClassName.ValidateResult = ValidateResult.None;
                        FgClassName.Message = null;
                    }
                }
                else {
                }
                if (!ex.Success) {
                    throw ex;
                }
            }
            catch (FormValidateException ex)
            {
                foreach (var data in ex.Result)
                {
                    var fg = (FormGroup)data.Sender;
                    fg.ValidateResult = ValidateResult.Error;
                    fg.Message = data.Message;
                }
                err = this.lang("App.MustBeUnique", LangUtil.Get("HMI.Menu.Code")); ;
                return false;
            }
            Data.Code = TbCode.Text;
            Data.Name = TbName.Text;
            Data.IconPath = TbIcon.Text;
            Data.Level = TbLevel.Text;
            Data.Type = TbType.Text;
            Data.ParentCode = TbParentCode.Text;
            Data.DllPath = TbDllPath.Text;
            Data.ClassName = TbClassName.Text;
            return true;
        }
        public bool ValidateName(object value, out string err)
        {
            err = null;
            string segment = string.IsNullOrEmpty(Data.Id) ? "" : $" AND id!='{Data.Id}'";
            string sql = $"SELECT 1 FROM menu WHERE name='{TbName.Text}'{segment};";
            if (sqliteHelper.HasData(sql))
            {
                err = string.Format(LangUtil.Get("App.MustBeUnique"), LangUtil.Get("HMI.Menu.Name"));
                return false;
            }
            return true;
        }
        private bool ValidateForm()
        {
            //PreValidate();
            bool flag = FormGroupHelper.ValidateForm(formPanel);
            if (flag)
            {
                Data.Code = TbCode.Text;
                Data.Name = TbName.Text;
                Data.Icon = TbIcon.Text;
                Data.Level = TbLevel.Text;
                Data.Type = TbType.Text;
                Data.ParentCode = TbParentCode.SelectedValue?.ToString();
                Data.DllPath = TbDllPath.Text;
                Data.ClassName = TbClassName.Text;
                Data.Sort = NiSort.Value;
            }
            return flag;
        }
        private void RefreshParentCode()
        {
            ObservableCollection<MenuData> datas = new ObservableCollection<MenuData>();
            string sql = $"SELECT code,name FROM menu WHERE level = 1 ORDER By id;";
            DataTable dt = sqliteHelper.GetDataTable(sql);
            if (dt != null)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    var menu = new MenuData
                    {
                        Code = dr["code"].ToString(),
                        Name = dr["name"].ToString(),
                    };
                    datas.Add(menu);
                }
            }
            ParentSource = datas;
        }
        public bool? Open(MenuData data)
        {
            RefreshParentCode();
            Data = data;
            TbCode.Text = Data.Code;
            TbName.Text = Data.Name;
            TbIcon.Text = Data.IconPath;
            TbIcon.Text = Data.Icon;
            TbLevel.SelectedValue = Data.Level;
            TbType.SelectedValue = Data.Type;
            TbParentCode.Text = Data.ParentCode;
            TbParentCode.SelectedValue = Data.ParentCode;
            TbDllPath.Text = Data.DllPath;
            TbClassName.Text = Data.ClassName;
            NiSort.Value = Data.Sort;
            return this.ShowDialog();
        }
@@ -217,45 +172,53 @@
        public void InsertMenu(MenuData data)
        {
            string sql = $@"INSERT INTO menu (code,name,iconPath,level,type,parentCode,dllPath,className)
            string sql = $@"INSERT INTO menu (code,name,icon,level,type,parentCode,dllPath,className,sort)
                VALUES
                ('{data.Code}','{data.Name}','{data.IconPath}','{data.Level}','{data.Type}','{data.ParentCode}',
                '{data.DllPath}','{data.ClassName}');";
                ('{data.Code}','{data.Name}','{data.Icon}','{data.Level}','{data.Type}','{data.ParentCode}',
                '{data.DllPath}','{data.ClassName}',{data.Sort});";
            sqliteHelper.ExecuteSql(sql);
        }
        public void UpdateMenu(MenuData data)
        {
            string sql = $@"UPDATE menu SET code='{data.Code}',name='{data.Name}',
iconPath='{data.IconPath}',level='{data.Level}',type='{data.Type}',parentCode='{data.ParentCode}',
dllPath='{data.DllPath}',className='{data.ClassName}' WHERE id='{data.Id}';";
icon='{data.Icon}',level='{data.Level}',type='{data.Type}',parentCode='{data.ParentCode}',
dllPath='{data.DllPath}',className='{data.ClassName}',sort={data.Sort} WHERE id='{data.Id}';";
            sqliteHelper.ExecuteSql(sql);
        }
        private void IconSelect_Click(object sender, RoutedEventArgs e)
        {
            string BasePath = PathHelper.IconFolder;
            //string BasePath = PathHelper.IconFolder;
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "(*.*)|*.*";
            openFileDialog.InitialDirectory = BasePath;
            openFileDialog.Title = "选择图片";
            openFileDialog.Multiselect = false;
            //OpenFileDialog openFileDialog = new OpenFileDialog();
            //openFileDialog.Filter = "(*.*)|*.*";
            //openFileDialog.InitialDirectory = BasePath;
            //openFileDialog.Title = "选择图片";
            //openFileDialog.Multiselect = false;
            if (openFileDialog.ShowDialog() == true)
            //if (openFileDialog.ShowDialog() == true)
            //{
            //    string FileName = openFileDialog.FileName;
            //    if (!FileName.StartsWith(BasePath))
            //    {
            //       (this, "请将图标移动至程序Icon目录下!", ToastPosition.Top);
            //    }
            //    else
            //    {
            //        TbIcon.Text = FileName.Replace(BasePath, ".");
            //    }
            //}
            IconSelector selector = new IconSelector
            {
                string FileName = openFileDialog.FileName;
                if (!FileName.StartsWith(BasePath))
                {
                    Panuon.WPF.UI.Toast.Show(this, "请将图标移动至程序Icon目录下!", ToastPosition.Top);
                }
                else
                {
                    TbIcon.Text = FileName.Replace(BasePath, ".");
                }
                Title = LangUtil.Get("App.SelectIcon"),
                Owner = this
            };
            if (selector.Open(Data.Icon) == true)
            {
                TbIcon.Text = selector.Data;
            }
        }
        private void DllSelect_Click(object sender, RoutedEventArgs e)
@@ -265,7 +228,7 @@
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "(*.dll)|*.dll";
            openFileDialog.InitialDirectory = pluginPath;
            openFileDialog.Title = "选择文件";
            openFileDialog.Title = LangUtil.Get("App.SelectFile");
            openFileDialog.Multiselect = false;
            if (openFileDialog.ShowDialog() == true)
@@ -273,7 +236,7 @@
                string FileName = openFileDialog.FileName;
                if (!FileName.StartsWith(pluginPath))
                {
                    Panuon.WPF.UI.Toast.Show(this, "请将插件移动至程序Plugin目录下!", ToastPosition.Top);
                    ToastHelper.Warning(this, LangUtil.Get("App.Msg.PluginMustInPluginFolder"));
                }
                else
                {
@@ -294,5 +257,14 @@
                }
            }
        }
        private void TbLevel_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            bool flag = (((ComboBoxItem)e.AddedItems[0])?.Content?.ToString() == "2");
            FormGroupHelper.SetIsRequired(FgType, flag);
            FormGroupHelper.SetIsRequired(FgParentCode, flag);
            FormGroupHelper.SetIsRequired(FgDllPath, flag);
            FormGroupHelper.SetIsRequired(FgClassName, flag);
        }
    }
}