lmx 1 неделя назад
Родитель
Сommit
9edf033cbf

+ 48 - 23
fs-service/src/main/java/com/fs/company/service/impl/call/node/AbstractWorkflowNode.java

@@ -2,7 +2,6 @@ package com.fs.company.service.impl.call.node;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
@@ -17,12 +16,12 @@ import com.fs.enums.NodeTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
-import org.springframework.scheduling.annotation.Async;
 
-import javax.xml.soap.Node;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -117,6 +116,10 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
         
         if (timeAvailable == null) {
             CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(context.getWorkflowInstanceId());
+            if (exec == null) {
+                log.warn("continueExecute: 工作流执行实例不存在 - workflowInstanceId: {}", context.getWorkflowInstanceId());
+                return null;
+            }
             Integer cidGroupNo = exec.getCidGroupNo();
             LocalTime runtimeRangeStart = exec.getRuntimeRangeStart();
             String continueTimerExecuteKey = getContinueTimerExecuteKey(cidGroupNo, runtimeRangeStart);
@@ -235,17 +238,10 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
         long endTime = System.currentTimeMillis();
         context.setVariable("node_end_time_" + nodeKey, endTime);
         log.info("Completed execution of node: {} ({})", nodeKey, nodeName);
-        //不在这里控制流程状态容易出问题bug,各节点自行管理状态
-//        int logStatus;
-//        if (ExecutionStatusEnum.SUCCESS.equals(result.getStatus())) {
-//            logStatus = ExecutionStatusEnum.SUCCESS.getValue();
-//            updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.SUCCESS);
-//        } else if (ExecutionStatusEnum.FAILURE.equals(result.getStatus())) {
-//            logStatus = ExecutionStatusEnum.FAILURE.getValue();
-//            updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.FAILURE);
-//        } else {
-//
-//        }
+        if (result == null) {
+            log.warn("节点 {} 执行结果为 null,跳过记录执行日志", nodeKey);
+            return;
+        }
         int logStatus = result.getStatus().getValue();
         CompanyAiWorkflowExecLog logEntry = createLogEntry(context.getWorkflowInstanceId(), nodeKey, getType(), result, context);
         logEntry.setStatus(logStatus);
@@ -280,7 +276,13 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
      */
     public String getNextNodeKey(String workflowInstanceId, String nodeKey) {
         CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(workflowInstanceId);
+        if (exec == null) {
+            throw new RuntimeException("工作流执行实例不存在: " + workflowInstanceId);
+        }
         List<CompanyWorkflowEdge> edges = companyWorkflowEdgeMapper.selectListByWorkflowIdAndNodeKey(exec.getWorkflowId(), nodeKey);
+        if (edges == null || edges.isEmpty()) {
+            throw new RuntimeException("未找到节点 " + nodeKey + " 的出边");
+        }
         return edges.get(0).getTargetNodeKey();
     }
 
@@ -439,7 +441,7 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
             update.setWorkflowInstanceId(context.getWorkflowInstanceId());
             update.setCurrentNodeKey(context.getCurrentNodeKey());
             if (null != context.getVariables() && null != context.getVariable("nodeName", String.class)) {
-                update.setCurrentNodeName(context.getVariable("nodeName0", String.class));
+                update.setCurrentNodeName(context.getVariable("nodeName", String.class));
             }
             update.setStatus(ExecutionStatusEnum.RUNNING.getValue());
             update.setLastUpdateTime(LocalDateTime.now());
@@ -452,11 +454,6 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
     }
 
     protected void runNextNode(ExecutionContext context, CompanyWorkflowEdge edge) {
-        try {
-            Thread.sleep(2000L);
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
         if (StringUtils.isBlank(edge.getTargetNodeKey())) {
             return;
         }
@@ -464,10 +461,35 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
         CompanyWorkflowNode nextNode = getNodeByKey(edge.getTargetNodeKey());
         nextContext.setCurrentNodeKey(nextNode.getNodeKey());
         nextContext.setVariable("nodeName", nextNode.getNodeName());
-        log.info("开始执行下一个节点:{}", nextNode.getNodeName());
-        execPointNextNode(nextContext);
         IWorkflowNode node = workflowNodeFactory.createNode(nextNode.getNodeKey(), NodeTypeEnum.fromCode(nextNode.getNodeType()), nextNode.getNodeName(), null);
-        node.execute(nextContext);
+
+        // 异步执行下一节点:当前节点不等待,下一节点在独立线程中执行(含 2 秒延迟)
+        Executor executor = getWorkflowNextNodeExecutor();
+        Runnable nextTask = () -> {
+            try {
+                Thread.sleep(2000L);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                log.warn("runNextNode 异步任务被中断", e);
+                return;
+            }
+            log.info("开始执行下一个节点:{}", nextNode.getNodeName());
+            execPointNextNode(nextContext);
+            node.execute(nextContext);
+        };
+        if (executor != null) {
+            CompletableFuture.runAsync(nextTask, executor);
+        } else {
+            CompletableFuture.runAsync(nextTask);
+        }
+    }
+
+    private static Executor getWorkflowNextNodeExecutor() {
+        try {
+            return SpringUtils.getBean("cidWorkFlowExecutor");
+        } catch (Exception e) {
+            return null;
+        }
     }
 
     /**
@@ -477,6 +499,9 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
      */
     protected Boolean runnable(ExecutionContext context) {
         CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(context.getWorkflowInstanceId());
+        if (exec == null) {
+            return false;
+        }
         return !exec.getCurrentNodeKey().equals(exec.getEndNodeKey());
     }
 

+ 28 - 8
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiAddWxTaskNode.java

@@ -57,7 +57,15 @@ public class AiAddWxTaskNode extends AbstractWorkflowNode {
         //收到回调代表加微通过了
 
         CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(context.getWorkflowInstanceId());
+        if (exec == null) {
+            log.warn("doContinue: 工作流执行实例不存在 - workflowInstanceId: {}", context.getWorkflowInstanceId());
+            return null;
+        }
         List<CompanyWorkflowEdge> edges = companyWorkflowEdgeMapper.selectListByWorkflowIdAndNodeKey(exec.getWorkflowId(), nodeKey);
+        if (edges == null || edges.isEmpty()) {
+            log.warn("doContinue: 未找到出边 - workflowInstanceId: {}, nodeKey: {}", context.getWorkflowInstanceId(), nodeKey);
+            return null;
+        }
 
         // 获取业务数据
         CompanyVoiceRoboticBusiness business = super.getRoboticBusiness(context.getWorkflowInstanceId());
@@ -71,10 +79,14 @@ public class AiAddWxTaskNode extends AbstractWorkflowNode {
         boolean addSuccess = wxClient != null && Integer.valueOf(1).equals(wxClient.getIsAdd());
         //回调加微成功
         if (addSuccess) {
-            List<CompanyWorkflowEdge> cList = edges.stream().filter(a ->
-                            StringUtils.isNotBlank(a.getConditionExpr()) && JSONObject.parseArray(a.getConditionExpr(), AiCallWorkflowConditionVo.class).get(0).isAdd())
-                    .collect(Collectors.toList());
-            if(null != cList && !cList.isEmpty() && nodeKey.equals(exec.getCurrentNodeKey())){
+            List<CompanyWorkflowEdge> cList = edges.stream().filter(a -> {
+                if (StringUtils.isBlank(a.getConditionExpr())) {
+                    return false;
+                }
+                List<AiCallWorkflowConditionVo> list = JSONObject.parseArray(a.getConditionExpr(), AiCallWorkflowConditionVo.class);
+                return list != null && !list.isEmpty() && list.get(0).isAdd();
+            }).collect(Collectors.toList());
+            if (null != cList && !cList.isEmpty() && nodeKey.equals(exec.getCurrentNodeKey())) {
                 super.runNextNode(context, cList.get(0));
             }
             // 加微成功,设置为等待状态,等待下一次回调
@@ -118,10 +130,10 @@ public class AiAddWxTaskNode extends AbstractWorkflowNode {
             //设置加微话术
             CompanyWorkflowNode node = context.getVariable("currentNode", CompanyWorkflowNode.class)==null? getNodeByKey(nodeKey):context.getVariable("currentNode", CompanyWorkflowNode.class);
             String nodeConfig = node.getNodeConfig();
-            AiAddWxConfigVO addWxConfig = JSONObject.parseObject(nodeConfig, AiAddWxConfigVO.class);
+            AiAddWxConfigVO addWxConfig = nodeConfig == null ? null : JSONObject.parseObject(nodeConfig, AiAddWxConfigVO.class);
 
-            if(null == addWxConfig.getDialogId()){
-               throw new CustomException("加微节点未配置加微话术,执行失败");
+            if (addWxConfig == null || addWxConfig.getDialogId() == null) {
+                throw new CustomException("加微节点未配置加微话术,执行失败");
             }
             CompanyVoiceRoboticBusiness roboticBusiness = getRoboticBusiness(context.getWorkflowInstanceId());
             CompanyWxClient update = new CompanyWxClient();
@@ -249,6 +261,10 @@ public class AiAddWxTaskNode extends AbstractWorkflowNode {
         context.setVariable("lastNodeKey", nodeKey);
         //启动定时节点倒计时
         CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(context.getWorkflowInstanceId());
+        if (exec == null) {
+            log.error("doneAddwx: 工作流执行实例不存在 - workflowInstanceId: {}", workflowInstanceId);
+            return;
+        }
         if (!exec.getCurrentNodeKey().equals(nodeKey)) {
             //当前节点已流转
             log.error("当前节点已流转 ,目标:{},实际:{}", nodeKey, exec.getCurrentNodeKey());
@@ -258,8 +274,12 @@ public class AiAddWxTaskNode extends AbstractWorkflowNode {
         super.updateLogStatusIfExist(context, ExecutionStatusEnum.PAUSED, ExecutionStatusEnum.WAITING);
         super.asyncWorkflowForBlockingNode(context.getWorkflowInstanceId(), nodeKey, context, ExecutionStatusEnum.WAITING);
         List<CompanyWorkflowEdge> edges = companyWorkflowEdgeMapper.selectListByWorkflowIdAndNodeKey(exec.getWorkflowId(), nodeKey);
+        if (edges == null) {
+            return;
+        }
         edges.forEach(edge -> {
-            List<AiCallWorkflowConditionVo> conditions = JSONObject.parseArray(edge.getConditionExpr(), AiCallWorkflowConditionVo.class);
+            String conditionExpr = edge.getConditionExpr();
+            List<AiCallWorkflowConditionVo> conditions = StringUtils.isBlank(conditionExpr) ? null : JSONObject.parseArray(conditionExpr, AiCallWorkflowConditionVo.class);
             if (null == conditions || conditions.isEmpty()) {
                 super.runNextNode(context, edge);
             } else {

+ 43 - 11
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiCallTaskNode.java

@@ -1,8 +1,6 @@
 package com.fs.company.service.impl.call.node;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.fs.aicall.domain.result.CalltaskcreateaiCustomizeResult;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.*;
@@ -10,7 +8,6 @@ import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
 import com.fs.company.service.ICompanyVoiceRoboticService;
 import com.fs.company.service.IWorkflowNode;
-import com.fs.company.service.impl.CompanyVoiceRoboticServiceImpl;
 import com.fs.company.vo.AiCallConfigVO;
 import com.fs.company.vo.AiCallWorkflowConditionVo;
 import com.fs.company.vo.ExecutionResult;
@@ -18,11 +15,9 @@ import com.fs.enums.ExecutionStatusEnum;
 import com.fs.enums.NodeTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 
-import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -52,17 +47,38 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
     protected ExecutionResult doContinue(ExecutionContext context) {
         //TODO 多次回调 是否过滤处理
         CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(context.getWorkflowInstanceId());
+        if (exec == null) {
+            log.warn("doContinue: 工作流执行实例不存在 - workflowInstanceId: {}", context.getWorkflowInstanceId());
+            return null;
+        }
         List<CompanyWorkflowEdge> edges = companyWorkflowEdgeMapper.selectListByWorkflowIdAndNodeKey(exec.getWorkflowId(), nodeKey);
+        if (edges == null) {
+            return null;
+        }
         //获取外呼回调结果日志
-        CompanyVoiceRoboticCallLogCallphone callRes = super.companyVoiceRoboticCallLogCallphoneMapper.selectCallLogByCallbackUuid(context.getVariable("callBackUuid", String.class));
+        String callBackUuid = context.getVariable("callBackUuid", String.class);
+        if (StringUtils.isBlank(callBackUuid)) {
+            log.warn("doContinue: 缺少 callBackUuid - workflowInstanceId: {}", context.getWorkflowInstanceId());
+            super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
+            return null;
+        }
+        CompanyVoiceRoboticCallLogCallphone callRes = super.companyVoiceRoboticCallLogCallphoneMapper.selectCallLogByCallbackUuid(callBackUuid);
+        if (callRes == null) {
+            log.warn("doContinue: 未找到外呼回调日志 - callBackUuid: {}, workflowInstanceId: {}", callBackUuid, context.getWorkflowInstanceId());
+            super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
+            return null;
+        }
         //记录执行路线
         int runnableCount = 0;
         for (CompanyWorkflowEdge edge : edges) {
-            List<AiCallWorkflowConditionVo> conditions = JSONObject.parseArray(edge.getConditionExpr(), AiCallWorkflowConditionVo.class);
+            List<AiCallWorkflowConditionVo> conditions = StringUtils.isBlank(edge.getConditionExpr())
+                    ? null
+                    : JSONObject.parseArray(edge.getConditionExpr(), AiCallWorkflowConditionVo.class);
 //            Boolean isValid = true;
             if (null == conditions || conditions.isEmpty()) {
-                super.runNextNode(context, edge);
+                runNextNode(context, edge);
                 runnableCount++;
+                break;
             } else {
                 //暂时考虑单条件
                 AiCallWorkflowConditionVo condition = conditions.get(0);
@@ -71,16 +87,18 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
                     //如果含有意向度过滤
                     if (StringUtils.isNotBlank(condition.getIntention())) {
                         if (condition.getIntention().equals(callRes.getIntention())) {
-                            super.runNextNode(context, edge);
+                            runNextNode(context, edge);
                             runnableCount++;
+                            break;
                         } else {
                             //不符合意向度配置的回调不执行逻辑
                             log.info("流程:{},节点:{},意向度设置:{},实际意向度:{}, 意向度不符设置中断执行,", context.getWorkflowInstanceId(), nodeKey, condition.getIntention(), callRes.getIntention());
 
                         }
                     } else {
-                        super.runNextNode(context, edge);
+                        runNextNode(context, edge);
                         runnableCount++;
+                        break;
                     }
                 }
                 //未拨通
@@ -96,11 +114,13 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
                         super.asyncWorkflowForBlockingNode(context.getWorkflowInstanceId(), context.getCurrentNodeKey(), context, ExecutionStatusEnum.WAITING);
                         updateLogStatusIfExist(context, ExecutionStatusEnum.PAUSED, ExecutionStatusEnum.WAITING);
                         runnableCount++;
+                        break;
                     }
                     //无时间驱动
                     else {
-                        super.runNextNode(context, edge);
+                        runNextNode(context, edge);
                         runnableCount++;
+                        break;
                     }
                 }
             }
@@ -119,8 +139,20 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
         try {
             if (isAsync()) {
                 CompanyWorkflowNode node = context.getVariable("currentNode", CompanyWorkflowNode.class);
+                if (node == null) {
+                    node = getNodeByKey(nodeKey);
+                }
                 String nodeConfig = node.getNodeConfig();
+                if (StringUtils.isBlank(nodeConfig)) {
+                    log.error("流程:{} 节点:{} 未配置节点配置", context.getWorkflowInstanceId(), nodeKey);
+                    super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
+                    return ExecutionResult.failure().errorMessage("未配置节点配置").build();
+                }
                 AiCallConfigVO callConfigVo = JSONObject.parseObject(nodeConfig, AiCallConfigVO.class);
+                if (callConfigVo == null) {
+                    super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.INTERRUPT);
+                    return ExecutionResult.failure().errorMessage("节点配置解析失败").build();
+                }
                 //执行外呼逻辑 需要传入节点信息
                 CompanyVoiceRoboticBusiness bus = super.getRoboticBusiness(context.getWorkflowInstanceId());
                 if (bus == null) {

+ 32 - 13
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiSendMsgTaskNode.java

@@ -11,17 +11,13 @@ import com.fs.company.mapper.CompanyWorkflowNodeMapper;
 import com.fs.company.param.ExecutionContext;
 import com.fs.company.service.ICompanyVoiceRoboticService;
 import com.fs.company.service.IWorkflowNode;
-import com.fs.company.vo.AiCallConfigVO;
 import com.fs.company.vo.AiCallWorkflowConditionVo;
 import com.fs.company.vo.AiSendMsgConfigVO;
 import com.fs.company.vo.ExecutionResult;
 import com.fs.enums.ExecutionStatusEnum;
 import com.fs.enums.NodeTypeEnum;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 
-import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -50,20 +46,35 @@ public class AiSendMsgTaskNode extends AbstractWorkflowNode {
     @Override
     protected ExecutionResult doContinue(ExecutionContext context) {
         CompanyAiWorkflowExec exec = companyAiWorkflowExecMapper.selectByWorkflowInstanceId(context.getWorkflowInstanceId());
+        if (exec == null) {
+            log.warn("doContinue: 工作流执行实例不存在 - workflowInstanceId: {}", context.getWorkflowInstanceId());
+            return null;
+        }
         List<CompanyWorkflowEdge> edges = companyWorkflowEdgeMapper.selectListByWorkflowIdAndNodeKey(exec.getWorkflowId(), nodeKey);
+        if (edges == null) {
+            return null;
+        }
         //发送短信成功
         if (true){
-            List<CompanyWorkflowEdge> success = edges.stream().filter(a ->
-                            StringUtils.isNotBlank(a.getConditionExpr()) && JSONObject.parseArray(a.getConditionExpr(), AiCallWorkflowConditionVo.class).get(0).isSendStatus())
-                    .collect(Collectors.toList());
+            List<CompanyWorkflowEdge> success = edges.stream().filter(a -> {
+                if (StringUtils.isBlank(a.getConditionExpr())) {
+                    return false;
+                }
+                List<AiCallWorkflowConditionVo> list = JSONObject.parseArray(a.getConditionExpr(), AiCallWorkflowConditionVo.class);
+                return list != null && !list.isEmpty() && list.get(0).isSendStatus();
+            }).collect(Collectors.toList());
             if (!success.isEmpty() && nodeKey.equals(exec.getCurrentNodeKey())) {
                 super.runNextNode(context, success.get(0));
             }
         }else {
             //发送短信失败
-            List<CompanyWorkflowEdge> fail = edges.stream().filter(a ->
-                            StringUtils.isNotBlank(a.getConditionExpr()) && !JSONObject.parseArray(a.getConditionExpr(), AiCallWorkflowConditionVo.class).get(0).isSendStatus())
-                    .collect(Collectors.toList());
+            List<CompanyWorkflowEdge> fail = edges.stream().filter(a -> {
+                if (StringUtils.isBlank(a.getConditionExpr())) {
+                    return false;
+                }
+                List<AiCallWorkflowConditionVo> list = JSONObject.parseArray(a.getConditionExpr(), AiCallWorkflowConditionVo.class);
+                return list != null && !list.isEmpty() && !list.get(0).isSendStatus();
+            }).collect(Collectors.toList());
             if (!fail.isEmpty() && nodeKey.equals(exec.getCurrentNodeKey())) {
                 super.runNextNode(context, fail.get(0));
             }
@@ -83,9 +94,17 @@ public class AiSendMsgTaskNode extends AbstractWorkflowNode {
         try {
             Thread.sleep(1000L);
             //设置短信模版
-            CompanyWorkflowNode node = context.getVariable("currentNode", CompanyWorkflowNode.class)==null? getNodeByKey(nodeKey):context.getVariable("currentNode", CompanyWorkflowNode.class);
+            CompanyWorkflowNode node = context.getVariable("currentNode", CompanyWorkflowNode.class) == null ? getNodeByKey(nodeKey) : context.getVariable("currentNode", CompanyWorkflowNode.class);
+            if (node == null) {
+                log.error("未找到节点 - workflowInstanceId: {}, nodeKey: {}", context.getWorkflowInstanceId(), nodeKey);
+                return ExecutionResult.failure().errorMessage("未找到节点").build();
+            }
             String nodeConfig = node.getNodeConfig();
-            AiSendMsgConfigVO configVO = JSONObject.parseObject(nodeConfig, AiSendMsgConfigVO.class);
+            AiSendMsgConfigVO configVO = StringUtils.isBlank(nodeConfig) ? null : JSONObject.parseObject(nodeConfig, AiSendMsgConfigVO.class);
+            if (configVO == null || configVO.getSmsTempId() == null) {
+                log.error("短信节点未配置模版 - workflowInstanceId: {}, nodeKey: {}", context.getWorkflowInstanceId(), nodeKey);
+                return ExecutionResult.failure().errorMessage("短信节点未配置模版").build();
+            }
             // 获取业务数据
             CompanyVoiceRoboticBusiness business = super.getRoboticBusiness(context.getWorkflowInstanceId());
             if (business == null) {
@@ -97,7 +116,7 @@ public class AiSendMsgTaskNode extends AbstractWorkflowNode {
                     context.getWorkflowInstanceId(), business.getRoboticId(), business.getCalleeId());
             
             // TODO: 这里可以添加实际的发送短信逻辑
-            companyVoiceRoboticService.workflowSendSmsOne(business.getRoboticId(), business.getCalleeId(),context,configVO.getSmsTempId());
+            companyVoiceRoboticService.workflowSendSmsOne(business.getRoboticId(), business.getCalleeId(), context, configVO.getSmsTempId());
             //如果不需要等待回调,直接执行下一个节点
             log.info("短信发送成功 - workflowInstanceId: {}", context.getWorkflowInstanceId());
             super.updateWorkflowStatus(context.getWorkflowInstanceId(), ExecutionStatusEnum.SUCCESS);