feat(REQ-2545): 洗权限资源关系接口、元素上报接口

This commit is contained in:
李昆鹏 2024-06-19 09:27:35 +08:00
parent 5ee96d4003
commit b118e80ed1
15 changed files with 728 additions and 0 deletions

View File

@ -0,0 +1,23 @@
package cn.axzo.tyr.client.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@Getter
@AllArgsConstructor
public enum PageElementTypeEnum {
PAGE("PAGE", "页面"),
COMPONENT("COMPONENT", "组件"),
;
private final String code;
private final String desc;
}

View File

@ -0,0 +1,31 @@
package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.req.GetPageElementReq;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.res.PageElementResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.validation.Valid;
import java.util.List;
/**
* 页面及元素相关接口
*
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}")
public interface PageElementApi {
/** 页面及元素上报 **/
@PostMapping("/api/pageElement/report")
ApiResult<Void> report(@RequestBody @Valid PageElementReportReq req);
/** 查询页面资源 **/
@PostMapping("/api/pageElement/getPageElement")
ApiResult<List<PageElementResp>> getPageElement(@RequestBody @Valid GetPageElementReq req);
}

View File

@ -0,0 +1,34 @@
package cn.axzo.tyr.client.model.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/14
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GetPageElementReq {
/**
* 页面的featureResourceId
*/
@NotNull(message = "页面的featureResourceId不能为空")
@Min(value = 1, message = "页面的featureResourceId有误")
private Long featureResourceId;
/**
* 是否只查询组件已选择的元素
*/
@Builder.Default
private Boolean querySelectedOnly = Boolean.FALSE;
}

View File

@ -0,0 +1,66 @@
package cn.axzo.tyr.client.model.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/14
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageElementReportReq {
/**
*
*/
@NotBlank(message = "端信息不能为空")
private String terminal;
/**
* 页面元素列表
*/
@NotEmpty(message = "页面元素不能为空")
private List<PageElement> pageElements;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PageElement {
/**
* 元素编码
*/
private String code;
/**
* 元素名称
*/
private String name;
/**
* 元素类型PAGE:页面COMPONENT:页面里的组件
*/
private String type;
/**
* 路由地址
*/
private String linkUrl;
/**
* 子元素只包含一级
*/
private List<PageElement> children;
}
}

View File

@ -0,0 +1,50 @@
package cn.axzo.tyr.client.model.res;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/14
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageElementResp {
/**
* 元素ID
*/
private Long id;
/**
* 元素编码
*/
private String code;
/**
* 元素名称
*/
private String name;
/**
* 元素类型
*/
private String type;
/**
* 是否已勾选
*/
private Boolean selected;
/**
* 子元素只包含一级
*/
private List<PageElementResp> children;
}

View File

