import React, {Component} from 'react'; import { Button, Col, Divider, Dropdown, Input, Layout, Menu, Modal, PageHeader, Row, Space, Switch, Table, Tag, Timeline, Tooltip, Typography } from "antd"; import qs from "qs"; import request from "../../common/request"; import {message} from "antd/es"; import { DeleteOutlined, DownOutlined, ExclamationCircleOutlined, PlusOutlined, SyncOutlined, UndoOutlined } from '@ant-design/icons'; import {itemRender} from "../../utils/utils"; import Logout from "../user/Logout"; import dayjs from "dayjs"; import JobModal from "./JobModal"; import './Job.css' const confirm = Modal.confirm; const {Content} = Layout; const {Title, Text} = Typography; const {Search} = Input; const routes = [ { path: '', breadcrumbName: '首页', }, { path: 'job', breadcrumbName: '计划任务', } ]; class Job extends Component { inputRefOfName = React.createRef(); state = { items: [], total: 0, queryParams: { pageIndex: 1, pageSize: 10 }, loading: false, modalVisible: false, modalTitle: '', modalConfirmLoading: false, selectedRow: undefined, selectedRowKeys: [], logs: [] }; componentDidMount() { this.loadTableData(); } async delete(id) { const result = await request.delete('/jobs/' + id); if (result.code === 1) { message.success('删除成功'); this.loadTableData(this.state.queryParams); } else { message.error('删除失败 :( ' + result.message, 10); } } async loadTableData(queryParams) { this.setState({ loading: true }); queryParams = queryParams || this.state.queryParams; // queryParams let paramsStr = qs.stringify(queryParams); let data = { items: [], total: 0 }; try { let result = await request.get('/jobs/paging?' + paramsStr); if (result.code === 1) { data = result.data; } else { message.error(result.message); } } catch (e) { } finally { const items = data.items.map(item => { return {'key': item['id'], ...item} }) this.setState({ items: items, total: data.total, queryParams: queryParams, loading: false }); } } handleChangPage = async (pageIndex, pageSize) => { let queryParams = this.state.queryParams; queryParams.pageIndex = pageIndex; queryParams.pageSize = pageSize; this.setState({ queryParams: queryParams }); await this.loadTableData(queryParams) }; handleSearchByName = name => { let query = { ...this.state.queryParams, 'pageIndex': 1, 'pageSize': this.state.queryParams.pageSize, 'name': name, } this.loadTableData(query); }; showDeleteConfirm(id, content) { let self = this; confirm({ title: '您确定要删除此任务吗?', content: content, okText: '确定', okType: 'danger', cancelText: '取消', onOk() { self.delete(id); } }); }; showModal(title, assets = null) { this.setState({ modalTitle: title, modalVisible: true, model: assets }); }; handleCancelModal = e => { this.setState({ modalTitle: '', modalVisible: false }); }; handleOk = async (formData) => { // 弹窗 form 传来的数据 this.setState({ modalConfirmLoading: true }); if (formData.id) { // 向后台提交数据 const result = await request.put('/jobs/' + formData.id, formData); if (result.code === 1) { message.success('更新成功'); this.setState({ modalVisible: false }); this.loadTableData(this.state.queryParams); } else { message.error('更新失败 :( ' + result.message, 10); } } else { // 向后台提交数据 const result = await request.post('/jobs', formData); if (result.code === 1) { message.success('新增成功'); this.setState({ modalVisible: false }); this.loadTableData(this.state.queryParams); } else { message.error('新增失败 :( ' + result.message, 10); } } this.setState({ modalConfirmLoading: false }); }; batchDelete = async () => { this.setState({ delBtnLoading: true }) try { let result = await request.delete('/jobs/' + this.state.selectedRowKeys.join(',')); if (result.code === 1) { message.success('操作成功', 3); this.setState({ selectedRowKeys: [] }) await this.loadTableData(this.state.queryParams); } else { message.error('删除失败 :( ' + result.message, 10); } } finally { this.setState({ delBtnLoading: false }) } } render() { const columns = [{ title: '序号', dataIndex: 'id', key: 'id', render: (id, record, index) => { return index + 1; } }, { title: '任务名称', dataIndex: 'name', key: 'name', render: (name, record) => { let short = name; if (short && short.length > 20) { short = short.substring(0, 20) + " ..."; } return ( {short} ); } }, { title: '状态', dataIndex: 'status', key: 'status', render: (status, record) => { return { let jobStatus = checked ? 'running' : 'not-running'; let result = await request.post(`/jobs/${record['id']}/change-status?status=${jobStatus}`); if (result['code'] === 1) { message.success('操作成功'); await this.loadTableData(); } else { message.error(result['message']); } }} /> } }, { title: '任务类型', dataIndex: 'func', key: 'func', render: (func, record) => { switch (func) { case "check-asset-status-job": return 资产状态检测 } } }, { title: 'cron表达式', dataIndex: 'cron', key: 'cron' }, { title: '创建日期', dataIndex: 'created', key: 'created', render: (text, record) => { return ( {dayjs(text).fromNow()} ) } }, { title: '最后执行日期', dataIndex: 'updated', key: 'updated', render: (text, record) => { return ( {dayjs(text).fromNow()} ) } }, { title: '操作', key: 'action', render: (text, record, index) => { const menu = ( ); return (
) }, } ]; const selectedRowKeys = this.state.selectedRowKeys; const rowSelection = { selectedRowKeys: this.state.selectedRowKeys, onChange: (selectedRowKeys, selectedRows) => { this.setState({selectedRowKeys}); }, }; const hasSelected = selectedRowKeys.length > 0; return ( <> ]} subTitle="定时任务" >
任务列表
`总计 ${total} 条` }} loading={this.state.loading} /> { this.state.modalVisible ? : undefined } { this.state.logVisible ? { let result = await request.delete(`/jobs/${this.state.selectedRow['id']}/logs`); if (result['code'] === 1) { this.setState({ logVisible: false, selectedRow: undefined }) message.success('日志清空成功'); } else { message.error(result['message'], 10); } }} onCancel={() => { this.setState({ logVisible: false, selectedRow: undefined }) }} okText='清空' okType={'danger'} cancelText='取消' >
                                        {
                                            this.state.logs.map(item => {

                                                return <>{item['timestamp']}{item['message']};
                                            })
                                        }
                                    
: undefined } ); } } export default Job;