feat: (feature/REQ-3167) 修改同步前端资源的问题

This commit is contained in:
李龙 2024-11-29 18:31:30 +08:00
parent 6e4a26f839
commit 00657cac9c
17 changed files with 405 additions and 86 deletions

View File

@ -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<String> sort;
@CriteriaField(field = "itemCode", operator = Operator.IN)
private Set<String> itemCodes;
}

View File

@ -41,4 +41,16 @@ public class PageElementFeatureResourceRelationReq implements IPageReq {
@CriteriaField(ignore = true)
private Set<PageElementFeatureResourceRelationTypeEnum> types;
@CriteriaField(ignore = true)
private Boolean needPageElement;
@CriteriaField(ignore = true)
private Boolean needFeatureResource;
/**
* 需要跟needPageElement一起使用
*/
@CriteriaField(ignore = true)
private Boolean needPageElementCategory;
}

View File

@ -50,4 +50,10 @@ public class PageElementReq implements IPageReq {
@CriteriaField(ignore = true)
private Boolean needPageElementCategory;
/**
* 现在只有组件的父节点是页面
*/
@CriteriaField(ignore = true)
private Boolean needAncestor;
}

View File

@ -92,6 +92,18 @@ public class PageSaasFeatureResourceReq implements IPageReq {
@CriteriaField(ignore = true)
private Set<PageElementFeatureResourceRelationTypeEnum> pageElementTypes;
/**
* 是否需要所有子节点
*/
@CriteriaField(ignore = true)
private Boolean needChildren;
/**
* 是否需要所有父节点
*/
@CriteriaField(ignore = true)
private Boolean needAncestor;
public PageResp toEmpty() {
return PageResp.builder()
.current(this.getPage())

View File

@ -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;
}

View File

@ -132,6 +132,8 @@ public class PageElementResp {
*/
private PageElementCategoryResp pageElementCategory;
private PageElementResp ancestor;
@Data
@Builder
@NoArgsConstructor

View File

@ -155,6 +155,16 @@ public class SaasFeatureResourceResp {
*/
private List<PageElementResp> saasPageElements;
/**
* 所有父节点
*/
private List<SaasFeatureResourceResp> ancestors;
/**
* 所有子节点
*/
private List<SaasFeatureResourceResp> children;
public Set<Long> resolvePath() {
return Optional.ofNullable(this.getPath())
.map(e -> Arrays.stream(e.split(",")).map(Long::valueOf).collect(Collectors.toSet()))

View File

@ -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 {

View File

@ -37,30 +37,40 @@ public interface SaasFeatureResourceService extends IService<SaasFeatureResource
void updateFeatureAuthType(Long featureId, Integer authType);
/**递归的**/
@Deprecated
List<SaasFeatureResource> batchListDescendant(List<Long> featureIds);
@Deprecated
SaasFeatureResource featureResourceById(Long featureId);
@Deprecated
FeatureResourceTreeNode getTreeFeatureDescendant(DetailFeatureResourceReq param);
/**菜单重排序**/
void reorderMenuFeature(Long featureId, Integer offset);
@Deprecated
/** 根据ID查询导航菜单页面信息 仅可显示 - 限制查询字段 **/
List<SaasFeatureResource> listNavByIds(List<Long> featureIds, List<Integer> featureTypes);
/** 资源权限通用查询 **/
@Deprecated
List<ResourcePermission> permissionQuery(ResourcePermissionQueryDTO param);
/** 查询资源树 **/
@Deprecated
List<FeatureResourceTreeNode> getTree(GetFeatureResourceTreeReq req);
@Deprecated
SaasFeatureResource getByCode(String featureCode);
@Deprecated
Set<Long> listAuthFree();
@Deprecated
List<SaasFeatureResource> listByParentIdAndTerminalAndIds(Long parentId, String terminal, List<Long> featureIds);
@Deprecated
List<SaasFeatureResource> listByParentIdAndBlurTerminalAndIds(Long parentId, String terminal, List<Long> featureIds);
List<SaasFeatureResourceResp> list(PageSaasFeatureResourceReq param);
@ -73,6 +83,7 @@ public interface SaasFeatureResourceService extends IService<SaasFeatureResource
void refreshCache(RefreshFeatureResourceCacheParam param);
@Deprecated
List<SaasFeatureBO> listAllFeatureByTerminal(String terminal);
void clone(CloneTerminalReq req);

View File

@ -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<SaasPageElementCategory> {
@Deprecated
List<ListPageElementCategoryResp> listGroupByTerminal(PageElementCategoryReq req);
Long saveOrUpdate(SaveOrUpdatePageElementCategoryReq req);
@ -26,4 +31,8 @@ public interface SaasPageElementCategoryService extends IService<SaasPageElement
void delete(DeletePageElementCategoryReq req);
void batchUpsert(BatchUpsertPageElementCategoryReq req);
List<PageElementCategoryResp> list(PageElementCategoryV2Req param);
PageResp<PageElementCategoryResp> page(PageElementCategoryV2Req param);
}

View File

@ -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<SaasPageElementFeatureResourceRelation> {
List<SaasPageElementFeatureResourceRelation> list(PageElementFeatureResourceRelationReq param);
List<PageElementFeatureResourceRelationResp> list(PageElementFeatureResourceRelationReq param);
PageResp<SaasPageElementFeatureResourceRelation> page(PageElementFeatureResourceRelationReq param);
PageResp<PageElementFeatureResourceRelationResp> page(PageElementFeatureResourceRelationReq param);
}

View File

@ -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<Long, SaasRole> roleMap = roles.stream()
.filter(e -> StringUtils.isNotBlank(e.getRoleCode()))
.collect(Collectors.toMap(SaasRole::getId, Function.identity()));
Map<Long, List<Long>> groupIdToRoleIdsMap = roleRelations.stream()
Map<Long, List<SaasRole>> groupRoleMap = roleRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupRoleRelation::getGroupId,
Collectors.mapping(SaasPgroupRoleRelation::getRoleId, Collectors.toList())));
Map<Long, String> 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<Long> roleIds = groupIdToRoleIdsMap.get(e.getGroupId());
if (CollectionUtils.isEmpty(roleIds)) {
List<SaasRole> 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());
})

View File

@ -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<SaasFeatureResou
PageElementFeatureResourceRelationReq pageElementFeatureResourceRelationReq = PageElementFeatureResourceRelationReq.builder()
.featureResourceUniCodes(Sets.newHashSet(featureResourceTreeNode.getUniCode()))
.types(Sets.newHashSet(PageElementFeatureResourceRelationTypeEnum.PAGE_ROUTE))
.needPageElement(true)
.build();
List<SaasPageElementFeatureResourceRelation> pageElementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq);
if (CollectionUtils.isEmpty(pageElementFeatureResourceRelations)) {
return;
}
PageElementReq pageElementReq = PageElementReq.builder()
.codes(pageElementFeatureResourceRelations.stream()
.map(SaasPageElementFeatureResourceRelation::getPageElementCode)
.collect(Collectors.toSet()))
.build();
Optional<PageElementResp> pageElementOptional = saasPageElementService.list(pageElementReq).stream()
Optional<PageElementResp> pageElementOptional = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq)
.stream()
.map(PageElementFeatureResourceRelationResp::getPageElement)
.findFirst();
if (!pageElementOptional.isPresent()) {
@ -821,20 +812,84 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
Map<String, List<PageElementResp>> pageElements = listPageElements(param, page.getRecords());
Map<Long, List<SaasFeatureResourceResp>> children = listChildren(param, page.getRecords());
Map<Long, List<SaasFeatureResourceResp>> ancestors = listAncestor(param, page.getRecords());
return PageConverter.toResp(page, e -> from(e,
uniCodeFeatureCodeMap,
pageElements));
pageElements,
ancestors,
children));
}
private Map<Long, List<SaasFeatureResourceResp>> listAncestor(PageSaasFeatureResourceReq param,
List<SaasFeatureResource> saasFeatureResources) {
if (CollectionUtils.isEmpty(saasFeatureResources) || BooleanUtils.isNotTrue(param.getNeedAncestor())) {
return Collections.emptyMap();
}
List<Long> parentIds = saasFeatureResources.stream()
.map(SaasFeatureResource::splitPath)
.flatMap(Collection::stream)
.distinct()
.collect(Collectors.toList());
Map<Long, SaasFeatureResourceResp> 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<Long, List<SaasFeatureResourceResp>> listChildren(PageSaasFeatureResourceReq param,
List<SaasFeatureResource> saasFeatureResources) {
if (CollectionUtils.isEmpty(saasFeatureResources) || BooleanUtils.isNotTrue(param.getNeedChildren())) {
return Collections.emptyMap();
}
Set<String> paths = saasFeatureResources.stream()
.map(SaasFeatureResource::getPath)
.collect(Collectors.toSet());
List<SaasFeatureResourceResp> 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<String, Set<String>> uniCodeFeatureCodeMap,
Map<String, List<PageElementResp>> pageElements) {
Map<String, List<PageElementResp>> pageElements,
Map<Long, List<SaasFeatureResourceResp>> children,
Map<Long, List<SaasFeatureResourceResp>> 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,8 +908,8 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
.build();
return saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq)
.stream()
.collect(Collectors.groupingBy(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode,
Collectors.mapping(SaasPageElementFeatureResourceRelation::getPageElementCode, Collectors.toSet())));
.collect(Collectors.groupingBy(PageElementFeatureResourceRelationResp::getFeatureResourceUniCode,
Collectors.mapping(PageElementFeatureResourceRelationResp::getPageElementCode, Collectors.toSet())));
}
private Map<String, List<PageElementResp>> listPageElements(PageSaasFeatureResourceReq param,
@ -872,26 +927,12 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
.types(param.getPageElementTypes())
.build();
List<SaasPageElementFeatureResourceRelation> pageElementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq);
if (CollectionUtils.isEmpty(pageElementFeatureResourceRelations)) {
return Collections.emptyMap();
}
Set<String> elementCodes = pageElementFeatureResourceRelations.stream()
.map(SaasPageElementFeatureResourceRelation::getPageElementCode)
.collect(Collectors.toSet());
PageElementReq pageElementReq = PageElementReq.builder()
.codes(elementCodes)
.build();
Map<String, PageElementResp> elementMap = saasPageElementService.list(pageElementReq).stream()
.collect(Collectors.toMap(PageElementResp::getCode, Function.identity()));
List<PageElementFeatureResourceRelationResp> 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())));
}