@ -1,6 +1,10 @@
package cn.axzo.tyr.server.controller;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
import cn.axzo.basics.common.util.TreeUtil;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.tyr.client.model.req.CommonDictQueryReq;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
@ -21,6 +25,8 @@ import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import cn.axzo.tyr.server.repository.entity.SaasRole;
import cn.axzo.tyr.server.repository.entity.SaasRoleGroup;
import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation;
import cn.axzo.tyr.server.repository.dao.*;
import cn.axzo.tyr.server.repository.entity.*;
import cn.axzo.tyr.server.service.ProductPermissionCacheService;
import cn.axzo.tyr.server.service.RolePermissionCacheService;
import cn.axzo.tyr.server.service.RoleService;
@ -30,6 +36,7 @@ import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
import cn.axzo.tyr.server.service.SaasRoleGroupService;
import cn.axzo.tyr.server.service.TyrSaasAuthService;
import cn.axzo.tyr.server.service.impl.SaasFeatureResourceCacheService;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -88,6 +95,12 @@ public class PrivateController {
private SaasFeatureDao saasFeatureDao;
@Autowired
private SaasPgroupPermissionRelationService saasPgroupPermissionRelationService;
@Autowired
private SaasRoleDao saasRoleDao;
@Autowired
private SaasPgroupRoleRelationDao saasPgroupRoleRelationDao;
@Autowired
private SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao;
@ -294,6 +307,48 @@ public class PrivateController {
return tyrSaasAuthService.authPermission(request);
}
@PostMapping("/api/private/pgroupPermissionRelation/refresh")
public ApiResult<Void> refreshPgroupPermissionRelation(@Validated @RequestBody RefreshPgroupPermissionRelationParam request) {
List<Integer> workspaceTypes = Lists.newArrayList(3,6);
if (!workspaceTypes.contains(request.getWorkspaceType())) {
return ApiResult.err("非oms、政务的角色不能清洗。");
}
Long startRoleId = 0L;
while (true) {
List<SaasRole> saasRoles = saasRoleDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasRole::getWorkspaceType, request.getWorkspaceType())
.gt(BaseEntity::getId, startRoleId)
.orderByAsc(BaseEntity::getId)
.last("LIMIT " + request.getPageSize())
.list();
if (CollectionUtils.isEmpty(saasRoles)) {
return ApiResult.ok();
}
processRole(saasRoles.stream().map(BaseEntity::getId).collect(Collectors.toList()));
startRoleId = saasRoles.get(saasRoles.size() - 1).getId();
}
}
private void processRole(List<Long> roleIds) {
List<SaasPgroupRoleRelation> saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(roleIds);
if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) {
log.info("refreshPgroupPermissionRelation roleIds:{} has no pgroup role relation", JSON.toJSONString(roleIds));
return;
}
List<Long> groupIds = saasPgroupRoleRelations.stream().map(SaasPgroupRoleRelation::getGroupId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(groupIds)) {
return;
}
saasPgroupPermissionRelationDao.lambdaUpdate()
.eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.in(SaasPgroupPermissionRelation::getGroupId, groupIds)
.set(SaasPgroupPermissionRelation::getType, 1)
.update();
}
/**
* 刷新saas_pgroup_permission_relation表的featureType
* 1type = 0的数据从saas_feature中查询
@ -407,6 +462,18 @@ public class PrivateController {
private Long rootId;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class RefreshPgroupPermissionRelationParam {
@NotNull(message = "workspaceType不能为空oms:6,政务:3")
private Integer workspaceType;
@Builder.Default
private Integer pageSize = 10;
}
@Data
@Builder
@NoArgsConstructor

View File

@ -0,0 +1,37 @@
package cn.axzo.tyr.server.controller.permission;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.PageElementApi;
import cn.axzo.tyr.client.model.req.GetPageElementReq;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.server.service.SaasPageElementService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class PageElementController implements PageElementApi {
private final SaasPageElementService saasPageElementService;
@Override
public ApiResult<Void> report(PageElementReportReq req) {
saasPageElementService.report(req);
return ApiResult.ok();
}
@Override
public ApiResult<List<PageElementResp>> getPageElement(GetPageElementReq req) {
return ApiResult.ok(saasPageElementService.getPageElement(req));
}
}

View File

@ -0,0 +1,43 @@
package cn.axzo.tyr.server.repository.dao;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.mapper.SaasPageElementMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Objects;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@Repository
public class SaasPageElementDao extends ServiceImpl<SaasPageElementMapper, SaasPageElement> {
public void deleteAllByTerminal(String terminal) {
lambdaUpdate()
.eq(SaasPageElement::getTerminal, terminal)
.set(SaasPageElement::getIsDelete, DeleteEnum.DELETE.getValue())
.update();
}
public List<SaasPageElement> listByCodes(List<String> codes, String terminal) {
return lambdaQuery()
.eq(SaasPageElement::getTerminal, terminal)
.in(SaasPageElement::getCode, codes)
.list();
}
public List<SaasPageElement> listByGroupCodesAndExcludeIds(List<String> groupCodes, List<Long> excludeIds, String terminal) {
return lambdaQuery()
.eq(SaasPageElement::getTerminal, terminal)
.in(SaasPageElement::getGroupCode, groupCodes)
.notIn(CollectionUtils.isNotEmpty(excludeIds), SaasPageElement::getId, excludeIds)
.list();
}
}

View File

@ -0,0 +1,32 @@
package cn.axzo.tyr.server.repository.dao;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.mapper.SaasPageElementFeatureResourceRelationMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@Repository
public class SaasPageElementFeatureResourceRelationDao extends ServiceImpl<SaasPageElementFeatureResourceRelationMapper, SaasPageElementFeatureResourceRelation> {
public List<SaasPageElementFeatureResourceRelation> listByPageElementCode(String pageElementCode) {
return lambdaQuery()
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElementFeatureResourceRelation::getPageElementCode, pageElementCode)
.list();
}
public List<SaasPageElementFeatureResourceRelation> listByFeatureUniCodeAndTerminal(String featureResourceUniCode, String terminal) {
return lambdaQuery()
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode, featureResourceUniCode)
.eq(SaasPageElementFeatureResourceRelation::getTerminal, terminal)
.list();
}
}

View File

@ -0,0 +1,58 @@
package cn.axzo.tyr.server.repository.entity;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 页面元素表
*
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@Getter
@Setter
@ToString
@Builder
@EqualsAndHashCode(callSuper = true)
@TableName("saas_page_element")
public class SaasPageElement extends BaseEntity<SaasPageElement> {
/**
* 元素的组编码
*/
@TableField("group_code")
private String groupCode;
/**
* 页面元素编码
*/
@TableField("code")
private String code;
/**
* 页面元素名称
*/
@TableField("name")
private String name;
/**
* 页面元素类型PAGE:页面COMPONENT:组件
*/
@TableField("type")
private String type;
/**
* 页面路由地址
*/
@TableField("link_url")
private String linkUr;
/**
* 所属端
*/
@TableField("terminal")
private String terminal;
}

