diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java
index 2fb6c13528..024d821ff2 100644
--- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java
+++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java
@@ -80,6 +80,7 @@ public class DatasetGroupManage {
private Lock lock = new ReentrantLock();
+ @Transactional
public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetGroupInfoDTO, boolean rename) throws Exception {
lock.lock();
try {
diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java
index 5a4ced5f44..31d386df96 100644
--- a/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java
+++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java
@@ -9,7 +9,7 @@ import java.io.Serializable;
*
*
* @author fit2cloud
- * @since 2024-07-16
+ * @since 2024-07-17
*/
@TableName("visualization_template")
public class VisualizationTemplate implements Serializable {
diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java
index 28f93143c7..c4ef398bb9 100644
--- a/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java
+++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java
@@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper;
*
*
* @author fit2cloud
- * @since 2024-07-16
+ * @since 2024-07-17
*/
@Mapper
public interface VisualizationTemplateMapper extends BaseMapper {
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 1c647fe4fb..1400bfdd28 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
@@ -2,8 +2,16 @@ package io.dataease.visualization.server;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.gson.Gson;
+import io.dataease.api.dataset.union.DatasetGroupInfoDTO;
import io.dataease.api.visualization.request.VisualizationAppExportRequest;
import io.dataease.api.visualization.vo.*;
+import io.dataease.dataset.dao.auto.entity.CoreDatasetGroup;
+import io.dataease.dataset.dao.auto.entity.CoreDatasetTable;
+import io.dataease.dataset.dao.auto.entity.CoreDatasetTableField;
+import io.dataease.dataset.dao.auto.mapper.CoreDatasetGroupMapper;
+import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper;
+import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableMapper;
import io.dataease.dataset.manage.DatasetDataManage;
import io.dataease.dataset.manage.DatasetGroupManage;
import io.dataease.extensions.datasource.dto.DatasetTableDTO;
@@ -37,6 +45,7 @@ import io.dataease.template.dao.auto.mapper.VisualizationTemplateMapper;
import io.dataease.template.dao.ext.ExtVisualizationTemplateMapper;
import io.dataease.template.manage.TemplateCenterManage;
import io.dataease.utils.*;
+import io.dataease.visualization.dao.auto.entity.CoreStore;
import io.dataease.visualization.dao.auto.entity.DataVisualizationInfo;
import io.dataease.visualization.dao.auto.entity.VisualizationWatermark;
import io.dataease.visualization.dao.auto.mapper.DataVisualizationInfoMapper;
@@ -45,6 +54,7 @@ import io.dataease.visualization.dao.ext.mapper.ExtDataVisualizationMapper;
import io.dataease.visualization.manage.CoreVisualizationManage;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody;
@@ -104,6 +114,15 @@ public class DataVisualizationServer implements DataVisualizationApi {
@Resource
private ExtVisualizationTemplateMapper appTemplateMapper;
+ @Resource
+ private CoreDatasetGroupMapper coreDatasetGroupMapper;
+
+ @Resource
+ private CoreDatasetTableMapper coreDatasetTableMapper;
+
+ @Resource
+ private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper;
+
@Override
public DataVisualizationVO findCopyResource(Long dvId, String busiFlag) {
DataVisualizationVO result = findById(new DataVisualizationBaseRequest(dvId, busiFlag));
@@ -152,7 +171,84 @@ public class DataVisualizationServer implements DataVisualizationApi {
@DeLog(id = "#p0.id", pid = "#p0.pid", ot = LogOT.CREATE, stExp = "#p0.type")
@Override
@Transactional
- public String saveCanvas(DataVisualizationBaseRequest request) {
+ public String saveCanvas(DataVisualizationBaseRequest request) throws Exception{
+ Long time = System.currentTimeMillis();
+ // 如果是应用 则新进行应用校验 数据集名称和 数据源名称校验
+ VisualizationExport2AppVO appData = request.getAppData();
+ Map dsGroupIdMap = new HashMap<>();
+ Map dsTableIdMap = new HashMap<>();
+ Map dsTableFieldsIdMap = new HashMap<>();
+ if(appData != null){
+ try {
+ Map datasourceIdMap = appData.getDatasourceInfo().stream()
+ .collect(Collectors.toMap(AppCoreDatasourceVO::getId, AppCoreDatasourceVO::getSystemDatasourceId));
+ Long datasetFolderPid = request.getDatasetFolderPid();
+ String datasetFolderName = request.getDatasetFolderName();
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("name", datasetFolderName);
+ queryWrapper.eq("pid", datasetFolderPid);
+ if (coreDatasetGroupMapper.exists(queryWrapper)) {
+ DEException.throwException("当前数据集分组名称已存在");
+ }
+ //新建数据集分组
+ DatasetGroupInfoDTO datasetFolderNewRequest = new DatasetGroupInfoDTO();
+ datasetFolderNewRequest.setName(datasetFolderName);
+ datasetFolderNewRequest.setNodeType("folder");
+ datasetFolderNewRequest.setPid(datasetFolderPid);
+ DatasetGroupInfoDTO datasetFolderNew = datasetGroupManage.save(datasetFolderNewRequest, false);
+ Long datasetFolderNewId = datasetFolderNew.getId();
+ //新建数据集
+ appData.getDatasetGroupsInfo().forEach(appDatasetGroup -> {
+ if ("dataset".equals(appDatasetGroup.getNodeType())) {
+ Long oldId = appDatasetGroup.getId();
+ Long newId = IDUtils.snowID();
+ DatasetGroupInfoDTO datasetNewRequest = new DatasetGroupInfoDTO();
+ BeanUtils.copyBean(datasetNewRequest, appDatasetGroup);
+ datasetNewRequest.setId(newId);
+ datasetNewRequest.setCreateBy(AuthUtils.getUser().getUserId() + "");
+ datasetNewRequest.setUpdateBy(AuthUtils.getUser().getUserId() + "");
+ datasetNewRequest.setCreateTime(time);
+ datasetNewRequest.setLastUpdateTime(time);
+ datasetNewRequest.setPid(datasetFolderNewId);
+ try {
+ datasetGroupManage.innerSave(datasetNewRequest);
+ dsGroupIdMap.put(oldId,newId);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ });
+ // 新建数据集表
+ appData.getDatasetTablesInfo().forEach(appCoreDatasetTableVO -> {
+ Long oldId = appCoreDatasetTableVO.getId();
+ Long newId = IDUtils.snowID();
+ CoreDatasetTable datasetTable = new CoreDatasetTable();
+ BeanUtils.copyBean(datasetTable,appCoreDatasetTableVO);
+ datasetTable.setDatasetGroupId(dsGroupIdMap.get(datasetTable.getDatasetGroupId()));
+ datasetTable.setId(newId);
+ datasetTable.setDatasourceId(datasourceIdMap.get(datasetTable.getDatasourceId()));
+ coreDatasetTableMapper.insert(datasetTable);
+ dsTableIdMap.put(oldId,newId);
+
+ });
+ // 新建数据字段
+ appData.getDatasetTableFieldsInfo().forEach( appDsTableFields ->{
+ Long oldId = appDsTableFields.getId();
+ Long newId = IDUtils.snowID();
+ CoreDatasetTableField dsDsField = new CoreDatasetTableField();
+ BeanUtils.copyBean(dsDsField,appDsTableFields);
+ dsDsField.setDatasetGroupId(dsGroupIdMap.get(dsDsField.getDatasetGroupId()));
+ dsDsField.setDatasetTableId(dsTableIdMap.get(dsDsField.getDatasetTableId()));
+ dsDsField.setDatasourceId(datasourceIdMap.get(dsDsField.getDatasourceId()));
+ dsDsField.setId(newId);
+ coreDatasetTableFieldMapper.insert(dsDsField);
+ dsTableFieldsIdMap.put(oldId,newId);
+ });
+ }catch (Exception e){
+ DEException.throwException("应用创建失败");
+ }
+ }
DataVisualizationInfo visualizationInfo = new DataVisualizationInfo();
BeanUtils.copyBean(visualizationInfo, request);
visualizationInfo.setNodeType(request.getNodeType() == null ? DataVisualizationConstants.NODE_TYPE.LEAF : request.getNodeType());
@@ -168,6 +264,7 @@ public class DataVisualizationServer implements DataVisualizationApi {
}
Long newDvId = coreVisualizationManage.innerSave(visualizationInfo);
request.setId(newDvId);
+ // TODO 还原ID信息
//保存图表信息
chartDataManage.saveChartViewFromVisualization(request.getComponentData(), newDvId, request.getCanvasViewInfo());
return newDvId.toString();
@@ -378,6 +475,11 @@ public class DataVisualizationServer implements DataVisualizationApi {
VisualizationTemplateExtendDataDTO extendDataDTO = new VisualizationTemplateExtendDataDTO(newDvId, newViewId, originViewData);
extendDataInfo.put(newViewId, extendDataDTO);
templateData = templateData.replaceAll(originViewId, newViewId.toString());
+ if(appData != null){
+ Map appDataFormat = JsonUtil.parse(appData,Map.class);
+ String sourceDvId = (String) appDataFormat.get("id");
+ appData = appData.replaceAll(originViewId, newViewId.toString()).replaceAll(sourceDvId, newDvId.toString());
+ }
canvasViewInfo.put(chartView.getId(), chartView);
//插入模板数据 此处预先插入减少数据交互量
VisualizationTemplateExtendData extendData = new VisualizationTemplateExtendData();
diff --git a/core/core-frontend/src/components/data-visualization/DvToolbar.vue b/core/core-frontend/src/components/data-visualization/DvToolbar.vue
index 2c175ab540..b0d73c0694 100644
--- a/core/core-frontend/src/components/data-visualization/DvToolbar.vue
+++ b/core/core-frontend/src/components/data-visualization/DvToolbar.vue
@@ -1,7 +1,7 @@