package com.gkhy.labRiskManage.domain.account.service.impl; import cn.hutool.core.util.ObjectUtil; 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.model.bo.RoleBindMenuItemBO; 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.model.dto.MenuItemDomainDTO; 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.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 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 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 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 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 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 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 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 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 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 bindList = roleMenuBindRepository.findAllByMenuItemIdAndRoleIdIn(bindBO.getMenuItemId(), bindBO.getUnbindRoleIdList()); if(bindList != null && !bindList.isEmpty()){ roleMenuBindRepository.deleteAll(bindList); } } return true; } @Override public List getMenuInfoByRole(List roleIds) { if(ObjectUtil.isEmpty(roleIds)) return null; List bindList = roleMenuBindRepository.findAllByRoleIdIn(roleIds); if(bindList == null || bindList.isEmpty()) return null; List menuItemIdList = new ArrayList<>(); bindList.forEach(b -> { menuItemIdList.add(b.getMenuItemId()); }); // List menuItemList = menuDomainService.getActiveMenuItemListByIds(menuItemIdList); List menuItemList = menuDomainService.getActiveMenuItemListTreeByIds(menuItemIdList); return menuItemList; } @Override public List getBindRolesByMenuItemId(Long menuItemId) { if(menuItemId == null || menuItemId < 1) return null; List bindRoles = roleMenuBindRepository.findBindRoleListByMenuItemId(menuItemId); return bindRoles; } }