流程引擎骨架:INodeHandler接口 + NodeResult + 6个节点handler stub

This commit is contained in:
root
2026-03-17 23:45:26 +08:00
parent 194208a58b
commit 8242e1348e
8 changed files with 240 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
package com.ruoyi.wcs.flow.engine;
import java.util.Map;
/**
* 流程节点处理器接口
* 每种节点类型(start/api/plc/condition/wait/end)各实现一个
*/
public interface INodeHandler
{
/**
* 获取节点类型标识
*/
String getNodeType();
/**
* 执行节点逻辑
*
* @param configJson 节点配置JSON
* @param context 流程上下文(可传递变量)
* @return 执行结果,包含 success 标志和输出数据
*/
NodeResult execute(String configJson, Map<String, Object> context);
}

View File

@@ -0,0 +1,44 @@
package com.ruoyi.wcs.flow.engine;
/**
* 节点执行结果
*/
public class NodeResult
{
/** 是否成功 */
private boolean success;
/** 输出数据(JSON字符串) */
private String output;
/** 错误信息 */
private String errorMsg;
/** 下一个节点的条件分支标识(condition节点用) */
private String branchKey;
public static NodeResult ok(String output)
{
NodeResult r = new NodeResult();
r.success = true;
r.output = output;
return r;
}
public static NodeResult fail(String errorMsg)
{
NodeResult r = new NodeResult();
r.success = false;
r.errorMsg = errorMsg;
return r;
}
public boolean isSuccess() { return success; }
public void setSuccess(boolean success) { this.success = success; }
public String getOutput() { return output; }
public void setOutput(String output) { this.output = output; }
public String getErrorMsg() { return errorMsg; }
public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; }
public String getBranchKey() { return branchKey; }
public void setBranchKey(String branchKey) { this.branchKey = branchKey; }
}

View File

@@ -0,0 +1,29 @@
package com.ruoyi.wcs.flow.engine.handler;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ruoyi.wcs.flow.engine.INodeHandler;
import com.ruoyi.wcs.flow.engine.NodeResult;
/**
* API调用节点处理器
* TODO: 后续对接 WcsApiConfig,通过 RestTemplate 调用外部接口
*/
@Component
public class ApiNodeHandler implements INodeHandler
{
private static final Logger log = LoggerFactory.getLogger(ApiNodeHandler.class);
@Override
public String getNodeType() { return "api"; }
@Override
public NodeResult execute(String configJson, Map<String, Object> context)
{
log.info("[FlowEngine] API调用节点执行, config={}", configJson);
// TODO: 解析 configJson 获取 apiCode,查询 WcsApiConfig,发起 HTTP 请求
return NodeResult.ok("{\"msg\":\"api call stub\"}");
}
}

View File

@@ -0,0 +1,31 @@
package com.ruoyi.wcs.flow.engine.handler;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ruoyi.wcs.flow.engine.INodeHandler;
import com.ruoyi.wcs.flow.engine.NodeResult;
/**
* 条件判断节点处理器
* TODO: 后续解析 conditionExpr 表达式,返回分支标识
*/
@Component
public class ConditionNodeHandler implements INodeHandler
{
private static final Logger log = LoggerFactory.getLogger(ConditionNodeHandler.class);
@Override
public String getNodeType() { return "condition"; }
@Override
public NodeResult execute(String configJson, Map<String, Object> context)
{
log.info("[FlowEngine] 条件判断节点执行, config={}", configJson);
// TODO: 解析条件表达式,根据 context 变量判断走哪个分支
NodeResult result = NodeResult.ok("condition evaluated");
result.setBranchKey("default");
return result;
}
}

View File

@@ -0,0 +1,27 @@
package com.ruoyi.wcs.flow.engine.handler;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ruoyi.wcs.flow.engine.INodeHandler;
import com.ruoyi.wcs.flow.engine.NodeResult;
/**
* 结束节点处理器
*/
@Component
public class EndNodeHandler implements INodeHandler
{
private static final Logger log = LoggerFactory.getLogger(EndNodeHandler.class);
@Override
public String getNodeType() { return "end"; }
@Override
public NodeResult execute(String configJson, Map<String, Object> context)
{
log.info("[FlowEngine] 结束节点执行");
return NodeResult.ok("flow ended");
}
}

View File

@@ -0,0 +1,29 @@
package com.ruoyi.wcs.flow.engine.handler;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ruoyi.wcs.flow.engine.INodeHandler;
import com.ruoyi.wcs.flow.engine.NodeResult;
/**
* PLC读写节点处理器
* TODO: 后续对接 PLC 统一读写服务
*/
@Component
public class PlcNodeHandler implements INodeHandler
{
private static final Logger log = LoggerFactory.getLogger(PlcNodeHandler.class);
@Override
public String getNodeType() { return "plc"; }
@Override
public NodeResult execute(String configJson, Map<String, Object> context)
{
log.info("[FlowEngine] PLC读写节点执行, config={}", configJson);
// TODO: 解析 configJson 获取设备点位,读写 PLC
return NodeResult.ok("{\"msg\":\"plc rw stub\"}");
}
}

View File

@@ -0,0 +1,27 @@
package com.ruoyi.wcs.flow.engine.handler;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ruoyi.wcs.flow.engine.INodeHandler;
import com.ruoyi.wcs.flow.engine.NodeResult;
/**
* 开始节点处理器
*/
@Component
public class StartNodeHandler implements INodeHandler
{
private static final Logger log = LoggerFactory.getLogger(StartNodeHandler.class);
@Override
public String getNodeType() { return "start"; }
@Override
public NodeResult execute(String configJson, Map<String, Object> context)
{
log.info("[FlowEngine] 开始节点执行");
return NodeResult.ok("flow started");
}
}

View File

@@ -0,0 +1,29 @@
package com.ruoyi.wcs.flow.engine.handler;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ruoyi.wcs.flow.engine.INodeHandler;
import com.ruoyi.wcs.flow.engine.NodeResult;
/**
* 等待节点处理器
* TODO: 后续实现轮询等待条件满足(如等待PLC信号)
*/
@Component
public class WaitNodeHandler implements INodeHandler
{
private static final Logger log = LoggerFactory.getLogger(WaitNodeHandler.class);
@Override
public String getNodeType() { return "wait"; }
@Override
public NodeResult execute(String configJson, Map<String, Object> context)
{
log.info("[FlowEngine] 等待节点执行, config={}", configJson);
// TODO: 解析等待条件,轮询直到满足或超时
return NodeResult.ok("wait completed");
}
}