package com.iden.bms.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.iden.common.entity.IdenRoleMenuRel; import com.iden.common.entity.IdenSysMenu; import com.iden.common.entity.IdenSysRole; import com.iden.common.enums.IsLeafEnum; import com.iden.common.exception.BDException; import com.iden.common.service.IdenRoleMenuRelService; import com.iden.common.service.IdenSysMenuService; import com.iden.common.service.IdenSysRoleService; import com.iden.common.util.MyBeanUtils; import com.iden.common.vo.SysMenuVO; import com.iden.common.vo.SysRoleVO; import com.iden.common.vo.PageReqVO; import com.iden.common.vo.UserLoginedConvertVO; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * * @author makejava * @since 2021-05-21 00:08:38 */ @Service public class SysRoleService { @Resource private IdenSysRoleService idenSysRoleService; @Resource private IdenRoleMenuRelService idenRoleMenuRelService; @Resource private IdenSysMenuService idenSysMenuService; /** * 查询角色列表 * @return */ public IPage listSysRole(UserLoginedConvertVO loginUser, PageReqVO pageReqVo) { IPage page = new Page<>(pageReqVo.getCurrent(), pageReqVo.getPageSize()); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().orderByAsc(IdenSysRole::getCode); IPage pageRes = this.idenSysRoleService.page(page, queryWrapper); IPage results = new Page<>(pageRes.getCurrent(),pageRes.getSize(),pageRes.getTotal()); if(CollUtil.isNotEmpty(pageRes.getRecords())){ List list = new ArrayList<>(); pageRes.getRecords().forEach(item -> { SysRoleVO resVO = new SysRoleVO(); BeanUtils.copyProperties(item,resVO); list.add(resVO); }); results.setRecords(list); } return results; } /** * 删除角色 * @param id * @return */ public boolean deleteById(Long id){ return this.idenSysRoleService.removeById(id); } /** * 详情 * @param id * @return */ public SysRoleVO getSysRoleById(Long id){ IdenSysRole idenSysRole = this.idenSysRoleService.getById(id); if (idenSysRole!=null){ SysRoleVO resVO = new SysRoleVO(); BeanUtil.copyProperties(idenSysRole,resVO); return resVO; } return null; } /** * 保存角色 * @param vo */ @Transactional(rollbackFor = Exception.class) public int createSysRole(SysRoleVO vo, UserLoginedConvertVO loginUser){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(IdenSysRole::getName,vo.getName()); if(idenSysRoleService.count(queryWrapper) > 0){ return 1; } QueryWrapper queryWrapper2 = new QueryWrapper<>(); queryWrapper2.lambda().eq(IdenSysRole::getCode,vo.getCode()); if(idenSysRoleService.count(queryWrapper2) > 0){ return 2; } //保存角色 IdenSysRole idenSysRole = new IdenSysRole(); BeanUtil.copyProperties(vo,idenSysRole); idenSysRole.setCreateTime(new Date()); this.idenSysRoleService.save(idenSysRole); return 0; } /** * 修改角色 * @param vo */ @Transactional(rollbackFor = Exception.class) public void updateSysRole(SysRoleVO vo){ //保存角色 IdenSysRole idenSysRole = new IdenSysRole(); BeanUtil.copyProperties(vo,idenSysRole); idenSysRole.setModifyTime(new Date()); this.idenSysRoleService.updateById(idenSysRole); } /** * 启用停用角色 * @param vo */ @Transactional(rollbackFor = Exception.class) public void invalidSysRole(SysRoleVO vo) throws BDException { IdenSysRole idenSysRole = new IdenSysRole(); BeanUtil.copyProperties(vo, idenSysRole); if(!this.idenSysRoleService.updateById(idenSysRole)){ throw new BDException("操作失败!"); } } /** * 保存角色拥有的菜单 * @param vo */ @Transactional(rollbackFor = Exception.class) public void saveSysRoleMenu(UserLoginedConvertVO loginUser,SysRoleVO vo) throws BDException { List hasLeafSysMenuIdList = vo.getHasLeafSysMenuIdList(); if(CollUtil.isEmpty(hasLeafSysMenuIdList) || vo.getId() == null){ throw new BDException("参数不能是空的"); } QueryWrapper queryWrapper0 = new QueryWrapper<>(); queryWrapper0.lambda().eq(IdenRoleMenuRel::getRoleId, vo.getId()); //获取该角色拥有的所有菜单关系,包括非叶子菜单关系 List hasRoleMenuRelDb = idenRoleMenuRelService.list(queryWrapper0); if (CollUtil.isNotEmpty(hasRoleMenuRelDb)) { //删除数据库里的关系列表,包括非叶子菜单关系,重新添加关系 for(IdenRoleMenuRel idenRoleMenuRel : hasRoleMenuRelDb){ idenRoleMenuRelService.removeById(idenRoleMenuRel.getId()); } } for(Long id : hasLeafSysMenuIdList) { IdenRoleMenuRel idenRoleMenuRel = new IdenRoleMenuRel(); idenRoleMenuRel.setMenuId(id); idenRoleMenuRel.setRoleId(vo.getId()); idenRoleMenuRelService.save(idenRoleMenuRel); //保存父菜单关系 saveParentIdenRoleMenuRel(vo.getId(),id); } } private void saveParentIdenRoleMenuRel(Long roleId, Long leafMenuId) throws BDException{ IdenSysMenu leafMenu = this.idenSysMenuService.getById(leafMenuId); Long pid = leafMenu.getPid(); if( pid == -1L) { return; } IdenSysMenu leafMenuParent = this.idenSysMenuService.getById(leafMenuId); if (leafMenuParent == null){ return; } IdenRoleMenuRel idenRoleMenuRel = new IdenRoleMenuRel(); idenRoleMenuRel.setMenuId(pid); idenRoleMenuRel.setRoleId(roleId); idenRoleMenuRelService.save(idenRoleMenuRel); saveParentIdenRoleMenuRel(roleId,pid); } public List listHasLeafMenu(UserLoginedConvertVO loginUser, Long id){ QueryWrapper queryWrapper0 = new QueryWrapper<>(); queryWrapper0.lambda().eq(IdenRoleMenuRel::getRoleId, id); List hasList = idenRoleMenuRelService.list(queryWrapper0); List hasMenuIds = new ArrayList<>(); if(CollUtil.isNotEmpty(hasList)){ hasList.forEach(item ->{ hasMenuIds.add(item.getMenuId()); } ); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(IdenSysMenu::getIsLeaf, IsLeafEnum.YES.getValue()).in(IdenSysMenu::getId,hasMenuIds); List list = idenSysMenuService.list(queryWrapper); List listSysMenuVO = new ArrayList<>(); if (CollUtil.isNotEmpty(list)){ list.forEach(item ->{ SysMenuVO vo = new SysMenuVO(); BeanUtil.copyProperties(item,vo); vo.setIsLeafName(IsLeafEnum.getValueToName(vo.getIsLeaf())); listSysMenuVO.add(vo); }); } return listSysMenuVO; } public List listNoHasLeafMenu(UserLoginedConvertVO loginUser,Long id){ List hasSysMenuVOList = listHasLeafMenu(loginUser,id); List hasMenuIds = new ArrayList<>(); if(CollUtil.isNotEmpty(hasSysMenuVOList)){ hasSysMenuVOList.forEach(item ->{ hasMenuIds.add(item.getId()); } ); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(IdenSysMenu::getIsLeaf, IsLeafEnum.YES.getValue()).notIn(IdenSysMenu::getId,hasMenuIds); List list = idenSysMenuService.list(queryWrapper); List listSysMenuVO = new ArrayList<>(); if (CollUtil.isNotEmpty(list)){ list.forEach(item ->{ SysMenuVO vo = new SysMenuVO(); BeanUtil.copyProperties(item,vo); vo.setIsLeafName(IsLeafEnum.getValueToName(vo.getIsLeaf())); listSysMenuVO.add(vo); }); } return listSysMenuVO; } }