Browse Source

feat(role): 角色模块支持组织多对多关联

- 将角色与组织的关联关系从一对一改为一对多多关联
- 修改SysRoleController中的add和update方法,将deptId参数改为deptIdListString
- 在SysRoleService中更新saveNew、update和verifyRelatedData方法以支持部门Id集合
- 修改getRoleDept方法返回部门列表而不是单个部门
- 在SysRoleVo中添加deptList字段存储关联的组织列表
- 更新SysRoleServiceImpl实现类中的相关业务逻辑
- 在SysDeptController中添加类型默认值处理逻辑
- 优化导入包声明,使用更精确的类引用
feature/form-permission-control
chenchuchuan 2 weeks ago
parent
commit
88d393d1f7
  1. 11
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysDeptController.java
  2. 39
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java
  3. 20
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java
  4. 18
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysDeptServiceImpl.java
  5. 46
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysRoleServiceImpl.java
  6. 6
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysRoleVo.java

11
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysDeptController.java

@ -29,7 +29,10 @@ import org.springdoc.api.annotations.ParameterObject; @@ -29,7 +29,10 @@ import org.springdoc.api.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
@ -145,6 +148,12 @@ public class SysDeptController { @@ -145,6 +148,12 @@ public class SysDeptController {
}
SysDept sysDeptFilter = MyModelUtil.copyTo(sysDeptDtoFilter, SysDept.class);
String orderBy = MyOrderParam.buildOrderBy(orderParam, SysDept.class);
if (sysDeptFilter == null){
sysDeptFilter = new SysDept();
}
if (sysDeptFilter.getType() == null){
sysDeptFilter.setType(0);
}
List<SysDept> sysDeptList = sysDeptService.getSysDeptListWithRelation(sysDeptFilter, orderBy);
return ResponseResult.success(MyPageUtil.makeResponseData(sysDeptList, SysDept.INSTANCE));
}

39
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java

