From 065d7aee856305cd7f6392f25d0e0ac578726be3 Mon Sep 17 00:00:00 2001
From: zhangjinyang <409225776@qq.com>
Date: 星期四, 22 五月 2025 14:59:50 +0800
Subject: [PATCH] feat: 新增单节点执行功能。 close #IC7QJU

---
 aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java |   70 +++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java b/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java
index db1a208..c9b1e82 100644
--- a/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java
+++ b/aiflowy-modules/aiflowy-module-ai/src/main/java/tech/aiflowy/ai/controller/AiWorkflowController.java
@@ -1,9 +1,13 @@
 package tech.aiflowy.ai.controller;
 
 import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
 import com.agentsflex.core.chain.*;
+import com.alibaba.fastjson.JSONObject;
 import dev.tinyflow.core.Tinyflow;
+import dev.tinyflow.core.parser.NodeParser;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -20,6 +24,7 @@
 import java.io.InputStream;
 import java.math.BigInteger;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -98,6 +103,7 @@
             }
         });
 
+
         chain.addOutputListener(new ChainOutputListener() {
             @Override
             public void onOutput(Chain chain, ChainNode node, Object outputMessage) {
@@ -130,4 +136,68 @@
         apiKeyService.checkApiKey(apiKey);
         return tryRunning(id, variables);
     }
+
+    @PostMapping("/singleRun")
+    public Result singleRun(
+            @JsonBody(value = "id", required = true) BigInteger id,
+            @JsonBody(value = "node", required = true) Map<String, Object> node,
+            @JsonBody("variables") Map<String, Object> variables) {
+
+        AiWorkflow workflow = service.getById(id);
+        if (workflow == null) {
+            return Result.fail(1, "宸ヤ綔娴佷笉瀛樺湪");
+        }
+        List<ChainNode> nodes = new ArrayList<>();
+        Tinyflow tinyflow = workflow.toTinyflow();
+        Chain fullChain = tinyflow.toChain();
+        if (fullChain != null) {
+            nodes = fullChain.getNodes();
+        }
+        Map<String, NodeParser> map = tinyflow.getChainParser().getNodeParserMap();
+        NodeParser parser = map.get(node.get("type").toString());
+        if (parser == null) {
+            return Result.fail(1, "鑺傜偣绫诲瀷涓嶅瓨鍦�");
+        }
+        ChainNode currentNode = parser.parse(new JSONObject(node), tinyflow);
+        if (currentNode == null) {
+            return Result.fail(1, "鑺傜偣涓嶅瓨鍦�");
+        }
+        currentNode.setInwardEdges(null);
+        currentNode.setOutwardEdges(null);
+        fixParamType(nodes, currentNode);
+        Chain chain = new Chain();
+        chain.addNode(currentNode);
+        Map<String, Object> res = chain.executeForResult(variables);
+        return Result.success(res);
+    }
+
+    /**
+     * 淇寮曠敤绫荤殑鍊肩被鍨�
+     */
+    private void fixParamType(List<ChainNode> allNodes, ChainNode currentNode) {
+        List<Parameter> currentParams = currentNode.getParameters();
+        if (CollectionUtil.isEmpty(currentParams)) {
+            return;
+        }
+        for (Parameter parameter : currentParams) {
+            RefType refType = parameter.getRefType();
+            if (refType.equals(RefType.REF)) {
+                parameter.setRefType(RefType.INPUT);
+                String ref = parameter.getRef();
+                if (StrUtil.isNotEmpty(ref)) {
+                    for (ChainNode node : allNodes) {
+                        List<Parameter> parameters = node.getParameters();
+                        if (parameters != null) {
+                            for (Parameter nodeParameter : parameters) {
+                                String nodeAttr = node.getId() + "." + nodeParameter.getName();
+                                if (ref.equals(nodeAttr)) {
+                                    parameter.setDataType(nodeParameter.getDataType());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0