using HMI.Base; using HMI.Core.Util; using HMI.MenuManage.Entity; using HMI.MenuManage.Model; using HMI.UI.Util; using log4net; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; namespace HMI.MenuManage { /// /// UserControl1.xaml 的交互逻辑 /// public partial class MenuManage : PluginControl { #region 属性 public SqliteHelper sqliteHelper; public int DataSourceCount { get => DataSource?.Count ?? 0; } private ObservableCollection _DataSource; public ObservableCollection DataSource { get => _DataSource; set { Set(ref _DataSource, value); Set(nameof(DataSourceCount)); } } private ObservableCollection _TreeDataSource; public ObservableCollection TreeDataSource { get => _TreeDataSource; set { Set(ref _TreeDataSource, value); } } #endregion public static ILog PluginLog { get; private set; } public MenuManage() { this.DataContext = this; InitializeComponent(); if (!File.Exists(PathHelper.DatabasePath)) { SqliteHelper.CreateDatabase(PathHelper.DatabasePath); } sqliteHelper = new SqliteHelper(PathHelper.DatabasePath); sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS menu ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL, name TEXT NOT NULL, icon TEXT, iconPath TEXT, level TEXT, type TEXT, parentCode TEXT, dllPath TEXT, className TEXT, sort REAL, UNIQUE(code) );"); } public override void SetLogger(ILog logger) { base.SetLogger(logger); PluginLog = logger; } public void LoadData() { ObservableCollection data = new ObservableCollection(); ObservableCollection treeData = new ObservableCollection(); DataTable dt = sqliteHelper.GetDataTable("SELECT m1.*,m2.name AS parentName FROM menu AS m1 LEFT JOIN menu AS m2 ON m1.parentCode = m2.code Order By IIF(m1.level=1,m1.sort,m2.sort),IIF(m1.level=1,0,m1.sort),m1.id;"); Dictionary cache = new Dictionary(); if (dt != null) { foreach (DataRow dr in dt.Rows) { var menu = new MenuData { Id = dr["id"].ToString(), Code = dr["code"].ToString(), Name = dr["name"].ToString(), Icon = dr["icon"].ToString(), Level = dr["level"].ToString(), Type = dr["type"].ToString(), ParentCode = dr["parentCode"].ToString(), ParentName = dr["parentName"].ToString(), DllPath = dr["dllPath"].ToString(), ClassName = dr["className"].ToString(), Sort = dr["sort"] == DBNull.Value ? 0 : double.Parse(dr["sort"].ToString()), }; data.Add(menu); if (menu.Level == "1") { treeData.Add(menu); } cache.Add(menu.Code, menu); } foreach (var menu in data) { if (!string.IsNullOrEmpty(menu.ParentCode) && menu.ParentCode != menu.Code) { cache[menu.ParentCode].Children.Add(menu); } } } TreeDataSource = treeData; DataSource = data; } public void DeleteMenuById(string id) { string sql = $"DELETE FROM menu WHERE id = {id};"; sqliteHelper.ExecuteSql(sql); } public void DeleteMenuByIds(IEnumerable ids) { List sqls = ids.Select(id => $"DELETE FROM menu WHERE id = {id};") .ToList(); sqliteHelper.ExecuteBatchSql(sqls); } private void Button_Click(object sender, RoutedEventArgs e) { var btn = ((Button)sender); if (btn.Name == "addBtn") { try { MenuModal window = new MenuModal { Title = $"{LangUtil.Get("HMI.Menu.Add")}", sqliteHelper = sqliteHelper, Owner = Window.GetWindow(this) }; if (true == window.Open(new MenuData())) { MenuData data = window.Data; LoadData(); } } catch (Exception ex) { log.Error("Add Menu Failed.", ex); ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("App.AddFailed")}: {ex.Message}"); } } else if (btn.Name == "refreshBtn") { try { LoadData(); } catch (Exception ex) { log.Error("Refresh Menu List Failed.", ex); ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("App.RefreshFailed")}: {ex.Message}"); } } else if (btn.Name == "deleteBatchBtn") { try { List ids = DataSource.Where(x => x.Selected).Select(x => x.Id).ToList(); if (ids == null || ids.Count <= 0) { ToastHelper.Warning(Window.GetWindow(this), LangUtil.Get("HMI.NoDeleteData")); return; } var res = MsgBoxHelper.WarnMessage(Window.GetWindow(this), string.Format(LangUtil.Get("HMI.MakeSureDeletes"), ids.Count)); if (res == MessageBoxResult.OK) { DeleteMenuByIds(ids); LoadData(); } } catch (Exception ex) { log.Error("Delete Menu Batch Failed.", ex); ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("App.DeleteFailed")}: {ex.Message}"); } } else if (btn.Name == "editBtn") { try { var data = (MenuData)btn.DataContext; MenuModal window = new MenuModal { Title = $"{LangUtil.Get("HMI.Menu.Edit")}", sqliteHelper = sqliteHelper, Owner = Window.GetWindow(this) }; if (true == window.Open(data)) { var newData = window.Data; LoadData(); } } catch (Exception ex) { log.Error("Edit Menu Failed.", ex); ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("HMI.EditFailed")}: {ex.Message}"); } } else if (btn.Name == "delBtn") { try { var data = (MenuData)((Button)sender).DataContext; var res = MsgBoxHelper.WarnMessage(Window.GetWindow(this), string.Format(LangUtil.Get("HMI.MakeSureDeleteSingle"), data.Name)); if (res == MessageBoxResult.OK) { DeleteMenuById(data.Id); LoadData(); } } catch (Exception ex) { log.Error("Delete Menu Failed.", ex); ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("HMI.DeleteFailed")}: {ex.Message}"); } } } public override void DoClose(object sender, EventArgs e) { try { sqliteHelper?.Close(); } catch (Exception ex) { log.Warn("Do Close Failed.", ex); } } private void DataGrid_Loaded(object sender, RoutedEventArgs e) { LoadData(); Loaded -= DataGrid_Loaded; } private void treeViewer_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { table.SelectedItem = e.NewValue; } } }