import React, { useState, useEffect, useImperativeHandle, forwardRef, } from 'react' import { Space, Table, Modal, message, Popconfirm, Button, Select, Tabs, Input, } from 'antd' import { SearchOutlined } from '@ant-design/icons' import DatasourceData from '../component/DatasourceData' import DatasourceEdit from '../component/DatasourceEdit' import { getDataSourceList, delDataSource, getTableNamesList, getDataSourceInfo, getAilabList, getAllShareProject, shareAilab, getLakeTable, ailabTablePreview, ailabSchema, lakeTablePreview, lakeSchema, } from '../services' const { Option } = Select const { TabPane } = Tabs const DatasourceManage = ({ dataType }, ref) => { // 查看数据源弹窗是否可可视 const [dataModalVisible, setDataModalVisible] = useState(false) const [dataPreviewVisible, setDataPreviewVisible] = useState(false) const [dsModalVisible, setDsModalVisible] = useState(false) // 初始化数据源列表数据 constructor const [dataSourceList, setDataSourceList] = useState([]) // 初始化ailab列表数据 const [ailabDataList, setAilabDataList] = useState([]) const [filterAilabDataList, setFilterAilabDataList] = useState([]) const [lakeDataList, setLakeDataList] = useState([]) // 表格Loading状态 const [dataLoading, setDataLoading] = useState(false) // 表名 const [tableNames, setTableNames] = useState([]) // 选中数据源 const [datasourceId, setDatasourceId] = useState(null) // 查看是否可点击 const [tableWatcher, setTableWatcher] = useState(false) const [currentDsId, setCurrentDsId] = useState(null) const [currentDsInfo, setCurrentDsInfo] = useState(null) const [isShareData, setIsShareData] = useState(false) //选择表格项 const [selectedRowKeys, setSelectedRowKeys] = useState([]) // 分享的ailab表 const [selectedAilabTable, setSelectedAilabTable] = useState([]) const [projectsList, setProjectsList] = useState([]) const [selectedProjects, setSelectedProjects] = useState([]) // 表内容表头 const [contentCols, setContentCols] = useState([]) // 表内容表数据 const [contentData, setContentData] = useState([]) // 表内容表格Loading状态 const [contentLoading, setContentLoading] = useState(false) // 表结构表头 const [schemaCols, setScheamCols] = useState([]) // 表结构表数据 const [schemaData, setScheamData] = useState([]) // 表结构表格Loading状态 const [schemaLoading, setSchemaLoading] = useState(false) const onSelectChange = newSelectedRowKeys => { setSelectedRowKeys(newSelectedRowKeys) } // 获取列表数据 const fetchDataSourceList = async () => { setDataLoading(true) const { data } = await getDataSourceList() if (data.code === 200) { const list = data.data.items.map(item => { return { key: item.id, datasource_name: item.datasource_name, datasource: item.datasource, tag: item.tag, comments: item.comments, create_time: item.create_time, update_time: item.update_time, } }) setDataSourceList(list) } else { message.error(data.msg) } setDataLoading(false) } const fetchAilabList = async () => { setDataLoading(true) const { data } = await getAilabList() if (data.code === 200) { const list = data.data.map(item => { return { key: item, datatable_name: item, } }) setAilabDataList(list) setFilterAilabDataList(list) } else { message.error(data.msg) } setDataLoading(false) } const fetchLakeList = async () => { setDataLoading(true) const { data } = await getLakeTable() if (data.code === 200) { const list = data.data.map(item => { return { key: item.id, database_name: item.database_name, datatable_name: item.table_name, } }) setLakeDataList(list) } else { message.error(data.msg) } setDataLoading(false) } // 暴露更新列表方法 useImperativeHandle(ref, () => { return { updateSourceList: fetchDataSourceList, updateAilabList: fetchAilabList, updateLakeList: fetchLakeList, } }) // 删除确认 const DeleteConfirm = async key => { const { data } = await delDataSource(key) if (data.code === 200) { message.success('删除成功') fetchDataSourceList() } else { message.success('删除失败') } } //获取数据源表名 const fetchTableNames = async key => { setTableWatcher(true) const { data } = await getTableNamesList(key) if (data.code === 200) { setDatasourceId(key) setTableNames(data.data) setDataModalVisible(true) } else { message.error(data.msg) } setTableWatcher(false) } const handleContent = contentData => { const colsList = contentData?.header?.map(item => { return { title: item, dataIndex: item, key: item, } }) const dataList = contentData?.content?.map((item, index) => { const row = {} row['key'] = index + 1 item.forEach((val, index) => { const title = contentData.header[index] row[title] = val }) return row }) setContentCols(colsList) setContentData(dataList) } const handleSchema = schemaData => { const colsList = [ { title: '序号', dataIndex: 'order', key: 'order', }, { title: '字段', dataIndex: 'field', key: 'field', }, { title: '属性', dataIndex: 'attribute', key: 'attribute', }, ] const dataList = schemaData?.map((item, index) => { const row = {} row['key'] = index + 1 const [order, field, attribute] = item.split(':') row['order'] = order row['field'] = field row['attribute'] = attribute return row }) setScheamCols(colsList) setScheamData(dataList) } const fetchAilabDataPreview = async (key, type) => { setContentLoading(true) const { data } = type === 'ailab' ? await ailabTablePreview(key) : await lakeTablePreview(key) if (data.code === 200) { handleContent(data.data) } else { message.error(data.msg) } setContentLoading(false) } const fetchAilabSchema = async (key, type) => { setSchemaLoading(true) const { data } = type === 'ailab' ? await ailabSchema(key) : await lakeSchema(key) if (data.code === 200) { handleSchema(data.data) } else { message.error(data.msg) } setSchemaLoading(false) } const watchAilabData = async table_name => { fetchAilabDataPreview(table_name, 'ailab') fetchAilabSchema(table_name, 'ailab') setDataPreviewVisible(true) } const watchLakeData = async table_name => { fetchAilabDataPreview(table_name, 'lake') fetchAilabSchema(table_name, 'lake') setDataPreviewVisible(true) } useEffect(() => { if (sessionStorage.getItem('project_id')) { switch (dataType) { case 'datasource': fetchDataSourceList() break case 'ailab': fetchAilabList() break case 'datalake': fetchLakeList() break default: break } } }, [dataType, sessionStorage.getItem('project_id')]) useEffect(() => { if (isShareData) { fetchProjects() } }, [isShareData]) const fetchProjects = async () => { const { data } = await getAllShareProject() if (data.code === 200) { const list = data.data.map(item => { return { label: item.name, value: item.id, } }) setProjectsList(list) } else { message.error(data.msg) } } // 格式化事件 const formatTime = time => { const date = new Date(Number(time) * 1000) const YY = date.getFullYear() const MM = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 const DD = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() const hh = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() const mm = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() const ss = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() return YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss } // 编辑数据 const editData = async id => { const { data } = await getDataSourceInfo(id) if (data.code === 200) { setCurrentDsId(id) setCurrentDsInfo(data.data) setDsModalVisible(true) } else { message.error(data.msg) } } // 数据源表格项 const ds_columns = [ { title: '数据源名称', dataIndex: 'datasource_name', key: 'datasource_name', }, { title: '数据源类型', dataIndex: 'datasource', key: 'datasource', }, { title: '标签', dataIndex: 'tag', key: 'tag', render: text => {text}, }, { title: '详情', key: 'comments', dataIndex: 'comments', }, { title: '创建时间', key: 'create_time', dataIndex: 'create_time', render: time => formatTime(time), }, { title: '更新时间', key: 'update_time', dataIndex: 'update_time', render: time => formatTime(time), }, { title: '操作', key: 'operation', render: (_, record) => ( {sessionStorage.getItem('role') === '1' && ( )} {sessionStorage.getItem('role') === '1' && ( DeleteConfirm(record.key)}> )} ), }, ] //AIlab表格项 const ailab_columns = [ { title: '数据表名称', dataIndex: 'datatable_name', key: 'datatable_name', align: 'center', }, { title: '操作', key: 'operation', align: 'center', width: '25%', render: (_, record) => ( {['1', '2', '3'].includes(sessionStorage.getItem('role')) && ( )} ), }, ] const dl_columns = [ { title: '数据库名称', dataIndex: 'database_name', key: 'database_name', align: 'center', }, { title: '数据表名称', dataIndex: 'datatable_name', key: 'datatable_name', align: 'center', }, { title: '操作', key: 'operation', align: 'center', width: '25%', render: (_, record) => ( ), }, ] // 查看数据源弹窗取消 const handledataModalCancel = () => { setDataModalVisible(false) } const handledsModalCancel = () => { setDsModalVisible(false) } const handledataPreviewCancel = () => { setDataPreviewVisible(false) } // 查看数据源弹窗数据 const dataModal = ( ) const dataPreviewModal = ( {
} ) const dsEditModal = ( setDsModalVisible(val)} /> ) const rowSelection = { selectedRowKeys, onChange: onSelectChange, columnWidth: '100px', selections: [ Table.SELECTION_ALL, Table.SELECTION_INVERT, Table.SELECTION_NONE, ], } const shareBtn = () => ( ) const searchTable = e => { const list = ailabDataList.filter(item => item.datatable_name.includes(e.target.value) ) setFilterAilabDataList(list) } const searchTool = () => ( } /> ) const shareTable = async () => { if (selectedProjects.length) { const parmas = { table_names: selectedAilabTable, project_ids: selectedProjects, } const { data } = await shareAilab(parmas) if (data.code === 200) { message.success('分享成功') setIsShareData(false) setSelectedProjects([]) } else { message.error(data.msg) } } else { message.error('请选择项目') } } const shareMadal = ( { setIsShareData(false) setSelectedProjects([]) }}> 选择分享至: ) // 最终渲染 return (
{dataType === 'datasource' && (
)} {dataType === 'ailab' && (
)} {dataType === 'datalake' && (
)} {dataModal} {dataPreviewModal} {dsEditModal} {shareMadal} ) } export default forwardRef(DatasourceManage)