[add] 角色,部门校验

This commit is contained in:
lcj
2025-07-10 14:55:43 +08:00
parent 81f4284b9c
commit 7b9176dff5
11 changed files with 154 additions and 16 deletions

View File

@ -1,17 +1,13 @@
package org.dromara.cory.domain.vo;
import org.dromara.cory.domain.BusContactnotice;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.cory.domain.BusContactnotice;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
@ -52,5 +48,9 @@ public class BusContactnoticeVo implements Serializable {
@ExcelProperty(value = "文档内容")
private String detail;
/**
* 状态
*/
private String status;
}

View File

@ -49,6 +49,15 @@ public class SysRoleController extends BaseController {
return roleService.selectPageRoleList(role, pageQuery);
}
/**
* 获取角色列表
*/
@SaCheckPermission("system:role:list")
@GetMapping("/listNoPage/isSubsetDept")
public List<SysRoleVo> listNoPageByIsSubsetDept(SysRoleBo roleBo) {
return roleService.selectRoleListByIsSubsetDept(roleBo);
}
/**
* 导出角色信息列表
*/

View File

@ -157,6 +157,7 @@ public class SysUserController extends BaseController {
@PostMapping
public R<Void> add(@Validated @RequestBody SysUserBo user) {
deptService.checkDeptDataScope(user.getDeptId());
deptService.checkDeptMatchRole(user.getUserId(), List.of(user.getRoleIds()));
if (!userService.checkUserNameUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
@ -183,6 +184,7 @@ public class SysUserController extends BaseController {
userService.checkUserAllowed(user.getUserId());
userService.checkUserDataScope(user.getUserId());
deptService.checkDeptDataScope(user.getDeptId());
deptService.checkDeptMatchRole(user.getUserId(), List.of(user.getRoleIds()));
if (!userService.checkUserNameUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {

View File

@ -88,6 +88,11 @@ public class SysRoleBo extends BaseEntity {
*/
private String isSpecial;
/**
* 是否有子部门
*/
private String isSubsetDept;
public SysRoleBo(Long roleId) {
this.roleId = roleId;
}

View File

@ -0,0 +1,24 @@
package org.dromara.system.domain.enums;
import lombok.Getter;
/**
* @author lcj
* @date 2025/7/10 9:25
*/
@Getter
public enum SysDeptIsSubsetEnum {
YES("1", ""),
NO("0", "");
private final String code;
private final String message;
SysDeptIsSubsetEnum(String code, String message) {
this.code = code;
this.message = message;
}
}

View File

@ -0,0 +1,23 @@
package org.dromara.system.domain.enums;
import lombok.Getter;
/**
* @author lcj
* @date 2025/7/10 9:26
*/
@Getter
public enum SysRoleIsSpecialEnum {
YES("1", ""),
NO("0", "");
private final String code;
private final String message;
SysRoleIsSpecialEnum(String code, String message) {
this.code = code;
this.message = message;
}
}

View File

@ -93,6 +93,11 @@ public class SysDeptVo implements Serializable {
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
/**
* 是否子集0否 1是
*/
private String isSubset;
/**
* 创建时间
*/

View File

@ -107,6 +107,14 @@ public interface ISysDeptService {
*/
void checkDeptDataScope(Long deptId);
/**
* 校验部门和角色是否匹配
*
* @param deptId 部门id
* @param roleIds 角色id列表
*/
void checkDeptMatchRole(Long deptId, List<Long> roleIds);
/**
* 新增保存部门信息
*

View File

@ -27,6 +27,14 @@ public interface ISysRoleService {
*/
List<SysRoleVo> selectRoleList(SysRoleBo role);
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
List<SysRoleVo> selectRoleListByIsSubsetDept(SysRoleBo role);
/**
* 根据用户ID查询角色列表
*

View File

@ -10,8 +10,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.DeptDTO;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.DeptService;
@ -24,6 +24,8 @@ import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.enums.SysDeptIsSubsetEnum;
import org.dromara.system.domain.enums.SysRoleIsSpecialEnum;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.mapper.SysRoleMapper;
@ -115,12 +117,15 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
Long parentId = d.getParentId();
SysDeptVo sysDeptVo = StreamUtils.findFirst(depts, it -> it.getDeptId().longValue() == parentId);
if (ObjectUtil.isNull(sysDeptVo)) {
List<Tree<Long>> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) ->
List<Tree<Long>> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) -> {
tree.setId(dept.getDeptId())
.setParentId(dept.getParentId())
.setName(dept.getDeptName())
.setWeight(dept.getOrderNum())
.putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus())));
.putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus()));
tree.putExtra("isSubset", dept.getIsSubset());
}
);
Tree<Long> tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId());
treeList.add(tree);
}
@ -294,6 +299,34 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
}
}
/**
* 校验部门和角色是否匹配
*
* @param deptId 部门id
* @param roleIds 角色id列表
*/
@Override
public void checkDeptMatchRole(Long deptId, List<Long> roleIds) {
if (ObjectUtil.isNull(deptId)) {
return;
}
if (LoginHelper.isSuperAdmin()) {
return;
}
SysDept dept = baseMapper.selectById(deptId);
if (dept.getIsSubset().equals(SysDeptIsSubsetEnum.YES.getCode()) && CollUtil.isNotEmpty(roleIds)) {
List<SysRole> roleList = roleMapper.selectByIds(roleIds);
for (SysRole role : roleList) {
if (!role.getStatus().equals(SystemConstants.NORMAL)) {
throw new ServiceException("角色停用,不允许分配", HttpStatus.BAD_REQUEST);
}
if (role.getIsSpecial().equals(SysRoleIsSpecialEnum.NO.getCode())) {
throw new ServiceException("当前部门与角色不匹配,请重新选择", HttpStatus.BAD_REQUEST);
}
}
}
}
/**
* 新增保存部门信息
*

View File

@ -29,6 +29,8 @@ import org.dromara.system.domain.SysRoleDept;
import org.dromara.system.domain.SysRoleMenu;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.enums.SysDeptIsSubsetEnum;
import org.dromara.system.domain.enums.SysRoleIsSpecialEnum;
import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.mapper.SysRoleDeptMapper;
import org.dromara.system.mapper.SysRoleMapper;
@ -72,6 +74,25 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
return baseMapper.selectRoleList(this.buildQueryWrapper(role));
}
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
@Override
public List<SysRoleVo> selectRoleListByIsSubsetDept(SysRoleBo role) {
LambdaQueryWrapper<SysRole> lqw = new LambdaQueryWrapper<>();
String isSubsetDept = role.getIsSubsetDept();
if (StringUtils.isNotBlank(isSubsetDept)) {
if (isSubsetDept.equals(SysDeptIsSubsetEnum.YES.getCode())) {
lqw.eq(SysRole::getIsSpecial, SysRoleIsSpecialEnum.NO.getCode());
}
}
lqw.eq(SysRole::getIsSpecial, true);
return List.of();
}
private Wrapper<SysRole> buildQueryWrapper(SysRoleBo bo) {
Map<String, Object> params = bo.getParams();
QueryWrapper<SysRole> wrapper = Wrappers.query();