Commit b10a3ff8 by zhaochengxiang

任务结果

parent e8844055
......@@ -550,4 +550,24 @@ export function* getCompareJobResultList(payload) {
export function* getCompareJobRunStateTypes() {
return yield call(datamodelerService.getCompareJobRunStateTypes)
}
export function* getCompareJobResultPerfectMatchList(payload) {
return yield call(datamodelerService.getCompareJobResultPerfectMatchList, payload)
}
export function* getCompareJobResultPartialMatchList(payload) {
return yield call(datamodelerService.getCompareJobResultPartialMatchList, payload)
}
export function* getCompareJobResultNotMatchModelList(payload) {
return yield call(datamodelerService.getCompareJobResultNotMatchModelList, payload)
}
export function* getCompareJobResultNotMatchMetadataList(payload) {
return yield call(datamodelerService.getCompareJobResultNotMatchMetadataList, payload)
}
export function* getCompareJobResultDeployModels(payload) {
return yield call(datamodelerService.getCompareJobResultDeployModels, payload)
}
\ No newline at end of file
......@@ -495,4 +495,24 @@ export function getCompareJobResultList(payload) {
export function getCompareJobRunStateTypes() {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getModelCompareJobRunStateTypes")
}
export function getCompareJobResultPerfectMatchList(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getPerfectMatchList", payload)
}
export function getCompareJobResultPartialMatchList(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getPartialMatchList", payload)
}
export function getCompareJobResultNotMatchModelList(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getNotMatchModelList", payload)
}
export function getCompareJobResultNotMatchMetadataList(payload) {
return GetJSON("/datamodeler/easyDataModelModelCompareJobResult/getNotMatchMetadataList", payload)
}
export function getCompareJobResultDeployModels(payload) {
return PostJSON("/datamodeler/easyDataModelModelCompareJobResult/deployModelByResultItemIds", payload)
}
\ No newline at end of file
import React from 'react'
import { Modal, Tabs, Button, Tooltip, Typography, Row, Col } from 'antd'
import { dispatch } from '../../../model'
import Table from '../../../util/Component/Table'
import { defaultPage } from '../../../util/hooks/page'
import { generateUUID, paginate, showMessage } from '../../../util'
const FC = (props) => {
const { visible, item, onCancel} = props
const [animating, setAnimating] = React.useState(true)
React.useEffect(() => {
if (visible) {
setTimeout(() => {
setAnimating(false)
}, 300)
}
}, [visible])
const close = () => {
onCancel?.()
}
return (
<Modal
visible={visible}
footer={null}
width='90%'
bodyStyle={{ padding: '15px', overflowX: 'auto', maxHeight: '80vh' }}
title='任务结果'
centered destroyOnClose
onCancel={() => { close() }}
>
<Basic item={item} />
<Match item={item} />
</Modal>
)
}
export default FC
const Basic = ({ item }) => {
return (
<div>
basic
</div>
)
}
const Match = ({ item }) => {
const onExportClick = () => {
window.open(`/api/datamodeler/easyDataModelModelCompareJobResult/exportResultDetails?resultId=${item?.id??''}`);
}
return (
<Tabs defaultActiveKey="1" tabBarExtraContent={
<Button onClick={onExportClick}>
导出
</Button>
}>
<Tabs.TabPane tab="匹配清单" key="1">
<PerfectMatch item={item} />
</Tabs.TabPane>
<Tabs.TabPane tab="差异清单" key="2">
<PartialMatch item={item} />
</Tabs.TabPane>
<Tabs.TabPane tab="不匹配清单" key="3">
<NotMatch item={item} />
</Tabs.TabPane>
</Tabs>
)
}
const PerfectMatch = ({ item }) => {
const [args, setArgs] = React.useState({
page: defaultPage.pageNum,
size: defaultPage.pageSize,
})
const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState()
const [selectedRows, setSelectedRows] = React.useState()
const [rightRow, setRightRow] = React.useState()
const [modal, contextHolder] = Modal.useModal()
const setArgsByParams = React.useCallback((params) => {
setArgs((prev) => {
return {...prev, ...params}
})
}, [])
React.useEffect(() => {
if (item) {
getList()
}
}, [item])
const tableData = React.useMemo(() => {
let newTableData = [...data??[]]
return paginate(newTableData, args.page, args.size)
}, [data, args])
const cols = [
{
title: '序号',
dataIndex: 'index',
width:60,
render: (_, __, index)=> ((args.page-1)*args.size+index+1)
},
{
title: '环境',
dataIndex: 'catalog',
render: (_, record) => {
const paths = (record.metadataPath??'').split('/')
if ((paths??[]).length > 0) {
return <Tooltip title={paths[0]}>
<Typography.Text ellipsis={true}>{paths[0]}</Typography.Text>
</Tooltip>
}
return ''
}
},
{
title: '模型路径',
dataIndex: 'modelPath',
},
{
title: '模型名称',
dataIndex: 'modelName',
},
{
title: '元数据路径',
dataIndex: 'metadataPath',
render: (_, record) => {
const paths = (record.metadataPath??'').split('/')
//去掉环境
paths.splice(0, 1)
return (
<Tooltip title={(paths??[]).join('/')}>
<Typography.Text ellipsis={true}>{(paths??[]).join('/')}</Typography.Text>
</Tooltip>
)
}
},
{
title: '元数据名称',
dataIndex: 'metadataName',
},
{
title: '模型状态',
dataIndex: 'modelStatusName',
},
]
const getList = () => {
setLoading(true)
dispatch({
type: 'datamodel.getCompareJobResultPerfectMatchList',
payload: {
resultId: item?.id
},
callback: data => {
setLoading(false)
setData(data)
},
error: () => {
setLoading(false)
}
})
}
const onDeployClick = () => {
modal.confirm({
title:'提示',
content: '确定将选择模型状态变更为“已上线”吗?',
okText: '确认',
cancelText: '取消',
onOk: () => {
dispatch({
type: 'datamodel.getCompareJobResultDeployModels',
payload: {
data: (selectedRows??[]).map(item => item.id)
},
callback: data => {
showMessage('success', '上线成功')
getList()
}
})
}
})
}
const onRightMenuItemClick = (key, record) => {
if (key === '确认上线') {
modal.confirm({
title:'提示',
content: '确定将选择模型状态变更为“已上线”吗?',
okText: '确认',
cancelText: '取消',
onOk: () => {
dispatch({
type: 'datamodel.getCompareJobResultDeployModels',
payload: {
data: record?.id?[record?.id]:[]
},
callback: data => {
showMessage('success', '上线成功')
getList()
}
})
}
})
}
}
return (
<div>
<div>
<Tooltip title={(selectedRows??[]).length===0?'请选择模型':''}>
<Button onClick={onDeployClick} disabled={(selectedRows??[]).length===0}>确定上线</Button>
</Tooltip>
</div>
<div className='pt-3'>
<Table
extraColWidth={32}
loading={loading}
columns={cols??[]}
dataSource={tableData??[]}
rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows)
},
}}
pageNum={args.page} pageSize={args.size} total={(data??[]).length}
onPaginate={(page, size) => {
setArgsByParams({ page, size })
}}
shouldRowContextMenu={(record) => {
setRightRow(record)
return true
}}
menuData={['确认上线']}
menuPermissions={['确认上线']}
onMenuItemClick={onRightMenuItemClick}
/>
</div>
{contextHolder}
</div>
)
}
const PartialMatch = ({ item }) => {
const [args, setArgs] = React.useState({
page: defaultPage.pageNum,
size: defaultPage.pageSize,
})
const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState()
const [selectedRows, setSelectedRows] = React.useState()
const [rightRow, setRightRow] = React.useState()
const [modal, contextHolder] = Modal.useModal()
const setArgsByParams = React.useCallback((params) => {
setArgs((prev) => {
return {...prev, ...params}
})
}, [])
React.useEffect(() => {
if (item) {
getList()
}
}, [item])
const tableData = React.useMemo(() => {
let newTableData = [...data??[]]
return paginate(newTableData, args.page, args.size)
}, [data, args])
const cols = [
{
title: '序号',
dataIndex: 'index',
width:60,
render: (_, __, index)=> ((args.page-1)*args.size+index+1)
},
{
title: '环境',
dataIndex: 'catalog',
render: (_, record) => {
const paths = (record.metadataPath??'').split('/')
if ((paths??[]).length > 0) {
return <Tooltip title={paths[0]}>
<Typography.Text ellipsis={true}>{paths[0]}</Typography.Text>
</Tooltip>
}
return ''
}
},
{
title: '模型路径',
dataIndex: 'modelPath',
},
{
title: '模型名称',
dataIndex: 'modelName',
},
{
title: '元数据路径',
dataIndex: 'metadataPath',
render: (_, record) => {
const paths = (record.metadataPath??'').split('/')
//去掉环境
paths.splice(0, 1)
return (
<Tooltip title={(paths??[]).join('/')}>
<Typography.Text ellipsis={true}>{(paths??[]).join('/')}</Typography.Text>
</Tooltip>
)
}
},
{
title: '元数据名称',
dataIndex: 'metadataName',
},
{
title: '差异结论',
dataIndex: 'differenceMsg',
render: (text, record) => {
return (
<Tooltip title={
<div>
{
(text??'').split('\n').map(item => (
<div key={generateUUID()}>
{item}
</div>
))
}
</div>
}>
<Typography.Text ellipsis={true}>{text}</Typography.Text>
</Tooltip>
)
}
},
{
title: '模型状态',
dataIndex: 'modelStatusName',
},
]
const getList = () => {
setLoading(true)
dispatch({
type: 'datamodel.getCompareJobResultPartialMatchList',
payload: {
resultId: item?.id
},
callback: data => {
setLoading(false)
setData(data)
},
error: () => {
setLoading(false)
}
})
}
const onDeployClick = () => {
modal.confirm({
title:'提示',
content: '确定将选择模型状态变更为“已上线”吗?',
okText: '确认',
cancelText: '取消',
onOk: () => {
dispatch({
type: 'datamodel.getCompareJobResultDeployModels',
payload: {
data: (selectedRows??[]).map(item => item.id)
},
callback: data => {
showMessage('success', '上线成功')
getList()
}
})
}
})
}
const onRightMenuItemClick = (key, record) => {
if (key === '确认上线') {
modal.confirm({
title:'提示',
content: '确定将选择模型状态变更为“已上线”吗?',
okText: '确认',
cancelText: '取消',
onOk: () => {
dispatch({
type: 'datamodel.getCompareJobResultDeployModels',
payload: {
data: record?.id?[record?.id]:[]
},
callback: data => {
showMessage('success', '上线成功')
getList()
}
})
}
})
}
}
return (
<div>
<div>
<Tooltip title={(selectedRows??[]).length===0?'请选择模型':''}>
<Button onClick={onDeployClick} disabled={(selectedRows??[]).length===0}>确定上线</Button>
</Tooltip>
</div>
<div className='pt-3'>
<Table
extraColWidth={32}
loading={loading}
columns={cols??[]}
dataSource={tableData??[]}
rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows)
},
}}
pageNum={args.page} pageSize={args.size} total={(data??[]).length}
onPaginate={(page, size) => {
setArgsByParams({ page, size })
}}
shouldRowContextMenu={(record) => {
setRightRow(record)
return true
}}
menuData={['确认上线']}
menuPermissions={['确认上线']}
onMenuItemClick={onRightMenuItemClick}
/>
</div>
{contextHolder}
</div>
)
}
const NotMatch = ({ item }) => {
const [args, setArgs] = React.useState({
metadataPage: defaultPage.pageNum,
metadataSize: defaultPage.pageSize,
modelPage: defaultPage.pageNum,
modelSize: defaultPage.pageSize,
})
const [loadingMetadata, setLoadingMetadata] = React.useState(false)
const [metadatas, setMetadatas] = React.useState()
const [loadingModel, setLoadingModel] = React.useState(false)
const [models, setModels] = React.useState()
React.useEffect(() => {
if (item) {
getMetadatas()
getModels()
}
}, [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 = [
{
title: '序号',
dataIndex: 'index',
width:60,
render: (_, __, index)=> ((args.metadataPage-1)*args.metadataSize+index+1)
},
{
title: '环境',
dataIndex: 'catalog',
render: (_, record) => {
const paths = (record.metadataPath??'').split('/')
if ((paths??[]).length > 0) {
return <Tooltip title={paths[0]}>
<Typography.Text ellipsis={true}>{paths[0]}</Typography.Text>
</Tooltip>
}
return ''
}
},
{
title: '元数据路径',
dataIndex: 'metadataPath',
render: (_, record) => {
const paths = (record.metadataPath??'').split('/')
//去掉环境
paths.splice(0, 1)
return (
<Tooltip title={(paths??[]).join('/')}>
<Typography.Text ellipsis={true}>{(paths??[]).join('/')}</Typography.Text>
</Tooltip>
)
}
},
{
title: '元数据名称',
dataIndex: 'metadataName',
},
]
const modelCols = [
{
title: '序号',
dataIndex: 'index',
width:60,
render: (_, __, index)=> ((args.modelPage-1)*args.modelSize+index+1)
},
{
title: '模型路径',
dataIndex: 'modelPath',
},
{
title: '模型名称',
dataIndex: 'modelName',
},
]
const getMetadatas = () => {
setLoadingMetadata(true)
dispatch({
type: 'datamodel.getCompareJobResultNotMatchMetadataList',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingMetadata(false)
setMetadatas(data)
},
error: () => {
setLoadingMetadata(false)
}
})
}
const getModels = () => {
setLoadingModel(true)
dispatch({
type: 'datamodel.getCompareJobResultNotMatchModelList',
payload: {
resultId: item?.id
},
callback: data => {
setLoadingModel(false)
setModels(data)
},
error: () => {
setLoadingModel(false)
}
})
}
return (
<Row gutter={15}>
<Col span={12}>
<h4>未匹配元数据列表</h4>
<Table
loading={loadingMetadata}
columns={metadataCols??[]}
dataSource={metadataTableData??[]}
pageNum={args.metadataPage} pageSize={args.metadataSize} total={(metadataTableData??[]).length}
onPaginate={(page, size) => {
setArgsByParams({ metadataPage: page, metadataSize: size })
}}
shouldRowContextMenu={(record) => {
return false
}}
/>
</Col>
<Col span={12}>
<h4>未匹配模型列表</h4>
<Table
loading={loadingModel}
columns={modelCols??[]}
dataSource={modelTableData??[]}
pageNum={args.modelPage} pageSize={args.modelSize} total={(modelTableData??[]).length}
onPaginate={(page, size) => {
setArgsByParams({ modelPage: page, modelSize: size })
}}
shouldRowContextMenu={(record) => {
return false
}}
/>
</Col>
</Row>
)
}
\ No newline at end of file
......@@ -6,6 +6,7 @@ import { defaultPage } from '../../../util/hooks/page'
import { dispatch } from '../../../model'
import Table from '../../../util/Component/Table'
import UpdateTask from './update-task'
import ResultDetail from './result-detail'
import '../AssetTask/index.less'
import { showMessage } from '../../../util'
......@@ -29,6 +30,10 @@ const FC = (props) => {
item: undefined,
type: undefined
})
const [resultDetailParams, setResultDetailParams] = React.useState({
visible: false,
item: undefined,
})
const [rightRow, setRightRow] = React.useState()
const [modal, contextHolder] = Modal.useModal()
......@@ -149,7 +154,10 @@ const FC = (props) => {
if (key === '执行日志') {
} else if (key === '执行结果') {
setResultDetailParams({
visible: true,
item: record,
})
} else if (key === '重跑') {
} else if (key === '取消') {
......@@ -238,6 +246,15 @@ const FC = (props) => {
})
}}
/>
<ResultDetail
{...resultDetailParams}
onCancel={() => {
setResultDetailParams({
visible: false,
item: undefined,
})
}}
/>
{contextHolder}
</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