package com.monkeylessey.sys.service.impl;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.monkeylessey.enums.general.MenuTypeEnum;
import com.monkeylessey.sys.domain.entity.SysMenu;
import com.monkeylessey.sys.domain.entity.SysOrg;
import com.monkeylessey.sys.domain.form.SysMenuForm;
import com.monkeylessey.sys.domain.query.SysMenuQuery;
import com.monkeylessey.sys.domain.tree.SysMenuTree;
import com.monkeylessey.sys.domain.tree.SysOrgTree;
import com.monkeylessey.sys.domain.vo.SysMenuVO;
import com.monkeylessey.exception.ServiceException;
import com.monkeylessey.sys.mapper.SysMenuMapper;
import com.monkeylessey.response.Result;
import com.monkeylessey.sys.service.SysMenuService;
import com.monkeylessey.framework.utils.SecurityUtil;
import com.monkeylessey.utils.TreeUtil;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author 向培
* @since 2022-05-14
*/
@Service
@RequiredArgsConstructor
public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService {
private final SysMenuMapper menuMapper;
@Override
public Result addMenu(SysMenuForm form) {
form.checkNotBlank();
SysMenu menuEntity = SysMenuForm.getMenuEntity(null, form);
String s = SecurityUtil.getCurrentUserName();
menuEntity.setCreateBy(s);
if (Objects.isNull(menuEntity.getParentId())) {
menuEntity.setParentId("0");
}
if (StringUtils.isNotBlank(form.getMenuPath())) {
// 校验路由唯一
List menus = new LambdaQueryChainWrapper<>(baseMapper)
.eq(SysMenu::getMenuPath, form.getMenuPath())
.select(SysMenu::getMenuType)
.list();
this.checkRepeat(menus, "菜单路径已存在");
}
if (StringUtils.isNotBlank(form.getPermission())) {
// 校验权限唯一
List menus = new LambdaQueryChainWrapper<>(baseMapper)
.eq(SysMenu::getPermission, form.getPermission())
.select(SysMenu::getMenuType)
.list();
this.checkRepeat(menus, "权限已存在");
}
baseMapper.insert(menuEntity);
return Result.ok("添加成功");
}
@Override
public Result editMenu(SysMenuForm form) {
form.checkNotBlank();
if (StringUtils.isNotBlank(form.getMenuPath())) {
// 校验路由唯一
List menus = new LambdaQueryChainWrapper<>(baseMapper)
.eq(SysMenu::getMenuPath, form.getMenuPath())
.select(SysMenu::getMenuType, SysMenu::getMenuPath,SysMenu::getId)
.ne(SysMenu::getId, form.getId())
.list();
// 校路由限唯一
this.checkRepeat(menus, "菜单路径已存在");
}
if (StringUtils.isNotBlank(form.getPermission())) {
// 校验权限唯一
List menus = new LambdaQueryChainWrapper<>(baseMapper)
.eq(SysMenu::getPermission, form.getPermission())
.select(SysMenu::getMenuType, SysMenu::getMenuPath,SysMenu::getId)
.ne(SysMenu::getId, form.getId())
.list();
// 校验权限唯一
this.checkRepeat(menus, "权限已存在");
}
SysMenu menuEntity = SysMenuForm.getMenuEntity(null, form);
String s = SecurityUtil.getCurrentUserName();
menuEntity.setUpdateBy(s);
try {
baseMapper.updateById(menuEntity);
return Result.ok("修改成功");
} catch (Exception e) {
e.printStackTrace();
return Result.error("修改失败");
}
}
private void checkRepeat(List menus, String errMsg) {
if (! CollectionUtils.isEmpty(menus)) {
throw new ServiceException(errMsg);
}
}
@Override
public Result deleteMenuById(String menuId) {
try {
baseMapper.deleteById(menuId);
return Result.ok("删除成功");
} catch (Exception e) {
e.printStackTrace();
return Result.error("删除失败");
}
}
@Override
public Result selectMenuByPage(SysMenuQuery query) {
List menuList = new LambdaQueryChainWrapper<>(baseMapper)
.like(StringUtils.isNotBlank(query.getMenuName()), SysMenu::getMenuName, query.getMenuName())
.orderByAsc(SysMenu::getOrderNum)
.list();
List vos = menuList.stream().map(menu -> {
SysMenuTree vo = SysMenuTree.getVoByEntity(menu, null);
return vo;
}).collect(Collectors.toList());
List tree = TreeUtil.buildTree(vos);
tree.sort(Comparator.comparing(SysMenuTree::getOrderNum));
return Result.ok().data(tree).total(tree.size());
}
@Override
public Result selectMenuTree(SysMenuQuery query) {
List menuList = new LambdaQueryChainWrapper<>(baseMapper)
.like(StringUtils.isNotBlank(query.getMenuName()), SysMenu::getMenuName, query.getMenuName())
.in(query.getExcludeBtn(), SysMenu::getMenuType, MenuTypeEnum.CATALOGUE, MenuTypeEnum.MENU)
.orderByAsc(SysMenu::getOrderNum)
.list();
List vos = menuList.stream().map(menu -> {
SysMenuTree vo = SysMenuTree.getVoByEntity(menu, null);
if (StringUtils.isNotBlank(query.getId()) && vo.getId().equals(query.getId())) {
vo.setDisabled(Boolean.TRUE);
}
return vo;
}).collect(Collectors.toList());
List tree = TreeUtil.buildTree(vos);
tree.sort(Comparator.comparing(SysMenuTree::getOrderNum));
return Result.ok().data(tree).total(tree.size());
}
@Override
public Result selectMenuById(String menuId) {
SysMenuVO sysMenuVO = menuMapper.selectMenuById(menuId);
if ("0".equals(sysMenuVO.getParentId())) {
sysMenuVO.setParentName("主目录");
} else {
SysMenu one = new LambdaQueryChainWrapper<>(baseMapper)
.select(SysMenu::getMenuName)
.eq(Objects.nonNull(sysMenuVO.getParentId()), SysMenu::getId, sysMenuVO.getParentId()).one();
if (one != null) {
sysMenuVO.setParentName(one.getMenuName());
}
}
return Result.ok("").data(sysMenuVO);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Result deleteMenuByIds(List ids) {
return Result.ok("操作成功").data(baseMapper.deleteBatchIds(ids));
}
@Override
public Result menuList() {
List sysMenus = baseMapper.selectList(null);
List vos = sysMenus.stream()
.map(menu -> SysMenuVO.getVoByEntity(menu, null))
.collect(Collectors.toList());
return Result.ok().data(vos);
}
}