package com.supervision.police.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.SystemRole; import com.supervision.police.domain.SystemRoleMenuRelation; import com.supervision.police.domain.SystemUserRoleRelation; import com.supervision.police.dto.RoleDTO; import com.supervision.police.service.SystemRoleMenuRelationService; import com.supervision.police.service.SystemRoleService; import com.supervision.police.mapper.SystemRoleMapper; import com.supervision.police.service.SystemUserRoleRelationService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author Administrator * @description 针对表【system_role(角色表)】的数据库操作Service实现 * @createDate 2024-07-31 11:02:43 */ @Slf4j @Service @RequiredArgsConstructor public class SystemRoleServiceImpl extends ServiceImpl implements SystemRoleService{ private final SystemRoleMenuRelationService systemRoleMenuRelationService; private final SystemUserRoleRelationService systemUserRoleRelationService; private final SystemRoleMenuRelationService roleMenuRelationService; @Override @Transactional(transactionManager = "dataSourceTransactionManager",rollbackFor = Exception.class) public String saveRole(RoleDTO roleDTO) { Assert.notEmpty(roleDTO.getRoleName(), "角色名称不能为空"); Long count = super.lambdaQuery().eq(SystemRole::getRoleName, roleDTO.getRoleName()).count(); Assert.isTrue(count == 0, "角色名称已存在"); // 保存角色 SystemRole systemRole = roleDTO.toSystemRole(); super.save(systemRole); // 保存角色关联的菜单信息 if (CollUtil.isNotEmpty(roleDTO.getMenuIdList())){ roleDTO.setId(systemRole.getId()); roleDTO.menuIdListToRoleMenu().forEach(systemRoleMenuRelationService::save); } return systemRole.getId(); } @Override @Transactional(transactionManager = "dataSourceTransactionManager",rollbackFor = Exception.class) public void updateRole(RoleDTO roleDTO) { Assert.notEmpty(roleDTO.getId(), "角色id不能为空"); Assert.notEmpty(roleDTO.getRoleName(), "角色名称不能为空"); SystemRole dbSystemRole = super.getById(roleDTO.getId()); Assert.notNull(dbSystemRole, "角色不存在"); if (!StrUtil.equals(dbSystemRole.getRoleName(), roleDTO.getRoleName())){ // 判断角色名称是否重复 Long count = super.lambdaQuery().eq(SystemRole::getRoleName, roleDTO.getRoleName()).count(); Assert.isTrue(count == 0, "角色名称已存在"); } dbSystemRole.setRoleName(roleDTO.getRoleName()); dbSystemRole.setRemark(roleDTO.getRemark()); // 更新角色基本数据 super.updateById(dbSystemRole); // 更新角色关联的菜单信息 systemRoleMenuRelationService.updateRoleMenu(dbSystemRole.getId(), roleDTO.getMenuIdList()); } @Override public Boolean deleteRole(String roleId) { Assert.notEmpty(roleId, "角色id不能为空"); boolean success = super.removeById(roleId); if (success){ systemRoleMenuRelationService.deleteRoleMenu(roleId); } return success; } @Override public IPage list(String roleName, Integer pageNum, Integer pageSize) { Page page = super.lambdaQuery().like(StrUtil.isNotEmpty(roleName), SystemRole::getRoleName, roleName) .orderBy(true, false, SystemRole::getUpdateTime).page(new Page<>(pageNum, pageSize)); if (CollUtil.isEmpty(page.getRecords())){ return Page.of(pageNum, pageSize,page.getTotal()); } List roleIdList = page.getRecords().stream().map(SystemRole::getId).toList(); // 角色关联的用户数量 List userRoleList = systemUserRoleRelationService.listUserRoleByRoleIdList(roleIdList); Map roleCount = userRoleList.stream().collect(Collectors.groupingBy(SystemUserRoleRelation::getRoleId, Collectors.counting())); // 角色关联的菜单数据 List roleMenuList = roleMenuRelationService.listRoleMenuByRoleIdList(roleIdList); Map> roleMenuMap = roleMenuList.stream().collect(Collectors.groupingBy(SystemRoleMenuRelation::getRoleId)); return page.convert(systemRole -> new RoleDTO(systemRole, roleCount.get(systemRole.getId()),roleMenuMap.get(systemRole.getId()))); } }