diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java index 8c36e7f45b..9674935d10 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -1,5 +1,7 @@ package io.dataease.controller.dataset; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.auth.annotation.DeLog; import io.dataease.auth.annotation.DePermission; @@ -7,10 +9,14 @@ import io.dataease.auth.annotation.DePermissions; import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.commons.constants.SysLogConstants; +import io.dataease.commons.utils.PageUtils; +import io.dataease.commons.utils.Pager; +import io.dataease.controller.ResultHolder; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.response.DataSetDetail; import io.dataease.dto.dataset.DataSetTableDTO; import io.dataease.dto.dataset.ExcelFileData; +import io.dataease.plugins.common.base.domain.DatasetSqlLog; import io.dataease.plugins.common.base.domain.DatasetTable; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableIncrementalConfig; @@ -152,10 +158,21 @@ public class DataSetTableController { @DePermission(type = DePermissionType.DATASET, value = "id", level = ResourceAuthLevel.DATASET_LEVEL_USE), @DePermission(type = DePermissionType.DATASOURCE, value = "dataSourceId", level = ResourceAuthLevel.DATASOURCE_LEVEL_USE) }, logical = Logical.AND) - public Map getSQLPreview(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { + public ResultHolder getSQLPreview(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { return dataSetTableService.getSQLPreview(dataSetTableRequest); } + @ApiOperation("根据sql查询预览数据") + @PostMapping("sqlLog/{goPage}/{pageSize}") + @DePermissions(value = { + @DePermission(type = DePermissionType.DATASET, value = "id", level = ResourceAuthLevel.DATASET_LEVEL_USE), + @DePermission(type = DePermissionType.DATASOURCE, value = "dataSourceId", level = ResourceAuthLevel.DATASOURCE_LEVEL_USE) + }, logical = Logical.AND) + public Pager> getSQLLog(@RequestBody DataSetTableRequest dataSetTableRequest, @PathVariable int goPage, @PathVariable int pageSize) throws Exception { + Page page = PageHelper.startPage(goPage, pageSize, true); + return PageUtils.setPageInfo(page, dataSetTableService.getSQLLog(dataSetTableRequest)); + } + @ApiOperation("预览自定义数据数据") @PostMapping("customPreview") public Map customPreview(@RequestBody DataSetTableRequest dataSetTableRequest) throws Exception { diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index c3fe116d71..434d8c4410 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -10,6 +10,7 @@ import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.commons.constants.*; import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.*; +import io.dataease.controller.ResultHolder; import io.dataease.controller.request.dataset.DataSetGroupRequest; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.request.dataset.DataSetTaskRequest; @@ -131,6 +132,8 @@ public class DataSetTableService { private PermissionsTreeService permissionsTreeService; @Resource private DatasourceService datasourceService; + @Resource + private DatasetSqlLogMapper datasetSqlLogMapper; private static boolean isUpdatingDatasetTableStatus = false; private static final String lastUpdateTime = "${__last_update_time__}"; @@ -1175,9 +1178,22 @@ public class DataSetTableService { return map; } - public Map getSQLPreview(DataSetTableRequest dataSetTableRequest) throws Exception { + public List getSQLLog(DataSetTableRequest dataSetTableRequest) { + if (StringUtils.isEmpty(dataSetTableRequest.getId())) { + return new ArrayList<>(); + } + DatasetSqlLogExample example = new DatasetSqlLogExample(); + example.createCriteria().andDatasetIdEqualTo(dataSetTableRequest.getId()); + example.setOrderByClause(" start_time desc "); + return datasetSqlLogMapper.selectByExample(example); + } + + public ResultHolder getSQLPreview(DataSetTableRequest dataSetTableRequest) throws Exception { + DatasetSqlLog datasetSqlLog = new DatasetSqlLog(); + DataTableInfoDTO dataTableInfo = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class); String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql(); + datasetSqlLog.setSql(sql); Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ds == null) { throw new Exception(Translator.get("i18n_invalid_ds")); @@ -1202,7 +1218,25 @@ public class DataSetTableService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); String sqlAsTable = qp.createSQLPreview(sql, null); datasourceRequest.setQuery(sqlAsTable); - Map result = datasourceProvider.fetchResultAndField(datasourceRequest); + + Map result = new HashMap<>(); + try { + datasetSqlLog.setStartTime(System.currentTimeMillis()); + result = datasourceProvider.fetchResultAndField(datasourceRequest); + datasetSqlLog.setEndTime(System.currentTimeMillis()); + datasetSqlLog.setSpend(datasetSqlLog.getEndTime() - datasetSqlLog.getStartTime()); + datasetSqlLog.setStatus("Completed"); + } catch (Exception e) { + datasetSqlLog.setStatus("Error"); + return ResultHolder.error(e.getMessage(), datasetSqlLog); + } finally { + if (StringUtils.isNotEmpty(dataSetTableRequest.getId())) { + datasetSqlLog.setDatasetId(dataSetTableRequest.getId()); + datasetSqlLog.setId(UUID.randomUUID().toString()); + datasetSqlLogMapper.insert(datasetSqlLog); + } + } + List data = result.get("dataList"); List fields = result.get("fieldList"); String[] fieldArray = fields.stream().map(TableField::getFieldName).toArray(String[]::new); @@ -1223,8 +1257,9 @@ public class DataSetTableService { Map map = new HashMap<>(); map.put("fields", fields); map.put("data", jsonArray); + map.put("log", datasetSqlLog); - return map; + return ResultHolder.success(map); } public Map getUnionPreview(DataSetTableRequest dataSetTableRequest) throws Exception { diff --git a/backend/src/main/resources/db/migration/V42__1.16.sql b/backend/src/main/resources/db/migration/V42__1.16.sql index 6a02f442ad..b273dda35f 100644 --- a/backend/src/main/resources/db/migration/V42__1.16.sql +++ b/backend/src/main/resources/db/migration/V42__1.16.sql @@ -42,3 +42,14 @@ VALUES ('Apache Kylin 数据源插件', 'default', '0', '0', 'datasource', 'Apac INSERT INTO `sys_msg_channel` (`msg_channel_id`, `channel_name`, `service_name`) VALUES ('6', 'webmsg.channel_larksuite_msg', 'sendLarksuite'); + +CREATE TABLE `dataset_sql_log` ( + `id` varchar(50) NOT NULL DEFAULT '' COMMENT 'ID', + `dataset_id` varchar(50) NOT NULL DEFAULT '' COMMENT '数据集ID', + `start_time` bigint(13) DEFAULT NULL COMMENT '开始时间', + `end_time` bigint(13) DEFAULT NULL COMMENT '结束时间', + `spend` bigint(13) DEFAULT NULL COMMENT '耗时(毫秒)', + `sql` longtext NOT NULL COMMENT '详细信息', + `status` varchar(45) DEFAULT NULL COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 090a2df560..32df53dbb0 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1436,6 +1436,9 @@ export default { percent: 'Percent' }, dataset: { + spend_time: 'Spend', + sql: 'SQL', + sql_result: 'Result', parse_filed: 'Parse Field', field_rename: 'Rename Field', params_work: 'Effective only when editing SQL', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 6bc103d114..784ada7e2a 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1436,6 +1436,9 @@ export default { percent: '占比' }, dataset: { + spend_time: '耗時', + sql: 'SQL 語句', + sql_result: '運行結果', parse_filed: '解析字段', field_rename: '字段重命名', params_work: '僅在編輯 sql 時生效', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index ebd96573bd..76b1f86e61 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1435,6 +1435,9 @@ export default { percent: '占比' }, dataset: { + spend_time: '耗时', + sql: 'SQL 语句', + sql_result: '运行结果', parse_filed: '解析字段', field_rename: '字段重命名', params_work: '仅在编辑sql时生效', diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index 6be3cebd14..e86784cd21 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -208,8 +208,149 @@ @input="onCmCodeChange" /> + + + + -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
{{ $t('deDataset.running_results') }} {{ @@ -456,9 +597,10 @@ import { engineMode } from '@/api/system/engine' import msgCfm from '@/components/msgCfm/index' import cancelMix from './cancelMix' import _ from 'lodash' +import GridTable from '@/components/gridTable/index.vue' export default { name: 'AddSQL', - components: { codemirror }, + components: { codemirror, GridTable }, mixins: [msgCfm, cancelMix], props: { param: { @@ -468,6 +610,13 @@ export default { }, data() { return { + tabActive: 'result', + paginationConfig: { + currentPage: 1, + pageSize: 10, + total: 0 + }, + data: [], dataSource: '', loading: false, dataTable: '', @@ -586,12 +735,31 @@ export default { this.initTableInfo() }, created() { + console.log(this.param) this.kettleState() engineMode().then((res) => { this.engineMode = res.data }) }, methods: { + copy(text) { + this.$copyText(text).then((e) => { + this.openMessageSuccess('commons.copy_success') + }, (e) => { + this.openMessageSuccess('commons.copy_success') + }) + }, + changeTab() { + }, + handleSizeChange(pageSize) { + this.paginationConfig.currentPage = 1 + this.paginationConfig.pageSize = pageSize + this.listSqlLog() + }, + handleCurrentChange(currentPage) { + this.paginationConfig.currentPage = currentPage + this.listSqlLog() + }, getField(name) { post('/dataset/table/getFields', { dataSourceId: this.dataSource, @@ -687,7 +855,6 @@ export default { }) } }, - getSQLPreview() { this.errMsg = false this.errMsgCont = '' @@ -700,6 +867,7 @@ export default { this.fields = [] this.$refs.plxTable?.reloadData([]) post('/dataset/table/sqlPreview', { + id: this.param.tableId, dataSourceId: this.dataSource, type: 'sql', mode: parseInt(this.mode), @@ -710,17 +878,49 @@ export default { }) }, true, 60000, true) .then((response) => { - this.fields = response.data.fields - this.$nextTick(() => { - this.$refs.plxTable?.reloadData(response.data.data) - }) + if (response.success) { + this.fields = response.data.fields + this.$nextTick(() => { + this.$refs.plxTable?.reloadData(response.data.data) + }) + if (!this.param.tableId) { + this.data.unshift(response.data.log) + this.$refs.tableLog?.reloadData(this.data) + } else { + this.listSqlLog() + } + } else { + this.errMsgCont = response.message + this.errMsg = true + if (!this.param.tableId) { + this.data.unshift(response.data) + this.$refs.tableLog?.reloadData(this.data) + } else { + this.listSqlLog() + } + } }) - .catch((err, msg) => { + .catch((err, msg, response) => { this.errMsgCont = err this.errMsg = true + if (!this.param.tableId) { + this.data.unshift(response.data) + this.$refs.tableLog?.reloadData(this.data) + } else { + this.listSqlLog() + } }) }, + listSqlLog() { + post('/dataset/table/sqlLog/' + this.paginationConfig.currentPage + '/' + this.paginationConfig.pageSize, { id: this.param.tableId, dataSourceId: this.dataSource }) + .then((response) => { + this.data = response.data.listObject + this.paginationConfig.total = response.data.itemCount + }) + .catch(() => { + }) + }, save() { if (!this.dataSource || this.datasource === '') { this.openMessageSuccess('dataset.pls_slc_data_source', 'error') @@ -1062,5 +1262,17 @@ export default { } } } + .table-container { + height: calc(100% - 50px); + .mar6 { + margin-right: 6px; + } + .mar3 { + margin-left: -3px; + } + } + .table-container-filter { + height: calc(100% - 110px); + } }