Browse Source

(*)采集日志UI和接口提交

master
peng.peng 2 years ago
parent
commit
83ef721e5b
  1. 56
      api/app/lib/controllers/metadataAcquisition/log.js
  2. 4
      api/app/lib/index.js
  3. 11
      api/app/lib/routes/metadataAcquisition/log.js
  4. 4
      web/client/src/sections/metadataAcquisition/actions/index.js
  5. 16
      web/client/src/sections/metadataAcquisition/actions/log.js
  6. 110
      web/client/src/sections/metadataAcquisition/containers/acquisitionLog.js
  7. 4
      web/client/src/utils/webapi.js

56
api/app/lib/controllers/metadataAcquisition/log.js

@ -0,0 +1,56 @@
'use strict';
function getAcquisitionTask(opts) {
return async function (ctx, next) {
const models = ctx.fs.dc.models;
const { page, limit, taskName } = ctx.query;
let errMsg = { message: '获取采集任务失败' }
const Op = ctx.fs.dc.ORM.Op;
try {
let searchWhere = {}
let option = {
where: searchWhere,
order: [["id", "desc"]],
include: [{
model: models.AcquisitionTask,
as: 'acquisitionTask',
include: [{
model: models.DataSource,
}]
}]
}
if (taskName) {
searchWhere.$or = [
{ '$acquisitionTask.task_name$': { $iLike: `%${taskName}%` } },
{ '$acquisitionTask.dataSource.name$': { $iLike: `%${taskName}%` } },
]
}
option.where = searchWhere
let limit_ = limit || 10;
let page_ = page || 1;
let offset = (page_ - 1) * limit_;
if (limit && page) {
option.limit = limit_
option.offset = offset
}
const res = await models.AcquisitionLog.findAndCount(option);
ctx.status = 200;
ctx.body = res;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = errMsg
}
}
}
module.exports = {
getAcquisitionTask,
}

4
api/app/lib/index.js

@ -55,11 +55,13 @@ module.exports.models = function (dc) {
}); });
const { const {
DataSource, AcquisitionTask, Adapter, User, MetadataDatabase, MetadataFile, MetadataRestapi DataSource, AcquisitionTask, Adapter, User, MetadataDatabase, MetadataFile, MetadataRestapi, AcquisitionLog
} = dc.models; } = dc.models;
AcquisitionTask.belongsTo(DataSource, { foreignKey: 'dataSourceId', targetKey: 'id' }); AcquisitionTask.belongsTo(DataSource, { foreignKey: 'dataSourceId', targetKey: 'id' });
DataSource.hasMany(AcquisitionTask, { foreignKey: 'dataSourceId', sourceKey: 'id' }); DataSource.hasMany(AcquisitionTask, { foreignKey: 'dataSourceId', sourceKey: 'id' });
AcquisitionLog.belongsTo(AcquisitionTask, { foreignKey: 'task', targetKey: 'id' });
AcquisitionTask.hasMany(AcquisitionLog, { foreignKey: 'task', sourceKey: 'id' });
DataSource.belongsTo(Adapter, { foreignKey: 'adapterId', targetKey: 'id' }); DataSource.belongsTo(Adapter, { foreignKey: 'adapterId', targetKey: 'id' });
Adapter.hasMany(DataSource, { foreignKey: 'adapterId', sourceKey: 'id' }); Adapter.hasMany(DataSource, { foreignKey: 'adapterId', sourceKey: 'id' });

11
api/app/lib/routes/metadataAcquisition/log.js

@ -0,0 +1,11 @@
'use strict';
const log = require('../../controllers/metadataAcquisition/log');
module.exports = function (app, router, opts, AuthCode) {
//获取采集任务列表
app.fs.api.logAttr['GET/meta/acq/logs'] = { content: '获取采集任务列表', visible: true };
router.get('/meta/acq/logs', log.getAcquisitionTask(opts));
};

