diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysDeptController.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysDeptController.java index 56ad43d..f14370f 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysDeptController.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysDeptController.java @@ -29,7 +29,10 @@ import org.springdoc.api.annotations.ParameterObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -145,6 +148,12 @@ public class SysDeptController { } SysDept sysDeptFilter = MyModelUtil.copyTo(sysDeptDtoFilter, SysDept.class); String orderBy = MyOrderParam.buildOrderBy(orderParam, SysDept.class); + if (sysDeptFilter == null){ + sysDeptFilter = new SysDept(); + } + if (sysDeptFilter.getType() == null){ + sysDeptFilter.setType(0); + } List sysDeptList = sysDeptService.getSysDeptListWithRelation(sysDeptFilter, orderBy); return ResponseResult.success(MyPageUtil.makeResponseData(sysDeptList, SysDept.INSTANCE)); } 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 6c13c2e..9bed9ee 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 @@ -21,6 +21,7 @@ import apelet.tenantadmin.upms.service.SysUserService; import apelet.tenantadmin.upms.vo.SysDeptVo; import apelet.tenantadmin.upms.vo.SysRoleVo; import apelet.tenantadmin.upms.vo.SysUserVo; +import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.github.pagehelper.Page; import com.github.pagehelper.page.PageMethod; @@ -57,10 +58,10 @@ public class SysRoleController { /** * 新增角色操作。 * - * @param sysRoleDto 新增角色对象。 - * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 - * @param deptId 组织Id(可选)。 - * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 + * @param sysRoleDto 新增角色对象。 + * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 + * @param deptIdListString 组织Id列表(可选,多对多关联),多个deptId之间逗号分隔。 + * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 * @return 应答结果对象,包含新增角色的主键Id。 */ @ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"}) @@ -69,22 +70,25 @@ public class SysRoleController { public ResponseResult add( @MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString, - @MyRequestBody Long deptId, + @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, deptId); + CallResult result = sysRoleService.verifyRelatedData(sysRole, null, menuIdListString, deptIdListString); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } Set menuIdSet = null; + Set deptIdSet = null; if (result.getData() != null) { - menuIdSet = result.getData().getObject("menuIdSet", new TypeReference>(){}); + JSONObject data = result.getData(); + menuIdSet = data.getObject("menuIdSet", new TypeReference>(){}); + deptIdSet = data.getObject("deptIdSet", new TypeReference>(){}); } - sysRoleService.saveNew(sysRole, menuIdSet, deptId); + sysRoleService.saveNew(sysRole, menuIdSet, deptIdSet); // 按钮权限配置(可选,不传不影响原有逻辑) if (buttonConfigList != null && !buttonConfigList.isEmpty()) { buttonConfigList.forEach(dto -> dto.setRoleId(sysRole.getRoleId())); @@ -96,10 +100,10 @@ public class SysRoleController { /** * 更新角色操作。 * - * @param sysRoleDto 更新角色对象。 - * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 - * @param deptId 组织Id(可选)。 - * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 + * @param sysRoleDto 更新角色对象。 + * @param menuIdListString 与当前角色Id绑定的menuId列表,多个menuId之间逗号分隔。 + * @param deptIdListString 组织Id列表(可选,多对多关联),多个deptId之间逗号分隔。 + * @param buttonConfigList 按钮权限配置列表(可选,不传不影响原有逻辑)。 * @return 应答结果对象。 */ @OperationLog(type = SysOperationLogType.UPDATE) @@ -107,7 +111,7 @@ public class SysRoleController { public ResponseResult update( @MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString, - @MyRequestBody Long deptId, + @MyRequestBody String deptIdListString, @MyRequestBody List buttonConfigList) { String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class); if (errorMessage != null) { @@ -119,15 +123,18 @@ public class SysRoleController { return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage); } SysRole sysRole = MyModelUtil.copyTo(sysRoleDto, SysRole.class); - CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString, deptId); + CallResult result = sysRoleService.verifyRelatedData(sysRole, originalSysRole, menuIdListString, deptIdListString); if (!result.isSuccess()) { return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage()); } Set menuIdSet = null; + Set deptIdSet = null; if (result.getData() != null) { - menuIdSet = result.getData().getObject("menuIdSet", new TypeReference>(){}); + JSONObject data = result.getData(); + menuIdSet = data.getObject("menuIdSet", new TypeReference>(){}); + deptIdSet = data.getObject("deptIdSet", new TypeReference>(){}); } - if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet, deptId)) { + if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet, deptIdSet)) { errorMessage = "更新失败,数据不存在,请刷新后重试!"; return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage); } @@ -198,9 +205,11 @@ public class SysRoleController { } SysRole sysRole = sysRoleService.getByIdWithRelation(roleId, MyRelationParam.full()); if (sysRole == null) { - return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); + return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST); } SysRoleVo sysRoleVo = MyModelUtil.copyTo(sysRole, SysRoleVo.class); + // 填充关联的组织列表(多对多,仅需要deptId和deptName) + sysRoleVo.setDeptList(sysRoleService.getRoleDept(roleId)); return ResponseResult.success(sysRoleVo); } @@ -376,18 +385,18 @@ public class SysRoleController { } /** - * 查询角色关联的组织(用于编辑页回显)。 + * 查询角色关联的组织列表(用于编辑页回显,多对多)。 * * @param roleId 角色Id。 - * @return 应答结果对象,包含角色关联的组织信息。 + * @return 应答结果对象,包含角色关联的组织信息列表。 */ @GetMapping("/getRoleDept") - public ResponseResult getRoleDept(@RequestParam Long roleId) { + 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); + List deptVoList = sysRoleService.getRoleDept(roleId); + return ResponseResult.success(deptVoList); } /** 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 23c7caf..7b48de7 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,8 @@ package apelet.tenantadmin.upms.service; import apelet.common.core.base.service.IBaseService; import apelet.common.core.object.CallResult; -import apelet.common.core.object.MyPageData; import apelet.common.core.object.MyOrderParam; +import apelet.common.core.object.MyPageData; import apelet.common.core.object.MyPageParam; import apelet.tenantadmin.upms.model.SysRole; import apelet.tenantadmin.upms.model.SysUserRole; @@ -27,10 +27,10 @@ public interface SysRoleService extends IBaseService { * * @param role 新增的角色对象。 * @param menuIdSet 菜单Id列表。 - * @param deptId 组织Id(可选)。 + * @param deptIdSet 组织Id集合(可选,多对多关联)。 * @return 新增后的角色对象。 */ - SysRole saveNew(SysRole role, Set menuIdSet, Long deptId); + SysRole saveNew(SysRole role, Set menuIdSet, Set deptIdSet); /** * 更新角色对象。 @@ -38,10 +38,10 @@ public interface SysRoleService extends IBaseService { * @param role 更新的角色对象。 * @param originalRole 原有的角色对象。 * @param menuIdSet 菜单Id列表。 - * @param deptId 组织Id(可选)。 + * @param deptIdSet 组织Id集合(可选,多对多关联)。 * @return 更新成功返回true,否则false。 */ - boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Long deptId); + boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Set deptIdSet); /** * 删除指定角色。 @@ -87,13 +87,13 @@ public interface SysRoleService extends IBaseService { /** * 验证角色对象关联的数据是否都合法。 * - * @param sysRole 当前操作的对象。 - * @param originalSysRole 原有对象。 - * @param menuIdListString 逗号分隔的menuId列表。 - * @param deptId 组织Id(可选)。 + * @param sysRole 当前操作的对象。 + * @param originalSysRole 原有对象。 + * @param menuIdListString 逗号分隔的menuId列表。 + * @param deptIdListString 逗号分隔的组织Id列表(可选,多对多关联)。 * @return 验证结果。 */ - CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, Long deptId); + CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString); /** * 查询角色的权限资源地址列表。同时返回详细的分配路径。 @@ -114,12 +114,12 @@ public interface SysRoleService extends IBaseService { List> getSysPermCodeListWithDetail(Long roleId, String permCode); /** - * 查询角色关联的组织(用于编辑页回显)。 + * 查询角色关联的组织列表(用于编辑页回显,多对多)。 * * @param roleId 角色Id。 - * @return 角色关联的组织Vo,如果不存在返回null。 + * @return 角色关联的组织Vo列表,如果不存在返回空列表。 */ - SysDeptVo getRoleDept(Long roleId); + List getRoleDept(Long roleId); /** * 根据组织ID分页查询关联角色。 diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysDeptServiceImpl.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysDeptServiceImpl.java index 7493696..0a08915 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysDeptServiceImpl.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/service/impl/SysDeptServiceImpl.java @@ -3,14 +3,20 @@ package apelet.tenantadmin.upms.service.impl; import apelet.common.core.base.dao.BaseDaoMapper; import apelet.common.core.base.service.BaseService; import apelet.common.core.constant.GlobalDeletedFlag; -import apelet.common.core.object.*; +import apelet.common.core.object.MyOrderParam; +import apelet.common.core.object.MyPageData; +import apelet.common.core.object.MyPageParam; +import apelet.common.core.object.MyRelationParam; import apelet.common.core.util.MyModelUtil; import apelet.common.core.util.MyPageUtil; import apelet.common.ext.base.BizWidgetDatasource; import apelet.common.ext.constant.BizWidgetDatasourceType; import apelet.common.ext.util.BizWidgetDatasourceExtHelper; import apelet.common.sequence.wrapper.IdGeneratorWrapper; -import apelet.tenantadmin.upms.dao.*; +import apelet.tenantadmin.upms.dao.SysDataPermDeptMapper; +import apelet.tenantadmin.upms.dao.SysDeptMapper; +import apelet.tenantadmin.upms.dao.SysDeptPostMapper; +import apelet.tenantadmin.upms.dao.SysDeptRelationMapper; import apelet.tenantadmin.upms.model.*; import apelet.tenantadmin.upms.service.SysDeptService; import apelet.tenantadmin.upms.service.SysUserService; @@ -29,7 +35,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; -import java.util.*; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -109,6 +118,9 @@ public class SysDeptServiceImpl extends BaseService implements Sy public SysDept saveNew(SysDept sysDept, SysDept parentSysDept) { sysDept.setDeptId(idGenerator.nextLongId()); sysDept.setDeletedFlag(GlobalDeletedFlag.NORMAL); + if (sysDept.getType() == null) { + sysDept.setType(0); + } MyModelUtil.fillCommonsForInsert(sysDept); sysDeptMapper.insert(sysDept); // 同步插入部门关联关系数据 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 257f28b..178c443 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 @@ -119,7 +119,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public SysRole saveNew(SysRole role, Set menuIdSet, Long deptId) { + public SysRole saveNew(SysRole role, Set menuIdSet, Set deptIdSet) { role.setRoleId(idGenerator.nextLongId()); MyModelUtil.fillCommonsForInsert(role); role.setDeletedFlag(GlobalDeletedFlag.NORMAL); @@ -132,12 +132,14 @@ 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); + // 写入角色-组织关联(多对多) + if (CollUtil.isNotEmpty(deptIdSet)) { + for (Long deptId : deptIdSet) { + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(role.getRoleId()); + roleDept.setDeptId(deptId); + sysRoleDeptMapper.insert(roleDept); + } } return role; } @@ -152,7 +154,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy */ @Transactional(rollbackFor = Exception.class) @Override - public boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Long deptId) { + public boolean update(SysRole role, SysRole originalRole, Set menuIdSet, Set deptIdSet) { MyModelUtil.fillCommonsForUpdate(role, originalRole); if (sysRoleMapper.updateById(role) != 1) { return false; @@ -168,15 +170,17 @@ 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); + if (CollUtil.isNotEmpty(deptIdSet)) { + for (Long deptId : deptIdSet) { + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(role.getRoleId()); + roleDept.setDeptId(deptId); + sysRoleDeptMapper.insert(roleDept); + } } return true; } @@ -263,7 +267,7 @@ public class SysRoleServiceImpl extends BaseService implements Sy * @return 验证结果。 */ @Override - public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, Long deptId) { + public CallResult verifyRelatedData(SysRole sysRole, SysRole originalSysRole, String menuIdListString, String deptIdListString) { JSONObject jsonObject = null; if (StringUtils.isNotBlank(menuIdListString)) { Set menuIdSet = Arrays.stream( @@ -274,15 +278,17 @@ public class SysRoleServiceImpl extends BaseService implements Sy jsonObject = new JSONObject(); jsonObject.put("menuIdSet", menuIdSet); } - // 校验组织ID(可选) - if (deptId != null) { - if (!sysDeptService.existId(deptId)) { + // 校验组织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("deptId", deptId); + jsonObject.put("deptIdSet", deptIdSet); } return CallResult.ok(jsonObject); } @@ -312,18 +318,20 @@ public class SysRoleServiceImpl extends BaseService implements Sy } @Override - public SysDeptVo getRoleDept(Long roleId) { + public List getRoleDept(Long roleId) { SysRoleDept filter = new SysRoleDept(); filter.setRoleId(roleId); - SysRoleDept roleDept = sysRoleDeptMapper.selectOne(new QueryWrapper<>(filter)); - if (roleDept == null) { - return null; + List roleDeptList = sysRoleDeptMapper.selectList(new QueryWrapper<>(filter)); + if (CollUtil.isEmpty(roleDeptList)) { + return Collections.emptyList(); } - SysDept dept = sysDeptMapper.selectById(roleDept.getDeptId()); - if (dept == null) { - return null; + List deptIdList = roleDeptList.stream() + .map(SysRoleDept::getDeptId).collect(Collectors.toList()); + List deptList = sysDeptMapper.selectBatchIds(deptIdList); + if (CollUtil.isEmpty(deptList)) { + return Collections.emptyList(); } - return MyModelUtil.copyTo(dept, SysDeptVo.class); + return MyModelUtil.copyCollectionTo(deptList, SysDeptVo.class); } @Override diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysRoleVo.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysRoleVo.java index 4efc79c..4194a25 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysRoleVo.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysRoleVo.java @@ -36,4 +36,10 @@ public class SysRoleVo extends BaseVo { */ @Schema(description = "角色与菜单关联对象列表") private List> sysRoleMenuList; + + /** + * 关联的组织列表(仅返回deptId和deptName,多对多)。 + */ + @Schema(description = "关联的组织列表") + private List deptList; }