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 902bbbf..ef015d8 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 @@ -16,6 +16,7 @@ import apelet.tenantadmin.upms.model.SysUser; import apelet.tenantadmin.upms.model.SysUserRole; import apelet.tenantadmin.upms.service.SysRoleService; import apelet.tenantadmin.upms.service.SysUserService; +import apelet.tenantadmin.upms.vo.SysDeptVo; import apelet.tenantadmin.upms.vo.SysRoleVo; import apelet.tenantadmin.upms.vo.SysUserVo; import com.alibaba.fastjson.TypeReference; @@ -54,19 +55,22 @@ public class SysRoleController { * * @param sysRoleDto 新增角色对象。 * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 + * @param deptId 组织Id(可选)。 * @return 应答结果对象,包含新增角色的主键Id。 */ @ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"}) @OperationLog(type = SysOperationLogType.ADD) @PostMapping("/add") public ResponseResult add( - @MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString) { + @MyRequestBody SysRoleDto sysRoleDto, + @MyRequestBody String menuIdListString, + @MyRequestBody Long deptId) { 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); + CallResult result = sysRoleService.verifyRelatedData(sysRole, null, menuIdListString, deptId); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } @@ -74,7 +78,7 @@ public class SysRoleController { if (result.getData() != null) { menuIdSet = result.getData().getObject("menuIdSet", new TypeReference>(){}); } - sysRoleService.saveNew(sysRole, menuIdSet); + sysRoleService.saveNew(sysRole, menuIdSet, deptId); return ResponseResult.success(sysRole.getRoleId()); } @@ -83,12 +87,15 @@ public class SysRoleController { * * @param sysRoleDto 更新角色对象。 * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 + * @param deptId 组织Id(可选)。 * @return 应答结果对象。 */ @OperationLog(type = SysOperationLogType.UPDATE) @PostMapping("/update") public ResponseResult update( - @MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString) { + @MyRequestBody SysRoleDto sysRoleDto, + @MyRequestBody String menuIdListString, + @MyRequestBody Long deptId) { String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class); if (errorMessage != null) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); @@ -99,7 +106,7 @@ 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); + CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString, deptId); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } @@ -107,7 +114,7 @@ public class SysRoleController { if (result.getData() != null) { menuIdSet = result.getData().getObject("menuIdSet", new TypeReference>(){}); } - if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet)) { + if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet, deptId)) { errorMessage = "更新失败,数据不存在,请刷新后重试!"; return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage); } @@ -349,4 +356,39 @@ public class SysRoleController { } return ResponseResult.success(sysRoleService.getSysPermCodeListWithDetail(roleId, permCode)); } + + /** + * 查询角色关联的组织(用于编辑页回显)。 + * + * @param roleId 角色Id。 + * @return 应答结果对象,包含角色关联的组织信息。 + */ + @GetMapping("/getRoleDept") + public ResponseResult getRoleDept(@RequestParam Long roleId) { + if (MyCommonUtil.existBlankArgument(roleId)) { + return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST); + } + SysDeptVo deptVo = sysRoleService.getRoleDept(roleId); + return ResponseResult.success(deptVo); + } + + /** + * 根据组织ID分页查询关联角色(运行时使用)。 + * + * @param deptId 组织Id。 + * @param orderParam 排序参数。 + * @param pageParam 分页参数。 + * @return 应答结果对象,包含分页的角色列表。 + */ + @PostMapping("/listRoleByDeptId") + public ResponseResult> listRoleByDeptId( + @MyRequestBody Long deptId, + @MyRequestBody MyOrderParam orderParam, + @MyRequestBody MyPageParam pageParam) { + if (MyCommonUtil.existBlankArgument(deptId)) { + return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST); + } + MyPageData pageData = sysRoleService.listRoleByDeptId(deptId, orderParam, pageParam); + return ResponseResult.success(pageData); + } } 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 9cfa255..53aec83 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 @@ -18,6 +18,7 @@ import apelet.tenantadmin.config.ApplicationConfig; 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; @@ -74,6 +75,7 @@ public class SysUserController { * @param deptPostIdListString 逗号分隔的部门岗位Id列表。 * @param dataPermIdListString 逗号分隔的数据权限Id列表。 * @param roleIdListString 逗号分隔的角色Id列表。 + * @param deptIdListString 逗号分隔的组织Id列表。 * @return 应答结果对象,包含新增用户的主键Id。 */ @ApiOperationSupport(ignoreParameters = { @@ -86,14 +88,15 @@ public class SysUserController { @MyRequestBody SysUserDto sysUserDto, @MyRequestBody String deptPostIdListString, @MyRequestBody String dataPermIdListString, - @MyRequestBody String roleIdListString) { + @MyRequestBody String roleIdListString, + @MyRequestBody String deptIdListString) { String errorMessage = MyCommonUtil.getModelValidationError(sysUserDto); if (errorMessage != null) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); } SysUser sysUser = MyModelUtil.copyTo(sysUserDto, SysUser.class); CallResult result = sysUserService.verifyRelatedData( - sysUser, null, roleIdListString, deptPostIdListString, dataPermIdListString); + sysUser, null, roleIdListString, deptPostIdListString, dataPermIdListString, deptIdListString); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } @@ -103,7 +106,12 @@ public class SysUserController { }); Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>() { }); - sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet); + Set deptIdSet = null; + if (result.getData().containsKey("deptIdSet")) { + deptIdSet = result.getData().getObject("deptIdSet", new TypeReference>() { + }); + } + sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet); return ResponseResult.success(sysUser.getUserId()); } @@ -127,7 +135,7 @@ public class SysUserController { } SysUser sysUser = MyModelUtil.copyTo(sysUserDto, SysUser.class); CallResult result = sysUserService.verifyRelatedData( - sysUser, null, "1801273688285270000", "1821796396504723500", "1821788867364139000"); + sysUser, null, "1801273688285270000", "1821796396504723500", "1821788867364139000", null); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } @@ -137,7 +145,7 @@ public class SysUserController { }); Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>() { }); - SysUser sysUserO = sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet); + SysUser sysUserO = sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, null); try { ObjectValue userInfoObj = new ObjectValue("sys_user_info"); @@ -164,6 +172,7 @@ public class SysUserController { * @param deptPostIdListString 逗号分隔的部门岗位Id列表。 * @param dataPermIdListString 逗号分隔的数据权限Id列表。 * @param roleIdListString 逗号分隔的角色Id列表。 + * @param deptIdListString 逗号分隔的组织Id列表。 * @return 应答结果对象。 */ @ApiOperationSupport(ignoreParameters = { @@ -175,7 +184,8 @@ public class SysUserController { @MyRequestBody SysUserDto sysUserDto, @MyRequestBody String deptPostIdListString, @MyRequestBody String dataPermIdListString, - @MyRequestBody String roleIdListString) { + @MyRequestBody String roleIdListString, + @MyRequestBody String deptIdListString) { String errorMessage = MyCommonUtil.getModelValidationError(sysUserDto, true); if (errorMessage != null) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); @@ -186,7 +196,7 @@ public class SysUserController { } SysUser sysUser = MyModelUtil.copyTo(sysUserDto, SysUser.class); CallResult result = sysUserService.verifyRelatedData( - sysUser, originalUser, roleIdListString, deptPostIdListString, dataPermIdListString); + sysUser, originalUser, roleIdListString, deptPostIdListString, dataPermIdListString, deptIdListString); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } @@ -196,7 +206,12 @@ public class SysUserController { }); Set dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference>() { }); - if (!sysUserService.update(sysUser, originalUser, roleIdSet, deptPostIdSet, dataPermIdSet)) { + Set deptIdSet = null; + if (result.getData().containsKey("deptIdSet")) { + deptIdSet = result.getData().getObject("deptIdSet", new TypeReference>() { + }); + } + if (!sysUserService.update(sysUser, originalUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet)) { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); } return ResponseResult.success(); @@ -482,6 +497,21 @@ public class SysUserController { return ResponseResult.success(resultList); } + /** + * 查询用户关联的组织列表(用于编辑页回显)。 + * + * @param userId 用户Id。 + * @return 应答结果对象,包含用户关联的组织列表。 + */ + @GetMapping("/listUserDept") + 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); + } + private ResponseResult doDelete(Long userId) { String errorMessage; // 验证关联Id的数据合法性 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 new file mode 100644 index 0000000..26e1a81 --- /dev/null +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java @@ -0,0 +1,13 @@ +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 new file mode 100644 index 0000000..2d69f8f --- /dev/null +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java @@ -0,0 +1,13 @@ +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/dao/mapper/SysDeptMapper.xml b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/mapper/SysDeptMapper.xml index b2ce9f5..0a0d65f 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/mapper/SysDeptMapper.xml +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/mapper/SysDeptMapper.xml @@ -6,6 +6,7 @@ + @@ -55,6 +56,9 @@ AND xy_sys_dept.parent_id = #{sysDeptFilter.parentId} + + AND xy_sys_dept.type = #{sysDeptFilter.type} + diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysDeptDto.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysDeptDto.java index 057d266..6dbf6c9 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysDeptDto.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysDeptDto.java @@ -43,4 +43,10 @@ public class SysDeptDto { */ @Schema(description = "父部门Id") private Long parentId; + + /** + * 类型:0-部门,1-组织。 + */ + @Schema(description = "类型:0-部门,1-组织") + private Integer type; } diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysDept.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysDept.java index c8b3e78..285511a 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysDept.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysDept.java @@ -43,6 +43,11 @@ public class SysDept { private Long parentId; /** + * 类型:0-部门,1-组织。 + */ + private Integer type; + + /** * 逻辑删除标记字段(1: 正常 -1: 已删除)。 */ @TableLogic 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 new file mode 100644 index 0000000..5d333d3 --- /dev/null +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java @@ -0,0 +1,28 @@ +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 new file mode 100644 index 0000000..aa84a58 --- /dev/null +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java @@ -0,0 +1,28 @@ +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/service/SysRoleService.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java index 1390139..23c7caf 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 @@ -2,8 +2,13 @@ package apelet.tenantadmin.upms.service; import apelet.common.core.base.service.IBaseService; import apelet.common.core.object.CallResult; +import apelet.common.core.object.MyPageData; +import apelet.common.core.object.MyOrderParam; +import apelet.common.core.object.MyPageParam; import apelet.tenantadmin.upms.model.SysRole; import apelet.tenantadmin.upms.model.SysUserRole; +import apelet.tenantadmin.upms.vo.SysDeptVo; +import apelet.tenantadmin.upms.vo.SysRoleVo; import java.util.List; import java.util.Map; @@ -22,9 +27,10 @@ public interface SysRoleService extends IBaseService { * * @param role 新增的角色对象。 * @param menuIdSet 菜单Id列表。 + * @param deptId 组织Id(可选)。 * @return 新增后的角色对象。 */ - SysRole saveNew(SysRole role, Set menuIdSet); + SysRole saveNew(SysRole role, Set menuIdSet, Long deptId); /** * 更新角色对象。 @@ -32,9 +38,10 @@ public interface SysRoleService extends IBaseService { * @param role 更新的角色对象。 * @param originalRole 原有的角色对象。 * @param menuIdSet 菜单Id列表。 + * @param deptId 组织Id(可选)。 * @return 更新成功返回true,否则false。 */ - boolean update(SysRole role, SysRole originalRole, Set menuIdSet); + boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Long deptId); /** * 删除指定角色。 @@ -83,9 +90,10 @@ public interface SysRoleService extends IBaseService { * @param sysRole 当前操作的对象。 * @param originalSysRole 原有对象。 * @param menuIdListString 逗号分隔的menuId列表。 + * @param deptId 组织Id(可选)。 * @return 验证结果。 */ - CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString); + CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, Long deptId); /** * 查询角色的权限资源地址列表。同时返回详细的分配路径。 @@ -104,4 +112,22 @@ public interface SysRoleService extends IBaseService { * @return 包含从角色到权限字的权限分配路径信息的查询结果列表。 */ List> getSysPermCodeListWithDetail(Long roleId, String permCode); + + /** + * 查询角色关联的组织(用于编辑页回显)。 + * + * @param roleId 角色Id。 + * @return 角色关联的组织Vo,如果不存在返回null。 + */ + SysDeptVo getRoleDept(Long roleId); + + /** + * 根据组织ID分页查询关联角色。 + * + * @param deptId 组织Id。 + * @param orderParam 排序参数。 + * @param pageParam 分页参数。 + * @return 分页的角色列表。 + */ + MyPageData listRoleByDeptId(Long deptId, MyOrderParam orderParam, MyPageParam pageParam); } 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 1d528e6..b82f9fc 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 @@ -4,6 +4,7 @@ import apelet.common.core.base.service.IBaseService; import apelet.common.core.object.CallResult; import apelet.common.core.object.ResponseResult; import apelet.tenantadmin.upms.model.SysUser; +import apelet.tenantadmin.upms.vo.SysDeptVo; import java.util.List; import java.util.Map; @@ -32,9 +33,10 @@ public interface SysUserService extends IBaseService { * @param roleIdSet 用户角色Id集合。 * @param deptPostIdSet 部门岗位Id集合。 * @param dataPermIdSet 数据权限Id集合。 + * @param deptIdSet 组织Id集合。 * @return 新增后的用户对象。 */ - SysUser saveNew(SysUser user, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet); + SysUser saveNew(SysUser user, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet, Set deptIdSet); /** * 更新用户对象。 @@ -44,9 +46,10 @@ public interface SysUserService extends IBaseService { * @param roleIdSet 用户角色Id列表。 * @param deptPostIdSet 部门岗位Id集合。 * @param dataPermIdSet 数据权限Id集合。 + * @param deptIdSet 组织Id集合。 * @return 更新成功返回true,否则false。 */ - boolean update(SysUser user, SysUser originalUser, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet); + boolean update(SysUser user, SysUser originalUser, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet, Set deptIdSet); /** * 修改用户密码。 @@ -226,10 +229,11 @@ public interface SysUserService extends IBaseService { * @param roleIds 逗号分隔的角色Id列表字符串。 * @param deptPostIds 逗号分隔的部门岗位Id列表字符串。 * @param dataPermIds 逗号分隔的数据权限Id列表字符串。 + * @param deptIds 逗号分隔的组织Id列表字符串。 * @return 验证结果。 */ CallResult verifyRelatedData( - SysUser sysUser, SysUser originalSysUser, String roleIds, String deptPostIds, String dataPermIds); + SysUser sysUser, SysUser originalSysUser, String roleIds, String deptPostIds, String dataPermIds, String deptIds); /** * 根据云之家openId获取当前用户信息 @@ -253,4 +257,12 @@ public interface SysUserService extends IBaseService { boolean myUpdateBatch(List sysUserList); ResponseResult syncEasUSer(); + + /** + * 查询用户关联的组织列表。 + * + * @param userId 用户Id。 + * @return 用户关联的组织Vo列表。 + */ + List listUserDept(Long userId); } 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 c969253..dbeb0a6 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 @@ -4,7 +4,10 @@ import apelet.common.core.annotation.MyDataSource; import apelet.common.core.base.dao.BaseDaoMapper; import apelet.common.core.base.service.BaseService; import apelet.common.core.constant.GlobalDeletedFlag; -import apelet.common.core.object.*; +import apelet.common.core.object.CallResult; +import apelet.common.core.object.MyOrderParam; +import apelet.common.core.object.MyPageData; +import apelet.common.core.object.MyPageParam; import apelet.common.core.util.MyModelUtil; import apelet.common.core.util.MyPageUtil; import apelet.common.ext.base.BizWidgetDatasource; @@ -12,18 +15,20 @@ 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.SysRoleMapper; -import apelet.tenantadmin.upms.dao.SysRoleMenuMapper; -import apelet.tenantadmin.upms.dao.SysUserRoleMapper; -import apelet.tenantadmin.upms.model.SysRole; -import apelet.tenantadmin.upms.model.SysRoleMenu; -import apelet.tenantadmin.upms.model.SysUserRole; +import apelet.tenantadmin.upms.dao.*; +import apelet.tenantadmin.upms.model.*; +import apelet.tenantadmin.upms.service.SysDeptService; import apelet.tenantadmin.upms.service.SysMenuService; import apelet.tenantadmin.upms.service.SysRoleService; +import apelet.tenantadmin.upms.vo.SysDeptVo; +import apelet.tenantadmin.upms.vo.SysRoleVo; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.Page; import com.github.pagehelper.page.PageMethod; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -55,6 +60,12 @@ 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; @Autowired private BizWidgetDatasourceExtHelper bizWidgetDatasourceExtHelper; @@ -106,7 +117,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public SysRole saveNew(SysRole role, Set menuIdSet) { + public SysRole saveNew(SysRole role, Set menuIdSet, Long deptId) { role.setRoleId(idGenerator.nextLongId()); MyModelUtil.fillCommonsForInsert(role); role.setDeletedFlag(GlobalDeletedFlag.NORMAL); @@ -119,6 +130,13 @@ public class SysRoleServiceImpl extends BaseService implements Sy sysRoleMenuMapper.insert(roleMenu); } } + // 写入角色-组织关联 + if (deptId != null) { + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(role.getRoleId()); + roleDept.setDeptId(deptId); + sysRoleDeptMapper.insert(roleDept); + } return role; } @@ -132,7 +150,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public boolean update(SysRole role, SysRole originalRole, Set menuIdSet) { + public boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Long deptId) { MyModelUtil.fillCommonsForUpdate(role, originalRole); if (sysRoleMapper.updateById(role) != 1) { return false; @@ -148,6 +166,16 @@ public class SysRoleServiceImpl extends BaseService implements Sy sysRoleMenuMapper.insert(roleMenu); } } + // 先删后插角色-组织关联 + SysRoleDept deleteFilter = new SysRoleDept(); + deleteFilter.setRoleId(role.getRoleId()); + sysRoleDeptMapper.delete(new QueryWrapper<>(deleteFilter)); + if (deptId != null) { + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(role.getRoleId()); + roleDept.setDeptId(deptId); + sysRoleDeptMapper.insert(roleDept); + } return true; } @@ -169,6 +197,9 @@ 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)); return true; } @@ -229,7 +260,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy * @return 验证结果。 */ @Override - public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString) { + public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, Long deptId) { JSONObject jsonObject = null; if (StringUtils.isNotBlank(menuIdListString)) { Set menuIdSet = Arrays.stream( @@ -240,6 +271,16 @@ public class SysRoleServiceImpl extends BaseService implements Sy jsonObject = new JSONObject(); jsonObject.put("menuIdSet", menuIdSet); } + // 校验组织ID(可选) + if (deptId != null) { + if (!sysDeptService.existId(deptId)) { + return CallResult.error("数据验证失败,关联的组织并不存在,请刷新后重试!"); + } + if (jsonObject == null) { + jsonObject = new JSONObject(); + } + jsonObject.put("deptId", deptId); + } return CallResult.ok(jsonObject); } @@ -266,4 +307,49 @@ public class SysRoleServiceImpl extends BaseService implements Sy public List> getSysPermCodeListWithDetail(Long roleId, String permCode) { return sysRoleMapper.getSysPermCodeListWithDetail(roleId, permCode); } + + @Override + public SysDeptVo getRoleDept(Long roleId) { + SysRoleDept filter = new SysRoleDept(); + filter.setRoleId(roleId); + SysRoleDept roleDept = sysRoleDeptMapper.selectOne(new QueryWrapper<>(filter)); + if (roleDept == null) { + return null; + } + SysDept dept = sysDeptMapper.selectById(roleDept.getDeptId()); + if (dept == null) { + return null; + } + return MyModelUtil.copyTo(dept, SysDeptVo.class); + } + + @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)) { + return new MyPageData<>(Collections.emptyList(), 0L); + } + List roleIdList = roleDeptList.stream() + .map(SysRoleDept::getRoleId).collect(Collectors.toList()); + // 分页查询角色,使用IN条件 + if (pageParam != null) { + PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize()); + } + String orderBy = MyOrderParam.buildOrderBy(orderParam, SysRole.class); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysRole::getRoleId, roleIdList); + if (StrUtil.isNotBlank(orderBy)) { + queryWrapper.last("ORDER BY " + orderBy); + } + List roleList = sysRoleMapper.selectList(queryWrapper); + List roleVoList = MyModelUtil.copyCollectionTo(roleList, SysRoleVo.class); + long totalCount = 0L; + if (roleList instanceof Page) { + totalCount = ((Page) roleList).getTotal(); + } + return MyPageUtil.makeResponseData(roleVoList, totalCount); + } } 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 c56f557..a35b717 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 @@ -20,6 +20,7 @@ import apelet.tenantadmin.upms.dao.*; 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; @@ -73,6 +74,10 @@ public class SysUserServiceImpl extends BaseService implements Sy @Autowired private SysDeptService sysDeptService; @Autowired + private SysUserDeptMapper sysUserDeptMapper; + @Autowired + private SysDeptMapper sysDeptMapper; + @Autowired private IdGeneratorWrapper idGenerator; @Autowired private PasswordEncoder passwordEncoder; @@ -195,7 +200,7 @@ public class SysUserServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public SysUser saveNew(SysUser user, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet) { + public SysUser saveNew(SysUser user, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet, Set deptIdSet) { user.setUserId(idGenerator.nextLongId()); user.setPassword(passwordEncoder.encode(user.getPassword())); user.setUserStatus(SysUserStatus.STATUS_NORMAL); @@ -228,6 +233,15 @@ 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; } @@ -243,7 +257,7 @@ public class SysUserServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public boolean update(SysUser user, SysUser originalUser, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet) { + public boolean update(SysUser user, SysUser originalUser, Set roleIdSet, Set deptPostIdSet, Set dataPermIdSet, Set deptIdSet) { user.setLoginName(originalUser.getLoginName()); user.setPassword(originalUser.getPassword()); MyModelUtil.fillCommonsForUpdate(user, originalUser); @@ -289,6 +303,18 @@ 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; } @@ -530,7 +556,7 @@ public class SysUserServiceImpl extends BaseService implements Sy */ @Override public CallResult verifyRelatedData( - SysUser sysUser, SysUser originalSysUser, String roleIds, String deptPostIds, String dataPermIds) { + SysUser sysUser, SysUser originalSysUser, String roleIds, String deptPostIds, String dataPermIds, String deptIds) { JSONObject jsonObject = new JSONObject(); if (StrUtil.isBlank(deptPostIds)) { return CallResult.error("数据验证失败,用户的部门岗位数据不能为空!"); @@ -563,6 +589,15 @@ public class SysUserServiceImpl extends BaseService implements Sy && !sysDeptService.existId(sysUser.getDeptId())) { return CallResult.error("数据验证失败,关联的用户部门Id并不存在,请刷新后重试!"); } + // 验证组织ID(可选) + if (StrUtil.isNotBlank(deptIds)) { + Set deptIdSet = Arrays.stream( + deptIds.split(",")).map(Long::valueOf).collect(Collectors.toSet()); + if (!sysDeptService.existAllPrimaryKeys(deptIdSet)) { + return CallResult.error("数据验证失败,存在不合法的组织数据,请刷新后重试!"); + } + jsonObject.put("deptIdSet", deptIdSet); + } return CallResult.ok(jsonObject); } @@ -756,5 +791,19 @@ 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<>(); + } + 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); + } + } diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysDeptVo.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysDeptVo.java index 623cb2e..86cbf81 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysDeptVo.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysDeptVo.java @@ -40,6 +40,12 @@ public class SysDeptVo { private Long parentId; /** + * 类型:0-部门,1-组织。 + */ + @Schema(description = "类型:0-部门,1-组织") + private Integer type; + + /** * 创建者Id。 */ @Schema(description = "创建者Id")