View File

@ -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<SaasPageElem
.operateData(baseCategory)
.build());
}
@Override
public List<PageElementCategoryResp> list(PageElementCategoryV2Req param) {
return PageConverter.drainAll(pageNumber -> {
param.setPage(pageNumber);
param.setPageSize(1000);
return page(param);
});
}
@Override
public PageResp<PageElementCategoryResp> page(PageElementCategoryV2Req param) {
QueryWrapper<SaasPageElementCategory> wrapper = QueryWrapperHelper.fromBean(param, SaasPageElementCategory.class);
wrapper.eq("is_delete", 0);
IPage<SaasPageElementCategory> 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;
}
}

View File

@ -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<SaasPageElementFeatureResourceRelationMapper, SaasPageElementFeatureResourceRelation>
implements SaasPageElementFeatureResourceRelationService {
@Autowired
private SaasPageElementService saasPageElementService;
@Autowired
private SaasFeatureResourceService saasFeatureResourceService;
@Override
public List<SaasPageElementFeatureResourceRelation> list(PageElementFeatureResourceRelationReq param) {
public List<PageElementFeatureResourceRelationResp> 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<SaasPageElementFeatureResourceRelation> page(PageElementFeatureResourceRelationReq param) {
public PageResp<PageElementFeatureResourceRelationResp> page(PageElementFeatureResourceRelationReq param) {
QueryWrapper<SaasPageElementFeatureResourceRelation> wrapper = QueryWrapperHelper.fromBean(param, SaasPageElementFeatureResourceRelation.class);
wrapper.eq("is_delete", 0);
@ -45,6 +63,57 @@ public class SaasPageElementFeatureResourceRelationServiceImpl extends ServiceIm
IPage<SaasPageElementFeatureResourceRelation> page = this.page(PageConverter.toMybatis(param, SaasPageElementFeatureResourceRelation.class), wrapper);
return PageConverter.toResp(page, Function.identity());
Map<String, PageElementResp> pageElements = listPageElement(page.getRecords(), param);
Map<String, SaasFeatureResourceResp> saasFeatureResources = listSaasFeatureResource(page.getRecords(), param);
return PageConverter.toResp(page, e -> from(e, pageElements, saasFeatureResources));
}
private PageElementFeatureResourceRelationResp from(SaasPageElementFeatureResourceRelation saasPageElementFeatureResourceRelation,
Map<String, PageElementResp> pageElements,
Map<String, SaasFeatureResourceResp> 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<String, PageElementResp> listPageElement(List<SaasPageElementFeatureResourceRelation> 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<String, SaasFeatureResourceResp> listSaasFeatureResource(List<SaasPageElementFeatureResourceRelation> saasPageElementFeatureResourceRelations,
PageElementFeatureResourceRelationReq param) {
if (CollectionUtils.isEmpty(saasPageElementFeatureResourceRelations) || BooleanUtils.isNotTrue(param.getNeedFeatureResource())) {
return Collections.emptyMap();
}
Set<String> uniCodes = saasPageElementFeatureResourceRelations.stream()
.map(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode)
.collect(Collectors.toSet());
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.uniCodes(uniCodes)
.build();
List<SaasFeatureResourceResp> featureResources = saasFeatureResourceService.list(pageSaasFeatureResourceReq);
return featureResources.stream()
.collect(Collectors.toMap(SaasFeatureResourceResp::getUniCode, Function.identity()));
}
}

View File

@ -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<SaasPageElementMappe
.builder()
.pageElementCodes(pageElementCodes)
.build();
List<SaasPageElementFeatureResourceRelation> elementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(elementFeatureResourceRelationReq);
List<PageElementFeatureResourceRelationResp> elementFeatureResourceRelations = saasPageElementFeatureResourceRelationService.list(elementFeatureResourceRelationReq);
Set<String> 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<SaasPageElementMappe
.collect(Collectors.toMap(SaasFeatureResourceResp::getUniCode, Function.identity()));
return elementFeatureResourceRelations.stream()
.collect(Collectors.groupingBy(SaasPageElementFeatureResourceRelation::getPageElementCode,
.collect(Collectors.groupingBy(PageElementFeatureResourceRelationResp::getPageElementCode,
Collectors.mapping(e -> featureResources.get(e.getFeatureResourceUniCode()), Collectors.toList())));
}
@ -1037,6 +1039,35 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
.collect(Collectors.groupingBy(PageElementResp::getGroupCode));
}
/**
* 目前saas_page_element上提现不出来层级关系只有通过type来确定只有type = COMPONENT时才有父节点的记录
* @param pageElements
* @param param
* @return
*/
private Map<String, PageElementResp> listAncestorPageElement(List<SaasPageElement> pageElements,
PageElementReq param) {
if (CollectionUtils.isEmpty(pageElements) || BooleanUtils.isNotTrue(param.getNeedAncestor())) {
return Collections.emptyMap();
}
Set<String> 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<String, PageElementCategoryResp> listPageElementCategory(List<SaasPageElement> pageElements,
PageElementReq param) {
@ -1079,11 +1110,10 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
return;
}
Map<String, PageElementResp> localDBPageElements = listLocalDBPageElement(prePageElements);
// upsert pageElementCategory
upsertPageElementCategory(prePageElements, localDBPageElements, req);
upsertPageElementCategory(prePageElements, req);
Map<String, PageElementResp> localDBPageElements = listLocalDBPageElement(prePageElements);
List<BatchUpsertPageElementReq.UpsertPageElementReq> preUpsertPageElements = prePageElements.stream()
.flatMap(e -> {
@ -1118,7 +1148,6 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
}
private void upsertPageElementCategory(List<PageElementResp> prePageElements,
Map<String, PageElementResp> localDBPageElements,
SyncPageElementReq req) {
List<PageElementCategoryResp> prePageElementCategories = prePageElements.stream()
@ -1130,17 +1159,21 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
log.info("no pageElementCategory need sync");
return;
}
Map<String, PageElementCategoryResp> localDBPageElementCategories = localDBPageElements.values().stream()
.map(PageElementResp::getPageElementCategory)
.filter(Objects::nonNull)
.collect(Collectors.toMap(PageElementCategoryResp::getItemCode, Function.identity(), (f, s) -> f));
Map<String, PageElementCategoryResp> localDBPageElementCategories = saasPageElementCategoryService.list(PageElementCategoryV2Req.builder()
.itemCodes(prePageElementCategories.stream()
.map(PageElementCategoryResp::getItemCode)
.collect(Collectors.toSet()))
.build())
.stream()
.collect(Collectors.toMap(PageElementCategoryResp::getItemCode, Function.identity()));
List<BatchUpsertPageElementCategoryReq.UpsertPageElementCategory> 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())

View File

@ -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<SaasPageElementFeatureResourceRelation> relations = saasPageElementFeatureResourceRelationService.list(pageElementFeatureResourceRelationReq);
List<PageElementFeatureResourceRelationResp> 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<String> uniCodes = relations.stream().map(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode).collect(Collectors.toSet());
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
.uniCodes(uniCodes)
.build();
List<SaasFeatureResourceResp> featureResources = saasFeatureResourceService.list(pageSaasFeatureResourceReq);
List<SaasFeatureResourceResp> 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()