Browse Source

refactor(upms): 重构角色组织关联逻辑并优化用户角色分配

- 移除 SysRoleDept 和 SysUserDept 实体类及对应Mapper
- 修改 SysRoleService 接口移除组织ID相关参数
- 修改 SysUserController 中角色和用户接口的组织参数说明
- 在 SysUserRole 实体中添加 deptId 字段用于存储组织信息
- 添加 RoleDeptItemDto 用于接收角色组织分配参数
- 新增 assignRoleDept 接口实现用户组织角色的重新分配
- 修复登录时角色ID可能为空导致的异常问题
- 优化 listUserDept 接口返回完整的组织-角色树结构
- 更新 SysRoleServiceImpl 移除组织相关的数据库操作逻辑
feature/form-permission-control
chenchuchuan 2 weeks ago
parent
commit
9ec9758bd5
  1. 23
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java
  2. 34
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java
  3. 97
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java
  4. 13
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java
  5. 13
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java
  6. 23
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/RoleDeptItemDto.java
  7. 28
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java
  8. 28
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java
  9. 6
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserRole.java
  10. 15
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java
  11. 32
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysUserService.java
  12. 82
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysRoleServiceImpl.java
  13. 139
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysUserServiceImpl.java

23
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java

@ -8,7 +8,10 @@ import apelet.common.core.annotation.NoAuthInterface;
import apelet.common.core.constant.ApplicationConstant; import apelet.common.core.constant.ApplicationConstant;
import apelet.common.core.constant.ErrorCodeEnum; import apelet.common.core.constant.ErrorCodeEnum;
import apelet.common.core.object.*; import apelet.common.core.object.*;
import apelet.common.core.upload.*; import apelet.common.core.upload.BaseUpDownloader;
import apelet.common.core.upload.UpDownloaderFactory;
import apelet.common.core.upload.UploadResponseInfo;
import apelet.common.core.upload.UploadStoreInfo;
import apelet.common.core.util.*; import apelet.common.core.util.*;
import apelet.common.datafilter.config.DataFilterProperties; import apelet.common.datafilter.config.DataFilterProperties;
import apelet.common.eas.util.EasConfig; import apelet.common.eas.util.EasConfig;
@ -21,13 +24,19 @@ import apelet.common.mobile.model.MobileEntry;
import apelet.common.mobile.object.MobileEntryExtraData; import apelet.common.mobile.object.MobileEntryExtraData;
import apelet.common.mobile.service.MobileEntryService; import apelet.common.mobile.service.MobileEntryService;
import apelet.common.online.service.OnlineOperationService; import apelet.common.online.service.OnlineOperationService;
import apelet.common.orm.impl.*; import apelet.common.orm.impl.Filter;
import apelet.common.orm.impl.FilterItem;
import apelet.common.orm.impl.Selector;
import apelet.common.orm.impl.SelectorItem;
import apelet.common.redis.cache.SessionCacheHelper; import apelet.common.redis.cache.SessionCacheHelper;
import apelet.common.report.service.ReportOperationService; import apelet.common.report.service.ReportOperationService;
import apelet.tenantadmin.config.ApplicationConfig; import apelet.tenantadmin.config.ApplicationConfig;
import apelet.tenantadmin.upms.bo.SysMenuPerm; import apelet.tenantadmin.upms.bo.SysMenuPerm;
import apelet.tenantadmin.upms.model.*; import apelet.tenantadmin.upms.model.*;
import apelet.tenantadmin.upms.model.constant.*; import apelet.tenantadmin.upms.model.constant.SysMenuType;
import apelet.tenantadmin.upms.model.constant.SysOnlineMenuPermType;
import apelet.tenantadmin.upms.model.constant.SysUserStatus;
import apelet.tenantadmin.upms.model.constant.SysUserType;
import apelet.tenantadmin.upms.service.*; import apelet.tenantadmin.upms.service.*;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
@ -69,7 +78,7 @@ import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import apelet.common.eas.util.EasUtil;
/** /**
* 登录接口控制器类 * 登录接口控制器类
* *
@ -1251,9 +1260,10 @@ public class LoginController {
Set<Long> postIdSet = userPostList.stream().map(SysUserPost::getPostId).collect(Collectors.toSet()); Set<Long> postIdSet = userPostList.stream().map(SysUserPost::getPostId).collect(Collectors.toSet());
tokenData.setPostIds(StrUtil.join(",", postIdSet)); tokenData.setPostIds(StrUtil.join(",", postIdSet));
} }
// 2026-07-28 角色用户关联表,增加组织,导致角色id 可能为空
List<SysUserRole> userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId()); List<SysUserRole> userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId());
if (CollUtil.isNotEmpty(userRoleList)) { if (CollUtil.isNotEmpty(userRoleList)) {
Set<Long> userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet()); Set<Long> userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).filter(Objects::nonNull).collect(Collectors.toSet());
tokenData.setRoleIds(StrUtil.join(",", userRoleIdSet)); tokenData.setRoleIds(StrUtil.join(",", userRoleIdSet));
} }
return tokenData; return tokenData;
@ -1281,9 +1291,10 @@ public class LoginController {
Set<Long> postIdSet = userPostList.stream().map(SysUserPost::getPostId).collect(Collectors.toSet()); Set<Long> postIdSet = userPostList.stream().map(SysUserPost::getPostId).collect(Collectors.toSet());
tokenData.setPostIds(StrUtil.join(",", postIdSet)); tokenData.setPostIds(StrUtil.join(",", postIdSet));
} }
// 2026-07-28 角色用户关联表,增加组织,导致角色id 可能为空
List<SysUserRole> userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId()); List<SysUserRole> userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId());
if (CollUtil.isNotEmpty(userRoleList)) { if (CollUtil.isNotEmpty(userRoleList)) {
Set<Long> userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet()); Set<Long> userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).filter(Objects::nonNull).collect(Collectors.toSet());
tokenData.setRoleIds(StrUtil.join(",", userRoleIdSet)); tokenData.setRoleIds(StrUtil.join(",", userRoleIdSet));
} }
return tokenData; return tokenData;

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

@ -58,10 +58,9 @@ public class SysRoleController {
/** /**
* 新增角色操作 * 新增角色操作
* *
* @param sysRoleDto 新增角色对象 * @param sysRoleDto 新增角色对象
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔 * @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔
* @param deptIdListString 组织Id列表可选多对多关联多个deptId之间逗号分隔 * @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @return 应答结果对象包含新增角色的主键Id * @return 应答结果对象包含新增角色的主键Id
*/ */
@ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"}) @ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"})
@ -70,25 +69,21 @@ public class SysRoleController {
public ResponseResult<Long> add( public ResponseResult<Long> add(
@MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody SysRoleDto sysRoleDto,
@MyRequestBody String menuIdListString, @MyRequestBody String menuIdListString,
@MyRequestBody String deptIdListString,
@MyRequestBody List<RoleFormButtonDto> buttonConfigList) { @MyRequestBody List<RoleFormButtonDto> buttonConfigList) {
String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto); String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto);
if (errorMessage != null) { if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
} }
SysRole sysRole = MyModelUtil.copyTo(sysRoleDto, SysRole.class); SysRole sysRole = MyModelUtil.copyTo(sysRoleDto, SysRole.class);
CallResult result = sysRoleService.verifyRelatedData(sysRole, null, menuIdListString, deptIdListString); CallResult result = sysRoleService.verifyRelatedData(sysRole, null, menuIdListString);
if (!result.isSuccess()) { if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
} }
Set<Long> menuIdSet = null; Set<Long> menuIdSet = null;
Set<Long> deptIdSet = null;
if (result.getData() != null) { if (result.getData() != null) {
JSONObject data = result.getData(); menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
menuIdSet = data.getObject("menuIdSet", new TypeReference<Set<Long>>(){});
deptIdSet = data.getObject("deptIdSet", new TypeReference<Set<Long>>(){});
} }
sysRoleService.saveNew(sysRole, menuIdSet, deptIdSet); sysRoleService.saveNew(sysRole, menuIdSet);
// 按钮权限配置(可选,不传不影响原有逻辑) // 按钮权限配置(可选,不传不影响原有逻辑)
if (buttonConfigList != null && !buttonConfigList.isEmpty()) { if (buttonConfigList != null && !buttonConfigList.isEmpty()) {
buttonConfigList.forEach(dto -> dto.setRoleId(sysRole.getRoleId())); buttonConfigList.forEach(dto -> dto.setRoleId(sysRole.getRoleId()));
@ -100,10 +95,9 @@ public class SysRoleController {
/** /**
* 更新角色操作 * 更新角色操作
* *
* @param sysRoleDto 更新角色对象 * @param sysRoleDto 更新角色对象
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔 * @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔
* @param deptIdListString 组织Id列表可选多对多关联多个deptId之间逗号分隔 * @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @return 应答结果对象 * @return 应答结果对象
*/ */
@OperationLog(type = SysOperationLogType.UPDATE) @OperationLog(type = SysOperationLogType.UPDATE)
@ -111,7 +105,6 @@ public class SysRoleController {
public ResponseResult<Void> update( public ResponseResult<Void> update(
@MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody SysRoleDto sysRoleDto,
@MyRequestBody String menuIdListString, @MyRequestBody String menuIdListString,
@MyRequestBody String deptIdListString,
@MyRequestBody List<RoleFormButtonDto> buttonConfigList) { @MyRequestBody List<RoleFormButtonDto> buttonConfigList) {
String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class); String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class);
if (errorMessage != null) { if (errorMessage != null) {
@ -123,18 +116,15 @@ public class SysRoleController {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage); return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
} }
SysRole sysRole = MyModelUtil.copyTo(sysRoleDto, SysRole.class); SysRole sysRole = MyModelUtil.copyTo(sysRoleDto, SysRole.class);
CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString, deptIdListString); CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString);
if (!result.isSuccess()) { if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
} }
Set<Long> menuIdSet = null; Set<Long> menuIdSet = null;
Set<Long> deptIdSet = null;
if (result.getData() != null) { if (result.getData() != null) {
JSONObject data = result.getData(); menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
menuIdSet = data.getObject("menuIdSet", new TypeReference<Set<Long>>(){});
deptIdSet = data.getObject("deptIdSet", new TypeReference<Set<Long>>(){});
} }
if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet, deptIdSet)) { if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet)) {
errorMessage = "更新失败,数据不存在,请刷新后重试!"; errorMessage = "更新失败,数据不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage); return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
} }

