diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementCategoryV2Req.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementCategoryV2Req.java new file mode 100644 index 00000000..90ddd8af --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementCategoryV2Req.java @@ -0,0 +1,34 @@ +package cn.axzo.tyr.client.model.req; + +import cn.axzo.foundation.dao.support.wrapper.CriteriaField; +import cn.axzo.foundation.dao.support.wrapper.Operator; +import cn.axzo.foundation.page.IPageReq; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageElementCategoryV2Req implements IPageReq { + + @CriteriaField(ignore = true) + Integer page; + + @CriteriaField(ignore = true) + Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + List sort; + + @CriteriaField(field = "itemCode", operator = Operator.IN) + private Set itemCodes; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementFeatureResourceRelationReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementFeatureResourceRelationReq.java index 64270bed..65f40288 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementFeatureResourceRelationReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementFeatureResourceRelationReq.java @@ -41,4 +41,16 @@ public class PageElementFeatureResourceRelationReq implements IPageReq { @CriteriaField(ignore = true) private Set types; + + @CriteriaField(ignore = true) + private Boolean needPageElement; + + @CriteriaField(ignore = true) + private Boolean needFeatureResource; + + /** + * 需要跟needPageElement一起使用 + */ + @CriteriaField(ignore = true) + private Boolean needPageElementCategory; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementReq.java index b2030f2b..4558f09c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageElementReq.java @@ -50,4 +50,10 @@ public class PageElementReq implements IPageReq { @CriteriaField(ignore = true) private Boolean needPageElementCategory; + + /** + * 现在只有组件的父节点是页面 + */ + @CriteriaField(ignore = true) + private Boolean needAncestor; } \ No newline at end of file diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java index 9660f481..680a86c1 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasFeatureResourceReq.java @@ -92,6 +92,18 @@ public class PageSaasFeatureResourceReq implements IPageReq { @CriteriaField(ignore = true) private Set pageElementTypes; + /** + * 是否需要所有子节点 + */ + @CriteriaField(ignore = true) + private Boolean needChildren; + + /** + * 是否需要所有父节点 + */ + @CriteriaField(ignore = true) + private Boolean needAncestor; + public PageResp toEmpty() { return PageResp.builder() .current(this.getPage()) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/PageElementFeatureResourceRelationResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/PageElementFeatureResourceRelationResp.java new file mode 100644 index 00000000..f94c409b --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/PageElementFeatureResourceRelationResp.java @@ -0,0 +1,54 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageElementFeatureResourceRelationResp { + + private Long id; + + private Date createAt; + + private Date updateAt; + + private Long isDelete; + + private Integer type; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 更新人 + */ + private Long updateBy; + + /** + * 页面元素code + */ + private String pageElementCode; + + /** + * 菜单组件code + */ + private String featureResourceUniCode; + + /** + * 所属端 + */ + private String terminal; + + private PageElementResp pageElement; + + private SaasFeatureResourceResp saasFeatureResource; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/PageElementResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/PageElementResp.java index deea0f43..08805122 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/PageElementResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/PageElementResp.java @@ -132,6 +132,8 @@ public class PageElementResp { */ private PageElementCategoryResp pageElementCategory; + private PageElementResp ancestor; + @Data @Builder @NoArgsConstructor diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasFeatureResourceResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasFeatureResourceResp.java index 2e50a545..abdc3f8e 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasFeatureResourceResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasFeatureResourceResp.java @@ -155,6 +155,16 @@ public class SaasFeatureResourceResp { */ private List saasPageElements; + /** + * 所有父节点 + */ + private List ancestors; + + /** + * 所有子节点 + */ + private List children; + public Set resolvePath() { return Optional.ofNullable(this.getPath()) .map(e -> Arrays.stream(e.split(",")).map(Long::valueOf).collect(Collectors.toSet())) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java index 1034f957..4a13b759 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/inner/feign/BaseFeatureResourceApi.java @@ -20,7 +20,7 @@ import java.util.List; * @author: ZhanSiHu * @date: 2024/4/3 10:25 */ -@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:https://pre-api.axzo.cn/tyr}") +@FeignClient(name = "tyr", url = "${axzo.service.base.tyr:https://test-api.axzo.cn/tyr}") public interface BaseFeatureResourceApi { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index 74ccaf0a..cc0736c8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -37,30 +37,40 @@ public interface SaasFeatureResourceService extends IService batchListDescendant(List featureIds); + @Deprecated SaasFeatureResource featureResourceById(Long featureId); + @Deprecated FeatureResourceTreeNode getTreeFeatureDescendant(DetailFeatureResourceReq param); /**菜单重排序**/ void reorderMenuFeature(Long featureId, Integer offset); + @Deprecated /** 根据ID查询导航菜单页面信息 仅可显示 - 限制查询字段 **/ List listNavByIds(List featureIds, List featureTypes); /** 资源权限通用查询 **/ + @Deprecated List permissionQuery(ResourcePermissionQueryDTO param); /** 查询资源树 **/ + @Deprecated List getTree(GetFeatureResourceTreeReq req); + @Deprecated SaasFeatureResource getByCode(String featureCode); + @Deprecated Set listAuthFree(); + @Deprecated List listByParentIdAndTerminalAndIds(Long parentId, String terminal, List featureIds); + @Deprecated List listByParentIdAndBlurTerminalAndIds(Long parentId, String terminal, List featureIds); List list(PageSaasFeatureResourceReq param); @@ -73,6 +83,7 @@ public interface SaasFeatureResourceService extends IService listAllFeatureByTerminal(String terminal); void clone(CloneTerminalReq req); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementCategoryService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementCategoryService.java index be1a6097..fc80ca5a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementCategoryService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementCategoryService.java @@ -4,9 +4,13 @@ import cn.axzo.foundation.page.PageResp; import cn.axzo.tyr.client.model.req.BatchUpsertPageElementCategoryReq; import cn.axzo.tyr.client.model.req.DeletePageElementCategoryReq; import cn.axzo.tyr.client.model.req.PageElementCategoryReq; +import cn.axzo.tyr.client.model.req.PageElementCategoryV2Req; import cn.axzo.tyr.client.model.req.PageElementReq; +import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq; import cn.axzo.tyr.client.model.req.SaveOrUpdatePageElementCategoryReq; import cn.axzo.tyr.client.model.res.ListPageElementCategoryResp; +import cn.axzo.tyr.client.model.res.PageElementCategoryResp; +import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; import cn.axzo.tyr.server.repository.entity.SaasPageElementCategory; import com.baomidou.mybatisplus.extension.service.IService; @@ -19,6 +23,7 @@ import java.util.List; */ public interface SaasPageElementCategoryService extends IService { + @Deprecated List listGroupByTerminal(PageElementCategoryReq req); Long saveOrUpdate(SaveOrUpdatePageElementCategoryReq req); @@ -26,4 +31,8 @@ public interface SaasPageElementCategoryService extends IService list(PageElementCategoryV2Req param); + + PageResp page(PageElementCategoryV2Req param); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementFeatureResourceRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementFeatureResourceRelationService.java index 51a9e2f9..904a5688 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementFeatureResourceRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPageElementFeatureResourceRelationService.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.server.service; import cn.axzo.foundation.page.PageResp; import cn.axzo.tyr.client.model.req.PageElementFeatureResourceRelationReq; +import cn.axzo.tyr.client.model.res.PageElementFeatureResourceRelationResp; import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation; import com.baomidou.mybatisplus.extension.service.IService; @@ -9,7 +10,7 @@ import java.util.List; public interface SaasPageElementFeatureResourceRelationService extends IService { - List list(PageElementFeatureResourceRelationReq param); + List list(PageElementFeatureResourceRelationReq param); - PageResp page(PageElementFeatureResourceRelationReq param); + PageResp page(PageElementFeatureResourceRelationReq param); } 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 39951186..74d60f50 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 @@ -11,8 +11,10 @@ import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum; import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; +import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq; import cn.axzo.tyr.client.model.req.ResourceSyncReq; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; +import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; import cn.axzo.tyr.server.config.MqProducer; import cn.axzo.tyr.server.event.payload.RolePermissionCreatedPayload; import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload; @@ -30,6 +32,7 @@ import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateL import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.service.FeatureResourceSyncService; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService; import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.azxo.framework.common.constatns.Constants; @@ -95,6 +98,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService; private final UserProfileServiceApi userProfileServiceApi; + private final SaasFeatureResourceService saasFeatureResourceService; @Qualifier("asyncExecutor") @Autowired @@ -456,37 +460,26 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic return Collections.emptyMap(); } + Map roleMap = roles.stream() + .filter(e -> StringUtils.isNotBlank(e.getRoleCode())) + .collect(Collectors.toMap(SaasRole::getId, Function.identity())); - Map> groupIdToRoleIdsMap = roleRelations.stream() + Map> groupRoleMap = roleRelations.stream() .collect(Collectors.groupingBy(SaasPgroupRoleRelation::getGroupId, - Collectors.mapping(SaasPgroupRoleRelation::getRoleId, Collectors.toList()))); - - Map roleIdToRoleCodeMap = Maps.newHashMap(); - for (SaasRole role : roles) { - if (StringUtils.isNotBlank(role.getRoleCode())) { - roleIdToRoleCodeMap.put(role.getId(), role.getRoleCode()); - } - } + Collectors.mapping(e -> roleMap.get(e.getRoleId()), Collectors.toList()))); return permissionRelations.stream() .map(e -> { - List roleIds = groupIdToRoleIdsMap.get(e.getGroupId()); - if (CollectionUtils.isEmpty(roleIds)) { + List saasRoles = groupRoleMap.get(e.getGroupId()); + if (CollectionUtils.isEmpty(saasRoles)) { return null; } - return roleIds.stream() - .map(roleId -> { - String roleCode = roleIdToRoleCodeMap.get(roleId); - if (StringUtils.isBlank(roleCode)) { - return null; - } - return PermissionGroupRoleWrapper.builder() + return saasRoles.stream() + .map(role -> PermissionGroupRoleWrapper.builder() .featureId(e.getFeatureId()) - .roleCode(roleCode) + .roleCode(role.getRoleCode()) .tags(e.getTags()) - .build(); - - }) + .build()) .filter(Objects::nonNull) .collect(Collectors.toList()); }) 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 221c5b5d..d254ff6e 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 @@ -26,12 +26,12 @@ import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq; import cn.axzo.tyr.client.model.req.ListRoleReq; import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO; import cn.axzo.tyr.client.model.req.PageElementFeatureResourceRelationReq; -import cn.axzo.tyr.client.model.req.PageElementReq; import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq; import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.client.model.res.PageElementBasicDTO; +import cn.axzo.tyr.client.model.res.PageElementFeatureResourceRelationResp; import cn.axzo.tyr.client.model.res.PageElementResp; import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; import cn.axzo.tyr.client.model.res.SaasRoleRes; @@ -45,7 +45,6 @@ import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao; 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; import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; import cn.axzo.tyr.server.repository.mapper.SaasFeatureResourceMapper; @@ -403,19 +402,11 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl pageElementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq); - - if (CollectionUtils.isEmpty(pageElementFeatureResourceRelations)) { - return; - } - - PageElementReq pageElementReq = PageElementReq.builder() - .codes(pageElementFeatureResourceRelations.stream() - .map(SaasPageElementFeatureResourceRelation::getPageElementCode) - .collect(Collectors.toSet())) - .build(); - Optional pageElementOptional = saasPageElementService.list(pageElementReq).stream() + Optional pageElementOptional = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq) + .stream() + .map(PageElementFeatureResourceRelationResp::getPageElement) .findFirst(); if (!pageElementOptional.isPresent()) { @@ -821,20 +812,84 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl> pageElements = listPageElements(param, page.getRecords()); + Map> children = listChildren(param, page.getRecords()); + + Map> ancestors = listAncestor(param, page.getRecords()); + return PageConverter.toResp(page, e -> from(e, uniCodeFeatureCodeMap, - pageElements)); + pageElements, + ancestors, + children)); + } + + private Map> listAncestor(PageSaasFeatureResourceReq param, + List saasFeatureResources) { + if (CollectionUtils.isEmpty(saasFeatureResources) || BooleanUtils.isNotTrue(param.getNeedAncestor())) { + return Collections.emptyMap(); + } + + List parentIds = saasFeatureResources.stream() + .map(SaasFeatureResource::splitPath) + .flatMap(Collection::stream) + .distinct() + .collect(Collectors.toList()); + + Map parents = this.list(PageSaasFeatureResourceReq.builder() + .ids(parentIds) + .build()) + .stream() + .collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity())); + + return saasFeatureResources.stream() + .collect(Collectors.toMap(SaasFeatureResource::getId, + e -> e.splitPath().stream() + .filter(parentId -> !Objects.equals(parentId, e.getId())) + .map(parents::get) + .collect(Collectors.toList()))); + } + + private Map> listChildren(PageSaasFeatureResourceReq param, + List saasFeatureResources) { + + if (CollectionUtils.isEmpty(saasFeatureResources) || BooleanUtils.isNotTrue(param.getNeedChildren())) { + return Collections.emptyMap(); + } + + Set paths = saasFeatureResources.stream() + .map(SaasFeatureResource::getPath) + .collect(Collectors.toSet()); + + List children = this.list(PageSaasFeatureResourceReq.builder() + .paths(paths) + .build()); + if (CollectionUtils.isEmpty(children)) { + return Collections.emptyMap(); + } + + return saasFeatureResources.stream() + .collect(Collectors.toMap(SaasFeatureResource::getId, + e -> children.stream() + .filter(c -> c.getPath().startsWith(e.getPath()) && !Objects.equals(e.getPath(), c.getPath())) + .collect(Collectors.toList()))); } private SaasFeatureResourceResp from(SaasFeatureResource featureResource, Map> uniCodeFeatureCodeMap, - Map> pageElements) { + Map> pageElements, + Map> children, + Map> ancestors) { SaasFeatureResourceResp saasFeatureResourceResp = SaasFeatureResourceResp.builder().build(); BeanUtils.copyProperties(featureResource, saasFeatureResourceResp); saasFeatureResourceResp.setFeatureCodes(uniCodeFeatureCodeMap.get(featureResource.getUniCode())); saasFeatureResourceResp.setSaasPageElements(pageElements.get(saasFeatureResourceResp.getUniCode())); + + saasFeatureResourceResp.setChildren(children.get(saasFeatureResourceResp.getId())); + + saasFeatureResourceResp.setAncestors(ancestors.get(saasFeatureResourceResp.getId())); + return saasFeatureResourceResp; } @@ -853,12 +908,12 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl> listPageElements(PageSaasFeatureResourceReq param, - List saasFeatureResources) { + List saasFeatureResources) { if (CollectionUtils.isEmpty(saasFeatureResources) || BooleanUtils.isNotTrue(param.getNeedPageElement())) { return Collections.emptyMap(); @@ -872,26 +927,12 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl pageElementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq); - - if (CollectionUtils.isEmpty(pageElementFeatureResourceRelations)) { - return Collections.emptyMap(); - } - - Set elementCodes = pageElementFeatureResourceRelations.stream() - .map(SaasPageElementFeatureResourceRelation::getPageElementCode) - .collect(Collectors.toSet()); - - PageElementReq pageElementReq = PageElementReq.builder() - .codes(elementCodes) - .build(); - Map elementMap = saasPageElementService.list(pageElementReq).stream() - .collect(Collectors.toMap(PageElementResp::getCode, Function.identity())); + List pageElementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq); return pageElementFeatureResourceRelations.stream() - .filter(e -> elementMap.get(e.getPageElementCode()) != null) - .collect(Collectors.groupingBy(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode, - Collectors.mapping(e -> elementMap.get(e.getPageElementCode()), Collectors.toList()))); + .filter(e -> e.getPageElement() != null) + .collect(Collectors.groupingBy(PageElementFeatureResourceRelationResp::getFeatureResourceUniCode, + Collectors.mapping(PageElementFeatureResourceRelationResp::getPageElement, Collectors.toList()))); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementCategoryServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementCategoryServiceImpl.java index 06b5b334..b08a47e3 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementCategoryServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementCategoryServiceImpl.java @@ -2,7 +2,10 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.basics.common.constant.enums.DeleteEnum; import cn.axzo.basics.common.util.AssertUtil; +import cn.axzo.foundation.dao.support.converter.PageConverter; +import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; import cn.axzo.foundation.exception.Axssert; +import cn.axzo.foundation.page.PageResp; import cn.axzo.framework.rocketmq.Event; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.PageElementTypeEnum; @@ -10,10 +13,12 @@ import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum; import cn.axzo.tyr.client.model.req.BatchUpsertPageElementCategoryReq; import cn.axzo.tyr.client.model.req.DeletePageElementCategoryReq; import cn.axzo.tyr.client.model.req.PageElementCategoryReq; +import cn.axzo.tyr.client.model.req.PageElementCategoryV2Req; import cn.axzo.tyr.client.model.req.PageElementReq; import cn.axzo.tyr.client.model.req.PermissionOperateLogReq; import cn.axzo.tyr.client.model.req.SaveOrUpdatePageElementCategoryReq; import cn.axzo.tyr.client.model.res.ListPageElementCategoryResp; +import cn.axzo.tyr.client.model.res.PageElementCategoryResp; import cn.axzo.tyr.client.model.res.PageElementResp; import cn.axzo.tyr.server.config.MqProducer; import cn.axzo.tyr.server.event.payload.PageElementFeatureResourceUpsertPayload; @@ -27,12 +32,15 @@ import cn.axzo.tyr.server.service.SaasPageElementCategoryService; import cn.axzo.tyr.server.service.SaasPageElementService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService; import com.alibaba.nacos.common.utils.UuidUtils; +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.Sets; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -398,4 +406,28 @@ public class SaasPageElementCategoryServiceImpl extends ServiceImpl list(PageElementCategoryV2Req param) { + return PageConverter.drainAll(pageNumber -> { + param.setPage(pageNumber); + param.setPageSize(1000); + return page(param); + }); + } + + @Override + public PageResp page(PageElementCategoryV2Req param) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasPageElementCategory.class); + wrapper.eq("is_delete", 0); + + IPage page = this.page(PageConverter.toMybatis(param, SaasPageElementCategory.class), wrapper); + return PageConverter.toResp(page, this::from); + } + + private PageElementCategoryResp from(SaasPageElementCategory saasPageElementCategory) { + PageElementCategoryResp result = PageElementCategoryResp.builder().build(); + BeanUtils.copyProperties(saasPageElementCategory, result); + return result; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementFeatureResourceRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementFeatureResourceRelationServiceImpl.java index 0beda527..02702aa2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementFeatureResourceRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementFeatureResourceRelationServiceImpl.java @@ -5,17 +5,30 @@ import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; import cn.axzo.foundation.page.PageResp; import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum; import cn.axzo.tyr.client.model.req.PageElementFeatureResourceRelationReq; +import cn.axzo.tyr.client.model.req.PageElementReq; +import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq; +import cn.axzo.tyr.client.model.res.PageElementFeatureResourceRelationResp; +import cn.axzo.tyr.client.model.res.PageElementResp; +import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation; import cn.axzo.tyr.server.repository.mapper.SaasPageElementFeatureResourceRelationMapper; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasPageElementFeatureResourceRelationService; +import cn.axzo.tyr.server.service.SaasPageElementService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -24,8 +37,13 @@ import java.util.stream.Collectors; public class SaasPageElementFeatureResourceRelationServiceImpl extends ServiceImpl implements SaasPageElementFeatureResourceRelationService { + @Autowired + private SaasPageElementService saasPageElementService; + @Autowired + private SaasFeatureResourceService saasFeatureResourceService; + @Override - public List list(PageElementFeatureResourceRelationReq param) { + public List list(PageElementFeatureResourceRelationReq param) { return PageConverter.drainAll(pageNumber -> { param.setPage(pageNumber); param.setPageSize(1000); @@ -34,7 +52,7 @@ public class SaasPageElementFeatureResourceRelationServiceImpl extends ServiceIm } @Override - public PageResp page(PageElementFeatureResourceRelationReq param) { + public PageResp page(PageElementFeatureResourceRelationReq param) { QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasPageElementFeatureResourceRelation.class); wrapper.eq("is_delete", 0); @@ -45,6 +63,57 @@ public class SaasPageElementFeatureResourceRelationServiceImpl extends ServiceIm IPage page = this.page(PageConverter.toMybatis(param, SaasPageElementFeatureResourceRelation.class), wrapper); - return PageConverter.toResp(page, Function.identity()); + Map pageElements = listPageElement(page.getRecords(), param); + + Map saasFeatureResources = listSaasFeatureResource(page.getRecords(), param); + + return PageConverter.toResp(page, e -> from(e, pageElements, saasFeatureResources)); + } + + private PageElementFeatureResourceRelationResp from(SaasPageElementFeatureResourceRelation saasPageElementFeatureResourceRelation, + Map pageElements, + Map saasFeatureResources) { + PageElementFeatureResourceRelationResp result = PageElementFeatureResourceRelationResp.builder().build(); + BeanUtils.copyProperties(saasPageElementFeatureResourceRelation, result); + + result.setPageElement(pageElements.get(result.getPageElementCode())); + + result.setSaasFeatureResource(saasFeatureResources.get(result.getFeatureResourceUniCode())); + return result; + } + + private Map listPageElement(List saasPageElementFeatureResourceRelations, + PageElementFeatureResourceRelationReq param) { + + if (CollectionUtils.isEmpty(saasPageElementFeatureResourceRelations) || BooleanUtils.isNotTrue(param.getNeedPageElement())) { + return Collections.emptyMap(); + } + + return saasPageElementService.list(PageElementReq.builder() + .codes(saasPageElementFeatureResourceRelations.stream() + .map(SaasPageElementFeatureResourceRelation::getPageElementCode) + .collect(Collectors.toSet())) + .needPageElementCategory(param.getNeedPageElementCategory()) + .build()) + .stream() + .collect(Collectors.toMap(PageElementResp::getCode, Function.identity())); + } + + private Map listSaasFeatureResource(List saasPageElementFeatureResourceRelations, + PageElementFeatureResourceRelationReq param) { + if (CollectionUtils.isEmpty(saasPageElementFeatureResourceRelations) || BooleanUtils.isNotTrue(param.getNeedFeatureResource())) { + return Collections.emptyMap(); + } + + Set uniCodes = saasPageElementFeatureResourceRelations.stream() + .map(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode) + .collect(Collectors.toSet()); + PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder() + .uniCodes(uniCodes) + .build(); + List featureResources = saasFeatureResourceService.list(pageSaasFeatureResourceReq); + + return featureResources.stream() + .collect(Collectors.toMap(SaasFeatureResourceResp::getUniCode, Function.identity())); } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementServiceImpl.java index f23f5f18..a15c57c7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPageElementServiceImpl.java @@ -26,6 +26,7 @@ import cn.axzo.tyr.client.model.req.GetPageElementReq; import cn.axzo.tyr.client.model.req.GetUserHasPermissionPageElementReq; import cn.axzo.tyr.client.model.req.IdentityAuthReq; import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO; +import cn.axzo.tyr.client.model.req.PageElementCategoryV2Req; import cn.axzo.tyr.client.model.req.PageElementFeatureResourceRelationReq; import cn.axzo.tyr.client.model.req.PageElementImportDataReq; import cn.axzo.tyr.client.model.req.PageElementReportReq; @@ -41,6 +42,7 @@ import cn.axzo.tyr.client.model.res.IdentityAuthRes; import cn.axzo.tyr.client.model.res.PageElementBasicDTO; import cn.axzo.tyr.client.model.res.PageElementCategoryAndElementResp; import cn.axzo.tyr.client.model.res.PageElementCategoryResp; +import cn.axzo.tyr.client.model.res.PageElementFeatureResourceRelationResp; import cn.axzo.tyr.client.model.res.PageElementRelationFeatureResourceResp; import cn.axzo.tyr.client.model.res.PageElementResp; import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; @@ -881,10 +883,10 @@ public class SaasPageElementServiceImpl extends ServiceImpl elementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(elementFeatureResourceRelationReq); + List elementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(elementFeatureResourceRelationReq); Set uniCodes = elementFeatureResourceRelations.stream() - .map(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode) + .map(PageElementFeatureResourceRelationResp::getFeatureResourceUniCode) .collect(Collectors.toSet()); if (CollectionUtils.isEmpty(uniCodes)) { @@ -899,7 +901,7 @@ public class SaasPageElementServiceImpl extends ServiceImpl featureResources.get(e.getFeatureResourceUniCode()), Collectors.toList()))); } @@ -1037,6 +1039,35 @@ public class SaasPageElementServiceImpl extends ServiceImpl listAncestorPageElement(List pageElements, + PageElementReq param) { + + if (CollectionUtils.isEmpty(pageElements) || BooleanUtils.isNotTrue(param.getNeedAncestor())) { + return Collections.emptyMap(); + } + + Set codes = pageElements.stream() + .map(SaasPageElement::getCode) + .collect(Collectors.toSet()); + + // 因为现在的数据结构,type为PAGE的和type为COMPONENT的groupCode一样,所以要排除type=PAGE的记录 +// return this.lambdaQuery() +// .in(SaasPageElement::getGroupCode, codes) +// .ne(SaasPageElement::getType, PageElementTypeEnum.PAGE) +// .list() +// .stream() +// .map(SaasPageElement::to) +// .collect(Collectors.groupingBy(PageElementResp::getGroupCode)); + + return Collections.emptyMap(); + } + private Map listPageElementCategory(List pageElements, PageElementReq param) { @@ -1079,11 +1110,10 @@ public class SaasPageElementServiceImpl extends ServiceImpl localDBPageElements = listLocalDBPageElement(prePageElements); - // upsert pageElementCategory - upsertPageElementCategory(prePageElements, localDBPageElements, req); + upsertPageElementCategory(prePageElements, req); + Map localDBPageElements = listLocalDBPageElement(prePageElements); List preUpsertPageElements = prePageElements.stream() .flatMap(e -> { @@ -1118,7 +1148,6 @@ public class SaasPageElementServiceImpl extends ServiceImpl prePageElements, - Map localDBPageElements, SyncPageElementReq req) { List prePageElementCategories = prePageElements.stream() @@ -1130,17 +1159,21 @@ public class SaasPageElementServiceImpl extends ServiceImpl localDBPageElementCategories = localDBPageElements.values().stream() - .map(PageElementResp::getPageElementCategory) - .filter(Objects::nonNull) - .collect(Collectors.toMap(PageElementCategoryResp::getItemCode, Function.identity(), (f, s) -> f)); + Map localDBPageElementCategories = saasPageElementCategoryService.list(PageElementCategoryV2Req.builder() + .itemCodes(prePageElementCategories.stream() + .map(PageElementCategoryResp::getItemCode) + .collect(Collectors.toSet())) + .build()) + .stream() + .collect(Collectors.toMap(PageElementCategoryResp::getItemCode, Function.identity())); List upsert = prePageElementCategories.stream() .map(e -> { PageElementCategoryResp localDBPageElementCategory = localDBPageElementCategories.get(e.getItemCode()); return BatchUpsertPageElementCategoryReq.UpsertPageElementCategory.builder() - .id(Objects.nonNull(localDBPageElementCategory) ? localDBPageElementCategory.getId() : null) + .id(Optional.ofNullable(localDBPageElementCategory) + .map(PageElementCategoryResp::getId) + .orElse(null)) .terminal(e.getTerminal()) .itemCode(e.getItemCode()) .itemName(e.getItemName()) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index 6713e471..fe42f7a1 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -25,6 +25,7 @@ import cn.axzo.tyr.client.model.req.WorkspacePermissionIdentityReq; import cn.axzo.tyr.client.model.res.IdentityAuthRes; import cn.axzo.tyr.client.model.res.ListIdentityFromPermissionResp; import cn.axzo.tyr.client.model.res.ListPermissionFromRoleGroupResp; +import cn.axzo.tyr.client.model.res.PageElementFeatureResourceRelationResp; import cn.axzo.tyr.client.model.res.QueryIdentityByPermissionResp; import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; import cn.axzo.tyr.client.model.res.SaasRoleRes; @@ -36,7 +37,6 @@ import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery; import cn.axzo.tyr.server.repository.entity.RolePermission; 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.SaasRoleGroup; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import cn.axzo.tyr.server.repository.mapper.SaasRoleUserRelationMapper; @@ -380,8 +380,9 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { PageElementFeatureResourceRelationReq pageElementFeatureResourceRelationReq = PageElementFeatureResourceRelationReq.builder() .pageElementCodes(req.getFeatureCodes()) .terminal(req.getTerminal()) + .needFeatureResource(true) .build(); - List relations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq); + List relations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq); if (CollectionUtils.isEmpty(relations)) { log.info("not found in SaasPageElementFeatureResourceRelation, featureCodes:{},terminal:{}", @@ -389,14 +390,13 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { return Collections.emptyList(); } - Set uniCodes = relations.stream().map(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode).collect(Collectors.toSet()); - PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder() - .uniCodes(uniCodes) - .build(); - List featureResources = saasFeatureResourceService.list(pageSaasFeatureResourceReq); + List featureResources = relations.stream() + .map(PageElementFeatureResourceRelationResp::getSaasFeatureResource) + .filter(Objects::nonNull) + .collect(Collectors.toList()); if (CollectionUtils.isEmpty(featureResources)) { - log.info("not found in SaasFeatureResource, unicode:{}", uniCodes); + log.info("not found in SaasFeatureResource, pageElementCodes:{}", req.getFeatureCodes()); return Collections.emptyList(); } return saasFeatureResourceService.list(PageSaasFeatureResourceReq.builder()