package com.ctsi.SysMenu.service.impl; import cn.hutool.core.util.StrUtil; import com.ctsi.SysMenu.entity.SysMenuSearchPO; import com.ctsi.SysOrg.entity.SysOrgSearchPO; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.ctsi.SysMenu.entity.SysMenu; import com.ctsi.SysMenu.mapper.SysMenuMapper; import com.ctsi.SysMenu.service.SysMenuService; import java.util.*; /** * 菜单;(sys_menu)表服务实现类 * @author : machaoyi * @date : 2024-1-10 */ @Service public class SysMenuServiceImpl implements SysMenuService{ @Autowired private SysMenuMapper sysMenuMapper; /** * 通过ID查询单条数据 * * @param id 主键 * @return 实例对象 */ public SysMenu queryById(Long id){ return sysMenuMapper.selectById(id); } /** * 分页查询 * * @param sysMenu 筛选条件 * @param current 当前页码 * @param size 每页大小 * @return */ public Page paginQuery(SysMenu sysMenu, long current, long size){ //1. 构建动态查询条件 MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); if(StrUtil.isNotBlank(sysMenu.getMenuTitle())){ queryWrapper.eq(SysMenu::getMenuTitle, sysMenu.getMenuTitle()); } if(StrUtil.isNotBlank(sysMenu.getMenuCode())){ queryWrapper.eq(SysMenu::getMenuCode, sysMenu.getMenuCode()); } if(StrUtil.isNotBlank(sysMenu.getMenuName())){ queryWrapper.eq(SysMenu::getMenuName, sysMenu.getMenuName()); } if(StrUtil.isNotBlank(sysMenu.getMenuIcon())){ queryWrapper.eq(SysMenu::getMenuIcon, sysMenu.getMenuIcon()); } queryWrapper.orderByAsc("ORDER_BY"); //2. 执行分页查询 Page pagin = new Page<>(current , size , true); IPage selectResult = sysMenuMapper.selectJoinPage(pagin , SysMenuSearchPO.class, queryWrapper); selectResult.setRecords(buildTree(selectResult.getRecords())); pagin.setPages(selectResult.getPages()); pagin.setTotal(selectResult.getTotal()); pagin.setRecords(selectResult.getRecords()); //3. 返回结果 return pagin; } /** * 新增数据 * * @param sysMenu 实例对象 * @return 实例对象 */ public SysMenu insert(SysMenu sysMenu){ sysMenuMapper.insert(sysMenu); return sysMenu; } /** * 更新数据 * * @param sysMenu 实例对象 * @return 实例对象 */ public SysMenu update(SysMenu sysMenu){ //1. 根据条件动态更新 LambdaUpdateChainWrapper chainWrapper = new LambdaUpdateChainWrapper(sysMenuMapper); if(StrUtil.isNotBlank(sysMenu.getMenuTitle())){ chainWrapper.set(SysMenu::getMenuTitle, sysMenu.getMenuTitle()); } if(StrUtil.isNotBlank(sysMenu.getMenuCode())){ chainWrapper.set(SysMenu::getMenuCode, sysMenu.getMenuCode()); } if(StrUtil.isNotBlank(sysMenu.getMenuName())){ chainWrapper.set(SysMenu::getMenuName, sysMenu.getMenuName()); } if(StrUtil.isNotBlank(sysMenu.getMenuIcon())){ chainWrapper.set(SysMenu::getMenuIcon, sysMenu.getMenuIcon()); } //2. 设置主键,并更新 chainWrapper.eq(SysMenu::getId, sysMenu.getId()); boolean ret = chainWrapper.update(); //3. 更新成功了,查询最最对象返回 if(ret){ return queryById(sysMenu.getId()); }else{ return sysMenu; } } /** * 通过主键删除数据 * * @param id 主键 * @return 是否成功 */ public boolean deleteById(Long id){ int total = sysMenuMapper.deleteById(id); return total > 0; } public static List buildTree(List nodeList) { Map nodeMap = new LinkedHashMap<>(); // 将节点放入 Map 中,方便通过 id 查找 for (SysMenuSearchPO node : nodeList) { nodeMap.put(node.getId(), node); } List tree = new ArrayList<>(); // 逐个节点构建树 for (SysMenuSearchPO node : nodeList) { if (node.getParentId() == 0) { // 根节点 tree.add(buildTreeRecursively(node, nodeMap, node.getId())); } } return tree; } private static SysMenuSearchPO buildTreeRecursively(SysMenuSearchPO parentNode, Map nodeMap, Long parentId) { List children = new ArrayList<>(); // 查找当前节点的子节点 nodeMap.forEach((id, node) -> { if (Objects.equals(node.getParentId(), parentId)) { children.add(buildTreeRecursively(node, nodeMap, node.getId())); } }); // 将子节点设置到父节点 parentNode.setChildren(children); return parentNode; } }