feat:(REQ-2720) 查询菜单树时,可以增量修补端的菜单

This commit is contained in:
lilong 2024-07-29 18:31:13 +08:00
parent 8d4f04359d
commit 4324169606
7 changed files with 148 additions and 21 deletions

View File

@ -70,6 +70,9 @@ public class PageSaasFeatureResourceReq implements IPageReq {
@CriteriaField(ignore = true)
private Set<String> paths;
@CriteriaField(field = "terminal", operator = Operator.IN)
private Set<String> terminals;
public PageResp toEmpty() {
return PageResp.builder()
.current(this.getPage())

View File

@ -46,6 +46,7 @@ import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import cn.axzo.tyr.server.service.ProductPermissionCacheService;
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.SaasRoleGroupService;
import cn.axzo.tyr.server.service.TyrSaasAuthService;
@ -139,6 +140,8 @@ public class PrivateController {
private CacheProductFeatureResourceJob cacheProductFeatureResourceJob;
@Autowired
private CacheRoleFeatureResourceJob cacheRoleFeatureResourceJob;
@Autowired
private SaasFeatureResourceService saasFeatureResourceService;
/**
* 统一层级的roleGroup按照id升序sort从1递增
@ -691,6 +694,11 @@ public class PrivateController {
return "ok";
}
@PostMapping("/api/private/saasFeature/list")
public Object listSaasFeature(@RequestBody SaasFeatureResourceService.ListSaasFeatureResourceCache request) throws Exception {
return saasFeatureResourceService.listCache(request);
}
@Data
@Builder
@NoArgsConstructor

View File

@ -8,7 +8,7 @@ import cn.axzo.tyr.server.event.payload.SaasFeatureUpsertPayload;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.service.SaasFeatureService;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
@ -45,17 +45,19 @@ public class CacheSaasFeatureHandler implements EventHandler, InitializingBean {
.eq(SaasFeature::getTerminal, payload.getTerminal())
.list()
.stream()
.map(e -> SaasFeatureResourceService.SaasFeatureResourceCache
.builder()
.map(e -> SaasFeatureResourceService.SaasFeatureResourceCache.builder()
.featureId(e.getId())
.notAuth(DelegatedType.notAuth(e.getDelegatedType()))
.build())
.collect(Collectors.toList());
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder()
.terminal(payload.getTerminal())
.features(saasFeatures)
.build();
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO))
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);

View File

@ -7,6 +7,7 @@ import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
@ -50,10 +51,13 @@ public class CacheSaasFeatureResourceHandler implements EventHandler, Initializi
.build())
.collect(Collectors.toList());
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder()
.terminal(payload.getTerminal())
.features(saasFeatures)
.build();
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO))
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
log.info("end cached saasFeatureResource handler rocketmq event: {}", event);

View File

@ -52,13 +52,17 @@ public class CacheSaasFeatureJob extends IJobHandler {
.notAuth(DelegatedType.notAuth(e.getDelegatedType()))
.build(), Collectors.toList())));
saasFeatures.entrySet().forEach(e -> {
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.terminal(e.getKey())
.features(e.getValue())
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
});
List<SaasFeatureResourceService.SaasFeatureResourceDTO> saasFeatureResources = saasFeatures.entrySet().stream()
.map(e -> SaasFeatureResourceService.SaasFeatureResourceDTO.builder()
.terminal(e.getKey())
.features(e.getValue())
.build())
.collect(Collectors.toList());
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.saasFeatureResources(saasFeatureResources)
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
}
private void cacheSaasFeatureResource(String terminal) {
@ -75,12 +79,16 @@ public class CacheSaasFeatureJob extends IJobHandler {
.notAuth(SaasFeatureResource.AuthType.isAllRole(e.getAuthType()))
.build(), Collectors.toList())));
saasFeatureResources.entrySet().forEach(e -> {
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.terminal(e.getKey())
.features(e.getValue())
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
});
List<SaasFeatureResourceService.SaasFeatureResourceDTO> featureResources = saasFeatureResources.entrySet().stream()
.map(e -> SaasFeatureResourceService.SaasFeatureResourceDTO.builder()
.terminal(e.getKey())
.features(e.getValue())
.build())
.collect(Collectors.toList());
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.saasFeatureResources(featureResources)
.build();
saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache);
}
}

View File

@ -74,6 +74,14 @@ public interface SaasFeatureResourceService extends IService<SaasFeatureResource
@AllArgsConstructor
class StoreSaasFeatureResourceCache {
private List<SaasFeatureResourceDTO> saasFeatureResources;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class SaasFeatureResourceDTO {
private String terminal;
private List<SaasFeatureResourceCache> features;

View File

@ -15,6 +15,7 @@ import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType;
import cn.axzo.tyr.client.common.enums.FeatureResourceStatus;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum;
import cn.axzo.tyr.client.model.enums.DelegatedType;
import cn.axzo.tyr.client.model.req.DeleteFeatureResourceReq;
import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq;
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
@ -33,7 +34,9 @@ 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;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
@ -106,6 +109,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
private final SaasPgroupPermissionRelationService saasPgroupPermissionRelationService;
private final SaasPageElementFeatureResourceRelationService saasPageElementFeatureResourceRelationService;
private final MqProducer mqProducer;
private final SaasFeatureDao saasFeatureDao;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@ -704,12 +708,38 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
@Override
public void storeCache(StoreSaasFeatureResourceCache param) {
RedisClient.StringOps.setEx(getKey(param.getTerminal()), JSONObject.toJSONString(param.getFeatures()),
expireInDays, TimeUnit.DAYS);
redisTemplate.executePipelined(new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
for (SaasFeatureResourceDTO saasFeatureResource : param.getSaasFeatureResources()) {
String redisKey = getKey(saasFeatureResource.getTerminal());
String redisValue = JSONObject.toJSONString(saasFeatureResource.getFeatures());
RedisClient.StringOps.setEx(redisKey, redisValue,
expireInDays, TimeUnit.DAYS);
log.info("succeed to store featureResource: redisKey:{} value:{}", redisKey, redisValue);
}
return null;
}
});
}
@Override
public Map<String, List<SaasFeatureResourceCache>> listCache(ListSaasFeatureResourceCache param) {
if (org.springframework.util.CollectionUtils.isEmpty(param.getTerminals())) {
return Collections.emptyMap();
}
Map<String, List<SaasFeatureResourceCache>> featureSourceCached = listFeatureSourceCached(param);
fillCacheFeatureSources(param, featureSourceCached);
return featureSourceCached;
}
private Map<String, List<SaasFeatureResourceCache>> listFeatureSourceCached(ListSaasFeatureResourceCache param) {
List<Object> redisValues = redisTemplate.executePipelined(new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
@ -737,6 +767,70 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
.collect(Collectors.toMap(Pair::getKey, Pair::getValue));
}
private void fillCacheFeatureSources(ListSaasFeatureResourceCache param,
Map<String, List<SaasFeatureResourceCache>> featureSourceCached) {
Sets.SetView<String> difference = Sets.difference(param.getTerminals(), featureSourceCached.keySet());
if (difference.isEmpty()) {
return;
}
List<SaasFeatureResourceDTO> saasFeatureResources = resolveSaasFeature(difference);
SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder()
.saasFeatureResources(saasFeatureResources)
.build();
storeCache(storeSaasFeatureResourceCache);
Map<String, List<SaasFeatureResourceCache>> featureSourceMap = saasFeatureResources.stream()
.collect(Collectors.toMap(SaasFeatureResourceDTO::getTerminal, SaasFeatureResourceDTO::getFeatures));
featureSourceCached.putAll(featureSourceMap);
}
private List<SaasFeatureResourceDTO> resolveSaasFeature(Set<String> terminals) {
Map<String, List<SaasFeatureResourceService.SaasFeatureResourceCache>> saasFeatures = saasFeatureDao.lambdaQuery()
.in(SaasFeature::getTerminal, terminals)
.list()
.stream()
.collect(Collectors.groupingBy(SaasFeature::getTerminal,
Collectors.mapping(e -> SaasFeatureResourceService.SaasFeatureResourceCache
.builder()
.featureId(e.getId())
.notAuth(DelegatedType.notAuth(e.getDelegatedType()))
.build(), Collectors.toList())));
List<SaasFeatureResourceDTO> allFeatureResources = Lists.newArrayList();
List<SaasFeatureResourceDTO> featureResources = saasFeatures.entrySet().stream()
.map(e -> SaasFeatureResourceDTO.builder()
.terminal(e.getKey())
.features(e.getValue())
.build())
.collect(Collectors.toList());
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.terminals(terminals)
.build();
List<SaasFeatureResourceDTO> saasFeatureResources = list(pageSaasFeatureResourceReq)
.stream()
.collect(Collectors.groupingBy(SaasFeatureResourceResp::getTerminal,
Collectors.mapping(e -> SaasFeatureResourceService.SaasFeatureResourceCache
.builder()
.featureId(e.getId())
.notAuth(SaasFeatureResource.AuthType.isAllRole(e.getAuthType()))
.build(), Collectors.toList())))
.entrySet().stream()
.map(e -> SaasFeatureResourceDTO.builder()
.terminal(e.getKey())
.features(e.getValue())
.build())
.collect(Collectors.toList());
allFeatureResources.addAll(featureResources);
allFeatureResources.addAll(saasFeatureResources);
return allFeatureResources;
}
private String getKey(Object... params) {
return String.format(SAAS_FEATURE_RESOURCE_KEY, params);
}