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

feat(数据集):草稿,数据集 关联视图 功能。自助数据集需要关联视图做支撑,先简单做个 数据集 关联视图 的功能,后边再优化

上级 5a2a5bb3
package io.dataease.base.domain;
import java.io.Serializable;
import lombok.Data;
@Data
public class DatasetTableUnion implements Serializable {
private String id;
private String sourceTableId;
private String sourceTableFieldId;
private String sourceUnionRelation;
private String targetTableId;
private String targetTableFieldId;
private String targetUnionRelation;
private String createBy;
private Long createTime;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package io.dataease.base.mapper;
import io.dataease.base.domain.DatasetTableUnion;
import io.dataease.base.domain.DatasetTableUnionExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface DatasetTableUnionMapper {
long countByExample(DatasetTableUnionExample example);
int deleteByExample(DatasetTableUnionExample example);
int deleteByPrimaryKey(String id);
int insert(DatasetTableUnion record);
int insertSelective(DatasetTableUnion record);
List<DatasetTableUnion> selectByExample(DatasetTableUnionExample example);
DatasetTableUnion selectByPrimaryKey(String id);
int updateByExampleSelective(@Param("record") DatasetTableUnion record, @Param("example") DatasetTableUnionExample example);
int updateByExample(@Param("record") DatasetTableUnion record, @Param("example") DatasetTableUnionExample example);
int updateByPrimaryKeySelective(DatasetTableUnion record);
int updateByPrimaryKey(DatasetTableUnion record);
}
\ No newline at end of file
package io.dataease.base.mapper.ext;
import io.dataease.dto.dataset.DataSetTableUnionDTO;
import java.util.List;
public interface ExtDatasetTableUnionMapper {
List<DataSetTableUnionDTO> selectBySourceTableId(String tableId);
List<DataSetTableUnionDTO> selectByTargetTableId(String tableId);
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="io.dataease.base.mapper.ext.ExtDatasetTableUnionMapper">
<resultMap id="BaseResultMap" type="io.dataease.dto.dataset.DataSetTableUnionDTO">
<id column="id" jdbcType="VARCHAR" property="id"/>
<result column="source_table_id" jdbcType="VARCHAR" property="sourceTableId"/>
<result column="source_table_field_id" jdbcType="VARCHAR" property="sourceTableFieldId"/>
<result column="source_union_relation" jdbcType="VARCHAR" property="sourceUnionRelation"/>
<result column="target_table_id" jdbcType="VARCHAR" property="targetTableId"/>
<result column="target_table_field_id" jdbcType="VARCHAR" property="targetTableFieldId"/>
<result column="target_union_relation" jdbcType="VARCHAR" property="targetUnionRelation"/>
<result column="create_by" jdbcType="VARCHAR" property="createBy"/>
<result column="create_time" jdbcType="BIGINT" property="createTime"/>
<result column="sourceTableName" jdbcType="VARCHAR" property="sourceTableName"/>
<result column="sourceTableFieldName" jdbcType="VARCHAR" property="sourceTableFieldName"/>
<result column="targetTableName" jdbcType="VARCHAR" property="targetTableName"/>
<result column="targetTableFieldName" jdbcType="VARCHAR" property="targetTableFieldName"/>
</resultMap>
<select id="selectBySourceTableId" resultMap="BaseResultMap" parameterType="java.lang.String">
select dtu.*,dt.name as sourceTableName,dtf.name as sourceTableFieldName,dt1.name as targetTableName,dtf1.name as targetTableFieldName
from dataset_table_union dtu
left join dataset_table dt on dt.id = dtu.source_table_id
left join dataset_table_field dtf on dtf.id = dtu.source_table_field_id
left join dataset_table dt1 on dt1.id = dtu.target_table_id
left join dataset_table_field dtf1 on dtf1.id = dtu.target_table_field_id
where dtu.source_table_id = #{tableId,jdbcType=VARCHAR}
order by dtu.create_time
</select>
<select id="selectByTargetTableId" resultMap="BaseResultMap" parameterType="java.lang.String">
select dtu.*,dt.name as sourceTableName,dtf.name as sourceTableFieldName,dt1.name as targetTableName,dtf1.name as targetTableFieldName
from dataset_table_union dtu
left join dataset_table dt on dt.id = dtu.source_table_id
left join dataset_table_field dtf on dtf.id = dtu.source_table_field_id
left join dataset_table dt1 on dt1.id = dtu.target_table_id
left join dataset_table_field dtf1 on dtf1.id = dtu.target_table_field_id
where dtu.target_table_id = #{tableId,jdbcType=VARCHAR}
order by dtu.create_time
</select>
</mapper>
\ No newline at end of file
package io.dataease.controller.dataset;
import io.dataease.base.domain.DatasetTableUnion;
import io.dataease.dto.dataset.DataSetTableUnionDTO;
import io.dataease.service.dataset.DataSetTableUnionService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author gin
* @Date 2021/5/7 10:30 上午
*/
@RestController
@RequestMapping("dataset/union")
public class DataSetTableUnionController {
@Resource
private DataSetTableUnionService dataSetTableUnionService;
@PostMapping("save")
public DatasetTableUnion save(@RequestBody DatasetTableUnion datasetTableUnion) {
return dataSetTableUnionService.save(datasetTableUnion);
}
@PostMapping("delete/{id}")
public void delete(@PathVariable String id) {
dataSetTableUnionService.delete(id);
}
@PostMapping("listByTableId/{tableId}")
public List<DataSetTableUnionDTO> listByTableId(@PathVariable String tableId) {
return dataSetTableUnionService.listByTableId(tableId);
}
}
package io.dataease.dto.dataset;
import io.dataease.base.domain.DatasetTableUnion;
import lombok.Getter;
import lombok.Setter;
/**
* @Author gin
* @Date 2021/5/6 6:08 下午
*/
@Getter
@Setter
public class DataSetTableUnionDTO extends DatasetTableUnion {
private String sourceTableName;
private String sourceTableFieldName;
private String targetTableName;
private String targetTableFieldName;
}
package io.dataease.service.dataset;
import io.dataease.base.domain.DatasetTableUnion;
import io.dataease.base.mapper.DatasetTableUnionMapper;
import io.dataease.base.mapper.ext.ExtDatasetTableUnionMapper;
import io.dataease.commons.utils.AuthUtils;
import io.dataease.dto.dataset.DataSetTableUnionDTO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @Author gin
* @Date 2021/5/6 6:03 下午
*/
@Service
@Transactional
public class DataSetTableUnionService {
@Resource
private DatasetTableUnionMapper datasetTableUnionMapper;
@Resource
private ExtDatasetTableUnionMapper extDatasetTableUnionMapper;
public DatasetTableUnion save(DatasetTableUnion datasetTableUnion) {
if (StringUtils.isEmpty(datasetTableUnion.getId())) {
datasetTableUnion.setId(UUID.randomUUID().toString());
datasetTableUnion.setCreateBy(AuthUtils.getUser().getUsername());
datasetTableUnion.setCreateTime(System.currentTimeMillis());
datasetTableUnionMapper.insert(datasetTableUnion);
} else {
datasetTableUnionMapper.updateByPrimaryKeySelective(datasetTableUnion);
}
return datasetTableUnion;
}
public void delete(String id) {
datasetTableUnionMapper.deleteByPrimaryKey(id);
}
public List<DataSetTableUnionDTO> listByTableId(String tableId) {
List<DataSetTableUnionDTO> sourceList = extDatasetTableUnionMapper.selectBySourceTableId(tableId);
List<DataSetTableUnionDTO> targetList = extDatasetTableUnionMapper.selectByTargetTableId(tableId);
sourceList.addAll(targetList.stream().map(ele -> {
DataSetTableUnionDTO dto = new DataSetTableUnionDTO();
dto.setId(ele.getId());
dto.setSourceTableId(ele.getTargetTableId());
dto.setSourceTableFieldId(ele.getTargetTableFieldId());
dto.setSourceTableName(ele.getTargetTableName());
dto.setSourceTableFieldName(ele.getTargetTableFieldName());
dto.setTargetTableId(ele.getSourceTableId());
dto.setTargetTableFieldId(ele.getSourceTableFieldId());
dto.setTargetTableName(ele.getSourceTableName());
dto.setTargetTableFieldName(ele.getSourceTableFieldName());
dto.setSourceUnionRelation(ele.getTargetUnionRelation());
dto.setTargetUnionRelation(ele.getSourceUnionRelation());
dto.setCreateBy(ele.getCreateBy());
dto.setCreateTime(ele.getCreateTime());
return dto;
}).collect(Collectors.toList()));
sourceList.sort(Comparator.comparing(DatasetTableUnion::getCreateTime));
return sourceList;
}
}
DROP TABLE IF EXISTS `dataset_table_union`;
CREATE TABLE IF NOT EXISTS `dataset_table_union`
(
`id` varchar(50) NOT NULL COMMENT 'ID',
`source_table_id` varchar(50) COMMENT '关联表ID',
`source_table_field_id` varchar(50) COMMENT '关联字段ID',
`source_union_relation` varchar(50) COMMENT '关联关系,1:1、1:N、N:1',
`target_table_id` varchar(50) COMMENT '被关联表ID',
`target_table_field_id` varchar(50) COMMENT '被关联字段ID',
`target_union_relation` varchar(50) COMMENT '被关联关系,1:1、1:N、N:1',
`create_by` varchar(50) COMMENT '创建人ID',
`create_time` bigint(13) COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
\ No newline at end of file
......@@ -798,7 +798,17 @@ export default {
pls_input_less_9: '请输入9位以内的正整数',
field_edit: '编辑字段',
table_already_add_to: '该表已添加至',
uploading: '上传中...'
uploading: '上传中...',
add_union: '添加关联',
union_setting: '关联设置',
pls_slc_union_field: '请选择关联字段',
pls_slc_union_table: '请选择关联表',
source_table: '关联表',
source_field: '关联字段',
target_table: '被关联表',
target_field: '被关联字段',
union_relation: '关联关系',
pls_setting_union_success: '请正确设置关联关系'
},
datasource: {
datasource: '数据源',
......
......@@ -79,6 +79,7 @@
node-key="id"
:expand-on-click-node="true"
class="tree-list"
highlight-current
@node-click="sceneClick"
>
<span slot-scope="{ node, data }" class="custom-tree-node-list">
......
<template>
<el-row>
<el-button size="mini" @click="showUnionEdit">{{ $t('dataset.add_union') }}</el-button>
<el-row>
<el-table
size="mini"
:data="unionData"
style="width: 100%;margin-top: 10px;"
>
<el-table-column
prop="sourceTableName"
:label="$t('dataset.source_table')"
/>
<el-table-column
prop="sourceTableFieldName"
:label="$t('dataset.source_field')"
/>
<el-table-column
prop="sourceUnionRelation"
:label="$t('dataset.union_relation')"
/>
<el-table-column
prop="targetTableName"
:label="$t('dataset.target_table')"
/>
<el-table-column
prop="targetTableFieldName"
:label="$t('dataset.target_field')"
/>
<el-table-column
fixed="right"
width="100"
>
<template slot-scope="scope">
<el-button type="text" size="mini" @click="edit(scope.row)">{{ $t('dataset.edit') }}</el-button>
<el-button type="text" size="mini" @click="deleteUnion(scope.row)">{{ $t('dataset.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-dialog
v-dialogDrag
:title="$t('dataset.union_setting')"
:visible="editUnion"
:show-close="false"
width="600px"
class="dialog-css"
>
<el-row style="display: flex;align-items: center;justify-content: center;">
<el-col :span="6">
<p class="table-name-css">{{ table.name }}</p>
<el-select v-model="union.sourceTableFieldId" :placeholder="$t('dataset.pls_slc_union_field')" filterable clearable size="mini">
<el-option
v-for="item in sourceFieldOption"
:key="item.id"
:label="item.name"
:value="item.id"
>
<span>
<span v-if="item.deType === 0">
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
</span>
<span v-if="item.deType === 1">
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
</span>
<span v-if="item.deType === 2 || item.deType === 3">
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
</span>
</span>
<span>
{{ item.name }}
</span>
</el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-radio-group v-model="union.sourceUnionRelation" size="mini" style="display: block;width: 100%;text-align: center;">
<el-radio class="union-relation-css" label="1:1">1 : 1</el-radio>
<el-radio class="union-relation-css" label="1:N">1 : N</el-radio>
<el-radio class="union-relation-css" label="N:1">N : 1</el-radio>
</el-radio-group>
</el-col>
<el-col :span="6">
<el-popover
placement="bottom"
width="400"
trigger="hover"
>
<dataset-group-selector @getTable="getTable" />
<el-button slot="reference" size="mini">{{ $t('dataset.pls_slc_union_table') }}</el-button>
</el-popover>
<el-select v-model="union.targetTableFieldId" :placeholder="$t('dataset.pls_slc_union_field')" filterable clearable size="mini">
<el-option
v-for="item in targetFieldOption"
:key="item.id"
:label="item.name"
:value="item.id"
>
<span>
<span v-if="item.deType === 0">
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
</span>
<span v-if="item.deType === 1">
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
</span>
<span v-if="item.deType === 2 || item.deType === 3">
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
</span>
</span>
<span>
{{ item.name }}
</span>
</el-option>
</el-select>
</el-col>
</el-row>
<div slot="footer" class="dialog-footer">
<el-button size="mini" @click="closeUnion">{{ $t('dataset.cancel') }}</el-button>
<el-button type="primary" size="mini" @click="saveUnion">{{ $t('dataset.confirm') }}</el-button>
</div>
</el-dialog>
</el-row>
</template>
<script>
import { post, fieldList } from '../../../api/dataset/dataset'
import DatasetGroupSelector from '../common/DatasetGroupSelector'
export default {
name: 'UnionView',
components: { DatasetGroupSelector },
props: {
table: {
type: Object,
required: true
}
},
data() {
return {
union: {
id: null,
sourceTableId: this.table.id,
sourceTableFieldId: '',
sourceUnionRelation: '',
targetTableId: '',
targetTableFieldId: '',
targetUnionRelation: ''
},
unionData: [],
editUnion: false,
sourceFieldOption: [],
targetFieldOption: []
}
},
watch: {
'table': function() {
this.initUnion()
}
},
mounted() {
this.initUnion()
},
methods: {
initUnion() {
post('dataset/union/listByTableId/' + this.table.id, {}).then(response => {
// console.log(response)
this.unionData = response.data
})
},
showUnionEdit() {
fieldList(this.table.id).then(response => {
this.sourceFieldOption = response.data
})
this.editUnion = true
},
saveUnion() {
console.log(this.union)
if (!this.union.sourceTableFieldId || !this.union.sourceUnionRelation || !this.union.targetTableId || !this.union.targetTableFieldId) {
this.$message({
type: 'error',
message: this.$t('dataset.pls_setting_union_success'),
showClose: true
})
return
}
this.union.targetUnionRelation = this.union.sourceUnionRelation.split('').reverse().join('')
post('dataset/union/save', this.union).then(response => {
this.$message({
type: 'success',
message: this.$t('dataset.save_success'),
showClose: true
})
this.closeUnion()
this.initUnion()
})
},
closeUnion() {
this.editUnion = false
this.resetUnion()
},
resetUnion() {
this.union = {
id: null,
sourceTableId: this.table.id,
sourceTableFieldId: '',
sourceUnionRelation: '',
targetTableId: '',
targetTableFieldId: '',
targetUnionRelation: ''
}
},
edit(item) {
this.union = JSON.parse(JSON.stringify(item))
fieldList(this.union.targetTableId).then(response => {
this.targetFieldOption = response.data
this.showUnionEdit()
})
},
deleteUnion(item) {
this.$confirm(this.$t('dataset.confirm_delete'), this.$t('dataset.tips'), {
confirmButtonText: this.$t('dataset.confirm'),
cancelButtonText: this.$t('dataset.cancel'),
type: 'warning'
}).then(() => {
post('dataset/union/delete/' + item.id, {}).then(response => {
this.$message({
type: 'success',
message: this.$t('dataset.delete_success'),
showClose: true
})
this.initUnion()
})
})
},
getTable(param) {
// console.log(param)
this.union.targetTableId = param.id
this.union.targetTableFieldId = ''
fieldList(param.id).then(response => {
this.targetFieldOption = response.data
})
}
}
}
</script>
<style scoped>
.table-name-css{
margin: 4px 2px;
}
.union-relation-css{
display: block;
width: 100%;
padding: 4px 10px;
}
.dialog-css>>>.el-dialog__title {
font-size: 14px;
}
.dialog-css >>> .el-dialog__header {
padding: 20px 20px 0;
}
.dialog-css >>> .el-dialog__body {
padding: 10px 20px 20px;
}
</style>
......@@ -32,7 +32,7 @@
<tab-data-preview :table="table" :fields="fields" :data="data" :page="page" :form="tableViewRowForm" @reSearch="reSearch" />
</el-tab-pane>
<el-tab-pane :label="$t('dataset.join_view')" name="joinView">
关联视图 TODO
<union-view :table="table" />
</el-tab-pane>
<el-tab-pane v-if="table.mode === 1 && (table.type === 'db' || table.type === 'sql')" :label="$t('dataset.update_info')" name="updateInfo">
<update-info :table="table" />
......@@ -46,10 +46,11 @@ import { getTable, post } from '@/api/dataset/dataset'
import TabDataPreview from './TabDataPreview'
import UpdateInfo from './UpdateInfo'
import DatasetChartDetail from '../common/DatasetChartDetail'
import UnionView from './UnionView'
export default {
name: 'ViewTable',
components: { DatasetChartDetail, UpdateInfo, TabDataPreview },
components: { UnionView, DatasetChartDetail, UpdateInfo, TabDataPreview },
props: {
param: {
type: String,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论