You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fu-hsi-service/src/main/java/com/supervision/police/service/impl/SystemRoleServiceImpl.java

126 lines
5.0 KiB
Java

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<SystemRoleMapper, SystemRole>
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<RoleDTO> list(String roleName, Integer pageNum, Integer pageSize) {
Page<SystemRole> 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<String> roleIdList = page.getRecords().stream().map(SystemRole::getId).toList();
// 角色关联的用户数量
List<SystemUserRoleRelation> userRoleList = systemUserRoleRelationService.listUserRoleByRoleIdList(roleIdList);
Map<String, Long> roleUserCount = userRoleList.stream().collect(Collectors.groupingBy(SystemUserRoleRelation::getRoleId, Collectors.counting()));
// 角色关联的菜单数据
List<SystemRoleMenuRelation> roleMenuList = roleMenuRelationService.listRoleMenuByRoleIdList(roleIdList);
Map<String, List<SystemRoleMenuRelation>> roleMenuMap = roleMenuList.stream().collect(Collectors.groupingBy(SystemRoleMenuRelation::getRoleId));
return page.convert(systemRole ->
new RoleDTO(systemRole, roleUserCount.get(systemRole.getId()),roleMenuMap.get(systemRole.getId())));
}
}