吴树波 3 tygodni temu
rodzic
commit
4f73cc4c4a
20 zmienionych plików z 66 dodań i 163 usunięć
  1. 12 2
      fs-ai-call-task/src/main/java/com/fs/app/task/Task.java
  2. 16 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java
  3. 18 18
      fs-service/src/main/java/com/fs/company/service/impl/CompanyWorkflowEngineImpl.java
  4. 3 5
      fs-service/src/main/java/com/fs/company/service/impl/call/node/AbstractWorkflowNode.java
  5. 0 2
      fs-service/src/main/java/com/fs/company/service/impl/call/node/AiAddWxTaskNode.java
  6. 0 1
      fs-service/src/main/java/com/fs/company/service/impl/call/node/AiCallTaskNode.java
  7. 0 1
      fs-service/src/main/java/com/fs/company/service/impl/call/node/AiSendMsgTaskNode.java
  8. 0 2
      fs-service/src/main/java/com/fs/company/service/impl/call/node/DelayNode.java
  9. 0 1
      fs-service/src/main/java/com/fs/company/service/impl/call/node/EndNode.java
  10. 0 1
      fs-service/src/main/java/com/fs/company/service/impl/call/node/OutBoundTaskNode.java
  11. 2 3
      fs-service/src/main/java/com/fs/company/service/impl/call/node/StartNode.java
  12. 2 6
      fs-service/src/main/java/com/fs/company/service/impl/call/node/WorkflowNodeFactory.java
  13. 0 14
      fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyAiWorkflowExecLogMapper.java
  14. 0 14
      fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyAiWorkflowExecMapper.java
  15. 0 13
      fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyVoiceRoboticBusinessMapper.java
  16. 0 14
      fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyWorkflowEdgeMapper.java
  17. 0 15
      fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyWorkflowNodeMapper.java
  18. 0 12
      fs-service/src/main/java/com/fs/company/service/nodeInterface/HasObjectMapper.java
  19. 0 14
      fs-service/src/main/java/com/fs/company/service/nodeInterface/HasRedisNode.java
  20. 13 25
      fs-service/src/main/java/com/fs/company/vo/ExecutionResult.java

+ 12 - 2
fs-ai-call-task/src/main/java/com/fs/app/task/Task.java

@@ -1,9 +1,15 @@
 package com.fs.app.task;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.company.domain.CompanyVoiceRobotic;
+import com.fs.company.mapper.CompanyVoiceRoboticMapper;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * 企业微信SOP定时任务管理类
  * 负责处理各种定时任务,包括SOP规则检查、消息发送、数据清理等
@@ -13,15 +19,19 @@ import org.springframework.stereotype.Component;
  */
 @Component
 @Slf4j
+@AllArgsConstructor
 public class Task {
 
+    private final CompanyVoiceRoboticMapper roboticMapper;
+
     /**
      * 定时拉人进群
      */
     @Scheduled(cron = "0 * * * * ?")
     public void runTask(){
+        List<CompanyVoiceRobotic> list = roboticMapper.selectList(new QueryWrapper<CompanyVoiceRobotic>().eq("task_status", 1));
+        list.forEach(e -> {
 
-
-
+        });
     }
 }

+ 16 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.aicall.domain.apiresult.Notify;
 import com.fs.aicall.domain.apiresult.PushIIntentionResult;
 import com.fs.aicall.domain.param.CalleeDomain;
