/* === Batch Task Management Page === */ function PageOperationBatch() { const [activeTab, setActiveTab] = React.useState("trigger"); const tabs = [ { id: "trigger", label: "触发管理" }, { id: "taskGroup", label: "任务定义" }, { id: "monitor", label: "执行监控" }, { id: "logs", label: "任务日志" } ]; return (
{tabs.map(tab => ( ))}
{activeTab === "trigger" && } {activeTab === "taskGroup" && } {activeTab === "monitor" && } {activeTab === "logs" && }
); } // 触发器管理组件 function TriggerManagement() { const [triggers, setTriggers] = React.useState([]); const [searchParams, setSearchParams] = React.useState({ triggerName: "", status: "" }); const [showModal, setShowModal] = React.useState(false); const [editingTrigger, setEditingTrigger] = React.useState(null); const [taskGroups, setTaskGroups] = React.useState([]); const fetchTriggers = async () => { try { const params = new URLSearchParams(); if (searchParams.triggerName) params.append('trigger_name', searchParams.triggerName); if (searchParams.status !== "") params.append('status', searchParams.status); const data = await window.apiFetch(`/api/rule/trigger/list?${params}`); setTriggers(Array.isArray(data) ? data : (data.items || [])); } catch (error) { console.error('获取触发器列表失败:', error); } }; const fetchTaskGroups = async () => { try { const data = await window.apiFetch('/api/rule/taskGroup/list'); setTaskGroups(Array.isArray(data) ? data : (data.items || [])); } catch (error) { console.error('获取任务组列表失败:', error); } }; React.useEffect(() => { fetchTriggers(); fetchTaskGroups(); }, []); const handleAdd = () => { setEditingTrigger(null); setShowModal(true); }; const handleEdit = (trigger) => { setEditingTrigger(trigger); setShowModal(true); }; const handleDelete = async (id) => { if (!confirm('确定要删除该触发器吗?')) return; try { await window.apiFetch(`/api/rule/trigger/delete?id=${id}`, { method: 'DELETE' }); fetchTriggers(); } catch (error) { alert('删除失败: ' + error.message); } }; const handleExecute = async (id) => { if (!confirm('确定要立即执行该触发器吗?')) return; try { await window.apiFetch(`/api/rule/trigger/execute?id=${id}`, { method: 'POST' }); alert('执行已启动'); } catch (error) { alert('执行失败: ' + error.message); } }; const handleToggle = async (id, status) => { try { await window.apiFetch(`/api/rule/trigger/toggle?id=${id}&status=${status}`, { method: 'POST' }); fetchTriggers(); } catch (error) { alert('操作失败: ' + error.message); } }; const handleSave = async (formData) => { try { if (editingTrigger) { await window.apiFetch('/api/rule/trigger/update', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...formData, id: editingTrigger.id }) }); } else { await window.apiFetch('/api/rule/trigger/add', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); } setShowModal(false); fetchTriggers(); } catch (error) { alert('保存失败: ' + error.message); } }; const getTaskGroupName = (groupId) => { const group = taskGroups.find(g => g.id === groupId); return group ? group.group_name : '-'; }; const statusText = { 1: '启用', 0: '禁用' }; const typeText = { CRON: '定时', MANUAL: '手动', API: 'API', EVENT: '事件' }; return (
setSearchParams({ ...searchParams, triggerName: e.target.value })} placeholder="请输入触发器名称" style={{ width: 160 }} />
{triggers.map(trigger => ( ))}
触发器编码 触发器名称 类型 CRON表达式 绑定任务组 状态 创建时间 操作
{trigger.trigger_code} {trigger.trigger_name} {typeText[trigger.trigger_type] || trigger.trigger_type} {trigger.cron_expr || '-'} {getTaskGroupName(trigger.task_group_id)} {statusText[trigger.status]} {trigger.create_time?.split('T')[0]}
{trigger.status === 1 && ( )}
{showModal && ( setShowModal(false)} onSave={handleSave} /> )}
); } // 触发器弹窗组件 function TriggerModal({ trigger, taskGroups, onClose, onSave }) { const [formData, setFormData] = React.useState({ trigger_code: "", trigger_name: "", trigger_type: "CRON", cron_expr: "", task_group_id: "", status: 1, remark: "" }); React.useEffect(() => { if (trigger) { setFormData({ trigger_code: trigger.trigger_code, trigger_name: trigger.trigger_name, trigger_type: trigger.trigger_type, cron_expr: trigger.cron_expr || "", task_group_id: trigger.task_group_id, status: trigger.status, remark: trigger.remark || "" }); } }, [trigger]); const handleSubmit = (e) => { e.preventDefault(); onSave(formData); }; return (
e.stopPropagation()}>
{trigger ? '编辑触发器' : '新增触发器'}
基本信息
setFormData({ ...formData, trigger_code: e.target.value })} required disabled={!!trigger} />
setFormData({ ...formData, trigger_name: e.target.value })} required />
setFormData({ ...formData, cron_expr: e.target.value })} placeholder="0 30 18 * * ?" disabled={formData.trigger_type !== 'CRON'} />
关联配置
备注信息