97
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java

@ -4,46 +4,41 @@ import apelet.common.core.annotation.MyRequestBody;
import apelet.common.core.constant.ErrorCodeEnum; import apelet.common.core.constant.ErrorCodeEnum;
import apelet.common.core.exception.MyRuntimeException; import apelet.common.core.exception.MyRuntimeException;
import apelet.common.core.object.*; import apelet.common.core.object.*;
import apelet.common.core.upload.*; import apelet.common.core.upload.BaseUpDownloader;
import apelet.common.core.upload.UpDownloaderFactory;
import apelet.common.core.upload.UploadResponseInfo;
import apelet.common.core.upload.UploadStoreInfo;
import apelet.common.core.util.MyCommonUtil; import apelet.common.core.util.MyCommonUtil;
import apelet.common.core.util.MyModelUtil; import apelet.common.core.util.MyModelUtil;
import apelet.common.core.util.MyPageUtil; import apelet.common.core.util.MyPageUtil;
import apelet.common.eas.service.impl.EASSyncService;
import apelet.common.generator.utils.OrmGenDataSourceUtil; import apelet.common.generator.utils.OrmGenDataSourceUtil;
import apelet.common.log.annotation.OperationLog; import apelet.common.log.annotation.OperationLog;
import apelet.common.log.model.constant.SysOperationLogType; import apelet.common.log.model.constant.SysOperationLogType;
import apelet.common.redis.cache.SessionCacheHelper; import apelet.common.redis.cache.SessionCacheHelper;
import apelet.common.sequence.wrapper.IdGeneratorWrapper;
import apelet.tenantadmin.config.ApplicationConfig; import apelet.tenantadmin.config.ApplicationConfig;
import apelet.tenantadmin.upms.dto.RoleDeptItemDto;
import apelet.tenantadmin.upms.dto.SysUserDto; import apelet.tenantadmin.upms.dto.SysUserDto;
import apelet.tenantadmin.upms.model.SysUser; import apelet.tenantadmin.upms.model.SysUser;
import apelet.tenantadmin.upms.service.SysUserService; import apelet.tenantadmin.upms.service.SysUserService;
import apelet.tenantadmin.upms.vo.SysDeptVo;
import apelet.tenantadmin.upms.vo.SysUserVo; import apelet.tenantadmin.upms.vo.SysUserVo;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import com.alibaba.fastjson.*; import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.page.PageMethod; import com.github.pagehelper.page.PageMethod;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import javafx.concurrent.Task;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.LinkedList;
import java.util.concurrent.ExecutorService; import java.util.List;
import java.util.concurrent.Executors; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.Set;
import java.util.stream.Collectors;
/** /**
* 用户管理操作控制器类 * 用户管理操作控制器类
@ -75,7 +70,7 @@ public class SysUserController {
* @param deptPostIdListString 逗号分隔的部门岗位Id列表 * @param deptPostIdListString 逗号分隔的部门岗位Id列表
* @param dataPermIdListString 逗号分隔的数据权限Id列表 * @param dataPermIdListString 逗号分隔的数据权限Id列表
* @param roleIdListString 逗号分隔的角色Id列表 * @param roleIdListString 逗号分隔的角色Id列表
* @param deptIdListString 逗号分隔的组织Id列表 * @param deptIdListString 逗号分隔的组织Id列表可选写入SysUserRole.deptId
* @return 应答结果对象包含新增用户的主键Id * @return 应答结果对象包含新增用户的主键Id
*/ */
@ApiOperationSupport(ignoreParameters = { @ApiOperationSupport(ignoreParameters = {
@ -100,16 +95,12 @@ public class SysUserController {
if (!result.isSuccess()) { if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
} }
Set<Long> deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference<Set<Long>>() { Set<Long> deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference<Set<Long>>(){});
}); Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>(){});
Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>() { Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>(){});
});
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {
});
Set<Long> deptIdSet = null; Set<Long> deptIdSet = null;
if (result.getData().containsKey("deptIdSet")) { if (result.getData().containsKey("deptIdSet")) {
deptIdSet = result.getData().getObject("deptIdSet", new TypeReference<Set<Long>>() { deptIdSet = result.getData().getObject("deptIdSet", new TypeReference<Set<Long>>(){});
});
} }
sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet); sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet);
return ResponseResult.success(sysUser.getUserId()); return ResponseResult.success(sysUser.getUserId());
@ -139,12 +130,9 @@ public class SysUserController {
if (!result.isSuccess()) { if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
} }
Set<Long> deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference<Set<Long>>() { Set<Long> deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference<Set<Long>>(){});
}); Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>(){});
Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>() { Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>(){});
});
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {
});
SysUser sysUserO = sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, null); SysUser sysUserO = sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, null);
try { try {
@ -172,7 +160,7 @@ public class SysUserController {
* @param deptPostIdListString 逗号分隔的部门岗位Id列表 * @param deptPostIdListString 逗号分隔的部门岗位Id列表
* @param dataPermIdListString 逗号分隔的数据权限Id列表 * @param dataPermIdListString 逗号分隔的数据权限Id列表
* @param roleIdListString 逗号分隔的角色Id列表 * @param roleIdListString 逗号分隔的角色Id列表
* @param deptIdListString 逗号分隔的组织Id列表 * @param deptIdListString 逗号分隔的组织Id列表可选写入SysUserRole.deptId
* @return 应答结果对象 * @return 应答结果对象
*/ */
@ApiOperationSupport(ignoreParameters = { @ApiOperationSupport(ignoreParameters = {
@ -200,16 +188,12 @@ public class SysUserController {
if (!result.isSuccess()) { if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
} }
Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>() { Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>(){});
}); Set<Long> deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference<Set<Long>>(){});
Set<Long> deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference<Set<Long>>() { Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>(){});
});
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {
});
Set<Long> deptIdSet = null; Set<Long> deptIdSet = null;
if (result.getData().containsKey("deptIdSet")) { if (result.getData().containsKey("deptIdSet")) {
deptIdSet = result.getData().getObject("deptIdSet", new TypeReference<Set<Long>>() { deptIdSet = result.getData().getObject("deptIdSet", new TypeReference<Set<Long>>(){});
});
} }
if (!sysUserService.update(sysUser, originalUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet)) { if (!sysUserService.update(sysUser, originalUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet)) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
@ -218,6 +202,31 @@ public class SysUserController {
} }
/** /**
* 分配用户组织角色
* 先删除用户原有的角色关联xy_sys_user_role再按 roleDeptList 逐条写入
*
* @param userId 用户Id
* @param roleDeptList 角色-组织关联列表每项含 roleId/deptId均可为空roleId 为空则跳过
* @return 应答结果对象
*/
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/assignRoleDept")
public ResponseResult<Void> assignRoleDept(@MyRequestBody Long userId, @MyRequestBody List<RoleDeptItemDto> roleDeptList) {
if (MyCommonUtil.existBlankArgument(userId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
if (!sysUserService.existId(userId)) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, "用户不存在,请刷新后重试!");
}
CallResult result = sysUserService.verifyRoleDeptMap(roleDeptList);
if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
}
sysUserService.assignRoleDept(userId, roleDeptList);
return ResponseResult.success();
}
/**
* 删除用户管理数据 * 删除用户管理数据
* *
* @param userId 删除对象主键Id * @param userId 删除对象主键Id
@ -498,18 +507,18 @@ public class SysUserController {
} }
/** /**
* 查询用户关联的组织列表用于编辑页回显 * 查询所有组织及其下角色列表并标记用户是否拥有该角色
* *
* @param userId 用户Id * @param userId 用户Id
* @return 应答结果对象包含用户关联的组织列表 * @return 应答结果对象包含组织-角色树及用户勾选状态
*/ */
@GetMapping("/listUserDept") @GetMapping("/listUserDept")
public ResponseResult<List<SysDeptVo>> listUserDept(@RequestParam Long userId) { public ResponseResult<List<Map<String, Object>>> listUserDept(@RequestParam Long userId) {
if (MyCommonUtil.existBlankArgument(userId)) { if (MyCommonUtil.existBlankArgument(userId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST); return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
} }
List<SysDeptVo> deptVoList = sysUserService.listUserDept(userId); List<Map<String, Object>> result = sysUserService.listUserDept(userId);
return ResponseResult.success(deptVoList); return ResponseResult.success(result);
} }
private ResponseResult<Void> doDelete(Long userId) { private ResponseResult<Void> doDelete(Long userId) {

13
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java

@ -1,13 +0,0 @@
package apelet.tenantadmin.upms.dao;
import apelet.common.core.base.dao.BaseDaoMapper;
import apelet.tenantadmin.upms.model.SysRoleDept;
/**
* 角色-组织关联数据操作访问接口
*
* @author guifc
* @date 2024-07-20
*/
public interface SysRoleDeptMapper extends BaseDaoMapper<SysRoleDept> {
}

13
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java

@ -1,13 +0,0 @@
package apelet.tenantadmin.upms.dao;
import apelet.common.core.base.dao.BaseDaoMapper;
import apelet.tenantadmin.upms.model.SysUserDept;
/**
* 用户-组织关联数据操作访问接口
*
* @author guifc
* @date 2024-07-20
*/
public interface SysUserDeptMapper extends BaseDaoMapper<SysUserDept> {
}

23
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/RoleDeptItemDto.java

@ -0,0 +1,23 @@
package apelet.tenantadmin.upms.dto;
import lombok.Data;
/**
* 用户-角色-组织关联参数对象用于 assignRoleDept 接口接收前端传值
*
* @author chenchuchuan
* @date 2026-07-28
*/
@Data
public class RoleDeptItemDto {
/**
* 角色Id可为空为空时跳过该条记录
*/
private String roleId;
/**
* 组织Id可为空表示不限定组织
*/
private String deptId;
}

28
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java

@ -1,28 +0,0 @@
package apelet.tenantadmin.upms.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 角色组织关联实体
*
* @author guifc
* @date 2024-07-20
*/
@Data
@TableName(value = "xy_sys_role_dept")
public class SysRoleDept {
/**
* 角色Id
*/
@TableField(value = "role_id")
private Long roleId;
/**
* 组织IDxy_sys_dept.idtype=1
*/
@TableField(value = "dept_id")
private Long deptId;
}

28
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java

@ -1,28 +0,0 @@
package apelet.tenantadmin.upms.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 用户组织关联实体多对多
*
* @author guifc
* @date 2024-07-20
*/
@Data
@TableName(value = "xy_sys_user_dept")
public class SysUserDept {
/**
* 用户Id
*/
@TableField(value = "user_id")
private Long userId;
/**
* 组织IDxy_sys_dept.idtype=1
*/
@TableField(value = "dept_id")
private Long deptId;
}

6
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserRole.java

@ -25,4 +25,10 @@ public class SysUserRole {
*/ */
@TableField(value = "role_id") @TableField(value = "role_id")
private Long roleId; private Long roleId;
/**
* 组织Id可为空表示不限定组织
*/
@TableField(value = "dept_id")
private Long deptId;
} }

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

@ -27,10 +27,9 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
* *
* @param role 新增的角色对象 * @param role 新增的角色对象
* @param menuIdSet 菜单Id列表 * @param menuIdSet 菜单Id列表
* @param deptIdSet 组织Id集合可选多对多关联
* @return 新增后的角色对象 * @return 新增后的角色对象
*/ */
SysRole saveNew(SysRole role, Set<Long> menuIdSet, Set<Long> deptIdSet); SysRole saveNew(SysRole role, Set<Long> menuIdSet);
/** /**
* 更新角色对象 * 更新角色对象
@ -38,10 +37,9 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
* @param role 更新的角色对象 * @param role 更新的角色对象
* @param originalRole 原有的角色对象 * @param originalRole 原有的角色对象
* @param menuIdSet 菜单Id列表 * @param menuIdSet 菜单Id列表
* @param deptIdSet 组织Id集合可选多对多关联
* @return 更新成功返回true否则false * @return 更新成功返回true否则false
*/ */
boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Set<Long> deptIdSet); boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet);
/** /**
* 删除指定角色 * 删除指定角色
@ -87,13 +85,12 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
/** /**
* 验证角色对象关联的数据是否都合法 * 验证角色对象关联的数据是否都合法
* *
* @param sysRole 当前操作的对象 * @param sysRole 当前操作的对象
* @param originalSysRole 原有对象 * @param originalSysRole 原有对象
* @param menuIdListString 逗号分隔的menuId列表 * @param menuIdListString 逗号分隔的menuId列表
* @param deptIdListString 逗号分隔的组织Id列表可选多对多关联
* @return 验证结果 * @return 验证结果
*/ */
CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString); CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString);
/** /**
* 查询角色的权限资源地址列表同时返回详细的分配路径 * 查询角色的权限资源地址列表同时返回详细的分配路径

32
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysUserService.java

@ -3,8 +3,8 @@ package apelet.tenantadmin.upms.service;
import apelet.common.core.base.service.IBaseService; import apelet.common.core.base.service.IBaseService;
import apelet.common.core.object.CallResult; import apelet.common.core.object.CallResult;
import apelet.common.core.object.ResponseResult; import apelet.common.core.object.ResponseResult;
import apelet.tenantadmin.upms.dto.RoleDeptItemDto;
import apelet.tenantadmin.upms.model.SysUser; import apelet.tenantadmin.upms.model.SysUser;
import apelet.tenantadmin.upms.vo.SysDeptVo;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -33,7 +33,7 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @param roleIdSet 用户角色Id集合 * @param roleIdSet 用户角色Id集合
* @param deptPostIdSet 部门岗位Id集合 * @param deptPostIdSet 部门岗位Id集合
* @param dataPermIdSet 数据权限Id集合 * @param dataPermIdSet 数据权限Id集合
* @param deptIdSet 组织Id集合 * @param deptIdSet 组织Id集合写入SysUserRole.deptId
* @return 新增后的用户对象 * @return 新增后的用户对象
*/ */
SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> deptIdSet); SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> deptIdSet);
@ -46,7 +46,7 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @param roleIdSet 用户角色Id列表 * @param roleIdSet 用户角色Id列表
* @param deptPostIdSet 部门岗位Id集合 * @param deptPostIdSet 部门岗位Id集合
* @param dataPermIdSet 数据权限Id集合 * @param dataPermIdSet 数据权限Id集合
* @param deptIdSet 组织Id集合 * @param deptIdSet 组织Id集合写入SysUserRole.deptId
* @return 更新成功返回true否则false * @return 更新成功返回true否则false
*/ */
boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> deptIdSet); boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> deptIdSet);
@ -229,7 +229,7 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @param roleIds 逗号分隔的角色Id列表字符串 * @param roleIds 逗号分隔的角色Id列表字符串
* @param deptPostIds 逗号分隔的部门岗位Id列表字符串 * @param deptPostIds 逗号分隔的部门岗位Id列表字符串
* @param dataPermIds 逗号分隔的数据权限Id列表字符串 * @param dataPermIds 逗号分隔的数据权限Id列表字符串
* @param deptIds 逗号分隔的组织Id列表字符串 * @param deptIds 逗号分隔的组织Id列表字符串可选写入SysUserRole.deptId
* @return 验证结果 * @return 验证结果
*/ */
CallResult verifyRelatedData( CallResult verifyRelatedData(
@ -259,10 +259,28 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
ResponseResult<?> syncEasUSer(); ResponseResult<?> syncEasUSer();
/** /**
* 查询用户关联的组织列表 * 查询所有组织及其下角色列表并标记用户是否拥有该角色
* *
* @param userId 用户Id * @param userId 用户Id
* @return 用户关联的组织Vo列表 * @return 组织-角色树列表包含用户勾选状态
*/ */
List<SysDeptVo> listUserDept(Long userId); List<Map<String, Object>> listUserDept(Long userId);
/**
* 验证角色-组织映射数据的合法性
*
* @param roleDeptList 角色-组织关联列表
* @return 验证结果
*/
CallResult verifyRoleDeptMap(List<RoleDeptItemDto> roleDeptList);
/**
* 分配用户组织角色
* 先删除用户原有的角色关联再按 roleDeptList 逐条写入 xy_sys_user_role
* roleId 为空则跳过该条deptId 为空则不限组织
*
* @param userId 用户Id
* @param roleDeptList 角色-组织关联列表
*/
void assignRoleDept(Long userId, List<RoleDeptItemDto> roleDeptList);
} }

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

