feat:(REQ-2720) 查询菜单树时,可以增量修补端的菜单
This commit is contained in:
parent
8d4f04359d
commit
4324169606
@ -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())
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user