package com.gkhy.labRiskManage.domain.sysAdmin.service.impl; import com.gkhy.labRiskManage.commons.enums.ResultCode; import com.gkhy.labRiskManage.commons.exception.BusinessException; import com.gkhy.labRiskManage.domain.account.entity.Role; import com.gkhy.labRiskManage.domain.account.entity.RoleMenuBind; import com.gkhy.labRiskManage.domain.account.model.bo.MenuItemBindRoleBO; import com.gkhy.labRiskManage.domain.account.repository.jpa.RoleMenuBindRepository; import com.gkhy.labRiskManage.domain.account.repository.jpa.RoleRepository; import com.gkhy.labRiskManage.domain.account.service.RoleMenuDomainService; import com.gkhy.labRiskManage.domain.sysAdmin.converter.MenuItemConverter; import com.gkhy.labRiskManage.domain.sysAdmin.entity.MenuItem; import com.gkhy.labRiskManage.domain.sysAdmin.model.bo.CreateNewMenuItemBO; import com.gkhy.labRiskManage.domain.sysAdmin.model.bo.ModifyMenuItemBO; import com.gkhy.labRiskManage.domain.sysAdmin.model.dto.MenuItemDomainDTO; import com.gkhy.labRiskManage.domain.sysAdmin.repository.jpa.MenuItemRepository; import com.gkhy.labRiskManage.domain.sysAdmin.service.MenuDomainService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; @Service public class MenuDomainServiceImpl implements MenuDomainService { @Autowired private MenuItemRepository menuItemRepository; @Autowired private MenuItemConverter menuItemConverter; @Autowired private RoleMenuBindRepository roleMenuBindRepository; @Autowired private RoleRepository roleRepository; @Override @Transactional public MenuItemDomainDTO createNewMenuItem(CreateNewMenuItemBO createBO) { if(createBO == null) throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空"); MenuItem menuItem = new MenuItem(); //获取父级菜单项信息 if(createBO.getParentId() != null && createBO.getParentId() > 0){ Optional parantItemOptional = menuItemRepository.findById(createBO.getParentId()); if(!parantItemOptional.isPresent()) throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "上一级菜单项不存在"); MenuItem parant = parantItemOptional.get(); menuItem.setParentId(parant.getId()); menuItem.setLevel(parant.getLevel()+1); }else { menuItem.setLevel(1); } menuItem.setName(createBO.getName()); menuItem.setDescInfo(createBO.getDescInfo()); menuItem.setPath(createBO.getPath()); menuItem.setTitle(createBO.getTitle()); menuItem.setIcon(createBO.getIcon()); menuItem.setLink(createBO.getLink()); menuItem.setRedirect(createBO.getRedirect()); menuItem.setVisiable(createBO.isVisiable()); menuItem.setDel((byte)0); menuItem.setGmtCreate(LocalDateTime.now()); menuItem.setGmtModified(menuItem.getGmtCreate()); menuItem.setPriority(createBO.getPriority()); menuItem.setComponent(createBO.getComponent()); menuItem.setAliveable(createBO.getAliveable()); menuItem.setAffixable(createBO.getAffixable()); menuItem.setIframeable(createBO.getIframeable()); menuItem.setPublicable(createBO.getPublicable()); menuItem = menuItemRepository.save(menuItem); if(menuItem == null) throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"数据库错误"); //绑定角色 if(createBO.getRoles() != null && !createBO.getRoles().isEmpty()){ List roleList = roleRepository.findAllByIdIn(createBO.getRoles()); if(roleList == null || roleList.isEmpty() || roleList.size() != createBO.getRoles().size()){ throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "角色不存在"); } //绑定角色菜单 List bindList = new ArrayList<>(); Long menuId = menuItem.getId(); roleList.forEach(r -> { RoleMenuBind bind = new RoleMenuBind(); bind.setRoleId(r.getId()); bind.setMenuItemId(menuId); bind.setGmtCreate(LocalDateTime.now()); bind.setGmtModified(bind.getGmtCreate()); bindList.add(bind); }); List saveRs = roleMenuBindRepository.saveAll(bindList); if(saveRs == null || saveRs.isEmpty() || saveRs.size() != bindList.size()){ throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"数据库错误"); } } return menuItemConverter.toMenuItemDTO(menuItem); } @Override @Transactional public boolean setMenuItemEnable(Long menuItemId) { if(menuItemId == null || menuItemId < 1) throw new BusinessException(this.getClass(),ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空"); MenuItem menuItem = menuItemRepository.findDisVisiableById(menuItemId); if(menuItem == null) throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "菜单项不存在"); if(menuItemRepository.setMenuItemVisiabel(menuItemId) != 1) throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"变更状态出错"); else return true; } @Override @Transactional public boolean setMenuItemDisable(Long menuItemId) { if(menuItemId == null || menuItemId < 1) throw new BusinessException(this.getClass(),ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空"); MenuItem menuItem = menuItemRepository.findVisiableById(menuItemId); if(menuItem == null) throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "菜单项不存在"); if(menuItemRepository.setMenuItemDisVisiabel(menuItemId) != 1) throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"变更状态出错"); else return true; } @Override @Transactional public boolean deleteMenuItem(Long menuItemId) { if(menuItemId == null || menuItemId < 1) throw new BusinessException(this.getClass(),ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空"); Optional menuItemOptional = menuItemRepository.findById(menuItemId); if(!menuItemOptional.isPresent()) throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "菜单项不存在"); MenuItem menuItem = menuItemOptional.get(); //限制:存在子菜单就不允许删除 Integer subMenuItemCount = menuItemRepository.countSubMenuItems(menuItemId); if(subMenuItemCount > 0){ throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_NOT_ALLOWED.getCode(), "该菜单项存在子菜单,不允许删除"); } // //删除角色菜单绑定关系 roleMenuBindRepository.deleteByMenuItemId(menuItemId); if(menuItemRepository.deleteByMenuItemId(menuItemId) != 1) throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"变更状态出错"); return true; } @Override public List getAllActiveMenuItems() { List allActiveMenuItemList = menuItemRepository.findAllActive(); if(allActiveMenuItemList == null || allActiveMenuItemList.isEmpty()) return null; List dtoList = new ArrayList<>(); List childList = new ArrayList<>(); allActiveMenuItemList.forEach(item -> { MenuItemDomainDTO dto = menuItemConverter.toMenuItemDTO(item); if(item.getLevel().equals(1) && item.getParentId() == null) dtoList.add(dto); else childList.add(dto); }); if(dtoList != null && dtoList.size() > 0 && childList != null && childList.size() > 0){ for(MenuItemDomainDTO dto : dtoList){ List subMenuItemList = praseChildMenuItems(dto,childList); if(subMenuItemList != null && subMenuItemList.size() > 0) dto.setSubMenuItemList(subMenuItemList); } } return dtoList; } @Override public List getActiveMenuItemListByIds(List idList) { if(idList == null || idList.size() == 0) return null; List allActiveMenuItemList = menuItemRepository.findAllActiveByIdIn(idList); if(allActiveMenuItemList == null || allActiveMenuItemList.isEmpty()) return null; List dtoList = new ArrayList<>(); // allActiveMenuItemList.forEach(item -> { // MenuItemDomainDTO dto = menuItemConverter.toMenuItemDTO(item); // dtoList.add(dto); // }); for (MenuItem item : allActiveMenuItemList){ MenuItemDomainDTO dto = menuItemConverter.toMenuItemDTO(item); dtoList.add(dto); } return dtoList; //old - 解析成树结构 // List childList = new ArrayList<>(); // allActiveMenuItemList.forEach(item -> { // MenuItemDTO dto = menuItemConverter.toMenuItemDTO(item); // if(item.getLevel().equals(1) && item.getParantId() == null) // dtoList.add(dto); // else // childList.add(dto); // }); // if(dtoList != null && dtoList.size() > 0 && childList != null && childList.size() > 0){ // for(MenuItemDTO dto : dtoList){ // List subMenuItemList = praseChildMenuItems(dto,childList); // if(subMenuItemList != null && subMenuItemList.size() > 0) // dto.setSubMenuItemList(subMenuItemList); // } // } // return dtoList; } @Override public MenuItemDomainDTO getMenuItemById(Long menuItemId) { if(menuItemId == null || menuItemId < 1) return null; Optional menuItemOptional = menuItemRepository.findById(menuItemId); if(!menuItemOptional.isPresent()) return null; MenuItem menuItem = menuItemOptional.get(); if(menuItem.getDel().equals(1)) return null; return menuItemConverter.toMenuItemDTO(menuItem); } @Override @Transactional public boolean modifyMenuItem(ModifyMenuItemBO bo) { if(bo == null) throw new BusinessException(this.getClass(),ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空"); if(bo.getMenuItemId() == null || bo.getMenuItemId() < 1) throw new BusinessException(this.getClass(),ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空"); Optional menuItemOptional = menuItemRepository.findById(bo.getMenuItemId()); if(!menuItemOptional.isPresent()) throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(),"菜单项不存在"); MenuItem menuItem = menuItemOptional.get(); menuItem.setParentId(bo.getParentId()); menuItem.setTitle(bo.getTitle()); menuItem.setName(bo.getName()); menuItem.setIcon(bo.getIcon()); menuItem.setPath(bo.getPath()); menuItem.setRedirect(bo.getRedirect()); menuItem.setDescInfo(bo.getDescInfo()); menuItem.setLink(bo.getLink()); menuItem.setVisiable(bo.getVisiable()); // menuItem.setPriority(bo.getPriority()); menuItem.setComponent(bo.getComponent()); menuItem.setAliveable(bo.getAliveable()); menuItem.setAffixable(bo.getAffixable()); menuItem.setIframeable(bo.getIframeable()); menuItem.setPublicable(bo.getPublicable()); if(bo.getParentId() != null){ Optional parantOptional = menuItemRepository.findById(bo.getParentId()); if(!parantOptional.isPresent()) throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(),"上一级菜单项不存在"); MenuItem parantItem = parantOptional.get(); //重置父级菜单项ID menuItem.setParentId(bo.getParentId()); //重置菜单项等级 menuItem.setLevel(parantItem.getLevel()+1); } if(menuItemRepository.save(menuItem) == null){ throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"修改菜单项出错"); } //修改菜单项绑定角色信息 List bindRoles = new ArrayList<>(); List unbindRoles = new ArrayList<>(); List orignRoles = roleMenuBindRepository.findBindRoleListByMenuItemId(menuItem.getId()); Set orignRoleIds = new HashSet<>(); orignRoles.forEach(id -> { orignRoleIds.add(id); }); if(bo.getRoles() != null && !bo.getRoles().isEmpty()){ for(int i =0;i nowRoles = new HashSet<>(); if(bo.getRoles() != null && !bo.getRoles().isEmpty()){ bo.getRoles().forEach(id -> { nowRoles.add(id); }); } for(int i =0;i bindRoleList = roleRepository.findAllByIdIn(bindRoles); if(bindRoleList == null || bindRoleList.size() != bindRoleList.size()){ throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "角色不存在"); } List roleMenuBindList = new ArrayList<>(); bindRoles.forEach(roleId -> { RoleMenuBind b = new RoleMenuBind(); b.setMenuItemId(bo.getMenuItemId()); b.setRoleId(roleId); b.setGmtCreate(LocalDateTime.now()); b.setGmtModified(b.getGmtCreate()); roleMenuBindList.add(b); }); List saveRs = roleMenuBindRepository.saveAll(roleMenuBindList); if(saveRs == null || saveRs.isEmpty() || saveRs.size() != roleMenuBindList.size()){ throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"数据库错误"); } } if(!unbindRoles.isEmpty()){ //解绑角色 Integer unbindCount = roleMenuBindRepository.deleteByMenuItemIdAndRoleIdIn(bo.getMenuItemId(),unbindRoles); } return true; } @Override public List getActiveMenuItemListTreeByIds(List idList) { List orignList = getActiveMenuItemListByIds(idList); if(orignList == null || orignList.isEmpty()) return null; List parantList = new ArrayList<>(); List childList = new ArrayList<>(); orignList.forEach(item -> { if(item.getLevel().equals(1) && item.getParentId() == null) parantList.add(item); else childList.add(item); }); if(parantList != null && parantList.size() > 0 && childList != null && childList.size() > 0){ for(MenuItemDomainDTO dto : parantList){ List subMenuItemList = praseChildMenuItems(dto,childList); if(subMenuItemList != null && subMenuItemList.size() > 0) dto.setSubMenuItemList(subMenuItemList); } } return parantList; } /** * 递归解析菜单数据,获取菜单树状结构 * @param parantItem * @param childItemList * @return */ private List praseChildMenuItems(MenuItemDomainDTO parantItem, List childItemList){ if(childItemList == null || childItemList.size() == 0 || parantItem == null) return null; List resultList = new ArrayList<>(); // childItemList.forEach(child -> { // if(parantItem.getId().equals(child.getParentId())){ // resultList.add(child); // } // }); for(MenuItemDomainDTO child : childItemList){ if(parantItem.getId().equals(child.getParentId())){ resultList.add(child); } } if(resultList.size() > 0){ for (MenuItemDomainDTO child : childItemList){ List childList = praseChildMenuItems(child,childItemList); if(childList != null && childList.size() > 0) child.setSubMenuItemList(childList); } } return resultList; } }