import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Button, Card, Tag, List, Divider, } from 'antd'; import { ClockCircleOutlined, CloseCircleOutlined, FieldTimeOutlined, Loading3QuartersOutlined, FileOutlined, } from '@ant-design/icons'; import { CrontabStatus } from './index'; import { diffTime } from '@/utils/date'; import { request } from '@/utils/http'; import config from '@/utils/config'; import CronLogModal from './logModal'; import Editor from '@monaco-editor/react'; const tabList = [ { key: 'log', tab: '日志', }, { key: 'script', tab: '脚本', }, ]; interface LogItem { directory: string; filename: string; } const language = navigator.language || navigator.languages[0]; const CronDetailModal = ({ cron = {}, handleCancel, visible, theme, }: { cron?: any; visible: boolean; handleCancel: (needUpdate?: boolean) => void; theme: string; }) => { const [activeTabKey, setActiveTabKey] = useState('log'); const [loading, setLoading] = useState(true); const [logs, setLogs] = useState([]); const [log, setLog] = useState(''); const [value, setValue] = useState(''); const [isLogModalVisible, setIsLogModalVisible] = useState(false); const contentList: any = { log: ( ( onClickItem(item)}> {item.directory}/{item.filename} )} /> ), script: ( ), }; const onClickItem = (item: LogItem) => { request .get(`${config.apiPrefix}logs/${item.directory}/${item.filename}`) .then((data) => { setLog(data.data); setIsLogModalVisible(true); }); }; const onTabChange = (key: string) => { setActiveTabKey(key); }; const getLogs = () => { setLoading(true); request .get(`${config.apiPrefix}crons/${cron.id}/logs`) .then((data: any) => { if (data.code === 200) { setLogs(data.data); } }) .finally(() => setLoading(false)); }; const getScript = () => { const cmd = cron.command.split(' ') as string[]; if (cmd[0] === 'task') { if (cmd[1].startsWith('/ql/data/scripts')) { cmd[1] = cmd[1].replace('/ql/data/scripts/', ''); } let [p, s] = cmd[1].split('/'); if (!s) { s = p; p = ''; } request .get(`${config.apiPrefix}scripts/${s}?path=${p || ''}`) .then((data) => { setValue(data.data); }); } }; useEffect(() => { if (cron && cron.id) { getLogs(); getScript(); } }, [cron]); return ( {cron.name} {cron.labels?.length > 0 && cron.labels[0] !== '' && cron.labels?.map((label: string, i: number) => ( {label} ))} } centered visible={visible} forceRender footer={false} onCancel={() => handleCancel()} width={'80vw'} bodyStyle={{ background: '#eee', padding: 12 }} >
状态
{(!cron.isDisabled || cron.status !== CrontabStatus.idle) && ( <> {cron.status === CrontabStatus.idle && ( } color="default"> 空闲中 )} {cron.status === CrontabStatus.running && ( } color="processing" > 运行中 )} {cron.status === CrontabStatus.queued && ( } color="default"> 队列中 )} )} {cron.isDisabled === 1 && cron.status === CrontabStatus.idle && ( } color="error"> 已禁用 )}
任务
{cron.command}
定时
{cron.schedule}
最后运行时间
{cron.last_execution_time ? new Date(cron.last_execution_time * 1000) .toLocaleString(language, { hour12: false, }) .replace(' 24:', ' 00:') : '-'}
最后运行时长
{cron.last_running_time ? diffTime(cron.last_running_time) : '-'}
下次运行时间
{cron.nextRunTime && cron.nextRunTime .toLocaleString(language, { hour12: false, }) .replace(' 24:', ' 00:')}
{ onTabChange(key); }} > {contentList[activeTabKey]}
{ setIsLogModalVisible(false); }} cron={cron} data={log} />
); }; export default CronDetailModal;