View File

@ -0,0 +1,54 @@
package cn.axzo.tyr.server.repository.entity;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 页面元素与菜单组件关系表
*
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@Getter
@Setter
@ToString
@EqualsAndHashCode(callSuper = true)
@TableName("saas_page_element_feature_resource_relation")
public class SaasPageElementFeatureResourceRelation extends BaseEntity<SaasPageElementFeatureResourceRelation> {
/**
* 页面元素code
*/
@TableField("page_element_code")
private String pageElementCode;
/**
* 菜单组件code
*/
@TableField("feature_resource_uni_code")
private String featureResourceUniCode;
/**
* 所属端
*/
@TableField("terminal")
private String terminal;
/**
* 创建人
*/
@TableField("create_by")
private Long createBy;
/**
* 更新人
*/
@TableField("update_by")
private Long updateBy;
}

View File

@ -0,0 +1,9 @@
package cn.axzo.tyr.server.repository.mapper;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface SaasPageElementFeatureResourceRelationMapper extends BaseMapper<SaasPageElementFeatureResourceRelation> {
}

View File

@ -0,0 +1,9 @@
package cn.axzo.tyr.server.repository.mapper;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface SaasPageElementMapper extends BaseMapper<SaasPageElement> {
}

View File

@ -0,0 +1,30 @@
package cn.axzo.tyr.server.service;
import cn.axzo.tyr.client.model.req.GetPageElementReq;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.res.PageElementResp;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
public interface SaasPageElementService {
/**
* 页面元素上报
*
* @param request 上报元素列表
*/
void report(PageElementReportReq request);
/**
* 查询页面已配置的元素
*
* @param request
* @return
*/
List<PageElementResp> getPageElement(GetPageElementReq request);
}

View File

