refactor: 优化跳转相关问题 (#17010)

This commit is contained in:
王嘉豪
2025-09-16 18:03:39 +08:00
committed by GitHub
parent 99c8bf53c1
commit 0f2ebc44be
3 changed files with 167 additions and 60 deletions

View File

@@ -348,6 +348,90 @@ public class VisualizationLinkJumpManage {
return query.fetch();
}
private List<VisualizationLinkJumpInfoExtendDTO> queryBaseLinkJumpInfo(Long id, Long sourceViewId, Long uid, boolean isDesktop) {
QCoreChartView ccv = QCoreChartView.coreChartView;
QCoreDatasetTableField cdtf = QCoreDatasetTableField.coreDatasetTableField;
QVisualizationLinkJump vlj = QVisualizationLinkJump.visualizationLinkJump;
QVisualizationLinkJumpInfo vlji = QVisualizationLinkJumpInfo.visualizationLinkJumpInfo;
QDataVisualizationInfo dvi = QDataVisualizationInfo.dataVisualizationInfo;
QVisualizationLinkJumpTargetViewInfo vljtvi = QVisualizationLinkJumpTargetViewInfo.visualizationLinkJumpTargetViewInfo;
QXpackShare xpackShare = QXpackShare.xpackShare;
QVisualizationOuterParamsInfo vopi = QVisualizationOuterParamsInfo.visualizationOuterParamsInfo;
// 构建查询直接返回VisualizationLinkJumpInfoDTO
JPAQuery<VisualizationLinkJumpInfoExtendDTO> query = queryFactory
.select(Projections.bean(VisualizationLinkJumpInfoExtendDTO.class,
cdtf.id.as("sourceFieldId"),
cdtf.deType.as("sourceDeType"),
cdtf.name.as("sourceFieldName"),
vlji.id,
vlji.linkJumpId,
vlji.linkType,
vlji.jumpType,
vlji.windowSize,
vlji.targetDvId,
dvi.type.as("targetDvType"),
vlji.content,
Expressions.cases()
.when(vlji.checked.isNull()).then(false)
.otherwise(vlji.checked).as("checked"),
Expressions.cases()
.when(vlji.attachParams.isNull()).then(false)
.otherwise(vlji.attachParams).as("attachParams"),
vljtvi.targetId,
vljtvi.targetViewId,
vljtvi.targetFieldId,
vljtvi.targetType,
vljtvi.sourceFieldActiveId,
vopi.paramName.as("outerParamsName")
))
.from(ccv)
.leftJoin(cdtf).on(ccv.tableId.eq(cdtf.datasetGroupId))
.leftJoin(vlj).on(ccv.id.eq(vlj.sourceViewId).and(vlj.id.eq(id)))
.leftJoin(vlji).on(vlj.id.eq(vlji.linkJumpId).and(cdtf.id.eq(vlji.sourceFieldId)))
.leftJoin(dvi).on(vlji.targetDvId.eq(dvi.id))
.leftJoin(vljtvi).on(vlji.id.eq(vljtvi.linkJumpInfoId))
.leftJoin(vopi).on(vopi.paramsInfoId.eq(vljtvi.targetViewId));
// 动态添加 xpack_share 连接和字段(非桌面版)
if (!isDesktop) {
query.leftJoin(xpackShare).on(
xpackShare.creator.eq(uid)
.and(vlji.targetDvId.eq(xpackShare.resourceId))
);
// 重新构建select包含publicJumpId
query.select(Projections.bean(VisualizationLinkJumpInfoExtendDTO.class,
cdtf.id.as("sourceFieldId"),
cdtf.deType.as("sourceDeType"),
cdtf.name.as("sourceFieldName"),
vlji.id,
vlji.linkJumpId,
vlji.linkType,
vlji.jumpType,
vlji.windowSize,
vlji.targetDvId,
dvi.type.as("targetDvType"),
vlji.content,
Expressions.cases()
.when(vlji.checked.isNull()).then(false)
.otherwise(vlji.checked).as("checked"),
Expressions.cases()
.when(vlji.attachParams.isNull()).then(false)
.otherwise(vlji.attachParams).as("attachParams"),
vljtvi.targetId,
vljtvi.targetViewId,
vljtvi.targetFieldId,
vljtvi.targetType,
vljtvi.sourceFieldActiveId,
vopi.paramName.as("outerParamsName"),
xpackShare.uuid.as("publicJumpId")
));
}
query.where(ccv.id.eq(sourceViewId).and(ccv.type.ne("VQuery")));
query.orderBy(cdtf.name.asc());
return query.fetch();
}
private List<VisualizationLinkJumpInfoDTO> aggregateTargetViewInfo(List<VisualizationLinkJumpInfoExtendDTO> baseResults) {
// 使用分组键targetDvType + sourceFieldId + sourceDeType + sourceFieldName + publicJumpId
Map<String, VisualizationLinkJumpInfoDTO> groupMap = new LinkedHashMap<>();
@@ -406,24 +490,23 @@ public class VisualizationLinkJumpManage {
}
private List<VisualizationLinkJumpDTO> buildLinkJumpQuery(Long dvId, Long uid, Boolean isDesktop, boolean isSnapshot) {
if (isSnapshot) {
QSnapshotCoreChartView qChartView = QSnapshotCoreChartView.snapshotCoreChartView;
QSnapshotVisualizationLinkJump qJump = QSnapshotVisualizationLinkJump.snapshotVisualizationLinkJump;
QSnapshotCoreChartView ccv = QSnapshotCoreChartView.snapshotCoreChartView;
QSnapshotVisualizationLinkJump vlj = QSnapshotVisualizationLinkJump.snapshotVisualizationLinkJump;
List<VisualizationLinkJumpDTO> result = queryFactory
.select(Projections.bean(VisualizationLinkJumpDTO.class,
qChartView.id.as("sourceViewId"),
qJump.id,
ccv.id.as("sourceViewId"),
vlj.id,
Expressions.asNumber(dvId).as("sourceDvId"),
qJump.linkJumpInfo,
vlj.linkJumpInfo,
Expressions.cases()
.when(qJump.checked.isNull()).then(false)
.otherwise(qJump.checked).as("checked")
.when(ccv.jumpActive.isNull()).then(false)
.otherwise(ccv.jumpActive).as("checked")
))
.from(qChartView)
.leftJoin(qJump).on(qChartView.id.eq(qJump.sourceViewId))
.where(qJump.sourceDvId.eq(dvId))
.where(qChartView.jumpActive.eq(true)).fetch();
.from(ccv)
.leftJoin(vlj).on(ccv.id.eq(vlj.sourceViewId))
.where(vlj.sourceDvId.eq(dvId))
.where(ccv.jumpActive.eq(true)).fetch();
if (CollectionUtils.isNotEmpty(result)) {
result.stream().forEach(item -> {
item.setLinkJumpInfoArray(getLinkJumpInfoSnapshot(item.getId() == null ? -1 : item.getId(), item.getSourceViewId(), uid, isDesktop));
@@ -431,32 +514,33 @@ public class VisualizationLinkJumpManage {
}
return result;
} else {
QCoreChartView qChartView = QCoreChartView.coreChartView;
QVisualizationLinkJump qJump = QVisualizationLinkJump.visualizationLinkJump;
return queryFactory
QCoreChartView ccv = QCoreChartView.coreChartView;
QVisualizationLinkJump vlj = QVisualizationLinkJump.visualizationLinkJump;
List<VisualizationLinkJumpDTO> result = queryFactory
.select(Projections.bean(VisualizationLinkJumpDTO.class,
qChartView.id.as("sourceViewId"),
qJump.id,
ccv.id.as("sourceViewId"),
vlj.id,
Expressions.asNumber(dvId).as("sourceDvId"),
qJump.linkJumpInfo,
vlj.linkJumpInfo,
Expressions.cases()
.when(qJump.checked.isNull()).then(false)
.otherwise(qJump.checked).as("checked")
.when(ccv.jumpActive.isNull()).then(false)
.otherwise(ccv.jumpActive).as("checked")
))
.from(qChartView)
.leftJoin(qJump).on(qChartView.id.eq(qJump.sourceViewId))
.where(qJump.sourceDvId.eq(dvId))
.where(qChartView.jumpActive.eq(true)).fetch();
.from(ccv)
.leftJoin(vlj).on(ccv.id.eq(vlj.sourceViewId))
.where(vlj.sourceDvId.eq(dvId))
.where(ccv.jumpActive.eq(true)).fetch();
if (CollectionUtils.isNotEmpty(result)) {
result.stream().forEach(item -> {
item.setLinkJumpInfoArray(getLinkJumpInfo(item.getId() == null ? -1 : item.getId(), item.getSourceViewId(), uid, isDesktop));
});
}
return result;
}
}
public List<VisualizationLinkJumpInfoDTO> getLinkJumpInfo(String jumpId, Long sourceViewId, Long uid, Boolean isDesktop) {
return buildLinkJumpInfoQuery(jumpId, sourceViewId, uid, isDesktop, false).fetch();
}
public List<VisualizationLinkJumpInfoDTO> getLinkJumpInfoSnapshot(Long id, Long sourceViewId, Long uid, boolean isDesktop) {
// 查询所有基础数据
List<VisualizationLinkJumpInfoExtendDTO> baseResults = queryBaseLinkJumpInfoSnapshot(id, sourceViewId, uid, isDesktop);
@@ -464,10 +548,11 @@ public class VisualizationLinkJumpManage {
return aggregateTargetViewInfo(baseResults);
}
private JPAQuery<VisualizationLinkJumpInfoDTO> buildLinkJumpInfoQuery(String jumpId, Long sourceViewId, Long uid, Boolean isDesktop, boolean isSnapshot) {
return null;
public List<VisualizationLinkJumpInfoDTO> getLinkJumpInfo(Long id, Long sourceViewId, Long uid, boolean isDesktop) {
// 查询所有基础数据
List<VisualizationLinkJumpInfoExtendDTO> baseResults = queryBaseLinkJumpInfo(id, sourceViewId, uid, isDesktop);
// 按照指定字段分组并聚合targetViewInfoList
return aggregateTargetViewInfo(baseResults);
}
public void deleteJumpTargetViewInfoSnapshot(Long dvId, Long viewId) {

View File

@@ -150,54 +150,74 @@ public class VisualizationLinkJumpService implements VisualizationLinkJumpApi {
public VisualizationLinkJumpBaseResponse queryTargetVisualizationJumpInfo(VisualizationLinkJumpBaseRequest request) {
List<VisualizationLinkJumpDTO> result = null;
if (CommonConstants.RESOURCE_TABLE.SNAPSHOT.equals(request.getResourceTable())) {
QSnapshotVisualizationLinkJumpTargetViewInfo visualizationLinkJumpTargetViewInfo = QSnapshotVisualizationLinkJumpTargetViewInfo.snapshotVisualizationLinkJumpTargetViewInfo;
QSnapshotVisualizationLinkJumpInfo linkJumpInfo = QSnapshotVisualizationLinkJumpInfo.snapshotVisualizationLinkJumpInfo;
QSnapshotVisualizationLinkJump visualizationLinkJump = QSnapshotVisualizationLinkJump.snapshotVisualizationLinkJump;
QSnapshotVisualizationLinkJumpTargetViewInfo jtvi = QSnapshotVisualizationLinkJumpTargetViewInfo.snapshotVisualizationLinkJumpTargetViewInfo;
QSnapshotVisualizationLinkJumpInfo lji = QSnapshotVisualizationLinkJumpInfo.snapshotVisualizationLinkJumpInfo;
QSnapshotVisualizationLinkJump lj = QSnapshotVisualizationLinkJump.snapshotVisualizationLinkJump;
JPAQuery<VisualizationLinkJumpDTO> jpaQuery = queryFactory.select(
Projections.fields(VisualizationLinkJumpDTO.class,
visualizationLinkJump.sourceViewId.stringValue().concat("#").concat(visualizationLinkJumpTargetViewInfo.sourceFieldActiveId.stringValue()).as("sourceInfo"),
visualizationLinkJumpTargetViewInfo.targetViewId.stringValue().concat("#").concat(visualizationLinkJumpTargetViewInfo.targetFieldId.stringValue()).as("targetInfo")
lj.sourceViewId.stringValue().concat("#").concat(jtvi.sourceFieldActiveId.stringValue()).as("sourceInfo"),
jtvi.targetViewId.stringValue().concat("#").concat(jtvi.targetFieldId.stringValue()).as("targetInfo")
))
.from(visualizationLinkJumpTargetViewInfo)
.leftJoin(linkJumpInfo).on(visualizationLinkJumpTargetViewInfo.linkJumpInfoId.eq(linkJumpInfo.id))
.leftJoin(visualizationLinkJump).on(linkJumpInfo.linkJumpId.eq(visualizationLinkJump.id))
.where(linkJumpInfo.checked.eq(true))
.where(visualizationLinkJump.sourceDvId.eq(request.getSourceDvId()))
.where(visualizationLinkJump.sourceViewId.eq(request.getSourceViewId()))
.where(linkJumpInfo.targetDvId.eq(request.getTargetDvId()));
.from(jtvi)
.leftJoin(lji).on(jtvi.linkJumpInfoId.eq(lji.id))
.leftJoin(lj).on(lji.linkJumpId.eq(lj.id))
.where(lji.checked.eq(true))
.where(lj.sourceDvId.eq(request.getSourceDvId()))
.where(lj.sourceViewId.eq(request.getSourceViewId()))
.where(lji.targetDvId.eq(request.getTargetDvId()));
if (request.getSourceFieldId() != null) {
jpaQuery.where(linkJumpInfo.sourceFieldId.eq(request.getSourceFieldId()));
jpaQuery.where(lji.sourceFieldId.eq(request.getSourceFieldId()));
}
result = jpaQuery.fetch();
} else {
QVisualizationLinkJumpTargetViewInfo visualizationLinkJumpTargetViewInfo = QVisualizationLinkJumpTargetViewInfo.visualizationLinkJumpTargetViewInfo;
QVisualizationLinkJumpInfo linkJumpInfo = QVisualizationLinkJumpInfo.visualizationLinkJumpInfo;
QVisualizationLinkJump visualizationLinkJump = QVisualizationLinkJump.visualizationLinkJump;
QVisualizationLinkJumpTargetViewInfo jtvi = QVisualizationLinkJumpTargetViewInfo.visualizationLinkJumpTargetViewInfo;
QVisualizationLinkJumpInfo lji = QVisualizationLinkJumpInfo.visualizationLinkJumpInfo;
QVisualizationLinkJump lj = QVisualizationLinkJump.visualizationLinkJump;
JPAQuery<VisualizationLinkJumpDTO> jpaQuery = queryFactory.select(
Projections.fields(VisualizationLinkJumpDTO.class,
visualizationLinkJump.sourceViewId.stringValue().concat("#").concat(visualizationLinkJumpTargetViewInfo.sourceFieldActiveId.stringValue()).as("sourceInfo"),
visualizationLinkJumpTargetViewInfo.targetViewId.stringValue().concat("#").concat(visualizationLinkJumpTargetViewInfo.targetFieldId.stringValue()).as("targetInfo")
lj.sourceViewId.stringValue().concat("#").concat(jtvi.sourceFieldActiveId.stringValue()).as("sourceInfo"),
jtvi.targetViewId.stringValue().concat("#").concat(jtvi.targetFieldId.stringValue()).as("targetInfo")
))
.from(visualizationLinkJumpTargetViewInfo)
.leftJoin(linkJumpInfo).on(visualizationLinkJumpTargetViewInfo.linkJumpInfoId.eq(linkJumpInfo.id))
.leftJoin(visualizationLinkJump).on(linkJumpInfo.linkJumpId.eq(visualizationLinkJump.id))
.where(linkJumpInfo.checked.eq(true))
.where(visualizationLinkJump.sourceDvId.eq(request.getSourceDvId()))
.where(visualizationLinkJump.sourceViewId.eq(request.getSourceViewId()))
.where(linkJumpInfo.targetDvId.eq(request.getTargetDvId()));
.from(jtvi)
.leftJoin(lji).on(jtvi.linkJumpInfoId.eq(lji.id))
.leftJoin(lj).on(lji.linkJumpId.eq(lj.id))
.where(lji.checked.eq(true))
.where(lj.sourceDvId.eq(request.getSourceDvId()))
.where(lj.sourceViewId.eq(request.getSourceViewId()))
.where(lji.targetDvId.eq(request.getTargetDvId()));
if (request.getSourceFieldId() != null) {
jpaQuery.where(linkJumpInfo.sourceFieldId.eq(request.getSourceFieldId()));
jpaQuery.where(lji.sourceFieldId.eq(request.getSourceFieldId()));
}
result = jpaQuery.fetch();
}
return new VisualizationLinkJumpBaseResponse(null, Optional.ofNullable(result).orElse(new ArrayList<>()).stream().filter(item -> StringUtils.isNotEmpty(item.getSourceInfo())).collect(Collectors.toMap(VisualizationLinkJumpDTO::getSourceInfo, VisualizationLinkJumpDTO::getTargetInfoList)));
// 按sourceInfo分组聚合targetInfo
Map<String, List<String>> groupedResults = result.stream()
.collect(Collectors.groupingBy(
VisualizationLinkJumpDTO::getSourceInfo,
Collectors.mapping(
VisualizationLinkJumpDTO::getTargetInfo,
Collectors.toList()
)
));
// 创建新的VisualizationLinkJumpDTO列表每个包含sourceInfo和对应的targetInfo列表
List<VisualizationLinkJumpDTO> aggregatedResult = groupedResults.entrySet().stream()
.map(entry -> {
VisualizationLinkJumpDTO dto = new VisualizationLinkJumpDTO();
dto.setSourceInfo(entry.getKey());
dto.setTargetInfoList(entry.getValue());
return dto;
})
.collect(Collectors.toList());
return new VisualizationLinkJumpBaseResponse(null, Optional.ofNullable(aggregatedResult).orElse(new ArrayList<>()).stream().filter(item -> StringUtils.isNotEmpty(item.getSourceInfo())).collect(Collectors.toMap(VisualizationLinkJumpDTO::getSourceInfo, VisualizationLinkJumpDTO::getTargetInfoList)));
}
@Override

View File

@@ -17,6 +17,8 @@ public class VisualizationLinkJumpDTO extends VisualizationLinkJumpVO {
//仪表板可以跳转图表信息 sourceViewId#
private String sourceInfo;
private String targetInfo;
private List<String> targetInfoList;
private List<VisualizationLinkJumpInfoDTO> linkJumpInfoArray = new ArrayList<>();