Commit 5fbabf4d by zhaochengxiang

资产属性关联

parent 047ba395
...@@ -77,6 +77,6 @@ ...@@ -77,6 +77,6 @@
"last 1 safari version" "last 1 safari version"
] ]
}, },
"proxy": "http://139.198.127.28:17277", "proxy": "http://139.198.126.96:8089",
"homepage": "http://myhost/data-govern" "homepage": "http://myhost/data-govern"
} }
...@@ -201,6 +201,22 @@ export function* getRelAttrByModel(payload) { ...@@ -201,6 +201,22 @@ export function* getRelAttrByModel(payload) {
return yield call(service.getRelAttrByModel, payload); return yield call(service.getRelAttrByModel, payload);
} }
export function* listSourceModels(payload) {
return yield call(service.listSourceModels, payload);
}
export function* saveEleAndAttrRelWithSourceModel(payload) {
return yield call(service.saveEleAndAttrRelWithSourceModel, payload);
}
export function* getRelAttrBySourceModel(payload) {
return yield call(service.getRelAttrBySourceModel, payload);
}
export function* deleteRelAttrBySourceModel(payload) {
return yield call(service.deleteRelAttrBySourceModel, payload);
}
export function* fillElementValueBeforeCreate(payload) { export function* fillElementValueBeforeCreate(payload) {
return yield call(service.fillElementValueBeforeCreate, payload); return yield call(service.fillElementValueBeforeCreate, payload);
} }
......
...@@ -212,10 +212,30 @@ export function getRelAttrByModel(payload) { ...@@ -212,10 +212,30 @@ export function getRelAttrByModel(payload) {
return PostJSON("/dataassetmanager/eleAndAttrApi/getRelAttrByModel", payload); return PostJSON("/dataassetmanager/eleAndAttrApi/getRelAttrByModel", payload);
} }
export function listSourceModels() {
return GetJSON("/dataassetmanager/eleAndAttrApi/listSourceModels")
}
export function saveEleAndAttrRelWithSourceModel(payload) {
return PostJSON("/dataassetmanager/eleAndAttrApi/saveEleAndAttrRelWithSourceModel", payload)
}
export function getRelAttrBySourceModel(payload) {
return GetJSON("/dataassetmanager/eleAndAttrApi/getRelAttrBySourceModel", payload)
}
export function deleteRelAttrBySourceModel(payload) {
return PostJSON("/dataassetmanager/eleAndAttrApi/delEleAndAttrRelWithSourceModel", payload)
}
export function fillElementValueBeforeCreate(payload) { export function fillElementValueBeforeCreate(payload) {
return PostJSON("/dataassetmanager/eleAndAttrApi/fillElementValueBeforeCreate", payload); return PostJSON("/dataassetmanager/eleAndAttrApi/fillElementValueBeforeCreate", payload);
} }
export function listSupportSourceModels() {
return GetJSON("/dataassetmanager/eleAndAttrApi/listSupportSourceModels");
}
export function countResourceState(payload) { export function countResourceState(payload) {
return GetJSON("/dataassetmanager/countApi/countResourceState", payload); return GetJSON("/dataassetmanager/countApi/countResourceState", payload);
} }
......
import React, { useEffect, useState } from 'react'; import React, { useEffect, useMemo, useRef, useState } from 'react';
import { Modal, Form, TreeSelect, Select, Space, Button, Row, Col, } from 'antd'; import { Modal, Form, TreeSelect, Select, Space, Button, Row, Col, Tabs, Spin, Input } from 'antd';
import { dispatch } from '../../../../model'; import { dispatch } from '../../../../model';
import { showMessage } from '../../../../util';
const AddSourceModelName = '新增数据来源'
const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...restProps }) => { const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...restProps }) => {
const [ attributes, setAttributes ] = useState([]); const [ attributes, setAttributes ] = useState([]);
...@@ -98,82 +101,79 @@ const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...rest ...@@ -98,82 +101,79 @@ const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...rest
); );
} }
const AttributeRelationModal = (props) => { const AttributeRelationWithSourceModel = (props) => {
const { visible, onCancel } = props; const { elements, sourceModel, supportSourceModelsName, metadataModelTreeData, activeKey, onChange } = props;
const [ loading, setLoading ] = useState(false)
const [ confirmLoading, setConfirmLoading ] = useState(false); const [ confirmLoading, setConfirmLoading ] = useState(false);
const [ currentRelations, setCurrentRelations ] = useState();
const [ metadataModelTreeData, setMetadataModelTreeData ] = useState([]);
const [ elements, setElements] = useState([]);
const [ form ] = Form.useForm(); const [ form ] = Form.useForm();
const [modal, contextHolder] = Modal.useModal()
useEffect(() => { useEffect(() => {
if (visible) { if (sourceModel) {
getMetadataModelTree(); getRelAttrBySourceModel()
} else {
form.resetFields()
} }
//eslint-disable-next-line react-hooks/exhaustive-deps form.setFieldsValue({ sourceModel })
}, [visible]) }, [activeKey, sourceModel])
const getMetadataModelTree = () => {
dispatch({
type: 'assetmanage.getMetadataModelTree',
callback: data => {
let newData = [...data];
function recursion(_data, superKey='') {
if ((_data||[]).length===0) return; useEffect(() => {
if (currentRelations && elements?.length > 0) {
(_data||[]).forEach(item=> { let newFiledsValue = {};
item.title = item.nodeName||''; (currentRelations||[]).forEach(item => {
item.value = superKey + '/' +(item.nodeName||''); newFiledsValue[item.elementId] = {model: item.model, modelValue: item.model, attrName: item.attrName||'', attrCnName: item.attrCnName||''};
})
recursion(item.children, item.value);
})
}
recursion(newData);
setMetadataModelTreeData(newData||[]);
loadElementWithoutCustom(); form.setFieldsValue(newFiledsValue);
}, }
error: () => { }, [currentRelations, elements])
}
});
}
const loadElementWithoutCustom = () => { const getRelAttrBySourceModel = () => {
setLoading(true)
dispatch({ dispatch({
type: 'assetmanage.loadElementWithoutCustom', type: 'assetmanage.getRelAttrBySourceModel',
payload: {
sourceModel
},
callback: data => { callback: data => {
setElements(data||[]); setLoading(false)
getRelAttrByModel(); setCurrentRelations(data||[])
}, },
error: () => { error: () => {
setLoading(false)
} }
}); });
} }
const getRelAttrByModel = () => { const onDelete = () => {
dispatch({ modal.confirm({
type: 'assetmanage.getRelAttrByModel', title: '提示!',
callback: data => { content: '您确定要删除该来源模型名称吗?',
let _fieldsValue = {}; onOk: () => {
(data||[]).forEach(item => { dispatch({
_fieldsValue[item.elementId] = {model: item.model, modelValue: item.model, attrName: item.attrName||'', attrCnName: item.attrCnName||''}; type: 'assetmanage.deleteRelAttrBySourceModel',
}) payload: {
params: {
form.setFieldsValue(_fieldsValue); sourceModel
}, }
error: () => { },
callback: () => {
showMessage('success', '删除成功')
onChange?.('delete')
},
error: () => {
}
});
} }
}); });
} }
const onOk = async() => { const onOk = async () => {
try { try {
const row = await form.validateFields(); const row = await form.validateFields();
...@@ -189,13 +189,17 @@ const AttributeRelationModal = (props) => { ...@@ -189,13 +189,17 @@ const AttributeRelationModal = (props) => {
setConfirmLoading(true); setConfirmLoading(true);
dispatch({ dispatch({
type: 'assetmanage.saveEleAndAttrRel', type: 'assetmanage.saveEleAndAttrRelWithSourceModel',
payload: { payload: {
data: newRels data: newRels,
params: {
sourceModel: row.sourceModel,
}
}, },
callback: data => { callback: data => {
reset(); showMessage('success', sourceModel?'更新成功':'新增成功')
onCancel && onCancel(); setConfirmLoading(false);
onChange?.('update', row.sourceModel)
}, },
error: () => { error: () => {
setConfirmLoading(false); setConfirmLoading(false);
...@@ -208,11 +212,6 @@ const AttributeRelationModal = (props) => { ...@@ -208,11 +212,6 @@ const AttributeRelationModal = (props) => {
} }
} }
const reset = () => {
setConfirmLoading(false);
form.resetFields();
}
const formItemLayout = { const formItemLayout = {
labelCol: { labelCol: {
xs: { span: 24 }, xs: { span: 24 },
...@@ -224,45 +223,204 @@ const AttributeRelationModal = (props) => { ...@@ -224,45 +223,204 @@ const AttributeRelationModal = (props) => {
}, },
}; };
return <Spin spinning={loading}>
<div className='mb-3' style={{ textAlign: 'right' }}>
<Space>
{
sourceModel && <Button type="primary" danger onClick={() => onDelete()}>删除</Button>
}
<Button type="primary" onClick={() => onOk()} loading={confirmLoading}>确定</Button>
</Space>
</div>
<Form form={form} style={{ maxHeight: 400, overflow: 'auto' }} {...formItemLayout}>
<Form.Item
label='来源模型名称'
name='sourceModel'
rules={[{ required: true, message: '请输入来源名称'}]}
>
<Select
allowClear
placeholder='请选择来源模型名称'
disabled={sourceModel}
>
{
supportSourceModelsName?.map((name, index) => {
return <Select.Option key={index} value={name}>
{ name }
</Select.Option>
})
}
</Select>
</Form.Item>
{
(elements||[]).map((element, index) => {
return (
<Form.Item
label={element.name||''}
name={element.id||''}
key={index}
>
<MetaModelSelect
metaModelTreeData={metadataModelTreeData}
/>
</Form.Item>
);
})
}
</Form>
{contextHolder}
</Spin>
}
const AttributeRelationModal = (props) => {
const { visible, onCancel } = props;
const [ supportSourceModelsName, setSupportSourceModelsName ] = useState()
const [ loadingSourceModels, setLoadingSourceModels] = useState(false)
const [ sourceModels, setSourceModels ] = useState()
const [ metadataModelTreeData, setMetadataModelTreeData ] = useState([]);
const [ elements, setElements] = useState([]);
const [ activeKey, setActiveKey ] = useState();
const activeKeyRef = useRef();
useEffect(() => {
if (visible) {
getSupportSourceModelsName();
getSourceModels();
loadElementWithoutCustom();
getMetadataModelTree();
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible])
const tabData = useMemo(() => {
return [...sourceModels||[], AddSourceModelName]
}, [sourceModels])
const getSupportSourceModelsName = () => {
dispatch({
type: 'assetmanage.listSupportSourceModels',
callback: (data) => {
console.log('data', data)
setSupportSourceModelsName(data||[])
},
})
}
const getSourceModels = () => {
setLoadingSourceModels(true)
dispatch({
type: 'assetmanage.listSourceModels',
callback: (data) => {
setLoadingSourceModels(false)
setSourceModels(data||[])
if (!activeKeyRef.current) {
activeKeyRef.current = data?.length > 0 ? data[0] : AddSourceModelName
setActiveKey(data?.length > 0 ? data[0] : AddSourceModelName)
} else if (activeKeyRef.current !== activeKey) {
setActiveKey(activeKeyRef.current)
}
},
error: () => {
setLoadingSourceModels(false)
}
})
}
const getMetadataModelTree = () => {
dispatch({
type: 'assetmanage.getMetadataModelTree',
callback: data => {
let newData = [...data];
function recursion(_data, superKey='') {
if ((_data||[]).length===0) return;
(_data||[]).forEach(item=> {
item.title = item.nodeName||'';
item.value = superKey + '/' +(item.nodeName||'');
recursion(item.children, item.value);
})
}
recursion(newData);
setMetadataModelTreeData(newData||[]);
},
error: () => {
}
});
}
const loadElementWithoutCustom = () => {
dispatch({
type: 'assetmanage.loadElementWithoutCustom',
callback: data => {
setElements(data||[]);
},
error: () => {
}
});
}
const onTabsChange = (value) => {
activeKeyRef.current = value
setActiveKey(value)
}
const onRelationChange = (type, value) => {
if (type === 'delete') {
activeKeyRef.current = undefined
getSourceModels()
} else if (type === 'update') {
activeKeyRef.current = value
getSourceModels()
}
}
const reset = () => {
setActiveKey(undefined);
}
return ( return (
<Modal <Modal
forceRender forceRender
title={'资产属性关联'} title={'资产属性关联'}
visible={visible} visible={visible}
width={600} width={1000}
onCancel={() => { onCancel={() => {
reset(); reset();
onCancel && onCancel() onCancel?.();
}} }}
footer={ footer={
<Space> <Space>
<Button onClick={() => { <Button onClick={() => {
reset(); reset();
onCancel && onCancel(); onCancel?.();
}}>返回</Button> }}>取消</Button>
<Button type="primary" onClick={ onOk } loading={ confirmLoading }>确定</Button>
</Space> </Space>
} }
> >
<div style={{ maxHeight: 500, overflow: 'auto' }}> <Tabs tabPosition='left' activeKey={activeKey} onChange={onTabsChange}>
<Form form={form} {...formItemLayout}> {
{ tabData?.map((item, i) => {
(elements||[]).map((element, index) => { return <Tabs.TabPane tab={item} key={item}>
return ( <AttributeRelationWithSourceModel
<Form.Item elements={elements}
label={element.name||''} supportSourceModelsName={supportSourceModelsName}
name={element.id||''} metadataModelTreeData={metadataModelTreeData}
key={index} sourceModel={item === AddSourceModelName ? undefined: item}
> activeKey={activeKey}
<MetaModelSelect onChange={onRelationChange}
metaModelTreeData={metadataModelTreeData} />
/> </Tabs.TabPane>
</Form.Item> })
); }
}) </Tabs>
}
</Form>
</div>
</Modal> </Modal>
); );
} }
......
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