SysRoleService.cs 12 KB

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