package org.jeecg.modules.demo.resManager.catalog.service.impl; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.demo.resManager.catalog.entity.Rescatalog; import org.jeecg.modules.demo.resManager.catalog.mapper.RescatalogMapper; import org.jeecg.modules.demo.resManager.catalog.service.IRescatalogService; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; /** * @Description: 资源目录 * @Author: jeecg-boot * @Date: 2022-01-17 * @Version: V1.0 */ @Service public class RescatalogServiceImpl extends ServiceImpl implements IRescatalogService { @Override public void addRescatalog(Rescatalog rescatalog) { //新增时设置hasChild为0 rescatalog.setHasChild(IRescatalogService.NOCHILD); if(oConvertUtils.isEmpty(rescatalog.getPid())){ rescatalog.setPid(IRescatalogService.ROOT_PID_VALUE); }else{ //如果当前节点父ID不为空 则设置父节点的hasChildren 为1 Rescatalog parent = baseMapper.selectById(rescatalog.getPid()); if(parent!=null && !"1".equals(parent.getHasChild())){ parent.setHasChild("1"); baseMapper.updateById(parent); } } baseMapper.insert(rescatalog); } @Override public void updateRescatalog(Rescatalog rescatalog) { Rescatalog entity = this.getById(rescatalog.getId()); if(entity==null) { throw new JeecgBootException("未找到对应实体"); } String old_pid = entity.getPid(); String new_pid = rescatalog.getPid(); if(!old_pid.equals(new_pid)) { updateOldParentNode(old_pid); if(oConvertUtils.isEmpty(new_pid)){ rescatalog.setPid(IRescatalogService.ROOT_PID_VALUE); } if(!IRescatalogService.ROOT_PID_VALUE.equals(rescatalog.getPid())) { baseMapper.updateTreeNodeStatus(rescatalog.getPid(), IRescatalogService.HASCHILD); } } baseMapper.updateById(rescatalog); } @Override @Transactional(rollbackFor = Exception.class) public void deleteRescatalog(String id) throws JeecgBootException { //查询选中节点下所有子节点一并删除 id = this.queryTreeChildIds(id); if(id.indexOf(",")>0) { StringBuffer sb = new StringBuffer(); String[] idArr = id.split(","); for (String idVal : idArr) { if(idVal != null){ Rescatalog rescatalog = this.getById(idVal); String pidVal = rescatalog.getPid(); //查询此节点上一级是否还有其他子节点 List dataList = baseMapper.selectList(new QueryWrapper().eq("pid", pidVal).notIn("id",Arrays.asList(idArr))); if((dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(pidVal) && !sb.toString().contains(pidVal)){ //如果当前节点原本有子节点 现在木有了,更新状态 sb.append(pidVal).append(","); } } } //批量删除节点 baseMapper.deleteBatchIds(Arrays.asList(idArr)); //修改已无子节点的标识 String[] pidArr = sb.toString().split(","); for(String pid : pidArr){ this.updateOldParentNode(pid); } }else{ Rescatalog rescatalog = this.getById(id); if(rescatalog==null) { throw new JeecgBootException("未找到对应实体"); } updateOldParentNode(rescatalog.getPid()); baseMapper.deleteById(id); } } @Override public List queryTreeListNoPage(QueryWrapper queryWrapper) { List dataList = baseMapper.selectList(queryWrapper); List mapList = new ArrayList<>(); for(Rescatalog data : dataList){ String pidVal = data.getPid(); //递归查询子节点的根节点 if(pidVal != null && !"0".equals(pidVal)){ Rescatalog rootVal = this.getTreeRoot(pidVal); if(rootVal != null && !mapList.contains(rootVal)){ mapList.add(rootVal); } }else{ if(!mapList.contains(data)){ mapList.add(data); } } } return mapList; } /** * 根据所传pid查询旧的父级节点的子节点并修改相应状态值 * @param pid */ private void updateOldParentNode(String pid) { if(!IRescatalogService.ROOT_PID_VALUE.equals(pid)) { Integer count = baseMapper.selectCount(new QueryWrapper().eq("pid", pid)); if(count==null || count<=1) { baseMapper.updateTreeNodeStatus(pid, IRescatalogService.NOCHILD); } } } /** * 递归查询节点的根节点 * @param pidVal * @return */ private Rescatalog getTreeRoot(String pidVal){ Rescatalog data = baseMapper.selectById(pidVal); if(data != null && !"0".equals(data.getPid())){ return this.getTreeRoot(data.getPid()); }else{ return data; } } /** * 根据id查询所有子节点id * @param ids * @return */ private String queryTreeChildIds(String ids) { //获取id数组 String[] idArr = ids.split(","); StringBuffer sb = new StringBuffer(); for (String pidVal : idArr) { if(pidVal != null){ if(!sb.toString().contains(pidVal)){ if(sb.toString().length() > 0){ sb.append(","); } sb.append(pidVal); this.getTreeChildIds(pidVal,sb); } } } return sb.toString(); } /** * 递归查询所有子节点 * @param pidVal * @param sb * @return */ private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){ List dataList = baseMapper.selectList(new QueryWrapper().eq("pid", pidVal)); if(dataList != null && dataList.size()>0){ for(Rescatalog tree : dataList) { if(!sb.toString().contains(tree.getId())){ sb.append(",").append(tree.getId()); } this.getTreeChildIds(tree.getId(),sb); } } return sb; } }