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 implements IRoleService { private final IRoleMenuService roleMenuService; private final IUserRoleService userRoleService; private final ShiroRealm shiroRealm; @Override public List findUserRole(String username) { return this.baseMapper.findUserRole(username); } @Override public List findRoles(Role role) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(role.getRoleName())) { queryWrapper.lambda().like(Role::getRoleName, role.getRoleName()); } return this.baseMapper.selectList(queryWrapper); } @Override public IPage findRoles(Role role, QueryRequest request) { Page 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().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 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 list = Arrays.asList(roleIds.split(StringPool.COMMA)); this.baseMapper.delete(new QueryWrapper().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 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); } } }