package com.gkhy.fourierSpecialGasMonitor.domain.account.service.impl;
|
|
import cn.hutool.core.util.ObjectUtil;
|
import com.gkhy.fourierSpecialGasMonitor.commons.enums.ResultCode;
|
import com.gkhy.fourierSpecialGasMonitor.commons.exception.BusinessException;
|
import com.gkhy.fourierSpecialGasMonitor.domain.account.entity.Role;
|
import com.gkhy.fourierSpecialGasMonitor.domain.account.entity.RoleMenuBind;
|
import com.gkhy.fourierSpecialGasMonitor.domain.account.model.bo.MenuItemBindRoleBO;
|
import com.gkhy.fourierSpecialGasMonitor.domain.account.model.bo.RoleBindMenuItemBO;
|
import com.gkhy.fourierSpecialGasMonitor.domain.account.repository.jpa.RoleMenuBindRepository;
|
import com.gkhy.fourierSpecialGasMonitor.domain.account.repository.jpa.RoleRepository;
|
import com.gkhy.fourierSpecialGasMonitor.domain.account.service.RoleMenuDomainService;
|
import com.gkhy.fourierSpecialGasMonitor.domain.sysAdmin.model.dto.MenuItemDomainDTO;
|
import com.gkhy.fourierSpecialGasMonitor.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.ArrayList;
|
import java.util.List;
|
import java.util.Optional;
|
|
@Service
|
public class RoleMenuDomainServiceImpl implements RoleMenuDomainService {
|
|
@Autowired
|
private RoleMenuBindRepository roleMenuBindRepository;
|
|
@Autowired
|
private RoleRepository roleRepository;
|
@Autowired
|
private MenuDomainService menuDomainService;
|
@Override
|
@Transactional
|
public boolean roleBindMenu(RoleBindMenuItemBO bindBO) {
|
if(bindBO == null || bindBO.getRoleId() == null)
|
throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空");
|
//校验角色
|
Optional<Role> roleOptional = roleRepository.findById(bindBO.getRoleId());
|
if(!roleOptional.isPresent())
|
throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(),"角色不存在");
|
if(bindBO.getUnbindMenuItemIdList() != null && bindBO.getUnbindMenuItemIdList().size() > 0){
|
//解绑菜单关联
|
//1、检查绑定状态
|
List<RoleMenuBind> unbindCheckList =
|
roleMenuBindRepository.findAllByRoleIdAndMenuItemIdIn(bindBO.getRoleId(),
|
bindBO.getUnbindMenuItemIdList());
|
if(unbindCheckList == null || unbindCheckList.size() != bindBO.getUnbindMenuItemIdList().size())
|
throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "角色未拥有该菜单项访问权限");
|
try {
|
roleMenuBindRepository.deleteAllByIdInBatch(bindBO.getUnbindMenuItemIdList());
|
} catch (Exception e) {
|
throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(), "解除角色菜单项出错");
|
}
|
}
|
if(bindBO.getBindMenuItemIdList() != null && bindBO.getBindMenuItemIdList().size() > 0){
|
//增加菜单关联
|
//1、检查绑定状态
|
List<RoleMenuBind> bindCheckList =
|
roleMenuBindRepository.findAllByRoleIdAndMenuItemIdIn(bindBO.getRoleId(),
|
bindBO.getBindMenuItemIdList());
|
if(bindCheckList != null && bindCheckList.size() > 0)
|
throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_NOT_ALLOWED.getCode(), "角色已拥有菜单权限");
|
//2、校验菜单
|
List<MenuItemDomainDTO> checkBindMenuItems = menuDomainService.getActiveMenuItemListByIds(bindBO.getBindMenuItemIdList());
|
if(checkBindMenuItems == null || checkBindMenuItems.size() != bindBO.getBindMenuItemIdList().size()){
|
throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "菜单项不存在");
|
}
|
//3、添加角色菜单项绑定
|
List<RoleMenuBind> bindList = new ArrayList<>();
|
checkBindMenuItems.forEach(item -> {
|
RoleMenuBind b = new RoleMenuBind();
|
b.setRoleId(bindBO.getRoleId());
|
b.setMenuItemId(item.getId());
|
b.setGmtCreate(LocalDateTime.now());
|
b.setGmtModified(b.getGmtCreate());
|
bindList.add(b);
|
});
|
List<RoleMenuBind> saveRs = roleMenuBindRepository.saveAll(bindList);
|
if(saveRs.size() != bindList.size())
|
throw new BusinessException(this.getClass(),ResultCode.SYSTEM_ERROR_DATABASE_FAIL.getCode(),"保存出错");
|
}
|
return true;
|
}
|
|
@Override
|
@Transactional
|
public boolean menuBindRole(MenuItemBindRoleBO bindBO) {
|
if(bindBO == null || bindBO.getMenuItemId() == null)
|
throw new BusinessException(this.getClass(), ResultCode.PARAM_ERROR_NULL.getCode(),"参数不能为空");
|
//1、校验菜单
|
MenuItemDomainDTO menuItemDomainDTO = menuDomainService.getMenuItemById(bindBO.getMenuItemId());
|
if(menuItemDomainDTO == null)
|
throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(),"菜单项不存在");
|
//2、校验绑定角色
|
if(bindBO.getBindRoleIdList() != null && !bindBO.getBindRoleIdList().isEmpty()){
|
List<Role> roleList = roleRepository.findAllByIdIn(bindBO.getBindRoleIdList());
|
if(roleList == null || roleList.isEmpty() || roleList.size() != bindBO.getBindRoleIdList().size()){
|
throw new BusinessException(this.getClass(),ResultCode.BUSINESS_ERROR_OBJECT_NOT_EXIST.getCode(), "角色不存在");
|
}
|
//绑定角色菜单
|
List<RoleMenuBind> bindList = new ArrayList<>();
|
roleList.forEach(r -> {
|
RoleMenuBind bind = new RoleMenuBind();
|
bind.setRoleId(r.getId());
|
bind.setMenuItemId(bindBO.getMenuItemId());
|
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(),"数据库错误");
|
}
|
}
|
//3、校验解绑角色
|
if(bindBO.getUnbindRoleIdList() != null && !bindBO.getUnbindRoleIdList().isEmpty()){
|
//解绑角色菜单
|
List<RoleMenuBind> bindList = roleMenuBindRepository.findAllByMenuItemIdAndRoleIdIn(bindBO.getMenuItemId(), bindBO.getUnbindRoleIdList());
|
if(bindList != null && !bindList.isEmpty()){
|
roleMenuBindRepository.deleteAll(bindList);
|
}
|
}
|
return true;
|
}
|
|
@Override
|
public List<MenuItemDomainDTO> getMenuInfoByRole(List<Long> roleIds) {
|
if(ObjectUtil.isEmpty(roleIds))
|
return null;
|
List<RoleMenuBind> bindList = roleMenuBindRepository.findAllByRoleIdIn(roleIds);
|
if(bindList == null || bindList.isEmpty())
|
return null;
|
List<Long> menuItemIdList = new ArrayList<>();
|
bindList.forEach(b -> {
|
menuItemIdList.add(b.getMenuItemId());
|
});
|
// List<MenuItemDTO> menuItemList = menuDomainService.getActiveMenuItemListByIds(menuItemIdList);
|
List<MenuItemDomainDTO> menuItemList = menuDomainService.getActiveMenuItemListTreeByIds(menuItemIdList);
|
return menuItemList;
|
}
|
|
@Override
|
public List<Long> getBindRolesByMenuItemId(Long menuItemId) {
|
if(menuItemId == null || menuItemId < 1)
|
return null;
|
List<Long> bindRoles = roleMenuBindRepository.findBindRoleListByMenuItemId(menuItemId);
|
return bindRoles;
|
}
|
}
|