| package cc.mrbird.febs.system.service.impl; | 
|   | 
| import cc.mrbird.febs.common.authentication.ShiroRealm; | 
| import cc.mrbird.febs.common.entity.MenuTree; | 
| import cc.mrbird.febs.common.utils.TreeUtil; | 
| import cc.mrbird.febs.system.entity.Menu; | 
| import cc.mrbird.febs.system.mapper.MenuMapper; | 
| import cc.mrbird.febs.system.service.IMenuService; | 
| import cc.mrbird.febs.system.service.IRoleMenuService; | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
| import com.baomidou.mybatisplus.core.toolkit.StringPool; | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import lombok.RequiredArgsConstructor; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Propagation; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.Arrays; | 
| import java.util.Date; | 
| import java.util.List; | 
|   | 
| /** | 
|  * @author MrBird | 
|  */ | 
| @Service | 
| @RequiredArgsConstructor | 
| @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) | 
| public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService { | 
|   | 
|     private final IRoleMenuService roleMenuService; | 
|     private final ShiroRealm shiroRealm; | 
|   | 
|     @Override | 
|     public List<Menu> findUserPermissions(String username) { | 
|         return this.baseMapper.findUserPermissions(username); | 
|     } | 
|   | 
|     @Override | 
|     public MenuTree<Menu> findUserMenus(String username) { | 
|         List<Menu> menus = this.baseMapper.findUserMenus(username); | 
|         List<MenuTree<Menu>> trees = this.convertMenus(menus); | 
|         return TreeUtil.buildMenuTree(trees); | 
|     } | 
|   | 
|     @Override | 
|     public MenuTree<Menu> findMenus(Menu menu) { | 
|         QueryWrapper<Menu> queryWrapper = new QueryWrapper<>(); | 
|         if (StringUtils.isNotBlank(menu.getMenuName())) { | 
|             queryWrapper.lambda().like(Menu::getMenuName, menu.getMenuName()); | 
|         } | 
|         queryWrapper.lambda().orderByAsc(Menu::getOrderNum); | 
|         List<Menu> menus = this.baseMapper.selectList(queryWrapper); | 
|         List<MenuTree<Menu>> trees = this.convertMenus(menus); | 
|   | 
|         return TreeUtil.buildMenuTree(trees); | 
|     } | 
|   | 
|     @Override | 
|     public List<Menu> findMenuList(Menu menu) { | 
|         QueryWrapper<Menu> queryWrapper = new QueryWrapper<>(); | 
|         if (StringUtils.isNotBlank(menu.getMenuName())) { | 
|             queryWrapper.lambda().like(Menu::getMenuName, menu.getMenuName()); | 
|         } | 
|         queryWrapper.lambda().orderByAsc(Menu::getMenuId); | 
|         return this.baseMapper.selectList(queryWrapper); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void createMenu(Menu menu) { | 
|         menu.setCreateTime(new Date()); | 
|         this.setMenu(menu); | 
|         this.baseMapper.insert(menu); | 
|     } | 
|   | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void updateMenu(Menu menu) { | 
|         menu.setModifyTime(new Date()); | 
|         this.setMenu(menu); | 
|         this.baseMapper.updateById(menu); | 
|   | 
|         shiroRealm.clearCache(); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void deleteMenus(String menuIds) { | 
|         String[] menuIdsArray = menuIds.split(StringPool.COMMA); | 
|         this.delete(Arrays.asList(menuIdsArray)); | 
|   | 
|         shiroRealm.clearCache(); | 
|     } | 
|   | 
|     private List<MenuTree<Menu>> convertMenus(List<Menu> menus) { | 
|         List<MenuTree<Menu>> trees = new ArrayList<>(); | 
|         menus.forEach(menu -> { | 
|             MenuTree<Menu> tree = new MenuTree<>(); | 
|             tree.setId(String.valueOf(menu.getMenuId())); | 
|             tree.setParentId(String.valueOf(menu.getParentId())); | 
|             tree.setTitle(menu.getMenuName()); | 
|             tree.setIcon(menu.getIcon()); | 
|             tree.setHref(menu.getUrl()); | 
|             tree.setData(menu); | 
|             trees.add(tree); | 
|         }); | 
|         return trees; | 
|     } | 
|   | 
|     private void setMenu(Menu menu) { | 
|         if (menu.getParentId() == null) { | 
|             menu.setParentId(Menu.TOP_NODE); | 
|         } | 
|         if (Menu.TYPE_BUTTON.equals(menu.getType())) { | 
|             menu.setUrl(null); | 
|             menu.setIcon(null); | 
|         } | 
|     } | 
|   | 
|     private void delete(List<String> menuIds) { | 
|         List<String> list = new ArrayList<>(menuIds); | 
|         removeByIds(menuIds); | 
|   | 
|         LambdaQueryWrapper<Menu> queryWrapper = new LambdaQueryWrapper<>(); | 
|         queryWrapper.in(Menu::getParentId, menuIds); | 
|         List<Menu> menus = baseMapper.selectList(queryWrapper); | 
|         if (CollectionUtils.isNotEmpty(menus)) { | 
|             List<String> menuIdList = new ArrayList<>(); | 
|             menus.forEach(m -> menuIdList.add(String.valueOf(m.getMenuId()))); | 
|             list.addAll(menuIdList); | 
|             this.roleMenuService.deleteRoleMenusByMenuId(list); | 
|             this.delete(menuIdList); | 
|         } else { | 
|             this.roleMenuService.deleteRoleMenusByMenuId(list); | 
|         } | 
|     } | 
| } |