package com.gkhy.safePlatform.account.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.gkhy.safePlatform.account.entity.user.*; import com.gkhy.safePlatform.account.model.dto.req.RoleAddReqDTO; import com.gkhy.safePlatform.account.model.dto.req.RoleModReqDTO; import com.gkhy.safePlatform.account.model.dto.resp.RoleRespDTO; import com.gkhy.safePlatform.account.enums.ProjectStatusEnum; import com.gkhy.safePlatform.account.enums.RoleStatusEnum; import com.gkhy.safePlatform.account.service.RoleService; import com.gkhy.safePlatform.account.service.baseService.*; import com.gkhy.safePlatform.commons.co.ContextCacheUser; import com.gkhy.safePlatform.commons.enums.E; import com.gkhy.safePlatform.commons.enums.ResultCodes; import com.gkhy.safePlatform.commons.exception.AusinessException; import com.gkhy.safePlatform.commons.exception.BusinessException; import com.gkhy.safePlatform.commons.utils.BeanCopyUtils; import com.gkhy.safePlatform.commons.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service("roleService") public class RoleServiceImpl implements RoleService { @Autowired private RoleInfoService roleInfoService; @Autowired private ProjectInfoService projectInfoService; @Autowired private RoleProjectInfoService roleProjectInfoService; @Autowired private UserInfoService userInfoService; @Autowired private RoleMenuInfoService roleMenuInfoService; @Override @Transactional public void addRole(RoleAddReqDTO roleAddDto, ContextCacheUser currentUser) { ; if (StringUtils.isBlank(roleAddDto.getRoleCode())) { throw new AusinessException(E.DATA_PARAM_NULL, "角色编码不能为空"); } if (StringUtils.isBlank(roleAddDto.getRoleName())) { throw new AusinessException(E.DATA_PARAM_NULL, "角色名称不能为空"); } String code = roleAddDto.getRoleCode().trim(); String name = roleAddDto.getRoleName().trim(); RoleInfo role; // 编码判重 role = roleInfoService.getRoleInfoByCode(code); if (role != null) { throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色编码已经存在"); } // 名称判重 role = roleInfoService.getRoleInfoByName(name); if (role != null) { throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色名称已经存在"); } // 1.新增角色 RoleInfo roleInfo = new RoleInfo(); roleInfo.setCode(code); roleInfo.setName(name); roleInfo.setGmtCreate(new Date()); roleInfo.setInfo(roleAddDto.getRoleInfo()); roleInfo.setStatus(RoleStatusEnum.ENABLED.getCode()); roleInfoService.saveRoleInfo(roleInfo); // 2.角色和所有项目绑定(以后可能是手动分配项目) List projects = projectInfoService.getAllProject(ProjectStatusEnum.ENABLED); if (projects.size() > 0) { List roleProjectInfos = new ArrayList<>(); RoleProjectInfo roleProjectInfo; for (ProjectInfo projectInfo : projects) { roleProjectInfo = new RoleProjectInfo(); roleProjectInfo.setRoleId(roleInfo.getId()); roleProjectInfo.setProjectId(projectInfo.getId()); roleProjectInfos.add(roleProjectInfo); } roleProjectInfoService.saveRoleProjectInfos(roleProjectInfos); } } @Override @Transactional public void modRole(RoleModReqDTO roleModDto,ContextCacheUser currentUser) { if (roleModDto.getRoleId() == null) { throw new BusinessException(ResultCodes.CLIENT_PARAM_NULL); } if (StringUtils.isBlank(roleModDto.getRoleCode())) { throw new AusinessException(E.DATA_PARAM_NULL, "角色编码不能为空"); } if (StringUtils.isBlank(roleModDto.getRoleName())) { throw new AusinessException(E.DATA_PARAM_NULL, "角色名称不能为空"); } String code = roleModDto.getRoleCode().trim(); String name = roleModDto.getRoleName().trim(); // 1.获取数据库角色 RoleInfo roleInfo = roleInfoService.getRoleInfoById(roleModDto.getRoleId()); if (roleInfo == null) { // 角色不存在 throw new BusinessException(ResultCodes.CLIENT_ROLE_NOT_EXIST); } if (StringUtils.isNotBlank(roleModDto.getRoleInfo())) { roleInfo.setInfo(roleModDto.getRoleInfo()); } // 2.检查字段重复 RoleInfo role; // 编码判重 role = roleInfoService.getRoleInfoByCode(code); if (role != null && !role.getId().equals(roleInfo.getId())) { throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色编码已经存在"); } // 名称判重 role = roleInfoService.getRoleInfoByName(name); if (role != null && !role.getId().equals(roleInfo.getId())) { throw new AusinessException(E.DATA_DATABASE_DUPLICATED, "角色名称已经存在"); } roleInfo.setGmtModified(new Date()); roleInfo.setCode(code); roleInfo.setName(name); roleInfoService.updateRoleInfo(roleInfo); // 3.角色与项目 不做操作 } /** * @Description: 获取所有启用的角色 */ @Override public List getEnableRoleInfos() { List roleInfos = roleInfoService.getRoleInfoByStatus(RoleStatusEnum.ENABLED); RoleRespDTO roleRespDTO; List result = new ArrayList<>(roleInfos.size()); RoleStatusEnum status; for (RoleInfoDO roleInfoDo : roleInfos) { roleRespDTO = new RoleRespDTO(); roleRespDTO.setRoleId(roleInfoDo.getId()); roleRespDTO.setRoleCode(roleInfoDo.getCode()); roleRespDTO.setRoleInfo(roleInfoDo.getInfo()); roleRespDTO.setRoleName(roleInfoDo.getName()); roleRespDTO.setStatus(roleInfoDo.getStatus()); status = RoleStatusEnum.parse(roleInfoDo.getStatus()); assert status != null; roleRespDTO.setStatusDesc(status.getValue()); result.add(roleRespDTO); } return result; } @Override @Transactional public void delRole(Long roleId, ContextCacheUser currentUser) { ; RoleInfo roleInfo = roleInfoService.getRoleInfoById(roleId); if (roleInfo == null) { throw new BusinessException(ResultCodes.CLIENT_ROLE_NOT_EXIST); } assert roleInfo.getStatus() != null; RoleStatusEnum status = RoleStatusEnum.parse(roleInfo.getStatus()); if (status != RoleStatusEnum.ENABLED) { throw new BusinessException(ResultCodes.CLIENT_ROLE_NOT_EXIST); } if (roleId.equals(currentUser.getRoleId())) { throw new AusinessException(E.DATA_PARAM_CHECK_INVALID, "当前删除角色与所处角色相同"); } // 用户占用判断 long count = userInfoService.countByRoleId(roleId); if (count > 0) { throw new AusinessException(E.DATA_BING_RELATION, "请解除用户该角色"); } RoleInfo role = new RoleInfo(); role.setId(roleInfo.getId()); role.setStatus(RoleStatusEnum.ABANDONED.getCode()); role.setGmtModified(new Date()); // 1.角色删除 roleInfoService.updateRoleInfo(role); // 2.用户解绑角色 userInfoService.resetRoleToNullByRoleId(roleId); // 3.角色项目解绑 roleProjectInfoService.unbindProjectByRoleId(roleId); // 4.角色菜单解绑 roleMenuInfoService.unbindMenuByRoleId(roleId); } }