package com.doumee.biz.system.impl;
|
|
import com.doumee.biz.system.SystemMenuBiz;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
import com.doumee.core.model.LoginUserInfo;
|
import com.doumee.core.utils.Constants;
|
import com.doumee.dao.business.CompanyMapper;
|
import com.doumee.dao.business.model.Company;
|
import com.doumee.dao.system.dto.UpdateSystemMenuSortDTO;
|
import com.doumee.dao.system.model.SystemMenu;
|
import com.doumee.dao.system.model.SystemUser;
|
import com.doumee.dao.system.vo.SystemMenuListVO;
|
import com.doumee.dao.system.vo.SystemMenuNodeVO;
|
import com.doumee.service.business.CompanyService;
|
import com.doumee.service.system.SystemMenuService;
|
import com.doumee.service.system.SystemUserService;
|
import org.apache.shiro.SecurityUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.CollectionUtils;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class SystemMenuBizImpl implements SystemMenuBiz {
|
|
@Autowired
|
private SystemMenuService systemMenuService;
|
|
@Autowired
|
private CompanyService companyService;
|
|
@Autowired
|
private SystemUserService systemUserService;
|
|
@Override
|
public Integer create(SystemMenu systemMenu) {
|
// 统计上级菜单下子菜单数量
|
SystemMenu countDto = new SystemMenu();
|
countDto.setParentId(systemMenu.getParentId());
|
countDto.setDeleted(Boolean.FALSE);
|
long subMenuCount = systemMenuService.count(countDto);
|
// 设置新建部门的顺序
|
systemMenu.setSort(Integer.valueOf("" + subMenuCount));
|
return systemMenuService.create(systemMenu);
|
}
|
|
@Override
|
public void updateById(SystemMenu systemMenu) {
|
SystemMenu dbMenu = systemMenuService.findById(systemMenu.getId());
|
// 如果上级菜单发生了变化,则重新调整菜单的排序
|
if (dbMenu.getParentId() != systemMenu.getParentId() && dbMenu.getParentId() != null && !dbMenu.getParentId().equals(systemMenu.getParentId())) {
|
// 统计上级菜单下子菜单数量
|
SystemMenu countDto = new SystemMenu();
|
countDto.setParentId(systemMenu.getParentId());
|
countDto.setDeleted(Boolean.FALSE);
|
long subMenuCount = systemMenuService.count(countDto);
|
systemMenu.setSort(Integer.valueOf("" + subMenuCount));
|
}
|
systemMenuService.updateById(systemMenu);
|
}
|
|
@Override
|
public void updateSort(UpdateSystemMenuSortDTO dto) {
|
SystemMenu currentMenu = systemMenuService.findById(dto.getId());
|
List<SystemMenu> menuPool;
|
if (currentMenu.getParentId() == null) {
|
menuPool = systemMenuService.findRootList();
|
} else {
|
SystemMenu queryDto = new SystemMenu();
|
queryDto.setParentId(currentMenu.getParentId());
|
menuPool = systemMenuService.findList(queryDto);
|
}
|
int currentMenuIndex = 0;
|
for (int i = 0; i < menuPool.size(); i++) {
|
if (menuPool.get(i).getId().equals(dto.getId())) {
|
currentMenuIndex = i;
|
break;
|
}
|
}
|
// 上移
|
if ("top".equals(dto.getDirection())) {
|
if (currentMenuIndex - 1 < 0) {
|
return;
|
}
|
SystemMenu preMenu = menuPool.remove(currentMenuIndex - 1);
|
menuPool.add(currentMenuIndex, preMenu);
|
}
|
// 下移
|
else {
|
if (currentMenuIndex + 1 > menuPool.size() - 1) {
|
return;
|
}
|
SystemMenu nextMenu = menuPool.remove(currentMenuIndex + 1);
|
menuPool.add(currentMenuIndex, nextMenu);
|
}
|
for (int i = 0; i < menuPool.size(); i++) {
|
menuPool.get(i).setSort(i);
|
}
|
// 修改
|
systemMenuService.updateByIdInBatch(menuPool);
|
}
|
|
@Override
|
public List<SystemMenuListVO> findTreeByType(Integer type) {
|
List<SystemMenuListVO> menus = systemMenuService.findList(type);
|
List<SystemMenuListVO> rootMenus = new ArrayList<>();
|
if(type.equals(Constants.ONE)){
|
menus = menus.stream().filter(m->!m.getDisabled()).collect(Collectors.toList());
|
}
|
// 添加根菜单
|
for (SystemMenu menu : menus) {
|
|
if (menu.getParentId() == null) {
|
SystemMenuListVO rootMenu = new SystemMenuListVO();
|
BeanUtils.copyProperties(menu, rootMenu, "children");
|
rootMenu.setChildren(new ArrayList<>());
|
rootMenus.add(rootMenu);
|
}
|
}
|
menus.removeIf(menu -> menu.getParentId() == null);
|
for (SystemMenuListVO child : rootMenus) {
|
this.fillChildren(child, menus);
|
}
|
return rootMenus;
|
}
|
|
@Override
|
public List<SystemMenuNodeVO> findTree (Integer userId,Integer type) {
|
SystemMenu queryDto = new SystemMenu();
|
queryDto.setDeleted(Boolean.FALSE);
|
List<SystemMenu> menus = new ArrayList<SystemMenu>();
|
List<SystemMenuNodeVO> rootNodes = new ArrayList<>();
|
menus = systemMenuService.findByUserId(userId,type);
|
if(type.equals(Constants.ONE) || type.equals(Constants.TWO)){
|
LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
Company company = companyService.findById(loginUserInfo.getCompanyId());
|
if(Objects.isNull(company)){
|
return rootNodes;
|
}
|
SystemUser systemUser = systemUserService.findById(userId);
|
if(Objects.isNull(systemUser)){
|
return rootNodes;
|
}
|
if(company.getUsername().equals(systemUser.getUsername())){
|
SystemMenu systemMenu = new SystemMenu();
|
systemMenu.setType(type);
|
systemMenu.setDeleted(Boolean.FALSE);
|
systemMenu.setDisabled(Boolean.FALSE);
|
menus = systemMenuService.findList(systemMenu);
|
}
|
}
|
// 添加根菜单
|
for (SystemMenu menu : menus) {
|
if (menu.getParentId() == null) {
|
SystemMenuNodeVO nodeVO = new SystemMenuNodeVO();
|
nodeVO.setId(menu.getId());
|
nodeVO.setIndex("menu_" + menu.getId());
|
nodeVO.setLabel(menu.getName());
|
nodeVO.setUrl(menu.getPath());
|
nodeVO.setIcon(menu.getIcon());
|
nodeVO.setChildren(new ArrayList<>());
|
rootNodes.add(nodeVO);
|
}
|
}
|
menus.removeIf(menu -> menu.getParentId() == null);
|
for (SystemMenuNodeVO child : rootNodes) {
|
this.fillChildren(child, menus);
|
}
|
return rootNodes;
|
}
|
|
@Override
|
public void deleteById(Integer id) {
|
List<Integer> ids = systemMenuService.findChildren(id);
|
ids.add(id);
|
for (Integer id2 : ids) {
|
SystemMenu menu = systemMenuService.findById(id2);
|
if (menu == null) {
|
continue;
|
}
|
if (menu.getFixed()) {
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "请勿删除" + menu.getName() + ", 因为这是固定菜单");
|
}
|
}
|
systemMenuService.deleteByIdInBatch(ids);
|
}
|
|
@Override
|
@Transactional
|
public void deleteByIdInBatch(List<Integer> ids) {
|
if (CollectionUtils.isEmpty(ids)) {
|
return;
|
}
|
for (Integer id : ids) {
|
this.deleteById(id);
|
}
|
}
|
|
/**
|
* 填充子菜单
|
* @author Eva.Caesar Liu
|
* @date 2023/03/21 14:49
|
*/
|
private void fillChildren(SystemMenuListVO parent, List<SystemMenuListVO> menus) {
|
if (menus.size() == 0) {
|
return;
|
}
|
List<Integer> handledIds = new ArrayList<>();
|
for (SystemMenu menu : menus) {
|
if (parent.getId().equals(menu.getParentId())) {
|
SystemMenuListVO child = new SystemMenuListVO();
|
BeanUtils.copyProperties(menu, child, "children");
|
child.setChildren(new ArrayList<>());
|
parent.getChildren().add(child);
|
handledIds.add(menu.getId());
|
}
|
}
|
menus.removeIf(menu -> handledIds.contains(menu.getId()));
|
parent.setHasChildren(Boolean.TRUE);
|
if (parent.getChildren().size() > 0) {
|
parent.setHasChildren(Boolean.FALSE);
|
for (SystemMenuListVO child : parent.getChildren()) {
|
this.fillChildren(child, menus);
|
}
|
}
|
}
|
|
/**
|
* 填充子菜单
|
* @author Eva.Caesar Liu
|
* @date 2023/03/21 14:49
|
*/
|
private void fillChildren(SystemMenuNodeVO parent, List<SystemMenu> menus) {
|
if (menus.size() == 0) {
|
return;
|
}
|
List<Integer> handledIds = new ArrayList<>();
|
for (SystemMenu menu : menus) {
|
if (parent.getId().equals(menu.getParentId())) {
|
SystemMenuNodeVO child = new SystemMenuNodeVO();
|
child.setId(menu.getId());
|
child.setLabel(menu.getName());
|
child.setUrl(menu.getPath());
|
child.setIcon(menu.getIcon());
|
child.setIndex("menu_" + menu.getId());
|
child.setChildren(new ArrayList<>());
|
parent.getChildren().add(child);
|
handledIds.add(menu.getId());
|
}
|
}
|
menus.removeIf(menu -> handledIds.contains(menu.getId()));
|
for (SystemMenuNodeVO child : parent.getChildren()) {
|
this.fillChildren(child, menus);
|
}
|
}
|
}
|