From 1c2c1a1c86e2c4bc89a122f55419a131d4b46cec Mon Sep 17 00:00:00 2001 From: lilong Date: Thu, 12 Sep 2024 14:43:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:(feature/REQ-2750)=20=E6=B8=85=E6=B4=97?= =?UTF-8?q?=E8=B6=85=E7=AE=A1=E8=A7=92=E8=89=B2=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=B6=85=E7=AE=A1=E7=94=A8=E6=88=B7=E6=9F=A5=E8=AF=A2=E5=92=8C?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/TyrServerDevApplication.java | 1 + .../server/controller/PrivateController.java | 152 ++++++++++++++++++ .../controller/role/SaasRoleController.java | 10 +- .../server/service/impl/RoleUserService.java | 76 +++++---- 4 files changed, 205 insertions(+), 34 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrServerDevApplication.java b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrServerDevApplication.java index b15ee22a..e18dedb6 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrServerDevApplication.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrServerDevApplication.java @@ -31,6 +31,7 @@ public class TyrServerDevApplication { System.setProperty("spring.redis.host","172.16.2.23"); System.setProperty("xxl.job.admin.addresses","http://dev-xxl-job.axzo.cn/xxl-job-admin"); System.setProperty("rocketmq.name-server", "172.16.2.82:9876"); + System.setProperty("spring.datasource.url", "jdbc:mysql://172.16.2.171:3306/pudge?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=true&verifyServerCertificate=false&rewriteBatchedStatements=true"); SpringApplication application = new SpringApplication(TyrServerDevApplication.class); ApplicationContext applicationContext = application.run(args); Environment env = applicationContext.getEnvironment(); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java index fe5a35ca..ed095252 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -11,6 +11,7 @@ import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum; import cn.axzo.tyr.client.model.product.ProductSearchListReq; import cn.axzo.tyr.client.model.req.CommonDictQueryReq; import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; @@ -26,6 +27,7 @@ import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.client.model.res.SaasRoleGroupDTO; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; @@ -49,6 +51,7 @@ import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao; import cn.axzo.tyr.server.repository.dao.SaasRoleDao; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupDao; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; +import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; import cn.axzo.tyr.server.repository.entity.SaasFeature; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.entity.SaasPageElement; @@ -59,6 +62,7 @@ import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.service.ProductFeatureRelationService; import cn.axzo.tyr.server.service.ProductPermissionCacheService; import cn.axzo.tyr.server.service.ProductSaasFeatureResourceCacheService; @@ -68,6 +72,7 @@ import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasCommonDictService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.service.TyrSaasAuthService; @@ -103,6 +108,7 @@ import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @@ -184,6 +190,10 @@ public class PrivateController { private RoleSaasFeatureResourceCacheService roleSaasFeatureResourceCacheService; @Autowired private SendDingTalkHandler sendDingTalkHandler; + @Autowired + private SaasRoleGroupRelationService saasRoleGroupRelationService; + @Autowired + private SaasRoleUserRelationDao saasRoleUserRelationDao; /** * 统一层级的roleGroup按照id升序,sort从1递增 @@ -1398,6 +1408,148 @@ public class PrivateController { return "ok"; } + @PostMapping("/api/private/superAdmin/create") + public Object createSuperAdmin(@RequestBody List request) { + + Date now = new Date(); + request.forEach(e -> { + List list = saasRoleDao.lambdaQuery() + .eq(SaasRole::getRoleCode, e.getRoleCode()) + .list(); + if (CollectionUtils.isNotEmpty(list)) { + return; + } + + SaasRole superAdmin = new SaasRole(); + superAdmin.setDescription(RoleTypeEnum.SUPER_ADMIN.getDesc()); + superAdmin.setName(RoleTypeEnum.SUPER_ADMIN.getDesc()); + superAdmin.setRoleCode(e.getRoleCode()); + superAdmin.setWorkspaceId(-1L); + superAdmin.setWorkspaceType(e.getWorkspaceType()); + superAdmin.setOwnerOuId(-1L); + superAdmin.setRoleType(RoleTypeEnum.SUPER_ADMIN.getValue()); + superAdmin.setIsDelete(0L); + superAdmin.setCreateAt(now); + superAdmin.setUpdateAt(now); + superAdmin.setCreateBy(e.getCreateBy()); + superAdmin.setUpdateBy(e.getCreateBy()); + DictWorkSpaceTypeEnum dictWorkSpaceTypeEnum = DictWorkSpaceTypeEnum.getByValueWorkspaceType(e.getWorkspaceType()); + superAdmin.setProductUnitType(dictWorkSpaceTypeEnum == null ? 0 : dictWorkSpaceTypeEnum.getSuperAdminProductType()); + + saasRoleDao.save(superAdmin); + + if (e.getRoleGroupId() == null) { + + SaasRoleGroupVO saasRoleGroupVO = SaasRoleGroupVO.builder() + .workspaceTypeCode(e.getWorkspaceType().toString()) + .ouId(-1L) + .workspaceId(-1L) + .name("政务管理员") + .ouTypeCode(Lists.newArrayList(dictWorkSpaceTypeEnum == null ? "0" : dictWorkSpaceTypeEnum.getSuperAdminProductType().toString())) + .parentId(0L) + .code("zw_superadmin_group") + .build(); + Long roleGroupId = saasRoleGroupService.saveOrUpdate(saasRoleGroupVO); + + SaasRoleGroupRelation roleGroupRelation = new SaasRoleGroupRelation(); + roleGroupRelation.setRoleId(superAdmin.getId()); + roleGroupRelation.setSaasRoleGroupId(roleGroupId); + roleGroupRelation.setCreateAt(now); + roleGroupRelation.setUpdateAt(now); + saasRoleGroupRelationService.save(roleGroupRelation); + } else { + SaasRoleGroupRelation roleGroupRelation = new SaasRoleGroupRelation(); + roleGroupRelation.setRoleId(superAdmin.getId()); + roleGroupRelation.setSaasRoleGroupId(e.getRoleGroupId()); + roleGroupRelation.setCreateAt(now); + roleGroupRelation.setUpdateAt(now); + saasRoleGroupRelationService.save(roleGroupRelation); + } + }); + + return "ok"; + } + + @PostMapping("/api/private/userSuperAdminRole/refresh") + public Object refreshUserSuperAdminRole() { + ListRoleReq listRoleReq = ListRoleReq.builder() + .roleTypes(Lists.newArrayList(RoleTypeEnum.SUPER_ADMIN.getValue())) + .build(); + + List allSuperAdminRoles = roleService.list(listRoleReq); + + if (CollectionUtils.isEmpty(allSuperAdminRoles)) { + return "ok"; + } + + Map initSuperAdminRoles = allSuperAdminRoles.stream() + .filter(e -> e.getWorkspaceId() == -1L) + .collect(Collectors.toMap(SaasRoleRes::getWorkspaceType, Function.identity())); + if (initSuperAdminRoles.isEmpty()) { + return "ok"; + } + + List oldSuperAdminRoles = allSuperAdminRoles.stream() + .filter(e -> e.getWorkspaceId() != -1L) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(oldSuperAdminRoles)) { + return "ok"; + } + + Map oldSuperAdminRoleWorkspaceTypeMap = oldSuperAdminRoles.stream() + .collect(Collectors.toMap(SaasRoleRes::getId, SaasRoleRes::getWorkspaceType)); + + ListRoleUserRelationParam listRoleUserRelationParam = ListRoleUserRelationParam.builder() + .roleIds(oldSuperAdminRoles.stream() + .map(SaasRoleRes::getId) + .collect(Collectors.toList())) + .build(); + List saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + + List update = saasRoleUsers.stream() + .map(e -> { + SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); + saasRoleUserRelation.setId(e.getId()); + + Integer workspaceType = oldSuperAdminRoleWorkspaceTypeMap.get(e.getRoleId()); + if (Objects.isNull(workspaceType)) { + return null; + } + + SaasRoleRes superAdmin = initSuperAdminRoles.get(workspaceType); + if (Objects.isNull(superAdmin)) { + return null; + } + + saasRoleUserRelation.setRoleId(superAdmin.getId()); + return saasRoleUserRelation; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(update)) { + return "ok"; + } + saasRoleUserRelationDao.updateBatchById(update); + return "ok"; + } + + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class CreateSuperAdminParam { + private String roleCode; + + private Integer workspaceType; + + private Long createBy; + + private Long roleGroupId; + } + @Data @Builder @NoArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index 8d9994d4..f2023544 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -355,6 +355,11 @@ public class SaasRoleController implements TyrSaasRoleApi { .enabled(req.getEnabled()) .roleTypes(req.getRoleTypes()) .roleCodes(req.getRoleCodes()) + .productUnitTypes(Optional.ofNullable(req.getCooperateShipCooperateTypes()) + .map(e -> e.stream() + .map(SaasCooperateShipCooperateTypeEnum::getCode) + .collect(Collectors.toSet())) + .orElse(null)) .build()) .stream() .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); @@ -400,7 +405,6 @@ public class SaasRoleController implements TyrSaasRoleApi { .map(CommonDictResp::getDictCode) .map(Integer::valueOf) .collect(Collectors.toSet())) - .workspaceOuPairs(req.getWorkspaceOuPairs()) .workspaceIds(Optional.ofNullable(req.getWorkspaceIds()) .map(HashSet::new) .orElse(null)) @@ -416,12 +420,14 @@ public class SaasRoleController implements TyrSaasRoleApi { .orElse(null)) .build(); - List workspaceOuPairs = Optional.ofNullable(listSaasRoleGroupParam.getWorkspaceOuPairs()) + List workspaceOuPairs = Optional.ofNullable(req.getWorkspaceOuPairs()) .orElseGet(Lists::newArrayList); if (Boolean.TRUE.equals(req.getNeedPresetRole())) { workspaceOuPairs.add(WorkspaceOuPair.PRESET_WORKSPACE_OU_PAIR); } + listSaasRoleGroupParam.setWorkspaceOuPairs(workspaceOuPairs); + List roleGroups = saasRoleGroupService.list(listSaasRoleGroupParam) .stream() .sorted(Comparator.comparing(e -> Optional.ofNullable(e.getSort()).orElse(1))) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index ac897c62..483e1794 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -18,14 +18,14 @@ import cn.axzo.pokonyan.util.KeysUtil; import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.BaseWorkspaceModel; -import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.enums.WorkerLeaderRoleEnum; +import cn.axzo.tyr.client.model.req.ListRoleReq; +import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.roleuser.RoleUserUpdateReq; import cn.axzo.tyr.client.model.roleuser.dto.GetUserAutoOwnRoleResp; import cn.axzo.tyr.client.model.roleuser.dto.GetUserFeatureResourceIdsResp; import cn.axzo.tyr.client.model.roleuser.dto.IdentityInfo; -import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; import cn.axzo.tyr.client.model.roleuser.req.AutoOwnRoleUserReq; @@ -50,6 +50,7 @@ import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; +import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.service.SaasRoleUserService; @@ -104,6 +105,7 @@ public class RoleUserService implements SaasRoleUserService { private final OrgJobApi orgJobApi; private final WorkspaceConfigApi workspaceConfigApi; private final OrganizationalNodeUserQueryApi organizationalNodeUserQueryApi; + private final RoleService roleService; // 单位类型默认角色关系,后面可以座位管理员的逻辑进行迭代 @Value("#{${participateUnitDefaultRoleId:{}}}") @@ -279,22 +281,19 @@ public class RoleUserService implements SaasRoleUserService { @Transactional(rollbackFor = Exception.class) public void createSuperAdminRole(CreateSuperAdminRoleParam param) { //获取超管角色 - SaasRole superAdmin = findSuperAdmin(param.getWorkspaceId(), param.getOuId(), param.getWorkspaceType()); - if (superAdmin == null) { - superAdmin = new SaasRole(); - superAdmin.setDescription(RoleTypeEnum.SUPER_ADMIN.getDesc()); - superAdmin.setName(RoleTypeEnum.SUPER_ADMIN.getDesc()); - superAdmin.setWorkspaceId(param.getWorkspaceId()); - superAdmin.setWorkspaceType(param.getWorkspaceType()); - superAdmin.setOwnerOuId(param.getOuId()); - superAdmin.setRoleType(RoleTypeEnum.SUPER_ADMIN.getValue()); - superAdmin.setIsDelete(0L); - DictWorkSpaceTypeEnum dictWorkSpaceTypeEnum = DictWorkSpaceTypeEnum.getByValueWorkspaceType(param.getWorkspaceType()); - superAdmin.setProductUnitType(dictWorkSpaceTypeEnum == null ? 0 : dictWorkSpaceTypeEnum.getSuperAdminProductType()); + // 因为以前一个项目一个超管,但是上线为了保证兼容,所以这里要根据workspaceId = -1,ouId = -1, + // 不根据code查询,是因为增加一个业务的超管,就需要维护 + ListRoleReq listRoleReq = ListRoleReq.builder() + .roleTypes(Lists.newArrayList(RoleTypeEnum.SUPER_ADMIN.getValue())) + .workspaceType(param.getWorkspaceType()) + .needPresetRole(true) + .build(); + SaasRoleRes superAdmin = roleService.list(listRoleReq).stream() + .findFirst() + .orElse(null); + + AssertUtil.notNull(superAdmin, "超管角色不存在,请联系业务初始化超管角色"); - checkRoleName(RoleTypeEnum.SUPER_ADMIN.getDesc(), param.getWorkspaceId(), param.getOuId()); - saasRoleDao.save(superAdmin); - } //删除当前超管角色 removeOldSuperAdmin(superAdmin.getId(), param.getWorkspaceId(), param.getOuId()); @@ -341,25 +340,29 @@ public class RoleUserService implements SaasRoleUserService { @Override public List batchSuperAdminList(List param) { - LambdaQueryChainWrapper roleWrapper = saasRoleDao.lambdaQuery(); - roleWrapper.and(w -> - param.forEach(c -> w.or() - .eq(SaasRole::getOwnerOuId, c.getOuId()) - .eq(SaasRole::getWorkspaceId, c.getWorkspaceId()))); - roleWrapper.eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .eq(SaasRole::getRoleType, RoleTypeEnum.SUPER_ADMIN.getValue()); - List roleList = roleWrapper.list(); + // 兼容上线历史数据还没清洗的间隙,查询超管角色需要根据workspaceId和预设的超管一起 + ListRoleReq listRoleReq = ListRoleReq.builder() + .roleTypes(Lists.newArrayList(RoleTypeEnum.SUPER_ADMIN.getValue())) + .workspaceOuPairs(param.stream() + .map(e -> ListRoleUserRelationParam.WorkspaceOuPair.builder() + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .build()) + .collect(Collectors.toList())) + .needPresetRole(true) + .build(); + List roleList = roleService.list(listRoleReq); if (CollectionUtils.isEmpty(roleList)) { return Collections.emptyList(); } LambdaQueryChainWrapper userRoleWrapper = roleUserRelationDao.lambdaQuery(); userRoleWrapper.and(w -> - roleList.forEach(c -> w.or() - .eq(SaasRoleUserRelation::getOuId, c.getOwnerOuId()) + param.forEach(c -> w.or() + .eq(SaasRoleUserRelation::getOuId, c.getOuId()) .eq(SaasRoleUserRelation::getWorkspaceId, c.getWorkspaceId()) - .eq(SaasRoleUserRelation::getRoleId, c.getId()) )); + userRoleWrapper.in(SaasRoleUserRelation::getRoleId, roleList.stream().map(SaasRoleRes::getId).collect(Collectors.toList())); userRoleWrapper.eq(SaasRoleUserRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value); List relations = userRoleWrapper.list(); @@ -381,15 +384,24 @@ public class RoleUserService implements SaasRoleUserService { if (param.getWorkspaceId() == null || Objects.isNull(param.getOuId())) { return Collections.emptyList(); } - SaasRole saasRole = saasRoleDao.findRoleByTypeAndWorkspaceIdAndOuId(RoleTypeEnum.SUPER_ADMIN.getValue(), - param.getWorkspaceId(), param.getOuId()); - if (Objects.isNull(saasRole)) { + + // 兼容上线历史数据还没清洗的间隙,查询超管角色需要根据workspaceId和预设的超管一起 + ListRoleReq listRoleReq = ListRoleReq.builder() + .roleTypes(Lists.newArrayList(RoleTypeEnum.SUPER_ADMIN.getValue())) + .workspaceOuPairs(Lists.newArrayList(ListRoleUserRelationParam.WorkspaceOuPair.builder() + .workspaceId(param.getWorkspaceId()) + .ouId(param.getOuId()) + .build())) + .needPresetRole(true) + .build(); + List saasRoles = roleService.list(listRoleReq); + if (CollectionUtils.isEmpty(saasRoles)) { return Collections.emptyList(); } List relations = roleUserRelationDao.lambdaQuery() .eq(SaasRoleUserRelation::getWorkspaceId, param.getWorkspaceId()) .eq(SaasRoleUserRelation::getOuId, param.getOuId()) - .eq(SaasRoleUserRelation::getRoleId, saasRole.getId()) + .in(SaasRoleUserRelation::getRoleId, saasRoles.stream().map(SaasRoleRes::getId).collect(Collectors.toList())) .eq(SaasRoleUserRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); if (CollectionUtils.isEmpty(relations)) { return Collections.emptyList();