UserRoleServiceImpl.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707
  1. package com.crm.manager.service.impl;
  2. import com.crm.manager.dao.mapper.UserRoleMapper;
  3. import com.crm.manager.service.*;
  4. import com.crm.rely.backend.core.constant.ManagerConstant;
  5. import com.crm.manager.dao.repository.SysActionRepository;
  6. import com.crm.manager.dao.repository.UserRoleRepository;
  7. import com.crm.rely.backend.core.dto.user.role.UserActionDisplayDto;
  8. import com.crm.rely.backend.core.dto.user.role.UserAllRoleDto;
  9. import com.crm.rely.backend.core.dto.user.role.UserNodeDisplayDto;
  10. import com.crm.rely.backend.core.dto.user.role.UserRoleDto;
  11. import com.crm.rely.backend.core.entity.tenant.info.TenantEntity;
  12. import com.crm.rely.backend.core.entity.user.role.*;
  13. import com.crm.rely.backend.core.pojo.table.*;
  14. import com.crm.rely.backend.core.pojo.view.SysNodeView;
  15. import com.crm.rely.backend.core.constant.Constants;
  16. import com.crm.rely.backend.core.constant.RoleConstants;
  17. import com.crm.rely.backend.core.dto.base.PageDto;
  18. import com.crm.rely.backend.core.dto.base.ResultWithPagerDto;
  19. import com.crm.rely.backend.exception.ServiceException;
  20. import com.crm.rely.backend.service.RedisService;
  21. import com.crm.rely.backend.util.FormatPage;
  22. import com.crm.rely.backend.util.GetRandom;
  23. import com.crm.rely.backend.util.ValidateUtil;
  24. import com.google.common.base.Strings;
  25. import org.apache.commons.collections.CollectionUtils;
  26. import org.springframework.beans.BeanUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.data.domain.Page;
  29. import org.springframework.data.domain.Pageable;
  30. import org.springframework.data.jpa.domain.Specification;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import javax.persistence.criteria.Predicate;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. /**
  37. * @author houn
  38. */
  39. @Service
  40. public class UserRoleServiceImpl implements UserRoleService {
  41. @Autowired
  42. private UserRoleRepository userRoleRepository;
  43. // @Autowired
  44. // private SellerInfoDao sellerInfoDao;
  45. @Autowired
  46. private UserRoleNodeService userRoleNodeService;
  47. @Autowired
  48. private UserRoleDetailService userRoleDetailService;
  49. @Autowired
  50. private SysActionRepository userActionRepository;
  51. @Autowired
  52. private RedisService redisService;
  53. @Autowired
  54. private AuthorityService authorityService;
  55. @Autowired
  56. private UserRoleMapper userRoleMapper;
  57. /**
  58. * 获取角色权限信息
  59. *
  60. * @param roleId
  61. * @return
  62. * @throws ServiceException
  63. */
  64. @Override
  65. public List<UserNodeDisplayDto> getUserNodeDisplay(Long roleId) throws ServiceException {
  66. /*
  67. * 查询服务器中是否已存在角色信息
  68. */
  69. String key = null;
  70. String roleUpdateRedisAuthorityIdentificationKey;
  71. if (roleId == null || roleId == 0) {
  72. key = RoleConstants.ROLE_USER_NODE + RoleConstants.ROLE_ADMIN;
  73. roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + RoleConstants.ROLE_ADMIN;
  74. } else {
  75. key = RoleConstants.ROLE_USER_NODE + roleId;
  76. roleUpdateRedisAuthorityIdentificationKey = Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION + "_" + roleId;
  77. }
  78. //获取更新标识
  79. String updateRedisAuthorityIdentification = redisService.getObject(Constants.UPDATE_REDIS_AUTHORITY_IDENTIFICATION);
  80. if (Strings.isNullOrEmpty(updateRedisAuthorityIdentification)) {
  81. updateRedisAuthorityIdentification = authorityService.updateRedisAuthorityIdentification();
  82. }
  83. //获取角色更新标识
  84. String roleUpdateRedisAuthorityIdentification = redisService.getObject(roleUpdateRedisAuthorityIdentificationKey);
  85. //判断更新标识是否存在 如果不存在或者存在且和角色更新标识相同的话 直接从redis中获取权限
  86. if (!Strings.isNullOrEmpty(roleUpdateRedisAuthorityIdentification) && updateRedisAuthorityIdentification.equals(roleUpdateRedisAuthorityIdentification)) {
  87. if (redisService.hasKey(key)) {
  88. List<UserNodeDisplayDto> userNodeDisplayDtos = redisService.getObject(key);
  89. if (userNodeDisplayDtos.size() != 0) {
  90. return userNodeDisplayDtos;
  91. }
  92. }
  93. }
  94. List<UserNodeDisplayDto> result = updateUserNode(roleId);
  95. //更新角色更新标识
  96. redisService.saveObject(roleUpdateRedisAuthorityIdentificationKey, updateRedisAuthorityIdentification);
  97. return result;
  98. }
  99. /**
  100. * 判断角色是否存在
  101. *
  102. * @param roleId
  103. * @throws ServiceException
  104. */
  105. @Override
  106. public void existRole(Long roleId) throws ServiceException {
  107. boolean existRole = userRoleRepository.existsById(roleId);
  108. if (!existRole) {
  109. throw new ServiceException(ManagerConstant.ROLE_NOT_EXIST_ERROR);
  110. }
  111. }
  112. /**
  113. * 添加角色
  114. *
  115. * @param userRoleAddEntity
  116. * @throws ServiceException
  117. */
  118. @Override
  119. @Transactional(rollbackFor = Exception.class)
  120. public void addRoleInfo(UserRoleAddEntity userRoleAddEntity) throws ServiceException {
  121. if (userRoleRepository.existsByName(userRoleAddEntity.getName())) {
  122. throw new ServiceException("该角色名已存在");
  123. }
  124. UserRoleTable userRoleTable = new UserRoleTable();
  125. BeanUtils.copyProperties(userRoleAddEntity, userRoleTable);
  126. userRoleTable.setNumber(0);
  127. userRoleTable = userRoleRepository.saveAndFlush(userRoleTable);
  128. UserRoleOperateListEntity sellerRoleOperateListEntity = new UserRoleOperateListEntity();
  129. sellerRoleOperateListEntity.setModifyUser(userRoleAddEntity.getAddUser());
  130. sellerRoleOperateListEntity.setModifyTime(userRoleAddEntity.getAddTime());
  131. sellerRoleOperateListEntity.setModifyIp(userRoleAddEntity.getAddIp());
  132. sellerRoleOperateListEntity.setDepartmentId(userRoleAddEntity.getDepartmentId());
  133. sellerRoleOperateListEntity.setRoleId(userRoleTable.getId());
  134. sellerRoleOperateListEntity.setIsMerchantRole(userRoleAddEntity.getIsMerchantRole());
  135. sellerRoleOperateListEntity.setData(userRoleAddEntity.getData());
  136. sellerRoleOperateListEntity.setMerchantId(userRoleAddEntity.getMerchantId());
  137. updateRoleInfo(sellerRoleOperateListEntity);
  138. }
  139. /**
  140. * 修改角色信息
  141. *
  142. * @param userRoleUpdateEntity
  143. * @throws ServiceException
  144. */
  145. @Override
  146. @Transactional(rollbackFor = Exception.class)
  147. public void updateRoleInfo(UserRoleUpdateEntity userRoleUpdateEntity) throws ServiceException {
  148. UserRoleTable userRoleTable = userRoleRepository.findOne(userRoleUpdateEntity.getId());
  149. if (userRoleTable == null) {
  150. throw new ServiceException(Constants.INFO_NOT_FOUND);
  151. }
  152. if (!userRoleTable.getName().equals(userRoleUpdateEntity.getName())) {
  153. if (userRoleRepository.existsByName(userRoleUpdateEntity.getName())) {
  154. throw new ServiceException("该角色名已存在");
  155. }
  156. }
  157. BeanUtils.copyProperties(userRoleUpdateEntity, userRoleTable);
  158. userRoleRepository.save(userRoleTable);
  159. UserRoleOperateListEntity userRoleOperateListEntity = new UserRoleOperateListEntity();
  160. userRoleOperateListEntity.setModifyUser(userRoleUpdateEntity.getModifyUser());
  161. userRoleOperateListEntity.setModifyTime(userRoleUpdateEntity.getModifyTime());
  162. userRoleOperateListEntity.setModifyIp(userRoleUpdateEntity.getModifyIp());
  163. userRoleOperateListEntity.setRoleId(userRoleTable.getId());
  164. userRoleOperateListEntity.setData(userRoleUpdateEntity.getData());
  165. updateRoleInfo(userRoleOperateListEntity);
  166. }
  167. /**
  168. * 修改权限
  169. *
  170. * @param userRoleOperateListEntity
  171. * @throws ServiceException
  172. */
  173. @Override
  174. @Transactional(rollbackFor = Exception.class)
  175. public void updateRoleInfo(UserRoleOperateListEntity userRoleOperateListEntity) throws ServiceException {
  176. if (userRoleOperateListEntity == null) {
  177. return;
  178. }
  179. if (!userRoleRepository.existsById(userRoleOperateListEntity.getRoleId())) {
  180. throw new ServiceException("当前角色不可修改!!!");
  181. }
  182. Long roleId = userRoleOperateListEntity.getRoleId();
  183. List<UserRoleNodeTable> roleNodeTables = null;
  184. List<UserRoleDetailTable> roleDetailTables = null;
  185. List<UserRoleOperateEntity> userRoleOperateEntities = userRoleOperateListEntity.getData();
  186. if (userRoleOperateEntities != null && userRoleOperateEntities.size() > 0) {
  187. roleNodeTables = new ArrayList<>();
  188. roleDetailTables = new ArrayList<>();
  189. for (UserRoleOperateEntity userRoleOperateEntity : userRoleOperateEntities) {
  190. //节点
  191. if (userRoleOperateEntity.getType() == 0) {
  192. UserRoleNodeTable userRoleNodeTable = new UserRoleNodeTable();
  193. userRoleNodeTable.setNodeId(userRoleOperateEntity.getId());
  194. userRoleNodeTable.setRoleId(roleId);
  195. userRoleNodeTable.setAddIp(userRoleOperateListEntity.getModifyIp());
  196. userRoleNodeTable.setAddTime(userRoleOperateListEntity.getModifyTime());
  197. userRoleNodeTable.setAddUser(userRoleOperateListEntity.getModifyUser());
  198. roleNodeTables.add(userRoleNodeTable);
  199. }
  200. //按钮
  201. else if (userRoleOperateEntity.getType() == 1) {
  202. UserRoleDetailTable userRoleDetailTable = new UserRoleDetailTable();
  203. userRoleDetailTable.setActionId(userRoleOperateEntity.getId());
  204. userRoleDetailTable.setNodeId(userRoleOperateEntity.getPid());
  205. userRoleDetailTable.setRoleId(roleId);
  206. userRoleDetailTable.setAddIp(userRoleOperateListEntity.getModifyIp());
  207. userRoleDetailTable.setAddTime(userRoleOperateListEntity.getModifyTime());
  208. userRoleDetailTable.setAddUser(userRoleOperateListEntity.getModifyUser());
  209. roleDetailTables.add(userRoleDetailTable);
  210. }
  211. }
  212. for (UserRoleDetailTable pojo : roleDetailTables) {
  213. boolean exist = false;
  214. for (UserRoleNodeTable nodePojo : roleNodeTables) {
  215. if (pojo.getNodeId().equals(nodePojo.getId())) {
  216. exist = true;
  217. break;
  218. }
  219. }
  220. if (exist) {
  221. throw new RuntimeException(Constants.SYSTEM_ERROR);
  222. }
  223. }
  224. }
  225. /*
  226. * 修改原有的角色信息
  227. */
  228. userRoleNodeService.update(roleNodeTables, roleId);
  229. userRoleDetailService.update(roleDetailTables, roleId);
  230. /*
  231. * 更新内存中的角色信息
  232. */
  233. updateUserNode(roleId);
  234. }
  235. /**
  236. * 删除角色
  237. *
  238. * @param roleId
  239. * @throws ServiceException
  240. */
  241. @Override
  242. @Transactional(rollbackFor = Exception.class)
  243. public void deleteRoleInfo(Long roleId) throws ServiceException {
  244. UserRoleTable userRoleTable = userRoleRepository.findOne(roleId);
  245. if (userRoleTable == null) {
  246. throw new ServiceException(Constants.INFO_NOT_FOUND);
  247. }
  248. /**
  249. * 检测当前角色下存在用户
  250. */
  251. // int count = sellerInfoDao.countByRoleIdAndShopId(roleId, shopId);
  252. int count = 0;
  253. if (count >= 1) {
  254. throw new SecurityException("角色下存在用户,不能删除!");
  255. }
  256. /*
  257. * 删除数据库数据信息
  258. */
  259. userRoleNodeService.deleteRoleNodeByRoleId(roleId);
  260. userRoleDetailService.deleteRoleDetailByRoleId(roleId);
  261. userRoleRepository.delete(userRoleTable);
  262. /**
  263. * 删除redis中数据
  264. */
  265. String requestId = GetRandom.getRandom(10);
  266. try {
  267. if (redisService.tryLock(RoleConstants.ROLE_LOCK + roleId, requestId, RoleConstants.ROLE_LOCK_ESPIRE_TIME)) {
  268. if (redisService.hasKey(RoleConstants.ROLE_USER_NODE + roleId)) {
  269. redisService.remove(RoleConstants.ROLE_USER_NODE + roleId);
  270. }
  271. if (redisService.hasKey(RoleConstants.ROLE_USER_ACTION + roleId)) {
  272. redisService.remove(RoleConstants.ROLE_USER_ACTION + roleId);
  273. }
  274. } else {
  275. throw new ServiceException("当前角色权限正在修改,请稍后重试!!!");
  276. }
  277. } finally {
  278. redisService.unlock(RoleConstants.ROLE_LOCK + roleId, requestId);
  279. }
  280. }
  281. /**
  282. * 获取单个角色信息
  283. *
  284. * @param roleId
  285. * @return
  286. * @throws ServiceException
  287. */
  288. @Override
  289. public UserRoleDto getRoleInfo(Long roleId) throws ServiceException {
  290. UserRoleTable userRoleTable = userRoleRepository.getFirstById(roleId);
  291. if (userRoleTable == null) {
  292. throw new ServiceException(Constants.INFO_NOT_FOUND);
  293. }
  294. return transform(userRoleTable);
  295. }
  296. @Autowired
  297. private TenantService tenantService;
  298. /**
  299. * 拉取角色列表
  300. *
  301. * @param userRoleSearchEntity
  302. * @return
  303. * @throws ServiceException
  304. */
  305. @Override
  306. public ResultWithPagerDto<UserRoleDto> getListInfo(UserRoleSearchEntity userRoleSearchEntity) throws ServiceException {
  307. Map<String, String> map = new LinkedHashMap<>(1);
  308. map.put("addTime", "desc");
  309. Pageable pageable = FormatPage.formatPageable(userRoleSearchEntity.getPage());
  310. Specification<UserRoleTable> specification = (root, query, cb) -> {
  311. List<Predicate> predicates = new ArrayList<>();
  312. if (ValidateUtil.vStringNull(userRoleSearchEntity.getName())) {
  313. predicates.add(cb.like(root.get("name").as(String.class), "%" + userRoleSearchEntity.getName() + "%"));
  314. }
  315. if (userRoleSearchEntity.getStartDate() != null) {
  316. predicates.add(cb.greaterThan(root.get("addTime").as(Date.class), userRoleSearchEntity.getStartDate()));
  317. }
  318. if (userRoleSearchEntity.getStartDate() != null) {
  319. predicates.add(cb.lessThanOrEqualTo(root.get("addTime").as(Date.class), userRoleSearchEntity.getEndDate()));
  320. }
  321. if (ValidateUtil.vStringNull(userRoleSearchEntity.getName())) {
  322. predicates.add(cb.like(root.get("name").as(String.class), "%" + userRoleSearchEntity.getName() + "%"));
  323. }
  324. if (userRoleSearchEntity.getMerchantId() != null) {
  325. predicates.add(cb.equal(root.get("merchantId"), userRoleSearchEntity.getMerchantId()));
  326. predicates.add(cb.equal(root.get("isSysCreate"), 0));
  327. }
  328. //创建一个条件的集合,长度为上面满足条件的个数
  329. Predicate[] pre = new Predicate[predicates.size()];
  330. //这句大概意思就是将上面拼接好的条件返回去
  331. return query.where(predicates.toArray(pre)).getRestriction();
  332. };
  333. Page<UserRoleTable> pageResult = userRoleRepository.findAll(specification, pageable);
  334. PageDto pageDto = FormatPage.format(userRoleSearchEntity.getPage(), (int) pageResult.getTotalElements());
  335. if (pageResult.getTotalElements() <= 0) {
  336. return new ResultWithPagerDto(Constants.SUCCESS_CODE, Constants.SEARCH_SUCCESS, null, pageDto);
  337. }
  338. List<UserRoleDto> dtos = new ArrayList<>();
  339. List<TenantEntity> tenantEntities = tenantService.getAllMerchant();
  340. Map<Integer, TenantEntity> tenantMap = new HashMap<>();
  341. if(CollectionUtils.isNotEmpty(tenantEntities)){
  342. tenantMap = tenantEntities.stream().collect(Collectors.toMap(TenantEntity::getId, v -> v));
  343. }
  344. for (UserRoleTable userRoleTable : pageResult.getContent()) {
  345. UserRoleDto transform = transform(userRoleTable);
  346. if(tenantMap.containsKey(userRoleTable.getMerchantId())){
  347. transform.setMerchantName(tenantMap.get(userRoleTable.getMerchantId()).getMerchantName());
  348. transform.setMerchantId(userRoleTable.getMerchantId());
  349. }
  350. dtos.add(transform);
  351. }
  352. return new ResultWithPagerDto(Constants.SUCCESS_CODE, Constants.SEARCH_SUCCESS, dtos, pageDto);
  353. }
  354. /**
  355. * 获取所有店铺下角色信息列表
  356. *
  357. * @return
  358. * @throws ServiceException
  359. */
  360. @Override
  361. public List<UserAllRoleDto> getListInfo(Integer merchantId) throws ServiceException {
  362. List<UserRoleTable> roleTables = new ArrayList<>();
  363. if(merchantId != null){
  364. Integer isSysCreate = 0;
  365. roleTables = userRoleRepository.findAllByMerchantIdAndIsSysCreate(merchantId,isSysCreate);
  366. }else {
  367. roleTables = userRoleRepository.findAll();
  368. }
  369. List<UserAllRoleDto> allRoleDtos = new ArrayList<>();
  370. for (UserRoleTable sellerRoleTable : roleTables) {
  371. UserAllRoleDto shellerAllRoleDto = new UserAllRoleDto();
  372. BeanUtils.copyProperties(sellerRoleTable, shellerAllRoleDto);
  373. allRoleDtos.add(shellerAllRoleDto);
  374. }
  375. return allRoleDtos;
  376. }
  377. /**
  378. * 更新挂靠用户的数量
  379. *
  380. * @param entitys
  381. * @throws ServiceException
  382. */
  383. @Override
  384. @Transactional(rollbackFor = Exception.class)
  385. public void updateNumber(List<UserRoleUpdateNumberEntity> entitys) throws ServiceException {
  386. if (entitys == null || entitys.size() <= 0) {
  387. return;
  388. }
  389. List<Long> ids = new ArrayList<>(entitys.size());
  390. Map<Long, UserRoleUpdateNumberEntity> map = new HashMap<>(entitys.size());
  391. entitys.forEach(value -> {
  392. ids.add(value.getId());
  393. map.put(value.getId(), value);
  394. });
  395. List<UserRoleTable> userRoleTables = userRoleRepository.findAllByIdIn(ids);
  396. if (userRoleTables == null || userRoleTables.size() <= 0) {
  397. return;
  398. }
  399. userRoleTables.forEach(userRoleTable -> {
  400. UserRoleUpdateNumberEntity userRoleUpdateNumberEntity = map.get(userRoleTable.getId());
  401. BeanUtils.copyProperties(userRoleUpdateNumberEntity, userRoleTable);
  402. int number = userRoleTable.getNumber() + userRoleUpdateNumberEntity.getChangeNumber();
  403. if (number < 0) {
  404. number = 0;
  405. }
  406. userRoleTable.setNumber(number);
  407. });
  408. userRoleRepository.save(userRoleTables);
  409. }
  410. /**
  411. * 更新挂靠用户的数量
  412. *
  413. * @param entity
  414. * @throws ServiceException
  415. */
  416. @Override
  417. @Transactional(rollbackFor = Exception.class)
  418. public void updateNumber(UserRoleUpdateNumberEntity entity) throws ServiceException {
  419. UserRoleTable userRoleTable = userRoleRepository.findFirstById(entity.getId());
  420. if (userRoleTable == null) {
  421. throw new ServiceException(ManagerConstant.ROLE_NOT_EXIST_ERROR);
  422. }
  423. BeanUtils.copyProperties(entity, userRoleTable);
  424. userRoleRepository.save(userRoleTable);
  425. }
  426. private UserRoleDto transform(UserRoleTable sellerRoleTable) {
  427. UserRoleDto shellerRoleDto = new UserRoleDto();
  428. BeanUtils.copyProperties(sellerRoleTable, shellerRoleDto);
  429. return shellerRoleDto;
  430. }
  431. /**
  432. * 修改权限
  433. *
  434. * @param roleId
  435. * @return
  436. * @throws ServiceException
  437. */
  438. private List<UserNodeDisplayDto> updateUserNode(Long roleId) throws ServiceException {
  439. /*
  440. * 获取节点信息
  441. */
  442. List<SysNodeView> sysNodeViews = userRoleNodeService.getSysNodesByRoleId(roleId);
  443. /*
  444. * 获取按钮信息
  445. */
  446. List<SysActionTable> sysActionTables = userActionRepository.getAllByOrderByCode();
  447. // if (sysActionTables == null || sysActionTables.size() == 0) {
  448. // throw new RuntimeException("权限信息有误,请联系管理员");
  449. // }
  450. /*
  451. * 获取详细信息
  452. */
  453. List<UserRoleDetailTable> roleDetailTables = new ArrayList<UserRoleDetailTable>();
  454. if (sysActionTables != null || sysActionTables.size() >= 0) {
  455. if (roleId != null && roleId != 0 && roleId != -1) {
  456. roleDetailTables = userRoleDetailService.getUserRoleDetailsByRoleId(roleId);
  457. } else {
  458. if (roleId != -1) {
  459. for (SysActionTable sysActionTable : sysActionTables) {
  460. UserRoleDetailTable userRoleDetailTable = new UserRoleDetailTable();
  461. userRoleDetailTable.setActionId(sysActionTable.getId());
  462. userRoleDetailTable.setRoleId(null);
  463. userRoleDetailTable.setNodeId(sysActionTable.getNodeId());
  464. roleDetailTables.add(userRoleDetailTable);
  465. }
  466. }
  467. }
  468. }
  469. /*
  470. * 整合节点权限信息
  471. */
  472. List<UserNodeDisplayDto> userNodeDisplayEntities = new ArrayList<UserNodeDisplayDto>();
  473. if (sysNodeViews != null && sysNodeViews.size() > 0) {
  474. for (SysNodeView sysNodeTable : sysNodeViews) {
  475. if (sysNodeTable.getPid() == null || sysNodeTable.getPid() == 0) {
  476. UserNodeDisplayDto userNodeDisplayEntity = getUserNodeDisplayDto(sysNodeTable);
  477. recursion(sysNodeViews, sysActionTables, roleDetailTables, userNodeDisplayEntity);
  478. userNodeDisplayEntities.add(userNodeDisplayEntity);
  479. }
  480. }
  481. }
  482. /*
  483. * 将结果存入redis中 redis记录简单加锁方式
  484. */
  485. String key;
  486. if (roleId == null || roleId == 0) {
  487. key = RoleConstants.ROLE_ADMIN;
  488. } else {
  489. key = roleId + "";
  490. }
  491. String requestId = System.currentTimeMillis() + "";
  492. try {
  493. if (redisService.tryLock(RoleConstants.ROLE_LOCK + key, requestId, RoleConstants.ROLE_LOCK_ESPIRE_TIME)) {
  494. /*
  495. * 处理前端显示节点信息
  496. */
  497. List<UserNodeDisplayDto> nodeList = new ArrayList<UserNodeDisplayDto>();
  498. nodeList.addAll(userNodeDisplayEntities);
  499. redisService.saveObject(RoleConstants.ROLE_USER_NODE + key, userNodeDisplayEntities);
  500. /*
  501. * 处理后端角色判定信息
  502. */
  503. List<String> actionList = new ArrayList<>();
  504. for (UserRoleDetailTable userRoleDetailPojo : roleDetailTables) {
  505. for (SysActionTable sysActionPojo : sysActionTables) {
  506. if (userRoleDetailPojo.getActionId().equals(sysActionPojo.getId())) {
  507. actionList.add(sysActionPojo.getAction());
  508. }
  509. }
  510. }
  511. redisService.saveObject(RoleConstants.ROLE_USER_ACTION + key, actionList);
  512. } else {
  513. throw new ServiceException("当前角色权限正在修改,请稍后重试!!!");
  514. }
  515. } finally {
  516. redisService.unlock(RoleConstants.ROLE_LOCK + key, requestId);
  517. }
  518. return userNodeDisplayEntities;
  519. }
  520. /**
  521. * 递归节点信息,获取前台展示的节点数据
  522. *
  523. * @param sysNodeViews
  524. * @param sysActionTables
  525. * @param userRoleDetailTables
  526. * @param userNodeDisplayDto
  527. */
  528. private void recursion(List<SysNodeView> sysNodeViews, List<SysActionTable> sysActionTables,
  529. List<UserRoleDetailTable> userRoleDetailTables, UserNodeDisplayDto userNodeDisplayDto) {
  530. for (SysNodeView sysNodePojo : sysNodeViews) {
  531. if (userNodeDisplayDto.getId().equals(sysNodePojo.getPid())) {
  532. UserNodeDisplayDto child = getUserNodeDisplayDto(sysNodePojo);
  533. Map<String, UserActionDisplayDto> userActionDisplayDtos = getUserActionDisplayDtos(sysActionTables, userRoleDetailTables, child.getId());
  534. child.setBtns(userActionDisplayDtos);
  535. userNodeDisplayDto.getChildren().add(child);
  536. recursion(sysNodeViews, sysActionTables, userRoleDetailTables, child);
  537. } else {
  538. Map<String, UserActionDisplayDto> userActionDisplayDtos = getUserActionDisplayDtos(sysActionTables, userRoleDetailTables, userNodeDisplayDto.getId());
  539. userNodeDisplayDto.setBtns(userActionDisplayDtos);
  540. }
  541. }
  542. }
  543. private Map<String, UserActionDisplayDto> getUserActionDisplayDtos(List<SysActionTable> sysActionTables, List<UserRoleDetailTable> userRoleDetailTables, Long nodeId) {
  544. if (sysActionTables == null && sysActionTables.size() <= 0) {
  545. return new HashMap<>(0);
  546. }
  547. Map<String, UserActionDisplayDto> userActionDisplayDtos = new HashMap<>(sysActionTables.size());
  548. List<SysActionTable> removeSysActionTables = new ArrayList<>(sysActionTables.size());
  549. int size = sysActionTables.size();
  550. for (int i = 0; i < size; i++) {
  551. SysActionTable sysActionPojo = sysActionTables.get(i);
  552. if (sysActionPojo.getNodeId().equals(nodeId)) {
  553. UserActionDisplayDto userActionDisplayDto = getUserActionDisplayDto(sysActionPojo, userRoleDetailTables, nodeId);
  554. userActionDisplayDtos.put(userActionDisplayDto.getCode(), userActionDisplayDto);
  555. removeSysActionTables.add(sysActionPojo);
  556. }
  557. }
  558. if (removeSysActionTables.size() > 0) {
  559. userRoleDetailTables.removeAll(removeSysActionTables);
  560. }
  561. return userActionDisplayDtos;
  562. }
  563. private UserActionDisplayDto getUserActionDisplayDto(SysActionTable sysActionTable, List<UserRoleDetailTable> userRoleDetailTables, Long nodeId) {
  564. if (sysActionTable.getNodeId() != null && sysActionTable.getNodeId().equals(nodeId)) {
  565. UserActionDisplayDto userActionDisplayDto = new UserActionDisplayDto();
  566. userActionDisplayDto.setName(sysActionTable.getName());
  567. userActionDisplayDto.setCode(sysActionTable.getCode());
  568. userActionDisplayDto.setId(sysActionTable.getId());
  569. userActionDisplayDto.setPid(sysActionTable.getNodeId());
  570. userActionDisplayDto.setShow(false);
  571. userActionDisplayDto.setTId(userActionDisplayDto.getId() + "-" + userActionDisplayDto.getType());
  572. if (userRoleDetailTables != null && userRoleDetailTables.size() != 0) {
  573. Iterator<UserRoleDetailTable> userRoleDetailPojoIterator = userRoleDetailTables.iterator();
  574. while (userRoleDetailPojoIterator.hasNext()) {
  575. UserRoleDetailTable userRoleDetailPojo = userRoleDetailPojoIterator.next();
  576. if (userRoleDetailPojo.getNodeId().equals(nodeId)
  577. && userRoleDetailPojo.getActionId().equals(sysActionTable.getId())) {
  578. userActionDisplayDto.setShow(true);
  579. }
  580. }
  581. }
  582. return userActionDisplayDto;
  583. }
  584. return null;
  585. }
  586. private UserNodeDisplayDto getUserNodeDisplayDto(SysNodeView sysNodeTable) {
  587. UserNodeDisplayDto userNodeDisplayEntity = new UserNodeDisplayDto();
  588. userNodeDisplayEntity.setName(sysNodeTable.getName());
  589. userNodeDisplayEntity.setCode(sysNodeTable.getCode());
  590. userNodeDisplayEntity.setIcon(sysNodeTable.getIcon());
  591. userNodeDisplayEntity.setLink(sysNodeTable.getLink());
  592. userNodeDisplayEntity.setId(sysNodeTable.getId());
  593. userNodeDisplayEntity.setShow(sysNodeTable.getShow());
  594. userNodeDisplayEntity.setPid(sysNodeTable.getPid());
  595. userNodeDisplayEntity.setSubIndex(sysNodeTable.getSubIndex());
  596. userNodeDisplayEntity.setTId(sysNodeTable.getId() + "-" + userNodeDisplayEntity.getType());
  597. return userNodeDisplayEntity;
  598. }
  599. @Override
  600. public String getRoleCodeById(Long id) throws ServiceException {
  601. UserRoleTable userRoleTable = userRoleRepository.getOne(id);
  602. if (userRoleTable == null) {
  603. throw new ServiceException("info_not_found");
  604. }
  605. return userRoleTable.getCode();
  606. }
  607. @Override
  608. public Long getIdByRoleCode(String code) throws Exception {
  609. UserRoleTable userRoleTable = userRoleRepository.getFirstByCode(code);
  610. if (userRoleTable == null){
  611. return null;
  612. }else{
  613. return userRoleTable.getId();
  614. }
  615. }
  616. @Override
  617. public UserRoleTable findRoleInfo(Long roleId) {
  618. UserRoleTable userRoleTable = userRoleRepository.getOne(roleId);
  619. return userRoleTable;
  620. }
  621. }