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 923c58e1..cee1f2b3 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 @@ -671,7 +671,7 @@ public class PrivateController { @PostMapping("/api/private/saasFeature/store") public Object storeSaasFeature(@RequestBody StoreFeatureParam request) throws Exception { - cacheSaasFeatureJob.execute(request.getTerminal()); + cacheSaasFeatureJob.execute(JSON.toJSONString(request)); return "ok"; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java index 8c41f346..b5651162 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureHandler.java @@ -5,6 +5,7 @@ import cn.axzo.framework.rocketmq.EventConsumer; import cn.axzo.framework.rocketmq.EventHandler; import cn.axzo.tyr.server.event.payload.SaasFeatureUpsertPayload; import cn.axzo.tyr.server.job.CacheSaasFeatureJob; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; @@ -31,7 +32,8 @@ public class CacheSaasFeatureHandler implements EventHandler, InitializingBean { if (StringUtils.isBlank(payload.getTerminal())) { return; } - cacheSaasFeatureJob.cacheSaasFeature(payload.getTerminal()); + + cacheSaasFeatureJob.cacheSaasFeature(Sets.newHashSet(payload.getTerminal())); log.info("end cached saasFeature handler rocketmq event: {}", event); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java index 87a197a0..9695a0e0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/inner/CacheSaasFeatureResourceHandler.java @@ -6,7 +6,7 @@ import cn.axzo.framework.rocketmq.EventHandler; import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload; import cn.axzo.tyr.server.job.CacheSaasFeatureJob; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -28,12 +28,11 @@ public class CacheSaasFeatureResourceHandler implements EventHandler, Initializi log.info("begin cached saasFeatureResource handler rocketmq event: {}", event); SaasFeatureResourceUpsertPayload payload = event.normalizedData(SaasFeatureResourceUpsertPayload.class); - if (StringUtils.isBlank(payload.getTerminal())) { + if (CollectionUtils.isEmpty(payload.getTerminals())) { return; } - // 直接查询缓存所有节点,因为修改的代码不好改 - cacheSaasFeatureJob.cacheSaasFeatureResource(payload.getTerminal()); + cacheSaasFeatureJob.cacheSaasFeatureResource(payload.getTerminals()); log.info("end cached saasFeatureResource handler rocketmq event: {}", event); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java index 5ed9a699..014675ec 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/outer/CacheSaasFeatureOldHandler.java @@ -2,22 +2,16 @@ package cn.axzo.tyr.server.event.outer; import cn.axzo.framework.rocketmq.Event; import cn.axzo.framework.rocketmq.EventConsumer; -import cn.axzo.tyr.client.model.enums.DelegatedType; import cn.axzo.tyr.server.event.payload.SaasFeatureDeletedPayload; 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 com.google.common.collect.Lists; +import cn.axzo.tyr.server.job.CacheSaasFeatureJob; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.List; -import java.util.stream.Collectors; - /** * 缓存全量权限点,因为鉴权等逻辑,需要查询免授权和权限点是否存在,数据量大,数据库压力大 */ @@ -28,9 +22,7 @@ public class CacheSaasFeatureOldHandler implements InitializingBean { @Autowired private EventConsumer eventConsumer; @Autowired - private SaasFeatureDao saasFeatureDao; - @Autowired - private SaasFeatureResourceService saasFeatureResourceService; + private CacheSaasFeatureJob cacheSaasFeatureJob; public void onSaasFeatureUpserted(Event event, EventConsumer.Context context) { log.info("begin cached saasFeature handler rocketmq event: {}", event); @@ -39,7 +31,8 @@ public class CacheSaasFeatureOldHandler implements InitializingBean { if (StringUtils.isBlank(payload.getTerminal())) { return; } - cacheFeature(payload.getTerminal()); + + cacheSaasFeatureJob.cacheSaasFeature(Sets.newHashSet(payload.getTerminal())); log.info("end cached saasFeature handler rocketmq event: {}", event); } @@ -51,32 +44,10 @@ public class CacheSaasFeatureOldHandler implements InitializingBean { return; } - cacheFeature(payload.getTerminal()); - + cacheSaasFeatureJob.cacheSaasFeature(Sets.newHashSet(payload.getTerminal())); log.info("end cached saasFeature handler rocketmq event: {}", event); } - private void cacheFeature(String terminal) { - List saasFeatures = saasFeatureDao.lambdaQuery() - .eq(SaasFeature::getTerminal, terminal) - .list() - .stream() - .map(e -> SaasFeatureResourceService.SaasFeatureResourceCache.builder() - .featureId(e.getId()) - .notAuth(DelegatedType.notAuth(e.getDelegatedType())) - .build()) - .collect(Collectors.toList()); - - SaasFeatureResourceService.SaasFeatureResourceDTO saasFeatureResourceDTO = SaasFeatureResourceService.SaasFeatureResourceDTO.builder() - .terminal(terminal) - .features(saasFeatures) - .build(); - SaasFeatureResourceService.StoreSaasFeatureResourceCache storeSaasFeatureResourceCache = SaasFeatureResourceService.StoreSaasFeatureResourceCache.builder() - .saasFeatureResources(Lists.newArrayList(saasFeatureResourceDTO)) - .build(); - saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); - } - @Override public void afterPropertiesSet() throws Exception { eventConsumer.registerHandler(EventTypeEnum.SAAS_FEATURE_UPSERT.getEventCode(), this::onSaasFeatureUpserted); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java b/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java index 648fb7d9..1cdcbafb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/event/payload/SaasFeatureResourceUpsertPayload.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; +import java.util.Set; @Data @Builder @@ -13,5 +14,5 @@ import java.io.Serializable; @AllArgsConstructor public class SaasFeatureResourceUpsertPayload implements Serializable { - private String terminal; + private Set terminals; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java b/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java index 9269a13a..6c48dc91 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/job/CacheSaasFeatureJob.java @@ -8,17 +8,23 @@ import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; import cn.axzo.tyr.server.repository.entity.SaasFeature; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import com.alibaba.fastjson.JSONObject; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @Slf4j @@ -40,16 +46,18 @@ public class CacheSaasFeatureJob extends IJobHandler { public ReturnT execute(String s) throws Exception { log.info("start CacheSaasFeatureJob, s:{}", s); + StoreSaasFeatureParam req = Optional.ofNullable(s) + .map(e -> JSONObject.parseObject(e, StoreSaasFeatureParam.class)) + .orElseGet(() -> StoreSaasFeatureParam.builder().build()); + cacheSaasFeature(req.getTerminals()); - cacheSaasFeature(s); - - cacheSaasFeatureResource(s); + cacheSaasFeatureResource(req.getTerminals()); return ReturnT.SUCCESS; } - public void cacheSaasFeature(String terminal) { + public void cacheSaasFeature(Set terminals) { Map> saasFeatures = saasFeatureDao.lambdaQuery() - .eq(StringUtils.isNotBlank(terminal), SaasFeature::getTerminal, terminal) + .in(CollectionUtils.isNotEmpty(terminals), SaasFeature::getTerminal, terminals) .list() .stream() .collect(Collectors.groupingBy(SaasFeature::getTerminal, @@ -73,10 +81,10 @@ public class CacheSaasFeatureJob extends IJobHandler { saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); } - public void cacheSaasFeatureResource(String terminal) { + public void cacheSaasFeatureResource(Set terminals) { PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder() - .terminal(terminal) .needPageElement(true) + .terminals(terminals) .build(); Map> saasFeatureResources = saasFeatureResourceService.list(pageSaasFeatureResourceReq) @@ -108,4 +116,12 @@ public class CacheSaasFeatureJob extends IJobHandler { .build(); saasFeatureResourceService.storeCache(storeSaasFeatureResourceCache); } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class StoreSaasFeatureParam { + private Set terminals; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java index f6341fc8..fcced913 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/FeatureResourceSyncServiceImpl.java @@ -5,12 +5,16 @@ import cn.axzo.basics.common.constant.enums.DeleteEnum; import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; +import cn.axzo.framework.rocketmq.Event; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum; import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.server.config.MqProducer; +import cn.axzo.tyr.server.event.payload.RolePermissionCreatedPayload; +import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload; import cn.axzo.tyr.server.inner.feign.BaseFeatureResourceApi; import cn.axzo.tyr.server.model.RelationOperateLogResourceBindRoleDO; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; @@ -37,12 +41,20 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.function.Function; import java.util.stream.Collectors; +import static cn.axzo.tyr.server.event.inner.EventTypeEnum.ROLE_PERMISSION_CREATED; +import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_FEATURE_RESOURCE_UPSERT; import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; /** @@ -78,6 +90,13 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic @Autowired private ExecutorService asyncExecutor; + @Autowired + private final MqProducer mqProducer; + + private static final String ROLE_PERMISSION_TARGET_TYPE = "saasFeatureResourceId"; + + private static final String SAAS_FEATURE_RESOURCE_TARGET_TYPE = "saasFeatureResourceId"; + @Override public List getSyncTreeById(Long id) { List allFeatureResourceIds = Lists.newArrayList(id); @@ -129,12 +148,16 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic //处理数据缓存:避免同级节点上级重复处理 - 上级code查询 final Map codeCache = new ConcurrentHashMap<>(); Set syncedRoleFeatureResourceIds = Sets.newConcurrentHashSet(); + Set terminals = Sets.newHashSet(); try { for (Long id : req.getIds()) { //获取基准环境配置数据:同步某个ID的数据 需要同步处理它所有上级及下级组件 List syncList = RpcInternalUtil.rpcProcessor(() -> baseFeatureResourceApi.getSyncTreeById(id), "get base sync tree by id", id).getData(); syncResourceProcess(syncList, codeCache, req.getOperatorId(), operateDos, syncedRoleFeatureResourceIds); + terminals.addAll(syncList.stream() + .map(FeatureResourceTreeNode::getTerminal) + .collect(Collectors.toSet())); } } catch (Exception e) { log.warn("do sync from base error", e); @@ -146,6 +169,15 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic } catch (Exception e) { log.warn("save operate log error", e); } + + Event event = Event.builder() + .targetType(SAAS_FEATURE_RESOURCE_TARGET_TYPE) + .eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode()) + .data(SaasFeatureResourceUpsertPayload.builder() + .terminals(terminals) + .build()) + .build(); + mqProducer.send(event); } @Override @@ -320,6 +352,17 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic logResourceBindRoleDO.setRoleCodes(saasRoles.stream().filter(e -> existRoleIds.contains(e.getId())).map(SaasRole::getRoleCode).collect(Collectors.toList())); } + + Event event = Event.builder() + .targetType(ROLE_PERMISSION_TARGET_TYPE) + .eventCode(ROLE_PERMISSION_CREATED.getEventCode()) + .data(RolePermissionCreatedPayload.builder() + .roleIds(saasRoles.stream() + .map(SaasRole::getId) + .collect(Collectors.toSet())) + .build()) + .build(); + mqProducer.send(event); return logResourceBindRoleDO; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index a60a3dd5..a8e97a67 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1407,7 +1407,7 @@ public class RoleServiceImpl extends ServiceImpl .targetType(TARGET_TYPE) .eventCode(SAAS_FEATURE_RESOURCE_UPSERT.getEventCode()) .data(SaasFeatureResourceUpsertPayload.builder() - .terminal(terminal) + .terminals(Sets.newHashSet(terminal)) .build()) .build(); mqProducer.send(event); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index cf961c9f..940cc68b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -306,7 +306,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl