package cc.mrbird.febs.system.service.impl; 
 | 
  
 | 
import cc.mrbird.febs.common.authentication.ShiroRealm; 
 | 
import cc.mrbird.febs.common.entity.FebsConstant; 
 | 
import cc.mrbird.febs.common.entity.QueryRequest; 
 | 
import cc.mrbird.febs.common.utils.SortUtil; 
 | 
import cc.mrbird.febs.system.entity.Role; 
 | 
import cc.mrbird.febs.system.entity.RoleMenu; 
 | 
import cc.mrbird.febs.system.mapper.RoleMapper; 
 | 
import cc.mrbird.febs.system.service.IRoleMenuService; 
 | 
import cc.mrbird.febs.system.service.IRoleService; 
 | 
import cc.mrbird.febs.system.service.IUserRoleService; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.metadata.IPage; 
 | 
import com.baomidou.mybatisplus.core.toolkit.StringPool; 
 | 
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 
 | 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
 | 
import lombok.RequiredArgsConstructor; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Propagation; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.Arrays; 
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * @author MrBird 
 | 
 */ 
 | 
@Service 
 | 
@RequiredArgsConstructor 
 | 
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true) 
 | 
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService { 
 | 
  
 | 
    private final IRoleMenuService roleMenuService; 
 | 
    private final IUserRoleService userRoleService; 
 | 
    private final ShiroRealm shiroRealm; 
 | 
  
 | 
    @Override 
 | 
    public List<Role> findUserRole(String username) { 
 | 
        return this.baseMapper.findUserRole(username); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<Role> findRoles(Role role) { 
 | 
        QueryWrapper<Role> queryWrapper = new QueryWrapper<>(); 
 | 
        if (StringUtils.isNotBlank(role.getRoleName())) { 
 | 
            queryWrapper.lambda().like(Role::getRoleName, role.getRoleName()); 
 | 
        } 
 | 
        return this.baseMapper.selectList(queryWrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public IPage<Role> findRoles(Role role, QueryRequest request) { 
 | 
        Page<Role> page = new Page<>(request.getPageNum(), request.getPageSize()); 
 | 
        page.setSearchCount(false); 
 | 
        page.setTotal(baseMapper.countRole(role)); 
 | 
        SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_DESC, false); 
 | 
        return this.baseMapper.findRolePage(page, role); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public Role findByName(String roleName) { 
 | 
        return this.baseMapper.selectOne(new QueryWrapper<Role>().lambda().eq(Role::getRoleName, roleName)); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void createRole(Role role) { 
 | 
        role.setCreateTime(new Date()); 
 | 
        this.baseMapper.insert(role); 
 | 
        this.saveRoleMenus(role); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void updateRole(Role role) { 
 | 
        role.setModifyTime(new Date()); 
 | 
        this.updateById(role); 
 | 
        List<String> roleIdList = new ArrayList<>(); 
 | 
        roleIdList.add(String.valueOf(role.getRoleId())); 
 | 
        this.roleMenuService.deleteRoleMenusByRoleId(roleIdList); 
 | 
        saveRoleMenus(role); 
 | 
  
 | 
        shiroRealm.clearCache(); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void deleteRoles(String roleIds) { 
 | 
        List<String> list = Arrays.asList(roleIds.split(StringPool.COMMA)); 
 | 
        this.baseMapper.delete(new QueryWrapper<Role>().lambda().in(Role::getRoleId, list)); 
 | 
  
 | 
        this.roleMenuService.deleteRoleMenusByRoleId(list); 
 | 
        this.userRoleService.deleteUserRolesByRoleId(list); 
 | 
    } 
 | 
  
 | 
    private void saveRoleMenus(Role role) { 
 | 
        if (StringUtils.isNotBlank(role.getMenuIds())) { 
 | 
            String[] menuIds = role.getMenuIds().split(StringPool.COMMA); 
 | 
            List<RoleMenu> roleMenus = new ArrayList<>(); 
 | 
            Arrays.stream(menuIds).forEach(menuId -> { 
 | 
                RoleMenu roleMenu = new RoleMenu(); 
 | 
                roleMenu.setMenuId(Long.valueOf(menuId)); 
 | 
                roleMenu.setRoleId(role.getRoleId()); 
 | 
                roleMenus.add(roleMenu); 
 | 
            }); 
 | 
            roleMenuService.saveBatch(roleMenus); 
 | 
        } 
 | 
    } 
 | 
} 
 |