lmx před 4 týdny
rodič
revize
2e970d6476

+ 1 - 1
fs-service/src/main/java/com/fs/company/domain/CompanyWorkflowNode.java

@@ -29,7 +29,7 @@ public class CompanyWorkflowNode  implements Serializable {
     private String nodeName;
 
     /** 节点类型 start/end/condition/action/ai/delay/http */
-    private Integer nodeType;
+    private String nodeType;
 
     /** 节点图标 */
     private String nodeIcon;

+ 8 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyAiWorkflowExecMapper.java

@@ -3,6 +3,7 @@ package com.fs.company.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.company.domain.CompanyAiWorkflowExec;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * AI外呼工作流执行Mapper接口
@@ -58,4 +59,11 @@ public interface CompanyAiWorkflowExecMapper extends BaseMapper<CompanyAiWorkflo
      * @return 结果
      */
     int deleteCompanyAiWorkflowExecByIds(Long[] ids);
+
+    /**
+     * 根据工作实例id获取执行节点
+     * @param workflowInstanceId
+     * @return
+     */
+    CompanyAiWorkflowExec selectByWorkflowInstanceId(@Param("workflowInstanceId") String workflowInstanceId);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowEdgeMapper.java

@@ -4,6 +4,7 @@ package com.fs.company.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.company.domain.CompanyVoiceRobotic;
 import com.fs.company.domain.CompanyWorkflowEdge;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -28,4 +29,6 @@ public interface CompanyWorkflowEdgeMapper  extends BaseMapper<CompanyWorkflowEd
     int deleteCompanyWorkflowEdgeById(Long edgeId);
 
     int deleteCompanyWorkflowEdgeByWorkflowId(Long workflowId);
+
+    List<CompanyWorkflowEdge> selectListByWorkflowIdAndNodeKey(@Param("workflowId")Long workflowId, @Param("nodeKey")String nodeKey);
 }

+ 1 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyWorkflowNodeMapper.java

@@ -35,4 +35,5 @@ public interface CompanyWorkflowNodeMapper {
 
     CompanyWorkflowNode selectNodeByWorkflowIdAndNodeKey(@Param("workflowId") Long workflowId,
                                                        @Param("nodeKey") String nodeKey);
+    CompanyWorkflowNode selectNodeByNodeKey(@Param("nodeKey") String nodeKey);
 }

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

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

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

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

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

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

+ 61 - 5
fs-service/src/main/java/com/fs/company/service/impl/AbstractWorkflowNode.java

@@ -1,13 +1,18 @@
 package com.fs.company.service.impl;
 
+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.IWorkflowNode;
+import com.fs.company.service.*;
 import com.fs.company.vo.ExecutionResult;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author MixLiu
@@ -15,7 +20,32 @@ import java.util.Map;
  * @description 工作节点基类
  */
 @Slf4j
