feat:(REQ-2720) 重构查询权限和根据权限查询人的逻辑

This commit is contained in:
lilong 2024-07-27 20:56:12 +08:00
parent e7c6dd2f92
commit 3ac9739644
18 changed files with 777 additions and 597 deletions

View File

@ -112,6 +112,9 @@ public class IdentityAuthReq {
/** 基于角色标签查询逻辑不再用该参数 **/
private Integer workspaceJoinType;
public String buildOuWorkspaceKey() {
return this.getOuId() + "_" + this.getWorkspaceId();
}
}
}

View File

@ -30,7 +30,7 @@ public class PageElementFeatureResourceRelationReq implements IPageReq {
List<String> sort;
@CriteriaField(field = "featureResourceUniCode", operator = Operator.IN)
private List<String> featureResourceUniCodes;
private Set<String> featureResourceUniCodes;
@CriteriaField(field = "pageElementCode", operator = Operator.IN)
private Set<String> pageElementCodes;

View File

@ -58,14 +58,9 @@ public class IdentityAuthRes {
private String featureCode;
// private FeatureType featureType;
private Integer featureType;
private String terminal;
/**
* 应用范围(租户类型)1:企业工作台 2;项目工作台
*/
private Long workspaceType;
}

View File

@ -52,6 +52,19 @@ public class SaasRoleUserV2DTO {
*/
private Long workspaceId;
/**
* 身份Id
*/
private Long identityId;
/**
* 身份类型 1:工人 2:从业人员 3:班组长 4:运营人员 5:政务人员
*/
private Integer identityType;
public String buildOuWorkspaceKey() {
return this.getOuId() + "_" + this.getWorkspaceId();
}
}
@Data

View File

@ -85,6 +85,7 @@ public class TyrSaasAuthController implements TyrSaasAuthApi {
@Override
public ApiResult<List<ListIdentityFromPermissionResp>> listWorkspacePermissionIdentity(WorkspacePermissionIdentityReq req) {
return ApiResult.ok(tyrSaasAuthService.listWorkspacePermissionIdentity(req));
}
@Override

View File

@ -8,6 +8,8 @@ public enum EventTypeEnum {
PRODUCT_PERMISSION_CREATED("product-permission", "product-permission-created", "产品权限添加"),
ROLE_PERMISSION_CREATED("role-permission", "role-permission-created", "角色权限添加"),
SAAS_FEATURE_UPSERT("saas-feature", "saas-feature-upsert", "旧菜单树更新"),
SAAS_FEATURE_RESOURCE_UPSERT("saas-feature-resource", "saas-feature-resource-upsert", "新菜单树更新"),
;
EventTypeEnum(String model, String name, String desc) {

View File

@ -0,0 +1,18 @@
package cn.axzo.tyr.server.event.payload;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Set;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SaasFeatureResourceUpsertPayload implements Serializable {
private Set<Long> ids;
}

View File

@ -0,0 +1,18 @@
package cn.axzo.tyr.server.event.payload;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Set;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SaasFeatureUpsetPayload implements Serializable {
private Set<Long> ids;
}

View File

@ -4,12 +4,35 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Set;
@Mapper
public interface SaasRoleUserRelationMapper extends BaseMapper<SaasRoleUserRelation> {
Page<SaasRoleUserRelation> batListCleanRelation(IPage<SaasRoleUserRelation> page, @Param("param") SaasRoleUserRelation cleanParam);
/**
* 现在没有数据可以查询项目的角色
* 通过权限点找有权限的人需要这个接口
* @param listRole
* @return
*/
Set<Long> listRoleIds(@Param("param") ListRole listRole);
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class ListRole {
private Long ouId;
private Long workspaceId;
}
}

View File

@ -183,6 +183,12 @@ public interface RoleService extends IService<SaasRole> {
*/
@CriteriaField(ignore = true)
private String terminal;
@CriteriaField(field = "workspaceId", operator = Operator.EQ)
private Long workspaceId;
@CriteriaField(field = "ownerOuId", operator = Operator.EQ)
private Long ouId;
}
@SuperBuilder

View File

@ -29,6 +29,26 @@ public interface WorkspaceProductService {
*/
void storeWorkspaceProduct(StoreWorkspaceProductParam param);
/**
* 从缓存中查询项目的产品及产品的权限
* @param param
* @return
*/
List<WorkspaceProductPermission> listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param);
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class ListWorkspaceProductPermissionCacheParam {
/**
* 项目id
*/
private Set<Long> workspaceIds;
private Set<String> featureCodes;
}
@Data
@Builder
@NoArgsConstructor
@ -74,6 +94,31 @@ public interface WorkspaceProductService {
private List<SaasProductModuleFeatureRelation> saasProductModuleFeatureRelations;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class WorkspaceProductPermission {
/**
* 项目id
*/
private Long workspaceId;
private List<ProductPermission> productPermissions;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class ProductPermission {
private Long productId;
private List<ProductPermissionCacheService.PermissionDTO> permissions;
}
@Data
@Builder
@NoArgsConstructor

View File

@ -19,9 +19,9 @@ import cn.axzo.tyr.client.model.base.FeatureResourceExtraDO;
import cn.axzo.tyr.client.model.base.WorkspaceOUPair;
import cn.axzo.tyr.client.model.enums.IdentityType;
import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO;
import cn.axzo.tyr.client.model.req.FeatureIdPair;
import cn.axzo.tyr.client.model.req.IdentityAuthReq;
import cn.axzo.tyr.client.model.req.NavTreeReq;
import cn.axzo.tyr.client.model.req.PageElementFeatureResourceRelationReq;
import cn.axzo.tyr.client.model.req.PagePermissionReq;
import cn.axzo.tyr.client.model.req.PagePermissionResp;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
@ -46,14 +46,15 @@ import cn.axzo.tyr.server.model.UserIdentity;
import cn.axzo.tyr.server.model.WorkspaceFeatureRelation;
import cn.axzo.tyr.server.repository.dao.ProductModuleDao;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
import cn.axzo.tyr.server.service.PermissionQueryService;
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import cn.axzo.tyr.server.service.RoleService;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.service.SaasPageElementFeatureResourceRelationService;
import cn.axzo.tyr.server.service.SaasRoleUserRelationService;
import cn.axzo.tyr.server.service.TyrSaasAuthService;
import cn.axzo.tyr.server.service.WorkspaceProductService;
@ -91,7 +92,6 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.tyr.server.repository.entity.SaasFeatureResource.DISPLAY_STATUS;
import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE;
/**
* 权限查询服务实现
@ -117,7 +117,7 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
private final SaasFeatureResourceService saasFeatureResourceService;
private final SaasRoleUserRelationService saasRoleUserRelationService;
private final WorkspaceProductService workspaceProductService;
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasPageElementFeatureResourceRelationService saasPageElementFeatureResourceRelationService;
@Qualifier("authExecutor")
@Autowired
@ -331,6 +331,8 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
Set<Long> defaultFeatureIds = listNotAuthFeatureIds();
allFeatureIds.addAll(featureIds);
allFeatureIds.addAll(defaultFeatureIds);
if (CollectionUtils.isEmpty(allFeatureIds)) {
return Collections.emptyList();
}
@ -653,26 +655,39 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
private Set<Long> listUserPermissionFeatureIds(TreePermissionReq treePermissionReq) {
List<Long> featureIds = resolveFeatureIds(treePermissionReq);
Set<String> featureCodes = resolveFeatureCodes(treePermissionReq);
if (StringUtils.isNotBlank(treePermissionReq.getUniCode()) && CollectionUtils.isEmpty(featureIds)) {
if (StringUtils.isNotBlank(treePermissionReq.getUniCode()) && CollectionUtils.isEmpty(featureCodes)) {
return Collections.emptySet();
}
List<SaasRoleUserV2DTO> saasRoleUserV2DTOS = listUserPermission(treePermissionReq, featureIds);
// 用户可能没有角色
if (CollectionUtils.isEmpty(saasRoleUserV2DTOS)) {
return Collections.emptySet();
}
IdentityAuthReq identityAuthReq = IdentityAuthReq.builder()
.personId(treePermissionReq.getPersonId())
.terminal(Lists.newArrayList(treePermissionReq.getTerminal()))
.workspaceOusPairs(treePermissionReq.getWorkspaceOUPairs().stream()
.map(e -> IdentityAuthReq.WorkspaceOuPair.builder()
.ouId(e.getOuId())
.workspaceId(e.getWorkspaceId())
.build())
.collect(Collectors.toList()))
.featureCode(featureCodes)
.build();
List<WorkspaceProductService.WorkspaceProduct> workspaceProducts = listWorkspaceProducts(treePermissionReq, featureIds);
Set<Integer> featureTypes = Optional.ofNullable(treePermissionReq.getFeatureResourceTypes())
.map(e -> e.stream()
.map(FeatureResourceType::getCode)
.collect(Collectors.toSet()))
.orElse(null);
//免授权
List<Long> authFreeFeatureIds = listNotAuthFeatures(treePermissionReq);
return saasAuthService.findIdentityAuthMix(identityAuthReq).getPermissions().stream()
.map(IdentityAuthRes.WorkspacePermission::getPermissionPoint)
.flatMap(Collection::stream)
.filter(e -> CollectionUtils.isEmpty(featureTypes)
|| featureTypes.contains(e.getFeatureType()))
.map(IdentityAuthRes.PermissionPoint::getFeatureId)
.collect(Collectors.toSet());
//取交集确定权限
return mixFeatureIds(saasRoleUserV2DTOS, workspaceProducts, authFreeFeatureIds);
}
private List<Long> listNotAuthFeatures(TreePermissionReq treePermissionReq) {
@ -685,30 +700,22 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
.collect(Collectors.toList());
}
private List<WorkspaceProductService.WorkspaceProduct> listWorkspaceProducts(TreePermissionReq treePermissionReq,
List<Long> featureIds) {
private List<WorkspaceProductService.WorkspaceProductPermission> listWorkspaceProducts(TreePermissionReq treePermissionReq,
Set<String> featureCodes) {
//查询租户产品权限点
Set<Long> workspaceIds = treePermissionReq.getWorkspaceOUPairs().stream()
.map(WorkspaceOUPair::getWorkspaceId)
.collect(Collectors.toSet());
WorkspaceProductService.WorkspaceProductParam workspaceProductParam = WorkspaceProductService.WorkspaceProductParam.builder()
.terminal(treePermissionReq.getTerminal())
WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam
.builder()
.workspaceIds(workspaceIds)
.featureResourceTypes(treePermissionReq.getFeatureResourceTypes())
.type(NEW_FEATURE)
.featureCodes(featureCodes)
.build();
if (CollectionUtils.isNotEmpty(featureIds)) {
workspaceProductParam.setFeatureIdPairs(Lists.newArrayList(FeatureIdPair.builder()
.featureIds(Sets.newHashSet(featureIds))
.type(NEW_FEATURE)
.build()));
}
return workspaceProductService.listWorkspaceProduct(workspaceProductParam);
return workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermissionCacheParam);
}
private List<SaasRoleUserV2DTO> listUserPermission(TreePermissionReq treePermissionReq, List<Long> featureIds) {
private List<SaasRoleUserV2DTO> listUserPermission(TreePermissionReq treePermissionReq, Set<String> featureCodes) {
List<ListRoleUserRelationParam.WorkspaceOuPair> workspaceOuPairs = treePermissionReq.getWorkspaceOUPairs().stream()
.map(e -> ListRoleUserRelationParam.WorkspaceOuPair.builder()
.workspaceId(e.getWorkspaceId())
@ -720,28 +727,25 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
.personId(treePermissionReq.getPersonId())
.workspaceOuPairs(Lists.newArrayList(workspaceOuPairs))
.needRole(true)
.needPermissionRelation(true)
.featureResourceTypes(treePermissionReq.getFeatureResourceTypes())
.type(NEW_FEATURE)
.terminal(treePermissionReq.getTerminal())
.featureIds(featureIds)
.build();
return saasRoleUserRelationService.listV2(listRoleUserRelationParam).stream()
.filter(e -> e.getSaasRole() != null)
.collect(Collectors.toList());
}
private List<Long> resolveFeatureIds(TreePermissionReq treePermissionReq) {
private Set<String> resolveFeatureCodes(TreePermissionReq treePermissionReq) {
if (StringUtils.isBlank(treePermissionReq.getUniCode())) {
return Collections.emptyList();
return Collections.emptySet();
}
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.uniCodes(Sets.newHashSet(treePermissionReq.getUniCode()))
PageElementFeatureResourceRelationReq pageElementFeatureResourceRelationReq = PageElementFeatureResourceRelationReq.builder()
.featureResourceUniCodes(Sets.newHashSet(treePermissionReq.getUniCode()))
.build();
return featureResourceService.list(pageSaasFeatureResourceReq).stream()
.map(SaasFeatureResourceResp::getId)
.collect(Collectors.toList());
return saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq)
.stream()
.map(SaasPageElementFeatureResourceRelation::getPageElementCode)
.collect(Collectors.toSet());
}
private Set<Long> mixFeatureIds(List<SaasRoleUserV2DTO> saasRoleUsers,

View File

@ -1131,7 +1131,7 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
PageSaasRoleParam pageParam = PageSaasRoleParam.builder().build();
BeanUtils.copyProperties(param, pageParam);
pageParam.setPage(pageNumber);
pageParam.setPageSize(500);
pageParam.setPageSize(10000);
return page(pageParam);
});
}

View File

@ -8,6 +8,7 @@ import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
import cn.axzo.foundation.exception.Axssert;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.framework.domain.web.code.BaseCode;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType;
import cn.axzo.tyr.client.common.enums.FeatureResourceStatus;
@ -26,6 +27,8 @@ import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp;
import cn.axzo.tyr.server.common.util.Throws;
import cn.axzo.tyr.server.config.MqProducer;
import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.model.ResourcePermission;
import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO;
import cn.axzo.tyr.server.model.convert.SaasFeatureResourceConvert;
@ -46,6 +49,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@ -64,6 +68,7 @@ import java.util.Set;
import java.util.stream.Collectors;
import static cn.axzo.tyr.server.config.exception.BizResultCode.FEATURE_RESOURCE_NOT_FOUND;
import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_FEATURE_RESOURCE_UPSERT;
import static cn.axzo.tyr.server.repository.entity.SaasFeatureResource.DEFAULT_WORKSPACE_TYPE;
import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE;
@ -88,7 +93,9 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
private final SaasPageElementService saasPageElementService;
private final SaasPgroupPermissionRelationService saasPgroupPermissionRelationService;
private final SaasPageElementFeatureResourceRelationService saasPageElementFeatureResourceRelationService;
private final MqProducer mqProducer;
private static final String TARGET_TYPE = "saasFeatureResourceId";
@Override
public List<SaasFeatureResource> listNavByIds(List<Long> featureIds, List<Integer> featureTypes) {
//按需扩展要查询的字段
@ -252,6 +259,18 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
}
deleteComponentRecursionById(baseResource.getId(), req.getComponentSaveReqList(), req.getOperatorId());
// 改不动了消费MQ时查询子节点信息做逻辑处理反正mq里面不能带太多的消息内容
Set<Long> mqUpsertIds = Sets.newHashSet();
mqUpsertIds.add(baseResource.getId());
Event event = Event.builder()
.targetType(TARGET_TYPE)
.eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode())
.data(SaasFeatureResourceUpsertPayload.builder()
.ids(mqUpsertIds)
.build())
.build();
mqProducer.send(event);
return baseResource.getId();
}
@ -552,7 +571,9 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
return Collections.emptyMap();
}
List<String> uniCodes = Lists.transform(saasFeatureResources, SaasFeatureResource::getUniCode);
Set<String> uniCodes = saasFeatureResources.stream()
.map(SaasFeatureResource::getUniCode)
.collect(Collectors.toSet());
PageElementFeatureResourceRelationReq pageElementFeatureResourceRelationReq = PageElementFeatureResourceRelationReq.builder()
.featureResourceUniCodes(uniCodes)
.build();

View File

@ -25,7 +25,7 @@ public class SaasPageElementFeatureResourceRelationServiceImpl extends ServiceIm
public List<SaasPageElementFeatureResourceRelation> list(PageElementFeatureResourceRelationReq param) {
return PageConverter.drainAll(pageNumber -> {
param.setPage(pageNumber);
param.setPageSize(500);
param.setPageSize(1000);
return page(param);
});
}

View File

@ -10,12 +10,12 @@ import cn.axzo.tyr.server.repository.dao.ProductModuleDao;
import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery;
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import cn.axzo.tyr.server.service.ProductPermissionCacheService;
import cn.axzo.tyr.server.service.WorkspaceProductService;
import cn.axzo.tyr.server.utils.RpcInternalUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Pair;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.collect.Streams;
@ -53,7 +53,10 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
@Autowired
private ProductFeatureRelationService productFeatureRelationService;
@Autowired
protected StringRedisTemplate redisTemplate;
private StringRedisTemplate redisTemplate;
@Autowired
private ProductPermissionCacheService productPermissionCacheService;
/** 授权缓存过期时间 **/
@Value("${workspace.product.expire:90}")
@ -136,13 +139,7 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
return Collections.emptyList();
}
ListWorkspaceProductParam listWorkspaceProductParam = ListWorkspaceProductParam.builder()
.workspaceIds(param.getWorkspaceIds())
.build();
Map<Long, Set<Long>> workspaceProducts = listWorkspaceProduct(listWorkspaceProductParam);
// 存在项目没有在缓存中查询到产品的情况
fillCacheWorkspaseProducts(param, workspaceProducts);
Map<Long, Set<Long>> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds());
Set<Long> productIds = workspaceProducts.values().stream()
.flatMap(Collection::stream)
@ -152,19 +149,8 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
return Collections.emptyList();
}
// 已被删除产品过滤一层
Set<Long> finalProductIds = productModuleDao.listByIds(productIds)
.stream()
.filter(productModule -> Objects.equals(productModule.getIsDelete(),0L))
.map(BaseEntity::getId)
.collect(Collectors.toSet());
if (CollectionUtil.isEmpty(finalProductIds)) {
log.warn("all product is deleted for workspace :{}", param.getWorkspaceIds());
return Collections.emptyList();
}
ProductFeatureQuery productFeatureQuery = ProductFeatureQuery.builder()
.productIds(finalProductIds)
.productIds(productIds)
.featureResourceTypes(param.getFeatureResourceTypes())
.terminal(param.getTerminal())
.type(param.getType())
@ -238,13 +224,13 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
/**
* 组装在缓存中没有查询到产品的项目
* @param param
* @param workspaceIds
* @param workspaceProducts
*/
private void fillCacheWorkspaseProducts(WorkspaceProductParam param,
private void fillCacheWorkspaceProducts(Set<Long> workspaceIds,
Map<Long, Set<Long>> workspaceProducts) {
Sets.SetView<Long> difference = Sets.difference(param.getWorkspaceIds(), workspaceProducts.keySet());
Sets.SetView<Long> difference = Sets.difference(workspaceIds, workspaceProducts.keySet());
if (difference.isEmpty()) {
return;
}
@ -287,4 +273,82 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
private String getKey(Object... params) {
return String.format(WORKSPACE_PRODUCT_KEY, params);
}
@Override
public List<WorkspaceProductPermission> listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param) {
Map<Long, Set<Long>> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds());
Set<Long> productIds = workspaceProducts.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());
if (CollectionUtils.isEmpty(productIds)) {
return Collections.emptyList();
}
ProductPermissionCacheService.ListProductPermissionParam listProductPermissionParam = ProductPermissionCacheService.ListProductPermissionParam.builder()
.productIds(productIds)
.featureCodes(param.getFeatureCodes())
.build();
Map<Long, List<ProductPermissionCacheService.PermissionDTO>> productPermissionMap = productPermissionCacheService.list(listProductPermissionParam);
return workspaceProducts.entrySet().stream()
.filter(e -> CollectionUtils.isNotEmpty(e.getValue()))
.map(e -> {
List<ProductPermission> productPermissions = e.getValue().stream()
.map(productId -> {
List<ProductPermissionCacheService.PermissionDTO> permissions = productPermissionMap.get(productId);
if (CollectionUtils.isEmpty(permissions)) {
return null;
}
return ProductPermission.builder()
.productId(productId)
.permissions(permissions)
.build();
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
return WorkspaceProductPermission.builder()
.workspaceId(e.getKey())
.productPermissions(productPermissions)
.build();
})
.collect(Collectors.toList());
}
private Map<Long, Set<Long>> listWorkspaceProduct(Set<Long> workspaceIds) {
if (CollectionUtils.isEmpty(workspaceIds)) {
return Collections.emptyMap();
}
ListWorkspaceProductParam listWorkspaceProductParam = ListWorkspaceProductParam.builder()
.workspaceIds(workspaceIds)
.build();
Map<Long, Set<Long>> workspaceProducts = listWorkspaceProduct(listWorkspaceProductParam);
// 存在项目没有在缓存中查询到产品的情况
fillCacheWorkspaceProducts(workspaceIds, workspaceProducts);
Set<Long> productIds = workspaceProducts.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());
if (CollectionUtils.isEmpty(productIds)) {
return Collections.emptyMap();
}
// 需要过滤掉已经被删除的产品
Set<Long> finalProductIds = productModuleDao.listByIds(productIds).stream()
.filter(productModule -> Objects.equals(productModule.getIsDelete(),0L))
.map(BaseEntity::getId)
.collect(Collectors.toSet());
workspaceProducts.entrySet().forEach(e -> {
Set<Long> effectProductIds = e.getValue().stream()
.filter(finalProductIds::contains)
.collect(Collectors.toSet());
e.setValue(effectProductIds);
});
return workspaceProducts;
}
}

View File

@ -19,4 +19,16 @@
AND natural_person_id = #{param.naturalPersonId}
</if>
</select>
<select id="listRoleIds" resultType="java.lang.Long">
SELECT DISTINCT role_id
FROM saas_role_user_relation
WHERE is_delete = 0
<if test="param.ouId !=0 and param.ouId != null">
AND ou_id = #{param.ouId}
</if>
<if test="param.workspaceId !=0 and param.workspaceId != null">
AND workspace_id = #{param.workspaceId}
</if>
</select>
</mapper>