@ -21,6 +21,7 @@ import apelet.tenantadmin.upms.service.SysUserService; @@ -21,6 +21,7 @@ import apelet.tenantadmin.upms.service.SysUserService;
import apelet.tenantadmin.upms.vo.SysDeptVo;
import apelet.tenantadmin.upms.vo.SysRoleVo;
import apelet.tenantadmin.upms.vo.SysUserVo;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.github.pagehelper.Page;
import com.github.pagehelper.page.PageMethod;
@ -59,7 +60,7 @@ public class SysRoleController { @@ -59,7 +60,7 @@ public class SysRoleController {
*
* @param sysRoleDto 新增角色对象
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔
* @param deptId 组织Id可选
* @param deptIdListString 组织Id列表可选多对多关联多个deptId之间逗号分隔
* @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @return 应答结果对象包含新增角色的主键Id
*/
@ -69,22 +70,25 @@ public class SysRoleController { @@ -69,22 +70,25 @@ public class SysRoleController {
public ResponseResult<Long> add(
@MyRequestBody SysRoleDto sysRoleDto,
@MyRequestBody String menuIdListString,
@MyRequestBody Long deptId,
@MyRequestBody String deptIdListString,
@MyRequestBody List<RoleFormButtonDto> buttonConfigList) {
String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto);
if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
SysRole sysRole = MyModelUtil.copyTo(sysRoleDto, SysRole.class);
CallResult result = sysRoleService.verifyRelatedData(sysRole, null, menuIdListString, deptId);
CallResult result = sysRoleService.verifyRelatedData(sysRole, null, menuIdListString, deptIdListString);
if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
}
Set<Long> menuIdSet = null;
Set<Long> deptIdSet = null;
if (result.getData() != null) {
menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
JSONObject data = result.getData();
menuIdSet = data.getObject("menuIdSet", new TypeReference<Set<Long>>(){});
deptIdSet = data.getObject("deptIdSet", new TypeReference<Set<Long>>(){});
}
sysRoleService.saveNew(sysRole, menuIdSet, deptId);
sysRoleService.saveNew(sysRole, menuIdSet, deptIdSet);
// 按钮权限配置(可选,不传不影响原有逻辑)
if (buttonConfigList != null && !buttonConfigList.isEmpty()) {
buttonConfigList.forEach(dto -> dto.setRoleId(sysRole.getRoleId()));
@ -98,7 +102,7 @@ public class SysRoleController { @@ -98,7 +102,7 @@ public class SysRoleController {
*
* @param sysRoleDto 更新角色对象
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔
* @param deptId 组织Id可选
* @param deptIdListString 组织Id列表可选多对多关联多个deptId之间逗号分隔
* @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @return 应答结果对象
*/
@ -107,7 +111,7 @@ public class SysRoleController { @@ -107,7 +111,7 @@ public class SysRoleController {
public ResponseResult<Void> update(
@MyRequestBody SysRoleDto sysRoleDto,
@MyRequestBody String menuIdListString,
@MyRequestBody Long deptId,
@MyRequestBody String deptIdListString,
@MyRequestBody List<RoleFormButtonDto> buttonConfigList) {
String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class);
if (errorMessage != null) {
@ -119,15 +123,18 @@ public class SysRoleController { @@ -119,15 +123,18 @@ public class SysRoleController {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
SysRole sysRole = MyModelUtil.copyTo(sysRoleDto, SysRole.class);
CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString, deptId);
CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString, deptIdListString);
if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
}
Set<Long> menuIdSet = null;
Set<Long> deptIdSet = null;
if (result.getData() != null) {
menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
JSONObject data = result.getData();
menuIdSet = data.getObject("menuIdSet", new TypeReference<Set<Long>>(){});
deptIdSet = data.getObject("deptIdSet", new TypeReference<Set<Long>>(){});
}
if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet, deptId)) {
if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet, deptIdSet)) {
errorMessage = "更新失败,数据不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
}
@ -201,6 +208,8 @@ public class SysRoleController { @@ -201,6 +208,8 @@ public class SysRoleController {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
}
SysRoleVo sysRoleVo = MyModelUtil.copyTo(sysRole, SysRoleVo.class);
// 填充关联的组织列表(多对多,仅需要deptId和deptName)
sysRoleVo.setDeptList(sysRoleService.getRoleDept(roleId));
return ResponseResult.success(sysRoleVo);
}
@ -376,18 +385,18 @@ public class SysRoleController { @@ -376,18 +385,18 @@ public class SysRoleController {
}
/**
* 查询角色关联的组织用于编辑页回显
* 查询角色关联的组织列表用于编辑页回显多对多
*
* @param roleId 角色Id
* @return 应答结果对象包含角色关联的组织信息
* @return 应答结果对象包含角色关联的组织信息列表
*/
@GetMapping("/getRoleDept")
public ResponseResult<SysDeptVo> getRoleDept(@RequestParam Long roleId) {
public ResponseResult<List<SysDeptVo>> getRoleDept(@RequestParam Long roleId) {
if (MyCommonUtil.existBlankArgument(roleId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
SysDeptVo deptVo = sysRoleService.getRoleDept(roleId);
return ResponseResult.success(deptVo);
List<SysDeptVo> deptVoList = sysRoleService.getRoleDept(roleId);
return ResponseResult.success(deptVoList);
}
/**

20
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java

@ -2,8 +2,8 @@ package apelet.tenantadmin.upms.service; @@ -2,8 +2,8 @@ package apelet.tenantadmin.upms.service;
import apelet.common.core.base.service.IBaseService;
import apelet.common.core.object.CallResult;
import apelet.common.core.object.MyPageData;
import apelet.common.core.object.MyOrderParam;
import apelet.common.core.object.MyPageData;
import apelet.common.core.object.MyPageParam;
import apelet.tenantadmin.upms.model.SysRole;
import apelet.tenantadmin.upms.model.SysUserRole;
@ -27,10 +27,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> { @@ -27,10 +27,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
*
* @param role 新增的角色对象
* @param menuIdSet 菜单Id列表
* @param deptId 组织Id可选
* @param deptIdSet 组织Id集合可选多对多关联
* @return 新增后的角色对象
*/
SysRole saveNew(SysRole role, Set<Long> menuIdSet, Long deptId);
SysRole saveNew(SysRole role, Set<Long> menuIdSet, Set<Long> deptIdSet);
/**
* 更新角色对象
@ -38,10 +38,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> { @@ -38,10 +38,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
* @param role 更新的角色对象
* @param originalRole 原有的角色对象
* @param menuIdSet 菜单Id列表
* @param deptId 组织Id可选
* @param deptIdSet 组织Id集合可选多对多关联
* @return 更新成功返回true否则false
*/
boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Long deptId);
boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Set<Long> deptIdSet);
/**
* 删除指定角色
@ -90,10 +90,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> { @@ -90,10 +90,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
* @param sysRole 当前操作的对象
* @param originalSysRole 原有对象
* @param menuIdListString 逗号分隔的menuId列表
* @param deptId 组织Id可选
* @param deptIdListString 逗号分隔的组织Id列表可选多对多关联
* @return 验证结果
*/
CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, Long deptId);
CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString);
/**
* 查询角色的权限资源地址列表同时返回详细的分配路径
@ -114,12 +114,12 @@ public interface SysRoleService extends IBaseService<SysRole, Long> { @@ -114,12 +114,12 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
List<Map<String, Object>> getSysPermCodeListWithDetail(Long roleId, String permCode);
/**
* 查询角色关联的组织用于编辑页回显
* 查询角色关联的组织列表用于编辑页回显多对多
*
* @param roleId 角色Id
* @return 角色关联的组织Vo如果不存在返回null
* @return 角色关联的组织Vo列表如果不存在返回空列表
*/
SysDeptVo getRoleDept(Long roleId);
List<SysDeptVo> getRoleDept(Long roleId);
/**
* 根据组织ID分页查询关联角色

18
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysDeptServiceImpl.java

@ -3,14 +3,20 @@ package apelet.tenantadmin.upms.service.impl; @@ -3,14 +3,20 @@ package apelet.tenantadmin.upms.service.impl;
import apelet.common.core.base.dao.BaseDaoMapper;
import apelet.common.core.base.service.BaseService;
import apelet.common.core.constant.GlobalDeletedFlag;
import apelet.common.core.object.*;
import apelet.common.core.object.MyOrderParam;
import apelet.common.core.object.MyPageData;
import apelet.common.core.object.MyPageParam;
import apelet.common.core.object.MyRelationParam;
import apelet.common.core.util.MyModelUtil;
import apelet.common.core.util.MyPageUtil;
import apelet.common.ext.base.BizWidgetDatasource;
import apelet.common.ext.constant.BizWidgetDatasourceType;
import apelet.common.ext.util.BizWidgetDatasourceExtHelper;
import apelet.common.sequence.wrapper.IdGeneratorWrapper;
import apelet.tenantadmin.upms.dao.*;
import apelet.tenantadmin.upms.dao.SysDataPermDeptMapper;
import apelet.tenantadmin.upms.dao.SysDeptMapper;
import apelet.tenantadmin.upms.dao.SysDeptPostMapper;
import apelet.tenantadmin.upms.dao.SysDeptRelationMapper;
import apelet.tenantadmin.upms.model.*;
import apelet.tenantadmin.upms.service.SysDeptService;
import apelet.tenantadmin.upms.service.SysUserService;
@ -29,7 +35,10 @@ import org.springframework.stereotype.Service; @@ -29,7 +35,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
@ -109,6 +118,9 @@ public class SysDeptServiceImpl extends BaseService<SysDept, Long> implements Sy @@ -109,6 +118,9 @@ public class SysDeptServiceImpl extends BaseService<SysDept, Long> implements Sy
public SysDept saveNew(SysDept sysDept, SysDept parentSysDept) {
sysDept.setDeptId(idGenerator.nextLongId());
sysDept.setDeletedFlag(GlobalDeletedFlag.NORMAL);
if (sysDept.getType() == null) {
sysDept.setType(0);
}
MyModelUtil.fillCommonsForInsert(sysDept);
sysDeptMapper.insert(sysDept);
// 同步插入部门关联关系数据

46
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysRoleServiceImpl.java

@ -119,7 +119,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -119,7 +119,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
*/
@Transactional(rollbackFor = Exception.class)
@Override
public SysRole saveNew(SysRole role, Set<Long> menuIdSet, Long deptId) {
public SysRole saveNew(SysRole role, Set<Long> menuIdSet, Set<Long> deptIdSet) {
role.setRoleId(idGenerator.nextLongId());
MyModelUtil.fillCommonsForInsert(role);
role.setDeletedFlag(GlobalDeletedFlag.NORMAL);
@ -132,13 +132,15 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -132,13 +132,15 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
sysRoleMenuMapper.insert(roleMenu);
}
}
// 写入角色-组织关联
if (deptId != null) {
// 写入角色-组织关联(多对多)
if (CollUtil.isNotEmpty(deptIdSet)) {
for (Long deptId : deptIdSet) {
SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(role.getRoleId());
roleDept.setDeptId(deptId);
sysRoleDeptMapper.insert(roleDept);
}
}
return role;
}
@ -152,7 +154,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -152,7 +154,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Long deptId) {
public boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Set<Long> deptIdSet) {
MyModelUtil.fillCommonsForUpdate(role, originalRole);
if (sysRoleMapper.updateById(role) != 1) {
return false;
@ -168,16 +170,18 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -168,16 +170,18 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
sysRoleMenuMapper.insert(roleMenu);
}
}
// 先删后插角色-组织关联
// 先删后插角色-组织关联(多对多)
SysRoleDept deleteFilter = new SysRoleDept();
deleteFilter.setRoleId(role.getRoleId());
sysRoleDeptMapper.delete(new QueryWrapper<>(deleteFilter));
if (deptId != null) {
if (CollUtil.isNotEmpty(deptIdSet)) {
for (Long deptId : deptIdSet) {
SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(role.getRoleId());
roleDept.setDeptId(deptId);
sysRoleDeptMapper.insert(roleDept);
}
}
return true;
}
@ -263,7 +267,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -263,7 +267,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
* @return 验证结果
*/
@Override
public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, Long deptId) {
public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString) {
JSONObject jsonObject = null;
if (StringUtils.isNotBlank(menuIdListString)) {
Set<Long> menuIdSet = Arrays.stream(
@ -274,15 +278,17 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -274,15 +278,17 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
jsonObject = new JSONObject();
jsonObject.put("menuIdSet", menuIdSet);
}
// 校验组织ID(可选)
if (deptId != null) {
if (!sysDeptService.existId(deptId)) {
// 校验组织ID列表(可选,多对多关联)
if (StringUtils.isNotBlank(deptIdListString)) {
Set<Long> deptIdSet = Arrays.stream(
deptIdListString.split(",")).map(Long::valueOf).collect(Collectors.toSet());
if (!sysDeptService.existAllPrimaryKeys(deptIdSet)) {
return CallResult.error("数据验证失败,关联的组织并不存在,请刷新后重试!");
}
if (jsonObject == null) {
jsonObject = new JSONObject();
}
jsonObject.put("deptId", deptId);
jsonObject.put("deptIdSet", deptIdSet);
}
return CallResult.ok(jsonObject);
}
@ -312,18 +318,20 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -312,18 +318,20 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
}
@Override
public SysDeptVo getRoleDept(Long roleId) {
public List<SysDeptVo> getRoleDept(Long roleId) {
SysRoleDept filter = new SysRoleDept();
filter.setRoleId(roleId);
SysRoleDept roleDept = sysRoleDeptMapper.selectOne(new QueryWrapper<>(filter));
if (roleDept == null) {
return null;
List<SysRoleDept> roleDeptList = sysRoleDeptMapper.selectList(new QueryWrapper<>(filter));
if (CollUtil.isEmpty(roleDeptList)) {
return Collections.emptyList();
}
SysDept dept = sysDeptMapper.selectById(roleDept.getDeptId());
if (dept == null) {
return null;
List<Long> deptIdList = roleDeptList.stream()
.map(SysRoleDept::getDeptId).collect(Collectors.toList());
List<SysDept> deptList = sysDeptMapper.selectBatchIds(deptIdList);
if (CollUtil.isEmpty(deptList)) {
return Collections.emptyList();
}
return MyModelUtil.copyTo(dept, SysDeptVo.class);
return MyModelUtil.copyCollectionTo(deptList, SysDeptVo.class);
}
@Override

6
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysRoleVo.java

@ -36,4 +36,10 @@ public class SysRoleVo extends BaseVo { @@ -36,4 +36,10 @@ public class SysRoleVo extends BaseVo {
*/
@Schema(description = "角色与菜单关联对象列表")
private List<Map<String, Object>> sysRoleMenuList;
/**
* 关联的组织列表仅返回deptId和deptName多对多
*/
@Schema(description = "关联的组织列表")
private List<SysDeptVo> deptList;
}

Loading…
Cancel
Save