#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
|
{
|
/// <summary>
|
/// 系统菜单数据管理类
|
/// </summary>
|
public class bllMenu : bllBaseDataDict
|
{
|
private int _LastDeleted; //删除的自定义功能数
|
private int _LastInsertCustomAction; //导入的自定义功能数
|
private int _LastInserted; //最后一次导入菜单数
|
private int _LastUpdated; //最后一次导入菜单更新的记录数
|
|
/// <summary>
|
/// 导入菜单时,旧的菜单数据,用于与菜单.tag匹配
|
/// </summary>
|
private DataTable _MenuDataOld;
|
|
public bllMenu()
|
{
|
_KeyFieldName = tb_MyMenu.__KeyName;
|
_SummaryTableName = tb_MyMenu.__TableName;
|
_DataDictBridge =
|
BridgeFactory.CreateDataDictBridge(typeof(tb_MyMenu));
|
}
|
|
public int LastDeleted => _LastDeleted;
|
|
/// <summary>
|
/// 最后一次导入的自定义功能数
|
/// </summary>
|
public int LastInsertCustomAction => _LastInsertCustomAction;
|
|
/// <summary>
|
/// 最后一次导入菜单数
|
/// </summary>
|
public int LastInserted => _LastInserted;
|
|
/// <summary>
|
/// 最后一次导入菜单更新的记录数
|
/// </summary>
|
public int LastUpdated => _LastUpdated;
|
|
/// <summary>
|
/// 新增菜单或更新菜单标题
|
/// </summary>
|
/// <param name="item">菜单项</param>
|
/// <param name="dtSave">菜单资料表</param>
|
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++;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 导入菜单数据
|
/// </summary>
|
/// <param name="mainMenu">主菜单</param>
|
/// <param name="menuData">当前数据库存在的菜单数据</param>
|
/// <param name="actionNameData">当前数据库存在的菜单功能点名称</param>
|
/// <returns></returns>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 剃归导入子菜单
|
/// </summary>
|
/// <param name="parent">父级菜单</param>
|
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;
|
}
|
|
/// <summary>
|
/// 保存数据
|
/// </summary>
|
/// <param name="updateType">操作类型</param>
|
/// <returns></returns>
|
public override bool Update()
|
{
|
var data = new DataSet();
|
data.Tables.Add(_SummaryTable.Copy());
|
return _DataDictBridge.Update(data);
|
}
|
|
/// <summary>
|
/// 保存菜单及功能点名称资料表
|
/// </summary>
|
/// <param name="dtMenu">菜单资料表</param>
|
/// <param name="dtActionCustomName">功能点名称资料表</param>
|
/// <returns></returns>
|
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;
|
}
|
}
|
}
|