package com.gkhy.testFourierSpecialGasMonitor.domain.sysAdmin.service.impl;
|
|
import com.gkhy.testFourierSpecialGasMonitor.commons.enums.ResultCode;
|
import com.gkhy.testFourierSpecialGasMonitor.commons.exception.BusinessException;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.account.entity.Role;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.account.entity.RoleMenuBind;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.account.repository.jpa.RoleMenuBindRepository;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.account.repository.jpa.RoleRepository;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.sysAdmin.converter.MenuItemConverter;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.sysAdmin.entity.MenuItem;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.sysAdmin.model.bo.CreateNewMenuItemBO;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.sysAdmin.model.bo.ModifyMenuItemBO;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.sysAdmin.model.dto.MenuItemDomainDTO;
|
import com.gkhy.testFourierSpecialGasMonitor.domain.sysAdmin.repository.jpa.MenuItemRepository;
|
import com.gkhy.testFourierSpecialGasMonitor.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<MenuItem> 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<Role> 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<RoleMenuBind> 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<RoleMenuBind> 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<MenuItem> 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<MenuItemDomainDTO> getAllActiveMenuItems() {
|
List<MenuItem> allActiveMenuItemList = menuItemRepository.findAllActive();
|
if(allActiveMenuItemList == null || allActiveMenuItemList.isEmpty())
|
return null;
|
List<MenuItemDomainDTO> dtoList = new ArrayList<>();
|
List<MenuItemDomainDTO> 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<MenuItemDomainDTO> subMenuItemList = praseChildMenuItems(dto,childList);
|
if(subMenuItemList != null && subMenuItemList.size() > 0)
|
dto.setSubMenuItemList(subMenuItemList);
|
}
|
}
|
return dtoList;
|
}
|
|
@Override
|
public List<MenuItemDomainDTO> getActiveMenuItemListByIds(List<Long> idList) {
|
if(idList == null || idList.size() == 0)
|
return null;
|
List<MenuItem> allActiveMenuItemList = menuItemRepository.findAllActiveByIdIn(idList);
|
if(allActiveMenuItemList == null || allActiveMenuItemList.isEmpty())
|
return null;
|
List<MenuItemDomainDTO> 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<MenuItemDTO> 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<MenuItemDTO> 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<MenuItem> 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<MenuItem> 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<MenuItem> 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<Long> bindRoles = new ArrayList<>();
|
List<Long> unbindRoles = new ArrayList<>();
|
List<Long> orignRoles = roleMenuBindRepository.findBindRoleListByMenuItemId(menuItem.getId());
|
Set<Long> orignRoleIds = new HashSet<>();
|
orignRoles.forEach(id -> {
|
orignRoleIds.add(id);
|
});
|
if(bo.getRoles() != null && !bo.getRoles().isEmpty()){
|
for(int i =0;i<bo.getRoles().size();i++){
|
if(!orignRoleIds.contains(bo.getRoles().get(i))){
|
bindRoles.add(bo.getRoles().get(i));
|
}
|
}
|
}
|
Set<Long> nowRoles = new HashSet<>();
|
if(bo.getRoles() != null && !bo.getRoles().isEmpty()){
|
bo.getRoles().forEach(id -> {
|
nowRoles.add(id);
|
});
|
}
|
for(int i =0;i<orignRoles.size();i++){
|
if(!nowRoles.contains(orignRoles.get(i))){
|
unbindRoles.add(orignRoles.get(i));
|
}
|
}
|
if(!bindRoles.isEmpty()){
|
//绑定角色
|
//检查角色是否存在
|
List<Role> bindRoleList = roleRepository.findAllByIdIn(bindRoles);
|
if(bindRoleList == null || bindRoleList.size() != bindRoleList.size()){
|
throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "角色不存在");
|
}
|
List<RoleMenuBind> 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<RoleMenuBind> 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<MenuItemDomainDTO> getActiveMenuItemListTreeByIds(List<Long> idList) {
|
List<MenuItemDomainDTO> orignList = getActiveMenuItemListByIds(idList);
|
if(orignList == null || orignList.isEmpty())
|
return null;
|
List<MenuItemDomainDTO> parantList = new ArrayList<>();
|
List<MenuItemDomainDTO> 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<MenuItemDomainDTO> subMenuItemList = praseChildMenuItems(dto,childList);
|
if(subMenuItemList != null && subMenuItemList.size() > 0)
|
dto.setSubMenuItemList(subMenuItemList);
|
}
|
}
|
return parantList;
|
}
|
|
/**
|
* 递归解析菜单数据,获取菜单树状结构
|
* @param parantItem
|
* @param childItemList
|
* @return
|
*/
|
private List<MenuItemDomainDTO> praseChildMenuItems(MenuItemDomainDTO parantItem, List<MenuItemDomainDTO> childItemList){
|
if(childItemList == null || childItemList.size() == 0 || parantItem == null)
|
return null;
|
List<MenuItemDomainDTO> 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<MenuItemDomainDTO> childList = praseChildMenuItems(child,childItemList);
|
if(childList != null && childList.size() > 0)
|
child.setSubMenuItemList(childList);
|
}
|
}
|
return resultList;
|
}
|
}
|