@@ -49,6 +50,8 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRoboticMapper, CompanyVoiceRobotic> implements ICompanyVoiceRoboticService {
 
+    private static final String NODE_RUN_KEY = "aicall:node:run:";
+
     private final CompanyVoiceRoboticMapper companyVoiceRoboticMapper;
     private final AiCallService aiCallService;
     private final CrmCustomerServiceImpl crmCustomerService;
@@ -59,6 +62,7 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
 
     private final CompanyVoiceRoboticWxMapper companyVoiceRoboticWxMapper;
     private final RedisCacheT<Long> redisCache;
+    private final RedisCacheT<ExecutionResult> redisExcution;
 
     private final CompanyVoiceRoboticWxServiceImpl companyVoiceRoboticWxService;
 
@@ -84,6 +88,7 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
     private final ICompanyUserService companyUserService;
 
     private final CompanyVoiceRoboticBusinessMapper companyVoiceRoboticBusinessMapper;
+    private final CompanyWorkflowEngine companyWorkflowEngine;
     /**
      * 查询机器人外呼任务
      *
@@ -710,6 +715,17 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
         }
         //新增启动写入任务业务表数据
         buildTaskBussiness(robotic);
+        List<CompanyVoiceRoboticBusiness> roboticBusinesseList = companyVoiceRoboticBusinessMapper.selectList(new QueryWrapper<CompanyVoiceRoboticBusiness>().eq("robotic_id", id));
+        roboticBusinesseList.forEach(e -> {
+            Map<String, Object> map = new HashMap<>();
+            map.put("roboticId", robotic.getId());
+            map.put("businesse", e.getId());
+            // 写入执行任务
+            ExecutionResult initialize = companyWorkflowEngine.initialize(robotic.getCompanyAiWorkflowId(), map);
+            redisExcution.setCacheObject(NODE_RUN_KEY + robotic.getId() + ":" + e.getId(), initialize);
+            companyWorkflowEngine.executeNode(initialize.getWorkflowInstanceId(), initialize.getNextNodeKey());
+        });
+
     }
 
     /**

+ 18 - 18
fs-service/src/main/java/com/fs/company/service/impl/CompanyWorkflowEngineImpl.java

@@ -78,13 +78,13 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
             log.info("工作流初始化成功: {} -> {}", workflowInstanceId, workflowDefinitionId);
 
             return ExecutionResult.success()
-                    .withNextNodeKey(definition.getStartNodeKey())
-                    .withOutputData(Collections.singletonMap("workflowInstanceId", workflowInstanceId));
+                    .nextNodeKey(definition.getStartNodeKey())
+                    .workflowInstanceId(workflowInstanceId).build();
 
         } catch (Exception e) {
             log.error("工作流初始化失败: {}", workflowDefinitionId, e);
             return ExecutionResult.failure()
-                    .withErrorMessage("Initialization failed: " + e.getMessage());
+                    .errorMessage("Initialization failed: " + e.getMessage()).build();
         }
     }
 
@@ -102,7 +102,7 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
 
             if (currentExec == null) {
                 return ExecutionResult.failure()
-                        .withErrorMessage("工作流实例不存在: " + workflowInstanceId);
+                        .errorMessage("工作流实例不存在: " + workflowInstanceId).build();
             }
 
             // 反序列化执行上下文
@@ -116,7 +116,7 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
             IWorkflowNode node = createNode(definition, nodeKey);
             if (node == null) {
                 return ExecutionResult.failure()
-                        .withErrorMessage("节点不存在: " + nodeKey);
+                        .errorMessage("节点不存在: " + nodeKey).build();
             }
 
             // 更新当前节点到执行上下文
@@ -140,8 +140,8 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
 
                 // 返回特殊结果表示流程被阻塞
                 return ExecutionResult.paused()
-                        .withNextNodeKey(result.getNextNodeKey())
-                        .withOutputData(result.getOutputData());
+                        .nextNodeKey(result.getNextNodeKey())
+                        .outputData(result.getOutputData()).build();
             } else {
                 // 执行节点
                 ExecutionResult result = node.execute(context);
@@ -175,7 +175,7 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
             log.error("节点执行失败: {} -> {}", workflowInstanceId, nodeKey, e);
             updateWorkflowStatus(workflowInstanceId, ExecutionStatusEnum.FAILURE);
             return ExecutionResult.failure()
-                    .withErrorMessage("Node execution failed: " + e.getMessage());
+                    .errorMessage("Node execution failed: " + e.getMessage()).build();
         }
     }
 
@@ -196,16 +196,16 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
 
             if (rows > 0) {
                 log.info("工作流暂停成功: {}", workflowInstanceId);
-                return ExecutionResult.success();
+                return ExecutionResult.success().build();
             } else {
                 return ExecutionResult.failure()
-                        .withErrorMessage("工作流实例不存在: " + workflowInstanceId);
+                        .errorMessage("工作流实例不存在: " + workflowInstanceId).build();
             }
 
         } catch (Exception e) {
             log.error("暂停工作流失败: {}", workflowInstanceId, e);
             return ExecutionResult.failure()
-                    .withErrorMessage("Pause failed: " + e.getMessage());
+                    .errorMessage("Pause failed: " + e.getMessage()).build();
         }
     }
 
@@ -226,16 +226,16 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
 
             if (rows > 0) {
                 log.info("工作流结束成功: {}", workflowInstanceId);
-                return ExecutionResult.success();
+                return ExecutionResult.success().build();
             } else {
                 return ExecutionResult.failure()
-                        .withErrorMessage("工作流实例不存在: " + workflowInstanceId);
+                        .errorMessage("工作流实例不存在: " + workflowInstanceId).build();
             }
 
         } catch (Exception e) {
             log.error("结束工作流失败: {}", workflowInstanceId, e);
             return ExecutionResult.failure()
-                    .withErrorMessage("Complete failed: " + e.getMessage());
+                    .errorMessage("Complete failed: " + e.getMessage()).build();
         }
     }
 
@@ -452,13 +452,13 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
 
             if (currentExec == null) {
                 return ExecutionResult.failure()
-                        .withErrorMessage("工作流实例不存在: " + workflowInstanceId);
+                        .errorMessage("工作流实例不存在: " + workflowInstanceId).build();
             }
 
             // 检查当前工作流是否处于暂停状态
             if (!Integer.valueOf(ExecutionStatusEnum.WAITING.getValue()).equals(currentExec.getStatus())) {
                 return ExecutionResult.failure()
-                        .withErrorMessage("工作流未处于暂停状态,无法唤醒: " + workflowInstanceId);
+                        .errorMessage("工作流未处于暂停状态,无法唤醒: " + workflowInstanceId).build();
             }
 
             // 反序列化执行上下文并合并新的输入数据
@@ -474,7 +474,7 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
             IWorkflowNode node = createNode(definition, nodeKey);
             if (node == null) {
                 return ExecutionResult.failure()
-                        .withErrorMessage("节点不存在: " + nodeKey);
+                        .errorMessage("节点不存在: " + nodeKey).build();
             }
 
             // 继续执行节点逻辑
@@ -507,7 +507,7 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
             log.error("唤醒阻塞节点失败: {} -> {}", workflowInstanceId, nodeKey, e);
             updateWorkflowStatus(workflowInstanceId, ExecutionStatusEnum.FAILURE);
             return ExecutionResult.failure()
-                    .withErrorMessage("Resume from blocking node failed: " + e.getMessage());
+                    .errorMessage("Resume from blocking node failed: " + e.getMessage()).build();
         }
     }
 }

+ 3 - 5
fs-service/src/main/java/com/fs/company/service/impl/call/node/AbstractWorkflowNode.java

@@ -6,13 +6,11 @@ import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.*;
 import com.fs.company.mapper.*;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.*;
-import com.fs.company.service.nodeInterface.*;
+import com.fs.company.service.IWorkflowNode;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.ExecutionStatusEnum;
 import com.fs.enums.NodeTypeEnum;
 import lombok.extern.slf4j.Slf4j;
-import net.bytebuddy.description.modifier.EnumerationState;
 
 import java.time.LocalDateTime;
 import java.util.*;
@@ -112,8 +110,8 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
     protected ExecutionResult handleExecutionError(Exception e, ExecutionContext context) {
         log.error("Error executing node: {} ({})", nodeKey, nodeName, e);
         return ExecutionResult.failure()
-                .withErrorMessage(e.getMessage())
-                .withOutputData(Collections.singletonMap("error", e.getMessage()));
+                .errorMessage(e.getMessage())
+                .outputData(Collections.singletonMap("error", e.getMessage())).build();
     }
 
     @Override

+ 0 - 2
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiAddWxTaskNode.java

@@ -4,12 +4,10 @@ import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.CompanyAiWorkflowExec;
 import com.fs.company.domain.CompanyWorkflowEdge;
 import com.fs.company.domain.CompanyWorkflowNode;
-import com.fs.company.mapper.CompanyAiWorkflowExecLogMapper;
 import com.fs.company.mapper.CompanyAiWorkflowExecMapper;
 import com.fs.company.mapper.CompanyWorkflowEdgeMapper;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.nodeInterface.HasCompanyWorkflowNodeMapper;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.NodeTypeEnum;
 

+ 0 - 1
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiCallTaskNode.java

@@ -3,7 +3,6 @@ package com.fs.company.service.impl.call.node;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.nodeInterface.HasCompanyWorkflowNodeMapper;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.NodeTypeEnum;
 

+ 0 - 1
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiSendMsgTaskNode.java

@@ -3,7 +3,6 @@ package com.fs.company.service.impl.call.node;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.nodeInterface.HasCompanyWorkflowNodeMapper;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.NodeTypeEnum;
 

+ 0 - 2
fs-service/src/main/java/com/fs/company/service/impl/call/node/DelayNode.java

@@ -4,8 +4,6 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.nodeInterface.HasCompanyWorkflowNodeMapper;
-import com.fs.company.service.nodeInterface.HasRedisNode;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.NodeTypeEnum;
 

+ 0 - 1
fs-service/src/main/java/com/fs/company/service/impl/call/node/EndNode.java

@@ -3,7 +3,6 @@ package com.fs.company.service.impl.call.node;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.nodeInterface.HasCompanyWorkflowNodeMapper;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.NodeTypeEnum;
 

+ 0 - 1
fs-service/src/main/java/com/fs/company/service/impl/call/node/OutBoundTaskNode.java

@@ -3,7 +3,6 @@ package com.fs.company.service.impl.call.node;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.nodeInterface.HasCompanyWorkflowNodeMapper;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.NodeTypeEnum;
 

+ 2 - 3
fs-service/src/main/java/com/fs/company/service/impl/call/node/StartNode.java

@@ -3,7 +3,6 @@ package com.fs.company.service.impl.call.node;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
-import com.fs.company.service.nodeInterface.HasCompanyWorkflowNodeMapper;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.NodeTypeEnum;
 
@@ -24,13 +23,13 @@ public class StartNode extends AbstractWorkflowNode {
 
     @Override
     protected ExecutionResult doContinue(ExecutionContext context) {
-        return ExecutionResult.success();
+        return ExecutionResult.success().build();
     }
 
     @Override
     public ExecutionResult doExecute(ExecutionContext context) {
         return ExecutionResult.success()
-                .withNextNodeKey(super.getNextNodeKey(context.getWorkflowInstanceId(), nodeKey));
+                .nextNodeKey(super.getNextNodeKey(context.getWorkflowInstanceId(), nodeKey)).build();
     }
 
     @Override

+ 2 - 6
fs-service/src/main/java/com/fs/company/service/impl/call/node/WorkflowNodeFactory.java

@@ -1,12 +1,8 @@
 package com.fs.company.service.impl.call.node;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fs.common.core.redis.RedisCache;
-import com.fs.company.mapper.*;
-import com.fs.company.service.*;
-import com.fs.company.service.nodeInterface.*;
+import com.fs.company.service.IWorkflowNode;
+import com.fs.company.service.IWorkflowNodeFactory;
 import com.fs.enums.NodeTypeEnum;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;

+ 0 - 14
fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyAiWorkflowExecLogMapper.java

@@ -1,14 +0,0 @@
-package com.fs.company.service.nodeInterface;
-
-
-import com.fs.company.mapper.CompanyAiWorkflowExecLogMapper;
-
-/**
- * @author MixLiu
- * @date 2026/1/29 15:18
- * @description
- */
-public interface HasCompanyAiWorkflowExecLogMapper {
-    void setCompanyAiWorkflowExecLogMapper(CompanyAiWorkflowExecLogMapper companyAiWorkflowExecLogMapper);
-
-}

+ 0 - 14
fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyAiWorkflowExecMapper.java

@@ -1,14 +0,0 @@
-package com.fs.company.service.nodeInterface;
-
-import com.fs.company.mapper.CompanyAiWorkflowExecMapper;
-
-/**
- * @author MixLiu
- * @date 2026/1/29 10:01
- * @description
- */
-public interface HasCompanyAiWorkflowExecMapper {
-
-    void setCompanyAiWorkflowExecMapper(CompanyAiWorkflowExecMapper companyAiWorkflowExecMapper);
-
-}

+ 0 - 13
fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyVoiceRoboticBusinessMapper.java

@@ -1,13 +0,0 @@
-package com.fs.company.service.nodeInterface;
-
-import com.fs.company.mapper.CompanyVoiceRoboticBusinessMapper;
-
-/**
- * @author MixLiu
- * @date 2026/2/2 14:37
- * @description
- */
-public interface HasCompanyVoiceRoboticBusinessMapper {
-
-    void setCompanyVoiceRoboticBusinessMapper(CompanyVoiceRoboticBusinessMapper companyVoiceRoboticBusinessMapper);
-}

+ 0 - 14
fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyWorkflowEdgeMapper.java

@@ -1,14 +0,0 @@
-package com.fs.company.service.nodeInterface;
-
-import com.fs.company.mapper.CompanyWorkflowEdgeMapper;
-
-/**
- * @author MixLiu
- * @date 2026/1/29 10:01
- * @description
- */
-public interface HasCompanyWorkflowEdgeMapper {
-
-    void setCompanyWorkflowEdgeMapper(CompanyWorkflowEdgeMapper companyWorkflowEdgeMapper);
-
-}

+ 0 - 15
fs-service/src/main/java/com/fs/company/service/nodeInterface/HasCompanyWorkflowNodeMapper.java

@@ -1,15 +0,0 @@
-package com.fs.company.service.nodeInterface;
-
-import com.fs.company.mapper.CompanyWorkflowNodeMapper;
-
-/**
- * @author MixLiu
- * @date 2026/1/29 10:24
- * @description
- */
-public interface HasCompanyWorkflowNodeMapper {
-
-    void setCompanyWorkflowNodeMapper(CompanyWorkflowNodeMapper mapper);
-
-}
-

+ 0 - 12
fs-service/src/main/java/com/fs/company/service/nodeInterface/HasObjectMapper.java

@@ -1,12 +0,0 @@
-package com.fs.company.service.nodeInterface;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/**
- * @author MixLiu
- * @date 2026/2/2 16:29
- * @description
- */
-public interface HasObjectMapper {
-    void setObjectMapper(ObjectMapper objectMapper);
-}

+ 0 - 14
fs-service/src/main/java/com/fs/company/service/nodeInterface/HasRedisNode.java

@@ -1,14 +0,0 @@
-package com.fs.company.service.nodeInterface;
-
-import com.fs.common.core.redis.RedisCache;
-
-/**
- * @author MixLiu
- * @date 2026/1/29 10:01
- * @description 流程需要用到redis
- */
-public interface HasRedisNode {
-
-    void setRedisService(RedisCache redisCache);
-
-}

+ 13 - 25
fs-service/src/main/java/com/fs/company/vo/ExecutionResult.java

@@ -1,7 +1,10 @@
 package com.fs.company.vo;
 
 import com.fs.enums.ExecutionStatusEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 /**
  * @author MixLiu
@@ -9,44 +12,29 @@ import lombok.Data;
  * @description 流程执行结果类
  */
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class ExecutionResult {
     private boolean success;
     private String nextNodeKey;
     private String errorMessage;
     private Object outputData;
+    private String workflowInstanceId;
     private ExecutionStatusEnum status;
 
-    public static ExecutionResult success() {
-        ExecutionResult result = new ExecutionResult();
-        result.success = true;
-        result.status = ExecutionStatusEnum.SUCCESS;
-        return result;
+    public static ExecutionResultBuilder success() {
+        return ExecutionResult.builder().success(true).status(ExecutionStatusEnum.SUCCESS);
     }
-    public static ExecutionResult failure() {
+    public static ExecutionResultBuilder failure() {
         ExecutionResult result = new ExecutionResult();
         result.success = false;
         result.status = ExecutionStatusEnum.FAILURE;
-        return result;
+        return ExecutionResult.builder().success(false).status(ExecutionStatusEnum.FAILURE);
     }
-    public static ExecutionResult paused(){
+    public static ExecutionResultBuilder paused(){
         ExecutionResult result = new ExecutionResult();
-        result.success = true;
-        result.status = ExecutionStatusEnum.WAITING;
-        return result;
-    }
-
-    public ExecutionResult withNextNodeKey(String nextNodeKey) {
-        this.nextNodeKey = nextNodeKey;
-        return this;
-    }
-
-    public ExecutionResult withOutputData(Object data) {
-        this.outputData = data;
-        return this;
-    }
-    public ExecutionResult withErrorMessage(String errorMessage) {
-        this.errorMessage = errorMessage;
-        return this;
+        return ExecutionResult.builder().success(true).status(ExecutionStatusEnum.WAITING);
     }
 
 }