#region using System; using System.Data; using System.Windows.Forms; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Models; #endregion namespace CSFrameworkV5.Business.BLL_Permission { /// /// 系统菜单数据管理类 /// public class bllMenu : bllBaseDataDict { private int _LastDeleted; //删除的自定义功能数 private int _LastInsertCustomAction; //导入的自定义功能数 private int _LastInserted; //最后一次导入菜单数 private int _LastUpdated; //最后一次导入菜单更新的记录数 /// /// 导入菜单时,旧的菜单数据,用于与菜单.tag匹配 /// private DataTable _MenuDataOld; public bllMenu() { _KeyFieldName = tb_MyMenu.__KeyName; _SummaryTableName = tb_MyMenu.__TableName; _DataDictBridge = BridgeFactory.CreateDataDictBridge(typeof(tb_MyMenu)); } public int LastDeleted => _LastDeleted; /// /// 最后一次导入的自定义功能数 /// public int LastInsertCustomAction => _LastInsertCustomAction; /// /// 最后一次导入菜单数 /// public int LastInserted => _LastInserted; /// /// 最后一次导入菜单更新的记录数 /// public int LastUpdated => _LastUpdated; /// /// 新增菜单或更新菜单标题 /// /// 菜单项 /// 菜单资料表 private void AddOrUpdateMenu(ToolStripItem item, DataTable dtSave, DataTable actionNameData) { var tag = item.Tag as MenuItemTag; //不存在此菜单则导入菜单,若存在匹配或更新菜单标题等数据 if (!MatchOrUpdateMenu(item, dtSave)) { var append = dtSave.NewRow(); append[tb_MyMenu.DataSetID] = Loginer.CurrentUser.DBID; append[tb_MyMenu.RowID] = Globals.NewRowID(); //GUID32,去掉"-"分隔符 append[tb_MyMenu.ModuleID] = tag.ModuleID; append[tb_MyMenu.Actions] = tag.FormAuthorities; append[tb_MyMenu.MenuCaption] = item.Text; append[tb_MyMenu.MenuName] = item.Name; append[tb_MyMenu.ParentMenuName] = item.OwnerItem != null ? item.OwnerItem.Name : ""; append[tb_MyMenu.MenuType] = tag.MenuType.ToStringEx(); dtSave.Rows.Add(append); _LastInserted++; } string filter; var action = 0; string name; DataRow[] rs; //导入菜单的自定义名称 if (tag.ActionNames != null && tag.ActionNames.Count > 0) foreach (var key in tag.ActionNames.Keys) { action = ConvertEx.ToInt(key); name = tag.ActionNames[key].ToStringEx(); filter = "DataSetID='{0}' AND MenuName='{1}' AND TagValue={2}"; filter = string.Format(filter, Loginer.CurrentUser.DBID, item.Name, action); rs = actionNameData.Select(filter); //不存在,新增 if (rs.Length == 0) { //新增功能点自定义名称 var actionName = actionNameData.NewRow(); actionName[tb_MyFormTagName.DataSetID] = Loginer.CurrentUser.DBID; actionName[tb_MyFormTagName.MenuName] = item.Name; actionName[tb_MyFormTagName.TagValue] = action; actionName[tb_MyFormTagName.TagName] = name; actionNameData.Rows.Add(actionName); _LastInsertCustomAction++; } else { //更新功能点自定义名称 var actionName = rs[0]; if (ConvertEx.ToString( actionName[tb_MyFormTagName.TagName]) != name) { actionName[tb_MyFormTagName.DataSetID] = Loginer.CurrentUser.DBID; actionName[tb_MyFormTagName.MenuName] = item.Name; actionName[tb_MyFormTagName.TagValue] = action; actionName[tb_MyFormTagName.TagName] = name; } } } ////删除不存在的自定义名称 //filter = "DataSetID='{0}' AND MenuName='{1}'"; //filter = string.Format(filter, Loginer.CurrentUser.DBID, item.Name); //rs = actionNameData.Select(filter); //foreach (DataRow R in rs) //{ // action = ConvertEx.ToInt(R[tb_MyFormTagName.TagValue]); // name = ConvertEx.ToString(R[tb_MyFormTagName.TagName]); // if (!tag.ActionNames.ContainsKey(action)) R.Delete();//删除标记 //} //删除不存在的自定义名称 filter = $"DataSetID='{Loginer.CurrentUser.DBID}' AND MenuName='{item.Name}'"; rs = actionNameData.Select(filter); foreach (var R in rs) { action = ConvertEx.ToInt(R[tb_MyFormTagName.TagValue]); name = ConvertEx.ToString(R[tb_MyFormTagName.TagName]); if (!tag.ActionNames.ContainsKey(action)) { R.Delete(); //删除标记 _LastInsertCustomAction++; } } } /// /// 导入菜单数据 /// /// 主菜单 /// 当前数据库存在的菜单数据 /// 当前数据库存在的菜单功能点名称 /// public bool ImportMenu(MenuStrip mainMenu, DataTable menuData, DataTable actionNameData) { try { _MenuDataOld = menuData.Copy(); _MenuDataOld.AcceptChanges(); _LastInserted = 0; _LastUpdated = 0; _LastDeleted = 0; _LastInsertCustomAction = 0; var dtSave = menuData.Clone(); //递归枚举菜单,新增或更新菜单 foreach (ToolStripItem item in mainMenu.Items) { if (item is ToolStripSeparator) continue; //菜单分隔符不处理 if (ConvertEx.ToString(item.Tag).ToUpper() == "IsSystemMenu".ToUpper()) continue; //系统菜单不处理 if (item.Tag != null && item.Tag is MenuItemTag) AddOrUpdateMenu(item, dtSave, actionNameData); if (item is ToolStripMenuItem && (item as ToolStripMenuItem).DropDownItems.Count > 0) ImportMenuChild(item as ToolStripMenuItem, dtSave, actionNameData); } //获取程序中已删除的菜单定义 MatchDeletedMenu(dtSave); //采集数据 var ds = new DataSet(); if (dtSave.Rows.Count > 0) ds.Tables.Add(dtSave); //菜单数据 //用户自定义的功能点名称数据 var actionName = actionNameData.GetChanges(); if (actionName != null) ds.Tables.Add(actionName); if (ds.Tables.Count > 0) //保存数据 return _DataDictBridge.Update(ds); return true; } catch (Exception ex) { Msg.ShowException(ex); return false; } } /// /// 剃归导入子菜单 /// /// 父级菜单 private void ImportMenuChild(ToolStripMenuItem parent, DataTable dtSave, DataTable actionNameData) { foreach (ToolStripItem item in parent.DropDownItems) { if (item is ToolStripSeparator) continue; //不导入分隔符 if (item.Tag != null && item.Tag is MenuItemTag) AddOrUpdateMenu(item, dtSave, actionNameData); //新增菜单或更新菜单标题 //剃归导入子菜单 if (item is ToolStripMenuItem && (item as ToolStripMenuItem).DropDownItems.Count > 0) ImportMenuChild(item as ToolStripMenuItem, dtSave, actionNameData); } } private void MatchDeletedMenu(DataTable dtSave) { var rs = _MenuDataOld.Select(tb_MyMenu.MenuName + "<>'Matched'"); foreach (var T in rs) { var R = dtSave.NewRow(); R.ItemArray = T.ItemArray; dtSave.Rows.Add(R); R.AcceptChanges(); R.Delete(); //设置为删除状态 _LastDeleted++; } } private bool MatchOrUpdateMenu(ToolStripItem item, DataTable dtSave) { var tag = item.Tag as MenuItemTag; var filter = "DataSetID='{0}' AND MenuName='{1}' AND ParentMenuName='{2}'"; filter = string.Format(filter, Loginer.CurrentUser.DBID, item.Name, item.OwnerItem != null ? item.OwnerItem.Name : ""); var rsOld = _MenuDataOld.Select(filter); if (rsOld.Length == 0) return false; //不存在,退出 //若菜单表存在当前菜单,检查菜单标题和权限数值,或有不同则更新数据 if (ConvertEx.ToString(rsOld[0][tb_MyMenu.MenuCaption]) != item.Text || ConvertEx.ToInt(rsOld[0][tb_MyMenu.Actions]) != tag.FormAuthorities) { var R = dtSave.NewRow(); R.ItemArray = rsOld[0].ItemArray; R[tb_MyMenu.MenuCaption] = item.Text; R[tb_MyMenu.Actions] = tag.FormAuthorities; dtSave.Rows.Add(R); R.AcceptChanges(); R.SetModified(); //设置为修改状态 _LastUpdated++; } rsOld[0][tb_MyMenu.MenuName] = "Matched"; //设置为已匹配的菜单项,若未匹配的视为程序中已删除菜单定义 return true; } /// /// 保存数据 /// /// 操作类型 /// public override bool Update() { var data = new DataSet(); data.Tables.Add(_SummaryTable.Copy()); return _DataDictBridge.Update(data); } /// /// 保存菜单及功能点名称资料表 /// /// 菜单资料表 /// 功能点名称资料表 /// public bool Update(DataTable dtMenu, DataTable dtActionCustomName) { var data = new DataSet(); if (dtMenu != null) data.Tables.Add(dtMenu.Copy()); if (dtActionCustomName != null) data.Tables.Add(dtActionCustomName.Copy()); var success = _DataDictBridge.Update(data); return success; } } }