Browse Source

feat(upms): 添加部门组织类型支持及角色用户关联功能

- 在SysDept实体中新增type字段,支持部门(0)和组织(1)类型
- 为SysDeptDto和SysDeptVo添加type字段定义
- 更新SysDeptMapper.xml映射文件,添加type字段映射和过滤条件
- 创建SysRoleDept实体用于角色-组织关联关系
- 创建SysUserDept实体用于用户-组织关联关系
- 在SysRoleService中新增角色与组织的关联、查询功能
- 在SysUserService中新增用户与组织的关联、查询功能
- 扩展SysRoleController,添加角色组织关联相关接口
- 扩展SysUserController,添加用户组织关联相关接口
- 实现角色和用户服务层的组织关联业务逻辑
feature/form-permission-control
chenchuchuan 3 weeks ago
parent
commit
eadce13994
  1. 54
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java
  2. 46
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java
  3. 13
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysRoleDeptMapper.java
  4. 13
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/SysUserDeptMapper.java
  5. 4
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/mapper/SysDeptMapper.xml
  6. 6
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysDeptDto.java
  7. 5
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysDept.java
  8. 28
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysRoleDept.java
  9. 28
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUserDept.java
  10. 32
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysRoleService.java
  11. 18
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/SysUserService.java
  12. 106
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysRoleServiceImpl.java
  13. 55
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysUserServiceImpl.java
  14. 6
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysDeptVo.java

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

