diff --git a/ui/src/components/workflow/node/ConditionNode.tsx b/ui/src/components/workflow/node/ConditionNode.tsx index 69dc101d..60a35c26 100644 --- a/ui/src/components/workflow/node/ConditionNode.tsx +++ b/ui/src/components/workflow/node/ConditionNode.tsx @@ -5,7 +5,7 @@ import { Button, Card, Popover } from "antd"; import SharedNode, { type SharedNodeProps } from "./_SharedNode"; import AddNode from "./AddNode"; import ConditionNodeConfigForm, { ConditionItem, ConditionNodeConfigFormFieldValues, ConditionNodeConfigFormInstance } from "./ConditionNodeConfigForm"; -import { Expr, WorkflowNodeConfigForCondition } from "@/domain/workflow"; +import { Expr, WorkflowNodeConfigForCondition, WorkflowNodeIoValueType } from "@/domain/workflow"; import { produce } from "immer"; import { useWorkflowStore } from "@/stores/workflow"; import { useZustandShallowSelector } from "@/hooks"; @@ -29,7 +29,15 @@ const ConditionNode = ({ node, disabled, branchId, branchIndex }: ConditionNodeP const formToExpression = (values: ConditionNodeConfigFormFieldValues): Expr => { // 创建单个条件的表达式 const createComparisonExpr = (condition: ConditionItem): Expr => { - const left: Expr = { type: "var", selector: condition.leftSelector }; + const selectors = condition.leftSelector.split("#"); + const left: Expr = { + type: "var", + selector: { + id: selectors[0], + name: selectors[1], + type: selectors[2] as WorkflowNodeIoValueType, + }, + }; const right: Expr = { type: "const", value: condition.rightValue || "" }; return { diff --git a/ui/src/components/workflow/node/ConditionNodeConfigForm.tsx b/ui/src/components/workflow/node/ConditionNodeConfigForm.tsx index 52f2c3e2..b041ea7c 100644 --- a/ui/src/components/workflow/node/ConditionNodeConfigForm.tsx +++ b/ui/src/components/workflow/node/ConditionNodeConfigForm.tsx @@ -1,5 +1,5 @@ import { forwardRef, memo, useEffect, useImperativeHandle, useState } from "react"; -import { Button, Card, Form, Input, Select, Space, Radio } from "antd"; +import { Button, Card, Form, Input, Select, Space, Radio, DatePicker } from "antd"; import { PlusOutlined, DeleteOutlined } from "@ant-design/icons"; import { @@ -12,6 +12,7 @@ import { isVarExpr, WorkflowNode, workflowNodeIOOptions, + WorkflowNodeIoValueType, } from "@/domain/workflow"; import { FormInstance } from "antd"; import { useZustandShallowSelector } from "@/hooks"; @@ -19,7 +20,7 @@ import { useWorkflowStore } from "@/stores/workflow"; // 表单内部使用的扁平结构 - 修改后只保留必要字段 export interface ConditionItem { - leftSelector: WorkflowNodeIOValueSelector; + leftSelector: string; operator: ComparisonOperator; rightValue: string; } @@ -50,7 +51,7 @@ const initFormModel = (): ConditionNodeConfigFormFieldValues => { return { conditions: [ { - leftSelector: undefined as unknown as WorkflowNodeIOValueSelector, + leftSelector: "", operator: "==", rightValue: "", }, @@ -71,7 +72,7 @@ const expressionToForm = (expr?: Expr): ConditionNodeConfigFormFieldValues => { // 确保左侧是变量,右侧是常量 if (isVarExpr(expr.left) && isConstExpr(expr.right)) { conditions.push({ - leftSelector: expr.left.selector, + leftSelector: `${expr.left.selector.id}#${expr.left.selector.name}#${expr.left.selector.type}`, operator: expr.op, rightValue: String(expr.right.value), }); @@ -91,6 +92,38 @@ const expressionToForm = (expr?: Expr): ConditionNodeConfigFormFieldValues => { }; }; +// 根据变量类型获取适当的操作符选项 +const getOperatorsByType = (type: string): { value: ComparisonOperator; label: string }[] => { + switch (type) { + case "number": + case "string": + return [ + { value: "==", label: "等于 (==)" }, + { value: "!=", label: "不等于 (!=)" }, + { value: ">", label: "大于 (>)" }, + { value: ">=", label: "大于等于 (>=)" }, + { value: "<", label: "小于 (<)" }, + { value: "<=", label: "小于等于 (<=)" }, + ]; + case "boolean": + return [{ value: "is", label: "为" }]; + default: + return []; + } +}; + +// 从选择器字符串中提取变量类型 +const getVariableTypeFromSelector = (selector: string): string => { + if (!selector) return "string"; + + // 假设选择器格式为 "id#name#type" + const parts = selector.split("#"); + if (parts.length >= 3) { + return parts[2].toLowerCase() || "string"; + } + return "string"; +}; + const ConditionNodeConfigForm = forwardRef( ({ className, style, disabled, initialValues, onValuesChange, nodeId }, ref) => { const { getWorkflowOuptutBeforeId } = useWorkflowStore(useZustandShallowSelector(["updateNode", "getWorkflowOuptutBeforeId"])); @@ -127,6 +160,12 @@ const ConditionNodeConfigForm = forwardRef { setFormModel(values); + + if (onValuesChange) { + // 将表单值转换为表达式 + const expression = formToExpression(values); + onValuesChange({ expression }); + } }; return ( @@ -141,7 +180,6 @@ const ConditionNodeConfigForm = forwardRef 1 ?