From 879ae12718ac57e0a3621e769099266432471f2e Mon Sep 17 00:00:00 2001 From: taojinlong Date: Mon, 17 Feb 2025 16:00:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E9=A3=9E=E4=B9=A6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/manage/DatasetDataManage.java | 5 +- .../dataset/manage/DatasetSQLManage.java | 2 +- .../manage/DatasourceSyncManage.java | 29 ++-- .../datasource/provider/ApiUtils.java | 33 +++- .../provider/MysqlEngineProvider.java | 3 +- .../datasource/server/DatasourceServer.java | 155 ++++++++++++++--- .../server/DataVisualizationServer.java | 22 +-- .../utils/VisualizationUtils.java | 25 ++- core/core-frontend/src/locales/zh-CN.ts | 10 +- .../data/datasource/form/CreatDsGroup.vue | 2 +- .../data/datasource/form/EditorDetail.vue | 159 ++++++++++++++++-- .../visualized/data/datasource/form/index.vue | 33 ++-- .../visualized/data/datasource/index.vue | 21 ++- .../io/dataease/api/ds/DatasourceApi.java | 1 + .../datasource/dto}/ApiDefinition.java | 7 +- .../datasource/dto}/ApiDefinitionRequest.java | 2 +- .../datasource/dto/DatasourceRequest.java | 1 + .../plugin/DataEaseDatasourcePlugin.java | 18 +- 18 files changed, 409 insertions(+), 119 deletions(-) rename sdk/{api/api-base/src/main/java/io/dataease/api/ds/vo => extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto}/ApiDefinition.java (84%) rename sdk/{api/api-base/src/main/java/io/dataease/api/ds/vo => extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto}/ApiDefinitionRequest.java (96%) diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java index 01dd1dee19..27b34ee420 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java @@ -34,6 +34,7 @@ import io.dataease.extensions.datasource.dto.*; import io.dataease.extensions.datasource.factory.ProviderFactory; import io.dataease.extensions.datasource.model.SQLMeta; import io.dataease.extensions.datasource.provider.Provider; +import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import io.dataease.extensions.view.dto.ChartExtFilterDTO; import io.dataease.extensions.view.dto.ChartExtRequest; import io.dataease.extensions.view.dto.ColumnPermissionItem; @@ -103,7 +104,7 @@ public class DatasetDataManage { if (StringUtils.equalsIgnoreCase(type, DatasetTableType.DB) || StringUtils.equalsIgnoreCase(type, DatasetTableType.SQL)) { CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(datasetTableDTO.getDatasourceId()); DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); - if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || StringUtils.equalsIgnoreCase("api", coreDatasource.getType())) { + if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { coreDatasource = engineManage.getDeEngine(); } if (StringUtils.isNotEmpty(coreDatasource.getStatus()) && "Error".equalsIgnoreCase(coreDatasource.getStatus())) { @@ -406,7 +407,7 @@ public class DatasetDataManage { public Map previewSql(PreviewSqlDTO dto) throws DEException { CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dto.getDatasourceId()); DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); - if (coreDatasource.getType().equalsIgnoreCase("API") || coreDatasource.getType().equalsIgnoreCase("Excel")) { + if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().equalsIgnoreCase("Excel")) { BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine()); } else { BeanUtils.copyBean(datasourceSchemaDTO, coreDatasource); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java index b1435c151d..81dcdfa527 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java @@ -510,7 +510,7 @@ public class DatasetSQLManage { if (coreDatasource == null) { DEException.throwException(Translator.get("i18n_dataset_ds_error") + ",ID:" + ds.getDatasourceId()); } - if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || StringUtils.equalsIgnoreCase("api", coreDatasource.getType())) { + if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { coreDatasource = engineManage.getDeEngine(); } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java b/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java index e30b2a6339..2ff97d96e0 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java @@ -29,9 +29,7 @@ import org.quartz.JobKey; import org.quartz.TriggerKey; import org.springframework.stereotype.Component; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import static io.dataease.datasource.server.DatasourceTaskServer.ScheduleType.CRON; import static io.dataease.datasource.server.DatasourceTaskServer.ScheduleType.MANUAL; @@ -49,6 +47,9 @@ public class DatasourceSyncManage { private ScheduleManager scheduleManager; @Resource private CalciteProvider calciteProvider; + @Resource + private DatasourceServer datasourceServer; + public void extractExcelData(CoreDatasource coreDatasource, String type) { if (coreDatasource == null) { @@ -138,11 +139,11 @@ public class DatasourceSyncManage { public void extractedData(Long taskId, CoreDatasource coreDatasource, DatasourceServer.UpdateType updateType, String scheduleType) { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(transDTO(coreDatasource)); - List tables = ApiUtils.getTables(datasourceRequest); + List tables = (List) datasourceServer.invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); for (DatasetTableDTO api : tables) { CoreDatasourceTaskLog datasetTableTaskLog = datasourceTaskServer.initTaskLog(coreDatasource.getId(), taskId, api.getTableName(), scheduleType); datasourceRequest.setTable(api.getTableName()); - List tableFields = ApiUtils.getTableFields(datasourceRequest); + List tableFields = (List) datasourceServer.invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest); try { datasetTableTaskLog.setInfo(datasetTableTaskLog.getInfo() + "/n Begin to sync datatable: " + datasourceRequest.getTable()); createEngineTable(datasourceRequest.getTable(), tableFields); @@ -191,11 +192,11 @@ public class DatasourceSyncManage { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(transDTO(coreDatasource)); - List tables = ApiUtils.getTables(datasourceRequest); + List tables = (List) datasourceServer.invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); for (DatasetTableDTO api : tables) { if (api.getTableName().equalsIgnoreCase(tableName)) { datasourceRequest.setTable(api.getTableName()); - List tableFields = ApiUtils.getTableFields(datasourceRequest); + List tableFields = (List) datasourceServer.invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest); try { datasetTableTaskLog.setInfo(datasetTableTaskLog.getInfo() + "/n Begin to sync datatable: " + datasourceRequest.getTable()); createEngineTable(datasourceRequest.getTable(), tableFields); @@ -227,7 +228,7 @@ public class DatasourceSyncManage { } private void extractApiData(DatasourceRequest datasourceRequest, DatasourceServer.UpdateType extractType, List tableFields) throws Exception { - Map result = ApiUtils.fetchResultField(datasourceRequest); + Map result = (Map) datasourceServer.invokeMethod(datasourceRequest.getDatasource().getType(), "fetchApiResultField", DatasourceRequest.class, datasourceRequest); List dataList = (List) result.get("dataList"); CoreDeEngine engine = engineManage.info(); EngineRequest engineRequest = new EngineRequest(); @@ -300,11 +301,7 @@ public class DatasourceSyncManage { public void addSchedule(CoreDatasourceTask datasourceTask) throws DEException { if (StringUtils.equalsIgnoreCase(datasourceTask.getSyncRate(), DatasourceTaskServer.ScheduleType.RIGHTNOW.toString())) { - scheduleManager.addOrUpdateSingleJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), - new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), - ExtractDataJob.class, - new Date(datasourceTask.getStartTime()), - scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType())); + scheduleManager.addOrUpdateSingleJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), ExtractDataJob.class, new Date(datasourceTask.getStartTime()), scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType())); } else { Date endTime; if (datasourceTask.getEndTime() == null || datasourceTask.getEndTime() == 0) { @@ -317,11 +314,7 @@ public class DatasourceSyncManage { } } - scheduleManager.addOrUpdateCronJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), - new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), - ExtractDataJob.class, - datasourceTask.getCron(), new Date(datasourceTask.getStartTime()), endTime, - scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType())); + scheduleManager.addOrUpdateCronJob(new JobKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), new TriggerKey(datasourceTask.getId().toString(), datasourceTask.getDsId().toString()), ExtractDataJob.class, datasourceTask.getCron(), new Date(datasourceTask.getStartTime()), endTime, scheduleManager.getDefaultJobDataMap(datasourceTask.getDsId().toString(), datasourceTask.getCron(), datasourceTask.getId().toString(), datasourceTask.getUpdateType())); } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java index 1549cd0b15..b3df1c0bef 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/ApiUtils.java @@ -6,8 +6,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.jayway.jsonpath.JsonPath; -import io.dataease.api.ds.vo.ApiDefinition; -import io.dataease.api.ds.vo.ApiDefinitionRequest; +import io.dataease.extensions.datasource.dto.ApiDefinition; +import io.dataease.extensions.datasource.dto.ApiDefinitionRequest; import io.dataease.exception.DEException; import io.dataease.extensions.datasource.dto.DatasetTableDTO; import io.dataease.extensions.datasource.dto.DatasourceRequest; @@ -75,7 +75,7 @@ public class ApiUtils { Map result = new HashMap<>(); List dataList = new ArrayList<>(); List fieldList = new ArrayList<>(); - ApiDefinition apiDefinition = checkApiDefinition(datasourceRequest); + ApiDefinition apiDefinition = getApiDefinition(datasourceRequest); if (apiDefinition == null) { DEException.throwException("未找到"); } @@ -178,7 +178,7 @@ public class ApiUtils { } private static List getData(DatasourceRequest datasourceRequest) throws Exception { - ApiDefinition apiDefinition = checkApiDefinition(datasourceRequest); + ApiDefinition apiDefinition = getApiDefinition(datasourceRequest); if (apiDefinition == null) { DEException.throwException("未找到"); } @@ -463,7 +463,28 @@ public class ApiUtils { } } - public static ApiDefinition checkApiDefinition(ApiDefinition apiDefinition, String response) throws DEException { + public static ApiDefinition checkApiDefinition(DatasourceRequest datasourceRequest) throws DEException { + ApiDefinition apiDefinition = new ApiDefinition(); + List apiDefinitionList = new ArrayList<>(); + TypeReference> listTypeReference = new TypeReference>() { + }; + try { + apiDefinitionList = objectMapper.readValue(datasourceRequest.getDatasource().getConfiguration(), listTypeReference); + } catch (Exception e) { + DEException.throwException(e); + } + if (!CollectionUtils.isEmpty(apiDefinitionList)) { + for (ApiDefinition definition : apiDefinitionList) { + if (definition != null && (definition.getType() == null || !definition.getType().equalsIgnoreCase("params"))) { + apiDefinition = definition; + } + } + } + String response = execHttpRequest(true, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), params(datasourceRequest)); + return checkApiDefinition(apiDefinition, response); + } + + private static ApiDefinition checkApiDefinition(ApiDefinition apiDefinition, String response) throws DEException { if (StringUtils.isEmpty(response)) { DEException.throwException("该请求返回数据为空"); } @@ -802,7 +823,7 @@ public class ApiUtils { return apiDefinitionListTemp.stream().filter(apiDefinition -> apiDefinition != null && apiDefinition.getType() != null && apiDefinition.getType().equalsIgnoreCase("params")).collect(Collectors.toList()); } - private static ApiDefinition checkApiDefinition(DatasourceRequest datasourceRequest) throws DEException { + private static ApiDefinition getApiDefinition(DatasourceRequest datasourceRequest) throws DEException { List apiDefinitionList = new ArrayList<>(); TypeReference> listTypeReference = new TypeReference>() { }; diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java index c9abc371c7..b1843b90f7 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java @@ -5,6 +5,7 @@ import io.dataease.dataset.utils.TableUtils; import io.dataease.datasource.dao.auto.entity.CoreDeEngine; import io.dataease.datasource.server.DatasourceServer; import io.dataease.extensions.datasource.dto.TableField; +import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -68,7 +69,7 @@ public class MysqlEngineProvider extends EngineProvider { .append("'),"); } String insetSql = (insertSql + values.substring(0, values.length() - 1)).replaceAll("'null'", "null"); - if (dsType.equalsIgnoreCase("api")) { + if (dsType.contains(DatasourceConfiguration.DatasourceType.API.name())) { List keys = tableFields.stream().filter(tableField -> tableField.isPrimaryKey() && tableField.isChecked()).toList(); List notKeys = tableFields.stream().filter(tableField -> tableField.isChecked() && !tableField.isPrimaryKey()).toList(); if (CollectionUtils.isNotEmpty(keys) && extractType.equals(DatasourceServer.UpdateType.add_scope)) { diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java index 30ce10b38c..340ed306ea 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java @@ -10,10 +10,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.dataease.api.dataset.dto.PreviewSqlDTO; import io.dataease.api.ds.DatasourceApi; import io.dataease.api.ds.vo.*; +import io.dataease.api.lark.vo.LarkInfoVO; import io.dataease.api.permissions.relation.api.RelationApi; import io.dataease.commons.constants.TaskStatus; import io.dataease.constant.LogOT; import io.dataease.constant.LogST; +import io.dataease.constant.MessageEnum; import io.dataease.dataset.manage.DatasetDataManage; import io.dataease.dataset.utils.TableUtils; import io.dataease.datasource.dao.auto.entity.*; @@ -25,7 +27,6 @@ import io.dataease.datasource.dao.ext.mapper.TaskLogExtMapper; import io.dataease.datasource.manage.DataSourceManage; import io.dataease.datasource.manage.DatasourceSyncManage; import io.dataease.datasource.manage.EngineManage; -import io.dataease.datasource.provider.ApiUtils; import io.dataease.datasource.provider.CalciteProvider; import io.dataease.datasource.provider.ExcelUtils; import io.dataease.constant.SQLConstants; @@ -47,6 +48,9 @@ import io.dataease.model.BusiNodeVO; import io.dataease.system.dao.auto.entity.CoreSysSetting; import io.dataease.system.manage.CoreUserManage; import io.dataease.utils.*; +import io.dataease.xpack.base.settings.dao.entity.ExternalTokenEntity; +import io.dataease.xpack.base.settings.platform.common.ExternalTokenManage; +import io.dataease.xpack.base.settings.platform.lark.manage.LarkManage; import jakarta.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -66,6 +70,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; @@ -100,6 +105,8 @@ public class DatasourceServer implements DatasourceApi { @Resource private DatasetDataManage datasetDataManage; @Resource + private LarkManage larkManage; + @Resource private ScheduleManager scheduleManager; @Resource private CoreUserManage coreUserManage; @@ -107,11 +114,14 @@ public class DatasourceServer implements DatasourceApi { private PluginManageApi pluginManage; @Autowired(required = false) private RelationApi relationManage; + @Resource(name = "externalTokenManage") + private ExternalTokenManage externalTokenManage; public enum UpdateType { all_scope, add_scope } + private static final String tenantAccessTokenUrl = "https://open.larksuite.com/open-apis/auth/v3/tenant_access_token/internal"; private TypeReference> listTypeReference = new TypeReference>() { }; @Resource @@ -126,7 +136,7 @@ public class DatasourceServer implements DatasourceApi { } public boolean checkRepeat(@RequestBody BusiDsRequest dataSourceDTO) { - if (Arrays.asList("API", "Excel", "folder", "es").contains(dataSourceDTO.getType())) { + if (Arrays.asList("Excel", "folder", "es").contains(dataSourceDTO.getType()) || dataSourceDTO.getType().contains("API")) { return false; } BusiNodeRequest request = new BusiNodeRequest(); @@ -152,7 +162,13 @@ public class DatasourceServer implements DatasourceApi { if (Arrays.asList("API", "Excel", "folder").contains(datasource.getType())) { continue; } + if (StringUtils.isEmpty(datasource.getConfiguration())) { + continue; + } DatasourceConfiguration compare = JsonUtil.parseObject(datasource.getConfiguration(), DatasourceConfiguration.class); + if (compare == null) { + continue; + } switch (dataSourceDTO.getType()) { case "sqlServer": case "db2": @@ -274,7 +290,7 @@ public class DatasourceServer implements DatasourceApi { } } datasourceSyncManage.extractExcelData(coreDatasource, "all_scope"); - } else if (dataSourceDTO.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) { + } else if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { CoreDatasourceTask coreDatasourceTask = new CoreDatasourceTask(); BeanUtils.copyBean(coreDatasourceTask, dataSourceDTO.getSyncSetting()); coreDatasourceTask.setName(coreDatasource.getName() + "-task"); @@ -294,11 +310,11 @@ public class DatasourceServer implements DatasourceApi { datasourceSyncManage.addSchedule(coreDatasourceTask); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(dataSourceDTO); - List tables = ApiUtils.getTables(datasourceRequest); + List tables = (List) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); checkName(tables.stream().map(DatasetTableDTO::getName).collect(Collectors.toList())); for (DatasetTableDTO api : tables) { datasourceRequest.setTable(api.getTableName()); - List tableFields = ApiUtils.getTableFields(datasourceRequest); + List tableFields = (List) invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest); try { datasourceSyncManage.createEngineTable(datasourceRequest.getTable(), tableFields); } catch (Exception e) { @@ -344,10 +360,12 @@ public class DatasourceServer implements DatasourceApi { datasourceRequest.setDatasource(dataSourceDTO); List toCreateTables = new ArrayList<>(); List toDeleteTables = new ArrayList<>(); - if (dataSourceDTO.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) { + if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { requestDatasource.setEnableDataFill(null); - List sourceTables = ApiUtils.getTables(sourceTableRequest).stream().map(DatasetTableDTO::getTableName).toList(); - List datasetTableDTOS = ApiUtils.getTables(datasourceRequest); + List sourceTableDTOs = (List) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, sourceTableRequest); + List sourceTables = sourceTableDTOs.stream().map(DatasetTableDTO::getTableName).toList(); + List datasetTableDTOS = (List) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); + List tables = datasetTableDTOS.stream().map(DatasetTableDTO::getTableName).collect(Collectors.toList()); checkName(datasetTableDTOS.stream().map(DatasetTableDTO::getName).collect(Collectors.toList())); toCreateTables = tables.stream().filter(table -> !sourceTables.contains(table)).collect(Collectors.toList()); @@ -356,9 +374,11 @@ public class DatasourceServer implements DatasourceApi { for (String sourceTable : sourceTables) { if (table.equals(sourceTable)) { datasourceRequest.setTable(table); - List tableFields = ApiUtils.getTableFields(datasourceRequest).stream().map(TableField::getName).sorted().collect(Collectors.toList()); + List tableFieldList = (List) invokeMethod(datasourceRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, datasourceRequest); + List tableFields = tableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList()); sourceTableRequest.setTable(sourceTable); - List sourceTableFields = ApiUtils.getTableFields(sourceTableRequest).stream().map(TableField::getName).sorted().collect(Collectors.toList()); + List sourceTableFieldList = (List) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, sourceTableRequest); + List sourceTableFields = sourceTableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList()); if (!String.join(",", tableFields).equals(String.join(",", sourceTableFields))) { toDeleteTables.add(table); toCreateTables.add(table); @@ -390,7 +410,7 @@ public class DatasourceServer implements DatasourceApi { for (String toCreateTable : toCreateTables) { datasourceRequest.setTable(toCreateTable); try { - datasourceSyncManage.createEngineTable(toCreateTable, ApiUtils.getTableFields(datasourceRequest)); + datasourceSyncManage.createEngineTable(toCreateTable, (List) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, sourceTableRequest)); } catch (Exception e) { DEException.throwException("Failed to create table " + toCreateTable + ", " + e.getMessage()); } @@ -486,7 +506,7 @@ public class DatasourceServer implements DatasourceApi { if (datasource == null) { DEException.throwException(Translator.get("i18n_datasource_not_exists")); } - if (datasource.getType().equalsIgnoreCase("api")) { + if (datasource.getType().contains("API")) { datasource.setConfiguration("[]"); } else { datasource.setConfiguration(""); @@ -589,10 +609,10 @@ public class DatasourceServer implements DatasourceApi { } } } - if (coreDatasource.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) { + if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(datasourceDTO); - List tables = ApiUtils.getTables(datasourceRequest); + List tables = (List) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); for (DatasetTableDTO api : tables) { datasourceRequest.setTable(api.getTableName()); try { @@ -671,8 +691,8 @@ public class DatasourceServer implements DatasourceApi { BeanUtils.copyBean(datasourceDTO, coreDatasource); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(datasourceDTO); - if (coreDatasource.getType().equals("API")) { - List datasetTableDTOS = ApiUtils.getTables(datasourceRequest); + if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { + List datasetTableDTOS = (List) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); datasetTableDTOS.forEach(datasetTableDTO1 -> { CoreDatasourceTaskLog log = datasourceTaskServer.lastSyncLogForTable(datasetTableDTO.getDatasourceId(), datasetTableDTO1.getTableName()); if (log != null) { @@ -701,7 +721,7 @@ public class DatasourceServer implements DatasourceApi { CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(Long.parseLong(datasourceId)); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(transDTO(coreDatasource)); - if (coreDatasource.getType().equals("API") || coreDatasource.getType().equals("Excel")) { + if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().equals("Excel")) { datasourceRequest.setDatasource(transDTO(engineManage.getDeEngine())); DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine()); @@ -781,7 +801,7 @@ public class DatasourceServer implements DatasourceApi { List excelSheetDataList = new ArrayList<>(); for (ExcelSheetData sheet : excelFileData.getSheets()) { for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) { - if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())){ + if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) { List newTableFields = sheet.getFields(); datasourceRequest.setTable(datasetTableDTO.getTableName()); List oldTableFields = ExcelUtils.getTableFields(datasourceRequest); @@ -802,7 +822,7 @@ public class DatasourceServer implements DatasourceApi { List datasetTableDTOS = ExcelUtils.getTables(datasourceRequest); for (ExcelSheetData sheet : excelFileData.getSheets()) { for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) { - if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())){ + if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) { sheet.setDeTableName(datasetTableDTO.getTableName()); } } @@ -876,12 +896,17 @@ public class DatasourceServer implements DatasourceApi { public ApiDefinition checkApiDatasource(Map request) throws DEException { ApiDefinition apiDefinition = JsonUtil.parseObject(new String(java.util.Base64.getDecoder().decode(request.get("data"))), ApiDefinition.class); - List paramsList = JsonUtil.parseList(new String(java.util.Base64.getDecoder().decode(request.get("paramsList"))), listTypeReference); - String response = ApiUtils.execHttpRequest(true, apiDefinition, apiDefinition.getApiQueryTimeout() == null || apiDefinition.getApiQueryTimeout() <= 0 ? 10 : apiDefinition.getApiQueryTimeout(), paramsList); if (request.keySet().contains("type") && request.get("type").equals("apiStructure")) { apiDefinition.setShowApiStructure(true); } - ApiUtils.checkApiDefinition(apiDefinition, response); + List paramsList = JsonUtil.parseList(new String(java.util.Base64.getDecoder().decode(request.get("paramsList"))), listTypeReference); + paramsList.add(apiDefinition); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + DatasourceDTO datasource = new DatasourceDTO(); + datasource.setConfiguration(JsonUtil.toJSONString(paramsList).toString()); + datasourceRequest.setDatasource(datasource); + + apiDefinition = (ApiDefinition) invokeMethod(request.get("dsType"), "checkApiDefinition", DatasourceRequest.class, datasourceRequest); if (apiDefinition.getRequest().getAuthManager() != null && StringUtils.isNotBlank(apiDefinition.getRequest().getAuthManager().getUsername()) && StringUtils.isNotBlank(apiDefinition.getRequest().getAuthManager().getPassword()) && apiDefinition.getRequest().getAuthManager().getVerification().equals("Basic Auth")) { apiDefinition.getRequest().getAuthManager().setUsername(new String(Base64.getEncoder().encode(apiDefinition.getRequest().getAuthManager().getUsername().getBytes()))); apiDefinition.getRequest().getAuthManager().setPassword(new String(Base64.getEncoder().encode(apiDefinition.getRequest().getAuthManager().getPassword().getBytes()))); @@ -889,6 +914,47 @@ public class DatasourceServer implements DatasourceApi { return apiDefinition; } + private void generateToken(LarkInfoVO info) { + if (ObjectUtils.isEmpty(info)) { + info = larkManage.query(); + } + HttpClientConfig clientConfig = new HttpClientConfig(); + clientConfig.addHeader("Content-Type", "application/json"); + String tokenPost = HttpClientUtil.post(tenantAccessTokenUrl, buildAccessTokenParam(info.getAppId(), info.getAppSecret()), clientConfig); + Map parse = null; + try { + parse = buildAccessTokenResult(tokenPost); + } catch (Exception e) { + DEException.throwException("请检查appId和appSecret参数," + e.getMessage()); + } + String tenantAccessToken = parse.get("tenant_access_token").toString(); + Integer expires_in = (Integer) parse.get("expire"); + ExternalTokenEntity externalTokenEntity = new ExternalTokenEntity(); + long expTimePoint = System.currentTimeMillis() + expires_in * 1000L; + externalTokenEntity.setId(MessageEnum.LARK.getFlag()); + externalTokenEntity.setToken(tenantAccessToken); + externalTokenEntity.setExpTime(expTimePoint); + externalTokenManage.refreshToken(externalTokenEntity); + } + + private Map buildAccessTokenResult(String json) { + if (ObjectUtils.isEmpty(json)) { + DEException.throwException("get access token error"); + } + Map resultMap = JsonUtil.parse(json, Map.class); + if (Integer.parseInt(resultMap.get("code").toString()) != 0) { + DEException.throwException(resultMap.get("msg").toString()); + } + return resultMap; + } + + private String buildAccessTokenParam(String appId, String appSecret) { + Map param = new HashMap<>(); + param.put("app_id", appId); + param.put("app_secret", appSecret); + return Objects.requireNonNull(JsonUtil.toJSONString(param)).toString(); + } + private void preCheckDs(DatasourceDTO datasource) throws DEException { List list = datasourceTypes().stream().map(DatasourceConfiguration.DatasourceType::getType).collect(Collectors.toList()); if (LicenseUtil.licenseValid()) { @@ -909,8 +975,8 @@ public class DatasourceServer implements DatasourceApi { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(coreDatasource); String status = null; - if (coreDatasource.getType().equals("API")) { - status = ApiUtils.checkStatus(datasourceRequest); + if (coreDatasource.getType().startsWith("API")) { + status = (String) invokeMethod(coreDatasource.getType(), "checkAPIStatus", DatasourceRequest.class, datasourceRequest); } else { Provider provider = ProviderFactory.getProvider(coreDatasource.getType()); status = provider.checkStatus(datasourceRequest); @@ -921,6 +987,10 @@ public class DatasourceServer implements DatasourceApi { } } + public String getTenantAccessToken() { + LarkInfoVO larkInfo = larkManage.query(); + return externalTokenManage.getToken(MessageEnum.LARK.getFlag(), t -> generateToken(larkInfo)); + } public void updateDemoDs() { } @@ -968,7 +1038,7 @@ public class DatasourceServer implements DatasourceApi { CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dsId); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(transDTO(coreDatasource)); - List datasetTableDTOS = ApiUtils.getTables(datasourceRequest); + List datasetTableDTOS = (List) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); for (int i = 0; i < pager.getRecords().size(); i++) { for (int i1 = 0; i1 < datasetTableDTOS.size(); i1++) { if (pager.getRecords().get(i).getTableName().equalsIgnoreCase(datasetTableDTOS.get(i1).getTableName())) { @@ -1124,7 +1194,7 @@ public class DatasourceServer implements DatasourceApi { DatasourceDTO datasourceDTO = new DatasourceDTO(); BeanUtils.copyBean(datasourceDTO, datasource); - if (datasourceDTO.getType().equalsIgnoreCase(DatasourceConfiguration.DatasourceType.API.toString())) { + if (datasourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.toString())) { List apiDefinitionList = JsonUtil.parseList(datasourceDTO.getConfiguration(), listTypeReference); List apiDefinitionListWithStatus = new ArrayList<>(); List params = new ArrayList<>(); @@ -1203,7 +1273,7 @@ public class DatasourceServer implements DatasourceApi { BeanUtils.copyBean(datasourceDTO, coreDatasource); try { checkDatasourceStatus(datasourceDTO); - if (!Arrays.asList("API", "Excel", "folder").contains(coreDatasource.getType())) { + if (!Arrays.asList("API", "Excel", "folder").contains(coreDatasource.getType()) && !coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { calciteProvider.updateDsPoolAfterCheckStatus(datasourceDTO); } } catch (DEException e) { @@ -1241,4 +1311,35 @@ public class DatasourceServer implements DatasourceApi { vo.setHost(host); return vo; } + + private Method getMethod(String dsType, String methodName, Class classes) { + Method method = null; + try { + String ClassName = "io.dataease.datasource.provider.ApiUtils"; + if (!dsType.equals(DatasourceConfiguration.DatasourceType.API.name())) { + ClassName = "io.dataease.datasource.provider.LarkUtils"; + } + Class clazz = Class.forName(ClassName); + method = clazz.getMethod(methodName, classes); + } catch (Exception e) { + DEException.throwException("Cant find method: " + e.getMessage()); + } + return method; + } + + public Object invokeMethod(String dsType, String methodName, Class classes, Object object) { + Object resObj = null; + try { + Method method = getMethod(dsType, methodName, classes); + if (object instanceof DatasourceRequest) { + Class clazz = Class.forName(DatasourceRequest.class.getName()); + Method setToken = clazz.getMethod("setToken", String.class); + setToken.invoke(object, getTenantAccessToken()); + } + resObj = method.invoke(null, object); + } catch (Exception e) { + DEException.throwException(e); + } + return resObj; + } } 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 2a044f3c09..f8b71b9fcd 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 @@ -30,8 +30,8 @@ import io.dataease.dataset.manage.DatasetDataManage; import io.dataease.dataset.manage.DatasetGroupManage; import io.dataease.datasource.dao.auto.entity.CoreDatasource; import io.dataease.datasource.dao.auto.mapper.CoreDatasourceMapper; -import io.dataease.datasource.provider.ApiUtils; import io.dataease.datasource.provider.ExcelUtils; +import io.dataease.datasource.server.DatasourceServer; import io.dataease.exception.DEException; import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import io.dataease.extensions.view.dto.ChartViewDTO; @@ -141,6 +141,8 @@ public class DataVisualizationServer implements DataVisualizationApi { @Resource private CoreUserManage coreUserManage; + @Resource + private DatasourceServer datasourceServer; @Override public DataVisualizationVO findCopyResource(Long dvId, String busiFlag) { @@ -232,8 +234,8 @@ public class DataVisualizationServer implements DataVisualizationApi { if (StringUtils.isNotEmpty(datasourceOld.getConfiguration())) { if (datasourceOld.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) { dsTableNamesMap.put(datasourceOld.getId(), ExcelUtils.getTableNamesMap(datasourceOld.getConfiguration())); - } else if (datasourceOld.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) { - dsTableNamesMap.put(datasourceOld.getId(), ApiUtils.getTableNamesMap(datasourceOld.getConfiguration())); + } else if (datasourceOld.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { + dsTableNamesMap.put(datasourceOld.getId(), (Map) datasourceServer.invokeMethod(datasourceOld.getType(), "getTableNamesMap", String.class, datasourceOld.getConfiguration())); } } }); @@ -244,8 +246,8 @@ public class DataVisualizationServer implements DataVisualizationApi { if (StringUtils.isNotEmpty(datasourceNew.getConfiguration())) { if (datasourceNew.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) { dsTableNamesMap.put(datasourceNew.getId(), ExcelUtils.getTableNamesMap(datasourceNew.getConfiguration())); - } else if (datasourceNew.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) { - dsTableNamesMap.put(datasourceNew.getId(), ApiUtils.getTableNamesMap(datasourceNew.getConfiguration())); + } else if (datasourceNew.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { + dsTableNamesMap.put(datasourceNew.getId(), (Map) datasourceServer.invokeMethod(datasourceNew.getType(), "getTableNamesMap", String.class, datasourceNew.getConfiguration())); } } }); @@ -516,11 +518,11 @@ public class DataVisualizationServer implements DataVisualizationApi { coreVisualizationManage.delete(dvId); } - private void resourceTreeTypeAdaptor(List tree,String type){ - if(!CollectionUtils.isEmpty(tree)){ + private void resourceTreeTypeAdaptor(List tree, String type) { + if (!CollectionUtils.isEmpty(tree)) { tree.forEach(busiNodeVO -> { busiNodeVO.setType(type); - resourceTreeTypeAdaptor(busiNodeVO.getChildren(),type); + resourceTreeTypeAdaptor(busiNodeVO.getChildren(), type); }); } } @@ -537,7 +539,7 @@ public class DataVisualizationServer implements DataVisualizationApi { List dataVResult = coreVisualizationManage.tree(requestDv); List result = new ArrayList<>(); if (!CollectionUtils.isEmpty(dashboardResult)) { - resourceTreeTypeAdaptor(dashboardResult,"dashboard"); + resourceTreeTypeAdaptor(dashboardResult, "dashboard"); BusiNodeVO dashboardResultParent = new BusiNodeVO(); dashboardResultParent.setName(Translator.get("i18n_menu.panel")); dashboardResultParent.setId(-101L); @@ -549,7 +551,7 @@ public class DataVisualizationServer implements DataVisualizationApi { result.add(dashboardResultParent); } if (!CollectionUtils.isEmpty(dataVResult)) { - resourceTreeTypeAdaptor(dataVResult,"dataV"); + resourceTreeTypeAdaptor(dataVResult, "dataV"); BusiNodeVO dataVResultParent = new BusiNodeVO(); dataVResultParent.setName(Translator.get("i18n_menu.screen")); dataVResultParent.setId(-102L); diff --git a/core/core-backend/src/main/java/io/dataease/visualization/utils/VisualizationUtils.java b/core/core-backend/src/main/java/io/dataease/visualization/utils/VisualizationUtils.java index 599574dca7..3c9bf266da 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/utils/VisualizationUtils.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/utils/VisualizationUtils.java @@ -1,30 +1,25 @@ package io.dataease.visualization.utils; - -import io.dataease.datasource.provider.ApiUtils; -import io.dataease.datasource.provider.ExcelUtils; -import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import io.dataease.extensions.view.dto.ChartViewDTO; import io.dataease.utils.JsonUtil; -import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; public class VisualizationUtils { - public static Map viewTransToStr(Map source ){ - Map result = new HashMap<>(); - source.forEach((key,value) ->{ - result.put(key, (String)JsonUtil.toJSONString(value)); - }); - return result; + public static Map viewTransToStr(Map source) { + Map result = new HashMap<>(); + source.forEach((key, value) -> { + result.put(key, (String) JsonUtil.toJSONString(value)); + }); + return result; } - public static Map viewTransToObj (Map source ){ - Map result = new HashMap<>(); - source.forEach((key,value) ->{ - result.put(key, JsonUtil.parseObject(value,ChartViewDTO.class)); + public static Map viewTransToObj(Map source) { + Map result = new HashMap<>(); + source.forEach((key, value) -> { + result.put(key, JsonUtil.parseObject(value, ChartViewDTO.class)); }); return result; } diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index d078e7ae98..8fb2ea3cc6 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -1098,7 +1098,15 @@ export default { sync_table: '同步指定表', req_completed: '请求成功', sync_rate: '更新频率', - has_same_ds: '存在相同配置数据源,确认保存?' + has_same_ds: '存在相同配置数据源,确认保存?', + table_addr: '表格地址', + input_addr: '请输入表格地址', + app_token: 'app_token', + input_app_token: '请输入app_token', + table_id: 'table_id', + input_table_id: '请输入table_id', + view_id: 'view_id', + input_view_id: '请输入view_id' }, chart: { align: '对齐方式', diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/CreatDsGroup.vue b/core/core-frontend/src/views/visualized/data/datasource/form/CreatDsGroup.vue index 5b86b1adce..01b11484f2 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/CreatDsGroup.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/CreatDsGroup.vue @@ -291,7 +291,7 @@ const saveDataset = () => { request.apiConfiguration = '' checkRepeat(request).then(res => { let method = request.id === '' ? save : update - if (request.type !== 'API') { + if (!request.type.startsWith('API')) { request.syncSetting = null } if (res) { diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue index 49ce6cf78f..701efcf0c3 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue @@ -24,9 +24,10 @@ import { CustomPassword } from '@/components/custom-password' import { ElForm, ElMessage, ElMessageBox } from 'element-plus-secondary' import Cron from '@/components/cron/src/Cron.vue' import { ComponentPublicInstance } from 'vue' -import { XpackComponent } from '@/components/plugin' +import {PluginComponent, XpackComponent} from '@/components/plugin' import { iconFieldMap } from '@/components/icon-group/field-list' import { boolean } from 'mathjs' +import LarkItemDraw from '@/views/visualized/data/datasource/form/LarkItemDraw_bak.vue' const { t } = useI18n() const prop = defineProps({ form: { @@ -95,6 +96,7 @@ const defaultRule = { const rule = ref(cloneDeep(defaultRule)) const api_table_title = ref('') const editApiItem = ref() +const editLarkItem = ref() const defaultApiItem = { name: '', deTableName: '', @@ -127,7 +129,7 @@ const defaultApiItem = { } const initForm = type => { - if (type !== 'API') { + if (!type.startsWith('API')) { form.value.configuration = { dataBase: '', jdbcUrl: '', @@ -148,7 +150,7 @@ const initForm = type => { rule.value = cloneDeep(defaultRule) setRules() } - if (type === 'API') { + if (type.startsWith('API')) { form.value.syncSetting = { updateType: 'all_scope', syncRate: 'SIMPLE_CRON', @@ -170,7 +172,7 @@ const initForm = type => { }, 0) } -const notapiexcelconfig = computed(() => form.value.type !== 'API') +const notapiexcelconfig = computed(() => !form.value.type.startsWith('API')) const authMethodList = [ { @@ -353,7 +355,7 @@ const setRules = () => { watch( () => form.value.type, val => { - if (val !== 'API') { + if (!val.startsWith('API')) { rule.value = cloneDeep(defaultRule) setRules() } @@ -431,6 +433,37 @@ const addApiItem = item => { }) } +const addLarkItem = item => { + let apiItem = null + let editItem = false + api_table_title.value = t('datasource.data_table') + if (item) { + apiItem = cloneDeep(item) + editItem = true + } else { + apiItem = cloneDeep(defaultApiItem) + apiItem.type = activeName.value + let serialNumber1 = + form.value.apiConfiguration.length > 0 + ? form.value.apiConfiguration[form.value.apiConfiguration.length - 1].serialNumber + 1 + : 0 + let serialNumber2 = + form.value.paramsConfiguration && form.value.paramsConfiguration.length > 0 + ? form.value.paramsConfiguration[form.value.paramsConfiguration.length - 1].serialNumber + 1 + : 0 + apiItem.serialNumber = serialNumber1 + serialNumber2 + } + nextTick(() => { + editLarkItem.value.initApiItem( + apiItem, + form.value, + activeName.value, + editItem, + isSupportSetKey.value + ) + }) +} + const activeName = ref('table') const showPriority = ref(false) const showSSH = ref(false) @@ -604,6 +637,7 @@ const apiRule = { } const dialogEditParams = ref(false) const dialogRenameApi = ref(false) +const dialogAddLarkItem = ref(false) const activeParamsName = ref('') const activeParamsID = ref(0) const paramsObj = ref({ @@ -757,7 +791,7 @@ defineExpose({ + - + + + diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/index.vue b/core/core-frontend/src/views/visualized/data/datasource/form/index.vue index c34179a3b0..d2fca831ed 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/index.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/index.vue @@ -196,7 +196,7 @@ const activeApiStep = ref(0) const setNextStep = () => { activeApiStep.value = activeStep.value + 1 - if (currentDsType.value === 'API' && activeStep.value === 1) return + if (currentDsType.value.includes('API') && activeStep.value === 1) return activeStep.value = activeStep.value + 1 } @@ -208,14 +208,14 @@ const next = () => { if ( form.apiConfiguration?.length === 0 && - currentDsType.value === 'API' && + currentDsType.value.includes('API') && activeStep.value !== 2 ) { ElMessage.error(t('data_source.cannot_be_empty_table')) return } - if (currentDsType.value === 'API' && activeStep.value !== 2) { + if (currentDsType.value.includes('API') && activeStep.value !== 2) { const validateFrom = detail.value.submitForm() validateFrom(val => { if (val) { @@ -284,7 +284,10 @@ const handleShowFinishPage = ({ id, name, pid }) => { emitter.on('showFinishPage', handleShowFinishPage) const prev = () => { - if ((currentDsType.value === 'API' && activeApiStep.value === 1) || activeStep.value === 1) { + if ( + (currentDsType.value.includes('API') && activeApiStep.value === 1) || + activeStep.value === 1 + ) { ElMessageBox.confirm(t('data_source.the_previous_step'), { confirmButtonType: 'primary', type: 'warning', @@ -299,7 +302,7 @@ const prev = () => { } const prevConfirm = () => { - if (currentDsType.value === 'API' && activeApiStep.value === 2) { + if (currentDsType.value.includes('API') && activeApiStep.value === 2) { activeApiStep.value = 1 activeStep.value = 1 return @@ -336,7 +339,8 @@ const validateDS = () => { configuration: string apiConfiguration: string } - if (currentDsType.value === 'API') { + console.log(form) + if (currentDsType.value.includes('API')) { if (form.apiConfiguration.length === 0) { ElMessage.error(t('data_source.add_data_table')) return @@ -417,6 +421,7 @@ const typeTitle = computed(() => { const saveDS = () => { isUpdate = false + console.log('1') const request = JSON.parse(JSON.stringify(form)) as unknown as Omit< Form, 'configuration' | 'apiConfiguration' @@ -424,6 +429,7 @@ const saveDS = () => { configuration: string apiConfiguration: string } + console.log('1') if (currentDsType.value === 'Excel') { excel.value.uploadStatus(false) if (!excel.value.sheetFile?.name) { @@ -443,7 +449,7 @@ const saveDS = () => { }) return - } else if (currentDsType.value === 'API') { + } else if (currentDsType.value.includes('API')) { for (let i = 0; i < request.apiConfiguration.length; i++) { if ( request.apiConfiguration[i].deTableName === '' || @@ -461,6 +467,7 @@ const saveDS = () => { request.apiConfiguration[i].fields[j].value = [] } } + console.log('3') let apiItems = [] apiItems = apiItems.concat(request.apiConfiguration) if (request.paramsConfiguration) { @@ -472,7 +479,7 @@ const saveDS = () => { } else { request.configuration = Base64.encode(JSON.stringify(request.configuration)) } - + console.log('4') if (isPlugin.value) { xpack?.value?.invokeMethod({ methodName: 'submitForm', @@ -483,6 +490,7 @@ const saveDS = () => { request.apiConfiguration = '' validate(val => { if (val) { + console.log('5') doSaveDs(request) } }) @@ -498,6 +506,7 @@ const doSaveDs = request => { showClose: false, tip: '' } + console.log('6') checkRepeat(request).then(res => { let method = request.id === '' ? save : update if (res) { @@ -846,8 +855,8 @@ defineExpose({ > { Object.assign(nodeTmpInfo, cloneDeep(nodeInfo)) validateById(nodeTmpInfo.id as number) .then(res => { - if (res.data.type === 'API') { + if (res.data.type.startsWith('API')) { let error = 0 const dsStatus = JSON.parse(res.data.status) for (let i = 0; i < dsStatus.length; i++) { @@ -828,7 +828,7 @@ const handleCopy = async data => { datasource.id = '' datasource.copy = true datasource.name = t('datasource.copy') - if (datasource.type === 'API') { + if (datasource.type.startsWith('API')) { for (let i = 0; i < datasource.apiConfiguration.length; i++) { datasource.apiConfiguration[i].deTableName = '' } @@ -1390,7 +1390,7 @@ const getMenuList = (val: boolean) => {