| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel; |
| | | using System.Linq; |
| | | using System.Runtime.CompilerServices; |
| | | using System.Windows; |
| | | using System.Windows.Controls; |
| | | using HMI.Base; |
| | | 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 |
| | | { |
| | |
| | | public partial class MenuManage : PluginControl |
| | | { |
| | | #region 属性 |
| | | private MenuManageModel Model; |
| | | public SqliteHelper sqliteHelper; |
| | | |
| | | public int DataSourceCount { get => DataSource?.Count ?? 0; } |
| | | |
| | | private ObservableCollection<MenuData> _DataSource; |
| | | |
| | | public ObservableCollection<MenuData> DataSource |
| | | { |
| | | get => _DataSource; |
| | | set |
| | | { |
| | | Set(ref _DataSource, value); |
| | | Set(nameof(DataSourceCount)); |
| | | } |
| | | } |
| | | |
| | | private ObservableCollection<MenuData> _TreeDataSource; |
| | | |
| | | public ObservableCollection<MenuData> TreeDataSource |
| | | { |
| | | get => _TreeDataSource; |
| | | set { Set(ref _TreeDataSource, value); } |
| | | } |
| | | #endregion |
| | | |
| | | public static ILog PluginLog { get; private set; } |
| | | |
| | | public MenuManage() |
| | | { |
| | | Model = new MenuManageModel(); |
| | | this.DataContext = Model; |
| | | 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) |
| | | );"); |
| | | } |
| | | |
| | | #region 属性 |
| | | public override void SetLogger(ILog logger) |
| | | { |
| | | base.SetLogger(logger); |
| | | PluginLog = logger; |
| | | } |
| | | |
| | | #endregion |
| | | public void LoadData() |
| | | { |
| | | ObservableCollection<MenuData> data = new ObservableCollection<MenuData>(); |
| | | ObservableCollection<MenuData> treeData = new ObservableCollection<MenuData>(); |
| | | 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<string, MenuData> cache = new Dictionary<string, MenuData>(); |
| | | 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); |
| | | } |
| | | |
| | | private void Button_Click(object sender, System.Windows.RoutedEventArgs e) |
| | | 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<string> ids) |
| | | { |
| | | List<string> 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") |
| | |
| | | { |
| | | MenuModal window = new MenuModal |
| | | { |
| | | Title = "新增菜单", |
| | | sqliteHelper = Model.sqliteHelper, |
| | | Title = $"{LangUtil.Get("HMI.Menu.Add")}", |
| | | sqliteHelper = sqliteHelper, |
| | | Owner = Window.GetWindow(this) |
| | | }; |
| | | if (true == window.Open(new MenuData())) |
| | | { |
| | | MenuData data = window.Data; |
| | | Model.LoadData(); |
| | | LoadData(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Add Menu Failed.", ex); |
| | | ToastHelper.Error(Window.GetWindow(this), $"新增失败!{ex.Message}"); |
| | | ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("App.AddFailed")}: {ex.Message}"); |
| | | } |
| | | } |
| | | else if (btn.Name == "refreshBtn") |
| | | { |
| | | try |
| | | { |
| | | Model.LoadData(); |
| | | LoadData(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Refresh Menu List Failed.", ex); |
| | | ToastHelper.Error(Window.GetWindow(this), $"刷新失败!{ex.Message}"); |
| | | ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("App.RefreshFailed")}: {ex.Message}"); |
| | | } |
| | | } |
| | | else if (btn.Name == "deleteBatchBtn") |
| | | { |
| | | try |
| | | { |
| | | List<string> ids = Model.DataSource.Where(x => x.Selected).Select(x => x.Id).ToList(); |
| | | List<string> ids = DataSource.Where(x => x.Selected).Select(x => x.Id).ToList(); |
| | | if (ids == null || ids.Count <= 0) |
| | | { |
| | | ToastHelper.Warning(Window.GetWindow(this), "请选择要删除的菜单!"); |
| | | ToastHelper.Warning(Window.GetWindow(this), LangUtil.Get("HMI.NoDeleteData")); |
| | | return; |
| | | } |
| | | |
| | | var res = MsgBoxHelper.WarnMessage(Window.GetWindow(this), |
| | | $"确定删除选中的[{ids.Count}]条菜单吗?该操作不可逆!"); |
| | | string.Format(LangUtil.Get("HMI.MakeSureDeletes"), ids.Count)); |
| | | if (res == MessageBoxResult.OK) |
| | | { |
| | | Model.DeleteMenuByIds(ids); |
| | | Model.LoadData(); |
| | | DeleteMenuByIds(ids); |
| | | LoadData(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Delete Menu Batch Failed.", ex); |
| | | ToastHelper.Error(Window.GetWindow(this), $"删除失败!{ex.Message}"); |
| | | ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("App.DeleteFailed")}: {ex.Message}"); |
| | | } |
| | | } |
| | | else if (btn.Name == "editBtn") |
| | |
| | | var data = (MenuData)btn.DataContext; |
| | | MenuModal window = new MenuModal |
| | | { |
| | | Title = "编辑菜单", |
| | | sqliteHelper = Model.sqliteHelper, |
| | | Title = $"{LangUtil.Get("HMI.Menu.Edit")}", |
| | | sqliteHelper = sqliteHelper, |
| | | Owner = Window.GetWindow(this) |
| | | }; |
| | | if (true == window.Open(data)) |
| | | { |
| | | var newData = window.Data; |
| | | Model.LoadData(); |
| | | LoadData(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Edit Menu Failed.", ex); |
| | | ToastHelper.Error(Window.GetWindow(this), $"编辑失败!{ex.Message}"); |
| | | ToastHelper.Error(Window.GetWindow(this), $"{LangUtil.Get("HMI.EditFailed")}: {ex.Message}"); |
| | | } |
| | | } |
| | | else if (btn.Name == "delBtn") |
| | |
| | | { |
| | | var data = (MenuData)((Button)sender).DataContext; |
| | | var res = MsgBoxHelper.WarnMessage(Window.GetWindow(this), |
| | | $"确定删除菜单[{data.Name}]吗?该操作不可逆!"); |
| | | string.Format(LangUtil.Get("HMI.MakeSureDeleteSingle"), data.Name)); |
| | | if (res == MessageBoxResult.OK) |
| | | { |
| | | Model.DeleteMenuById(data.Id); |
| | | Model.LoadData(); |
| | | DeleteMenuById(data.Id); |
| | | LoadData(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Delete Menu Failed.", ex); |
| | | ToastHelper.Error(Window.GetWindow(this), $"删除失败!{ex.Message}"); |
| | | 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) |
| | | { |
| | | Model.LoadData(); |
| | | LoadData(); |
| | | Loaded -= DataGrid_Loaded; |
| | | } |
| | | |