4
web/client/src/sections/metadataAcquisition/actions/index.js

@ -4,9 +4,11 @@ import * as example from './example'
import * as adapter from './adapter' import * as adapter from './adapter'
import * as dataSource from './dataSource' import * as dataSource from './dataSource'
import * as task from './task'; import * as task from './task';
import * as log from './log';
export default { export default {
...example, ...example,
...adapter, ...adapter,
...dataSource, ...dataSource,
...task ...task,
...log
} }

16
web/client/src/sections/metadataAcquisition/actions/log.js

@ -0,0 +1,16 @@
'use strict';
import { basicAction } from '@peace/utils'
import { ApiTable } from '$utils'
export function getLogs(query) {
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
query: query || {},
actionType: 'GET_ACQ_LOGS',
url: `${ApiTable.getLogs}`,
msg: { error: '获取采集日志失败' },
reducer: { name: 'acqlogs' }
});
}

110
web/client/src/sections/metadataAcquisition/containers/acquisitionLog.js

@ -6,22 +6,20 @@ import moment from 'moment';
import './style.less'; import './style.less';
function AcquisitionLog(props) { function AcquisitionLog(props) {
const { loading, clientHeight, actions, dispatch, dataSources, adapters, tasks } = props; const { loading, clientHeight, actions, dispatch, acqlogs } = props;
const [pageSize, setPageSize] = useState(10); const [pageSize, setPageSize] = useState(10);
const [currentPage, setCurrentPage] = useState(1); const [currentPage, setCurrentPage] = useState(1);
const [searchValue, setSearchValue] = useState('') const [searchValue, setSearchValue] = useState('')
const queryData = (search) => { const queryData = (search) => {
const query = { const query = {
// limit: search ? 10 : pageSize || 10, limit: search ? 10 : pageSize || 10,
// page: search ? 1 : currentPage || 1, page: search ? 1 : currentPage || 1,
taskName: searchValue taskName: searchValue
} }
dispatch(actions.metadataAcquisition.getTasks(query)); dispatch(actions.metadataAcquisition.getLogs(query));
} }
useEffect(() => { useEffect(() => {
dispatch(actions.metadataAcquisition.getDataSources());
dispatch(actions.metadataAcquisition.getAdapters())
queryData(); queryData();
}, [pageSize, currentPage]); }, [pageSize, currentPage]);
@ -29,29 +27,24 @@ function AcquisitionLog(props) {
{ {
title: '任务名称', title: '任务名称',
dataIndex: 'taskName', dataIndex: 'taskName',
render: (text, record) => {
return record?.acquisitionTask?.taskName;
}
}, },
{ {
title: '数据源名称', title: '数据源名称',
dataIndex: 'dataSourceName', dataIndex: 'dataSourceName',
render: (text, record) => { render: (text, record) => {
return record?.dataSource?.name return record?.acquisitionTask?.dataSource?.name;
} }
}, },
{ {
title: '适配器类型', title: '适配器类型',
dataIndex: 'adapter', dataIndex: 'adapter',
render: (text, record) => {
const adapterInfo = record?.dataSource?.adapter
return adapterInfo?.adapterName
}
}, },
{ {
title: '采集方式', title: '采集方式',
dataIndex: 'control', dataIndex: 'control',
render: (text, record) => {
const adapterInfo = record?.dataSource?.adapter
return adapterInfo?.mode
}
}, },
{ {
title: '执行周期', title: '执行周期',
@ -68,52 +61,6 @@ function AcquisitionLog(props) {
title: '时间间隔(分钟)', title: '时间间隔(分钟)',
dataIndex: 'retryTime', dataIndex: 'retryTime',
}, },
{
title: '操作',
width: 300,
key: 'option',
valueType: 'option',
render: (text, record) => {
const options = [];
options.push(<a onClick={() => {
const param = { id: record.id }
dispatch(actions.metadataAcquisition.runTask(param))
}} style={{ marginRight: 8 }}>立即执行</a>)
const enabledText = record?.enabled ? '禁用' : '启用';
options.push(<a onClick={() => {
dispatch(actions.metadataAcquisition.modifyTask(record?.id, { enabled: !record?.enabled }, '采集任务' + enabledText)).then(res => {
if (res.success) {
queryData();
}
})
}} style={{ marginRight: 8 }}>{enabledText}</a>)
options.push(<a onClick={() => {
const adapterInfo = adapters?.find(x => x.id == record?.adapter)
setVisible(true)
record.adapterInfo = adapterInfo
setEditData(record)
}} style={{ marginRight: 8 }}>编辑</a>)
//判断数据源下是否有任务 有任务提示需要先删除任务再删除数据源
options.push(
<Popconfirm
key="del"
placement="top"
title={<><div>是否确认删除该采集任务</div>
<div>(将同步删除该任务采集日志)</div></>}
onConfirm={() => handleDelete(record.id)}
okText="是"
cancelText="否"
>
<a>删除</a>
</Popconfirm>)
return options;
},
},
]; ];
return <Spin spinning={loading}> return <Spin spinning={loading}>
@ -136,28 +83,28 @@ function AcquisitionLog(props) {
} }
pagination={{ pagination={{
size: 'large', size: 'large',
total: tasks?.count, total: acqlogs?.count,
showSizeChanger: true, showSizeChanger: true,
// showQuickJumper: true, showQuickJumper: true,
// current: currentPage, current: currentPage,
// pageSize: pageSize || 10, pageSize: pageSize || 10,
defaultPageSize: 10, defaultPageSize: 10,
pageSizeOptions: [10, 20, 50], pageSizeOptions: [10, 20, 50],
// showTotal: (total) => { showTotal: (total) => {
// return <span style={{ fontSize: 15 }}>{`共${Math.ceil(total / pageSize)}页,${total}项`}</span> return <span style={{ fontSize: 15 }}>{`${Math.ceil(total / pageSize)}页,${total}`}</span>
// }, },
// onShowSizeChange: (currentPage, pageSize) => { onShowSizeChange: (currentPage, pageSize) => {
// setCurrentPage(currentPage); setCurrentPage(currentPage);
// setPageSize(pageSize); setPageSize(pageSize);
// }, },
// onChange: (page, pageSize) => { onChange: (page, pageSize) => {
// setCurrentPage(page); setCurrentPage(page);
// setPageSize(pageSize); setPageSize(pageSize);
// } }
}} }}
dataSource={tasks?.rows || []} dataSource={acqlogs?.rows || []}
options={false} options={false}
/> />
</Spin> </Spin>
@ -166,15 +113,14 @@ function AcquisitionLog(props) {
function mapStateToProps(state) { function mapStateToProps(state) {
const { const {
auth, global, datasources, adapters, tasks global, acqlogs
} = state; } = state;
return { return {
loading: datasources.isRequesting || adapters?.isRequesting, loading: acqlogs.isRequesting,
clientHeight: global.clientHeight, clientHeight: global.clientHeight,
actions: global.actions, actions: global.actions,
dataSources: datasources?.data || {}, acqlogs: acqlogs?.data || {},
adapters: adapters?.data || [],
tasks: tasks?.data || [],
}; };
} }

4
web/client/src/utils/webapi.js

@ -44,8 +44,10 @@ export const ApiTable = {
addTask: 'meta/acq/task', addTask: 'meta/acq/task',
getTasks: 'meta/acq/tasks', getTasks: 'meta/acq/tasks',
modifyTask: 'acq/task/{id}', modifyTask: 'acq/task/{id}',
runTask: 'run/acq/task' runTask: 'run/acq/task',
//采集日志
getLogs:"meta/acq/logs"
}; };
export const RouteTable = { export const RouteTable = {

Loading…
Cancel
Save