#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;
|
}
|
|
/// <summary>
|
/// 重新定位树节点
|
/// </summary>
|
/// <param name="rowID"></param>
|
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<List<AccountModel>> action =
|
delegate(List<AccountModel> result)
|
{
|
var data = new List<Interfaces.tb_MyGroupUser>();
|
|
//将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 递归生成菜单树
|
|
/// <summary>
|
/// 生成顶级菜单的树结点
|
/// </summary>
|
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();
|
}
|
}
|
|
/// <summary>
|
/// 生成部门节点
|
/// </summary>
|
/// <param name="childs">部门数据</param>
|
/// <param name="parentNode">父级节点</param>
|
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;
|
}
|
|
/// <summary>
|
/// 根据父级菜单名获取所有子级的资料行.
|
/// </summary>
|
/// <param name="parentValue">父级菜单名</param>
|
/// <returns></returns>
|
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
|
{
|
/// </summary>
|
/// <param name="tree">TreeList</param>
|
/// <param name="e">ToolTipControllerGetActiveObjectInfoEventArgs</param>
|
/// <param name="builderNodeTooltipHandler">委托</param>
|
public static void CustomNodeTooltip(this TreeList tree,
|
ToolTipControllerGetActiveObjectInfoEventArgs e,
|
Func<TreeListNode, string> 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);
|
}
|
}
|
}
|
}
|
}
|
}
|