-public abstract class AbstractWorkflowNode implements IWorkflowNode {
+public abstract class AbstractWorkflowNode implements HasCompanyWorkflowNodeMapper, IWorkflowNode, HasCompanyAiWorkflowExecMapper, HasCompanyWorkflowEdgeMapper, HasCompanyAiWorkflowExecLogMapper {
+
+    CompanyAiWorkflowExecMapper workflowExecMapper;
+    CompanyWorkflowEdgeMapper companyWorkflowEdgeMapper;
+    CompanyAiWorkflowExecLogMapper companyAiWorkflowExecLogMapper;
+    CompanyWorkflowNodeMapper companyWorkflowNodeMapper;
+
+    @Override
+    public void setCompanyWorkflowNodeMapper(CompanyWorkflowNodeMapper mapper) {
+        this.companyWorkflowNodeMapper = mapper;
+    }
+    @Override
+    public void setCompanyAiWorkflowExecMapper(CompanyAiWorkflowExecMapper workflowExecMapper) {
+        this.workflowExecMapper = workflowExecMapper;
+    }
+
+    @Override
+    public void setCompanyWorkflowEdgeMapper(CompanyWorkflowEdgeMapper companyWorkflowEdgeMapper) {
+        this.companyWorkflowEdgeMapper = companyWorkflowEdgeMapper;
+    }
+    @Override
+    public void setCompanyAiWorkflowExecLogMapper(CompanyAiWorkflowExecLogMapper companyAiWorkflowExecLogMapper) {
+        this.companyAiWorkflowExecLogMapper = companyAiWorkflowExecLogMapper;
+    }
+
+
     protected String nodeKey;
     protected String nodeName;
     protected Map<String, Object> properties; // 节点配置属性
@@ -92,4 +122,30 @@ public abstract class AbstractWorkflowNode implements IWorkflowNode {
     	return false;
     }
 
+    /**
+     * 根据流程配置& 条件判定 获取下一个执行节点
+     * @param workflowInstanceId
+     * @param nodeKey
+     * @return
+     */
+    public String getNextNodeKey(String workflowInstanceId, String nodeKey){
+
+        CompanyAiWorkflowExec companyAiWorkflowExec = workflowExecMapper.selectByWorkflowInstanceId(workflowInstanceId);
+
+        List<CompanyWorkflowEdge> companyWorkflowEdges =
+                companyWorkflowEdgeMapper.selectListByWorkflowIdAndNodeKey(companyAiWorkflowExec.getWorkflowId(), nodeKey);
+
+        //todo 判定条件满足
+
+        return companyWorkflowEdges.get(new Random().nextInt(companyWorkflowEdges.size())).getTargetNodeKey();
+    }
+
+    public CompanyWorkflowNode getNodeByKey(String nodeKey){
+        CompanyWorkflowNode companyWorkflowNode = companyWorkflowNodeMapper.selectNodeByNodeKey(nodeKey);
+        if(null == companyWorkflowNode){
+            throw new RuntimeException("节点不存在");
+        }
+        return companyWorkflowNode;
+    }
+
 }

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

@@ -351,7 +351,7 @@ public class CompanyWorkflowEngineImpl implements CompanyWorkflowEngine {
         }
         return nodeFactory.createNode(
                 node.getNodeKey(),
-                NodeTypeEnum.fromValue(node.getNodeType()),
+                NodeTypeEnum.fromCode(node.getNodeType()),
                 node.getNodeName(),
                 JSON.parseObject(node.getNodeConfig(), Map.class));
     }

+ 2 - 2
fs-service/src/main/java/com/fs/company/service/impl/CompanyWorkflowServiceImpl.java

