Commit c9aa0814 by zhaochengxiang

模型增加需求服务视角

parent cac2edb9
......@@ -75,6 +75,6 @@
"last 1 safari version"
]
},
"proxy": "http://139.198.127.28:17277",
"proxy": "http://139.198.127.28:17389",
"homepage": "http://myhost/data-govern"
}
......@@ -292,4 +292,20 @@ export function* setRootDomainId(payload) {
export function* getMaintenanceRecords(payload) {
return yield call(datamodelerService.getMaintenanceRecords, payload);
}
export function* requirementList(payload) {
return yield call(datamodelerService.requirementList, payload);
}
export function* getBindingDataList(payload) {
return yield call(datamodelerService.getBindingDataList, payload);
}
export function* requirementBind(payload) {
return yield call(datamodelerService.requirementBind, payload);
}
export function* requirementUnbind(payload) {
return yield call(datamodelerService.requirementUnbind, payload);
}
\ No newline at end of file
......@@ -249,3 +249,18 @@ export function autoCreateTable(payload) {
return PostJSON("/metadataharvester/datasource/createTableByDDLList", payload);
}
export function requirementList(payload) {
return GetJSON("/datarequirement/dataReqTechJobAssoc/requirementList", payload);
}
export function getBindingDataList(payload) {
return GetJSON("/datarequirement/dataReqTechJobAssoc/getBindingDataList", payload);
}
export function requirementBind(payload) {
return PostJSON("/datarequirement/dataReqTechJobAssoc/binding", payload);
}
export function requirementUnbind(payload) {
return PostJSON("/datarequirement/dataReqTechJobAssoc/unbinding", payload);
}
\ No newline at end of file
......@@ -6,7 +6,7 @@ import { IsArr, showMessage, isSzseEnv } from './index';
const CancelToken = axios.CancelToken;
const baseURL = '/api/';
const debugEnv = 475629450;
const debugEnv = 328551007;
const instance = axios.create({
baseURL,
......
import React, { useEffect, useState } from "react";
import { Modal, Button, Space, Tree, Row, Col, Table, Pagination } from "antd";
import LocalStorage from 'local-storage';
import { getAttributesByMetadataModel } from "../../../../service/dataassetmanager";
import { dispatch } from '../../../../model';
import { showMessage } from "../../../../util";
const FC = (props) => {
const { visible, onCancel, id } = props;
const [treeData, setTreeData] = useState(undefined);
const [tableData, setTableData] = useState(undefined);
const [confirmLoading, setConfirmLoading] = useState(false);
const [currentTreeId, setCurrentTreeId] = useState(undefined);
const columns = [
{
title: '序号',
dataIndex: 'key',
render: (text, record, index) => {
return (index+1).toString();
},
width: 60,
ellipsis: true,
},
{
title: '模型名称',
dataIndex: 'name',
ellipsis: true,
},
{
title: '中文名称',
dataIndex: 'cnName',
ellipsis: true,
},
{
title: '操作',
key: 'action',
width: 120,
render: (_,record) => (
<a onClick={() => {
dispatch({
type: 'datamodel.requirementBind',
payload: {
data: {
techJobId: id,
assocStringIdList: [record.id]
}
},
callback: data => {
showMessage('warn', '关联成功');
LocalStorage.set('modelChange', !(LocalStorage.get('modelChange')||false));
let event = new Event('storage');
event.key = 'modelChange';
window?.dispatchEvent(event);
}
});
}}>绑定</a>
)
}
];
useEffect(() => {
if (visible) {
getTreeData();
}
}, [visible])
useEffect(() => {
if (currentTreeId) {
getTableData();
}
}, [currentTreeId])
const getTreeData = () => {
dispatch({
type: 'datamodel.refreshDataModelCatalog',
callback: data => {
if (data.subCatalogs && data.subCatalogs.length > 0) {
setCurrentTreeId(data.subCatalogs[0].id);
}
setTreeData(data.subCatalogs);
}
});
}
const getTableData = () => {
dispatch({
type: 'datamodel.getCurrentDataModelCatalog',
payload: {
easyDataModelerCatalogId: currentTreeId
},
callback: data => {
setTableData(data.easyDataModelerDataModels);
}
});
}
const onTreeSelect = (keys, _) => {
if (keys.length > 0) {
setCurrentTreeId(keys[0]);
}
}
const loop = (data) =>
data?.map(item => {
if (item.subCatalogs && item.subCatalogs.length>0) {
return {...item, title: item.name, key: item.id, children: loop(item.subCatalogs)};
}
return {...item, title: item.name, key: item.id, children: null};
});
return (
<Modal
title='选择模型'
visible={ visible }
centered
width='90%'
onCancel={() => { onCancel?.(); } }
footer={
<Space>
<Button onClick={() => onCancel?.() }>取消</Button>
</Space>
}
bodyStyle={{ padding: '24px', height: '70vh', overflow: 'auto' }}
>
<Row>
<Col span={6}>
<Tree
showLine={true}
showIcon={false}
treeData={loop(treeData)}
onSelect={onTreeSelect}
selectedKeys={currentTreeId ? [currentTreeId]: undefined}
/>
</Col>
<Col span={1}>
<div style={{ width: 1, height: 'calc(70vh - 48px)', backgroundColor: '#f0f0f0' }} ></div>
</Col>
<Col span={17}>
<Table
columns={columns}
dataSource={tableData||[]}
rowKey='id'
pagination={{
position: ['bottomCenter'],
size: 'small',
showTotal: (total) => `共${total}条`
}}
/>
</Col>
</Row>
</Modal>
)
}
export default FC;
\ No newline at end of file
......@@ -20,6 +20,10 @@ const viewModes = [
{
key: 'state',
name: '模型状态视角'
},
{
key: 'requirement',
name: '数据需求视角'
}
];
......@@ -223,6 +227,30 @@ const ModelTree = (props) => {
});
}
const getRequirementTreeData = () => {
setLoading(true);
dispatch({
type: 'datamodel.requirementList',
payload: {
techType: 'dataModeler',
},
callback: data => {
setLoading(false);
let _treeData = [];
data?.forEach(item => {
_treeData.push({title: item.requireName, key: item.id, name: item.requireName});
});
setTreeData(_treeData);
setItem(_treeData.length>0?_treeData[0]:{});
onSelect && onSelect(_treeData.length>0?_treeData[0].key:'');
},
error: () => {
setLoading(false);
}
});
}
const generateList = (treeData, list) => {
for (let i = 0; i < treeData.length; i++) {
const node = treeData[i];
......@@ -263,8 +291,10 @@ const ModelTree = (props) => {
if (key === 'dir') {
getDirTreeData();
} else {
} else if (key === 'state') {
getStateTreeData();
} else {
getRequirementTreeData();
}
}
......@@ -311,8 +341,10 @@ const ModelTree = (props) => {
const refresh = () => {
if (viewSelectedKey==='dir') {
getDirTreeData(item?.key||'');
} else {
} else if (viewSelectedKey === 'state') {
getStateTreeData(item?.key||'');
} else {
getRequirementTreeData(item?.key||'');
}
}
......
......@@ -18,7 +18,8 @@ import { dispatch, dispatchLatestHomepage } from '../../../model';
import { Action, CatalogId, ModelerId, Hints, ModelerData, PermitCheckOut, Editable, StateId, Holder, DDL } from '../../../util/constant';
import { AppContext } from '../../../App';
import DebounceInput from './Component/DebounceInput';
import MetadataAnalysis from '../../QianKun/MetadataAnalysis'
import MetadataAnalysis from '../../QianKun/MetadataAnalysis';
import BatchModeler from './Component/BatchModeler';
import './index.less';
......@@ -56,7 +57,9 @@ class Model extends React.Component {
offset: null,
expandTree: true,
showDeleteTip: false,
showUnbindTip: false,
showMode: 'list',
showBatchModeler: false,
}
}
......@@ -139,7 +142,7 @@ class Model extends React.Component {
this.setState({ loadingTableData: false });
}
})
} else {
} else if (currentView === 'state') {
dispatchLatestHomepage({
type: 'datamodel.getCurrentDataModelStateCatalog',
payload: {
......@@ -152,6 +155,19 @@ class Model extends React.Component {
this.setState({ loadingTableData: false });
}
})
} else {
dispatchLatestHomepage({
type: 'datamodel.getBindingDataList',
payload: {
techJobId: catalogId
},
callback: data => {
this.setState({ loadingTableData: false, tableData: data||[], filterTableData: data||[] });
},
error: () => {
this.setState({ loadingTableData: false });
}
})
}
} else {
......@@ -266,6 +282,20 @@ class Model extends React.Component {
this.setState({ showDeleteTip: true });
}
onBatchModelerBtnClick = () => {
this.setState({ showBatchModeler: true });
}
onBatchUnbindBtnClick = () => {
const { selectModelerIds } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
return;
}
this.setState({ showUnbindTip: true });
}
onAutoCreateTable = (item) => {
this.setState({ exportDDLModalVisible: true, selectModelerNames: [item.name||''], exportDDLModalReference: 'createTable', currentModel: item });
......@@ -383,6 +413,15 @@ class Model extends React.Component {
}
}
onBatchModelerCancel = (refresh = false) => {
this.setState({ showBatchModeler: false });
if (refresh) {
this.setState({ selectModelerIds: [] }, () => {
this.onTableChange();
});
}
}
onHistoryAndVersionDrawerCancel = () => {
this.setState({ historyAndVersionDrawerVisible: false });
}
......@@ -434,6 +473,28 @@ class Model extends React.Component {
}
}
onUnbindTipModalCancel = (refresh=false) => {
const { selectModelerIds } = this.state;
this.setState({ showUnbindTip: false });
if (refresh) {
dispatch({
type: 'datamodel.requirementUnbind',
payload: {
data: {
assocStringIdList: selectModelerIds,
techJobId: this.state.catalogId
},
},
callback: (tip) => {
this.onTableChange();
this.setState({ selectModelerIds: [] });
showMessage('warn', '解绑成功');
}
})
}
}
handleShowModeChange = (e) => {
this.setState({ showMode: e.target.value })
}
......@@ -492,43 +553,62 @@ class Model extends React.Component {
}}
>
<Space>
<Space>
<Button onClick={() => { this.setState({ importModalVisible: true }); }}>新建</Button>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onExportOtherBtnClick} disabled={(selectModelerIds||[]).length===0}>导出</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={startFlowTip}>
<Button onClick={this.startFlow} disabled={disableStartFlow}>送审</Button>
</Tooltip>
</Space>
{
(currentView!=='requirement') && <React.Fragment>
<Space>
<Button onClick={() => { this.setState({ importModalVisible: true }); }}>新建</Button>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onExportOtherBtnClick} disabled={(selectModelerIds||[]).length===0}>导出</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={startFlowTip}>
<Button onClick={this.startFlow} disabled={disableStartFlow}>送审</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onRecatalogBtnClick} disabled={(selectModelerIds||[]).length===0}>变更目录</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onBatchDeleteBtnClick} disabled={(selectModelerIds||[]).length===0}>删除</Button>
</Tooltip>
</Space>
</React.Fragment>
}
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onRecatalogBtnClick} disabled={(selectModelerIds||[]).length===0}>变更目录</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onBatchDeleteBtnClick} disabled={(selectModelerIds||[]).length===0}>删除</Button>
</Tooltip>
</Space>
{
(currentView==='requirement') && <React.Fragment>
<Space>
<Button onClick={this.onBatchModelerBtnClick}>引入数据模型</Button>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onBatchUnbindBtnClick} disabled={(selectModelerIds||[]).length===0}>解除绑定</Button>
</Tooltip>
</Space>
</React.Fragment>
}
</Space>
<Space>
<Space>
<Radio.Group onChange={this.handleShowModeChange} value={showMode}>
<Radio.Button value="list">列表展示</Radio.Button>
<Radio.Button value="graph">图形展示</Radio.Button>
</Radio.Group>
</Space>
{
(currentView==='dir'|| currentView==='state' ||keyword!=='') && <Space>
<Radio.Group onChange={this.handleShowModeChange} value={showMode}>
<Radio.Button value="list">列表展示</Radio.Button>
<Radio.Button value="graph">图形展示</Radio.Button>
</Radio.Group>
</Space>
}
{
(currentView==='dir'||keyword!=='') && <Space>
<Select
......@@ -610,6 +690,12 @@ class Model extends React.Component {
ids={selectModelerIds}
onCancel={this.onRecatalogModalCancel}
/>
<BatchModeler
id={catalogId}
visible={this.state.showBatchModeler}
onCancel={this.onBatchModelerCancel}
/>
<HistoryAndVersionDrawer
id={modelerId}
......@@ -628,6 +714,12 @@ class Model extends React.Component {
tip='您确定要删除这些模型吗?'
onCancel={this.onDeleteTipModalCancel}
/>
<DeleteTipModal
visible={this.state.showUnbindTip}
tip='您确定要解绑这些模型吗?'
onCancel={this.onUnbindTipModalCancel}
/>
</div>
);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment