平安校园
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

578 righe
25 KiB

  1. namespace SafeCampus.System;
  2. /// <inheritdoc cref="ISysRoleService"/>
  3. //[Injection(Proxy = typeof(GlobalDispatchProxy))]
  4. public class SysRoleService : DbRepository<SysRole>, ISysRoleService
  5. {
  6. private readonly ILogger<SysRoleService> _logger;
  7. private readonly ISimpleCacheService _simpleCacheService;
  8. private readonly IRelationService _relationService;
  9. private readonly ISysOrgService _sysOrgService;
  10. private readonly IResourceService _resourceService;
  11. private readonly IEventPublisher _eventPublisher;
  12. public SysRoleService(ILogger<SysRoleService> logger, ISimpleCacheService simpleCacheService, IRelationService relationService,
  13. ISysOrgService sysOrgService, IResourceService resourceService, IEventPublisher eventPublisher)
  14. {
  15. _logger = logger;
  16. _simpleCacheService = simpleCacheService;
  17. _relationService = relationService;
  18. _sysOrgService = sysOrgService;
  19. _resourceService = resourceService;
  20. _eventPublisher = eventPublisher;
  21. }
  22. #region 查询
  23. /// <summary>
  24. /// 获取所有
  25. /// </summary>
  26. /// <returns></returns>
  27. public override async Task<List<SysRole>> GetListAsync()
  28. {
  29. //先从Redis拿
  30. var sysRoles = _simpleCacheService.Get<List<SysRole>>(SystemConst.CACHE_SYS_ROLE);
  31. if (sysRoles == null)
  32. {
  33. //redis没有就去数据库拿
  34. sysRoles = await base.GetListAsync();
  35. if (sysRoles.Count > 0)
  36. {
  37. //插入Redis
  38. _simpleCacheService.Set(SystemConst.CACHE_SYS_ROLE, sysRoles);
  39. }
  40. }
  41. return sysRoles;
  42. }
  43. /// <inheritdoc/>
  44. public async Task<List<SysRole>> GetRoleListByUserId(long userId)
  45. {
  46. var cods = new List<SysRole>();//角色代码集合
  47. var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID
  48. var roleIdList = roleList.Select(x => x.TargetId.ToLong()).ToList();//角色ID列表
  49. if (roleIdList.Count > 0)
  50. {
  51. cods = await GetListAsync(it => roleIdList.Contains(it.Id));
  52. }
  53. return cods;
  54. }
  55. /// <inheritdoc/>
  56. public async Task<SqlSugarPagedList<SysRole>> Page(RolePageInput input)
  57. {
  58. var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构
  59. var query = Context.Queryable<SysRole>()
  60. .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId.Value))//根据组织
  61. .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.OrgId.Value))//数据权限
  62. .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类
  63. .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询
  64. .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}").OrderBy(it => it.SortCode);//排序
  65. var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页
  66. return pageInfo;
  67. }
  68. /// <inheritdoc/>
  69. public async Task<List<RoleTreeOutput>> Tree(RoleTreeInput input)
  70. {
  71. var result = new List<RoleTreeOutput>();//返回结果
  72. var sysOrgList = await _sysOrgService.GetListAsync(false);//获取所有机构
  73. var sysRoles = await GetListAsync();//获取所有角色
  74. if (input.OrgIds != null)//根据数据范围查
  75. {
  76. sysOrgList = sysOrgList.Where(it => input.OrgIds.Contains(it.Id)).ToList();//在指定组织列表查询
  77. sysRoles = sysRoles.Where(it => input.OrgIds.Contains(it.OrgId.GetValueOrDefault())).ToList();//在指定职位列表查询
  78. }
  79. var topOrgList = sysOrgList.Where(it => it.ParentId == 0).ToList();//获取顶级机构
  80. var globalRole = sysRoles.Where(it => it.Category == CateGoryConst.ROLE_GLOBAL).ToList();//获取全局角色
  81. if (globalRole.Count > 0)
  82. {
  83. result.Add(new RoleTreeOutput()
  84. {
  85. Id = CommonUtils.GetSingleId(),
  86. Name = "全局角色",
  87. Children = globalRole.Select(it => new RoleTreeOutput
  88. {
  89. Id = it.Id,
  90. Name = it.Name,
  91. IsRole = true
  92. }).ToList()
  93. });//添加全局角色
  94. }
  95. //遍历顶级机构
  96. foreach (var org in topOrgList)
  97. {
  98. var childIds = await _sysOrgService.GetOrgChildIds(org.Id, true, sysOrgList);//获取机构下的所有子级ID
  99. var childRoles = sysRoles.Where(it => it.OrgId != null && childIds.Contains(it.OrgId.Value)).ToList();//获取机构下的所有角色
  100. if (childRoles.Count == 0)
  101. continue;
  102. var roleTreeOutput = new RoleTreeOutput
  103. {
  104. Id = org.Id,
  105. Name = org.Name,
  106. IsRole = false
  107. };//实例化角色树
  108. childRoles.ForEach(it =>
  109. {
  110. roleTreeOutput.Children.Add(new RoleTreeOutput()
  111. {
  112. Id = it.Id,
  113. Name = it.Name,
  114. IsRole = true
  115. });
  116. });
  117. result.Add(roleTreeOutput);
  118. }
  119. return result;
  120. }
  121. /// <inheritdoc />
  122. public async Task<RoleOwnResourceOutput> OwnResource(BaseIdInput input, string category)
  123. {
  124. var roleOwnResource = new RoleOwnResourceOutput { Id = input.Id };//定义结果集
  125. var grantInfoList = new List<RelationRoleResource>();//已授权信息集合
  126. //获取关系列表
  127. var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, category);
  128. //遍历关系表
  129. relations.ForEach(it =>
  130. {
  131. //将扩展信息转为实体
  132. var relationRole = it.ExtJson.ToJsonEntity<RelationRoleResource>();
  133. grantInfoList.Add(relationRole);//添加到已授权信息
  134. });
  135. roleOwnResource.GrantInfoList = grantInfoList;//赋值已授权信息
  136. return roleOwnResource;
  137. }
  138. /// <inheritdoc />
  139. public async Task<RoleOwnPermissionOutput> OwnPermission(BaseIdInput input)
  140. {
  141. var roleOwnPermission = new RoleOwnPermissionOutput { Id = input.Id };//定义结果集
  142. var grantInfoList = new List<RelationRolePermission>();//已授权信息集合
  143. //获取关系列表
  144. var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);
  145. //遍历关系表
  146. relations.ForEach(it =>
  147. {
  148. //将扩展信息转为实体
  149. var relationPermission = it.ExtJson.ToJsonEntity<RelationRolePermission>();
  150. grantInfoList.Add(relationPermission);//添加到已授权信息
  151. });
  152. roleOwnPermission.GrantInfoList = grantInfoList;//赋值已授权信息
  153. return roleOwnPermission;
  154. }
  155. /// <inheritdoc />
  156. public async Task<List<UserSelectorOutPut>> OwnUser(BaseIdInput input)
  157. {
  158. //获取关系列表
  159. var relations = await _relationService.GetRelationListByTargetIdAndCategory(input.Id.ToString(), CateGoryConst.RELATION_SYS_USER_HAS_ROLE);
  160. var userIds = relations.Select(it => it.ObjectId).ToList();
  161. var userList = await Context.Queryable<SysUser>().Where(it => userIds.Contains(it.Id)).Select<UserSelectorOutPut>().ToListAsync();
  162. return userList;
  163. }
  164. /// <inheritdoc />
  165. public async Task<SqlSugarPagedList<RoleSelectorOutPut>> RoleSelector(RoleSelectorInput input)
  166. {
  167. var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级组织
  168. //如果机构ID列表不为空
  169. if (input.OrgIds != null)
  170. {
  171. orgIds = orgIds.Where(it => input.OrgIds.Contains(it)).ToList();//包含在机构ID列表中的组织ID
  172. }
  173. var result = await Context.Queryable<SysRole>()
  174. .WhereIF(input.OrgId == 0, it => it.Category == CateGoryConst.ROLE_GLOBAL)//不传机构ID就是全局角色
  175. .WhereIF(orgIds.Count > 0, it => orgIds.Contains(it.OrgId.Value))//组织ID
  176. .WhereIF(!string.IsNullOrEmpty(input.Name), it => it.Name.Contains(input.Name))//根据关键字查询
  177. .Select<RoleSelectorOutPut>()
  178. .ToPagedListAsync(input.PageNum, input.PageSize);
  179. return result;
  180. }
  181. /// <inheritdoc />
  182. public async Task<List<string>> RolePermissionTreeSelector(BaseIdInput input)
  183. {
  184. var permissionTreeSelectors = new List<string>();//授权树结果集
  185. //获取单页信息
  186. var spa = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_SPA);
  187. var spaIds = spa.Select(it => it.Id).ToList();
  188. if (spaIds.Any())
  189. {
  190. //获取权限授权树
  191. var permissions = _resourceService.PermissionTreeSelector(spa.Select(it => it.Path).ToList());
  192. if (permissions.Count > 0)
  193. permissionTreeSelectors.AddRange(permissions.Select(it => it.PermissionName).ToList());//返回授权树权限名称列表
  194. }
  195. //获取角色资源关系
  196. var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);
  197. var menuIds = relationsRes.Where(it => it.ObjectId == input.Id).Select(it => it.TargetId.ToLong()).ToList();
  198. if (menuIds.Any())
  199. {
  200. //获取菜单信息
  201. var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU);
  202. //获取权限授权树
  203. var menusPath = menus.Select(it => it.Path).ToList();
  204. var permissions = _resourceService.PermissionTreeSelector(menusPath);
  205. if (permissions.Count > 0)
  206. permissionTreeSelectors.AddRange(permissions.Select(it => it.PermissionName).ToList());//返回授权树权限名称列表
  207. }
  208. return permissionTreeSelectors;
  209. }
  210. /// <inheritdoc />
  211. public async Task<List<SysRole>> GetRoleListByIdList(IdListInput input)
  212. {
  213. var roles = await GetListAsync();
  214. var roleList = roles.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表
  215. return roleList;
  216. }
  217. /// <inheritdoc />
  218. public async Task<SysRole> Detail(BaseIdInput input)
  219. {
  220. var roles = await GetListAsync();
  221. var role = roles.Where(it => it.Id == input.Id).FirstOrDefault();
  222. return role;
  223. }
  224. #endregion
  225. #region 新增
  226. /// <inheritdoc />
  227. public async Task Add(RoleAddInput input)
  228. {
  229. await CheckInput(input);//检查参数
  230. var sysRole = input.Adapt<SysRole>();//实体转换
  231. if (await InsertAsync(sysRole))//插入数据
  232. await RefreshCache();//刷新缓存
  233. }
  234. #endregion
  235. #region 编辑
  236. /// <inheritdoc />
  237. public async Task Edit(RoleEditInput input)
  238. {
  239. //判断是否超管
  240. if (input.Code == SysRoleConst.SUPER_ADMIN)
  241. throw Oops.Bah("不可编辑超管角色");
  242. await CheckInput(input);//检查参数
  243. var role = await GetFirstAsync(it => it.Id == input.Id);//获取角色
  244. if (role != null)
  245. {
  246. var permissions = new List<SysRelation>();
  247. //如果改了默认数据权限
  248. if (role.DefaultDataScope.ScopeCategory != input.DefaultDataScope.ScopeCategory)
  249. {
  250. //获取角色授权列表
  251. var relations = await _relationService.GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);
  252. //找到当前角色的
  253. permissions = relations.Where(it => it.ObjectId == input.Id).ToList();
  254. permissions.ForEach(it =>
  255. {
  256. var rolePermission = it.ExtJson.ToJsonEntity<RelationRolePermission>();//扩展信息转实体
  257. //如果表里的数据范围是默认数据范围才更新,已经自定义了的数据范围不更新
  258. if (rolePermission.ScopeCategory == role.DefaultDataScope.ScopeCategory
  259. && Enumerable.SequenceEqual(rolePermission.ScopeDefineOrgIdList, role.DefaultDataScope.ScopeDefineOrgIdList))
  260. {
  261. //重新赋值数据范围
  262. rolePermission.ScopeCategory = input.DefaultDataScope.ScopeCategory;
  263. rolePermission.ScopeDefineOrgIdList = input.DefaultDataScope.ScopeDefineOrgIdList;
  264. it.ExtJson = rolePermission.ToJson();
  265. }
  266. });
  267. }
  268. var sysRole = input.Adapt<SysRole>();//实体转换
  269. //事务
  270. var result = await Tenant.UseTranAsync(async () =>
  271. {
  272. await UpdateAsync(sysRole);//更新角色
  273. if (permissions.Any())//如果有授权权限就更新
  274. await Context.Updateable(permissions).ExecuteCommandAsync();
  275. });
  276. if (result.IsSuccess)//如果成功了
  277. {
  278. await RefreshCache();//刷新缓存
  279. if (permissions.Any())//如果有授权
  280. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);//关系表刷新SYS_ROLE_HAS_PERMISSION缓存
  281. await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List<long> { input.Id });//清除角色下用户缓存
  282. }
  283. else
  284. {
  285. //写日志
  286. _logger.LogError(result.ErrorMessage, result.ErrorException);
  287. throw Oops.Oh(ErrorCodeEnum.A0002);
  288. }
  289. }
  290. }
  291. /// <inheritdoc />
  292. public async Task GrantResource(GrantResourceInput input)
  293. {
  294. var allMenus = await _resourceService.GetListByCategory(SysResourceConst.MENU);//获取所有菜单
  295. var spas = await _resourceService.GetListByCategory(SysResourceConst.SPA);
  296. var menuIds = input.GrantInfoList.Select(it => it.MenuId).ToList();//菜单ID
  297. var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息
  298. var relationRoles = new List<SysRelation>();//要添加的角色资源和授权关系表
  299. var sysRole = (await GetListAsync()).Where(it => it.Id == input.Id).FirstOrDefault();//获取角色
  300. if (sysRole != null)
  301. {
  302. #region 角色模块处理
  303. var menusList = allMenus.Where(it => menuIds.Contains(it.Id)).ToList();//获取菜单信息
  304. //获取我的模块信息Id列表
  305. var moduleIds = menusList.Select(it => it.Module.Value).Distinct().ToList();
  306. moduleIds.ForEach(it =>
  307. {
  308. //将角色资源添加到列表
  309. relationRoles.Add(new SysRelation
  310. {
  311. ObjectId = sysRole.Id,
  312. TargetId = it.ToString(),
  313. Category = CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE
  314. });
  315. });
  316. #endregion 角色模块处理
  317. #region 角色资源处理
  318. //遍历菜单列表
  319. for (var i = 0; i < menuIds.Count; i++)
  320. {
  321. //将角色资源添加到列表
  322. relationRoles.Add(new SysRelation
  323. {
  324. ObjectId = sysRole.Id,
  325. TargetId = menuIds[i].ToString(),
  326. Category = CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE,
  327. ExtJson = extJsons?[i]
  328. });
  329. }
  330. #endregion 角色资源处理
  331. #region 角色权限处理.
  332. var relationRolePer = new List<SysRelation>();//要添加的角色有哪些权限列表
  333. var defaultDataScope = sysRole.DefaultDataScope;//获取默认数据范围
  334. //获取菜单信息
  335. var menus = allMenus.Where(it => menuIds.Contains(it.Id)).ToList();
  336. menus.AddRange(spas);//单页id添加到列表
  337. if (menus.Count > 0)
  338. {
  339. //获取权限授权树
  340. var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList());
  341. permissions.ForEach(it =>
  342. {
  343. //新建角色权限关系
  344. relationRolePer.Add(new SysRelation
  345. {
  346. ObjectId = sysRole.Id,
  347. TargetId = it.ApiRoute,
  348. Category = CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION,
  349. ExtJson = new RelationRolePermission
  350. {
  351. ApiUrl = it.ApiRoute,
  352. ScopeCategory = defaultDataScope.ScopeCategory,
  353. ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList
  354. }.ToJson()
  355. });
  356. });
  357. }
  358. relationRoles.AddRange(relationRolePer);//合并列表
  359. #endregion 角色权限处理.
  360. #region 保存数据库
  361. //事务
  362. var result = await Tenant.UseTranAsync(async () =>
  363. {
  364. var relationRep = ChangeRepository<DbRepository<SysRelation>>();//切换仓储
  365. //如果不是代码生成,就删除老的
  366. if (!input.IsCodeGen)
  367. await relationRep.DeleteAsync(it => it.ObjectId == sysRole.Id && (it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION
  368. || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE
  369. || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE));
  370. await relationRep.InsertRangeAsync(relationRoles);//添加新的
  371. });
  372. if (result.IsSuccess)//如果成功了
  373. {
  374. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存
  375. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//刷新关系缓存
  376. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存
  377. await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List<long> { input.Id });//发送事件清除角色下用户缓存
  378. }
  379. else
  380. {
  381. //写日志
  382. _logger.LogError(result.ErrorMessage, result.ErrorException);
  383. throw Oops.Oh(ErrorCodeEnum.A0003);
  384. }
  385. #endregion 保存数据库
  386. }
  387. }
  388. /// <inheritdoc />
  389. public async Task GrantPermission(GrantPermissionInput input)
  390. {
  391. var sysRole = (await GetListAsync()).Where(it => it.Id == input.Id).FirstOrDefault();//获取角色
  392. if (sysRole != null)
  393. {
  394. var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiUrl列表
  395. var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息
  396. await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION, input.Id, apiUrls, extJsons,
  397. true);//添加到数据库
  398. await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List<long> { input.Id });//清除角色下用户缓存
  399. }
  400. }
  401. /// <inheritdoc />
  402. public async Task GrantUser(GrantUserInput input)
  403. {
  404. var sysRelations = new List<SysRelation>();//关系列表
  405. //遍历用户ID
  406. input.GrantInfoList.ForEach(it =>
  407. {
  408. sysRelations.Add(new SysRelation
  409. {
  410. ObjectId = it,
  411. TargetId = input.Id.ToString(),
  412. Category = CateGoryConst.RELATION_SYS_USER_HAS_ROLE
  413. });
  414. });
  415. //事务
  416. var result = await Tenant.UseTranAsync(async () =>
  417. {
  418. var relationRep = ChangeRepository<DbRepository<SysRelation>>();//切换仓储
  419. var targetId = input.Id.ToString();//目标ID转string
  420. await relationRep.DeleteAsync(it => it.TargetId == targetId && it.Category == CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//删除老的
  421. await relationRep.InsertRangeAsync(sysRelations);//添加新的
  422. });
  423. if (result.IsSuccess)//如果成功了
  424. {
  425. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//刷新关系表SYS_USER_HAS_ROLE缓存
  426. await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List<long> { input.Id });//清除角色下用户缓存
  427. }
  428. else
  429. {
  430. //写日志
  431. _logger.LogError(result.ErrorMessage, result.ErrorException);
  432. throw Oops.Oh(ErrorCodeEnum.A0003);
  433. }
  434. }
  435. #endregion
  436. #region 删除
  437. /// <inheritdoc />
  438. public async Task Delete(BaseIdListInput input)
  439. {
  440. //获取所有ID
  441. var ids = input.Ids;
  442. if (ids.Count > 0)
  443. {
  444. var sysRoles = await GetListAsync();//获取所有角色
  445. var hasSuperAdmin = sysRoles.Any(it => it.Code == SysRoleConst.SUPER_ADMIN && ids.Contains(it.Id));//判断是否有超级管理员
  446. if (hasSuperAdmin) throw Oops.Bah("不可删除系统内置超管角色");
  447. //数据库是string所以这里转下
  448. var targetIds = ids.Select(it => it.ToString()).ToList();
  449. //定义删除的关系
  450. var delRelations = new List<string>
  451. {
  452. CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE,
  453. CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION,
  454. CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE
  455. };
  456. //事务
  457. var result = await Tenant.UseTranAsync(async () =>
  458. {
  459. await DeleteByIdsAsync(ids.Cast<object>().ToArray());//删除按钮
  460. var relationRep = ChangeRepository<DbRepository<SysRelation>>();//切换仓储
  461. //删除关系表角色与资源关系,角色与权限关系
  462. await relationRep.DeleteAsync(it => ids.Contains(it.ObjectId) && delRelations.Contains(it.Category));
  463. //删除关系表角色与用户关系
  464. await relationRep.DeleteAsync(it => targetIds.Contains(it.TargetId) && it.Category == CateGoryConst.RELATION_SYS_USER_HAS_ROLE);
  465. });
  466. if (result.IsSuccess)//如果成功了
  467. {
  468. await RefreshCache();//刷新缓存
  469. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存
  470. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新Relation_SYS_ROLE_HAS_RESOURCE缓存
  471. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);//关系表刷新Relation_SYS_ROLE_HAS_PERMISSION缓存
  472. await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//关系表刷新RELATION_SYS_ROLE_HAS_MODULE缓存
  473. await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, ids);//清除角色下用户缓存
  474. }
  475. else
  476. {
  477. //写日志
  478. _logger.LogError(result.ErrorMessage, result.ErrorException);
  479. throw Oops.Oh(ErrorCodeEnum.A0002);
  480. }
  481. }
  482. }
  483. /// <inheritdoc />
  484. public async Task RefreshCache()
  485. {
  486. _simpleCacheService.Remove(SystemConst.CACHE_SYS_ROLE);//删除KEY
  487. await GetListAsync();//重新缓存
  488. }
  489. #endregion
  490. #region 方法
  491. /// <summary>
  492. /// 检查输入参数
  493. /// </summary>
  494. /// <param name="sysRole"></param>
  495. private async Task CheckInput(SysRole sysRole)
  496. {
  497. //判断分类
  498. if (sysRole.Category != CateGoryConst.ROLE_GLOBAL && sysRole.Category != CateGoryConst.ROLE_ORG)
  499. throw Oops.Bah($"角色所属分类错误:{sysRole.Category}");
  500. //如果是机构角色orgId不能为空
  501. if (sysRole is { Category: CateGoryConst.ROLE_ORG, OrgId: null })
  502. throw Oops.Bah("orgId不能为空");
  503. if (sysRole.Category == CateGoryConst.ROLE_GLOBAL)//如果是全局
  504. sysRole.OrgId = null;//机构id设null
  505. var sysRoles = await GetListAsync();//获取所有
  506. var repeatName = sysRoles.Any(it => it.OrgId == sysRole.OrgId && it.Name == sysRole.Name && it.Id != sysRole.Id);//是否有重复角色名称
  507. if (repeatName)//如果有
  508. {
  509. if (sysRole.OrgId == null)
  510. throw Oops.Bah($"存在重复的全局角色:{sysRole.Name}");
  511. throw Oops.Bah($"同组织下存在重复的角色:{sysRole.Name}");
  512. }
  513. //如果code没填
  514. if (string.IsNullOrEmpty(sysRole.Code))
  515. {
  516. sysRole.Code = RandomHelper.CreateRandomString(10);//赋值Code
  517. }
  518. else
  519. {
  520. //判断是否有相同的Code
  521. if (sysRoles.Any(it => it.Code == sysRole.Code && it.Id != sysRole.Id))
  522. throw Oops.Bah($"存在重复的编码:{sysRole.Code}");
  523. }
  524. }
  525. #endregion 方法
  526. }