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); 
 | 
        } 
 | 
    } 
 | 
} 
 |