import React, { useState, useEffect } from 'react'; import { Table, Card, Button, Space, Tag, message, Modal } from 'antd'; import { PlusOutlined, ExclamationCircleOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import * as service from './service'; import type { WorkflowDefinition, WorkflowDefinitionQuery, WorkflowCategory } from './types'; import { DEFAULT_PAGE_SIZE, DEFAULT_CURRENT } from '@/utils/page'; import EditModal from './components/EditModal'; const { confirm } = Modal; const WorkflowDefinitionList: React.FC = () => { const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [pageData, setPageData] = useState<{ content: WorkflowDefinition[]; totalElements: number; size: number; number: number; } | null>(null); const [modalVisible, setModalVisible] = useState(false); const [currentRecord, setCurrentRecord] = useState(); const [categories, setCategories] = useState([]); const [query, setQuery] = useState({ pageNum: DEFAULT_CURRENT - 1, pageSize: DEFAULT_PAGE_SIZE }); const loadData = async (params: WorkflowDefinitionQuery) => { setLoading(true); try { const data = await service.getDefinitions(params); setPageData(data); } catch (error) { if (error instanceof Error) { message.error(error.message); } } finally { setLoading(false); } }; const loadCategories = async () => { try { const data = await service.getWorkflowCategories(); setCategories(data); } catch (error) { console.error('加载工作流分类失败:', error); message.error('加载工作流分类失败'); } }; useEffect(() => { loadData(query); loadCategories(); }, [query]); const handleCreateFlow = () => { setCurrentRecord(undefined); setModalVisible(true); }; const handleEditFlow = (record: WorkflowDefinition) => { setCurrentRecord(record); setModalVisible(true); }; const handleDesignFlow = (record: WorkflowDefinition) => { // 新的React Flow设计器路径 navigate(`/workflow2/design/${record.id}`); }; const handleModalClose = () => { setModalVisible(false); setCurrentRecord(undefined); }; const handleDeploy = async (id: number) => { confirm({ title: '确认发布', icon: , content: '确定要发布该流程定义吗?发布后将不能修改。', onOk: async () => { try { await service.publishDefinition(id); message.success('发布成功'); loadData(query); } catch (error) { if (error instanceof Error) { message.error(error.message); } } }, }); }; const handleDelete = async (id: number) => { confirm({ title: '确认删除', icon: , content: '确定要删除该流程定义吗?删除后不可恢复。', onOk: async () => { try { await service.deleteDefinition(id); message.success('删除成功'); loadData(query); } catch (error) { if (error instanceof Error) { message.error(error.message); } } }, }); }; const handleStartFlow = async (record: WorkflowDefinition) => { try { await service.startWorkflowInstance(record.key, record.category); message.success('流程启动成功'); } catch (error) { if (error instanceof Error) { message.error(error.message); } } }; const columns = [ { title: '流程名称', dataIndex: 'name', key: 'name', }, { title: '流程标识', dataIndex: 'key', key: 'key', }, { title: '流程分类', dataIndex: 'category', key: 'category', render: (category: string) => { const categoryInfo = categories.find(c => c.code === category); return categoryInfo?.label || category; } }, { title: '触发方式', dataIndex: 'triggers', key: 'triggers', render: (triggers: string[], record: WorkflowDefinition) => { const categoryInfo = categories.find(c => c.code === record.category); return (triggers || [])?.map(triggerCode => { const triggerInfo = categoryInfo?.supportedTriggers?.find(t => t.code === triggerCode); return ( {triggerInfo?.label || triggerCode} ); }); } }, { title: '版本', dataIndex: 'flowVersion', key: 'flowVersion', }, { title: '状态', dataIndex: 'status', key: 'status', render: (status: string) => ( {status === 'DRAFT' ? '草稿' : '已发布'} ), }, { title: '描述', dataIndex: 'description', key: 'description', ellipsis: true, }, { title: '操作', key: 'action', fixed: 'right' as const, width: 220, render: (_: any, record: WorkflowDefinition) => ( {record.status === 'DRAFT' && ( <> handleEditFlow(record)}>编辑 handleDesignFlow(record)}>设计(React Flow) )} {record.status === 'DRAFT' && ( handleDeploy(record.id)}>发布 )} handleDelete(record.id)}>删除 {record.status !== 'DRAFT' && ( handleStartFlow(record)}>启动 )} ), }, ]; return ( 工作流定义管理 (React Flow版本) } > setQuery({ ...query, pageNum: page - 1, pageSize }), }} /> loadData(query)} record={currentRecord} /> ); }; export default WorkflowDefinitionList;