This commit is contained in:
dengqichen 2025-01-22 17:05:23 +08:00
parent 50e0d99712
commit 07b99aac31
15 changed files with 55 additions and 66 deletions

View File

@ -12,7 +12,6 @@ interface IconSelectProps {
} }
const IconSelect: React.FC<IconSelectProps> = ({ const IconSelect: React.FC<IconSelectProps> = ({
value,
onChange, onChange,
visible, visible,
onCancel onCancel

View File

@ -115,7 +115,6 @@ interface DataTablePaginationProps {
const DataTablePagination: React.FC<DataTablePaginationProps> = ({ const DataTablePagination: React.FC<DataTablePaginationProps> = ({
pageIndex, pageIndex,
pageSize,
pageCount, pageCount,
onPageChange, onPageChange,
}) => { }) => {

View File

@ -1,6 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import type {Page} from '@/types/base/page';
import type {RoleResponse, RoleRequest, RoleQuery, RoleTagResponse, RoleTagRequest, Permission} from './types'; import type {RoleResponse, RoleRequest, RoleQuery, RoleTagResponse, RoleTagRequest, Permission} from './types';
import {Page} from "@/types/base.ts";
const BASE_URL = '/api/v1/role'; const BASE_URL = '/api/v1/role';

View File

@ -1,6 +1,4 @@
import type { BaseResponse } from '@/types/base/response'; import {BaseQuery, BaseRequest, BaseResponse} from "@/types/base";
import {BaseRequest} from "@/types/base/request.ts";
import {BaseQuery} from "@/types/base";
// 权限类型枚举 // 权限类型枚举
export enum PermissionType { export enum PermissionType {

View File

@ -1,6 +1,7 @@
import request from '@/utils/request'; import request from '@/utils/request';
import type { Page } from '@/types/base/page';
import type { UserResponse, UserRequest, UserQuery } from './types'; import type { UserResponse, UserRequest, UserQuery } from './types';
import {Page} from "@/types/base.ts";
import {RoleResponse} from "@/pages/System/Role/types";
const BASE_URL = '/api/v1/user'; const BASE_URL = '/api/v1/user';
const ROLE_BASE_URL = '/api/v1/role'; const ROLE_BASE_URL = '/api/v1/role';

View File

@ -169,10 +169,6 @@ const NodeConfigDrawer: React.FC<NodeConfigDrawerProps> = ({
setLocalValues(prev => ({...prev, [key]: value})); setLocalValues(prev => ({...prev, [key]: value}));
}; };
const handleFormChange = (key: string, value: any) => {
setFormValues(prev => ({...prev, [key]: value}));
};
const items: TabsProps['items'] = [ const items: TabsProps['items'] = [
nodeDefinition?.panelVariablesSchema && { nodeDefinition?.panelVariablesSchema && {
key: 'panel', key: 'panel',

View File

@ -1271,7 +1271,6 @@ const WorkflowDesign: React.FC = () => {
}); });
const edges = graph.getEdges().map(edge => { const edges = graph.getEdges().map(edge => {
const sourceNode = graph.getCellById(edge.getSourceCellId());
const condition = edge.getProp('condition'); const condition = edge.getProp('condition');
const vertices = edge.getVertices(); // 获取边的顶点信息 const vertices = edge.getVertices(); // 获取边的顶点信息

View File

@ -140,7 +140,7 @@ const WorkflowDefinitionList: React.FC = () => {
key: 'category', key: 'category',
render: (category: string) => { render: (category: string) => {
const categoryInfo = categories.find(c => c.code === category); const categoryInfo = categories.find(c => c.code === category);
return categoryInfo?.lable || category; return categoryInfo?.label || category;
} }
}, },
{ {

View File

@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Modal, Table, Tag, Button, Space } from 'antd'; import { Modal, Table, Tag, Button } from 'antd';
import type { ColumnsType } from 'antd/es/table'; import type { ColumnsType } from 'antd/es/table';
import { WorkflowHistoricalInstance } from '../types'; import { WorkflowHistoricalInstance } from '../types';
import { getHistoricalInstances } from '../service'; import { getHistoricalInstances } from '../service';

View File

@ -9,7 +9,7 @@ import HistoryModal from './components/HistoryModal';
const WorkflowInstanceList: React.FC = () => { const WorkflowInstanceList: React.FC = () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [data, setData] = useState<Page<WorkflowTemplateWithInstances[]>>([]); const [data, setData] = useState<Page<WorkflowTemplateWithInstances[]>>(null);
const [query, setQuery] = useState({ const [query, setQuery] = useState({
current: 1, current: 1,
pageSize: 10, pageSize: 10,
@ -35,11 +35,6 @@ const WorkflowInstanceList: React.FC = () => {
loadData(query); loadData(query);
}, [query]); }, [query]);
const handleViewDetail = (record: WorkflowTemplateWithInstances) => {
setSelectedInstance(record);
setDetailVisible(true);
};
const handleViewHistory = (record: WorkflowTemplateWithInstances) => { const handleViewHistory = (record: WorkflowTemplateWithInstances) => {
setSelectedWorkflowDefinitionId(record.id); setSelectedWorkflowDefinitionId(record.id);
setHistoryVisible(true); setHistoryVisible(true);

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { Card, Row, Col, Statistic, Table, Tag, Space } from 'antd'; import {Card, Row, Col, Statistic, Table, Tag, Space} from 'antd';
import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip, Legend } from 'recharts'; import {PieChart, Pie, Cell, ResponsiveContainer, Tooltip, Legend} from 'recharts';
// Mock 数据 // Mock 数据
const mockStatistics = { const mockStatistics = {
@ -11,10 +11,10 @@ const mockStatistics = {
}; };
const mockStatusDistribution = [ const mockStatusDistribution = [
{ name: '运行中', value: 23, color: '#1890ff', percent: '1.8%' }, {name: '运行中', value: 23, color: '#1890ff', percent: '1.8%'},
{ name: '已完成', value: 892, color: '#52c41a', percent: '71.0%' }, {name: '已完成', value: 892, color: '#52c41a', percent: '71.0%'},
{ name: '失败', value: 45, color: '#ff4d4f', percent: '3.6%' }, {name: '失败', value: 45, color: '#ff4d4f', percent: '3.6%'},
{ name: '已终止', value: 296, color: '#faad14', percent: '23.6%' } {name: '已终止', value: 296, color: '#faad14', percent: '23.6%'}
]; ];
const mockRecentExecutions = [ const mockRecentExecutions = [
@ -47,12 +47,12 @@ const mockRecentExecutions = [
const WorkflowMonitor: React.FC = () => { const WorkflowMonitor: React.FC = () => {
const getStatusTag = (status: string) => { const getStatusTag = (status: string) => {
const statusMap: Record<string, { color: string; text: string }> = { const statusMap: Record<string, { color: string; text: string }> = {
COMPLETED: { color: 'success', text: '已完成' }, COMPLETED: {color: 'success', text: '已完成'},
RUNNING: { color: 'processing', text: '运行中' }, RUNNING: {color: 'processing', text: '运行中'},
FAILED: { color: 'error', text: '失败' }, FAILED: {color: 'error', text: '失败'},
TERMINATED: { color: 'warning', text: '已终止' } TERMINATED: {color: 'warning', text: '已终止'}
}; };
const statusInfo = statusMap[status] || { color: 'default', text: status }; const statusInfo = statusMap[status] || {color: 'default', text: status};
return <Tag color={statusInfo.color}>{statusInfo.text}</Tag>; return <Tag color={statusInfo.color}>{statusInfo.text}</Tag>;
}; };
@ -81,7 +81,7 @@ const WorkflowMonitor: React.FC = () => {
{ {
title: '操作', title: '操作',
key: 'action', key: 'action',
render: (_, record: any) => ( render: (record: any) => (
<Space size="middle"> <Space size="middle">
<a onClick={() => console.log('查看详情', record)}></a> <a onClick={() => console.log('查看详情', record)}></a>
{record.status === 'RUNNING' && ( {record.status === 'RUNNING' && (
@ -92,7 +92,7 @@ const WorkflowMonitor: React.FC = () => {
} }
]; ];
const CustomTooltip = ({ active, payload }: any) => { const CustomTooltip = ({active, payload}: any) => {
if (active && payload && payload.length) { if (active && payload && payload.length) {
const data = payload[0].payload; const data = payload[0].payload;
return ( return (
@ -115,7 +115,7 @@ const WorkflowMonitor: React.FC = () => {
<Statistic <Statistic
title="总流程实例" title="总流程实例"
value={mockStatistics.totalInstances} value={mockStatistics.totalInstances}
valueStyle={{ color: '#1890ff' }} valueStyle={{color: '#1890ff'}}
/> />
</Card> </Card>
</Col> </Col>
@ -124,7 +124,7 @@ const WorkflowMonitor: React.FC = () => {
<Statistic <Statistic
title="运行中实例" title="运行中实例"
value={mockStatistics.runningInstances} value={mockStatistics.runningInstances}
valueStyle={{ color: '#52c41a' }} valueStyle={{color: '#52c41a'}}
/> />
</Card> </Card>
</Col> </Col>
@ -133,7 +133,7 @@ const WorkflowMonitor: React.FC = () => {
<Statistic <Statistic
title="今日完成" title="今日完成"
value={mockStatistics.completedToday} value={mockStatistics.completedToday}
valueStyle={{ color: '#1890ff' }} valueStyle={{color: '#1890ff'}}
/> />
</Card> </Card>
</Col> </Col>
@ -142,7 +142,7 @@ const WorkflowMonitor: React.FC = () => {
<Statistic <Statistic
title="今日失败" title="今日失败"
value={mockStatistics.failedToday} value={mockStatistics.failedToday}
valueStyle={{ color: '#ff4d4f' }} valueStyle={{color: '#ff4d4f'}}
/> />
</Card> </Card>
</Col> </Col>
@ -152,7 +152,7 @@ const WorkflowMonitor: React.FC = () => {
<Row gutter={16}> <Row gutter={16}>
<Col span={8}> <Col span={8}>
<Card title="状态分布"> <Card title="状态分布">
<div style={{ height: 300 }}> <div style={{height: 300}}>
<ResponsiveContainer width="100%" height="100%"> <ResponsiveContainer width="100%" height="100%">
<PieChart> <PieChart>
<Pie <Pie
@ -163,15 +163,15 @@ const WorkflowMonitor: React.FC = () => {
outerRadius={80} outerRadius={80}
paddingAngle={5} paddingAngle={5}
dataKey="value" dataKey="value"
label={({ name, percent }) => `${name} ${(percent * 100).toFixed(1)}%`} label={({name, percent}) => `${name} ${(percent * 100).toFixed(1)}%`}
labelLine={true} labelLine={true}
> >
{mockStatusDistribution.map((entry, index) => ( {mockStatusDistribution.map((entry, index) => (
<Cell key={index} fill={entry.color} /> <Cell key={index} fill={entry.color}/>
))} ))}
</Pie> </Pie>
<Tooltip content={<CustomTooltip />} /> <Tooltip content={<CustomTooltip/>}/>
<Legend /> <Legend/>
</PieChart> </PieChart>
</ResponsiveContainer> </ResponsiveContainer>
</div> </div>

View File

@ -1,6 +1,6 @@
import React, {useState, useEffect} from 'react'; import React, {useState, useEffect} from 'react';
import {PageContainer} from '@ant-design/pro-layout'; import {PageContainer} from '@ant-design/pro-layout';
import {Button, Card, Form, Input, InputNumber, Select, Switch, Space, Menu, Tabs, Row, Col, message, ColorPicker} from 'antd'; import {Button, Card, Form, Input, InputNumber, Select, Switch, Tabs, Row, Col, message, ColorPicker} from 'antd';
import type {NodeDesignDataResponse} from './types'; import type {NodeDesignDataResponse} from './types';
import * as service from './service'; import * as service from './service';
import {useParams} from 'react-router-dom'; import {useParams} from 'react-router-dom';

View File

@ -1,8 +1,8 @@
import React, { useState, useEffect } from 'react'; import React, {useState, useEffect} from 'react';
import { useNavigate } from 'react-router-dom'; import {useNavigate} from 'react-router-dom';
import { PageContainer } from '@/components/ui/page-container'; import {PageContainer} from '@/components/ui/page-container';
import { PlusOutlined, DeleteOutlined } from '@ant-design/icons'; import {PlusOutlined, DeleteOutlined} from '@ant-design/icons';
import { NodeTypeEnum, type NodeDesignDataResponse } from './types'; import {NodeTypeEnum, type NodeDesignDataResponse} from './types';
import * as service from './service'; import * as service from './service';
import { import {
Table, Table,
@ -18,9 +18,9 @@ import {
CardHeader, CardHeader,
CardTitle, CardTitle,
} from "@/components/ui/card"; } from "@/components/ui/card";
import { Button } from "@/components/ui/button"; import {Button} from "@/components/ui/button";
import { Badge } from "@/components/ui/badge"; import {Badge} from "@/components/ui/badge";
import { useToast } from "@/components/ui/use-toast"; import {useToast} from "@/components/ui/use-toast";
import { import {
AlertDialog, AlertDialog,
AlertDialogAction, AlertDialogAction,
@ -32,7 +32,7 @@ import {
AlertDialogTitle, AlertDialogTitle,
AlertDialogTrigger, AlertDialogTrigger,
} from "@/components/ui/alert-dialog"; } from "@/components/ui/alert-dialog";
import { DataTablePagination } from "@/components/ui/pagination"; import {DataTablePagination} from "@/components/ui/pagination";
// 节点类型标签样式映射 // 节点类型标签样式映射
const nodeTypeStyles = { const nodeTypeStyles = {
@ -63,19 +63,19 @@ const NodeDesignList: React.FC = () => {
const [detailVisible, setDetailVisible] = useState(false); const [detailVisible, setDetailVisible] = useState(false);
const [currentNode, setCurrentNode] = useState<NodeDesignDataResponse>(); const [currentNode, setCurrentNode] = useState<NodeDesignDataResponse>();
const [list, setList] = useState<NodeDesignDataResponse[]>([]); const [list, setList] = useState<NodeDesignDataResponse[]>([]);
const [loading, setLoading] = useState(false); const [setLoading] = useState(false);
const [pagination, setPagination] = useState({ const [pagination, setPagination] = useState({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
totalElements: 0, totalElements: 0,
}); });
const { toast } = useToast(); const {toast} = useToast();
const loadData = async () => { const loadData = async () => {
setLoading(true); setLoading(true);
try { try {
const response = await service.getNodeDefinitions({ const response = await service.getNodeDefinitions({
current: pagination.pageNum, pageNum: pagination.pageNum,
pageSize: pagination.pageSize, pageSize: pagination.pageSize,
}); });
setList(response.content || []); setList(response.content || []);
@ -127,7 +127,7 @@ const NodeDesignList: React.FC = () => {
accessorKey: 'nodeCode', accessorKey: 'nodeCode',
header: '节点编码', header: '节点编码',
size: 180, size: 180,
cell: ({ row }) => ( cell: ({row}) => (
<div className="font-medium">{row.original.nodeCode}</div> <div className="font-medium">{row.original.nodeCode}</div>
), ),
}, },
@ -140,7 +140,7 @@ const NodeDesignList: React.FC = () => {
accessorKey: 'nodeType', accessorKey: 'nodeType',
header: '节点类型', header: '节点类型',
size: 120, size: 120,
cell: ({ row }) => { cell: ({row}) => {
const style = nodeTypeStyles[row.original.nodeType as NodeTypeEnum] || { const style = nodeTypeStyles[row.original.nodeType as NodeTypeEnum] || {
variant: 'secondary' as const, variant: 'secondary' as const,
label: row.original.nodeType || '未知类型' label: row.original.nodeType || '未知类型'
@ -156,7 +156,7 @@ const NodeDesignList: React.FC = () => {
accessorKey: 'panelVariablesSchema', accessorKey: 'panelVariablesSchema',
header: '面板变量', header: '面板变量',
size: 100, size: 100,
cell: ({ row }) => ( cell: ({row}) => (
<Badge variant={row.original.panelVariablesSchema ? "outline" : "secondary"}> <Badge variant={row.original.panelVariablesSchema ? "outline" : "secondary"}>
{row.original.panelVariablesSchema ? '已配置' : '未配置'} {row.original.panelVariablesSchema ? '已配置' : '未配置'}
</Badge> </Badge>
@ -166,7 +166,7 @@ const NodeDesignList: React.FC = () => {
accessorKey: 'localVariablesSchema', accessorKey: 'localVariablesSchema',
header: '本地变量', header: '本地变量',
size: 100, size: 100,
cell: ({ row }) => ( cell: ({row}) => (
<Badge variant={row.original.localVariablesSchema ? "outline" : "secondary"}> <Badge variant={row.original.localVariablesSchema ? "outline" : "secondary"}>
{row.original.localVariablesSchema ? '已配置' : '未配置'} {row.original.localVariablesSchema ? '已配置' : '未配置'}
</Badge> </Badge>
@ -176,7 +176,7 @@ const NodeDesignList: React.FC = () => {
accessorKey: 'formVariablesSchema', accessorKey: 'formVariablesSchema',
header: '表单变量', header: '表单变量',
size: 100, size: 100,
cell: ({ row }) => ( cell: ({row}) => (
<Badge variant={row.original.formVariablesSchema ? "outline" : "secondary"}> <Badge variant={row.original.formVariablesSchema ? "outline" : "secondary"}>
{row.original.formVariablesSchema ? '已配置' : '未配置'} {row.original.formVariablesSchema ? '已配置' : '未配置'}
</Badge> </Badge>
@ -186,7 +186,7 @@ const NodeDesignList: React.FC = () => {
id: 'actions', id: 'actions',
header: '操作', header: '操作',
size: 180, size: 180,
cell: ({ row }) => ( cell: ({row}) => (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Button <Button
variant="ghost" variant="ghost"
@ -212,7 +212,7 @@ const NodeDesignList: React.FC = () => {
size="sm" size="sm"
className="text-destructive" className="text-destructive"
> >
<DeleteOutlined className="mr-1" /> <DeleteOutlined className="mr-1"/>
</Button> </Button>
</AlertDialogTrigger> </AlertDialogTrigger>
@ -244,7 +244,7 @@ const NodeDesignList: React.FC = () => {
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h2 className="text-3xl font-bold tracking-tight"></h2> <h2 className="text-3xl font-bold tracking-tight"></h2>
<Button onClick={() => navigate('/workflow/node-design/create')}> <Button onClick={() => navigate('/workflow/node-design/create')}>
<PlusOutlined className="mr-1" /> <PlusOutlined className="mr-1"/>
</Button> </Button>
</div> </div>
@ -261,7 +261,7 @@ const NodeDesignList: React.FC = () => {
{columns.map((column) => ( {columns.map((column) => (
<TableHead <TableHead
key={column.accessorKey || column.id} key={column.accessorKey || column.id}
style={{ width: column.size }} style={{width: column.size}}
> >
{column.header} {column.header}
</TableHead> </TableHead>
@ -276,7 +276,7 @@ const NodeDesignList: React.FC = () => {
key={column.accessorKey || column.id} key={column.accessorKey || column.id}
> >
{column.cell {column.cell
? column.cell({ row: { original: item } }) ? column.cell({row: {original: item}})
: item[column.accessorKey!]} : item[column.accessorKey!]}
</TableCell> </TableCell>
))} ))}

View File

@ -79,6 +79,7 @@ export interface NodeDesignDataResponse extends BaseResponse {
description: string; description: string;
panelVariablesSchema: NodeVariablesSchema | null; panelVariablesSchema: NodeVariablesSchema | null;
localVariablesSchema: NodeVariablesSchema | null; localVariablesSchema: NodeVariablesSchema | null;
formVariablesSchema: NodeVariablesSchema | null;
uiVariables: UIVariables; uiVariables: UIVariables;
} }

View File

@ -24,7 +24,8 @@
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": ["./src/*"]
} },
"allowSyntheticDefaultImports": true
}, },
"include": ["src"], "include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }] "references": [{ "path": "./tsconfig.node.json" }]