@ -0,0 +1,185 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.basics.common.util.StopWatchUtil;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PageElementTypeEnum;
import cn.axzo.tyr.client.model.req.GetPageElementReq;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.service.SaasPageElementService;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/18
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class SaasPageElementServiceImpl implements SaasPageElementService {
private final SaasPageElementDao saasPageElementDao;
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasFeatureResourceDao saasFeatureResourceDao;
@Qualifier("asyncExecutor")
@Autowired
private ExecutorService asyncExecutor;
@Override
@Transactional(rollbackFor = Exception.class)
public void report(PageElementReportReq request) {
StopWatchUtil watch = StopWatchUtil.createStarted("saasPageElement-report");
watch.start("report");
// 根据端删除所有的元素
saasPageElementDao.deleteAllByTerminal(request.getTerminal());
List<SaasPageElement> pageElements = processParam2Entities(request);
// 减少数据库的IO分批写入
Lists.partition(pageElements,500).forEach(saasPageElementDao::saveBatch);
// 页面路由处理如果绑定了saas_feature_resource页面的路由更新到对应的字段为性能考虑异步处理
CompletableFuture.runAsync(() -> processPageLinkUrl(request), asyncExecutor).whenComplete((t, ex) -> log.info("更新表saas_feature_resource的页面路由完成。"));
watch.stop();
log.info("saasPageElement-report cost:{} , ms:{}", watch.prettyPrint(), watch.getTotalTimeMillis());
}
@Override
public List<PageElementResp> getPageElement(GetPageElementReq request) {
SaasFeatureResource saasFeatureResource = saasFeatureResourceDao.lambdaQuery()
.eq(BaseEntity::getIsDelete,0)
.eq(SaasFeatureResource::getId, request.getFeatureResourceId())
.one();
AssertUtil.notNull(saasFeatureResource, "页面或组件信息不存在");
List<SaasPageElementFeatureResourceRelation> relations = saasPageElementFeatureResourceRelationDao.listByFeatureUniCodeAndTerminal(saasFeatureResource.getUniCode(), saasFeatureResource.getTerminal());
if (CollectionUtils.isEmpty(relations)) {
return Collections.emptyList();
}
List<SaasPageElement> selectedPageElements = saasPageElementDao.listByCodes(relations.stream().map(SaasPageElementFeatureResourceRelation::getPageElementCode).collect(Collectors.toList()), saasFeatureResource.getTerminal());
if (CollectionUtils.isEmpty(selectedPageElements)) {
return Collections.emptyList();
}
List<Long> selectedIds = selectedPageElements.stream().map(BaseEntity::getId).collect(Collectors.toList());
// 如果查询不仅仅是已勾选的需要把已勾选的页面下未选择的组件也返回
if (!Boolean.TRUE.equals(request.getQuerySelectedOnly())) {
List<String> pageTypeCodes = selectedPageElements.stream().filter(e -> PageElementTypeEnum.PAGE.getCode().equals(e.getType())).map(SaasPageElement::getGroupCode).collect(Collectors.toList());
List<SaasPageElement> notSelectedComponents = saasPageElementDao.listByGroupCodesAndExcludeIds(pageTypeCodes, selectedIds, saasFeatureResource.getTerminal());
if (CollectionUtils.isNotEmpty(notSelectedComponents)) {
selectedPageElements.addAll(notSelectedComponents);
}
}
return change2PageElementResp(selectedPageElements, selectedIds);
}
private List<SaasPageElement> processParam2Entities(PageElementReportReq request) {
List<SaasPageElement> saasPageElements = Lists.newArrayList();
for (PageElementReportReq.PageElement pageElement : request.getPageElements()) {
saasPageElements.add(SaasPageElement.builder()
.terminal(request.getTerminal())
.groupCode(pageElement.getCode())
.code(pageElement.getCode())
.type(pageElement.getType())
.name(pageElement.getName())
.linkUr(pageElement.getLinkUrl())
.build());
if (CollectionUtils.isNotEmpty(pageElement.getChildren())) {
saasPageElements.addAll(pageElement.getChildren().stream().map(e -> SaasPageElement.builder()
.terminal(request.getTerminal())
.groupCode(pageElement.getCode())
.code(e.getCode())
.type(e.getType())
.name(e.getName())
.build()).collect(Collectors.toList()));
}
}
return saasPageElements;
}
private void processPageLinkUrl(PageElementReportReq request) {
for (PageElementReportReq.PageElement pageElement : request.getPageElements()) {
if (StringUtils.isBlank(pageElement.getLinkUrl())) {
continue;
}
List<SaasPageElementFeatureResourceRelation> relations = saasPageElementFeatureResourceRelationDao.listByPageElementCode(pageElement.getCode());
if (CollectionUtils.isEmpty(relations)) {
continue;
}
SaasFeatureResource saasFeatureResource = saasFeatureResourceDao.lambdaQuery()
.eq(SaasFeatureResource::getUniCode, relations.get(0).getFeatureResourceUniCode())
.eq(SaasFeatureResource::getTerminal, request.getTerminal())
.one();
if (Objects.isNull(saasFeatureResource)
|| !FeatureResourceType.PAGE.getCode().equals(saasFeatureResource.getFeatureType())
|| pageElement.getLinkUrl().equals(saasFeatureResource.getLinkUrl())) {
continue;
}
saasFeatureResourceDao.lambdaUpdate()
.eq(BaseEntity::getId, saasFeatureResource.getId())
.set(SaasFeatureResource::getLinkUrl, pageElement.getLinkUrl())
.update();
}
}
private List<PageElementResp> change2PageElementResp(List<SaasPageElement> pageElements, List<Long> selectedIds) {
if (CollectionUtils.isEmpty(pageElements)) {
return Collections.emptyList();
}
List<PageElementResp> pageTypeElements = pageElements.stream().filter(e -> PageElementTypeEnum.PAGE.getCode().equals(e.getType()))
.map(e -> PageElementResp.builder()
.id(e.getId())
.code(e.getCode())
.name(e.getName())
.type(e.getType())
.selected(selectedIds.contains(e.getId()))
.children(Lists.newArrayList())
.build()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(pageTypeElements)) {
return Collections.emptyList();
}
Map<String, PageElementResp> pageTypeCodeMap = pageTypeElements.stream().collect(Collectors.toMap(PageElementResp::getCode, Function.identity(), (v1, v2) -> v1));
pageElements.stream().filter(e -> PageElementTypeEnum.COMPONENT.getCode().equals(e.getType())).forEach(e -> {
PageElementResp pageTypeElement = pageTypeCodeMap.get(e.getGroupCode());
if (Objects.nonNull(pageTypeElement)) {
pageTypeElement.getChildren().add(PageElementResp.builder()
.id(e.getId())
.code(e.getCode())
.name(e.getName())
.type(e.getType())
.selected(selectedIds.contains(e.getId()))
.build());
}
});
return pageTypeElements;
}
}