@ -15,9 +15,14 @@ import apelet.common.ext.constant.BizWidgetDatasourceType;
import apelet.common.ext.util.BizWidgetDatasourceExtHelper; import apelet.common.ext.util.BizWidgetDatasourceExtHelper;
import apelet.common.sequence.wrapper.IdGeneratorWrapper; import apelet.common.sequence.wrapper.IdGeneratorWrapper;
import apelet.tenantadmin.config.DataSourceType; import apelet.tenantadmin.config.DataSourceType;
import apelet.tenantadmin.upms.dao.*; import apelet.tenantadmin.upms.dao.SysDeptMapper;
import apelet.tenantadmin.upms.model.*; import apelet.tenantadmin.upms.dao.SysRoleMapper;
import apelet.tenantadmin.upms.service.SysDeptService; import apelet.tenantadmin.upms.dao.SysRoleMenuMapper;
import apelet.tenantadmin.upms.dao.SysUserRoleMapper;
import apelet.tenantadmin.upms.model.SysDept;
import apelet.tenantadmin.upms.model.SysRole;
import apelet.tenantadmin.upms.model.SysRoleMenu;
import apelet.tenantadmin.upms.model.SysUserRole;
import apelet.tenantadmin.upms.service.SysMenuService; import apelet.tenantadmin.upms.service.SysMenuService;
import apelet.tenantadmin.upms.service.SysRoleService; import apelet.tenantadmin.upms.service.SysRoleService;
import apelet.tenantadmin.upms.vo.SysDeptVo; import apelet.tenantadmin.upms.vo.SysDeptVo;
@ -60,10 +65,6 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
@Autowired @Autowired
private SysMenuService sysMenuService; private SysMenuService sysMenuService;
@Autowired @Autowired
private SysRoleDeptMapper sysRoleDeptMapper;
@Autowired
private SysDeptService sysDeptService;
@Autowired
private SysDeptMapper sysDeptMapper; private SysDeptMapper sysDeptMapper;
@Autowired @Autowired
private IdGeneratorWrapper idGenerator; private IdGeneratorWrapper idGenerator;
@ -119,7 +120,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public SysRole saveNew(SysRole role, Set<Long> menuIdSet, Set<Long> deptIdSet) { public SysRole saveNew(SysRole role, Set<Long> menuIdSet) {
role.setRoleId(idGenerator.nextLongId()); role.setRoleId(idGenerator.nextLongId());
MyModelUtil.fillCommonsForInsert(role); MyModelUtil.fillCommonsForInsert(role);
role.setDeletedFlag(GlobalDeletedFlag.NORMAL); role.setDeletedFlag(GlobalDeletedFlag.NORMAL);
@ -132,15 +133,6 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
sysRoleMenuMapper.insert(roleMenu); sysRoleMenuMapper.insert(roleMenu);
} }
} }
// 写入角色-组织关联(多对多)
if (CollUtil.isNotEmpty(deptIdSet)) {
for (Long deptId : deptIdSet) {
SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(role.getRoleId());
roleDept.setDeptId(deptId);
sysRoleDeptMapper.insert(roleDept);
}
}
return role; return role;
} }
@ -154,7 +146,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Set<Long> deptIdSet) { public boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet) {
MyModelUtil.fillCommonsForUpdate(role, originalRole); MyModelUtil.fillCommonsForUpdate(role, originalRole);
if (sysRoleMapper.updateById(role) != 1) { if (sysRoleMapper.updateById(role) != 1) {
return false; return false;
@ -170,18 +162,6 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
sysRoleMenuMapper.insert(roleMenu); sysRoleMenuMapper.insert(roleMenu);
} }
} }
// 先删后插角色-组织关联(多对多)
SysRoleDept deleteFilter = new SysRoleDept();
deleteFilter.setRoleId(role.getRoleId());
sysRoleDeptMapper.delete(new QueryWrapper<>(deleteFilter));
if (CollUtil.isNotEmpty(deptIdSet)) {
for (Long deptId : deptIdSet) {
SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(role.getRoleId());
roleDept.setDeptId(deptId);
sysRoleDeptMapper.insert(roleDept);
}
}
return true; return true;
} }
@ -203,9 +183,6 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
SysUserRole userRole = new SysUserRole(); SysUserRole userRole = new SysUserRole();
userRole.setRoleId(roleId); userRole.setRoleId(roleId);
sysUserRoleMapper.delete(new QueryWrapper<>(userRole)); sysUserRoleMapper.delete(new QueryWrapper<>(userRole));
SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(roleId);
sysRoleDeptMapper.delete(new QueryWrapper<>(roleDept));
roleFormButtonService.removeByRoleId(roleId); roleFormButtonService.removeByRoleId(roleId);
return true; return true;
} }
@ -267,7 +244,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
* @return 验证结果 * @return 验证结果
*/ */
@Override @Override
public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString) { public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString) {
JSONObject jsonObject = null; JSONObject jsonObject = null;
if (StringUtils.isNotBlank(menuIdListString)) { if (StringUtils.isNotBlank(menuIdListString)) {
Set<Long> menuIdSet = Arrays.stream( Set<Long> menuIdSet = Arrays.stream(
@ -278,18 +255,6 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
jsonObject = new JSONObject(); jsonObject = new JSONObject();
jsonObject.put("menuIdSet", menuIdSet); jsonObject.put("menuIdSet", menuIdSet);
} }
// 校验组织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("deptIdSet", deptIdSet);
}
return CallResult.ok(jsonObject); return CallResult.ok(jsonObject);
} }
@ -319,15 +284,14 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
@Override @Override
public List<SysDeptVo> getRoleDept(Long roleId) { public List<SysDeptVo> getRoleDept(Long roleId) {
SysRoleDept filter = new SysRoleDept(); LambdaQueryWrapper<SysUserRole> queryWrapper = new LambdaQueryWrapper<>();
filter.setRoleId(roleId); queryWrapper.eq(SysUserRole::getRoleId, roleId).isNotNull(SysUserRole::getDeptId);
List<SysRoleDept> roleDeptList = sysRoleDeptMapper.selectList(new QueryWrapper<>(filter)); List<SysUserRole> userRoleList = sysUserRoleMapper.selectList(queryWrapper);
if (CollUtil.isEmpty(roleDeptList)) { if (CollUtil.isEmpty(userRoleList)) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<Long> deptIdList = roleDeptList.stream() Set<Long> deptIdSet = userRoleList.stream().map(SysUserRole::getDeptId).collect(Collectors.toSet());
.map(SysRoleDept::getDeptId).collect(Collectors.toList()); List<SysDept> deptList = sysDeptMapper.selectBatchIds(deptIdSet);
List<SysDept> deptList = sysDeptMapper.selectBatchIds(deptIdList);
if (CollUtil.isEmpty(deptList)) { if (CollUtil.isEmpty(deptList)) {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -336,15 +300,13 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
@Override @Override
public MyPageData<SysRoleVo> listRoleByDeptId(Long deptId, MyOrderParam orderParam, MyPageParam pageParam) { public MyPageData<SysRoleVo> listRoleByDeptId(Long deptId, MyOrderParam orderParam, MyPageParam pageParam) {
// 查询xy_sys_role_dept获取roleId集合 LambdaQueryWrapper<SysUserRole> roleQuery = new LambdaQueryWrapper<>();
SysRoleDept filter = new SysRoleDept(); roleQuery.eq(SysUserRole::getDeptId, deptId);
filter.setDeptId(deptId); List<SysUserRole> userRoleList = sysUserRoleMapper.selectList(roleQuery);
List<SysRoleDept> roleDeptList = sysRoleDeptMapper.selectList(new QueryWrapper<>(filter)); if (CollUtil.isEmpty(userRoleList)) {
if (CollUtil.isEmpty(roleDeptList)) {
return new MyPageData<>(Collections.emptyList(), 0L); return new MyPageData<>(Collections.emptyList(), 0L);
} }
List<Long> roleIdList = roleDeptList.stream() Set<Long> roleIdList = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());
.map(SysRoleDept::getRoleId).collect(Collectors.toList());
// 分页查询角色,使用IN条件 // 分页查询角色,使用IN条件
if (pageParam != null) { if (pageParam != null) {
PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize()); PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize());

139
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysUserServiceImpl.java

@ -1,6 +1,5 @@
package apelet.tenantadmin.upms.service.impl; package apelet.tenantadmin.upms.service.impl;
import apelet.common.botp.db.util.DbUtil;
import apelet.common.core.base.dao.BaseDaoMapper; import apelet.common.core.base.dao.BaseDaoMapper;
import apelet.common.core.base.service.BaseService; import apelet.common.core.base.service.BaseService;
import apelet.common.core.constant.GlobalDeletedFlag; import apelet.common.core.constant.GlobalDeletedFlag;
@ -13,14 +12,12 @@ import apelet.common.eas.service.impl.EASSyncService;
import apelet.common.ext.base.BizWidgetDatasource; import apelet.common.ext.base.BizWidgetDatasource;
import apelet.common.ext.constant.BizWidgetDatasourceType; import apelet.common.ext.constant.BizWidgetDatasourceType;
import apelet.common.ext.util.BizWidgetDatasourceExtHelper; import apelet.common.ext.util.BizWidgetDatasourceExtHelper;
import apelet.common.generator.utils.OrmGenDataSourceUtil;
import apelet.common.sequence.wrapper.IdGeneratorWrapper; import apelet.common.sequence.wrapper.IdGeneratorWrapper;
import apelet.tenantadmin.upms.controller.SysUserController;
import apelet.tenantadmin.upms.dao.*; import apelet.tenantadmin.upms.dao.*;
import apelet.tenantadmin.upms.dto.RoleDeptItemDto;
import apelet.tenantadmin.upms.model.*; import apelet.tenantadmin.upms.model.*;
import apelet.tenantadmin.upms.model.constant.SysUserStatus; import apelet.tenantadmin.upms.model.constant.SysUserStatus;
import apelet.tenantadmin.upms.service.*; import apelet.tenantadmin.upms.service.*;
import apelet.tenantadmin.upms.vo.SysDeptVo;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -33,6 +30,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.page.PageMethod; import com.github.pagehelper.page.PageMethod;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -74,10 +72,10 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
@Autowired @Autowired
private SysDeptService sysDeptService; private SysDeptService sysDeptService;
@Autowired @Autowired
private SysUserDeptMapper sysUserDeptMapper;
@Autowired
private SysDeptMapper sysDeptMapper; private SysDeptMapper sysDeptMapper;
@Autowired @Autowired
private SysRoleMapper sysRoleMapper;
@Autowired
private IdGeneratorWrapper idGenerator; private IdGeneratorWrapper idGenerator;
@Autowired @Autowired
private PasswordEncoder passwordEncoder; private PasswordEncoder passwordEncoder;
@ -233,15 +231,6 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
sysDataPermUserMapper.insert(dataPermUser); sysDataPermUserMapper.insert(dataPermUser);
} }
} }
// 写入用户-组织关联
if (CollUtil.isNotEmpty(deptIdSet)) {
for (Long deptId : deptIdSet) {
SysUserDept userDept = new SysUserDept();
userDept.setUserId(user.getUserId());
userDept.setDeptId(deptId);
sysUserDeptMapper.insert(userDept);
}
}
return user; return user;
} }
@ -303,18 +292,6 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
sysDataPermUserMapper.insert(dataPermUser); sysDataPermUserMapper.insert(dataPermUser);
} }
} }
// 先删除旧的用户-组织关联,再插入新的
SysUserDept deleteFilter = new SysUserDept();
deleteFilter.setUserId(user.getUserId());
sysUserDeptMapper.delete(new QueryWrapper<>(deleteFilter));
if (CollUtil.isNotEmpty(deptIdSet)) {
for (Long deptId : deptIdSet) {
SysUserDept userDept = new SysUserDept();
userDept.setUserId(user.getUserId());
userDept.setDeptId(deptId);
sysUserDeptMapper.insert(userDept);
}
}
return true; return true;
} }
@ -367,6 +344,45 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
return true; return true;
} }
@Transactional(rollbackFor = Exception.class)
@Override
public CallResult verifyRoleDeptMap(List<RoleDeptItemDto> roleDeptList) {
if (CollUtil.isEmpty(roleDeptList)) {
return CallResult.ok();
}
Set<Long> roleIdSet = roleDeptList.stream().filter(i -> StrUtil.isNotBlank(i.getRoleId())).map(i -> Long.valueOf(i.getRoleId())).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(roleIdSet) && !sysRoleService.existAllPrimaryKeys(roleIdSet)) {
return CallResult.error("数据验证失败,存在不合法的角色,请刷新后重试!");
}
Set<Long> deptIdSet = roleDeptList.stream().filter(i -> StrUtil.isNotBlank(i.getDeptId())).map(i -> Long.valueOf(i.getDeptId())).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(deptIdSet) && !sysDeptService.existAllPrimaryKeys(deptIdSet)) {
return CallResult.error("数据验证失败,存在不合法的组织,请刷新后重试!");
}
return CallResult.ok();
}
@Transactional(rollbackFor = Exception.class)
@Override
public void assignRoleDept(Long userId, List<RoleDeptItemDto> roleDeptList) {
// 先删除用户原有的角色关联
SysUserRole deletedUserRole = new SysUserRole();
deletedUserRole.setUserId(userId);
sysUserRoleMapper.delete(new QueryWrapper<>(deletedUserRole));
// 再按 roleDeptList 逐条写入,roleId 为空则跳过
if (CollUtil.isNotEmpty(roleDeptList)) {
for (RoleDeptItemDto item : roleDeptList) {
if (StringUtils.isAllBlank(item.getRoleId(), item.getDeptId())) {
continue;
}
SysUserRole userRole = new SysUserRole();
userRole.setUserId(userId);
userRole.setRoleId(StringUtils.isNotBlank(item.getRoleId()) ? Long.valueOf(item.getRoleId()) : null);
userRole.setDeptId(StrUtil.isNotBlank(item.getDeptId()) ? Long.valueOf(item.getDeptId()) : null);
sysUserRoleMapper.insert(userRole);
}
}
}
/** /**
* 获取单表查询结果由于没有关联数据查询因此在仅仅获取单表数据的场景下效率更高 * 获取单表查询结果由于没有关联数据查询因此在仅仅获取单表数据的场景下效率更高
* 如果需要同时获取关联数据请移步(getSysUserListWithRelation)方法 * 如果需要同时获取关联数据请移步(getSysUserListWithRelation)方法
@ -589,10 +605,9 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
&& !sysDeptService.existId(sysUser.getDeptId())) { && !sysDeptService.existId(sysUser.getDeptId())) {
return CallResult.error("数据验证失败,关联的用户部门Id并不存在,请刷新后重试!"); return CallResult.error("数据验证失败,关联的用户部门Id并不存在,请刷新后重试!");
} }
// 验证组织ID(可选) // 验证组织ID(可选,写入SysUserRole.deptId
if (StrUtil.isNotBlank(deptIds)) { if (StrUtil.isNotBlank(deptIds)) {
Set<Long> deptIdSet = Arrays.stream( Set<Long> deptIdSet = Arrays.stream(deptIds.split(",")).map(Long::valueOf).collect(Collectors.toSet());
deptIds.split(",")).map(Long::valueOf).collect(Collectors.toSet());
if (!sysDeptService.existAllPrimaryKeys(deptIdSet)) { if (!sysDeptService.existAllPrimaryKeys(deptIdSet)) {
return CallResult.error("数据验证失败,存在不合法的组织数据,请刷新后重试!"); return CallResult.error("数据验证失败,存在不合法的组织数据,请刷新后重试!");
} }
@ -792,17 +807,61 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
} }
@Override @Override
public List<SysDeptVo> listUserDept(Long userId) { public List<Map<String, Object>> listUserDept(Long userId) {
SysUserDept filter = new SysUserDept(); // 1. 查询所有组织(不再区分type,部门和组织共用一张表)
filter.setUserId(userId); List<SysDept> allDepts = sysDeptMapper.selectList(new LambdaQueryWrapper<>());
List<SysUserDept> userDeptList = sysUserDeptMapper.selectList(new QueryWrapper<>(filter)); if (CollUtil.isEmpty(allDepts)) {
if (CollUtil.isEmpty(userDeptList)) { return Collections.emptyList();
return new LinkedList<>(); }
// 2. 查询当前用户的角色记录(含deptId)
List<SysUserRole> userRoleList = sysUserRoleMapper.selectList(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
Set<Long> userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());
Set<Long> userDeptIdSet = userRoleList.stream().map(SysUserRole::getDeptId).filter(Objects::nonNull).collect(Collectors.toSet());
// 3. 批量查询所有组织的角色关联(通过SysUserRole.deptId)
List<Long> allDeptIds = allDepts.stream().map(SysDept::getDeptId).collect(Collectors.toList());
LambdaQueryWrapper<SysUserRole> roleDeptQuery = new LambdaQueryWrapper<>();
roleDeptQuery.in(SysUserRole::getDeptId, allDeptIds);
List<SysUserRole> allRoleDeptList = sysUserRoleMapper.selectList(roleDeptQuery);
Map<Long, List<Long>> deptRoleMap = new HashMap<>();
Set<Long> allRoleIdSet = new HashSet<>();
if (CollUtil.isNotEmpty(allRoleDeptList)) {
for (SysUserRole ur : allRoleDeptList) {
deptRoleMap.computeIfAbsent(ur.getDeptId(), k -> new ArrayList<>()).add(ur.getRoleId());
allRoleIdSet.add(ur.getRoleId());
}
}
// 4. 批量查询所有角色
Map<Long, SysRole> roleMap = Collections.emptyMap();
if (CollUtil.isNotEmpty(allRoleIdSet)) {
List<SysRole> allRoleList = sysRoleMapper.selectBatchIds(allRoleIdSet);
roleMap = allRoleList.stream().collect(Collectors.toMap(SysRole::getRoleId, r -> r));
}
// 5. 组装结果
List<Map<String, Object>> result = new ArrayList<>();
for (SysDept dept : allDepts) {
Map<String, Object> item = new HashMap<>();
Map<String, Object> deptInfo = new HashMap<>();
deptInfo.put("deptId", dept.getDeptId());
deptInfo.put("deptName", dept.getDeptName());
item.put("deptinfo", deptInfo);
List<Long> roleIds = deptRoleMap.getOrDefault(dept.getDeptId(), Collections.emptyList());
boolean deptCheck = userDeptIdSet.contains(dept.getDeptId()) || roleIds.stream().anyMatch(userRoleIdSet::contains);
deptInfo.put("check", deptCheck);
List<Map<String, Object>> roleInfoList = new ArrayList<>();
for (Long roleId : roleIds) {
SysRole role = roleMap.get(roleId);
if (role != null) {
Map<String, Object> roleInfo = new HashMap<>();
roleInfo.put("roleId", role.getRoleId());
roleInfo.put("roleName", role.getRoleName());
roleInfo.put("check", userRoleIdSet.contains(roleId));
roleInfoList.add(roleInfo);
}
}
item.put("roleInfoList", roleInfoList);
result.add(item);
} }
Set<Long> deptIdSet = userDeptList.stream() return result;
.map(SysUserDept::getDeptId).collect(Collectors.toSet());
List<SysDept> deptList = sysDeptMapper.getSysDeptList("dept_id", deptIdSet, null, null);
return MyModelUtil.copyCollectionTo(deptList, SysDeptVo.class);
} }

Loading…
Cancel
Save