using Microsoft.AspNetCore.DataProtection.KeyManagement; 
 | 
using SqlSugar; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEA_DTO.System; 
 | 
using WIDESEA_Core; 
 | 
using WIDESEA_Core.BaseRepository; 
 | 
using WIDESEA_Core.BaseServices; 
 | 
using WIDESEA_Core.HttpContextUser; 
 | 
using WIDESEA_ISystemRepository; 
 | 
using WIDESEA_ISystemService; 
 | 
using WIDESEA_Model.Models; 
 | 
using WIDESEA_Model.Models.System; 
 | 
using WIDESEA_SystemRepository; 
 | 
using WIDESEA_Core.Helper; 
 | 
using WIDESEA_Core.HostedService; 
 | 
  
 | 
namespace WIDESEA_SystemService 
 | 
{ 
 | 
    public class Sys_RoleService : ServiceBase<Sys_Role, ISys_RoleRepository>, ISys_RoleService 
 | 
    { 
 | 
        private readonly IUnitOfWorkManage _unitOfWorkManage; 
 | 
        private readonly ISys_MenuRepository _MenuRepository; 
 | 
        private readonly ISys_MenuService _MenuService; 
 | 
        private readonly ISys_RoleAuthRepository _RoleAuthRepository; 
 | 
  
 | 
        public ISys_RoleRepository Repository => BaseDal; 
 | 
  
 | 
        public Sys_RoleService(ISys_RoleRepository BaseDal, ISys_MenuRepository MenuRepository, ISys_MenuService MenuService, ISys_RoleAuthRepository roleAuthRepository, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal) 
 | 
        { 
 | 
            _unitOfWorkManage = unitOfWorkManage; 
 | 
            _MenuRepository = MenuRepository; 
 | 
            _MenuService = MenuService; 
 | 
            _RoleAuthRepository = roleAuthRepository; 
 | 
        } 
 | 
  
 | 
        public override WebResponseContent AddData(SaveModel saveModel) 
 | 
        { 
 | 
            string authorityScope = saveModel.MainData["authorityScope"].ToString() ?? ""; 
 | 
            Sys_Role role = saveModel.MainData.DicToModel<Sys_Role>(); 
 | 
            if (BaseDal.QueryFirst(x => x.RoleName == role.RoleName) != null) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error($"角色名重复"); 
 | 
            } 
 | 
            List<Dt_Warehouse> warehouses = BaseDal.Db.Queryable<Dt_Warehouse>().Where(x => true).ToList(); 
 | 
            List<Sys_RoleDataPermission> roleDataPermissions = new List<Sys_RoleDataPermission>(); 
 | 
            if (!string.IsNullOrEmpty(authorityScope)) 
 | 
            { 
 | 
                string[] scopes = authorityScope.Split(','); 
 | 
                foreach (string scope in scopes) 
 | 
                { 
 | 
                    Dt_Warehouse? warehouse = warehouses.FirstOrDefault(x => x.WarehouseId == Convert.ToInt32(scope)); 
 | 
                    if (warehouse != null) 
 | 
                    { 
 | 
                        roleDataPermissions.Add(new Sys_RoleDataPermission 
 | 
                        { 
 | 
                            WarehouseId = warehouse.WarehouseId, 
 | 
                            WarehouseName = warehouse.WarehouseName, 
 | 
                            RoleName = role.RoleName 
 | 
                        }); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
  
 | 
            int roleId = BaseDal.AddData(role); 
 | 
            if (roleDataPermissions.Count > 0) 
 | 
            { 
 | 
                roleDataPermissions.ForEach(x => { x.RoleId = roleId; }); 
 | 
                BaseDal.Db.Insertable(roleDataPermissions).ExecuteCommand(); 
 | 
            } 
 | 
  
 | 
            PermissionDataHostService.UserRoles = PermissionDataHostService.GetUserRoles(Db); 
 | 
  
 | 
            return WebResponseContent.Instance.OK(); 
 | 
        } 
 | 
  
 | 
        public override WebResponseContent UpdateData(SaveModel saveModel) 
 | 
        { 
 | 
            string authorityScope = saveModel.MainData["authorityScope"].ToString() ?? ""; 
 | 
            Sys_Role role = saveModel.MainData.DicToModel<Sys_Role>(); 
 | 
            if (BaseDal.QueryFirst(x => x.RoleId == role.RoleId) == null) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error($"未找到该数据"); 
 | 
            } 
 | 
            List<Dt_Warehouse> warehouses = BaseDal.Db.Queryable<Dt_Warehouse>().Where(x => true).ToList(); 
 | 
  
 | 
            List<Sys_RoleDataPermission> oldDatas = BaseDal.Db.Queryable<Sys_RoleDataPermission>().Where(x => x.RoleId == role.RoleId).ToList(); 
 | 
            List<Sys_RoleDataPermission> roleDataPermissions = new List<Sys_RoleDataPermission>(); 
 | 
            if (!string.IsNullOrEmpty(authorityScope)) 
 | 
            { 
 | 
                string[] scopes = authorityScope.Split(','); 
 | 
                foreach (string scope in scopes) 
 | 
                { 
 | 
                    Sys_RoleDataPermission? oldData = oldDatas.FirstOrDefault(x => x.WarehouseId == Convert.ToInt32(scope)); 
 | 
                    if (oldData == null) 
 | 
                    { 
 | 
                        Dt_Warehouse? warehouse = warehouses.FirstOrDefault(x => x.WarehouseId == Convert.ToInt32(scope)); 
 | 
                        if (warehouse != null) 
 | 
                        { 
 | 
                            roleDataPermissions.Add(new Sys_RoleDataPermission 
 | 
                            { 
 | 
                                WarehouseId = warehouse.WarehouseId, 
 | 
                                WarehouseName = warehouse.WarehouseName, 
 | 
                                RoleName = role.RoleName 
 | 
                            }); 
 | 
                        } 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        oldDatas.Remove(oldData); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
  
 | 
            roleDataPermissions.ForEach(x => { x.RoleId = role.RoleId; }); 
 | 
            BaseDal.Db.Insertable(roleDataPermissions).ExecuteCommand(); 
 | 
            BaseDal.Db.Deleteable(oldDatas).ExecuteCommand(); 
 | 
  
 | 
            PermissionDataHostService.UserRoles = PermissionDataHostService.GetUserRoles(Db); 
 | 
  
 | 
            return WebResponseContent.Instance.OK(); 
 | 
        } 
 | 
  
 | 
        public List<int> GetAllChildrenRoleId(int roleId) 
 | 
        { 
 | 
            return GetAllChildren(roleId).Select(x => x.Id).ToList(); 
 | 
        } 
 | 
  
 | 
        public List<RoleNodes> GetAllChildren(int roleId) 
 | 
        { 
 | 
            if (roleId <= 0) return new List<RoleNodes>() { }; 
 | 
            var roles = GetAllRoleId(); 
 | 
            if (App.User.IsRoleIdSuperAdmin(roleId)) return roles; 
 | 
  
 | 
            var list = GetChildren(roles, roleId); 
 | 
            return list; 
 | 
        } 
 | 
  
 | 
        public List<RoleNodes> GetAllRoleId() 
 | 
        { 
 | 
            List<RoleNodes> roles = BaseDal.QueryData().Select(s => new RoleNodes() { Id = s.RoleId, ParentId = s.ParentId, RoleName = s.RoleName }).ToList(); 
 | 
  
 | 
            return roles; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 获取所有子节点 
 | 
        /// </summary> 
 | 
        /// <param name="roleId"></param> 
 | 
        private List<RoleNodes> GetChildren(List<RoleNodes> roles, int roleId) 
 | 
        { 
 | 
            List<RoleNodes> rolesChildren = roles.Where(x => x.Id == roleId).Distinct().ToList(); 
 | 
  
 | 
            for (int i = 0; i < rolesChildren.Count; i++) 
 | 
            { 
 | 
                RoleNodes node = rolesChildren[i]; 
 | 
                var children = roles.Where(x => x.ParentId == node.Id && !rolesChildren.Any(c => c.Id == x.Id)).Distinct().ToList(); 
 | 
                rolesChildren.AddRange(children); 
 | 
            } 
 | 
            return rolesChildren; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 编辑权限时获取当前用户下的所有角色与当前用户的菜单权限 
 | 
        /// </summary> 
 | 
        /// <returns></returns> 
 | 
        public WebResponseContent GetCurrentTreePermission() 
 | 
        { 
 | 
            WebResponseContent content = GetCurrentUserTreePermission(); 
 | 
            int roleId = App.User.RoleId; 
 | 
            return WebResponseContent.Instance.OK(null, new 
 | 
            { 
 | 
                tree = content.Data, 
 | 
                roles = GetAllChildren(roleId) 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 编辑权限时,获取当前用户的所有菜单权限 
 | 
        /// </summary> 
 | 
        /// <returns></returns> 
 | 
        public WebResponseContent GetCurrentUserTreePermission() 
 | 
        { 
 | 
            return GetUserTreePermission(App.User.RoleId); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 编辑权限时,获取指定角色的所有菜单权限 
 | 
        /// </summary> 
 | 
        /// <param name="roleId"></param> 
 | 
        /// <returns></returns> 
 | 
        public WebResponseContent GetUserTreePermission(int roleId) 
 | 
        { 
 | 
            if (!App.User.IsRoleIdSuperAdmin(roleId) && App.User.RoleId != roleId) 
 | 
            { 
 | 
                if (!(GetAllChildren(App.User.RoleId)).Exists(x => x.Id == roleId)) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error("没有权限获取此角色的权限信息"); 
 | 
                } 
 | 
            } 
 | 
            //获取用户权限 
 | 
            List<Permissions> permissions = _MenuRepository.GetPermissions(roleId); 
 | 
            //权限用户权限查询所有的菜单信息 
 | 
            List<MenuDTO> menus = _MenuService.GetUserMenuList(roleId); 
 | 
            //获取当前用户权限如:(Add,Search)对应的显示文本信息如:Add:添加,Search:查询 
 | 
            var data = menus.Select(x => new 
 | 
            { 
 | 
                Id = x.MenuId, 
 | 
                Pid = x.ParentId, 
 | 
                Text = x.MenuName, 
 | 
                IsApp = x.MenuType == 1, 
 | 
                Actions = _MenuService.GetActions(x.MenuId, x.Actions, permissions, roleId) 
 | 
            }); 
 | 
            return WebResponseContent.Instance.OK(null, data); 
 | 
        } 
 | 
        public WebResponseContent GetCurrentTreePermissionPDA() 
 | 
        { 
 | 
            WebResponseContent content = GetCurrentUserTreePermissionPDA(); 
 | 
            int roleId = App.User.RoleId; 
 | 
            return WebResponseContent.Instance.OK(null, new 
 | 
            { 
 | 
                tree = content.Data, 
 | 
                roles = GetAllChildren(roleId) 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 编辑权限时,获取当前用户的所有菜单权限 
 | 
        /// </summary> 
 | 
        /// <returns></returns> 
 | 
        public WebResponseContent GetCurrentUserTreePermissionPDA() 
 | 
        { 
 | 
            return GetUserTreePermissionPDA(App.User.RoleId); 
 | 
        } 
 | 
        public WebResponseContent GetUserTreePermissionPDA(int roleId) 
 | 
        { 
 | 
            if (!App.User.IsRoleIdSuperAdmin(roleId) && App.User.RoleId != roleId) 
 | 
            { 
 | 
                if (!(GetAllChildren(App.User.RoleId)).Exists(x => x.Id == roleId)) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error("没有权限获取此角色的权限信息"); 
 | 
                } 
 | 
            } 
 | 
            //获取用户权限 
 | 
            List<Permissions> permissions = _MenuRepository.GetPermissions(roleId); 
 | 
            //权限用户权限查询所有的菜单信息 
 | 
            List<MenuDTO> menus = _MenuService.GetUserMenuListPDA(roleId); 
 | 
  
 | 
            //获取当前用户权限如:(Add,Search)对应的显示文本信息如:Add:添加,Search:查询 
 | 
            var data = menus.Where(x => x.MenuType == 1).Select(x => new 
 | 
            { 
 | 
                Id = x.MenuId, 
 | 
                Pid = x.ParentId, 
 | 
                Text = x.MenuName, 
 | 
                IsApp = x.MenuType == 1, 
 | 
                Actions = _MenuService.GetActions(x.MenuId, x.Actions, permissions, roleId) 
 | 
            }); 
 | 
            return WebResponseContent.Instance.OK(null, data); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 保存角色权限 
 | 
        /// </summary> 
 | 
        /// <param name="userPermissions"></param> 
 | 
        /// <param name="roleId"></param> 
 | 
        /// <returns></returns> 
 | 
        public WebResponseContent SavePermission(List<UserPermissionDTO> userPermissions, int roleId) 
 | 
        { 
 | 
            WebResponseContent content = new WebResponseContent(); 
 | 
            string message = ""; 
 | 
            try 
 | 
            { 
 | 
                if (!GetAllChildren(App.User.RoleId).Exists(x => x.Id == roleId)) 
 | 
                    return WebResponseContent.Instance.Error("没有权限修改此角色的权限信息"); 
 | 
                //当前用户的权限 
 | 
                List<Permissions> permissions = _MenuRepository.GetPermissions(App.User.RoleId); 
 | 
  
 | 
                List<int> originalMeunIds = new List<int>(); 
 | 
                //被分配角色的权限 
 | 
                List<Sys_RoleAuth> roleAuths = _RoleAuthRepository.QueryData(x => x.RoleId == roleId); 
 | 
                List<Sys_RoleAuth> updateAuths = new List<Sys_RoleAuth>(); 
 | 
                foreach (UserPermissionDTO x in userPermissions) 
 | 
                { 
 | 
                    Permissions per = permissions.FirstOrDefault(p => p.MenuId == x.Id); 
 | 
                    //不能分配超过当前用户的权限 
 | 
                    if (per == null) continue; 
 | 
                    //per.UserAuthArr.Contains(a.Value)校验权限范围 
 | 
                    string[] arr = x.Actions == null || x.Actions.Count == 0 
 | 
                      ? new string[0] 
 | 
                      : x.Actions.Where(a => per.UserAuthArr.Contains(a.Value)) 
 | 
                      .Select(s => s.Value).ToArray(); 
 | 
  
 | 
                    //如果当前权限没有分配过,设置Auth_Id默认为0,表示新增的权限 
 | 
                    var auth = roleAuths.Where(r => r.MenuId == x.Id).Select(s => new { s.AuthId, s.AuthValue, s.MenuId }).FirstOrDefault(); 
 | 
                    string newAuthValue = string.Join(",", arr); 
 | 
                    //权限没有发生变化则不处理 
 | 
                    if (auth == null || auth.AuthValue != newAuthValue) 
 | 
                    { 
 | 
                        updateAuths.Add(new Sys_RoleAuth() 
 | 
                        { 
 | 
                            RoleId = roleId, 
 | 
                            MenuId = x.Id, 
 | 
                            AuthValue = string.Join(",", arr), 
 | 
                            AuthId = auth == null ? 0 : auth.AuthId, 
 | 
                            ModifyDate = DateTime.Now, 
 | 
                            Modifier = App.User.UserName, 
 | 
                            CreateDate = DateTime.Now, 
 | 
                            Creater = App.User.UserName 
 | 
                        }); 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        originalMeunIds.Add(auth.MenuId); 
 | 
                    } 
 | 
  
 | 
                } 
 | 
                //更新权限 
 | 
                _RoleAuthRepository.UpdateData(updateAuths); 
 | 
                //新增的权限 
 | 
                _RoleAuthRepository.AddData(updateAuths); 
 | 
  
 | 
                //获取权限取消的权限 
 | 
                int[] authIds = roleAuths.Where(x => userPermissions.Select(u => u.Id) 
 | 
                 .ToList().Contains(x.MenuId) || originalMeunIds.Contains(x.MenuId)) 
 | 
                .Select(s => s.AuthId) 
 | 
                .ToArray(); 
 | 
                List<Sys_RoleAuth> delAuths = roleAuths.Where(x => x.AuthValue != "" && !authIds.Contains(x.AuthId)).ToList(); 
 | 
                delAuths.ForEach(x => 
 | 
                { 
 | 
                    x.AuthValue = ""; 
 | 
                }); 
 | 
                //将取消的权限设置为"" 
 | 
                _RoleAuthRepository.UpdateData(delAuths); 
 | 
  
 | 
                int addCount = updateAuths.Where(x => x.AuthId <= 0).Count(); 
 | 
                int updateCount = updateAuths.Where(x => x.AuthId > 0).Count(); 
 | 
  
 | 
                string _version = DateTime.Now.ToString("yyyyMMddHHMMssfff"); 
 | 
  
 | 
  
 | 
                content.OK($"保存成功:新增加配菜单权限{addCount}条,更新菜单{updateCount}条,删除权限{delAuths.Count}条"); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                message = "异常信息:" + ex.Message + ex.StackTrace + ","; 
 | 
            } 
 | 
  
 | 
            return content; 
 | 
        } 
 | 
    } 
 | 
} 
 |