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