package com.zbkj.service.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zbkj.common.constants.Constants; import com.zbkj.common.exception.CarException; import com.zbkj.common.model.system.SystemAdmin; import com.zbkj.common.model.system.SystemMenu; import com.zbkj.common.model.system.SystemRole; import com.zbkj.common.model.system.SystemRoleMenu; import com.zbkj.common.request.PageParamRequest; import com.zbkj.common.request.SystemRoleRequest; import com.zbkj.common.request.SystemRoleSearchRequest; import com.zbkj.common.response.RoleInfoResponse; import com.zbkj.common.utils.CarUtil; import com.zbkj.common.utils.SecurityUtil; import com.zbkj.common.vo.CategoryTreeVo; import com.zbkj.common.vo.LoginUserVo; import com.zbkj.common.vo.MenuCheckTree; import com.zbkj.common.vo.MenuCheckVo; import com.github.pagehelper.PageHelper; import com.zbkj.service.dao.SystemRoleDao; import com.zbkj.service.service.CategoryService; import com.zbkj.service.service.SystemMenuService; import com.zbkj.service.service.SystemRoleMenuService; import com.zbkj.service.service.SystemRoleService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; /** * SystemRoleServiceImpl 接口实现 */ @Service public class SystemRoleServiceImpl extends ServiceImpl implements SystemRoleService { @Resource private SystemRoleDao dao; @Autowired private CategoryService categoryService; @Autowired private TransactionTemplate transactionTemplate; @Autowired private SystemRoleMenuService systemRoleMenuService; @Autowired private SystemMenuService systemMenuService; /** * 获取所有角色 * @return List */ @Override public List getAllList() { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(SystemRole::getStatus, true); lambdaQueryWrapper.orderByAsc(SystemRole::getId); return dao.selectList(lambdaQueryWrapper); } /** * 列表 * @param request 请求参数 * @param pageParamRequest 分页类参数 * @return List */ @Override public List getList(SystemRoleSearchRequest request, PageParamRequest pageParamRequest) { PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.select(SystemRole::getId, SystemRole::getRoleName, SystemRole::getStatus, SystemRole::getCreateTime, SystemRole::getUpdateTime); if (ObjectUtil.isNotNull(request.getStatus())) { lambdaQueryWrapper.eq(SystemRole::getStatus, request.getStatus()); } if (ObjectUtil.isNotNull(request.getRoleName())) { lambdaQueryWrapper.like(SystemRole::getRoleName, request.getRoleName()); } lambdaQueryWrapper.orderByAsc(SystemRole::getId); return dao.selectList(lambdaQueryWrapper); } /** * 根据id集合获取对应权限列表 * @param ids id集合 * @return 对应的权限列表 */ @Override public List getListInIds(List ids) { return dao.selectBatchIds(ids); } /** * 带结构的无线级分类 */ @Override public List menu() { List categoryIdList = getRoleListInRoleId(); System.out.println("权限列表:categoryIdList:"+ JSON.toJSONString(categoryIdList)); return categoryService.getListTree(Constants.CATEGORY_TYPE_MENU, 1, categoryIdList); } /** * 修改身份状态 */ @Override public Boolean updateStatus(Integer id, Boolean status) { SystemRole role = getById(id); if (ObjectUtil.isNull(role)) { throw new CarException("身份不存在"); } if (role.getStatus().equals(status)) { return true; } role.setStatus(status); return updateById(role); } /** * 添加身份 * @param systemRoleRequest 身份参数 * @return Boolean */ @Override public Boolean add(SystemRoleRequest systemRoleRequest) { if (existName(systemRoleRequest.getRoleName(), null)) { throw new CarException("角色名称重复"); } List ruleList = Stream.of(systemRoleRequest.getRules().split(",")).map(Integer::valueOf).distinct().collect(Collectors.toList()); SystemRole systemRole = new SystemRole(); BeanUtils.copyProperties(systemRoleRequest, systemRole); systemRole.setId(null); systemRole.setRules(""); return transactionTemplate.execute(e -> { boolean save = save(systemRole); if (!save) { return Boolean.FALSE; } List roleMenuList = ruleList.stream().map(rule -> { SystemRoleMenu roleMenu = new SystemRoleMenu(); roleMenu.setRid(systemRole.getId()); roleMenu.setMenuId(rule); return roleMenu; }).collect(Collectors.toList()); systemRoleMenuService.saveBatch(roleMenuList, 100); return Boolean.TRUE; }); } /** * 判断角色名称是否存在 * @param roleName 角色名称 * @param id 角色id * @return Boolean */ private Boolean existName(String roleName, Integer id) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(SystemRole::getRoleName, roleName); if (ObjectUtil.isNotNull(id)) { lqw.ne(SystemRole::getId, id); } lqw.last(" limit 1"); Integer count = dao.selectCount(lqw); return count > 0; } /** * 修改身份管理表 * @param systemRoleRequest 修改参数 */ @Override public Boolean edit(SystemRoleRequest systemRoleRequest) { SystemRole role = getById(systemRoleRequest.getId()); if (ObjectUtil.isNull(role)) { throw new CarException("角色不存在"); } if (!role.getRoleName().equals(systemRoleRequest.getRoleName())) { if (existName(systemRoleRequest.getRoleName(), systemRoleRequest.getId())) { throw new CarException("角色名称重复"); } } SystemRole systemRole = new SystemRole(); BeanUtils.copyProperties(systemRoleRequest, systemRole); systemRole.setRules(""); List ruleList = Stream.of(systemRoleRequest.getRules().split(",")).map(Integer::valueOf).distinct().collect(Collectors.toList()); List roleMenuList = ruleList.stream().map(rule -> { SystemRoleMenu roleMenu = new SystemRoleMenu(); roleMenu.setRid(systemRole.getId()); roleMenu.setMenuId(rule); return roleMenu; }).collect(Collectors.toList()); return transactionTemplate.execute(e -> { updateById(systemRole); systemRoleMenuService.deleteByRid(systemRole.getId()); systemRoleMenuService.saveBatch(roleMenuList, 100); return Boolean.TRUE; }); } /** * 删除角色 * @param id 角色id * @return Boolean */ @Override public Boolean delete(Integer id) { SystemRole systemRole = getById(id); if (ObjectUtil.isNull(systemRole)) { throw new CarException("角色已删除"); } return transactionTemplate.execute(e -> { dao.deleteById(id); systemRoleMenuService.deleteByRid(id); return Boolean.TRUE; }); } /** * 获取角色详情 * @param id 角色id * @return RoleInfoResponse */ @Override public RoleInfoResponse getInfo(Integer id) { SystemRole systemRole = getById(id); if (ObjectUtil.isNull(systemRole)) { throw new CarException("角色不存在"); } // 查询角色对应的菜单(权限) List menuList = systemMenuService.getCacheList(); List menuIdList = systemRoleMenuService.getMenuListByRid(id); List menuCheckVoList = menuList.stream().map(menu -> { MenuCheckVo menuCheckVo = new MenuCheckVo(); BeanUtils.copyProperties(menu, menuCheckVo); if (menuIdList.contains(menu.getId())) { menuCheckVo.setChecked(true); } else { menuCheckVo.setChecked(false); } return menuCheckVo; }).collect(Collectors.toList()); RoleInfoResponse response = new RoleInfoResponse(); BeanUtils.copyProperties(systemRole, response); response.setMenuList(new MenuCheckTree(menuCheckVoList).buildTree()); return response; } private List getRoleListInRoleId(){ //获取当前用户的所有权限 // SystemAdmin systemAdmin = systemAdminService.getInfo(); LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); SystemAdmin systemAdmin = loginUserVo.getUser(); if (null == systemAdmin || StringUtils.isBlank(systemAdmin.getRoles())){ throw new CarException("没有权限访问!"); } //获取用户权限组 List systemRoleList = getVoListInId(systemAdmin.getRoles()); if (systemRoleList.size() < 1){ throw new CarException("没有权限访问!"); } //获取用户权限规则 List categoryIdList = new ArrayList<>(); for (SystemRole systemRole : systemRoleList) { if (StringUtils.isBlank(systemRole.getRules())){ continue; } categoryIdList.addAll(CarUtil.stringToArray(systemRole.getRules())); } return categoryIdList; } private List getVoListInId(String roles) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.in(SystemRole::getId, CarUtil.stringToArray(roles)); return dao.selectList(lambdaQueryWrapper); } }