feat(web): 增加判断节点对不同类型的适配和处理
This commit is contained in:
@@ -100,6 +100,24 @@ export const generateAllIncomerOutputVariablesFormOptions: (id: string, inputSch
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ConditionOperator = string | { label: string, value: string }
|
||||||
|
const textOperators: ConditionOperator[] = ['equal', 'not_equal', 'is_empty', 'is_not_empty', 'like', 'not_like', 'starts_with', 'ends_with']
|
||||||
|
const textDefaultOperator: string = 'equal'
|
||||||
|
const booleanOperators: ConditionOperator[] = [
|
||||||
|
{label: '为真', value: 'is_true'},
|
||||||
|
{label: '为假', value: 'is_false'},
|
||||||
|
]
|
||||||
|
const booleanDefaultOperator: string = 'is_true'
|
||||||
|
const numberOperators: ConditionOperator[] = [
|
||||||
|
'equal',
|
||||||
|
'not_equal',
|
||||||
|
{label: '大于', value: 'greater'},
|
||||||
|
{label: '大于或等于', value: 'greater_equal'},
|
||||||
|
{label: '小于', value: 'less'},
|
||||||
|
{label: '小于或等于', value: 'less_equal'},
|
||||||
|
]
|
||||||
|
const numberDefaultOperator: string = 'equal'
|
||||||
|
|
||||||
export const generateAllIncomerOutputVariablesConditions: (id: string, inputSchema: Record<string, Record<string, any>>, nodes: Node[], edges: Edge[], data: any) => Option[] = (id, inputSchema, nodes, edges, data) => {
|
export const generateAllIncomerOutputVariablesConditions: (id: string, inputSchema: Record<string, Record<string, any>>, nodes: Node[], edges: Edge[], data: any) => Option[] = (id, inputSchema, nodes, edges, data) => {
|
||||||
let optionMap: Record<string, Option[]> = {}
|
let optionMap: Record<string, Option[]> = {}
|
||||||
for (const item of getAllIncomerNodeOutputVariables(id, inputSchema, nodes, edges, data)) {
|
for (const item of getAllIncomerNodeOutputVariables(id, inputSchema, nodes, edges, data)) {
|
||||||
@@ -108,8 +126,34 @@ export const generateAllIncomerOutputVariablesConditions: (id: string, inputSche
|
|||||||
}
|
}
|
||||||
optionMap[item.group].push({
|
optionMap[item.group].push({
|
||||||
label: item.name,
|
label: item.name,
|
||||||
type: item.type,
|
type: 'custom',
|
||||||
name: item.variable,
|
name: item.variable,
|
||||||
|
...(item.type === 'text' ? {
|
||||||
|
value: {
|
||||||
|
type: 'input-text',
|
||||||
|
required: true,
|
||||||
|
clearable: true,
|
||||||
|
},
|
||||||
|
defaultOp: textDefaultOperator,
|
||||||
|
operators: textOperators,
|
||||||
|
} : {}),
|
||||||
|
...(item.type === 'boolean' ? {
|
||||||
|
value: {
|
||||||
|
type: 'wrapper',
|
||||||
|
size: 'none',
|
||||||
|
},
|
||||||
|
defaultOp: booleanDefaultOperator,
|
||||||
|
operators: booleanOperators,
|
||||||
|
} : {}),
|
||||||
|
...(item.type === 'number' ? {
|
||||||
|
value: {
|
||||||
|
type: 'input-number',
|
||||||
|
required: true,
|
||||||
|
clearable: true,
|
||||||
|
},
|
||||||
|
defaultOp: numberDefaultOperator,
|
||||||
|
operators: numberOperators,
|
||||||
|
} : {}),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return Object.keys(optionMap)
|
return Object.keys(optionMap)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import type {NodeProps} from '@xyflow/react'
|
import type {NodeProps} from '@xyflow/react'
|
||||||
import {Tag} from 'antd'
|
import {Tag} from 'antd'
|
||||||
import React, {useCallback, useEffect} from 'react'
|
import React, {useCallback} from 'react'
|
||||||
import {useContextStore} from '../store/ContextStore.ts'
|
import {useContextStore} from '../store/ContextStore.ts'
|
||||||
import {useDataStore} from '../store/DataStore.ts'
|
import {useDataStore} from '../store/DataStore.ts'
|
||||||
import {useFlowStore} from '../store/FlowStore.ts'
|
import {useFlowStore} from '../store/FlowStore.ts'
|
||||||
@@ -14,24 +14,11 @@ const languageMap: Record<string, string> = {
|
|||||||
|
|
||||||
const CodeNode = (props: NodeProps) => {
|
const CodeNode = (props: NodeProps) => {
|
||||||
const {getNodes, getEdges} = useFlowStore()
|
const {getNodes, getEdges} = useFlowStore()
|
||||||
const {getData, mergeDataById, getDataById} = useDataStore()
|
const {getData, getDataById} = useDataStore()
|
||||||
const {getInputSchema} = useContextStore()
|
const {getInputSchema} = useContextStore()
|
||||||
|
|
||||||
const nodeData = getDataById(props.id)
|
const nodeData = getDataById(props.id)
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
mergeDataById(
|
|
||||||
props.id,
|
|
||||||
{
|
|
||||||
outputs: {
|
|
||||||
result: {
|
|
||||||
type: 'string',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}, [props.id])
|
|
||||||
|
|
||||||
const columnsSchema = useCallback(() => [
|
const columnsSchema = useCallback(() => [
|
||||||
...inputsFormColumns(props.id, getInputSchema(), getNodes(), getEdges(), getData()),
|
...inputsFormColumns(props.id, getInputSchema(), getNodes(), getEdges(), getData()),
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ const LlmNode = (props: NodeProps) => {
|
|||||||
{
|
{
|
||||||
outputs: {
|
outputs: {
|
||||||
text: {
|
text: {
|
||||||
type: 'string',
|
type: 'text',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -25,10 +25,18 @@ const SwitchNode = (props: NodeProps) => {
|
|||||||
const {getInputSchema} = useContextStore()
|
const {getInputSchema} = useContextStore()
|
||||||
|
|
||||||
const columnsSchema = useCallback(() => [
|
const columnsSchema = useCallback(() => [
|
||||||
|
{
|
||||||
|
type: 'combo',
|
||||||
|
name: 'conditions',
|
||||||
|
label: '分支',
|
||||||
|
multiple: true,
|
||||||
|
required: true,
|
||||||
|
items: [
|
||||||
{
|
{
|
||||||
type: 'condition-builder',
|
type: 'condition-builder',
|
||||||
name: 'condition',
|
name: 'condition',
|
||||||
label: '判断条件',
|
label: '条件',
|
||||||
|
required: true,
|
||||||
fields: generateAllIncomerOutputVariablesConditions(
|
fields: generateAllIncomerOutputVariablesConditions(
|
||||||
props.id,
|
props.id,
|
||||||
getInputSchema(),
|
getInputSchema(),
|
||||||
@@ -37,6 +45,8 @@ const SwitchNode = (props: NodeProps) => {
|
|||||||
getData(),
|
getData(),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
], [props.id])
|
], [props.id])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ const TemplateNode = (props: NodeProps) => {
|
|||||||
{
|
{
|
||||||
outputs: {
|
outputs: {
|
||||||
text: {
|
text: {
|
||||||
type: 'string',
|
type: 'text',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import type {GraphData} from '../components/flow/types.ts'
|
|||||||
|
|
||||||
function Test() {
|
function Test() {
|
||||||
// language=JSON
|
// language=JSON
|
||||||
const [graphData] = useState<GraphData>(JSON.parse('{\n "nodes": [\n {\n "id": "QxNrkChBWQ",\n "type": "loop-node",\n "position": {\n "x": 742,\n "y": 119\n },\n "data": {},\n "measured": {\n "width": 458,\n "height": 368\n },\n "selected": true,\n "dragging": false,\n "width": 458,\n "height": 368,\n "resizing": false\n },\n {\n "id": "MzEitlOusl",\n "type": "llm-node",\n "position": {\n "x": 47,\n "y": 135\n },\n "data": {},\n "measured": {\n "width": 256,\n "height": 110\n },\n "selected": false,\n "dragging": false,\n "extent": "parent",\n "parentId": "QxNrkChBWQ"\n },\n {\n "id": "bivXSpiLaI",\n "type": "code-node",\n "position": {\n "x": 381,\n "y": 181\n },\n "data": {},\n "measured": {\n "width": 256,\n "height": 110\n },\n "selected": false,\n "dragging": false\n }\n ],\n "edges": [],\n "data": {\n "MzEitlOusl": {\n "node": {\n "name": "大模型",\n "description": "使用大模型对话"\n },\n "outputs": {\n "text": {\n "type": "string"\n }\n },\n "model": "qwen3",\n "systemPrompt": "你是个好人",\n "finished": true\n },\n "bivXSpiLaI": {\n "node": {\n "name": "代码执行",\n "description": "执行自定义的处理代码"\n },\n "outputs": {\n "result": {\n "type": "text"\n }\n },\n "type": "javascript",\n "content": "console.log(\'hello\')",\n "inputs": {\n "text": {\n "variable": "MzEitlOusl.text"\n }\n },\n "finished": true\n },\n "QxNrkChBWQ": {\n "node": {\n "name": "循环",\n "description": "实现循环执行流程"\n },\n "finished": true\n }\n }\n}'))
|
const [graphData] = useState<GraphData>(JSON.parse('{\n "nodes": [\n {\n "id": "QxNrkChBWQ",\n "type": "loop-node",\n "position": {\n "x": 742,\n "y": 119\n },\n "data": {},\n "measured": {\n "width": 458,\n "height": 368\n },\n "selected": false,\n "dragging": false,\n "width": 458,\n "height": 368,\n "resizing": false\n },\n {\n "id": "MzEitlOusl",\n "type": "llm-node",\n "position": {\n "x": 47,\n "y": 135\n },\n "data": {},\n "measured": {\n "width": 256,\n "height": 108\n },\n "selected": false,\n "dragging": false,\n "extent": "parent",\n "parentId": "QxNrkChBWQ"\n },\n {\n "id": "bivXSpiLaI",\n "type": "code-node",\n "position": {\n "x": 100,\n "y": 188\n },\n "data": {},\n "measured": {\n "width": 256,\n "height": 108\n },\n "selected": false,\n "dragging": false\n },\n {\n "id": "JsUwvjkJCW",\n "type": "switch-node",\n "position": {\n "x": 400,\n "y": 267\n },\n "data": {},\n "measured": {\n "width": 256,\n "height": 159\n },\n "selected": true,\n "dragging": false\n }\n ],\n "edges": [\n {\n "source": "bivXSpiLaI",\n "sourceHandle": "source",\n "target": "JsUwvjkJCW",\n "id": "xy-edge__bivXSpiLaIsource-JsUwvjkJCW"\n }\n ],\n "data": {\n "MzEitlOusl": {\n "node": {\n "name": "大模型",\n "description": "使用大模型对话"\n },\n "outputs": {\n "text": {\n "type": "text"\n }\n },\n "model": "qwen3",\n "systemPrompt": "你是个好人",\n "finished": true\n },\n "bivXSpiLaI": {\n "node": {\n "name": "代码执行",\n "description": "执行自定义的处理代码"\n },\n "outputs": {\n "text": {\n "type": "text"\n },\n "condition": {\n "type": "boolean"\n },\n "count": {\n "type": "number"\n },\n "person": {\n "type": "object"\n },\n "words": {\n "type": "array-text"\n },\n "people": {\n "type": "array-object"\n }\n },\n "type": "javascript",\n "content": "console.log(\'hello\')",\n "inputs": {\n "text": {\n "variable": "MzEitlOusl.text"\n }\n },\n "finished": true\n },\n "QxNrkChBWQ": {\n "node": {\n "name": "循环",\n "description": "实现循环执行流程"\n },\n "finished": true\n },\n "JsUwvjkJCW": {\n "node": {\n "name": "分支",\n "description": "根据不同的情况前往不同的分支"\n }\n }\n }\n}'))
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-screen">
|
<div className="h-screen">
|
||||||
|
|||||||
Reference in New Issue
Block a user