Commit 3ec8faa5 by zhaochengxiang

模型对比任务结果过滤

parent 8a5eeb76
...@@ -592,6 +592,30 @@ export function* getCompareJobResultDeployModels(payload) { ...@@ -592,6 +592,30 @@ export function* getCompareJobResultDeployModels(payload) {
return yield call(datamodelerService.getCompareJobResultDeployModels, payload) return yield call(datamodelerService.getCompareJobResultDeployModels, payload)
} }
export function* getCompareJobResultMetadataNotMatchCatalog(payload) {
return yield call(datamodelerService.getCompareJobResultMetadataNotMatchCatalog, payload)
}
export function* getCompareJobResultMetadataPartialMatchCatalog(payload) {
return yield call(datamodelerService.getCompareJobResultMetadataPartialMatchCatalog, payload)
}
export function* getCompareJobResultMetadataPerfectMatchCatalog(payload) {
return yield call(datamodelerService.getCompareJobResultMetadataPerfectMatchCatalog, payload)
}
export function* getCompareJobResultModelNotMatchCatalog(payload) {
return yield call(datamodelerService.getCompareJobResultModelNotMatchCatalog, payload)
}
export function* getCompareJobResultModelPartialMatchCatalog(payload) {
return yield call(datamodelerService.getCompareJobResultModelPartialMatchCatalog, payload)
}
export function* getCompareJobResultModelPerfectMatchCatalog(payload) {
return yield call(datamodelerService.getCompareJobResultModelPerfectMatchCatalog, payload)
}
export function* addDataTypeConfig(payload) { export function* addDataTypeConfig(payload) {
return yield call(datamodelerService.addDataTypeConfig, payload) return yield call(datamodelerService.addDataTypeConfig, payload)
} }
......
...@@ -537,6 +537,30 @@ export function getCompareJobResultDeployModels(payload) { ...@@ -537,6 +537,30 @@ export function getCompareJobResultDeployModels(payload) {
return PostJSON("/datamodeler/easyDataModelModelCompareJobResult/deployModelByResultItemIds", payload) return PostJSON("/datamodeler/easyDataModelModelCompareJobResult/deployModelByResultItemIds", payload)
} }
export function getCompareJobResultMetadataNotMatchCatalog(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getMetadataNotMatchCatalog", payload)
}
export function getCompareJobResultMetadataPartialMatchCatalog(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getMetadataPartialMatchCatalog", payload)
}
export function getCompareJobResultMetadataPerfectMatchCatalog(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getMetadataPerfectMatchCatalog", payload)
}
export function getCompareJobResultModelNotMatchCatalog(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getModelNotMatchCatalog", payload)
}
export function getCompareJobResultModelPartialMatchCatalog(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getModelPartialMatchCatalog", payload)
}
export function getCompareJobResultModelPerfectMatchCatalog(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getModelPerfectMatchCatalog", payload)
}
/*type config*/ /*type config*/
export function addDataTypeConfig(payload) { export function addDataTypeConfig(payload) {
return PostJSON("/datamodeler/easyDataModelerColumnDataType/addDataTypeConfig", payload) return PostJSON("/datamodeler/easyDataModelerColumnDataType/addDataTypeConfig", payload)
......
import React from 'react' import React from 'react'
import { Modal, Tabs, Button, Tooltip, Typography, Row, Col, Descriptions } from 'antd' import { Modal, Tabs, Button, Tooltip, Typography, Row, Col, Descriptions, TreeSelect, Space } from 'antd'
import { dispatch } from '../../../model' import { dispatch } from '../../../model'
import Table from '../../../util/Component/Table' import Table from '../../../util/Component/Table'
import { defaultPage } from '../../../util/hooks/page' import { defaultPage } from '../../../util/hooks/page'
import { generateUUID, paginate, showMessage } from '../../../util' import { generateUUID, inputWidth, paginate, showMessage } from '../../../util'
import './result-detail.less' import './result-detail.less'
import produce from 'immer'
const FC = (props) => { const FC = (props) => {
const { visible, item, onCancel} = props const { visible, item, onCancel} = props
...@@ -100,11 +101,18 @@ const PerfectMatch = ({ item }) => { ...@@ -100,11 +101,18 @@ const PerfectMatch = ({ item }) => {
const [args, setArgs] = React.useState({ const [args, setArgs] = React.useState({
page: defaultPage.pageNum, page: defaultPage.pageNum,
size: defaultPage.pageSize, size: defaultPage.pageSize,
metadataPath: undefined,
modelPath: undefined,
}) })
const [loading, setLoading] = React.useState(false) const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState() const [data, setData] = React.useState()
const [total, setTotal] = React.useState(0)
const [selectedRows, setSelectedRows] = React.useState() const [selectedRows, setSelectedRows] = React.useState()
const [rightRow, setRightRow] = React.useState() const [rightRow, setRightRow] = React.useState()
const [loadingMetadataCatalog, setLoadingMetadataCatalog] = React.useState(false)
const [metadataCatalog, setMetadataCatalog] = React.useState()
const [loadingModelCatalog, setLoadingModelCatalog] = React.useState(false)
const [modelCatalog, setModelCatalog] = React.useState()
const [modal, contextHolder] = Modal.useModal() const [modal, contextHolder] = Modal.useModal()
...@@ -116,15 +124,16 @@ const PerfectMatch = ({ item }) => { ...@@ -116,15 +124,16 @@ const PerfectMatch = ({ item }) => {
React.useEffect(() => { React.useEffect(() => {
if (item) { if (item) {
getList() getMetadataCatalog()
getModelCatalog()
} }
}, [item]) }, [item])
const tableData = React.useMemo(() => { React.useEffect(() => {
let newTableData = [...data??[]] if (item) {
getList()
return paginate(newTableData, args.page, args.size) }
}, [data, args]) }, [args])
const cols = [ const cols = [
{ {
...@@ -194,11 +203,16 @@ const PerfectMatch = ({ item }) => { ...@@ -194,11 +203,16 @@ const PerfectMatch = ({ item }) => {
dispatch({ dispatch({
type: 'datamodel.getCompareJobResultPerfectMatchList', type: 'datamodel.getCompareJobResultPerfectMatchList',
payload: { payload: {
resultId: item?.id resultId: item?.id,
metadataPath: args.metadataPath,
modelPath: args.modelPath,
pageNo: args.page,
pageSize: args.size,
}, },
callback: data => { callback: data => {
setLoading(false) setLoading(false)
setData(data) setData(data?.content)
setTotal(data?.totalElements)
}, },
error: () => { error: () => {
setLoading(false) setLoading(false)
...@@ -206,6 +220,40 @@ const PerfectMatch = ({ item }) => { ...@@ -206,6 +220,40 @@ const PerfectMatch = ({ item }) => {
}) })
} }
const getMetadataCatalog = () => {
setLoadingMetadataCatalog(true)
dispatch({
type: 'datamodel.getCompareJobResultMetadataPerfectMatchCatalog',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingMetadataCatalog(false)
setMetadataCatalog(data)
},
error: () => {
setLoadingMetadataCatalog(false)
}
})
}
const getModelCatalog = () => {
setLoadingModelCatalog(true)
dispatch({
type: 'datamodel.getCompareJobResultModelPerfectMatchCatalog',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingModelCatalog(false)
setModelCatalog(data)
},
error: () => {
setLoadingModelCatalog(false)
}
})
}
const onDeployClick = () => { const onDeployClick = () => {
modal.confirm({ modal.confirm({
title:'提示', title:'提示',
...@@ -253,24 +301,40 @@ const PerfectMatch = ({ item }) => { ...@@ -253,24 +301,40 @@ const PerfectMatch = ({ item }) => {
return ( return (
<div> <div>
<div> <div className='flex mb-3' style={{ justifyContent: 'space-between', alignItems: 'center' }}>
<Tooltip title={(selectedRows??[]).length===0?'请选择模型':''}> <Tooltip title={(selectedRows??[]).length===0?'请选择模型':''}>
<Button onClick={onDeployClick} disabled={(selectedRows??[]).length===0}>确定上线</Button> <Button onClick={onDeployClick} disabled={(selectedRows??[]).length===0}>确定上线</Button>
</Tooltip> </Tooltip>
<Space>
<Catalog
placeholder='请选择元数据目录'
loading={loadingMetadataCatalog} data={metadataCatalog} value={args.metadataPath}
onChange={(val) => {
setArgsByParams({ metadataPath: val, metadataPage: 1 })
}}
/>
<Catalog
placeholder='请选择模型目录'
loading={loadingModelCatalog} data={modelCatalog} value={args.modelPath}
onChange={(val) => {
setArgsByParams({ modelPath: val, modelPage: 1 })
}}
/>
</Space>
</div> </div>
<div className='pt-3'> <div>
<Table <Table
extraColWidth={32} extraColWidth={32}
loading={loading} loading={loading}
columns={cols??[]} columns={cols??[]}
dataSource={tableData??[]} dataSource={data??[]}
rowSelection={{ rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id), selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => { onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows) setSelectedRows(selectedRows)
}, },
}} }}
pageNum={args.page} pageSize={args.size} total={(data??[]).length} pageNum={args.page} pageSize={args.size} total={total}
onPaginate={(page, size) => { onPaginate={(page, size) => {
setArgsByParams({ page, size }) setArgsByParams({ page, size })
}} }}
...@@ -292,11 +356,18 @@ const PartialMatch = ({ item }) => { ...@@ -292,11 +356,18 @@ const PartialMatch = ({ item }) => {
const [args, setArgs] = React.useState({ const [args, setArgs] = React.useState({
page: defaultPage.pageNum, page: defaultPage.pageNum,
size: defaultPage.pageSize, size: defaultPage.pageSize,
metadataPath: undefined,
modelPath: undefined,
}) })
const [loading, setLoading] = React.useState(false) const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState() const [data, setData] = React.useState()
const [total, setTotal] = React.useState(0)
const [selectedRows, setSelectedRows] = React.useState() const [selectedRows, setSelectedRows] = React.useState()
const [rightRow, setRightRow] = React.useState() const [rightRow, setRightRow] = React.useState()
const [loadingMetadataCatalog, setLoadingMetadataCatalog] = React.useState(false)
const [metadataCatalog, setMetadataCatalog] = React.useState()
const [loadingModelCatalog, setLoadingModelCatalog] = React.useState(false)
const [modelCatalog, setModelCatalog] = React.useState()
const [modal, contextHolder] = Modal.useModal() const [modal, contextHolder] = Modal.useModal()
...@@ -308,15 +379,16 @@ const PartialMatch = ({ item }) => { ...@@ -308,15 +379,16 @@ const PartialMatch = ({ item }) => {
React.useEffect(() => { React.useEffect(() => {
if (item) { if (item) {
getList() getMetadataCatalog()
getModelCatalog()
} }
}, [item]) }, [item])
const tableData = React.useMemo(() => { React.useEffect(() => {
let newTableData = [...data??[]] if (item) {
getList()
return paginate(newTableData, args.page, args.size) }
}, [data, args]) }, [args])
const cols = [ const cols = [
{ {
...@@ -407,11 +479,16 @@ const PartialMatch = ({ item }) => { ...@@ -407,11 +479,16 @@ const PartialMatch = ({ item }) => {
dispatch({ dispatch({
type: 'datamodel.getCompareJobResultPartialMatchList', type: 'datamodel.getCompareJobResultPartialMatchList',
payload: { payload: {
resultId: item?.id resultId: item?.id,
metadataPath: args.metadataPath,
modelPath: args.modelPath,
pageNo: args.page,
pageSize: args.size,
}, },
callback: data => { callback: data => {
setLoading(false) setLoading(false)
setData(data) setData(data?.content)
setTotal(data?.totalElements)
}, },
error: () => { error: () => {
setLoading(false) setLoading(false)
...@@ -419,6 +496,40 @@ const PartialMatch = ({ item }) => { ...@@ -419,6 +496,40 @@ const PartialMatch = ({ item }) => {
}) })
} }
const getMetadataCatalog = () => {
setLoadingMetadataCatalog(true)
dispatch({
type: 'datamodel.getCompareJobResultMetadataPartialMatchCatalog',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingMetadataCatalog(false)
setMetadataCatalog(data)
},
error: () => {
setLoadingMetadataCatalog(false)
}
})
}
const getModelCatalog = () => {
setLoadingModelCatalog(true)
dispatch({
type: 'datamodel.getCompareJobResultModelPartialMatchCatalog',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingModelCatalog(false)
setModelCatalog(data)
},
error: () => {
setLoadingModelCatalog(false)
}
})
}
const onDeployClick = () => { const onDeployClick = () => {
modal.confirm({ modal.confirm({
title:'提示', title:'提示',
...@@ -466,24 +577,40 @@ const PartialMatch = ({ item }) => { ...@@ -466,24 +577,40 @@ const PartialMatch = ({ item }) => {
return ( return (
<div> <div>
<div> <div className='flex mb-3' style={{ justifyContent: 'space-between', alignItems: 'center' }}>
<Tooltip title={(selectedRows??[]).length===0?'请选择模型':''}> <Tooltip title={(selectedRows??[]).length===0?'请选择模型':''}>
<Button onClick={onDeployClick} disabled={(selectedRows??[]).length===0}>确定上线</Button> <Button onClick={onDeployClick} disabled={(selectedRows??[]).length===0}>确定上线</Button>
</Tooltip> </Tooltip>
<Space>
<Catalog
placeholder='请选择元数据目录'
loading={loadingMetadataCatalog} data={metadataCatalog} value={args.metadataPath}
onChange={(val) => {
setArgsByParams({ metadataPath: val, metadataPage: 1 })
}}
/>
<Catalog
placeholder='请选择模型目录'
loading={loadingModelCatalog} data={modelCatalog} value={args.modelPath}
onChange={(val) => {
setArgsByParams({ modelPath: val, modelPage: 1 })
}}
/>
</Space>
</div> </div>
<div className='pt-3'> <div>
<Table <Table
extraColWidth={32} extraColWidth={32}
loading={loading} loading={loading}
columns={cols??[]} columns={cols??[]}
dataSource={tableData??[]} dataSource={data??[]}
rowSelection={{ rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id), selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => { onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows) setSelectedRows(selectedRows)
}, },
}} }}
pageNum={args.page} pageSize={args.size} total={(data??[]).length} pageNum={args.page} pageSize={args.size} total={total}
onPaginate={(page, size) => { onPaginate={(page, size) => {
setArgsByParams({ page, size }) setArgsByParams({ page, size })
}} }}
...@@ -506,21 +633,36 @@ const NotMatch = ({ item }) => { ...@@ -506,21 +633,36 @@ const NotMatch = ({ item }) => {
const [args, setArgs] = React.useState({ const [args, setArgs] = React.useState({
metadataPage: defaultPage.pageNum, metadataPage: defaultPage.pageNum,
metadataSize: defaultPage.pageSize, metadataSize: defaultPage.pageSize,
metadataPath: undefined,
modelPage: defaultPage.pageNum, modelPage: defaultPage.pageNum,
modelSize: defaultPage.pageSize, modelSize: defaultPage.pageSize,
modelPath: undefined,
}) })
const [loadingMetadata, setLoadingMetadata] = React.useState(false) const [loadingMetadata, setLoadingMetadata] = React.useState(false)
const [metadatas, setMetadatas] = React.useState() const [metadatas, setMetadatas] = React.useState()
const [metadataTotal, setMetadataTotal] = React.useState(0)
const [loadingModel, setLoadingModel] = React.useState(false) const [loadingModel, setLoadingModel] = React.useState(false)
const [models, setModels] = React.useState() const [models, setModels] = React.useState()
const [modelTotal, setModelTotal] = React.useState(0)
const [loadingMetadataCatalog, setLoadingMetadataCatalog] = React.useState(false)
const [metadataCatalog, setMetadataCatalog] = React.useState()
const [loadingModelCatalog, setLoadingModelCatalog] = React.useState(false)
const [modelCatalog, setModelCatalog] = React.useState()
React.useEffect(() => {
if (item) {
getMetadataCatalog()
getModelCatalog()
}
}, [item])
React.useEffect(() => { React.useEffect(() => {
if (item) { if (item) {
getMetadatas() getMetadatas()
getModels() getModels()
} }
}, [item]) }, [args])
const setArgsByParams = React.useCallback((params) => { const setArgsByParams = React.useCallback((params) => {
setArgs((prev) => { setArgs((prev) => {
...@@ -528,13 +670,6 @@ const NotMatch = ({ item }) => { ...@@ -528,13 +670,6 @@ const NotMatch = ({ item }) => {
}) })
}, []) }, [])
const [metadataTableData, modelTableData] = React.useMemo(() => {
let newMetadataTableData = [...metadatas??[]]
let newModelTableData = [...models??[]]
return [paginate(newMetadataTableData, args.metadataPage, args.metadataSize), paginate(newModelTableData, args.modelPage, args.modelSize)]
}, [metadatas, models, args])
const metadataCols = [ const metadataCols = [
{ {
title: '序号', title: '序号',
...@@ -608,11 +743,15 @@ const NotMatch = ({ item }) => { ...@@ -608,11 +743,15 @@ const NotMatch = ({ item }) => {
dispatch({ dispatch({
type: 'datamodel.getCompareJobResultNotMatchMetadataList', type: 'datamodel.getCompareJobResultNotMatchMetadataList',
payload: { payload: {
resultId: item?.id resultId: item?.id,
metadataPath: args.metadataPath,
pageNo: args.metadataPage,
pageSize: args.metadataSize,
}, },
callback: data => { callback: data => {
setLoadingMetadata(false) setLoadingMetadata(false)
setMetadatas(data) setMetadatas(data?.content)
setMetadataTotal(data?.totalElements)
}, },
error: () => { error: () => {
setLoadingMetadata(false) setLoadingMetadata(false)
...@@ -625,11 +764,15 @@ const NotMatch = ({ item }) => { ...@@ -625,11 +764,15 @@ const NotMatch = ({ item }) => {
dispatch({ dispatch({
type: 'datamodel.getCompareJobResultNotMatchModelList', type: 'datamodel.getCompareJobResultNotMatchModelList',
payload: { payload: {
resultId: item?.id resultId: item?.id,
modelPath: args.modelPath,
pageNo: args.modelPage,
pageSize: args.modelSize,
}, },
callback: data => { callback: data => {
setLoadingModel(false) setLoadingModel(false)
setModels(data) setModels(data?.content)
setModelTotal(data?.totalElements)
}, },
error: () => { error: () => {
setLoadingModel(false) setLoadingModel(false)
...@@ -637,16 +780,59 @@ const NotMatch = ({ item }) => { ...@@ -637,16 +780,59 @@ const NotMatch = ({ item }) => {
}) })
} }
const getMetadataCatalog = () => {
setLoadingMetadataCatalog(true)
dispatch({
type: 'datamodel.getCompareJobResultMetadataNotMatchCatalog',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingMetadataCatalog(false)
setMetadataCatalog(data)
},
error: () => {
setLoadingMetadataCatalog(false)
}
})
}
const getModelCatalog = () => {
setLoadingModelCatalog(true)
dispatch({
type: 'datamodel.getCompareJobResultModelNotMatchCatalog',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingModelCatalog(false)
setModelCatalog(data)
},
error: () => {
setLoadingModelCatalog(false)
}
})
}
return ( return (
<div style={{ overflow: 'hidden' }}> <div style={{ overflow: 'hidden' }}>
<Row gutter={15}> <Row gutter={15}>
<Col span={12}> <Col span={12}>
<h4>未匹配元数据列表</h4> <div className='flex mb-3' style={{ justifyContent: 'space-between', alignItems: 'center' }}>
<h4 style={{ marginBottom: 0 }}>未匹配元数据列表</h4>
<Catalog
placeholder='请选择元数据目录'
loading={loadingMetadataCatalog} data={metadataCatalog} value={args.metadataPath}
onChange={(val) => {
setArgsByParams({ metadataPath: val, metadataPage: 1 })
}}
/>
</div>
<Table <Table
loading={loadingMetadata} loading={loadingMetadata}
columns={metadataCols??[]} columns={metadataCols??[]}
dataSource={metadataTableData??[]} dataSource={metadatas??[]}
pageNum={args.metadataPage} pageSize={args.metadataSize} total={(metadatas??[]).length} pageNum={args.metadataPage} pageSize={args.metadataSize} total={metadataTotal}
onPaginate={(page, size) => { onPaginate={(page, size) => {
setArgsByParams({ metadataPage: page, metadataSize: size }) setArgsByParams({ metadataPage: page, metadataSize: size })
}} }}
...@@ -656,12 +842,21 @@ const NotMatch = ({ item }) => { ...@@ -656,12 +842,21 @@ const NotMatch = ({ item }) => {
/> />
</Col> </Col>
<Col span={12}> <Col span={12}>
<h4>未匹配模型列表</h4> <div className='flex mb-3' style={{ justifyContent: 'space-between', alignItems: 'center' }}>
<h4 style={{ marginBottom: 0 }}>未匹配模型列表</h4>
<Catalog
placeholder='请选择模型目录'
loading={loadingModelCatalog} data={modelCatalog} value={args.modelPath}
onChange={(val) => {
setArgsByParams({ modelPath: val, modelPage: 1 })
}}
/>
</div>
<Table <Table
loading={loadingModel} loading={loadingModel}
columns={modelCols??[]} columns={modelCols??[]}
dataSource={modelTableData??[]} dataSource={models??[]}
pageNum={args.modelPage} pageSize={args.modelSize} total={(models??[]).length} pageNum={args.modelPage} pageSize={args.modelSize} total={modelTotal}
onPaginate={(page, size) => { onPaginate={(page, size) => {
setArgsByParams({ modelPage: page, modelSize: size }) setArgsByParams({ modelPage: page, modelSize: size })
}} }}
...@@ -673,4 +868,57 @@ const NotMatch = ({ item }) => { ...@@ -673,4 +868,57 @@ const NotMatch = ({ item }) => {
</Row> </Row>
</div> </div>
) )
}
const Catalog = ({ value, onChange, data, loading, placeholder }) => {
const [expandedKeys, setExpandedKeys] = React.useState()
React.useEffect(() => {
if ((data?.children??[]).length>0) {
setExpandedKeys([data.children.path])
}
}, [data])
const treeData = React.useMemo(() => {
if (data && data.children) {
const newTreeData = produce(data.children, draft => {
const setNode = (g) => {
g.key = g.path
g.title = g.name
g.value = g.path
g.children?.forEach((child) => {
setNode(child)
})
}
draft.forEach((child) => {
setNode(child)
})
})
return newTreeData
}
return undefined
}, [data])
return (
<TreeSelect
showSearch allowClear
treeNodeFilterProp='title'
loading={loading}
value={value}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
treeData={treeData}
treeExpandedKeys={expandedKeys}
onTreeExpand={(val) => {
setExpandedKeys(val)
}}
onChange={(val) => {
onChange?.(val)
}}
style={{ width: inputWidth }}
placeholder={placeholder??'请选择目录'}
/>
)
} }
\ No newline at end of file
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