2025-01-27 21:47:33 +08:00

130 lines
4.8 KiB
Java

package com.upchina.rbac.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.util.StrUtil;
import com.upchina.common.handler.BizException;
import com.upchina.common.query.OnlyIdQuery;
import com.upchina.common.result.ResponseStatus;
import com.upchina.common.vo.BackendUserVO;
import com.upchina.rbac.entity.Menu;
import com.upchina.rbac.entity.Permission;
import com.upchina.rbac.mapper.MenuMapper;
import com.upchina.rbac.mapper.PermissionMapper;
import com.upchina.rbac.query.ListMenuQuery;
import com.upchina.rbac.query.SaveMenuQuery;
import com.upchina.rbac.query.UpdateMenuQuery;
import com.upchina.rbac.vo.MenuVO;
import com.upchina.rbac.vo.PermissionVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class MenuService {
@Resource
private MenuMapper menuMapper;
@Resource
private PermissionMapper permissionMapper;
@Transactional(readOnly = true)
public List<MenuVO> list(ListMenuQuery query, Integer userId, boolean buildTree) {
String keyword = query.getKeyword();
Integer roleId = query.getRoleId();
List<Menu> searchList;
List<MenuVO> searchVoList;
List<MenuVO> allVoList;
QueryWrapper<Menu> wrapper = Wrappers.query();
wrapper.orderByAsc("sort");
boolean isAll = false;
if (StringUtils.isNotEmpty(keyword)) {
wrapper.like("name", keyword).or().like("path", keyword);
searchList = menuMapper.selectList(wrapper);
} else if (userId != null) {
searchList = menuMapper.selectListByUserId(userId);
} else if (roleId != null) {
searchList = menuMapper.selectListByRoleId(roleId);
} else {
searchList = menuMapper.selectList(wrapper);
isAll = true;
}
searchVoList = searchList.stream().map(MenuVO::new).collect(Collectors.toList());
if (!buildTree) {
return searchVoList;
}
if (isAll) {
allVoList = searchVoList;
} else {
QueryWrapper allWrapper = Wrappers.query().orderByAsc("pid");
List<Menu> allList = menuMapper.selectList(allWrapper);
allVoList = allList.stream().map(MenuVO::new).collect(Collectors.toList());
}
// 填充权限
List<Permission> allPermissionList = permissionMapper.selectList(Wrappers.emptyWrapper());
Map<Integer, List<PermissionVO>> menuPermissionListMap = allPermissionList.stream().map(PermissionVO::new).collect(Collectors.groupingBy(PermissionVO::getMenuId));
allVoList.forEach(menuVO -> menuVO.setPermissions(menuPermissionListMap.get(menuVO.getId())));
List<MenuVO> rootList = Collections.emptyList();
if (!allVoList.isEmpty()) {
rootList = (List<MenuVO>) new MenuVO().buildTree(searchVoList, allVoList);
}
rootList.sort(Comparator.comparing(MenuVO::getSort));
if (userId != null) {
convertMenu(rootList);
}
return rootList;
}
@Transactional
public void save(SaveMenuQuery query, BackendUserVO backendUserVO) {
Menu menu = query.toPO();
menuMapper.insert(menu);
}
@Transactional
public void update(UpdateMenuQuery query, BackendUserVO backendUserVO) {
Menu menu = query.toPO();
int rows = menuMapper.updateById(menu);
if (rows == 0) throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
}
@Transactional
public void delete(OnlyIdQuery query, BackendUserVO backendUserVO) {
Integer id = query.getId();
Menu menu = menuMapper.selectById(id);
if (menu == null) {
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
}
QueryWrapper<Menu> wrapper = Wrappers.query();
wrapper.eq("pid", id);
Long count = menuMapper.selectCount(wrapper);
if (count > 0) {
throw new BizException(ResponseStatus.CHILD_EXIST_ERROR);
}
menuMapper.deleteById(query.getId());
}
private void convertMenu(List<MenuVO> list) {
list.forEach(vo -> {
if (vo.getPid() == null || vo.getPid() <= 0) {
vo.setPath("/" + vo.getPath());
vo.setComponent(StringUtils.isEmpty(vo.getComponent()) ? "Layout" : vo.getComponent());
}
if (vo.getChildren() != null && !vo.getChildren().isEmpty()) {
vo.setRedirect("noredirect");
convertMenu(vo.getChildren());
}
});
}
}