feat:(feature/REQ-2750) 清洗超管角色,修改超管用户查询和创建接口

This commit is contained in:
lilong 2024-09-12 14:43:05 +08:00
parent dbf46f8d5b
commit 1c2c1a1c86
4 changed files with 205 additions and 34 deletions

View File

@ -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();

View File

@ -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<CreateSuperAdminParam> request) {
Date now = new Date();
request.forEach(e -> {
List<SaasRole> 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<SaasRoleRes> allSuperAdminRoles = roleService.list(listRoleReq);
if (CollectionUtils.isEmpty(allSuperAdminRoles)) {
return "ok";
}
Map<Integer, SaasRoleRes> initSuperAdminRoles = allSuperAdminRoles.stream()
.filter(e -> e.getWorkspaceId() == -1L)
.collect(Collectors.toMap(SaasRoleRes::getWorkspaceType, Function.identity()));
if (initSuperAdminRoles.isEmpty()) {
return "ok";
}
List<SaasRoleRes> oldSuperAdminRoles = allSuperAdminRoles.stream()
.filter(e -> e.getWorkspaceId() != -1L)
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(oldSuperAdminRoles)) {
return "ok";
}
Map<Long, Integer> 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<SaasRoleUserV2DTO> saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam);
List<SaasRoleUserRelation> 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

View File

@ -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<WorkspaceOuPair> workspaceOuPairs = Optional.ofNullable(listSaasRoleGroupParam.getWorkspaceOuPairs())
List<WorkspaceOuPair> 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<SaasRoleGroupDTO> roleGroups = saasRoleGroupService.list(listSaasRoleGroupParam)
.stream()
.sorted(Comparator.comparing(e -> Optional.ofNullable(e.getSort()).orElse(1)))

View File

@ -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<SuperAminInfoResp> batchSuperAdminList(List<SuperAdminParam> param) {
LambdaQueryChainWrapper<SaasRole> 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<SaasRole> 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<SaasRoleRes> roleList = roleService.list(listRoleReq);
if (CollectionUtils.isEmpty(roleList)) {
return Collections.emptyList();
}
LambdaQueryChainWrapper<SaasRoleUserRelation> 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<SaasRoleUserRelation> 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<SaasRoleRes> saasRoles = roleService.list(listRoleReq);
if (CollectionUtils.isEmpty(saasRoles)) {
return Collections.emptyList();
}
List<SaasRoleUserRelation> 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();