#region
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using CSFrameworkV5.Business.BLL_Permission;
using CSFrameworkV5.CodeGeneratorCore;
using CSFrameworkV5.Core;
using CSFrameworkV5.Interfaces;
using CSFrameworkV5.Library.CommonClass;
using CSFrameworkV5.Library.UIForm;
using CSFrameworkV5.Models;
using DevExpress.Utils;
using DevExpress.XtraEditors.ViewInfo;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Nodes;
using tb_MyGroupUser = CSFrameworkV5.Models.tb_MyGroupUser;
#endregion
namespace CSFrameworkV5.Library.PermissionForms
{
public partial class frmGroupOrganization : frmBaseChild
{
private DataTable _AllUsers;
private bllGroup _bllGroup;
private DataTable _CurrentConfig;
private DataTable _Groups;
private DataTable _GroupUsers;
private NodeModel _tmp;
public frmGroupOrganization()
{
InitializeComponent();
}
private void AfterSetOwner(TreeListNode node, string ownerType)
{
if (ownerType.ToUpper() == "OWNER1")
{
node.ImageIndex = 3;
node.SelectImageIndex = 3;
}
if (ownerType.ToUpper() == "OWNER2")
{
node.ImageIndex = 4;
node.SelectImageIndex = 4;
}
//刷新数据源
_GroupUsers = _bllGroup.GetGroupUsers4TreeList();
_Groups = _bllGroup.GetLookupData();
var g = tlGroup4User.FocusedNode.ParentNode.Tag as NodeModel; //组
g.Tag = _Groups.Select($"GroupCode='{g.DataID}'")[0]; //刷新组节点的Tag
}
private void AssertFocusedNode()
{
if (tlGroup4User.FocusedNode == null)
throw new Exception("请选择一个树节点!");
}
private void btnClose_Click(object sender, EventArgs e)
{
Close();
}
private void btnConfig1_Click(object sender, EventArgs e)
{
DoConfig();
}
private void btnFind_Click(object sender, EventArgs e)
{
if (_CurrentConfig == null) return;
if (txtContent.Text != "")
{
var filter =
$" DBName LIKE '%{txtContent.Text}%' OR TableName LIKE '%{txtContent.Text}%' ";
_CurrentConfig.DefaultView.RowFilter = filter;
var dt = _CurrentConfig.DefaultView.ToTable();
gcMain.DataSource = dt;
}
}
private void btnSave_Click(object sender, EventArgs e)
{
}
private void btnViewDataConfig_Click(object sender, EventArgs e)
{
DoShowConfig();
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
var isUserNode = tlGroup4User.FocusedNode != null &&
(tlGroup4User.FocusedNode.Tag as NodeModel).Type
.ToUpper() == "USER";
var isGroupNode = tlGroup4User.FocusedNode != null &&
(tlGroup4User.FocusedNode.Tag as NodeModel).Type
.ToUpper() == "GROUP";
编辑节点ToolStripMenuItem.Enabled = isUserNode;
删除员工ToolStripMenuItem.Enabled = isUserNode;
添加员ToolStripMenuItem.Enabled = isGroupNode;
全部展开ToolStripMenuItem.Enabled = isGroupNode;
全部收缩ToolStripMenuItem.Enabled = isGroupNode;
添加组织架构ToolStripMenuItem.Enabled = isGroupNode;
删除组织架构ToolStripMenuItem.Enabled = isGroupNode;
修改组织架构ToolStripMenuItem.Enabled = isGroupNode;
}
private void DoConfig()
{
AssertFocusedNode();
var m = (NodeModel)tlGroup4User.FocusedNode.Tag;
frmGroupOrganization_DataRightsConfig.Execute(m);
}
private void DoShowConfig()
{
AssertFocusedNode();
var m = (NodeModel)tlGroup4User.FocusedNode.Tag;
LoadConfig(m);
xtraTabControl1.SelectedTabPage = xtraTabPage3;
}
///
/// 重新定位树节点
///
///
private void ExpandNodeByTag(string rowID)
{
var node = FindNode(rowID);
if (node != null)
{
tlGroup4User.FocusedNode = node;
node.Expand();
}
}
private TreeListNode FindNode(string rowID)
{
var nodes =
tlGroup4User.FindNodes(e =>
(e.Tag as NodeModel).RowID == rowID);
if (nodes.Length > 0) return nodes[0];
return null;
}
private void frmGroupOrganization_Load(object sender, EventArgs e)
{
_bllGroup = new bllGroup();
InitButtons();
InitTree();
if (tlGroup4User.Nodes.Count > 0) tlGroup4User.Nodes[0].Expand();
xtraTabControl1.ShowTabHeader = DefaultBoolean.False;
DevStyle.SetSummaryGridViewLayout(gvMain); //表格设置
}
private void GetNodeCount(TreeListNode node, out int groups,
out int users)
{
groups = 0;
users = 0;
foreach (TreeListNode n in node.Nodes)
{
_tmp = n.Tag as NodeModel;
if (_tmp.Type.ToUpper() == "GROUP") groups++;
if (_tmp.Type.ToUpper() == "USER") users++;
}
}
private string GetUserName(string account)
{
if (string.IsNullOrWhiteSpace(account)) return "";
var rs = _AllUsers.Select($"Account='{account}'");
if (rs.Length > 0) return rs[0][tb_MyUser.UserName].ToStringEx();
return "";
}
private void gvMain_DoubleClick(object sender, EventArgs e)
{
if (gvMain.FocusedRowHandle >= 0)
{
var R = gvMain.GetFocusedDataRow();
var m = new NodeModel
{
DataID = R[sys_DataPermission.DataID].ToStringEx(),
Type = R[sys_DataPermission.DataType].ToStringEx(),
Text = R[sys_DataPermission.DataID].ToStringEx()
};
frmGroupOrganization_DataRightsConfig.Execute(m);
}
}
//加载当前节点的数据权限配置
private void LoadConfig(NodeModel m)
{
if (m.Type.ToUpper() == "USER")
_CurrentConfig =
new bllPermission().GetDataPermissionConfigByUser(m.DataID);
if (m.Type.ToUpper() == "GROUP")
_CurrentConfig =
new bllPermission()
.GetDataPermissionConfigByGroup(m.DataID);
gcMain.DataSource = _CurrentConfig;
gcMain.RefreshDataSource();
}
private void tlGroup4User_FocusedNodeChanged(object sender,
FocusedNodeChangedEventArgs e)
{
if (e.Node == null || e.Node.Tag == null) return;
var m = e.Node.Tag as NodeModel;
if (m.Type.ToUpper() == "GROUP")
{
xtraTabControl1.SelectedTabPage = xtraTabPage1;
var users = 0;
var groups = 0;
GetNodeCount(e.Node, out groups, out users);
lblGroup_Users.Text = users.ToStringEx();
lblGroup_Childs.Text = groups.ToStringEx();
lblGroup_Code.Text = m.DataID;
lblGroup_Name.Text = m.Text;
lblGroup_Owner1.Text =
GetUserName(
ConvertEx.ToString((m.Tag as DataRow)["Owner1"]));
lblGroup_Owner2.Text =
GetUserName(
ConvertEx.ToString((m.Tag as DataRow)["Owner2"]));
}
if (m.Type.ToUpper() == "USER")
{
xtraTabControl1.SelectedTabPage = xtraTabPage2;
lblUser_ID.Text = m.DataID;
lblUser_Name.Text = m.Text;
if (e.Node.ImageIndex == 3) lblUser_Owner.Text = "主管/经理";
if (e.Node.ImageIndex == 4) lblUser_Owner.Text = "副主管/副经理";
}
}
private void toolTipController1_GetActiveObjectInfo(object sender,
ToolTipControllerGetActiveObjectInfoEventArgs e)
{
tlGroup4User.CustomNodeTooltip(e, node =>
{
toolTipController1.ImageIndex = node.ImageIndex;
var m = node.Tag as NodeModel;
if (m.Type.ToUpper() == "GROUP")
return $"部门编号:{m.DataID}\r\n部门名称:{m.Text}";
if (m.Type.ToUpper() == "USER")
return $"员工编号:{m.DataID}\r\n员工姓名:{m.Text}\r\n职位:{m.Tag1}";
return "";
});
}
private void 编辑节点ToolStripMenuItem_Click(object sender, EventArgs e)
{
//设置部门主管,经理
AssertFocusedNode();
var m = tlGroup4User.FocusedNode.Tag as NodeModel; //用户
var g = tlGroup4User.FocusedNode.ParentNode.Tag as NodeModel; //组
var owner1 = ConvertEx.ToString((g.Tag as DataRow)["Owner1"]);
var owner2 = ConvertEx.ToString((g.Tag as DataRow)["Owner2"]);
var p = new SetOwnerParam
{
GroupCode = g.DataID,
GroupName = g.Text,
Account = m.DataID,
AccountName = m.Text,
Owner1 = owner1,
Owner2 = owner2,
Owner1Name = GetUserName(owner1),
Owner2Name = GetUserName(owner2)
};
frmGroupOrganization_SetOwner.Execute(p,
ownerType =>
{
AfterSetOwner(tlGroup4User.FocusedNode, ownerType);
});
}
private void 配置数据权限ToolStripMenuItem_Click(object sender, EventArgs e)
{
DoConfig();
}
private void 配置数据权限ToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (gvMain.FocusedRowHandle >= 0)
gvMain_DoubleClick(gvMain, new EventArgs());
else
DoConfig();
}
private void 批量设置员工所在部门ToolStripMenuItem_Click(object sender,
EventArgs e)
{
var isSave = frmGroupLevel.ExecuteOrgUser();
if (isSave) InitTree();
}
private void 全部收缩ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (tlGroup4User.FocusedNode != null)
tlGroup4User.FocusedNode.Collapse();
else
tlGroup4User.CollapseAll();
}
private void 全部展开ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (tlGroup4User.FocusedNode != null)
tlGroup4User.FocusedNode.ExpandAll();
else
tlGroup4User.ExpandAll();
}
private void 删除员工ToolStripMenuItem_Click(object sender, EventArgs e)
{
AssertFocusedNode();
var m = tlGroup4User.FocusedNode.Tag as NodeModel;
if (!MsgEx.ShowQuestion($"确定要移除【{m.Text}】吗?")) return;
if (m.Type.ToUpper() == "USER")
{
var group = (m.Tag as DataRow)[tb_MyGroupUser.GroupCode]
.ToStringEx();
var user = (m.Tag as DataRow)[tb_MyGroupUser.Account]
.ToStringEx();
if (_bllGroup.DeleteGroupUser(group, user))
{
//删除当前节点
tlGroup4User.FocusedNode.ParentNode.Nodes.Remove(
tlGroup4User.FocusedNode);
//刷新数据源
_GroupUsers = _bllGroup.GetGroupUsers4TreeList();
}
}
}
private void 删除组织架构ToolStripMenuItem_Click(object sender, EventArgs e)
{
AssertFocusedNode();
var users = 0;
var groups = 0;
GetNodeCount(tlGroup4User.FocusedNode, out groups, out users);
if (groups > 0)
{
MsgEx.ShowWaring("存在子级组织架构,不可删除!");
return;
}
var m = (NodeModel)tlGroup4User.FocusedNode.Tag;
if (MsgEx.ShowQuestion($"确定要删除组织架构【{m.Text}】吗?"))
//删除数据
if (_bllGroup.DeleteGroupData(m.DataID))
{
//删除节点
if (tlGroup4User.FocusedNode.ParentNode != null)
tlGroup4User.FocusedNode.ParentNode.Nodes.Remove(
tlGroup4User.FocusedNode);
else
tlGroup4User.Nodes.Remove(tlGroup4User.FocusedNode);
//刷新数据
_Groups = _bllGroup.GetLookupData();
}
}
private void 刷新ToolStripMenuItem_Click(object sender, EventArgs e)
{
InitTree();
}
private void 添加员ToolStripMenuItem_Click(object sender, EventArgs e)
{
AssertFocusedNode();
var m = tlGroup4User.FocusedNode.Tag as NodeModel;
#region 回调内置函数
Action> action =
delegate(List result)
{
var data = new List();
//将AccountModel对象转换为tb_MyGroupUser实体对象
foreach (var user in result)
{
var o = new Interfaces.tb_MyGroupUser
{
Account = user.Account,
DataSetID = Loginer.CurrentUser.DBID,
GroupCode = m.DataID
};
data.Add(o);
}
var i = _bllGroup.Add(data);
if (i > 0)
{
InitTree();
ExpandNodeByTag(m.RowID);
}
MsgEx.ShowInformation($"成功添加{i}个用户.");
};
#endregion;
frmGroupOrganization_UserPicker.Execute(action, m.DataID, m.Text);
}
private void 添加组织架构ToolStripMenuItem_Click(object sender, EventArgs e)
{
//
}
private void 添加组织架构ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
var rowID = "";
var addOK = frmGroupOrganization_Editor.Execute(ref rowID);
if (addOK)
{
InitTree();
var node = FindNode(rowID);
if (node != null)
{
if (node.ParentNode != null) node.ParentNode.Expand();
tlGroup4User.FocusedNode = node;
}
}
}
private void 显示数据权限ToolStripMenuItem_Click(object sender, EventArgs e)
{
DoShowConfig();
}
private void 修改组织架构ToolStripMenuItem_Click(object sender, EventArgs e)
{
AssertFocusedNode();
var m = (NodeModel)tlGroup4User.FocusedNode.Tag;
var rowID = m.RowID;
var editOK = frmGroupOrganization_Editor.Execute(ref rowID);
if (editOK)
{
InitTree();
var node = FindNode(rowID);
if (node != null)
{
if (node.ParentNode != null) node.ParentNode.Expand();
tlGroup4User.FocusedNode = node;
}
}
}
#region 递归生成菜单树
///
/// 生成顶级菜单的树结点
///
public virtual void InitTree(string rootValue = "")
{
//获取用户组(部门)列表
_Groups = _bllGroup.GetLookupData();
_GroupUsers = _bllGroup.GetGroupUsers4TreeList();
_AllUsers = new bllUser().GetLookupData();
var tree = tlGroup4User;
tree.OptionsView.ShowCheckBoxes = false;
tree.StateImageList = null;
tree.SelectImageList = imageList1;
tree.TreeLineStyle = LineStyle.Percent50;
tree.OptionsView.ShowVertLines = true;
tree.OptionsView.ShowHorzLines = false;
try
{
tree.BeginUpdate();
tree.Nodes.Clear();
//根结点记录
var rows = GetRows(_Groups, rootValue);
DataRow[] childs;
string pValue; //parentValue;
string kValue; //key value
var root = new TreeListNode();
//循环根节点,集团顶级部门
foreach (var row in rows)
{
pValue = row[tb_MyGroup.ParentGroupCode].ToStringEx();
kValue = row[tb_MyGroup.GroupCode].ToStringEx();
//创建部门结点
root = CreateNode(row, "Group");
if (root != null)
{
root.ImageIndex = 0;
root.SelectImageIndex = 0;
//获取子级部门
childs = GetRows(_Groups, kValue);
if (childs.Length > 0) InitTreeChild(childs, root);
InitTreeEmployee(root);
}
}
}
finally
{
tree.EndUpdate();
}
}
///
/// 生成部门节点
///
/// 部门数据
/// 父级节点
protected virtual void InitTreeChild(DataRow[] childs,
TreeListNode parentNode)
{
string pValue;
string kValue;
var root = new TreeListNode();
//生成部门节点
foreach (var row in childs)
{
pValue = row[tb_MyGroup.ParentGroupCode].ToStringEx();
kValue = row[tb_MyGroup.GroupCode].ToStringEx();
if (kValue == "purchase_dept")
{
}
root = CreateNode(row, "Group", parentNode); //创建结点
if (root != null)
{
root.ImageIndex = 1;
root.SelectImageIndex = 1;
childs = GetRows(_Groups, kValue); //取当前节点的子节点
if (childs.Length > 0) //创建下一级结点
InitTreeChild(childs, root);
InitTreeEmployee(root);
}
}
}
protected virtual void InitTreeEmployee(TreeListNode parentNode)
{
//生成parentNode部门下面的员工节点
var group = (parentNode.Tag as NodeModel).DataID;
var rs = _GroupUsers.Select($"GroupCode='{group}'");
foreach (var R in rs)
{
var node = CreateNode(R, "User", parentNode); //创建结点
if (node != null)
{
//部门负责人-主管
if (ConvertEx.ToInt(R["FlagOwner1"]) == 1)
{
node.ImageIndex = 3;
node.SelectImageIndex = 3;
}
else if (ConvertEx.ToInt(R["FlagOwner2"]) == 1)
{
//部门负责人-副主管
node.ImageIndex = 4;
node.SelectImageIndex = 4;
}
else
{
//普通职员
node.ImageIndex = 2;
node.SelectImageIndex = 2;
}
}
}
}
private NodeModel GetModelGroup(DataRow R)
{
var g = new NodeModel
{
RowID = R[tb_MyGroup.RowID].ToStringEx(),
DataID = R[tb_MyGroup.GroupCode].ToStringEx(),
Tag = R,
Text = R[tb_MyGroup.GroupName].ToStringEx(),
Type = "Group"
};
return g;
}
private NodeModel GetModelUser(DataRow R)
{
var a = ConvertEx.ToInt(R["FlagOwner1"]);
var b = ConvertEx.ToInt(R["FlagOwner2"]);
var tag = "普通职员";
if (a == 1) tag = "主管";
if (b == 1) tag = "副主管";
var g = new NodeModel
{
RowID = R[tb_MyUser.Account].ToStringEx(),
DataID = R[tb_MyUser.Account].ToStringEx(),
Tag = R,
Text = R[tb_MyUser.UserName].ToStringEx(),
Type = "User",
Tag1 = tag
};
return g;
}
private TreeListNode CreateNode(DataRow row, string nodeType,
TreeListNode parentNode = null)
{
var node = new TreeListNode();
var m = new NodeModel();
if (nodeType.ToUpper() == "GROUP") m = GetModelGroup(row);
if (nodeType.ToUpper() == "USER") m = GetModelUser(row);
if (m != null)
{
if (parentNode == null)
node = tlGroup4User.Nodes.Add(m.Text, m.RowID);
else
node = parentNode.Nodes.Add(m.Text, m.RowID);
}
if (node != null) node.Tag = m;
return node;
}
///
/// 根据父级菜单名获取所有子级的资料行.
///
/// 父级菜单名
///
protected DataRow[] GetRows(DataTable dtGroups, string parentValue)
{
string filter;
if (string.IsNullOrEmpty(parentValue))
filter =
$"(ParentGroupCode IS NULL) OR (ParentGroupCode ='{parentValue}')";
else
filter = $"ParentGroupCode='{parentValue}'";
return dtGroups.Select(filter);
}
#endregion
}
public static class TreeListExtension
{
///
/// TreeList
/// ToolTipControllerGetActiveObjectInfoEventArgs
/// 委托
public static void CustomNodeTooltip(this TreeList tree,
ToolTipControllerGetActiveObjectInfoEventArgs e,
Func builderNodeTooltipHandler)
{
if (e.SelectedControl is TreeList)
{
var _hit = tree.CalcHitInfo(e.ControlMousePosition);
if (_hit.HitInfoType == HitInfoType.Cell)
{
var _viewInfo = tree.ViewInfo;
var _rowInfo =
_viewInfo.GetRowInfoByPoint(e.ControlMousePosition);
var _cellInfo = _rowInfo.Cells[_hit.Column.VisibleIndex];
var _editHitInfo =
_cellInfo.EditorViewInfo.CalcHitInfo(
e.ControlMousePosition);
if (_editHitInfo.HitTest == EditHitTest.MaskBox)
{
var _toolTip = builderNodeTooltipHandler(_hit.Node);
if (!string.IsNullOrEmpty(_toolTip))
e.Info =
new ToolTipControlInfo(_cellInfo, _toolTip);
}
}
}
}
}
}