fix(仪表板、数据大屏): 修复外部参数设置问题 (#17295)

This commit is contained in:
王嘉豪
2025-10-29 14:49:55 +08:00
committed by GitHub
parent f60b1ba615
commit dc5e180e84
4 changed files with 79 additions and 54 deletions

View File

@@ -41,9 +41,8 @@ public class SnapshotVisualizationOuterParamsTargetViewInfo {
@Column(name = "copy_id", length = 50)
private String copyId;
@Size(max = 50)
@Comment("联动数据集id/联动过滤组件id")
@Column(name = "target_ds_id", length = 50)
private String targetDsId;
@Column(name = "target_ds_id")
private Long targetDsId;
}

View File

@@ -16,7 +16,6 @@ import org.hibernate.annotations.Comment;
@Table(name = "visualization_outer_params_target_view_info")
public class VisualizationOuterParamsTargetViewInfo {
@Id
@Size(max = 50)
@Comment("主键")
@Column(name = "target_id", nullable = false)
private Long targetId;
@@ -43,9 +42,8 @@ public class VisualizationOuterParamsTargetViewInfo {
@Column(name = "copy_id", length = 50)
private String copyId;
@Size(max = 50)
@Comment("联动数据集id/联动过滤组件id")
@Column(name = "target_ds_id", length = 50)
private String targetDsId;
@Column(name = "target_ds_id")
private Long targetDsId;
}

View File

@@ -11,6 +11,7 @@ import io.dataease.api.visualization.VisualizationOuterParamsApi;
import io.dataease.api.visualization.dto.VisualizationOuterParamsDTO;
import io.dataease.api.visualization.dto.VisualizationOuterParamsInfoDTO;
import io.dataease.api.visualization.response.VisualizationOuterParamsBaseResponse;
import io.dataease.api.visualization.vo.VisualizationOuterParamsTargetViewInfoVO;
import io.dataease.auth.DeLinkPermit;
import io.dataease.constant.CommonConstants;
import io.dataease.dao.auto.entity.CoreDatasetTable;
@@ -57,6 +58,10 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
private DataVisualizationServer dataVisualizationServer;
private static final QSnapshotVisualizationOuterParams qOuterParams = QSnapshotVisualizationOuterParams.snapshotVisualizationOuterParams;
private static final QSnapshotVisualizationOuterParamsInfo qOuterParamsInfo = QSnapshotVisualizationOuterParamsInfo.snapshotVisualizationOuterParamsInfo;
private static final QSnapshotVisualizationOuterParamsTargetViewInfo qTargetViewInfo = QSnapshotVisualizationOuterParamsTargetViewInfo.snapshotVisualizationOuterParamsTargetViewInfo;
@Override
public VisualizationOuterParamsDTO queryWithVisualizationId(Long visualizationId) {
QSnapshotDataVisualizationInfo qSnapshotDataVisualizationInfo = QSnapshotDataVisualizationInfo.snapshotDataVisualizationInfo;
@@ -70,9 +75,70 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
if (visualizationOuterParamsDTO != null && visualizationOuterParamsDTO.getChecked() == null) {
visualizationOuterParamsDTO.setChecked(false);
}
visualizationOuterParamsDTO.setOuterParamsInfoArray(getOuterParamsInfoSnapshot(visualizationId));
return visualizationOuterParamsDTO;
}
private VisualizationOuterParamsTargetViewInfoVO convertToVO(SnapshotVisualizationOuterParamsTargetViewInfo entity) {
if (entity == null) {
return null;
}
VisualizationOuterParamsTargetViewInfoVO vo = new VisualizationOuterParamsTargetViewInfoVO();
BeanUtils.copyBean(vo, entity);
return vo;
}
public List<VisualizationOuterParamsInfoDTO> getOuterParamsInfoSnapshot(Long visualizationId) {
// 第一步:查询主表数据
List<SnapshotVisualizationOuterParamsInfo> paramsInfoList = queryFactory
.select(Projections.bean(SnapshotVisualizationOuterParamsInfo.class,
qOuterParamsInfo.paramsInfoId,
qOuterParamsInfo.paramName,
qOuterParamsInfo.enabledDefault,
qOuterParamsInfo.required,
qOuterParamsInfo.defaultValue,
Expressions.booleanTemplate("ifnull({0}, 0)", qOuterParamsInfo.checked).as("checked")))
.from(qOuterParams)
.leftJoin(qOuterParamsInfo).on(qOuterParams.paramsId.eq(qOuterParamsInfo.paramsId))
.where(qOuterParams.visualizationId.eq(visualizationId))
.orderBy(Expressions.numberTemplate(Integer.class, "ifnull({0}, 0)", qOuterParamsInfo.checked).desc())
.fetch();
if (paramsInfoList.isEmpty()) {
return Collections.emptyList();
}
// 第二步:查询关联的目标视图信息
List<Long> paramsInfoIds = paramsInfoList.stream()
.map(SnapshotVisualizationOuterParamsInfo::getParamsInfoId)
.collect(Collectors.toList());
List<SnapshotVisualizationOuterParamsTargetViewInfo> targetViewInfoList = queryFactory
.select(Projections.bean(SnapshotVisualizationOuterParamsTargetViewInfo.class,
qTargetViewInfo.targetViewId,
qTargetViewInfo.targetDsId,
qTargetViewInfo.targetFieldId,
qTargetViewInfo.paramsInfoId))
.from(qTargetViewInfo)
.where(qTargetViewInfo.paramsInfoId.in(paramsInfoIds))
.fetch();
Map<Long, List<VisualizationOuterParamsTargetViewInfoVO>> targetViewInfoMap = targetViewInfoList.stream()
.collect(Collectors.groupingBy(
SnapshotVisualizationOuterParamsTargetViewInfo::getParamsInfoId,
Collectors.mapping(this::convertToVO, Collectors.toList())
));
return paramsInfoList.stream().map(info -> {
VisualizationOuterParamsInfoDTO dto = new VisualizationOuterParamsInfoDTO();
BeanUtils.copyBean(dto, info);
dto.setTargetViewInfoList(targetViewInfoMap.getOrDefault(info.getParamsInfoId(), Collections.emptyList()));
return dto;
}).collect(Collectors.toList());
}
@Override
public void updateOuterParamsSet(VisualizationOuterParamsDTO outerParamsDTO) {
Long visualizationId = outerParamsDTO.getVisualizationId();
@@ -94,7 +160,7 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
QSnapshotVisualizationOuterParamsInfo snapshotVisualizationOuterParamsInfo = QSnapshotVisualizationOuterParamsInfo.snapshotVisualizationOuterParamsInfo;
QSnapshotVisualizationOuterParams snapshotVisualizationOuterParams = QSnapshotVisualizationOuterParams.snapshotVisualizationOuterParams;
QSnapshotVisualizationOuterParamsTargetViewInfo snapshotVisualizationOuterParamsTargetViewInfo = QSnapshotVisualizationOuterParamsTargetViewInfo.snapshotVisualizationOuterParamsTargetViewInfo;
List<Long> paramsInfoIds = queryFactory.select(snapshotVisualizationOuterParamsTargetViewInfo.targetId).from(snapshotVisualizationOuterParamsTargetViewInfo)
List<Long> paramsInfoIds = queryFactory.select(snapshotVisualizationOuterParamsTargetViewInfo.paramsInfoId).from(snapshotVisualizationOuterParamsTargetViewInfo)
.innerJoin(snapshotVisualizationOuterParamsInfo).on(snapshotVisualizationOuterParamsTargetViewInfo.paramsInfoId.eq(snapshotVisualizationOuterParamsInfo.paramsInfoId))
.innerJoin(snapshotVisualizationOuterParams).on(snapshotVisualizationOuterParamsInfo.paramsId.eq(snapshotVisualizationOuterParams.paramsId))
.where(snapshotVisualizationOuterParams.visualizationId.eq(visualizationId)).fetch();
@@ -218,9 +284,9 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
.and(ccv.type.ne("VQuery"))
.and(dvi.id.eq(visualizationId))
.and(Expressions.booleanTemplate(
"{0} like concat('%', {1}, '%')",
dvi.componentData,
ccv.id)))
"{0} like concat('%', {1}, '%')",
dvi.componentData,
ccv.id)))
.distinct()
.fetch();
}
@@ -256,7 +322,7 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
qSnapshotCoreChartView.id
)).fetch();
if (!CollectionUtils.isEmpty(result)) {
result.stream().forEach(item ->{
result.stream().forEach(item -> {
item.setDatasetViews(getViewInfo(item.getId(), visualizationId));
item.setDatasetFields(getDsFieldInfo(item.getId()));
});

View File

@@ -334,7 +334,7 @@ import edit from '@/assets/svg/icon_rename_outlined.svg'
import icon_more_vertical_outlined from '@/assets/svg/icon_more-vertical_outlined.svg'
import filterParams from '@/assets/svg/filter-params.svg'
import icon_dataset from '@/assets/svg/icon_dataset.svg'
import { ref, reactive, computed, nextTick } from 'vue'
import { ref, reactive, nextTick } from 'vue'
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
import { storeToRefs } from 'pinia'
import { ElCol, ElIcon, ElInput, ElMessage } from 'element-plus-secondary'
@@ -472,10 +472,6 @@ const validateArgs = (val, id) => {
}
}
const viewSelectedField = computed(() =>
state.outerParamsInfo?.targetViewInfoList?.map(targetViewInfo => targetViewInfo.targetViewId)
)
const closeEdit = params => {
if (!params.paramName || params.paramName.length < 2 || params.paramName.length > 25) {
ElMessage({
@@ -499,18 +495,6 @@ const outerParamsOperation = (cmd, node, data) => {
}
}
const fieldIdDisabledCheck = targetViewInfo => {
return (
state.viewIdFieldArrayMap[targetViewInfo.targetViewId] &&
state.viewIdFieldArrayMap[targetViewInfo.targetViewId].length === 1 &&
state.viewIdFieldArrayMap[targetViewInfo.targetViewId][0].id === 'empty'
)
}
const getFieldArray = id => {
return state.viewIdFieldArrayMap[id]
}
const initParams = async () => {
state.baseFilterInfo = []
state.baseDatasetInfo = []
@@ -519,13 +503,13 @@ const initParams = async () => {
if (componentItem.component === 'VQuery') {
state.baseFilterInfo.push(componentItem)
} else if (componentItem.component === 'Group') {
componentItem.propValue?.forEach(groupItem => {
componentItem.propValue.forEach(groupItem => {
if (groupItem.component === 'VQuery') {
state.baseFilterInfo.push(groupItem)
}
})
} else if (componentItem.component === 'DeTabs') {
componentItem.propValue?.forEach(tabItem => {
componentItem.propValue.forEach(tabItem => {
tabItem.componentData?.forEach(tabComponent => {
if (tabComponent.component === 'VQuery') {
state.baseFilterInfo.push(tabComponent)
@@ -722,7 +706,7 @@ const getPanelViewList = dvId => {
// 增加过滤组件匹配
componentData.value.forEach(componentItem => {
if (componentItem.component === 'VQuery') {
componentItem.propValue?.forEach(filterItem => {
componentItem.propValue.forEach(filterItem => {
state.currentLinkPanelViewArray.push({
id: filterItem.id,
type: 'filter',
@@ -738,28 +722,6 @@ const getPanelViewList = dvId => {
})
}
const addOuterParamsField = () => {
state.outerParamsInfo.targetViewInfoList.push({
targetViewId: '',
targetFieldId: ''
})
}
const deleteOuterParamsField = index => {
state.outerParamsInfo.targetViewInfoList.splice(index, 1)
}
const viewInfoOnChange = targetViewInfo => {
if (
state.viewIdFieldArrayMap[targetViewInfo.targetViewId] &&
state.viewIdFieldArrayMap[targetViewInfo.targetViewId].length === 1 &&
state.viewIdFieldArrayMap[targetViewInfo.targetViewId][0].id === 'empty'
) {
targetViewInfo.targetFieldId = 'empty'
} else {
targetViewInfo.targetFieldId = null
}
}
const initSelected = data => {
nextTick(() => {
outerParamsInfoTree.value.setCurrentKey(data.paramsInfoId)