using Hh.Mes.Common.log; using Hh.Mes.Common.Request; using Hh.Mes.Pojo.System; using Hh.Mes.POJO.Entity; using Hh.Mes.POJO.EnumEntitys; using Hh.Mes.POJO.Response; using Hh.Mes.Service.Repository; using Hh.Mes.Service.SystemAuth; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Distributed; using System; using System.Collections.Generic; using System.Linq; namespace Hh.Mes.Service.WebService.Base { /// <summary> /// 关联服务(用户角色、角色权限、用户权限、用户部门等等) /// </summary> public class SysRoleService : RepositorySqlSugar<SysRole> { private IAuth authUtil; private SysRelevanceService sysRelevanceService; private readonly IDistributedCache _cache; public SysRoleService(IAuth authUtil, SysRelevanceService sysRelevanceService, IDistributedCache cache) : base(authUtil, cache) { this.authUtil = authUtil; this.sysRelevanceService = sysRelevanceService; _cache = cache; } /// <summary> /// 加载当前登录用户可访问的一个部门及子部门全部角色 /// </summary> public dynamic Load(PageReq pageRequest, int? orgId) { return ExceptionsHelp.Instance.ExecuteT(() => { var response = new Response(); var loginUser = authUtil.GetCurrentUser(); string cascadeId = ".0."; if (orgId != null) { var org = loginUser.Orgs.SingleOrDefault(u => u.Id == orgId); cascadeId = org.CascadeId; } //获取部门、下属的多级子部门ID var ids = loginUser.Orgs.Where(t => t.CascadeId.StartsWith(cascadeId)).Select(t => t.Id).ToList(); //根据多级部门ID找到对应的多个角色ID var roleIds = Context.Queryable<sys_relevance>() .Where(u => u.relKey == Define.ROLEORG && ids.Contains(u.secondId.Value)) .Select(u => u.firstId.Value) .ToList(); //角色ID去重 roleIds = roleIds.Distinct().ToList(); //找出角色和部门的关联 var relevances = Context.Queryable<SysRelevance>() .Where(u => u.RelKey == Define.ROLEORG && roleIds.Contains(u.FirstId.Value)) .ToList(); var deptIds = relevances.Select(t => t.SecondId).Distinct().ToList(); //根据角色ID,找出对应的部门ID var depts = Context.Queryable<SysDept>().Where(u => deptIds.Contains(u.Id)).ToList(); //根据角色ID找到多个角色 int count = 0; var roles = Context.Queryable<SysRole>() .Where(t => roleIds.Contains(t.Id)) .OrderBy(t => t.Name) .ToOffsetPage(pageRequest.page, pageRequest.limit, ref count); var roleViews = new List<SysRoleView>(); foreach (var role in roles) { //查询角色的所有组织ID var roleDeptIds = relevances.Where(t => t.FirstId == role.Id).Select(t => t.SecondId).ToList(); //根据组织ID查询所有组织信息 var orgs = depts.Where(t => roleDeptIds.Contains(t.Id)).ToList(); SysRoleView uv = role; uv.Organizations = string.Join(",", orgs.Select(u => u.Name).ToList()); uv.OrganizationIds = string.Join(",", orgs.Select(u => u.Id).ToList()); roleViews.Add(uv); } response.Count = count; response.Result = roleViews; return response; }); } public dynamic Ins(SysRoleView obj) { return ExceptionsHelp.Instance.ExecuteT(() => { var response = new Response(); if (string.IsNullOrEmpty(obj.OrganizationIds)) { throw new Exception("请为角色分配机构"); } if (Context.Queryable<SysRole>().Any(u => u.Name == obj.Name)) { throw new Exception("角色已存在"); } SysRole role = obj; role.CreateBy = sysWebUser?.Account; role.CreateTime = DateTime.Now; int[] orgIds = Array.ConvertAll(obj.OrganizationIds.Split(','), int.Parse); //角色和组织的关联 List<SysRelevance> list = new List<SysRelevance>(); foreach (var item in orgIds) { var sysRelevance = new SysRelevance { RelKey = Define.ROLEORG, SecondId = item, CreateBy = sysWebUser?.Account, CreateTime = DateTime.Now }; list.Add(sysRelevance); } //在事务中处理 var result = Context.Ado.UseTran(() => { //插入角色到数据库 role.Id = Context.Insertable(role).ExecuteReturnIdentity(); //role.Id插入后才会产生,才能赋值 list.ForEach(t => t.FirstId = role.Id); //删除角色对应的所有组织 Context.Deleteable<SysRelevance>(t => t.FirstId == role.Id && t.RelKey == Define.ROLEORG).ExecuteCommand(); //新增角色对应的所有组织 Context.Insertable(list).ExecuteCommand(); }); if (result.IsSuccess == false) { return response.ResponseError(result.ErrorMessage); } return response; }); } /// <summary> /// 更新 /// </summary> /// <param name="obj"></param> /// <returns></returns> /// <exception cref="Exception"></exception> public dynamic Upd(SysRoleView obj) { return ExceptionsHelp.Instance.ExecuteT(() => { var response = new Response(); if (string.IsNullOrEmpty(obj.OrganizationIds)) { throw new Exception("请为角色分配机构"); } SysRole role = obj; role.UpdateBy = sysWebUser?.Account; role.UpdateTime = DateTime.Now; ClearRedis(new int[] { role.Id }); int[] orgIds = Array.ConvertAll(obj.OrganizationIds.Split(','), int.Parse); //角色和组织的关联 List<SysRelevance> list = new List<SysRelevance>(); foreach (var item in orgIds) { var sysRelevance = new SysRelevance { RelKey = Define.ROLEORG, FirstId = role.Id, SecondId = item, CreateBy = sysWebUser?.Account, CreateTime = DateTime.Now }; list.Add(sysRelevance); } //在事务中处理 var result = Context.Ado.UseTran(() => { //更新角色信息 Context.Updateable(role).UpdateColumns(t => new { t.Name, t.UpdateBy, t.Status, t.UpdateTime }).ExecuteCommand(); //删除角色对应的所有组织 Context.Deleteable<SysRelevance>(t => t.FirstId == role.Id && t.RelKey == Define.ROLEORG).ExecuteCommand(); //新增角色对应的所有组织 Context.Insertable(list).ExecuteCommand(); }); if (result.IsSuccess == false) { return response.ResponseError(result.ErrorMessage); } return response; }); } /// <summary> /// 删除 /// </summary> /// <param name="ids">角色删除id</param> /// <returns></returns> [HttpPost] public dynamic DelById(int[] ids) { return ExceptionsHelp.Instance.ExecuteT(() => { var response = new Response(); if (ids.Length == 0) { return response.ResponseError("请选择角色!"); } ClearRedis(ids); //删除角色组织 Context.Deleteable<SysRelevance>(t => t.RelKey == Define.ROLEORG && ids.Contains(t.FirstId.Value)).AddQueue(); //删除角色模块 Context.Deleteable<SysRelevance>(t => t.RelKey == Define.ROLEMODULE && ids.Contains(t.FirstId.Value)).AddQueue(); //删除角色菜单 Context.Deleteable<SysRelevance>(t => t.RelKey == Define.ROLEELEMENT && ids.Contains(t.FirstId.Value)).AddQueue(); //删除用户角色 Context.Deleteable<SysRelevance>(t => t.RelKey == Define.USERROLE && ids.Contains(t.SecondId.Value)).AddQueue(); //删除角色 Context.Deleteable<SysRole>(t => ids.Contains(t.Id)).AddQueue(); if (ExecuteQueues(Context) <= 0) { return response.ResponseError(SystemVariable.dataActionError); } return response; }); } /// <summary> /// 清除角色对应的用户的授权redis缓存 /// </summary> /// <param name="roleIds">角色id数组</param> private void ClearRedis(int[] roleIds) { //根据角色找到对应的用户id var userIdList = Context.Queryable<SysRelevance>() .Where(t => t.RelKey == Define.USERROLE && roleIds.Contains(t.SecondId.Value)) .Select(t => t.FirstId).ToList(); //根据用户id找到用户账号 var accountList = Context.Queryable<SysUser>() .Where(t => userIdList.Contains(t.Id)) .Select(t => t.Account).ToList(); foreach (var item in accountList) { _cache.Remove(item); } } } }