@@ -232,8 +232,8 @@ public class CompanyWorkflowServiceImpl implements ICompanyWorkflowService {
                 CompanyWorkflowExportVO.NodeInfo nodeInfo = new CompanyWorkflowExportVO.NodeInfo();
                 nodeInfo.setNodeKey(node.getNodeKey());
                 nodeInfo.setNodeName(node.getNodeName());
-                nodeInfo.setNodeType(node.getNodeType());
-                nodeInfo.setNodeTypeName(NodeTypeEnum.fromValue(node.getNodeType()).getDescription());
+                nodeInfo.setNodeType(NodeTypeEnum.fromCode(node.getNodeType()).getValue());
+                nodeInfo.setNodeTypeName(NodeTypeEnum.fromCode(node.getNodeType()).getDescription());
                 nodeInfo.setNodeConfig(node.getNodeConfig());
                 nodeInfo.setPosX(node.getPosX());
                 nodeInfo.setPosY(node.getPosY());

+ 10 - 1
fs-service/src/main/java/com/fs/company/service/impl/StartNode.java

@@ -14,7 +14,9 @@ import java.util.Map;
  * @description 开始节点
  */
 public class StartNode extends AbstractWorkflowNode implements HasCompanyWorkflowNodeMapper {
+
     private CompanyWorkflowNodeMapper companyWorkflowNodeMapper;
+
     @Override
     public void setCompanyWorkflowNodeMapper(CompanyWorkflowNodeMapper mapper) {
         this.companyWorkflowNodeMapper = mapper;
@@ -25,7 +27,8 @@ public class StartNode extends AbstractWorkflowNode implements HasCompanyWorkflo
 
     @Override
     public ExecutionResult doExecute(ExecutionContext context) {
-        return null;
+        return ExecutionResult.success()
+                .withNextNodeKey(super.getNextNodeKey(context.getWorkflowInstanceId(), nodeKey));
     }
 
     @Override
@@ -37,4 +40,10 @@ public class StartNode extends AbstractWorkflowNode implements HasCompanyWorkflo
     protected void preExecute(ExecutionContext context){
         super.preExecute(context);
     }
+
+    @Override
+    public Boolean isAsync() {
+        return false;
+    }
+
 }

+ 19 - 4
fs-service/src/main/java/com/fs/company/service/impl/WorkflowNodeFactory.java

@@ -1,11 +1,11 @@
 package com.fs.company.service.impl;
 
 import com.fs.common.core.redis.RedisCache;
+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.service.HasCompanyWorkflowNodeMapper;
-import com.fs.company.service.HasRedisNode;
-import com.fs.company.service.IWorkflowNode;
-import com.fs.company.service.IWorkflowNodeFactory;
+import com.fs.company.service.*;
 import com.fs.enums.NodeTypeEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -24,6 +24,12 @@ public class WorkflowNodeFactory implements IWorkflowNodeFactory {
     private RedisCache redisCache;
     @Autowired
     private CompanyWorkflowNodeMapper companyWorkflowNodeMapper;
+    @Autowired
+    private CompanyAiWorkflowExecMapper companyAiWorkflowExecMapper;
+    @Autowired
+    private CompanyWorkflowEdgeMapper companyWorkflowEdgeMapper;
+    @Autowired
+    private CompanyAiWorkflowExecLogMapper companyAiWorkflowExecLogMapper;
 
     @Override
     public IWorkflowNode createNode(String nodeKey, NodeTypeEnum type, String nodeName,
@@ -72,6 +78,15 @@ public class WorkflowNodeFactory implements IWorkflowNodeFactory {
         if (node instanceof HasCompanyWorkflowNodeMapper) {
             ((HasCompanyWorkflowNodeMapper) node).setCompanyWorkflowNodeMapper(companyWorkflowNodeMapper);
         }
+        if(node instanceof HasCompanyAiWorkflowExecMapper){
+            ((HasCompanyAiWorkflowExecMapper) node).setCompanyAiWorkflowExecMapper(companyAiWorkflowExecMapper);
+        }
+        if(node instanceof HasCompanyWorkflowEdgeMapper){
+            ((HasCompanyWorkflowEdgeMapper) node).setCompanyWorkflowEdgeMapper(companyWorkflowEdgeMapper);
+        }
+        if(node instanceof HasCompanyAiWorkflowExecLogMapper){
+            ((HasCompanyAiWorkflowExecLogMapper) node).setCompanyAiWorkflowExecLogMapper(companyAiWorkflowExecLogMapper);
+        }
 
     }
 }

+ 3 - 0
fs-service/src/main/resources/mapper/company/CompanyAiWorkflowExecMapper.xml

@@ -105,4 +105,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
+    <select id="selectByWorkflowInstanceId" resultType="CompanyAiWorkflowExec">
+        select * from company_ai_workflow_exec where workflow_instance_id = #{workflowInstanceId}
+    </select>
 </mapper>

+ 4 - 0
fs-service/src/main/resources/mapper/company/CompanyWorkflowEdgeMapper.xml

@@ -68,4 +68,8 @@
     <delete id="deleteCompanyWorkflowEdgeByWorkflowId" parameterType="Long">
         delete from company_ai_workflow_edge where workflow_id = #{workflowId}
     </delete>
+
+    <select id="selectListByWorkflowIdAndNodeKey" resultType="CompanyWorkflowEdge">
+        select * from company_ai_workflow_edge where workflow_id = #{workflowId} and source_node_key = #{nodeKey}
+    </select>
 </mapper>

+ 4 - 0
fs-service/src/main/resources/mapper/company/CompanyWorkflowNodeMapper.xml

@@ -86,4 +86,8 @@
     <select id="selectNodeByWorkflowIdAndNodeKey" resultType="CompanyWorkflowNode">
         select * from company_ai_workflow_node where workflow_id = #{workflowId} and node_key = #{nodeKey}
     </select>
+
+    <select id="selectNodeByNodeKey" resultType="CompanyWorkflowNode">
+        select * from company_ai_workflow_node where node_key = #{nodeKey}
+    </select>
 </mapper>