#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;
}
}
}