#region using System; using System.Data; using CSFrameworkV5.Business; using CSFrameworkV5.Business.BLL_Permission; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Library.CommonClass; using CSFrameworkV5.Models; using DevExpress.XtraTab; using DevExpress.XtraTreeList; using DevExpress.XtraTreeList.Nodes; #endregion namespace CSFrameworkV5.Library.PermissionForms { public partial class frmGroupLevel : frmBase { private DataTable _AllGroup; //所有组数据 private DataTable _AllRole; //所有角色 private DataTable _AllUser; //所有用户 private bllGroup _BLL; private GroupRoleCache _GroupRoleCache; private GroupUserCache _GroupUserCache; private bool _SaveOK; //只要1次保存成功,表示已修改数据 public frmGroupLevel() { InitializeComponent(); } private void tc_SelectedPageChanged(object sender, TabPageChangedEventArgs e) { if (e.Page == xtraTabPage1) DevTreeListView.SetImageIndex(tlGroup4User, null, 1, 0); if (e.Page == xtraTabPage2) DevTreeListView.SetImageIndex(tlGroup4Role, null, 1, 0); } #region 公共方法 public static bool ExecuteOrgUser() { var form = new frmGroupLevel(); form.xtraTabPage2.PageVisible = false; form.Text = "批量设置组织机构的用户"; form.ShowDialog(); return form._SaveOK; } private void frmGroupLevel_Load(object sender, EventArgs e) { _BLL = new bllGroup(); _AllGroup = new bllGroup().GetLookupData(); _AllUser = new bllUser().GetLookupData(); _AllRole = new bllRole().GetLookupData(); _GroupUserCache = new GroupUserCache(); _GroupUserCache.LoadData(); _GroupRoleCache = new GroupRoleCache(); _GroupRoleCache.LoadData(); DevStyle.SetTreeListSelectStyle(tlGroup4Role); DevStyle.SetTreeListSelectStyle(tlGroup4User); InitTreeList(tlGroup4User, _AllGroup.Copy()); InitTreeList(tlGroup4Role, _AllGroup.Copy()); InitUser(_AllUser); InitRole(_AllRole); } /// /// 初始化组织结构树 /// /// /// private void InitTreeList(TreeList tree, DataTable treeData) { DataTableTools.AddMergedColumn(treeData, "Union", tb_MyGroup.GroupName, tb_MyGroup.GroupCode); tree.KeyFieldName = tb_MyGroup.GroupCode; //设置主键 tree.ParentFieldName = tb_MyGroup.ParentGroupCode; //设置父级主键 tree.RootValue = ""; //顶级树结点的值 tree.BeginUpdate(); tree.DataSource = treeData; DevTreeListView.SetImageIndex(tree, null, 1, 0); tree.EndUpdate(); tree.ExpandAll(); } private void btnClose_Click(object sender, EventArgs e) { Close(); } private void btnSave_Click(object sender, EventArgs e) { if (Msg.AskQuestion("确定要保存吗?")) DoSave(); } /// /// 保存数据 /// private void DoSave() { try { frmWaitingEx.ShowMe(this); var dtGroupUser = _GroupUserCache.GetChanges(); var dtGroupRole = _GroupRoleCache.GetChanges(); var ds = new DataSet(); if (dtGroupUser != null) ds.Tables.Add(dtGroupUser); if (dtGroupRole != null) ds.Tables.Add(dtGroupRole); if (ds.Tables.Count > 0) { _SaveOK = _SaveOK || _BLL.Update(ds); if (dtGroupUser != null) _GroupUserCache.LoadData(); //刷新数据 if (dtGroupRole != null) _GroupRoleCache.LoadData(); //刷新数据 Msg.ShowInformation("保存成功!"); } else { Msg.Warning("您没有修改数据!"); } } finally { frmWaitingEx.HideMe(this); } } #endregion #region 批量设置组织机构的用户 /// /// 加载用户列表 /// /// private void InitUser(DataTable dtUser) { SetUserImageIndex(dtUser); lbAllUser.Items.Clear(); DataTableTools.AddMergedColumn(dtUser, "Union", tb_MyUser.UserName, tb_MyUser.Account); lbAllUser.DisplayMember = "Union"; lbAllUser.ValueMember = tb_MyUser.Account; lbAllUser.DataSource = dtUser; lbAllUser.Invalidate(); } /// /// 设置用户的图标,该用户属于某个组,显示勾选图标,反之,显示灰色图标 /// /// 所有用户数据 private void SetUserImageIndex(DataTable dtUser) { lbAllUser.ImageIndexMember = "ImageIndex"; if (dtUser.Columns["ImageIndex"] == null) dtUser.Columns.Add("ImageIndex", typeof(int)); bool exists; foreach (DataRow R in dtUser.Rows) { exists = _GroupUserCache.HasGroup(R["Account"].ToStringEx()); if (exists) R["ImageIndex"] = 1; else R["ImageIndex"] = 0; } dtUser.AcceptChanges(); } private void btnFindUser_Click(object sender, EventArgs e) { if (_AllUser != null && txtUserText.Text.Trim() != "") { var dt = _AllUser.Copy(); dt.DefaultView.RowFilter = "Account LIKE '%" + txtUserText.Text + "%' OR UserName LIKE '%" + txtUserText.Text + "%'"; InitUser(dt.DefaultView.ToTable()); } } /// /// 节点的勾选状态发生变化 /// /// private void UpdateByNodeDataUser(TreeListNode node) { if (lbAllUser.SelectedItem == null) return; var R = (lbAllUser.SelectedItem as DataRowView) .Row; //当前用户 var account = R[tb_MyUser.Account].ToStringEx(); //取出当前用户 //修改结点后,显示图标状态 var list = tlGroup4User.GetAllCheckedNodes(); R["ImageIndex"] = list.Count > 0 ? 1 : 0; _GroupUserCache.UpdateByNodeCheckChild(account, node, node.Checked); } private void lbAllUser_SelectedIndexChanged(object sender, EventArgs e) { //选择用户,勾选存在的组 if (lbAllUser.SelectedIndex >= 0) { var DV = lbAllUser.SelectedItem as DataRowView; var account = DV.Row[tb_MyUser.Account].ToStringEx(); SetGroupCheckedByUser(account); } } private void txtUserText_EditValueChanged(object sender, EventArgs e) { //清空查询条件,显示所有用户 if (txtUserText.Text.Trim() == "") InitUser(_AllUser); } private void tlGroup4User_AfterCheckNode(object sender, NodeEventArgs e) { UpdateByNodeDataUser(e.Node); } /// /// 获取用户的组数据,在组织结构中勾选存在的组 /// /// private void SetGroupCheckedByUser(string account) { var dt = _GroupUserCache.GetGroupsByUser(account); tlGroup4User.UncheckAll(); foreach (DataRow R in dt.Rows) { var group = R[tb_MyGroup.GroupCode].ToStringEx(); var N = tlGroup4User.FindNodeByKeyID(group); if (N != null) { N.Checked = true; N.ExpandAll(); } } } #endregion #region 批量设置组织机构的角色 /// /// 加载角色列表 /// /// private void InitRole(DataTable dtRole) { SetRoleImageIndex(dtRole); lbAllRole.Items.Clear(); DataTableTools.AddMergedColumn(dtRole, "Union", tb_MyRole.RoleName, tb_MyRole.RoleID); lbAllRole.DisplayMember = "Union"; lbAllRole.ValueMember = tb_MyRole.RoleID; lbAllRole.DataSource = dtRole; lbAllRole.Invalidate(); } /// /// 设置角色的图标,该角色属于某个组,显示勾选图标,反之,显示灰色图标 /// /// 所有角色数据 private void SetRoleImageIndex(DataTable dtRole) { lbAllRole.ImageIndexMember = "ImageIndex"; if (dtRole.Columns["ImageIndex"] == null) dtRole.Columns.Add("ImageIndex", typeof(int)); bool exists; foreach (DataRow R in dtRole.Rows) { exists = _GroupRoleCache.HasGroup(R[tb_MyRole.RoleID].ToStringEx()); if (exists) R["ImageIndex"] = 1; else R["ImageIndex"] = 0; } dtRole.AcceptChanges(); } private void btnFindRole_Click(object sender, EventArgs e) { if (_AllRole != null && txtRoleText.Text.Trim() != "") { var dt = _AllRole.Copy(); dt.DefaultView.RowFilter = "RoleID LIKE '%" + txtRoleText.Text + "%' OR RoleName LIKE '%" + txtRoleText.Text + "%'"; InitRole(dt.DefaultView.ToTable()); } } /// /// 节点的勾选状态发生变化 /// /// private void UpdateByNodeDataRole(TreeListNode node) { if (lbAllRole.SelectedItem == null) return; var R = (lbAllRole.SelectedItem as DataRowView) .Row; //当前用户 var roleID = R[tb_MyRole.RoleID].ToStringEx(); //取出当前角色 //修改结点后,显示图标状态 var list = tlGroup4Role.GetAllCheckedNodes(); R["ImageIndex"] = list.Count > 0 ? 1 : 0; _GroupRoleCache.UpdateByNodeCheckChild(roleID, node, node.Checked); } private void lbAllRole_SelectedIndexChanged(object sender, EventArgs e) { //选择用户,勾选存在的组 if (lbAllRole.SelectedIndex >= 0) { var DV = lbAllRole.SelectedItem as DataRowView; var roleID = DV.Row[tb_MyRole.RoleID].ToStringEx(); SetGroupCheckedByRole(roleID); } } private void txtRoleText_EditValueChanged(object sender, EventArgs e) { //清空查询条件,显示所有用户 if (txtRoleText.Text.Trim() == "") InitRole(_AllRole); } private void tlGroup4Role_AfterCheckNode(object sender, NodeEventArgs e) { UpdateByNodeDataRole(e.Node); } /// /// 获取用户的组数据,在组织结构中勾选存在的组 /// /// private void SetGroupCheckedByRole(string roleID) { var dt = _GroupRoleCache.GetGroupsByRole(roleID); tlGroup4Role.UncheckAll(); foreach (DataRow R in dt.Rows) { var group = R[tb_MyGroup.GroupCode].ToStringEx(); var N = tlGroup4Role.FindNodeByKeyID(group); if (N != null) { N.Checked = true; N.ExpandAll(); } } } #endregion } /// /// 组用户表(tb_MyGroupUser)动态数据,处理组织机构树勾选状态对应的数据 /// public class GroupUserCache { private bllGroup _BLL; //业务逻辑层 private DataTable _GroupUserData; //所有组用户关系表的数据(tb_MyGroupUser表) private DataTable _GroupUserData4Tree; //动态数据,勾选状态对应的数据 public GroupUserCache() { _BLL = new bllGroup(); } /// /// 获取用于保存的数据 /// /// public DataTable GetChanges() { var dtSave = _GroupUserData.Copy(); //复制所有数据 DataRow[] rs; string groupCode; string account; var filter = "Account='{0}' AND GroupCode='{1}'"; //收集删除的记录,枚举所有组的用户数据, foreach (DataRow R in dtSave.Rows) { account = R[tb_MyGroupUser.Account].ToStringEx(); groupCode = R[tb_MyGroupUser.GroupCode].ToStringEx(); rs = _GroupUserData4Tree.Select(string.Format(filter, account, groupCode)); if (rs.Length == 0) //副本数据不存在,表示已删除,打上删除标记 R.Delete(); } //收集新增记录 foreach (DataRow R in _GroupUserData4Tree.Rows) { account = R[tb_MyGroupUser.Account].ToStringEx(); groupCode = R[tb_MyGroupUser.GroupCode].ToStringEx(); rs = _GroupUserData.Select(string.Format(filter, account, groupCode)); if (rs.Length == 0) //原始数据不存在,新增记录 dtSave.Rows.Add(R.ItemArray); } return dtSave.GetChanges(); } /// /// 取用户的组 /// /// /// public DataTable GetGroupsByUser(string account) { _GroupUserData4Tree.DefaultView.RowFilter = "Account='" + account + "'"; return _GroupUserData4Tree.DefaultView.ToTable(); } /// /// 判断用户是否属于组 /// /// /// public bool HasGroup(string user) { var rs = _GroupUserData4Tree.Select("Account='" + user + "'"); return rs.Length > 0; } /// /// 加载tb_MyGroupUser数据 /// public void LoadData() { _GroupUserData = CommonData.GetDataDict(Globals.DEF_SYSTEM_DBID, tb_MyGroupUser.__TableName); _GroupUserData4Tree = _GroupUserData.Copy(); } /// /// Node.Check事件后,更新数据源 /// /// /// /// public void UpdateByNodeCheck(string account, string groupCode, bool isCheck) { var filter = string.Format("Account='{0}' AND GroupCode='{1}'", account, groupCode); var rs = _GroupUserData4Tree.Select(filter); if (isCheck && rs.Length == 0) //勾选,数据源不存在,新增 { var newRow = _GroupUserData4Tree.Rows.Add(); newRow[tb_MyGroupUser.DataSetID] = Loginer.CurrentUser.DBID; newRow[tb_MyGroupUser.Account] = account; newRow[tb_MyGroupUser.GroupCode] = groupCode; } if (!isCheck && rs.Length > 0) //不勾选,数据源存在数据,删除 _GroupUserData4Tree.Rows.Remove(rs[0]); } /// /// 勾选当前结点,子节点要全勾上 /// /// 当前用户 /// 当前结点 /// 结点的勾选状态 public void UpdateByNodeCheckChild(string account, TreeListNode node, bool isChecked) { node.Checked = isChecked; var groupCode = node.GetValue(tb_MyGroup.GroupCode).ToStringEx(); //取出当前结点的组号 //新增、删除组用户记录 UpdateByNodeCheck(account, groupCode, isChecked); //当前结点 //处理子节点 foreach (TreeListNode N in node.Nodes) UpdateByNodeCheckChild(account, N, isChecked); } } /// /// 组角色表(tb_MyGroupRole)动态数据,处理组织机构树勾选状态对应的数据 /// public class GroupRoleCache { private bllGroup _BLL; //业务逻辑层 private DataTable _GroupRoleData; //所有组角色关系表的数据(tb_MyGroupRole表) private DataTable _GroupRoleData4Tree; //动态数据,勾选状态对应的数据 public GroupRoleCache() { _BLL = new bllGroup(); } /// /// 获取用于保存的数据 /// /// public DataTable GetChanges() { var dtSave = _GroupRoleData.Copy(); //复制所有数据 DataRow[] rs; string groupCode; string roleID; var filter = "RoleID='{0}' AND GroupCode='{1}'"; //收集删除的记录,枚举所有组的角色数据, foreach (DataRow R in dtSave.Rows) { roleID = R[tb_MyGroupRole.RoleID].ToStringEx(); groupCode = R[tb_MyGroupRole.GroupCode].ToStringEx(); rs = _GroupRoleData4Tree.Select(string.Format(filter, roleID, groupCode)); if (rs.Length == 0) //副本数据不存在,表示已删除,打上删除标记 R.Delete(); } //收集新增记录 foreach (DataRow R in _GroupRoleData4Tree.Rows) { roleID = R[tb_MyGroupRole.RoleID].ToStringEx(); groupCode = R[tb_MyGroupRole.GroupCode].ToStringEx(); rs = _GroupRoleData.Select(string.Format(filter, roleID, groupCode)); if (rs.Length == 0) //原始数据不存在,新增记录 dtSave.Rows.Add(R.ItemArray); } return dtSave.GetChanges(); } /// /// 取角色所属于的组 /// /// /// public DataTable GetGroupsByRole(string roleID) { _GroupRoleData4Tree.DefaultView.RowFilter = "RoleID='" + roleID + "'"; return _GroupRoleData4Tree.DefaultView.ToTable(); } /// /// 判断角色是否属于组 /// /// /// public bool HasGroup(string roleID) { var rs = _GroupRoleData4Tree.Select("RoleID='" + roleID + "'"); return rs.Length > 0; } /// /// 加载tb_MyGroupRole数据 /// public void LoadData() { _GroupRoleData = CommonData.GetDataDict(Globals.DEF_SYSTEM_DBID, tb_MyGroupRole.__TableName); _GroupRoleData4Tree = _GroupRoleData.Copy(); } /// /// Node.Check事件后,更新数据源 /// /// /// /// public void UpdateByNodeCheck(string roleID, string groupCode, bool isCheck) { var filter = string.Format("RoleID='{0}' AND GroupCode='{1}'", roleID, groupCode); var rs = _GroupRoleData4Tree.Select(filter); if (isCheck && rs.Length == 0) //勾选,数据源不存在,新增 { var newRow = _GroupRoleData4Tree.Rows.Add(); newRow[tb_MyGroupRole.DataSetID] = Loginer.CurrentUser.DBID; newRow[tb_MyGroupRole.RoleID] = roleID; newRow[tb_MyGroupRole.GroupCode] = groupCode; } if (!isCheck && rs.Length > 0) //不勾选,数据源存在数据,删除 _GroupRoleData4Tree.Rows.Remove(rs[0]); } /// /// 勾选当前结点,子节点要全勾上 /// /// 当前用户 /// 当前结点 /// 结点的勾选状态 public void UpdateByNodeCheckChild(string roleID, TreeListNode node, bool isChecked) { node.Checked = isChecked; var groupCode = node.GetValue(tb_MyGroup.GroupCode).ToStringEx(); //取出当前结点的组号 //新增、删除组的角色记录 UpdateByNodeCheck(roleID, groupCode, isChecked); //当前结点 //处理子节点 foreach (TreeListNode N in node.Nodes) UpdateByNodeCheckChild(roleID, N, isChecked); } } }