package cn.besteam.modules.system.service.impl; import cn.besteam.common.constant.CacheConstant; import cn.besteam.common.constant.CommonConstant; import cn.besteam.common.constant.ErrorCode; import cn.besteam.common.exception.BusinessException; import cn.besteam.common.util.oConvertUtils; import cn.besteam.modules.system.entity.SysPermission; import cn.besteam.modules.system.mapper.SysPermissionMapper; import cn.besteam.modules.system.service.ISysPermissionService; import cn.besteam.modules.system.vo.TreeModel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; /** * @Description: 菜单权限 * @author: besteam * @date: 2020-04-17 * @version: V1.0 */ @Service public class SysPermissionServiceImpl extends ServiceImpl implements ISysPermissionService { @Override public List queryListByParentId(Integer parentId) { return baseMapper.queryListByParentId(parentId); } /** * 真实删除 */ @Override @Transactional @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) public void deletePermission(Integer id) throws BusinessException { SysPermission sysPermission = this.getById(id); if (sysPermission == null) { throw new BusinessException(ErrorCode.ERR_500); } Integer pid = sysPermission.getParentId(); if (oConvertUtils.isNotEmpty(pid)) { int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if (count == 1) { //若父节点无其他子节点,则该父节点是叶子节点 baseMapper.setMenuLeaf(pid, 1); } } baseMapper.deleteById(id); // 该节点可能是子节点但也可能是其它节点的父节点,所以需要级联删除 this.removeChildrenBy(sysPermission.getId()); } /** * 根据父id删除其关联的子节点数据 * * @return */ public void removeChildrenBy(Integer parentId) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); // 封装查询条件parentId为主键, query.eq(SysPermission::getParentId, parentId); // 查出该主键下的所有子级 List permissionList = this.list(query); if (permissionList != null && permissionList.size() > 0) { Integer id = null; // id int num = 0; // 查出的子级数量 // 如果查出的集合不为空, 则先删除所有 this.remove(query); // 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级 for (int i = 0, len = permissionList.size(); i < len; i++) { id = permissionList.get(i).getId(); num = this.count(new LambdaQueryWrapper().eq(SysPermission::getParentId, id)); // 如果有, 则递归 if (num > 0) { this.removeChildrenBy(id); } } } } /** * 逻辑删除 */ @Override @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) //@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true,condition="#sysPermission.menuType==2") public void deletePermissionLogical(Integer id) throws BusinessException { SysPermission sysPermission = this.getById(id); if (sysPermission == null) { throw new BusinessException(ErrorCode.ERR_500); } Integer pid = sysPermission.getParentId(); int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if (count == 1) { //若父节点无其他子节点,则该父节点是叶子节点 baseMapper.setMenuLeaf(pid, 1); } sysPermission.setDelFlag(1); this.updateById(sysPermission); } @Override @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) public void addPermission(SysPermission sysPermission) throws BusinessException { //---------------------------------------------------------------------- //判断是否是一级菜单,是的话清空父菜单 if (CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { sysPermission.setParentId(null); } //---------------------------------------------------------------------- Integer pid = sysPermission.getParentId(); if (oConvertUtils.isNotEmpty(pid)) { //设置父节点不为叶子节点 baseMapper.setMenuLeaf(pid, 0); } sysPermission.setCreateTime(new Date()); sysPermission.setDelFlag(0); // sysPermission.setIsLeaf(1); sysPermission.setIsLeaf(true); this.save(sysPermission); } @Override @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) public void editPermission(SysPermission sysPermission) throws BusinessException { SysPermission p = this.getById(sysPermission.getId()); //TODO 该节点判断是否还有子节点 if (p == null) { throw new BusinessException(ErrorCode.ERR_500); } else { sysPermission.setUpdateTime(new Date()); //---------------------------------------------------------------------- //Step1.判断是否是一级菜单,是的话清空父菜单ID if (CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { sysPermission.setParentId(null); } //Step2.判断菜单下级是否有菜单,无则设置为叶子节点 int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, sysPermission.getId())); if (count == 0) { // sysPermission.setIsLeaf(1); sysPermission.setIsLeaf(true); } //---------------------------------------------------------------------- this.updateById(sysPermission); //如果当前菜单的父菜单变了,则需要修改新父菜单和老父菜单的,叶子节点状态 Integer pid = sysPermission.getParentId(); if ((oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid) && oConvertUtils.isNotEmpty(p.getParentId())) { //a.设置新的父菜单不为叶子节点 baseMapper.setMenuLeaf(pid, 0); //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点 int cc = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, p.getParentId())); if (cc == 0) { if (oConvertUtils.isNotEmpty(p.getParentId())) { baseMapper.setMenuLeaf(p.getParentId(), 1); } } } } } @Override public List queryByUser(String username) { return baseMapper.queryByUser(username); } /** * 获取模糊匹配规则的数据权限URL */ @Override @Cacheable(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE) public List queryPermissionUrlWithStar() { return this.baseMapper.queryPermissionUrlWithStar(); } }