| 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> menuIds = _MenuRepository.QueryData(x => x.MenuId, x => x.MenuType == 1); | 
|   | 
|                 List<int> originalMeunIds = new List<int>(); | 
|                 //被分配角色的权限 | 
|                 List<Sys_RoleAuth> roleAuths = _RoleAuthRepository.QueryData(x => x.RoleId == roleId && menuIds.Contains(x.MenuId)); | 
|                 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.DeleteData(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; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 保存角色权限 | 
|         /// </summary> | 
|         /// <param name="userPermissions"></param> | 
|         /// <param name="roleId"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent SavePermissionPDA(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<int> menuIds = _MenuRepository.QueryData(x => x.MenuId, x => x.MenuType == 1); | 
|   | 
|                 //被分配角色的权限 | 
|                 List<Sys_RoleAuth> roleAuths = _RoleAuthRepository.QueryData(x => x.RoleId == roleId && menuIds.Contains(x.MenuId)); | 
|                 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.DeleteData(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; | 
|         } | 
|     } | 
| } |