提交 a68323de authored 作者: junjie's avatar junjie

feat: 同数据源直连数据集之间支持数据关联

上级 1d927404
...@@ -20,12 +20,14 @@ import io.dataease.datasource.provider.ProviderFactory; ...@@ -20,12 +20,14 @@ import io.dataease.datasource.provider.ProviderFactory;
import io.dataease.datasource.request.DatasourceRequest; import io.dataease.datasource.request.DatasourceRequest;
import io.dataease.datasource.service.DatasourceService; import io.dataease.datasource.service.DatasourceService;
import io.dataease.dto.chart.*; import io.dataease.dto.chart.*;
import io.dataease.dto.dataset.DataSetTableUnionDTO;
import io.dataease.dto.dataset.DataTableInfoDTO; import io.dataease.dto.dataset.DataTableInfoDTO;
import io.dataease.i18n.Translator; import io.dataease.i18n.Translator;
import io.dataease.listener.util.CacheUtils; import io.dataease.listener.util.CacheUtils;
import io.dataease.provider.QueryProvider; import io.dataease.provider.QueryProvider;
import io.dataease.service.dataset.DataSetTableFieldsService; import io.dataease.service.dataset.DataSetTableFieldsService;
import io.dataease.service.dataset.DataSetTableService; import io.dataease.service.dataset.DataSetTableService;
import io.dataease.service.dataset.DataSetTableUnionService;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -56,6 +58,8 @@ public class ChartViewService { ...@@ -56,6 +58,8 @@ public class ChartViewService {
private DataSetTableFieldsService dataSetTableFieldsService; private DataSetTableFieldsService dataSetTableFieldsService;
@Resource @Resource
private ExtChartGroupMapper extChartGroupMapper; private ExtChartGroupMapper extChartGroupMapper;
@Resource
private DataSetTableUnionService dataSetTableUnionService;
//默认使用非公平 //默认使用非公平
private ReentrantLock lock = new ReentrantLock(); private ReentrantLock lock = new ReentrantLock();
...@@ -197,6 +201,15 @@ public class ChartViewService { ...@@ -197,6 +201,15 @@ public class ChartViewService {
} else { } else {
datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList)); datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList));
} }
} else if (StringUtils.equalsIgnoreCase(table.getType(), "custom")) {
DataTableInfoDTO dt = new Gson().fromJson(table.getInfo(), DataTableInfoDTO.class);
List<DataSetTableUnionDTO> list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId());
String sql = dataSetTableService.getCustomSQLDatasource(dt, list, ds);
if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType())) {
datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, customFilter, extFilterList));
} else {
datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, customFilter, extFilterList));
}
} }
data = datasourceProvider.getData(datasourceRequest); data = datasourceProvider.getData(datasourceRequest);
/** /**
......
...@@ -954,7 +954,8 @@ export default { ...@@ -954,7 +954,8 @@ export default {
left_join: 'LEFT JOIN', left_join: 'LEFT JOIN',
right_join: 'RIGHT JOIN', right_join: 'RIGHT JOIN',
inner_join: 'INNER JOIN', inner_join: 'INNER JOIN',
full_join: 'FULL JOIN' full_join: 'FULL JOIN',
can_not_union_diff_datasource: 'Union dataset must have same data source'
}, },
datasource: { datasource: {
datasource: 'Data Source', datasource: 'Data Source',
......
...@@ -954,7 +954,8 @@ export default { ...@@ -954,7 +954,8 @@ export default {
left_join: '左連接', left_join: '左連接',
right_join: '右連接', right_join: '右連接',
inner_join: '內連接', inner_join: '內連接',
full_join: '全連接' full_join: '全連接',
can_not_union_diff_datasource: '被關聯數據集必須與當前數據集的數據源一致'
}, },
datasource: { datasource: {
datasource: '數據源', datasource: '數據源',
......
...@@ -954,7 +954,8 @@ export default { ...@@ -954,7 +954,8 @@ export default {
left_join: '左连接', left_join: '左连接',
right_join: '右连接', right_join: '右连接',
inner_join: '内连接', inner_join: '内连接',
full_join: '全连接' full_join: '全连接',
can_not_union_diff_datasource: '被关联数据集必须与当前数据集的数据源一致'
}, },
datasource: { datasource: {
datasource: '数据源', datasource: '数据源',
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
</el-row> </el-row>
<el-col style="display: flex;flex-direction: row"> <el-col style="display: flex;flex-direction: row">
<el-col class="panel-height" style="width: 220px;border-right:solid 1px #dcdfe6;border-top:solid 1px #dcdfe6;padding-right: 15px;overflow-y: auto;"> <el-col class="panel-height" style="width: 220px;border-right:solid 1px #dcdfe6;border-top:solid 1px #dcdfe6;padding-right: 15px;overflow-y: auto;">
<dataset-group-selector :custom-type="customType" :table="table" :mode="1" :checked-list="checkedList" :union-data="unionData" @getTable="getTable" /> <dataset-group-selector :custom-type="customType" :table="table" :checked-list="checkedList" :union-data="unionData" @getTable="getTable" />
</el-col> </el-col>
<el-col class="panel-height" style="width: 235px;border-top:solid 1px #dcdfe6;padding: 0 15px;overflow-y: auto;"> <el-col class="panel-height" style="width: 235px;border-top:solid 1px #dcdfe6;padding: 0 15px;overflow-y: auto;">
<dataset-custom-field :table="table" :checked-list="checkedList" @getChecked="getChecked" /> <dataset-custom-field :table="table" :checked-list="checkedList" @getChecked="getChecked" />
...@@ -151,9 +151,9 @@ export default { ...@@ -151,9 +151,9 @@ export default {
id: this.param.tableId, id: this.param.tableId,
name: this.name, name: this.name,
sceneId: this.param.id, sceneId: this.param.id,
dataSourceId: null, dataSourceId: this.param.tableId ? this.param.table.dataSourceId : this.table.dataSourceId,
type: 'custom', type: 'custom',
mode: 1, mode: this.param.tableId ? this.param.table.mode : this.table.mode,
info: '{"list":' + JSON.stringify(this.checkedList) + '}' info: '{"list":' + JSON.stringify(this.checkedList) + '}'
} }
post('/dataset/table/customPreview', table).then(response => { post('/dataset/table/customPreview', table).then(response => {
...@@ -202,9 +202,9 @@ export default { ...@@ -202,9 +202,9 @@ export default {
id: this.param.tableId, id: this.param.tableId,
name: this.name, name: this.name,
sceneId: this.param.id, sceneId: this.param.id,
dataSourceId: null, dataSourceId: this.table.dataSourceId,
type: 'custom', type: 'custom',
mode: 1, mode: this.table.mode,
info: '{"list":' + JSON.stringify(this.checkedList) + '}' info: '{"list":' + JSON.stringify(this.checkedList) + '}'
} }
post('/dataset/table/update', table).then(response => { post('/dataset/table/update', table).then(response => {
......
...@@ -265,7 +265,9 @@ export default { ...@@ -265,7 +265,9 @@ export default {
mode: this.mode < 0 ? null : this.mode, mode: this.mode < 0 ? null : this.mode,
typeFilter: this.customType ? this.customType : null typeFilter: this.customType ? this.customType : null
}, false).then(response => { }, false).then(response => {
this.tables = response.data this.tables = response.data.filter(ele => {
return !(ele.mode === 0 && ele.type === 'sql')
})
for (let i = 0; i < this.tables.length; i++) { for (let i = 0; i < this.tables.length; i++) {
if (this.tables[i].mode === 1 && this.kettleRunning === false) { if (this.tables[i].mode === 1 && this.kettleRunning === false) {
this.$set(this.tables[i], 'disabled', true) this.$set(this.tables[i], 'disabled', true)
......
...@@ -81,16 +81,16 @@ ...@@ -81,16 +81,16 @@
</el-table-column> </el-table-column>
<el-table-column property="originName" :label="$t('dataset.field_origin_name')" width="100"> <el-table-column property="originName" :label="$t('dataset.field_origin_name')" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<span :title="scope.row.originName" class="field-class" style="display: inline-block;width: 100%;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"> <span :title="scope.row.originName" class="field-class" style="width: 100%;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
{{ scope.row.originName }} <span style="font-size: 12px;">{{ scope.row.originName }}</span>
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column property="groupType" :label="$t('dataset.field_group_type')" width="180"> <el-table-column property="groupType" :label="$t('dataset.field_group_type')" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<el-radio-group v-model="scope.row.groupType"> <el-radio-group v-model="scope.row.groupType" size="mini">
<el-radio label="d">{{ $t('chart.dimension') }}</el-radio> <el-radio-button label="d">{{ $t('chart.dimension') }}</el-radio-button>
<el-radio label="q">{{ $t('chart.quota') }}</el-radio> <el-radio-button label="q">{{ $t('chart.quota') }}</el-radio-button>
</el-radio-group> </el-radio-group>
</template> </template>
</el-table-column> </el-table-column>
......
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
<el-radio class="union-relation-css" label="1:N">{{ $t('dataset.left_join') }}</el-radio> <el-radio class="union-relation-css" label="1:N">{{ $t('dataset.left_join') }}</el-radio>
<el-radio class="union-relation-css" label="N:1">{{ $t('dataset.right_join') }}</el-radio> <el-radio class="union-relation-css" label="N:1">{{ $t('dataset.right_join') }}</el-radio>
<el-radio class="union-relation-css" label="1:1">{{ $t('dataset.inner_join') }}</el-radio> <el-radio class="union-relation-css" label="1:1">{{ $t('dataset.inner_join') }}</el-radio>
<el-radio class="union-relation-css" label="N:N">{{ $t('dataset.full_join') }}</el-radio> <!-- <el-radio class="union-relation-css" label="N:N">{{ $t('dataset.full_join') }}</el-radio>-->
</el-radio-group> </el-radio-group>
</el-col> </el-col>
...@@ -105,7 +105,7 @@ ...@@ -105,7 +105,7 @@
width="500" width="500"
trigger="click" trigger="click"
> >
<dataset-group-selector-tree :fix-height="true" show-mode="union" :custom-type="customType" :mode="1" @getTable="getTable" /> <dataset-group-selector-tree :fix-height="true" show-mode="union" :custom-type="customType" :mode="table.mode" @getTable="getTable" />
<el-button slot="reference" size="mini" style="width: 100%;"> <el-button slot="reference" size="mini" style="width: 100%;">
<p class="table-name-css" :title="targetTable.name || $t('dataset.pls_slc_union_table')">{{ targetTable.name || $t('dataset.pls_slc_union_table') }}</p> <p class="table-name-css" :title="targetTable.name || $t('dataset.pls_slc_union_table')">{{ targetTable.name || $t('dataset.pls_slc_union_table') }}</p>
</el-button> </el-button>
...@@ -204,6 +204,9 @@ export default { ...@@ -204,6 +204,9 @@ export default {
}, },
initUnion() { initUnion() {
if (this.table.id) { if (this.table.id) {
if (this.table.mode === 0) {
this.customType = ['db']
}
post('dataset/union/listByTableId/' + this.table.id, {}).then(response => { post('dataset/union/listByTableId/' + this.table.id, {}).then(response => {
// console.log(response) // console.log(response)
this.unionData = response.data this.unionData = response.data
...@@ -301,6 +304,16 @@ export default { ...@@ -301,6 +304,16 @@ export default {
}) })
return return
} }
if (this.table.mode === 0) {
if (param.dataSourceId !== this.table.dataSourceId) {
this.$message({
type: 'error',
message: this.$t('dataset.can_not_union_diff_datasource'),
showClose: true
})
return
}
}
this.targetTable = param this.targetTable = param
this.union.targetTableId = param.id this.union.targetTableId = param.id
this.union.targetTableFieldId = '' this.union.targetTableFieldId = ''
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
<el-tab-pane :label="$t('dataset.data_preview')" name="dataPreview"> <el-tab-pane :label="$t('dataset.data_preview')" name="dataPreview">
<tab-data-preview :param="param" :table="table" :fields="fields" :data="data" :page="page" :form="tableViewRowForm" @reSearch="reSearch" /> <tab-data-preview :param="param" :table="table" :fields="fields" :data="data" :page="page" :form="tableViewRowForm" @reSearch="reSearch" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane v-if="table.type !== 'custom' && table.mode === 1" :label="$t('dataset.join_view')" name="joinView"> <el-tab-pane v-if="table.type !== 'custom'" :label="$t('dataset.join_view')" name="joinView">
<union-view :param="param" :table="table" /> <union-view :param="param" :table="table" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane v-if="table.mode === 1 && (table.type === 'db' || table.type === 'sql')" :label="$t('dataset.update_info')" name="updateInfo"> <el-tab-pane v-if="table.mode === 1 && (table.type === 'db' || table.type === 'sql')" :label="$t('dataset.update_info')" name="updateInfo">
...@@ -156,10 +156,10 @@ export default { ...@@ -156,10 +156,10 @@ export default {
}, },
editSql() { editSql() {
this.$emit('switchComponent', { name: 'AddSQL', param: { id: this.table.sceneId, tableId: this.table.id }}) this.$emit('switchComponent', { name: 'AddSQL', param: { id: this.table.sceneId, tableId: this.table.id, table: this.table }})
}, },
editCustom() { editCustom() {
this.$emit('switchComponent', { name: 'AddCustom', param: { id: this.table.sceneId, tableId: this.table.id }}) this.$emit('switchComponent', { name: 'AddCustom', param: { id: this.table.sceneId, tableId: this.table.id, table: this.table }})
}, },
reSearch(val) { reSearch(val) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论