diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java index 6d5dc52075..aa8e94470b 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java @@ -52,6 +52,7 @@ import io.dataease.visualization.dao.auto.mapper.DataVisualizationInfoMapper; import io.dataease.visualization.dao.auto.mapper.VisualizationWatermarkMapper; import io.dataease.visualization.dao.ext.mapper.ExtDataVisualizationMapper; import io.dataease.visualization.manage.CoreVisualizationManage; +import io.dataease.visualization.utils.VisualizationUtils; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -63,6 +64,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -172,18 +174,20 @@ public class DataVisualizationServer implements DataVisualizationApi { @Override @Transactional public String saveCanvas(DataVisualizationBaseRequest request) throws Exception{ - Boolean isAppSave = false; + boolean isAppSave = false; Long time = System.currentTimeMillis(); // 如果是应用 则新进行应用校验 数据集名称和 数据源名称校验 VisualizationExport2AppVO appData = request.getAppData(); Map dsGroupIdMap = new HashMap<>(); + List newDsGroupInfo = new ArrayList<>(); Map dsTableIdMap = new HashMap<>(); Map dsTableFieldsIdMap = new HashMap<>(); + Map datasourceIdMap = new HashMap<>(); if(appData != null){ isAppSave = true; try { - Map datasourceIdMap = appData.getDatasourceInfo().stream() - .collect(Collectors.toMap(AppCoreDatasourceVO::getId, AppCoreDatasourceVO::getSystemDatasourceId)); + datasourceIdMap.putAll(appData.getDatasourceInfo().stream() + .collect(Collectors.toMap(AppCoreDatasourceVO::getId, AppCoreDatasourceVO::getSystemDatasourceId))); Long datasetFolderPid = request.getDatasetFolderPid(); String datasetFolderName = request.getDatasetFolderName(); QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -213,7 +217,7 @@ public class DataVisualizationServer implements DataVisualizationApi { datasetNewRequest.setLastUpdateTime(time); datasetNewRequest.setPid(datasetFolderNewId); try { - datasetGroupManage.innerSave(datasetNewRequest); + newDsGroupInfo.add(datasetNewRequest); dsGroupIdMap.put(oldId,newId); } catch (Exception e) { throw new RuntimeException(e); @@ -247,8 +251,22 @@ public class DataVisualizationServer implements DataVisualizationApi { coreDatasetTableFieldMapper.insert(dsDsField); dsTableFieldsIdMap.put(oldId,newId); }); + + // 持久化数据集 + newDsGroupInfo.forEach(dsGroup ->{ + dsTableIdMap.forEach((key,value) ->{ + dsGroup.setInfo(dsGroup.getInfo().replaceAll(key.toString(),value.toString())); + }); + + dsTableFieldsIdMap.forEach((key,value) ->{ + dsGroup.setInfo(dsGroup.getInfo().replaceAll(key.toString(),value.toString())); + }); + datasetGroupManage.innerSave(dsGroup); + }); + }catch (Exception e){ - DEException.throwException("应用创建失败"); + LogUtil.error(e); + DEException.throwException(e); } } DataVisualizationInfo visualizationInfo = new DataVisualizationInfo(); @@ -266,16 +284,36 @@ public class DataVisualizationServer implements DataVisualizationApi { } Long newDvId = coreVisualizationManage.innerSave(visualizationInfo); request.setId(newDvId); - // TODO 还原ID信息 + // 还原ID信息 + Map canvasViews = request.getCanvasViewInfo(); if(isAppSave){ - request.getCanvasViewInfo().forEach((key,viewInfo) ->{ - viewInfo.setTableId(dsGroupIdMap.get(viewInfo.getTableId())); - viewInfo.setDataFrom("dataset"); + Map canvasViewsStr = VisualizationUtils.viewTransToStr(canvasViews); + canvasViewsStr.forEach((viewId,viewInfoStr) ->{ + AtomicReference mutableViewInfoStr = new AtomicReference<>(viewInfoStr); + datasourceIdMap.forEach((key,value) ->{ + mutableViewInfoStr.set(mutableViewInfoStr.get().replaceAll(key.toString(), value.toString())); + }); + dsTableIdMap.forEach((key,value) ->{ + mutableViewInfoStr.set(mutableViewInfoStr.get().replaceAll(key.toString(), value.toString())); + }); + dsTableFieldsIdMap.forEach((key,value) ->{ + mutableViewInfoStr.set(mutableViewInfoStr.get().replaceAll(key.toString(), value.toString())); + }); + dsGroupIdMap.forEach((key,value) ->{ + mutableViewInfoStr.set(mutableViewInfoStr.get().replaceAll(key.toString(), value.toString())); + }); + canvasViewsStr.put(viewId, mutableViewInfoStr.get()); + }); + canvasViews = VisualizationUtils.viewTransToObj(canvasViewsStr); + canvasViews.forEach((key,viewInfo) ->{ + viewInfo.setDataFrom("dataset"); + if(viewInfo.getTableId() == null){ + viewInfo.setTableId(viewInfo.getSourceTableId()); + } }); - } //保存图表信息 - chartDataManage.saveChartViewFromVisualization(request.getComponentData(), newDvId, request.getCanvasViewInfo()); + chartDataManage.saveChartViewFromVisualization(request.getComponentData(), newDvId, canvasViews); return newDvId.toString(); } @@ -485,7 +523,9 @@ public class DataVisualizationServer implements DataVisualizationApi { Long newViewId = IDUtils.snowID(); chartView.setId(newViewId); chartView.setSceneId(newDvId); + chartView.setSourceTableId(chartView.getTableId()); chartView.setTableId(null); + chartView.setDataFrom(CommonConstants.VIEW_DATA_FROM.TEMPLATE); // 数据处理 1.替换viewId 2.加入模板view data数据 VisualizationTemplateExtendDataDTO extendDataDTO = new VisualizationTemplateExtendDataDTO(newDvId, newViewId, originViewData); diff --git a/core/core-frontend/src/components/dashboard/DbToolbar.vue b/core/core-frontend/src/components/dashboard/DbToolbar.vue index 26ff589169..059639c726 100644 --- a/core/core-frontend/src/components/dashboard/DbToolbar.vue +++ b/core/core-frontend/src/components/dashboard/DbToolbar.vue @@ -2,7 +2,7 @@ import { ElMessage, ElMessageBox } from 'element-plus-secondary' import eventBus from '@/utils/eventBus' import { deepCopy } from '@/utils/utils' -import { nextTick, reactive, ref, computed } from 'vue' +import { nextTick, reactive, ref, computed, toRefs } from 'vue' import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain' import { useAppStoreWithOut } from '@/store/modules/app' import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot' @@ -19,7 +19,7 @@ import MultiplexingCanvas from '@/views/common/MultiplexingCanvas.vue' import { useI18n } from '@/hooks/web/useI18n' import { getPanelAllLinkageInfo, saveLinkage } from '@/api/visualization/linkage' import { queryVisualizationJumpInfo } from '@/api/visualization/linkJump' -import { canvasSave } from '@/utils/canvasUtils' +import { canvasSave, initCanvasData } from '@/utils/canvasUtils' import { useEmitt } from '@/hooks/web/useEmitt' import { copyStoreWithOut } from '@/store/modules/data-visualization/copy' import TabsGroup from '@/custom-component/component-group/TabsGroup.vue' @@ -29,11 +29,13 @@ import { XpackComponent } from '@/components/plugin' import DbMoreComGroup from '@/custom-component/component-group/DbMoreComGroup.vue' import { useCache } from '@/hooks/web/useCache' import DeFullscreen from '@/components/visualization/common/DeFullscreen.vue' +import DeAppApply from '@/views/common/DeAppApply.vue' const { t } = useI18n() const dvMainStore = dvMainStoreWithOut() const snapshotStore = snapshotStoreWithOut() const copyStore = copyStoreWithOut() const { styleChangeTimes, snapshotIndex } = storeToRefs(snapshotStore) +const resourceAppOpt = ref(null) const { linkageSettingStatus, curLinkageView, @@ -43,7 +45,8 @@ const { editMode, batchOptStatus, targetLinkageInfo, - curBatchOptComponents + curBatchOptComponents, + appData } = storeToRefs(dvMainStore) const dvModel = 'dashboard' const multiplexingRef = ref(null) @@ -59,6 +62,15 @@ const resourceGroupOpt = ref(null) const outerParamsSetRef = ref(null) const { wsCache } = useCache('localStorage') +const props = defineProps({ + createType: { + type: String, + default: 'create' + } +}) + +const { createType } = toRefs(props) + const editCanvasName = () => { nameEdit.value = true inputName.value = dvInfo.value.name @@ -143,9 +155,23 @@ const resourceOptFinish = param => { const saveCanvasWithCheck = () => { if (dvInfo.value.dataState === 'prepare') { - const params = { name: dvInfo.value.name, leaf: true, id: dvInfo.value.pid } - resourceGroupOpt.value.optInit('leaf', params, 'newLeaf', true) - return + if (appData.value) { + // 应用保存 + const params = { + base: { + pid: '', + name: dvInfo.value.name, + datasetFolderPid: null, + datasetFolderName: dvInfo.value.name + }, + appData: appData.value + } + resourceAppOpt.value.init(params) + } else { + const params = { name: dvInfo.value.name, leaf: true, id: dvInfo.value.pid } + resourceGroupOpt.value.optInit('leaf', params, 'newLeaf', true) + return + } } saveResource() } @@ -163,6 +189,12 @@ const saveResource = () => { snapshotStore.resetStyleChangeTimes() ElMessage.success('保存成功') window.history.pushState({}, '', `#/dashboard?resourceId=${dvInfo.value.id}`) + if (appData.value) { + initCanvasData(dvInfo.value.id, 'dashboard', () => { + useEmitt().emitter.emit('refresh-dataset-selector') + resourceAppOpt.value.close() + }) + } }) } } @@ -623,6 +655,14 @@ const initOpenHandler = newWindow => { +