From 9ec9758bd5f95ba27c6ae043447d75625b696e86 Mon Sep 17 00:00:00 2001 From: chenchuchuan <13554600537@163.com> Date: Tue, 28 Jul 2026 13:52:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(upms):=20=E9=87=8D=E6=9E=84=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=BB=84=E7=BB=87=E5=85=B3=E8=81=94=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 SysRoleDept 和 SysUserDept 实体类及对应Mapper - 修改 SysRoleService 接口移除组织ID相关参数 - 修改 SysUserController 中角色和用户接口的组织参数说明 - 在 SysUserRole 实体中添加 deptId 字段用于存储组织信息 - 添加 RoleDeptItemDto 用于接收角色组织分配参数 - 新增 assignRoleDept 接口实现用户组织角色的重新分配 - 修复登录时角色ID可能为空导致的异常问题 - 优化 listUserDept 接口返回完整的组织-角色树结构 - 更新 SysRoleServiceImpl 移除组织相关的数据库操作逻辑 --- .../upms/controller/LoginController.java | 23 +++- .../upms/controller/SysRoleController.java | 34 ++--- .../upms/controller/SysUserController.java | 97 +++++++------- .../tenantadmin/upms/dao/SysRoleDeptMapper.java | 13 -- .../tenantadmin/upms/dao/SysUserDeptMapper.java | 13 -- .../tenantadmin/upms/dto/RoleDeptItemDto.java | 23 ++++ .../apelet/tenantadmin/upms/model/SysRoleDept.java | 28 ----- .../apelet/tenantadmin/upms/model/SysUserDept.java | 28 ----- .../apelet/tenantadmin/upms/model/SysUserRole.java | 6 + .../tenantadmin/upms/service/SysRoleService.java | 15 +-- .../tenantadmin/upms/service/SysUserService.java | 32 +++-- .../upms/service/impl/SysRoleServiceImpl.java | 82 ++++-------- .../upms/service/impl/SysUserServiceImpl.java | 139 +++++++++++++++------ 13 files changed, 263 insertions(+), 270 deletions(-) delete mode 100644 application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java delete mode 100644 application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java create mode 100644 application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/RoleDeptItemDto.java delete mode 100644 application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java delete mode 100644 application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java index f4bef3d..05bb010 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java +++ b/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.ErrorCodeEnum; 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.datafilter.config.DataFilterProperties; 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.service.MobileEntryService; 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.report.service.ReportOperationService; import apelet.tenantadmin.config.ApplicationConfig; import apelet.tenantadmin.upms.bo.SysMenuPerm; 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 cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; @@ -69,7 +78,7 @@ import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import apelet.common.eas.util.EasUtil; + /** * 登录接口控制器类。 * @@ -1251,9 +1260,10 @@ public class LoginController { Set postIdSet = userPostList.stream().map(SysUserPost::getPostId).collect(Collectors.toSet()); tokenData.setPostIds(StrUtil.join(",", postIdSet)); } + // 2026-07-28 角色用户关联表,增加组织,导致角色id 可能为空 List userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId()); if (CollUtil.isNotEmpty(userRoleList)) { - Set userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet()); + Set userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).filter(Objects::nonNull).collect(Collectors.toSet()); tokenData.setRoleIds(StrUtil.join(",", userRoleIdSet)); } return tokenData; @@ -1281,9 +1291,10 @@ public class LoginController { Set postIdSet = userPostList.stream().map(SysUserPost::getPostId).collect(Collectors.toSet()); tokenData.setPostIds(StrUtil.join(",", postIdSet)); } + // 2026-07-28 角色用户关联表,增加组织,导致角色id 可能为空 List userRoleList = sysRoleService.getSysUserRoleListByUserId(user.getUserId()); if (CollUtil.isNotEmpty(userRoleList)) { - Set userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet()); + Set userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).filter(Objects::nonNull).collect(Collectors.toSet()); tokenData.setRoleIds(StrUtil.join(",", userRoleIdSet)); } return tokenData; diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java index 9bed9ee..1b3359c 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java @@ -58,10 +58,9 @@ public class SysRoleController { /** * 新增角色操作。 * - * @param sysRoleDto 新增角色对象。 - * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 - * @param deptIdListString 组织Id列表(可选,多对多关联),多个deptId之间逗号分隔。 - * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 + * @param sysRoleDto 新增角色对象。 + * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 + * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 * @return 应答结果对象,包含新增角色的主键Id。 */ @ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"}) @@ -70,25 +69,21 @@ public class SysRoleController { public ResponseResult add( @MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString, - @MyRequestBody String deptIdListString, @MyRequestBody List 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, deptIdListString); + CallResult result = sysRoleService.verifyRelatedData(sysRole, null, menuIdListString); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } Set menuIdSet = null; - Set deptIdSet = null; if (result.getData() != null) { - JSONObject data = result.getData(); - menuIdSet = data.getObject("menuIdSet", new TypeReference>(){}); - deptIdSet = data.getObject("deptIdSet", new TypeReference>(){}); + menuIdSet = result.getData().getObject("menuIdSet", new TypeReference>(){}); } - sysRoleService.saveNew(sysRole, menuIdSet, deptIdSet); + sysRoleService.saveNew(sysRole, menuIdSet); // 按钮权限配置(可选,不传不影响原有逻辑) if (buttonConfigList != null && !buttonConfigList.isEmpty()) { buttonConfigList.forEach(dto -> dto.setRoleId(sysRole.getRoleId())); @@ -100,10 +95,9 @@ public class SysRoleController { /** * 更新角色操作。 * - * @param sysRoleDto 更新角色对象。 - * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 - * @param deptIdListString 组织Id列表(可选,多对多关联),多个deptId之间逗号分隔。 - * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 + * @param sysRoleDto 更新角色对象。 + * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 + * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 * @return 应答结果对象。 */ @OperationLog(type = SysOperationLogType.UPDATE) @@ -111,7 +105,6 @@ public class SysRoleController { public ResponseResult update( @MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString, - @MyRequestBody String deptIdListString, @MyRequestBody List buttonConfigList) { String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class); if (errorMessage != null) { @@ -123,18 +116,15 @@ 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, deptIdListString); + CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } Set menuIdSet = null; - Set deptIdSet = null; if (result.getData() != null) { - JSONObject data = result.getData(); - menuIdSet = data.getObject("menuIdSet", new TypeReference>(){}); - deptIdSet = data.getObject("deptIdSet", new TypeReference>(){}); + menuIdSet = result.getData().getObject("menuIdSet", new TypeReference>(){}); } - if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet, deptIdSet)) { + if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet)) { errorMessage = "更新失败,数据不存在,请刷新后重试!"; return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage); } diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java index 53aec83..060bae5 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java +++ b/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.exception.MyRuntimeException; 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.MyModelUtil; import apelet.common.core.util.MyPageUtil; -import apelet.common.eas.service.impl.EASSyncService; import apelet.common.generator.utils.OrmGenDataSourceUtil; import apelet.common.log.annotation.OperationLog; import apelet.common.log.model.constant.SysOperationLogType; import apelet.common.redis.cache.SessionCacheHelper; -import apelet.common.sequence.wrapper.IdGeneratorWrapper; import apelet.tenantadmin.config.ApplicationConfig; +import apelet.tenantadmin.upms.dto.RoleDeptItemDto; import apelet.tenantadmin.upms.dto.SysUserDto; import apelet.tenantadmin.upms.model.SysUser; import apelet.tenantadmin.upms.service.SysUserService; -import apelet.tenantadmin.upms.vo.SysDeptVo; import apelet.tenantadmin.upms.vo.SysUserVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ReflectUtil; -import com.alibaba.fastjson.*; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.alibaba.fastjson.TypeReference; import com.github.pagehelper.page.PageMethod; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.xxl.job.core.handler.annotation.XxlJob; import io.swagger.v3.oas.annotations.tags.Tag; -import javafx.concurrent.Task; 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.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * 用户管理操作控制器类。 @@ -75,7 +70,7 @@ public class SysUserController { * @param deptPostIdListString 逗号分隔的部门岗位Id列表。 * @param dataPermIdListString 逗号分隔的数据权限Id列表。 * @param roleIdListString 逗号分隔的角色Id列表。 - * @param deptIdListString 逗号分隔的组织Id列表。 + * @param deptIdListString 逗号分隔的组织Id列表(可选,写入SysUserRole.deptId)。 * @return 应答结果对象,包含新增用户的主键Id。 */ @ApiOperationSupport(ignoreParameters = { @@ -100,16 +95,12 @@ public class SysUserController { if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } - Set deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference>() { - }); - Set roleIdSet = result.getData().getObject("roleIdSet", new TypeReference>() { - }); - Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>() { - }); + Set deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference>(){}); + Set roleIdSet = result.getData().getObject("roleIdSet", new TypeReference>(){}); + Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>(){}); Set deptIdSet = null; if (result.getData().containsKey("deptIdSet")) { - deptIdSet = result.getData().getObject("deptIdSet", new TypeReference>() { - }); + deptIdSet = result.getData().getObject("deptIdSet", new TypeReference>(){}); } sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet); return ResponseResult.success(sysUser.getUserId()); @@ -139,12 +130,9 @@ public class SysUserController { if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } - Set deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference>() { - }); - Set roleIdSet = result.getData().getObject("roleIdSet", new TypeReference>() { - }); - Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>() { - }); + Set deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference>(){}); + Set roleIdSet = result.getData().getObject("roleIdSet", new TypeReference>(){}); + Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>(){}); SysUser sysUserO = sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, null); try { @@ -172,7 +160,7 @@ public class SysUserController { * @param deptPostIdListString 逗号分隔的部门岗位Id列表。 * @param dataPermIdListString 逗号分隔的数据权限Id列表。 * @param roleIdListString 逗号分隔的角色Id列表。 - * @param deptIdListString 逗号分隔的组织Id列表。 + * @param deptIdListString 逗号分隔的组织Id列表(可选,写入SysUserRole.deptId)。 * @return 应答结果对象。 */ @ApiOperationSupport(ignoreParameters = { @@ -200,16 +188,12 @@ public class SysUserController { if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } - Set roleIdSet = result.getData().getObject("roleIdSet", new TypeReference>() { - }); - Set deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference>() { - }); - Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>() { - }); + Set roleIdSet = result.getData().getObject("roleIdSet", new TypeReference>(){}); + Set deptPostIdSet = result.getData().getObject("deptPostIdSet", new TypeReference>(){}); + Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>(){}); Set deptIdSet = null; if (result.getData().containsKey("deptIdSet")) { - deptIdSet = result.getData().getObject("deptIdSet", new TypeReference>() { - }); + deptIdSet = result.getData().getObject("deptIdSet", new TypeReference>(){}); } if (!sysUserService.update(sysUser, originalUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet)) { 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 assignRoleDept(@MyRequestBody Long userId, @MyRequestBody List 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。 @@ -498,18 +507,18 @@ public class SysUserController { } /** - * 查询用户关联的组织列表(用于编辑页回显)。 + * 查询所有组织及其下角色列表,并标记用户是否拥有该角色。 * * @param userId 用户Id。 - * @return 应答结果对象,包含用户关联的组织列表。 + * @return 应答结果对象,包含组织-角色树及用户勾选状态。 */ @GetMapping("/listUserDept") - public ResponseResult> listUserDept(@RequestParam Long userId) { + public ResponseResult>> listUserDept(@RequestParam Long userId) { if (MyCommonUtil.existBlankArgument(userId)) { return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST); } - List deptVoList = sysUserService.listUserDept(userId); - return ResponseResult.success(deptVoList); + List> result = sysUserService.listUserDept(userId); + return ResponseResult.success(result); } private ResponseResult doDelete(Long userId) { diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java deleted file mode 100644 index 26e1a81..0000000 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java +++ /dev/null @@ -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 { -} diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java deleted file mode 100644 index 2d69f8f..0000000 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java +++ /dev/null @@ -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 { -} diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/RoleDeptItemDto.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/RoleDeptItemDto.java new file mode 100644 index 0000000..2f639eb --- /dev/null +++ b/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; +} diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java deleted file mode 100644 index 5d333d3..0000000 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java +++ /dev/null @@ -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; - - /** - * 组织ID(xy_sys_dept.id,type=1)。 - */ - @TableField(value = "dept_id") - private Long deptId; -} diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java deleted file mode 100644 index aa84a58..0000000 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java +++ /dev/null @@ -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; - - /** - * 组织ID(xy_sys_dept.id,type=1)。 - */ - @TableField(value = "dept_id") - private Long deptId; -} diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserRole.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserRole.java index 7cf1ca5..c5db16f 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserRole.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserRole.java @@ -25,4 +25,10 @@ public class SysUserRole { */ @TableField(value = "role_id") private Long roleId; + + /** + * 组织Id(可为空,表示不限定组织)。 + */ + @TableField(value = "dept_id") + private Long deptId; } diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java index 7b48de7..b920767 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java @@ -27,10 +27,9 @@ public interface SysRoleService extends IBaseService { * * @param role 新增的角色对象。 * @param menuIdSet 菜单Id列表。 - * @param deptIdSet 组织Id集合(可选,多对多关联)。 * @return 新增后的角色对象。 */ - SysRole saveNew(SysRole role, Set menuIdSet, Set deptIdSet); + SysRole saveNew(SysRole role, Set menuIdSet); /** * 更新角色对象。 @@ -38,10 +37,9 @@ public interface SysRoleService extends IBaseService { * @param role 更新的角色对象。 * @param originalRole 原有的角色对象。 * @param menuIdSet 菜单Id列表。 - * @param deptIdSet 组织Id集合(可选,多对多关联)。 * @return 更新成功返回true,否则false。 */ - boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Set deptIdSet); + boolean update(SysRole role, SysRole originalRole, Set menuIdSet); /** * 删除指定角色。 @@ -87,13 +85,12 @@ public interface SysRoleService extends IBaseService { /** * 验证角色对象关联的数据是否都合法。 * - * @param sysRole 当前操作的对象。 - * @param originalSysRole 原有对象。 - * @param menuIdListString 逗号分隔的menuId列表。 - * @param deptIdListString 逗号分隔的组织Id列表(可选,多对多关联)。 + * @param sysRole 当前操作的对象。 + * @param originalSysRole 原有对象。 + * @param menuIdListString 逗号分隔的menuId列表。 * @return 验证结果。 */ - CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString); + CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString); /** * 查询角色的权限资源地址列表。同时返回详细的分配路径。 diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysUserService.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysUserService.java index b82f9fc..691470a 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysUserService.java +++ b/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.object.CallResult; import apelet.common.core.object.ResponseResult; +import apelet.tenantadmin.upms.dto.RoleDeptItemDto; import apelet.tenantadmin.upms.model.SysUser; -import apelet.tenantadmin.upms.vo.SysDeptVo; import java.util.List; import java.util.Map; @@ -33,7 +33,7 @@ public interface SysUserService extends IBaseService { * @param roleIdSet 用户角色Id集合。 * @param deptPostIdSet 部门岗位Id集合。 * @param dataPermIdSet 数据权限Id集合。 - * @param deptIdSet 组织Id集合。 + * @param deptIdSet 组织Id集合(写入SysUserRole.deptId)。 * @return 新增后的用户对象。 */ SysUser saveNew(SysUser user, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet, Set deptIdSet); @@ -46,7 +46,7 @@ public interface SysUserService extends IBaseService { * @param roleIdSet 用户角色Id列表。 * @param deptPostIdSet 部门岗位Id集合。 * @param dataPermIdSet 数据权限Id集合。 - * @param deptIdSet 组织Id集合。 + * @param deptIdSet 组织Id集合(写入SysUserRole.deptId)。 * @return 更新成功返回true,否则false。 */ boolean update(SysUser user, SysUser originalUser, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet, Set deptIdSet); @@ -229,7 +229,7 @@ public interface SysUserService extends IBaseService { * @param roleIds 逗号分隔的角色Id列表字符串。 * @param deptPostIds 逗号分隔的部门岗位Id列表字符串。 * @param dataPermIds 逗号分隔的数据权限Id列表字符串。 - * @param deptIds 逗号分隔的组织Id列表字符串。 + * @param deptIds 逗号分隔的组织Id列表字符串(可选,写入SysUserRole.deptId)。 * @return 验证结果。 */ CallResult verifyRelatedData( @@ -259,10 +259,28 @@ public interface SysUserService extends IBaseService { ResponseResult syncEasUSer(); /** - * 查询用户关联的组织列表。 + * 查询所有组织及其下角色列表,并标记用户是否拥有该角色。 * * @param userId 用户Id。 - * @return 用户关联的组织Vo列表。 + * @return 组织-角色树列表,包含用户勾选状态。 */ - List listUserDept(Long userId); + List> listUserDept(Long userId); + + /** + * 验证角色-组织映射数据的合法性。 + * + * @param roleDeptList 角色-组织关联列表。 + * @return 验证结果。 + */ + CallResult verifyRoleDeptMap(List roleDeptList); + + /** + * 分配用户组织角色。 + * 先删除用户原有的角色关联,再按 roleDeptList 逐条写入 xy_sys_user_role。 + * roleId 为空则跳过该条;deptId 为空则不限组织。 + * + * @param userId 用户Id。 + * @param roleDeptList 角色-组织关联列表。 + */ + void assignRoleDept(Long userId, List roleDeptList); } diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysRoleServiceImpl.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysRoleServiceImpl.java index 178c443..f2ccc13 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysRoleServiceImpl.java +++ b/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.sequence.wrapper.IdGeneratorWrapper; import apelet.tenantadmin.config.DataSourceType; -import apelet.tenantadmin.upms.dao.*; -import apelet.tenantadmin.upms.model.*; -import apelet.tenantadmin.upms.service.SysDeptService; +import apelet.tenantadmin.upms.dao.SysDeptMapper; +import apelet.tenantadmin.upms.dao.SysRoleMapper; +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.SysRoleService; import apelet.tenantadmin.upms.vo.SysDeptVo; @@ -60,10 +65,6 @@ public class SysRoleServiceImpl extends BaseService implements Sy @Autowired private SysMenuService sysMenuService; @Autowired - private SysRoleDeptMapper sysRoleDeptMapper; - @Autowired - private SysDeptService sysDeptService; - @Autowired private SysDeptMapper sysDeptMapper; @Autowired private IdGeneratorWrapper idGenerator; @@ -119,7 +120,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public SysRole saveNew(SysRole role, Set menuIdSet, Set deptIdSet) { + public SysRole saveNew(SysRole role, Set menuIdSet) { role.setRoleId(idGenerator.nextLongId()); MyModelUtil.fillCommonsForInsert(role); role.setDeletedFlag(GlobalDeletedFlag.NORMAL); @@ -132,15 +133,6 @@ public class SysRoleServiceImpl extends BaseService implements Sy 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; } @@ -154,7 +146,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Set deptIdSet) { + public boolean update(SysRole role, SysRole originalRole, Set menuIdSet) { MyModelUtil.fillCommonsForUpdate(role, originalRole); if (sysRoleMapper.updateById(role) != 1) { return false; @@ -170,18 +162,6 @@ public class SysRoleServiceImpl extends BaseService implements Sy 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; } @@ -203,9 +183,6 @@ public class SysRoleServiceImpl extends BaseService implements Sy SysUserRole userRole = new SysUserRole(); userRole.setRoleId(roleId); sysUserRoleMapper.delete(new QueryWrapper<>(userRole)); - SysRoleDept roleDept = new SysRoleDept(); - roleDept.setRoleId(roleId); - sysRoleDeptMapper.delete(new QueryWrapper<>(roleDept)); roleFormButtonService.removeByRoleId(roleId); return true; } @@ -267,7 +244,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy * @return 验证结果。 */ @Override - public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString) { + public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString) { JSONObject jsonObject = null; if (StringUtils.isNotBlank(menuIdListString)) { Set menuIdSet = Arrays.stream( @@ -278,18 +255,6 @@ public class SysRoleServiceImpl extends BaseService implements Sy jsonObject = new JSONObject(); jsonObject.put("menuIdSet", menuIdSet); } - // 校验组织ID列表(可选,多对多关联) - if (StringUtils.isNotBlank(deptIdListString)) { - Set 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); } @@ -319,15 +284,14 @@ public class SysRoleServiceImpl extends BaseService implements Sy @Override public List getRoleDept(Long roleId) { - SysRoleDept filter = new SysRoleDept(); - filter.setRoleId(roleId); - List roleDeptList = sysRoleDeptMapper.selectList(new QueryWrapper<>(filter)); - if (CollUtil.isEmpty(roleDeptList)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUserRole::getRoleId, roleId).isNotNull(SysUserRole::getDeptId); + List userRoleList = sysUserRoleMapper.selectList(queryWrapper); + if (CollUtil.isEmpty(userRoleList)) { return Collections.emptyList(); } - List deptIdList = roleDeptList.stream() - .map(SysRoleDept::getDeptId).collect(Collectors.toList()); - List deptList = sysDeptMapper.selectBatchIds(deptIdList); + Set deptIdSet = userRoleList.stream().map(SysUserRole::getDeptId).collect(Collectors.toSet()); + List deptList = sysDeptMapper.selectBatchIds(deptIdSet); if (CollUtil.isEmpty(deptList)) { return Collections.emptyList(); } @@ -336,15 +300,13 @@ public class SysRoleServiceImpl extends BaseService implements Sy @Override public MyPageData listRoleByDeptId(Long deptId, MyOrderParam orderParam, MyPageParam pageParam) { - // 查询xy_sys_role_dept获取roleId集合 - SysRoleDept filter = new SysRoleDept(); - filter.setDeptId(deptId); - List roleDeptList = sysRoleDeptMapper.selectList(new QueryWrapper<>(filter)); - if (CollUtil.isEmpty(roleDeptList)) { + LambdaQueryWrapper roleQuery = new LambdaQueryWrapper<>(); + roleQuery.eq(SysUserRole::getDeptId, deptId); + List userRoleList = sysUserRoleMapper.selectList(roleQuery); + if (CollUtil.isEmpty(userRoleList)) { return new MyPageData<>(Collections.emptyList(), 0L); } - List roleIdList = roleDeptList.stream() - .map(SysRoleDept::getRoleId).collect(Collectors.toList()); + Set roleIdList = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet()); // 分页查询角色,使用IN条件 if (pageParam != null) { PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize()); diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysUserServiceImpl.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysUserServiceImpl.java index a35b717..d4c40d4 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysUserServiceImpl.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysUserServiceImpl.java @@ -1,6 +1,5 @@ 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.service.BaseService; 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.constant.BizWidgetDatasourceType; import apelet.common.ext.util.BizWidgetDatasourceExtHelper; -import apelet.common.generator.utils.OrmGenDataSourceUtil; import apelet.common.sequence.wrapper.IdGeneratorWrapper; -import apelet.tenantadmin.upms.controller.SysUserController; import apelet.tenantadmin.upms.dao.*; +import apelet.tenantadmin.upms.dto.RoleDeptItemDto; import apelet.tenantadmin.upms.model.*; import apelet.tenantadmin.upms.model.constant.SysUserStatus; import apelet.tenantadmin.upms.service.*; -import apelet.tenantadmin.upms.vo.SysDeptVo; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; 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.PageMethod; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; @@ -74,10 +72,10 @@ public class SysUserServiceImpl extends BaseService implements Sy @Autowired private SysDeptService sysDeptService; @Autowired - private SysUserDeptMapper sysUserDeptMapper; - @Autowired private SysDeptMapper sysDeptMapper; @Autowired + private SysRoleMapper sysRoleMapper; + @Autowired private IdGeneratorWrapper idGenerator; @Autowired private PasswordEncoder passwordEncoder; @@ -233,15 +231,6 @@ public class SysUserServiceImpl extends BaseService implements Sy 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; } @@ -303,18 +292,6 @@ public class SysUserServiceImpl extends BaseService implements Sy 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; } @@ -367,6 +344,45 @@ public class SysUserServiceImpl extends BaseService implements Sy return true; } + @Transactional(rollbackFor = Exception.class) + @Override + public CallResult verifyRoleDeptMap(List roleDeptList) { + if (CollUtil.isEmpty(roleDeptList)) { + return CallResult.ok(); + } + Set 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 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 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)方法。 @@ -589,10 +605,9 @@ public class SysUserServiceImpl extends BaseService implements Sy && !sysDeptService.existId(sysUser.getDeptId())) { return CallResult.error("数据验证失败,关联的用户部门Id并不存在,请刷新后重试!"); } - // 验证组织ID(可选) + // 验证组织ID(可选,写入SysUserRole.deptId) if (StrUtil.isNotBlank(deptIds)) { - Set deptIdSet = Arrays.stream( - deptIds.split(",")).map(Long::valueOf).collect(Collectors.toSet()); + Set deptIdSet = Arrays.stream(deptIds.split(",")).map(Long::valueOf).collect(Collectors.toSet()); if (!sysDeptService.existAllPrimaryKeys(deptIdSet)) { return CallResult.error("数据验证失败,存在不合法的组织数据,请刷新后重试!"); } @@ -792,17 +807,61 @@ public class SysUserServiceImpl extends BaseService implements Sy } @Override - public List listUserDept(Long userId) { - SysUserDept filter = new SysUserDept(); - filter.setUserId(userId); - List userDeptList = sysUserDeptMapper.selectList(new QueryWrapper<>(filter)); - if (CollUtil.isEmpty(userDeptList)) { - return new LinkedList<>(); + public List> listUserDept(Long userId) { + // 1. 查询所有组织(不再区分type,部门和组织共用一张表) + List allDepts = sysDeptMapper.selectList(new LambdaQueryWrapper<>()); + if (CollUtil.isEmpty(allDepts)) { + return Collections.emptyList(); + } + // 2. 查询当前用户的角色记录(含deptId) + List userRoleList = sysUserRoleMapper.selectList(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + Set userRoleIdSet = userRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet()); + Set userDeptIdSet = userRoleList.stream().map(SysUserRole::getDeptId).filter(Objects::nonNull).collect(Collectors.toSet()); + // 3. 批量查询所有组织的角色关联(通过SysUserRole.deptId) + List allDeptIds = allDepts.stream().map(SysDept::getDeptId).collect(Collectors.toList()); + LambdaQueryWrapper roleDeptQuery = new LambdaQueryWrapper<>(); + roleDeptQuery.in(SysUserRole::getDeptId, allDeptIds); + List allRoleDeptList = sysUserRoleMapper.selectList(roleDeptQuery); + Map> deptRoleMap = new HashMap<>(); + Set 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 roleMap = Collections.emptyMap(); + if (CollUtil.isNotEmpty(allRoleIdSet)) { + List allRoleList = sysRoleMapper.selectBatchIds(allRoleIdSet); + roleMap = allRoleList.stream().collect(Collectors.toMap(SysRole::getRoleId, r -> r)); + } + // 5. 组装结果 + List> result = new ArrayList<>(); + for (SysDept dept : allDepts) { + Map item = new HashMap<>(); + Map deptInfo = new HashMap<>(); + deptInfo.put("deptId", dept.getDeptId()); + deptInfo.put("deptName", dept.getDeptName()); + item.put("deptinfo", deptInfo); + List roleIds = deptRoleMap.getOrDefault(dept.getDeptId(), Collections.emptyList()); + boolean deptCheck = userDeptIdSet.contains(dept.getDeptId()) || roleIds.stream().anyMatch(userRoleIdSet::contains); + deptInfo.put("check", deptCheck); + List> roleInfoList = new ArrayList<>(); + for (Long roleId : roleIds) { + SysRole role = roleMap.get(roleId); + if (role != null) { + Map 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 deptIdSet = userDeptList.stream() - .map(SysUserDept::getDeptId).collect(Collectors.toSet()); - List deptList = sysDeptMapper.getSysDeptList("dept_id", deptIdSet, null, null); - return MyModelUtil.copyCollectionTo(deptList, SysDeptVo.class); + return result; }