@ -16,6 +16,7 @@ import apelet.tenantadmin.upms.model.SysUser; @@ -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 { @@ -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<Long> 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 { @@ -74,7 +78,7 @@ public class SysRoleController {
if (result.getData() != null) {
menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
}
sysRoleService.saveNew(sysRole, menuIdSet);
sysRoleService.saveNew(sysRole, menuIdSet, deptId);
return ResponseResult.success(sysRole.getRoleId());
}
@ -83,12 +87,15 @@ public class SysRoleController { @@ -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<Void> 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 { @@ -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 { @@ -107,7 +114,7 @@ public class SysRoleController {
if (result.getData() != null) {
menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
}
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 { @@ -349,4 +356,39 @@ public class SysRoleController {
}
return ResponseResult.success(sysRoleService.getSysPermCodeListWithDetail(roleId, permCode));
}
/**
* 查询角色关联的组织用于编辑页回显
*
* @param roleId 角色Id
* @return 应答结果对象包含角色关联的组织信息
*/
@GetMapping("/getRoleDept")
public ResponseResult<SysDeptVo> getRoleDept(@RequestParam Long roleId) {
if (MyCommonUtil.existBlankArgument(roleId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
SysDeptVo deptVo = sysRoleService.getRoleDept(roleId);
return ResponseResult.success(deptVo);
}
/**
* 根据组织ID分页查询关联角色运行时使用
*
* @param deptId 组织Id
* @param orderParam 排序参数
* @param pageParam 分页参数
* @return 应答结果对象包含分页的角色列表
*/
@PostMapping("/listRoleByDeptId")
public ResponseResult<MyPageData<SysRoleVo>> listRoleByDeptId(
@MyRequestBody Long deptId,
@MyRequestBody MyOrderParam orderParam,
@MyRequestBody MyPageParam pageParam) {
if (MyCommonUtil.existBlankArgument(deptId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
MyPageData<SysRoleVo> pageData = sysRoleService.listRoleByDeptId(deptId, orderParam, pageParam);
return ResponseResult.success(pageData);
}
}

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

@ -18,6 +18,7 @@ import apelet.tenantadmin.config.ApplicationConfig; @@ -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 { @@ -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 { @@ -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 { @@ -103,7 +106,12 @@ public class SysUserController {
});
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {
});
sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet);
Set<Long> deptIdSet = null;
if (result.getData().containsKey("deptIdSet")) {
deptIdSet = result.getData().getObject("deptIdSet", new TypeReference<Set<Long>>() {
});
}
sysUserService.saveNew(sysUser, roleIdSet, deptPostIdSet, dataPermIdSet, deptIdSet);
return ResponseResult.success(sysUser.getUserId());
}
@ -127,7 +135,7 @@ public class SysUserController { @@ -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 { @@ -137,7 +145,7 @@ public class SysUserController {
});
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {
});
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 { @@ -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 { @@ -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 { @@ -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 { @@ -196,7 +206,12 @@ public class SysUserController {
});
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {
});
if (!sysUserService.update(sysUser, originalUser, roleIdSet, deptPostIdSet, dataPermIdSet)) {
Set<Long> deptIdSet = null;
if (result.getData().containsKey("deptIdSet")) {
deptIdSet = result.getData().getObject("deptIdSet", new TypeReference<Set<Long>>() {
});
}
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 { @@ -482,6 +497,21 @@ public class SysUserController {
return ResponseResult.success(resultList);
}
/**
* 查询用户关联的组织列表用于编辑页回显
*
* @param userId 用户Id
* @return 应答结果对象包含用户关联的组织列表
*/
@GetMapping("/listUserDept")
public ResponseResult<List<SysDeptVo>> listUserDept(@RequestParam Long userId) {
if (MyCommonUtil.existBlankArgument(userId)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
List<SysDeptVo> deptVoList = sysUserService.listUserDept(userId);
return ResponseResult.success(deptVoList);
}
private ResponseResult<Void> doDelete(Long userId) {
String errorMessage;
// 验证关联Id的数据合法性

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

@ -0,0 +1,13 @@ @@ -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<SysRoleDept> {
}

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

@ -0,0 +1,13 @@ @@ -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<SysUserDept> {
}

4
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dao/mapper/SysDeptMapper.xml

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
<result column="dept_name" jdbcType="VARCHAR" property="deptName"/>
<result column="show_order" jdbcType="INTEGER" property="showOrder"/>
<result column="parent_id" jdbcType="BIGINT" property="parentId"/>
<result column="type" jdbcType="TINYINT" property="type"/>
<result column="deleted_flag" jdbcType="INTEGER" property="deletedFlag"/>
<result column="create_user_id" jdbcType="BIGINT" property="createUserId"/>
<result column="update_user_id" jdbcType="BIGINT" property="updateUserId"/>
@ -55,6 +56,9 @@ @@ -55,6 +56,9 @@
<if test="sysDeptFilter.parentId != null">
AND xy_sys_dept.parent_id = #{sysDeptFilter.parentId}
</if>
<if test="sysDeptFilter.type != null">
AND xy_sys_dept.type = #{sysDeptFilter.type}
</if>
</if>
</sql>

6
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysDeptDto.java

@ -43,4 +43,10 @@ public class SysDeptDto { @@ -43,4 +43,10 @@ public class SysDeptDto {
*/
@Schema(description = "父部门Id")
private Long parentId;
/**
* 类型0-部门1-组织
*/
@Schema(description = "类型:0-部门,1-组织")
private Integer type;
}

5
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysDept.java

@ -43,6 +43,11 @@ public class SysDept { @@ -43,6 +43,11 @@ public class SysDept {
private Long parentId;
/**
* 类型0-部门1-组织
*/
private Integer type;
/**
* 逻辑删除标记字段(1: 正常 -1: 已删除)
*/
@TableLogic

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

@ -0,0 +1,28 @@ @@ -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;
/**
* 组织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

@ -0,0 +1,28 @@ @@ -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;
/**
* 组织IDxy_sys_dept.idtype=1
*/
@TableField(value = "dept_id")
private Long deptId;
}

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

@ -2,8 +2,13 @@ package apelet.tenantadmin.upms.service; @@ -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<SysRole, Long> { @@ -22,9 +27,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
*
* @param role 新增的角色对象
* @param menuIdSet 菜单Id列表
* @param deptId 组织Id可选
* @return 新增后的角色对象
*/
SysRole saveNew(SysRole role, Set<Long> menuIdSet);
SysRole saveNew(SysRole role, Set<Long> menuIdSet, Long deptId);
/**
* 更新角色对象
@ -32,9 +38,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> { @@ -32,9 +38,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
* @param role 更新的角色对象
* @param originalRole 原有的角色对象
* @param menuIdSet 菜单Id列表
* @param deptId 组织Id可选
* @return 更新成功返回true否则false
*/
boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet);
boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Long deptId);
/**
* 删除指定角色
@ -83,9 +90,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> { @@ -83,9 +90,10 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
* @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<SysRole, Long> { @@ -104,4 +112,22 @@ public interface SysRoleService extends IBaseService<SysRole, Long> {
* @return 包含从角色到权限字的权限分配路径信息的查询结果列表
*/
List<Map<String, Object>> 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<SysRoleVo> listRoleByDeptId(Long deptId, MyOrderParam orderParam, MyPageParam pageParam);
}

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

@ -4,6 +4,7 @@ import apelet.common.core.base.service.IBaseService; @@ -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<SysUser, Long> { @@ -32,9 +33,10 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @param roleIdSet 用户角色Id集合
* @param deptPostIdSet 部门岗位Id集合
* @param dataPermIdSet 数据权限Id集合
* @param deptIdSet 组织Id集合
* @return 新增后的用户对象
*/
SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet);
SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> deptIdSet);
/**
* 更新用户对象
@ -44,9 +46,10 @@ public interface SysUserService extends IBaseService<SysUser, Long> { @@ -44,9 +46,10 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @param roleIdSet 用户角色Id列表
* @param deptPostIdSet 部门岗位Id集合
* @param dataPermIdSet 数据权限Id集合
* @param deptIdSet 组织Id集合
* @return 更新成功返回true否则false
*/
boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet);
boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> deptIdSet);
/**
* 修改用户密码
@ -226,10 +229,11 @@ public interface SysUserService extends IBaseService<SysUser, Long> { @@ -226,10 +229,11 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @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<SysUser, Long> { @@ -253,4 +257,12 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
boolean myUpdateBatch(List<SysUser> sysUserList);
ResponseResult<?> syncEasUSer();
/**
* 查询用户关联的组织列表
*
* @param userId 用户Id
* @return 用户关联的组织Vo列表
*/
List<SysDeptVo> listUserDept(Long userId);
}

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

@ -4,7 +4,10 @@ import apelet.common.core.annotation.MyDataSource; @@ -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; @@ -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<SysRole, Long> implements Sy @@ -55,6 +60,12 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> 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<SysRole, Long> implements Sy @@ -106,7 +117,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
*/
@Transactional(rollbackFor = Exception.class)
@Override
public SysRole saveNew(SysRole role, Set<Long> menuIdSet) {
public SysRole saveNew(SysRole role, Set<Long> menuIdSet, Long deptId) {
role.setRoleId(idGenerator.nextLongId());
MyModelUtil.fillCommonsForInsert(role);
role.setDeletedFlag(GlobalDeletedFlag.NORMAL);
@ -119,6 +130,13 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -119,6 +130,13 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> 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<SysRole, Long> implements Sy @@ -132,7 +150,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet) {
public boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet, Long deptId) {
MyModelUtil.fillCommonsForUpdate(role, originalRole);
if (sysRoleMapper.updateById(role) != 1) {
return false;
@ -148,6 +166,16 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -148,6 +166,16 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
sysRoleMenuMapper.insert(roleMenu);
}
}
// 先删后插角色-组织关联
SysRoleDept deleteFilter = new SysRoleDept();
deleteFilter.setRoleId(role.getRoleId());
sysRoleDeptMapper.delete(new QueryWrapper<>(deleteFilter));
if (deptId != null) {
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<SysRole, Long> implements Sy @@ -169,6 +197,9 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> 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<SysRole, Long> implements Sy @@ -229,7 +260,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> 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<Long> menuIdSet = Arrays.stream(
@ -240,6 +271,16 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy @@ -240,6 +271,16 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> 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<SysRole, Long> implements Sy @@ -266,4 +307,49 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
public List<Map<String, Object>> 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<SysRoleVo> listRoleByDeptId(Long deptId, MyOrderParam orderParam, MyPageParam pageParam) {
// 查询xy_sys_role_dept获取roleId集合
SysRoleDept filter = new SysRoleDept();
filter.setDeptId(deptId);
List<SysRoleDept> roleDeptList = sysRoleDeptMapper.selectList(new QueryWrapper<>(filter));
if (CollUtil.isEmpty(roleDeptList)) {
return new MyPageData<>(Collections.emptyList(), 0L);
}
List<Long> 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<SysRole> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SysRole::getRoleId, roleIdList);
if (StrUtil.isNotBlank(orderBy)) {
queryWrapper.last("ORDER BY " + orderBy);
}
List<SysRole> roleList = sysRoleMapper.selectList(queryWrapper);
List<SysRoleVo> roleVoList = MyModelUtil.copyCollectionTo(roleList, SysRoleVo.class);
long totalCount = 0L;
if (roleList instanceof Page) {
totalCount = ((Page<SysRole>) roleList).getTotal();
}
return MyPageUtil.makeResponseData(roleVoList, totalCount);
}
}

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

@ -20,6 +20,7 @@ import apelet.tenantadmin.upms.dao.*; @@ -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<SysUser, Long> implements Sy @@ -73,6 +74,10 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> 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<SysUser, Long> implements Sy @@ -195,7 +200,7 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
*/
@Transactional(rollbackFor = Exception.class)
@Override
public SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet) {
public SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> 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<SysUser, Long> implements Sy @@ -228,6 +233,15 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> 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<SysUser, Long> implements Sy @@ -243,7 +257,7 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet) {
public boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> deptPostIdSet, Set<Long> dataPermIdSet, Set<Long> deptIdSet) {
user.setLoginName(originalUser.getLoginName());
user.setPassword(originalUser.getPassword());
MyModelUtil.fillCommonsForUpdate(user, originalUser);
@ -289,6 +303,18 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy @@ -289,6 +303,18 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> 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<SysUser, Long> implements Sy @@ -530,7 +556,7 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> 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<SysUser, Long> implements Sy @@ -563,6 +589,15 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
&& !sysDeptService.existId(sysUser.getDeptId())) {
return CallResult.error("数据验证失败,关联的用户部门Id并不存在,请刷新后重试!");
}
// 验证组织ID(可选)
if (StrUtil.isNotBlank(deptIds)) {
Set<Long> 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<SysUser, Long> implements Sy @@ -756,5 +791,19 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
}
}
@Override
public List<SysDeptVo> listUserDept(Long userId) {
SysUserDept filter = new SysUserDept();
filter.setUserId(userId);
List<SysUserDept> userDeptList = sysUserDeptMapper.selectList(new QueryWrapper<>(filter));
if (CollUtil.isEmpty(userDeptList)) {
return new LinkedList<>();
}
Set<Long> deptIdSet = userDeptList.stream()
.map(SysUserDept::getDeptId).collect(Collectors.toSet());
List<SysDept> deptList = sysDeptMapper.getSysDeptList("dept_id", deptIdSet, null, null);
return MyModelUtil.copyCollectionTo(deptList, SysDeptVo.class);
}
}

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

@ -40,6 +40,12 @@ public class SysDeptVo { @@ -40,6 +40,12 @@ public class SysDeptVo {
private Long parentId;
/**
* 类型0-部门1-组织
*/
@Schema(description = "类型:0-部门,1-组织")
private Integer type;
/**
* 创建者Id
*/
@Schema(description = "创建者Id")

Loading…
Cancel
Save