Commit 9a561ea1 by zhaochengxiang

元数据审核

parent 1f7fb67f
...@@ -76,6 +76,6 @@ ...@@ -76,6 +76,6 @@
"last 1 safari version" "last 1 safari version"
] ]
}, },
"proxy": "http://139.198.127.28:17279", "proxy": "http://192.168.0.54:8888",
"homepage": "http://myhost/data-govern" "homepage": "http://myhost/data-govern"
} }
...@@ -76,6 +76,14 @@ export function* getTaskTracerByStateId(payload) { ...@@ -76,6 +76,14 @@ export function* getTaskTracerByStateId(payload) {
return yield call(service.getTaskTracerByStateId, payload); return yield call(service.getTaskTracerByStateId, payload);
} }
export function* getTaskReviews(payload) {
return yield call(service.getTaskReviews, payload);
}
export function* cancelReview(payload) {
return yield call(service.cancelReview, payload);
}
export function* deleteSchedule(payload) { export function* deleteSchedule(payload) {
return yield call(service.deleteSchedule, payload); return yield call(service.deleteSchedule, payload);
} }
......
...@@ -72,6 +72,14 @@ export function getTaskTracerByStateId(payload) { ...@@ -72,6 +72,14 @@ export function getTaskTracerByStateId(payload) {
return GetJSON("/metadataharvester/task/getTaskTracerByStateId", payload); return GetJSON("/metadataharvester/task/getTaskTracerByStateId", payload);
} }
export function getTaskReviews(payload) {
return GetJSON("/metadataharvester/task/findTaskReview", payload);
}
export function cancelReview(payload) {
return GetJSON("/metadataharvester/task/cancelReview", payload);
}
export function deleteSchedule(payload) { export function deleteSchedule(payload) {
return Delete("/metadataharvester/schedule/deleteSchedule", payload); return Delete("/metadataharvester/schedule/deleteSchedule", payload);
} }
......
import React, { useState, useEffect } from 'react';
import { Modal, Row, Col, Card, Table, Typography, Spin, Empty, Button, DatePicker, Input, Divider } from 'antd';
import classNames from 'classnames';
import 'moment/locale/zh-cn';
import locale from 'antd/es/date-picker/locale/zh_CN';
import { dispatch, dispatchLatest } from '../../../../model';
import './TaskLogsModal.less';
import { showMessage } from '../../../../util';
const { Meta } = Card;
const { RangePicker } = DatePicker;
const TaskReviewModal = (props) => {
const { visible, onCancel, scope, scopes } = props;
const [ data, setData ] = useState([]);
const [ taskTracersBindStateId, setTaskTracersBindStateId ] = useState([]);
const [ expandedRowKeys, setExpandedRowKeys ] = useState([]);
const cols = [
{
title: '序号',
dataIndex: 'key',
render: (text, record, index) => {
return (index+1).toString();
},
width:80
},
{
title: '系统',
dataIndex: 'scope',
ellipsis: true,
},
{
title: '数据源',
dataIndex: 'databaseName',
ellipsis: true,
},
{
title: '抽取schema',
dataIndex: 'schema',
ellipsis: true,
render: (schemas) => (schemas??[]).toString()
},
{
title: '开始时间',
dataIndex: 'startTime',
ellipsis: true,
},
{
title: '结束时间',
dataIndex: 'endTime',
ellipsis: true,
},
{
title: '执行状态',
dataIndex: 'state',
},
{
title: '操作',
key: 'action',
width: 120,
render: (_,record) => {
return (
<div style={{ display: 'flex', alignItems: 'center' }}>
<Button
type='link'
size='small'
onClick={() => {
dispatch({
type: 'datasource.startTask',
payload: {
params: {
harvestingTaskId: record.harvestingTaskId
}
},
callback: data => {
showMessage('success', '确定成功')
getTaskReviews()
}
});
}}
style={{ padding: 0 }}
>
确定
</Button>
<div style={{ margin: '0 5px' }}>
<Divider type='vertical' />
</div>
<Button
type='link'
size='small'
onClick={() => {
dispatch({
type: 'datasource.cancelReview',
payload: {
harvestingTaskId: record.harvestingTaskId
},
callback: data => {
showMessage('success', '取消成功')
getTaskReviews()
}
});
}}
style={{ padding: 0 }}
>
取消
</Button>
</div>
)
}
}
]
useEffect(() => {
if (visible) {
getTaskReviews()
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [ visible ])
const getTaskReviews = () => {
dispatchLatest({
type: 'datasource.getTaskReviews',
payload: {
namespace: ((scope||[]).length>0?scope[0]:''),
},
callback: data => {
let _scopes = [];
(scopes||[]).forEach(item => {
(item.catalogs||[]).forEach((catalog) => {
_scopes = [..._scopes, ...(catalog.scopes||[])];
});
});
(data??[]).forEach(item => {
(_scopes||[]).forEach(_item => {
if (_item.scopeId === Number(item.scope)) {
item.scope = _item.scopeName;
}
})
});
setData(data);
}
})
}
const getTaskTracer = (record) => {
dispatch({
type: 'datasource.getTaskTracerByStateId',
payload: {
taskStateId: record.taskStateId
},
callback: data => {
setTaskTracersBindStateId([...taskTracersBindStateId, { key: record.taskStateId, value: data||[] }]);
}
});
}
const reset = () => {
setData();
setTaskTracersBindStateId([]);
setExpandedRowKeys([]);
}
return (
<Modal
className='task-report-modal'
forceRender
title='元数据采集审核'
visible={visible}
width={1000}
bodyStyle={{ padding: '15px', overflowX: 'auto', maxHeight: '80vh' }}
onCancel={() => {
reset();
onCancel && onCancel()
}}
footer = {
<Button
key="1"
type="primary"
onClick={() => {
reset();
onCancel && onCancel()
}}
>
取消
</Button>
}
>
<Table
className='mt-3'
columns={cols}
rowKey={'taskStateId'}
dataSource={data||[]}
pagination={false}
sticky
expandable={{
expandedRowRender: record => {
let _tracer = null;
(taskTracersBindStateId||[]).forEach(item => {
if (item.key === record.taskStateId) {
_tracer = item.value||[];
}
})
return (
<Spin spinning={_tracer===null}>
{
(_tracer||[]).length === 0 && <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="暂无日志" />
}
{
_tracer && _tracer.map((_item, index) => {
return (
<Typography.Paragraph key={index} >
{_item.value||''}
</Typography.Paragraph>
)
})
}
</Spin>
);
},
expandedRowKeys,
onExpand: (expanded, record) => {
let exsit = false;
(taskTracersBindStateId||[]).forEach(item => {
if (item.key === record.taskStateId) {
exsit = true;
}
})
const newExpandedKeys = [...expandedRowKeys];
if (expanded) {
newExpandedKeys.push(record.taskStateId||'');
} else {
const index = newExpandedKeys.indexOf(record.id||'');
newExpandedKeys.splice(index, 1);
}
setExpandedRowKeys([...newExpandedKeys]);
if (expanded && !exsit) {
getTaskTracer(record);
}
}
}}
/>
</Modal>
);
}
export default TaskReviewModal;
\ No newline at end of file
...@@ -4,6 +4,7 @@ import { Space, Select, Button, Modal, TreeSelect } from 'antd'; ...@@ -4,6 +4,7 @@ import { Space, Select, Button, Modal, TreeSelect } from 'antd';
import DatasourceList from './Component/DatasourceList'; import DatasourceList from './Component/DatasourceList';
import UpdateDatasourceModal from './Component/UpdateDatasourceModal'; import UpdateDatasourceModal from './Component/UpdateDatasourceModal';
import ScheduleCURDModal from './Component/ScheduleCURDModal'; import ScheduleCURDModal from './Component/ScheduleCURDModal';
import TaskReviewModal from './Component/TaskReviewModal';
import TaskLogsModal from './Component/TaskLogsModal'; import TaskLogsModal from './Component/TaskLogsModal';
import TaskLogModal from './Component/TaskLogModal'; import TaskLogModal from './Component/TaskLogModal';
import UpdateTaskModal from './Component/UpdateTaskModal'; import UpdateTaskModal from './Component/UpdateTaskModal';
...@@ -41,6 +42,7 @@ const DatasourceManage = (props) => { ...@@ -41,6 +42,7 @@ const DatasourceManage = (props) => {
const [ scheduleCURDModalVisible, setScheduleCURDModalVisible ] = useState(false); const [ scheduleCURDModalVisible, setScheduleCURDModalVisible ] = useState(false);
const [ updateTaskModalVisible, setUpdateTaskModalVisible ] = useState(false); const [ updateTaskModalVisible, setUpdateTaskModalVisible ] = useState(false);
const [ updateTaskModalAction, setUpdateTaskModalAction ] = useState(''); const [ updateTaskModalAction, setUpdateTaskModalAction ] = useState('');
const [ taskReviewModalVisible, setTaskReviewModalVisible ] = useState(false);
const [ taskLogsModalVisible, setTaskLogsModalVisible ] = useState(false); const [ taskLogsModalVisible, setTaskLogsModalVisible ] = useState(false);
const [ taskLogModalVisible, setTaskLogModalVisible ] = useState(false); const [ taskLogModalVisible, setTaskLogModalVisible ] = useState(false);
const [ currentDatasourceId, setCurrentDatasourceId ] = useState(''); const [ currentDatasourceId, setCurrentDatasourceId ] = useState('');
...@@ -192,6 +194,10 @@ const DatasourceManage = (props) => { ...@@ -192,6 +194,10 @@ const DatasourceManage = (props) => {
setFilterDatasources((datasources||[]).filter(item=>value==='all'||item.type===value)); setFilterDatasources((datasources||[]).filter(item=>value==='all'||item.type===value));
} }
const onTaskReview = () => {
setTaskReviewModalVisible(true)
}
const showTaskLogs = () => { const showTaskLogs = () => {
if (loadingDatabases) { if (loadingDatabases) {
...@@ -388,6 +394,7 @@ const DatasourceManage = (props) => { ...@@ -388,6 +394,7 @@ const DatasourceManage = (props) => {
</Select> </Select>
</Space> </Space>
<Space> <Space>
<Button type='primary' onClick={onTaskReview}>元数据采集审核</Button>
<Button type='primary' onClick={showTaskLogs}>日志报告</Button> <Button type='primary' onClick={showTaskLogs}>日志报告</Button>
<Button type='primary' onClick={addDatasource}>新增数据源</Button> <Button type='primary' onClick={addDatasource}>新增数据源</Button>
</Space> </Space>
...@@ -411,6 +418,15 @@ const DatasourceManage = (props) => { ...@@ -411,6 +418,15 @@ const DatasourceManage = (props) => {
onCancel={onScheduleCURDModalCancel} onCancel={onScheduleCURDModalCancel}
/> />
<TaskReviewModal
visible={taskReviewModalVisible}
scope={selectedScope}
scopes={scopes}
onCancel={() => {
setTaskReviewModalVisible(false)
}}
/>
<TaskLogsModal <TaskLogsModal
visible={taskLogsModalVisible} visible={taskLogsModalVisible}
scope={selectedScope} scope={selectedScope}
......
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