Commit 9b40465f by zhaochengxiang

关联资产

parent 78dec2cf
...@@ -412,4 +412,8 @@ export function* importDraftLogs(payload) { ...@@ -412,4 +412,8 @@ export function* importDraftLogs(payload) {
export function* draftAssetImport(payload) { export function* draftAssetImport(payload) {
return yield call(service.draftAssetImport, payload); return yield call(service.draftAssetImport, payload);
}
export function* fillRelationDisplayInfo(payload) {
return yield call(service.fillRelationDisplayInfo, payload);
} }
\ No newline at end of file
...@@ -393,10 +393,6 @@ export function startProcess(payload) { ...@@ -393,10 +393,6 @@ export function startProcess(payload) {
return PostJSON("/dataassetmanagertest/flowApi/startProcess", payload) return PostJSON("/dataassetmanagertest/flowApi/startProcess", payload)
} }
export function getRelatedAssets(payload) {
return PostJSON("/dataassetmanagertest/postApi/getRelatedAssets", payload)
}
export function getRelatedServices(payload) { export function getRelatedServices(payload) {
return PostJSON("/dataassetmanagertest/postApi/getRelatedServices", payload) return PostJSON("/dataassetmanagertest/postApi/getRelatedServices", payload)
} }
...@@ -419,4 +415,12 @@ export function importDraftLogs(payload) { ...@@ -419,4 +415,12 @@ export function importDraftLogs(payload) {
export function draftAssetImport(payload) { export function draftAssetImport(payload) {
return PostFile("/dataassetmanagertest/draftApi/batchUpdateByImport", payload); return PostFile("/dataassetmanagertest/draftApi/batchUpdateByImport", payload);
}
export function getRelatedAssets(payload) {
return GetJSON("/dataassetmanagertest/dataAssetRelatedApi/listRelations", payload)
}
export function fillRelationDisplayInfo(payload) {
return GetJSON("/dataassetmanagertest/dataAssetRelatedApi/fillRelationDisplayInfo", payload)
} }
\ No newline at end of file
...@@ -24,7 +24,7 @@ import { checkDataAssetEditable } from '../../../../service/dataassetmanager'; ...@@ -24,7 +24,7 @@ import { checkDataAssetEditable } from '../../../../service/dataassetmanager';
import download from '../../../../util/download'; import download from '../../../../util/download';
import SelectStandard from './SelectStandard'; import SelectStandard from './SelectStandard';
import AttributeMaintain from './AttributeMaintain'; import AttributeMaintain from './AttributeMaintain';
import PostRelation from './post-relation'; import RelationAssets from './asset-relation-assets';
import './AssetAction.less'; import './AssetAction.less';
...@@ -79,7 +79,7 @@ const AssetAction = (props) => { ...@@ -79,7 +79,7 @@ const AssetAction = (props) => {
const app = useContext(AppContext); const app = useContext(AppContext);
const uploadRef = useRef(undefined); const uploadRef = useRef(undefined);
const postRealtionRef = useRef(); const relationAssetsRef = useRef();
const actionCol = { const actionCol = {
title: '操作', title: '操作',
...@@ -877,10 +877,6 @@ const AssetAction = (props) => { ...@@ -877,10 +877,6 @@ const AssetAction = (props) => {
if (reference === AssetDraftReference) { if (reference === AssetDraftReference) {
let data = action==='add' ? { elements: newElements } : { ...assets, elements: newElements } let data = action==='add' ? { elements: newElements } : { ...assets, elements: newElements }
if (isPostAsset(assets?.templateType)) {
data = {...data, ...postRealtionRef.current?.relations}
}
dispatch({ dispatch({
type: 'assetmanage.updateDraft', type: 'assetmanage.updateDraft',
payload: { payload: {
...@@ -919,9 +915,7 @@ const AssetAction = (props) => { ...@@ -919,9 +915,7 @@ const AssetAction = (props) => {
let data = action==='add' ? { elements: newElements } : { ...assets, elements: newElements } let data = action==='add' ? { elements: newElements } : { ...assets, elements: newElements }
if (isPostAsset(assets?.templateType)) { data = {...data, businessRelations: relationAssetsRef.current?.assets}
data = {...data, ...postRealtionRef.current?.relations}
}
dispatch({ dispatch({
type: needSaveAsDraft?'assetmanage.saveAsDraft':'assetmanage.addOrUpdateDataAsset', type: needSaveAsDraft?'assetmanage.saveAsDraft':'assetmanage.addOrUpdateDataAsset',
...@@ -989,94 +983,6 @@ const AssetAction = (props) => { ...@@ -989,94 +983,6 @@ const AssetAction = (props) => {
// }; // };
const elementEditComponent = (element) => { const elementEditComponent = (element) => {
if (element.name==='资产项') return <MetadataInfo />;
if (element.name === '数据源系统') {
return (
<Select
allowClear
loading={loadingSystems}
disabled={element.manualMaintain==='否'}
>
{
systems?.map((system, index) => {
return <Select.Option key={index} value={system.scopeName}>
{system.scopeName}
</Select.Option>
})
}
</Select>
)
}
if (element.enName==='dataKeyUser' || element.enName==='businessDepartmentOwner' || element.enName==='itResponsiblePerson') {
return <SelectUser
type='edit'
loading={loadingUsers}
users={users}
disabled={element.manualMaintain==='否'}
/>
}
if (element.enName==='businessResponsibleDepartment' || element.enName==='itResponsibleDepartment') {
return <SelectFilter
loading={loadingDepartments}
data={departments}
disabled={element.manualMaintain==='否'}
/>
}
if (element.name === '主题域分组') {
return (
<Select
allowClear
disabled={element.manualMaintain==='否'}
>
{
treeData?.map((item, index) => {
return <Select.Option key={index} value={item.text}>
{item.text}
</Select.Option>
})
}
</Select>
)
}
if (element.name === '主题域') {
return (
<Select
allowClear
disabled={element.manualMaintain==='否'}
>
{
domains?.map((item, index) => {
return <Select.Option key={index} value={item.text}>
{item.text}
</Select.Option>
})
}
</Select>
)
}
if (element.name === '业务对象') {
return (
<Select
allowClear
disabled={element.manualMaintain==='否'}
>
{
businessData?.map((item, index) => {
return <Select.Option key={index} value={item.text}>
{item.text}
</Select.Option>
})
}
</Select>
)
}
if (element.selectMode==='单选') { if (element.selectMode==='单选') {
return ( return (
<Select <Select
...@@ -1100,24 +1006,6 @@ const AssetAction = (props) => { ...@@ -1100,24 +1006,6 @@ const AssetAction = (props) => {
} }
const elementDetailComponent = (item, publishedItem) => { const elementDetailComponent = (item, publishedItem) => {
if (item.name === '资产项') {
return <MetadataInfo config={false} value={item.value||''} terms={terms} />;
}
if (item.name === '指标标准编码') {
return <IndexCode value={item.value||''} terms={terms} publishedValue={publishedItem?.value} />;
}
if (item.enName==='dataKeyUser' || item.enName==='businessDepartmentOwner' || item.enName==='itResponsiblePerson' || item.enName==='creator' || item.enName==='updater') {
return <SelectUser
type='detail'
users={users}
terms={terms}
value={item.value||''}
publishedValue={publishedItem?.value}
/>
}
return <span> return <span>
<Typography.Text>{highlightSearchContentByTerms(item.value||'', terms)}</Typography.Text> <Typography.Text>{highlightSearchContentByTerms(item.value||'', terms)}</Typography.Text>
{ {
...@@ -1166,98 +1054,8 @@ const AssetAction = (props) => { ...@@ -1166,98 +1054,8 @@ const AssetAction = (props) => {
} }
} }
// const onSubsrcibeClick = () => {
// modal.confirm({
// title: '提示',
// content: '是否确认收藏该资产目录?',
// onOk: () => {
// dispatch({
// type: 'assetmanage.addSubscribe',
// payload: {
// params: {
// appType: 'dataAssetManager',
// subType: assets?.templateType,
// resourceIds: id,
// env: app?.env?.domainId||catalog||LocalStorage.get('assetsEnv'),
// }
// },
// callback: () => {
// showMessage("success","收藏成功");
// },
// error: () => {
// }
// })
// }
// })
// }
const onValuesChange = (changedValues, allValues) => { const onValuesChange = (changedValues, allValues) => {
if (changedValues.hasOwnProperty('主题域分组')) {
setCurrentDomainGroup(changedValues['主题域分组']);
form.setFieldsValue({'主题域': '', '业务对象': ''});
} else if (changedValues.hasOwnProperty('主题域')) {
setCurrentBussinessDomain(changedValues['主题域']);
form.setFieldsValue({'业务对象': ''});
}
for (const name in changedValues) {
const index = (elements??[]).findIndex(item => item.name === name)
if (index!==-1) {
if (elements[index].enName === 'dataKeyUser') {
const index1 = (users||[]).findIndex(item => item.pernr === changedValues[name]);
if (index1 !== -1) {
const index2 = (elements??[]).findIndex(item => item.enName === 'dataKeyUserName')
let newFieldsValue = {}
if (index2 !== -1) {
newFieldsValue[elements[index2].name] = users[index1].nachn
}
const index3 = (elements??[]).findIndex(item => item.enName === 'dataKeyUserDepartment')
if (index3 !== -1) {
newFieldsValue[elements[index3].name] = users[index1].org3TXT
}
form.setFieldsValue(newFieldsValue)
}
}
if (elements[index].enName === 'businessDepartmentOwner') {
const index1 = (users||[]).findIndex(item => item.pernr === changedValues[name]);
if (index1 !== -1) {
const index2 = (elements??[]).findIndex(item => item.enName === 'businessDepartmentOwnerName')
let newFieldsValue = {}
if (index2 !== -1) {
newFieldsValue[elements[index2].name] = users[index1].nachn
}
const index3 = (elements??[]).findIndex(item => item.enName === 'businessResponsibleDepartment')
if (index3 !== -1) {
newFieldsValue[elements[index3].name] = users[index1].org3TXT
}
form.setFieldsValue(newFieldsValue)
}
}
if (elements[index].enName === 'itResponsiblePerson') {
const index1 = (users||[]).findIndex(item => item.pernr === changedValues[name]);
if (index1 !== -1) {
const index2 = (elements??[]).findIndex(item => item.enName === 'itResponsiblePersonName')
let newFieldsValue = {}
if (index2 !== -1) {
newFieldsValue[elements[index2].name] = users[index1].nachn
}
const index3 = (elements??[]).findIndex(item => item.enName === 'itResponsibleDepartment')
if (index3 !== -1) {
newFieldsValue[elements[index3].name] = users[index1].org3TXT
}
form.setFieldsValue(newFieldsValue)
}
}
}
}
} }
return ( return (
...@@ -1436,107 +1234,109 @@ const AssetAction = (props) => { ...@@ -1436,107 +1234,109 @@ const AssetAction = (props) => {
</Spin> </Spin>
{ <div>
action!=='add' ? <React.Fragment> <Divider orientation='left'>字段级资产目录信息</Divider>
{ </div>
isPostAsset(assets?.templateType) ? <div className='mt-2'><PostRelation ref={postRealtionRef} reference={reference} action={currentAction} item={assets} onChange={onPostRelationsChange} /></div> : <React.Fragment> <Space style={{ marginLeft: 'auto' }}>
<div> {
<Divider orientation='left'>字段级资产目录信息</Divider> !readonly && (reference===AssetManageReference||canEdit) && <React.Fragment>
</div> {
<Space style={{ marginLeft: 'auto' }}> isMetadataEdit ? <React.Fragment>
{ <Button onClick={() => {
!readonly && (reference===AssetManageReference||canEdit) && <React.Fragment> setMetadataEdit(false)
{ }}>
isMetadataEdit ? <React.Fragment> 取消
<Button onClick={() => { </Button>
setMetadataEdit(false) <Button onClick={() => {
}}> if ((modifyMetadataColumnList??[]).length === 0) {
取消 setMetadataEdit(false)
</Button> return
<Button onClick={() => { }
if ((modifyMetadataColumnList??[]).length === 0) {
setMetadataEdit(false)
return
}
setLoadingMetadataColumnList(true) setLoadingMetadataColumnList(true)
dispatch({ dispatch({
type: 'assetmanage.batchUpdateAttributes', type: 'assetmanage.batchUpdateAttributes',
payload: { payload: {
data: modifyMetadataColumnList data: modifyMetadataColumnList
}, },
callback: () => { callback: () => {
setLoadingMetadataColumnList(false) setLoadingMetadataColumnList(false)
setMetadataEdit(false) setMetadataEdit(false)
getMetadataAttributes() getMetadataAttributes()
}, },
error: () => { error: () => {
setLoadingMetadataColumnList(false) setLoadingMetadataColumnList(false)
}
})
}}>
保存
</Button>
</React.Fragment> : <Button onClick={() => {
setModifyMetadataColumnList(metadataColumnList)
setMetadataEdit(true)
}}>
编辑
</Button>
} }
<Button })
onClick={() => { }}>
if (metadata?.metadataTableId) { 保存
setAttributeMaintainParam({ </Button>
visible: true, </React.Fragment> : <Button onClick={() => {
metadataId: metadata?.metadataTableId setModifyMetadataColumnList(metadataColumnList)
}); setMetadataEdit(true)
} else { }}>
showMessage("warn","该资产目录没有关联元数据信息"); 编辑
} </Button>
}} }
> <Button
字段级维护 onClick={() => {
</Button> if (metadata?.metadataTableId) {
</React.Fragment> setAttributeMaintainParam({
visible: true,
metadataId: metadata?.metadataTableId
});
} else {
showMessage("warn","该资产目录没有关联元数据信息");
} }
<Input size="middle" }}
placeholder={assets?.templateType==='mdg'?'搜索中英文名称/业务定义':'搜索中英文名称/业务规则'} >
value={keyword} 字段级维护
bordered={true} allowClear </Button>
style={{ width: 200 }} </React.Fragment>
onChange={(e) => { }
setPagination({...paginate, pageNum: 1}) <Input size="middle"
setKeyword(e.target.value) placeholder={assets?.templateType==='mdg'?'搜索中英文名称/业务定义':'搜索中英文名称/业务规则'}
}} /> value={keyword}
</Space> bordered={true} allowClear
style={{ width: 200 }}
<Table onChange={(e) => {
className='mt-3' setPagination({...paginate, pageNum: 1})
loading={loadingMetadataColumnList} setKeyword(e.target.value)
columns={cols??[]} }} />
rowKey='_id' </Space>
dataSource={tableData||[]}
pagination={{ <Table
position: ['bottomLeft'], className='mt-3'
size: 'small', loading={loadingMetadataColumnList}
total: (metadataColumnList||[]).length, columns={cols??[]}
showTotal: (total) => `${total}`, rowKey='_id'
showSizeChanger: true, dataSource={tableData||[]}
current: pageNum, pagination={{
pageSize, position: ['bottomLeft'],
onChange: (_pageNum, _pageSize) => { size: 'small',
setPagination({ pageNum: _pageNum||1, pageSize: _pageSize || 20 }); total: (metadataColumnList||[]).length,
}, showTotal: (total) => `${total}`,
onShowSizeChange: (_pageNum, _pageSize) => { showSizeChanger: true,
setPagination({ pageNum: _pageNum||1, pageSize: _pageSize || 20 }); current: pageNum,
}, pageSize,
}} onChange: (_pageNum, _pageSize) => {
/> setPagination({ pageNum: _pageNum||1, pageSize: _pageSize || 20 });
</React.Fragment> },
} onShowSizeChange: (_pageNum, _pageSize) => {
</React.Fragment> : <div className='mt-2'><PostRelation ref={postRealtionRef} reference={reference} action={currentAction} item={assets} onChange={onPostRelationsChange} /></div> setPagination({ pageNum: _pageNum||1, pageSize: _pageSize || 20 });
} },
}}
/>
<div>
<Divider orientation='left'>关联资产</Divider>
<RelationAssets
ref={relationAssetsRef}
reference={reference}
action={currentAction}
item={assets}
/>
</div>
<SelectStandard <SelectStandard
visible={selectStandardParam.visible} visible={selectStandardParam.visible}
......
import React from 'react'
import { Tabs, Space, Button, Input, Pagination, Tooltip, Modal } from 'antd'
import { paginate } from '../../../../util'
import Table from '../../ResizeableTable'
import SelectResource from './select-resource'
import { dispatch } from '../../../../model';
import { AssetDraftReference } from '../../../../util/constant'
import AssetDetailDrawer from "./AssetDetailDrawer";
import { AppContext } from '../../../../App'
const FC = React.forwardRef(function ({ item, reference, action, onChange }, ref) {
const [keyword, setKeyword] = React.useState()
const [pagination, setPagination] = React.useState({
pageNum: 1,
pageSize: 20,
})
const [loadingAssets, setLoadingAssets] = React.useState(false)
const [assets, setAssets] = React.useState()
const [selectedRows, setSelectedRows] = React.useState()
const [selectResourceParams, setSelectResourceParams] = React.useState({
visible: false,
item: undefined,
type: undefined,
})
const [detailParams, setDetailParams] = React.useState({
visible: false,
id: undefined,
dirId: undefined,
})
const app = React.useContext(AppContext)
const [modal, contextHolder] = Modal.useModal()
React.useImperativeHandle(ref, () => ({
assets
}), [assets])
React.useEffect(() => {
onChange?.(assets)
}, [assets])
React.useEffect(() => {
if (item?.id) {
getRelatedAssets()
}
}, [item])
const [tableData, total] = React.useMemo(() => {
let newTableData = [...assets??[]]
if (keyword) {
newTableData = (newTableData??[]).filter(item => (item.name??'').indexOf(keyword) !== -1)
}
return [paginate(newTableData, pagination.pageNum, pagination.pageSize), (newTableData??[]).length]
}, [assets, keyword, pagination])
const assetCols = [
{
title: '序号',
dataIndex: 'index',
width:60,
render:(_, __, index)=> ((pagination.pageNum-1)*pagination.pageSize+index+1)
},
{
title: '路径',
dataIndex: 'relatedDataAssetPath',
},
{
title: '资产编码',
dataIndex: 'relatedDataAssetCode',
},
{
title: '名称',
dataIndex: 'relatedDataAssetEnName',
},
{
title: '操作',
dataIndex: 'action',
width: 80,
render: (_, record) => {
return (
<Space>
<a onClick={(e) => {
e.stopPropagation();
setDetailParams({
visible: true,
id: record?.relatedDataAssetId,
})
}}>
详情
</a>
</Space>
)
}
}
]
const getRelatedAssets = () => {
setLoadingAssets(true)
let url = (reference===AssetDraftReference)?'assetmanage.getDraftRelatedAssets':'assetmanage.getRelatedAssets'
let params = (reference===AssetDraftReference)?{
draftId: item?.id
}:{
dataAssetId: item?.id
}
dispatch({
type: url,
payload: params,
callback: (data) => {
setLoadingAssets(false)
setAssets(data)
},
error: () => {
setLoadingAssets(false)
}
})
}
const onEditClick = () => {
setSelectResourceParams({
visible: true,
item,
type: 'asset',
})
}
const onDeleteClick = () => {
setAssets(prevAssets => {
const filterData = (prevAssets??[]).filter(item => (selectedRows??[]).map(_item => _item.relatedAssetId).indexOf(item.relatedAssetId)===-1)
return filterData
})
setSelectedRows(prevSelectedRows => {
return []
})
}
const onSelectResourceCancel = (data) => {
setSelectResourceParams({
visible: false,
item: undefined,
type: undefined
})
if (data) {
setAssets(prevAssets => {
const filterData = (data??[]).filter(item => (prevAssets??[]).map(_item => _item.relatedDataAssetId).indexOf(item.relatedDataAssetId)===-1)
return [...prevAssets??[], ...filterData]
})
}
}
return (
<div>
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
{
action !== 'detail' ? <Space>
<Button onClick={onEditClick}>编辑</Button>
<Tooltip title={(selectedRows??[]).length===0?'请先选择资产':''}>
<Button disabled={(selectedRows??[]).length===0} onClick={onDeleteClick}>删除</Button>
</Tooltip>
</Space> : <div />
}
<Input size="middle"
placeholder='搜索资产名称'
value={keyword}
bordered={true} allowClear
style={{ width: 200 }}
onChange={(e) => {
setPagination({...pagination, pageNum: 1})
setKeyword(e.target.value)
}} />
</div>
<div className='mt-3'>
<Table
extraColWidth={32}
rowKey='relatedDataAssetId'
loading={loadingAssets}
columns={assetCols}
dataSource={tableData??[]}
pagination={false}
rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.relatedDataAssetId),
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows)
},
}}
/>
{
(total!==0) && <Pagination
className="text-center my-3"
showSizeChanger
onChange={(page,size) => {
setPagination({ pageNum: page, pageSize: size })
}}
current={pagination.pageNum}
pageSize={pagination.pageSize}
defaultCurrent={1}
total={total}
showTotal={() => `共${total??0}项`}
/>
}
</div>
<SelectResource
{...selectResourceParams}
onCancel={onSelectResourceCancel}
/>
<AssetDetailDrawer
{...detailParams}
readonly={true}
onCancel={() => {
setDetailParams({
visible: false,
id: undefined,
dirId: undefined,
})
}}
/>
{contextHolder}
</div>
)
})
export default FC
\ No newline at end of file
...@@ -238,7 +238,7 @@ const FC = (props) => { ...@@ -238,7 +238,7 @@ const FC = (props) => {
type: 'assetmanage.listFilterElementsGroupByType', type: 'assetmanage.listFilterElementsGroupByType',
payload: { payload: {
templateType: currentTemplate?.type, templateType: currentTemplate?.type,
isAdmin: false isAdmin: true
}, },
callback: data => { callback: data => {
setLoadingElements(false) setLoadingElements(false)
...@@ -261,7 +261,6 @@ const FC = (props) => { ...@@ -261,7 +261,6 @@ const FC = (props) => {
keyword: args.keyword??'', keyword: args.keyword??'',
recursive: true, recursive: true,
templateType: currentTemplate?.type, templateType: currentTemplate?.type,
checkPermission: true,
}, },
callback: data => { callback: data => {
setLoading(false) setLoading(false)
......
...@@ -34,11 +34,9 @@ const FC = ({ visible, item, type, onCancel }) => { ...@@ -34,11 +34,9 @@ const FC = ({ visible, item, type, onCancel }) => {
if (type === 'asset') { if (type === 'asset') {
setWaiting(true) setWaiting(true)
dispatch({ dispatch({
type: 'assetmanage.fillRelatedAssetsInfo', type: 'assetmanage.fillRelationDisplayInfo',
payload: { payload: {
params: { relatedDataAssetIds: (selectedRows??[]).map(item => item.id).toString()
dataAssetIds: (selectedRows??[]).map(item => item.id).toString()
}
}, },
callback: (data) => { callback: (data) => {
setWaiting(false) setWaiting(false)
......
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