SysRoleService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. using Infrastructure;
  2. using Infrastructure.Attribute;
  3. using System.Collections;
  4. using ZR.Model;
  5. using ZR.Model.System;
  6. using ZR.Model.System.Dto;
  7. using ZR.Repository;
  8. namespace ZR.ServiceCore.Services
  9. {
  10. /// <summary>
  11. /// 角色
  12. /// </summary>
  13. [AppService(ServiceType = typeof(ISysRoleService), ServiceLifetime = LifeTime.Transient)]
  14. public class SysRoleService : BaseService<SysRole>, ISysRoleService
  15. {
  16. private ISysUserRoleService SysUserRoleService;
  17. private ISysDeptService DeptService;
  18. private ISysRoleMenuService RoleMenuService;
  19. public SysRoleService(
  20. ISysUserRoleService sysUserRoleService,
  21. ISysDeptService deptService,
  22. ISysRoleMenuService roleMenuService)
  23. {
  24. SysUserRoleService = sysUserRoleService;
  25. DeptService = deptService;
  26. RoleMenuService = roleMenuService;
  27. }
  28. /// <summary>
  29. /// 根据条件分页查询角色数据
  30. /// </summary>
  31. /// <param name="sysRole">角色信息</param>
  32. /// <param name="pager">分页信息</param>
  33. /// <returns>角色数据集合信息</returns>
  34. public PagedInfo<SysRole> SelectRoleList(SysRole sysRole, PagerInfo pager)
  35. {
  36. var exp = Expressionable.Create<SysRole>();
  37. exp.And(role => role.DelFlag == 0);
  38. exp.AndIF(!string.IsNullOrEmpty(sysRole.RoleName), role => role.RoleName.Contains(sysRole.RoleName));
  39. exp.AndIF(sysRole.Status != -1, role => role.Status == sysRole.Status);
  40. exp.AndIF(!string.IsNullOrEmpty(sysRole.RoleKey), role => role.RoleKey == sysRole.RoleKey);
  41. var query = Queryable()
  42. .Where(exp.ToExpression())
  43. .OrderBy(x => x.RoleSort)
  44. .Select((role) => new SysRole
  45. {
  46. UserNum = SqlFunc.Subqueryable<SysUserRole>().Where(f => f.RoleId == role.RoleId).Count()
  47. }, true);
  48. return query.ToPage(pager);
  49. }
  50. /// <summary>
  51. /// 查询所有角色
  52. /// </summary>
  53. /// <returns></returns>
  54. public List<SysRole> SelectRoleAll()
  55. {
  56. return Queryable()
  57. .Where(role => role.DelFlag == 0)
  58. .OrderBy(role => role.RoleSort)
  59. .ToList();
  60. }
  61. /// <summary>
  62. /// 根据用户查询
  63. /// </summary>
  64. /// <param name="userId"></param>
  65. /// <returns></returns>
  66. public List<SysRole> SelectRolePermissionByUserId(long userId)
  67. {
  68. return Queryable()
  69. .Where(role => role.DelFlag == 0)
  70. .Where(it => SqlFunc.Subqueryable<SysUserRole>().Where(s => s.UserId == userId).Any())
  71. .OrderBy(role => role.RoleSort)
  72. .ToList();
  73. }
  74. /// <summary>
  75. /// 通过角色ID查询角色
  76. /// </summary>
  77. /// <param name="roleId">角色ID</param>
  78. /// <returns>角色对象信息</returns>
  79. public SysRole SelectRoleById(long roleId)
  80. {
  81. return GetId(roleId);
  82. }
  83. /// <summary>
  84. /// 批量删除角色信息
  85. /// </summary>
  86. /// <param name="roleIds">需要删除的角色ID</param>
  87. /// <returns></returns>
  88. public int DeleteRoleByRoleId(long[] roleIds)
  89. {
  90. foreach (var item in roleIds)
  91. {
  92. CheckRoleAllowed(new SysRole(item));
  93. SysRole role = SelectRoleById(item);
  94. if (SysUserRoleService.CountUserRoleByRoleId(item) > 0)
  95. {
  96. throw new CustomException($"{role.RoleName}已分配,不能删除");
  97. }
  98. }
  99. return Delete(roleIds);
  100. }
  101. /// <summary>
  102. /// 更改角色权限状态
  103. /// </summary>
  104. /// <param name="roleDto"></param>
  105. /// <returns></returns>
  106. public int UpdateRoleStatus(SysRole roleDto)
  107. {
  108. return Update(roleDto, it => new { it.Status }, f => f.RoleId == roleDto.RoleId);
  109. }
  110. /// <summary>
  111. /// 校验角色权限是否唯一
  112. /// </summary>
  113. /// <param name="sysRole">角色信息</param>
  114. /// <returns></returns>
  115. public string CheckRoleKeyUnique(SysRole sysRole)
  116. {
  117. long roleId = 0 == sysRole.RoleId ? -1L : sysRole.RoleId;
  118. SysRole info = GetFirst(it => it.RoleKey == sysRole.RoleKey);
  119. if (info != null && info.RoleId != roleId)
  120. {
  121. return UserConstants.NOT_UNIQUE;
  122. }
  123. return UserConstants.UNIQUE;
  124. }
  125. /// <summary>
  126. /// 校验角色是否允许操作
  127. /// </summary>
  128. /// <param name="role"></param>
  129. public void CheckRoleAllowed(SysRole role)
  130. {
  131. if (IsRoleAdmin(role.RoleId))
  132. {
  133. throw new CustomException("不允许操作超级管理员角色");
  134. }
  135. }
  136. /// <summary>
  137. /// 新增保存角色信息
  138. /// </summary>
  139. /// <param name="sysRole">角色信息</param>
  140. /// <returns></returns>
  141. public long InsertRole(SysRole sysRole)
  142. {
  143. sysRole.Create_time = DateTime.Now;
  144. sysRole.RoleId = InsertReturnBigIdentity(sysRole);
  145. //插入角色部门数据
  146. DeptService.InsertRoleDepts(sysRole);
  147. return sysRole.RoleId;
  148. }
  149. /// <summary>
  150. /// 通过角色ID删除角色和菜单关联
  151. /// </summary>
  152. /// <param name="roleId">角色ID</param>
  153. /// <returns></returns>
  154. public int DeleteRoleMenuByRoleId(long roleId)
  155. {
  156. return RoleMenuService.DeleteRoleMenuByRoleId(roleId);
  157. }
  158. /// <summary>
  159. /// 修改数据权限信息
  160. /// </summary>
  161. /// <param name="sysRoleDto"></param>
  162. /// <returns></returns>
  163. public bool AuthDataScope(SysRoleDto sysRoleDto)
  164. {
  165. var result = UseTran(() =>
  166. {
  167. //删除角色菜单
  168. //DeleteRoleMenuByRoleId(sysRoleDto.RoleId);
  169. //InsertRoleMenu(sysRoleDto);
  170. var oldMenus = SelectUserRoleMenus(sysRoleDto.RoleId);
  171. var newMenus = sysRoleDto.MenuIds;
  172. //并集菜单
  173. var arr_c = oldMenus.Intersect(newMenus).ToArray();
  174. //获取减量菜单
  175. var delMenuIds = oldMenus.Where(c => !arr_c.Contains(c)).ToArray();
  176. //获取增量
  177. var addMenuIds = newMenus.Where(c => !arr_c.Contains(c)).ToArray();
  178. RoleMenuService.DeleteRoleMenuByRoleIdMenuIds(sysRoleDto.RoleId, delMenuIds);
  179. sysRoleDto.MenuIds = [.. addMenuIds];
  180. sysRoleDto.DelMenuIds = [.. delMenuIds];
  181. InsertRoleMenu(sysRoleDto);
  182. Console.WriteLine($"减少了{delMenuIds.Length},增加了{addMenuIds.Length}菜单");
  183. });
  184. return result.IsSuccess;
  185. }
  186. #region Service
  187. /// <summary>
  188. /// 批量新增角色菜单信息
  189. /// </summary>
  190. /// <param name="sysRoleDto"></param>
  191. /// <returns></returns>
  192. public int InsertRoleMenu(SysRoleDto sysRoleDto)
  193. {
  194. int rows = 1;
  195. // 新增用户与角色管理
  196. List<SysRoleMenu> sysRoleMenus = new();
  197. foreach (var item in sysRoleDto.MenuIds)
  198. {
  199. SysRoleMenu rm = new()
  200. {
  201. Menu_id = item,
  202. Role_id = sysRoleDto.RoleId,
  203. Create_by = sysRoleDto.Create_by,
  204. Create_time = DateTime.Now
  205. };
  206. sysRoleMenus.Add(rm);
  207. }
  208. //添加角色菜单
  209. if (sysRoleMenus.Count > 0)
  210. {
  211. rows = RoleMenuService.AddRoleMenu(sysRoleMenus);
  212. }
  213. return rows;
  214. }
  215. /// <summary>
  216. /// 判断是否是管理员
  217. /// </summary>
  218. /// <param name="userid"></param>
  219. /// <returns></returns>
  220. public bool IsAdmin(long userid)
  221. {
  222. List<string> roles = SelectUserRoleKeys(userid);
  223. return ((IList)roles).Contains(GlobalConstant.AdminRole);
  224. }
  225. /// <summary>
  226. /// 判断是否是管理员
  227. /// </summary>
  228. /// <param name="roleid"></param>
  229. /// <returns></returns>
  230. public bool IsRoleAdmin(long roleid)
  231. {
  232. var roleInfo = GetFirst(x => x.RoleId == roleid);
  233. return roleInfo.RoleKey == GlobalConstant.AdminRole;
  234. }
  235. /// <summary>
  236. /// 获取角色菜单id集合
  237. /// </summary>
  238. /// <param name="roleId"></param>
  239. /// <returns></returns>
  240. public List<long> SelectUserRoleMenus(long roleId)
  241. {
  242. var list = RoleMenuService.SelectRoleMenuByRoleId(roleId);
  243. return list.Select(x => x.Menu_id).Distinct().ToList();
  244. }
  245. /// <summary>
  246. /// 根据用户所有角色获取菜单
  247. /// </summary>
  248. /// <param name="roleIds"></param>
  249. /// <returns></returns>
  250. public List<long> SelectRoleMenuByRoleIds(long[] roleIds)
  251. {
  252. return RoleMenuService.SelectRoleMenuByRoleIds(roleIds)
  253. .Select(x => x.Menu_id)
  254. .Distinct().ToList();
  255. }
  256. /// <summary>
  257. /// 获取用户角色列表
  258. /// </summary>
  259. /// <param name="userId"></param>
  260. /// <returns></returns>
  261. public List<SysRole> SelectUserRoleListByUserId(long userId)
  262. {
  263. return Context.Queryable<SysUserRole>()
  264. .LeftJoin<SysRole>((ur, r) => ur.RoleId == r.RoleId)
  265. .Where((ur, r) => ur.UserId == userId && r.RoleId > 0)
  266. .WithCache(60 * 10)
  267. .Select((ur, r) => r)
  268. .ToList();
  269. }
  270. /// <summary>
  271. /// 获取用户权限集合
  272. /// </summary>
  273. /// <param name="userId"></param>
  274. /// <returns></returns>
  275. public List<long> SelectUserRoles(long userId)
  276. {
  277. var list = SelectUserRoleListByUserId(userId).Where(f => f.Status == 0);
  278. return list.Select(x => x.RoleId).ToList();
  279. }
  280. /// <summary>
  281. /// 获取用户权限字符串集合
  282. /// </summary>
  283. /// <param name="userId"></param>
  284. /// <returns></returns>
  285. public List<string> SelectUserRoleKeys(long userId)
  286. {
  287. var list = SelectUserRoleListByUserId(userId);
  288. return list.Select(x => x.RoleKey).ToList();
  289. }
  290. /// <summary>
  291. /// 获取用户所有角色名
  292. /// </summary>
  293. /// <param name="userId"></param>
  294. /// <returns></returns>
  295. public List<string> SelectUserRoleNames(long userId)
  296. {
  297. var list = SelectUserRoleListByUserId(userId);
  298. return list.Select(x => x.RoleName).ToList();
  299. }
  300. #endregion
  301. /// <summary>
  302. /// 修改保存角色信息
  303. /// </summary>
  304. /// <param name="sysRole">角色信息</param>
  305. /// <returns></returns>
  306. public int UpdateRole(SysRole sysRole)
  307. {
  308. var result = UseTran(() =>
  309. {
  310. //修改角色信息
  311. UpdateSysRole(sysRole);
  312. //删除角色与部门管理
  313. DeptService.DeleteRoleDeptByRoleId(sysRole.RoleId);
  314. //插入角色部门数据
  315. DeptService.InsertRoleDepts(sysRole);
  316. });
  317. return result.IsSuccess ? 1 : 0;
  318. }
  319. /// <summary>
  320. /// 修改用户角色
  321. /// </summary>
  322. /// <param name="sysRole"></param>
  323. /// <returns></returns>
  324. public int UpdateSysRole(SysRole sysRole)
  325. {
  326. var db = Context;
  327. sysRole.Update_time = db.GetDate();
  328. return db.Updateable<SysRole>()
  329. .SetColumns(it => it.Update_time == sysRole.Update_time)
  330. .SetColumns(it => it.DataScope == sysRole.DataScope)
  331. .SetColumns(it => it.Remark == sysRole.Remark)
  332. .SetColumns(it => it.Update_by == sysRole.Update_by)
  333. //.SetColumns(it => it.MenuCheckStrictly == sysRole.MenuCheckStrictly)
  334. .SetColumns(it => it.DeptCheckStrictly == sysRole.DeptCheckStrictly)
  335. .SetColumnsIF(!string.IsNullOrEmpty(sysRole.RoleName), it => it.RoleName == sysRole.RoleName)
  336. .SetColumnsIF(!string.IsNullOrEmpty(sysRole.RoleKey), it => it.RoleKey == sysRole.RoleKey)
  337. .SetColumnsIF(sysRole.RoleSort >= 0, it => it.RoleSort == sysRole.RoleSort)
  338. .Where(it => it.RoleId == sysRole.RoleId)
  339. .ExecuteCommand();
  340. }
  341. }
  342. }