diff --git a/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationLinkJumpManage.java b/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationLinkJumpManage.java index ac6da53383..e1803409cf 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationLinkJumpManage.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationLinkJumpManage.java @@ -348,6 +348,90 @@ public class VisualizationLinkJumpManage { return query.fetch(); } + private List 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 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 aggregateTargetViewInfo(List baseResults) { // 使用分组键:targetDvType + sourceFieldId + sourceDeType + sourceFieldName + publicJumpId Map groupMap = new LinkedHashMap<>(); @@ -406,24 +490,23 @@ public class VisualizationLinkJumpManage { } private List 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 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 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 getLinkJumpInfo(String jumpId, Long sourceViewId, Long uid, Boolean isDesktop) { - return buildLinkJumpInfoQuery(jumpId, sourceViewId, uid, isDesktop, false).fetch(); - } - public List getLinkJumpInfoSnapshot(Long id, Long sourceViewId, Long uid, boolean isDesktop) { // 查询所有基础数据 List baseResults = queryBaseLinkJumpInfoSnapshot(id, sourceViewId, uid, isDesktop); @@ -464,10 +548,11 @@ public class VisualizationLinkJumpManage { return aggregateTargetViewInfo(baseResults); } - private JPAQuery buildLinkJumpInfoQuery(String jumpId, Long sourceViewId, Long uid, Boolean isDesktop, boolean isSnapshot) { - - - return null; + public List getLinkJumpInfo(Long id, Long sourceViewId, Long uid, boolean isDesktop) { + // 查询所有基础数据 + List baseResults = queryBaseLinkJumpInfo(id, sourceViewId, uid, isDesktop); + // 按照指定字段分组并聚合targetViewInfoList + return aggregateTargetViewInfo(baseResults); } public void deleteJumpTargetViewInfoSnapshot(Long dvId, Long viewId) { diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/VisualizationLinkJumpService.java b/core/core-backend/src/main/java/io/dataease/visualization/server/VisualizationLinkJumpService.java index c02e83af65..a8e15e0e40 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/VisualizationLinkJumpService.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/VisualizationLinkJumpService.java @@ -150,54 +150,74 @@ public class VisualizationLinkJumpService implements VisualizationLinkJumpApi { public VisualizationLinkJumpBaseResponse queryTargetVisualizationJumpInfo(VisualizationLinkJumpBaseRequest request) { List 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 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 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> groupedResults = result.stream() + .collect(Collectors.groupingBy( + VisualizationLinkJumpDTO::getSourceInfo, + Collectors.mapping( + VisualizationLinkJumpDTO::getTargetInfo, + Collectors.toList() + ) + )); + + // 创建新的VisualizationLinkJumpDTO列表,每个包含sourceInfo和对应的targetInfo列表 + List 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 diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/dto/VisualizationLinkJumpDTO.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/dto/VisualizationLinkJumpDTO.java index a1ec64a271..a7d5c8936c 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/dto/VisualizationLinkJumpDTO.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/dto/VisualizationLinkJumpDTO.java @@ -17,6 +17,8 @@ public class VisualizationLinkJumpDTO extends VisualizationLinkJumpVO { //仪表板可以跳转图表信息 sourceViewId# private String sourceInfo; + private String targetInfo; + private List targetInfoList; private List linkJumpInfoArray = new ArrayList<>();