From 53f857714dec37b0cf39132d722eb60b024a0c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Thu, 2 Jul 2026 14:37:53 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E6=96=B0=E5=A2=9E=20ruoyi-common-litefl?= =?UTF-8?q?ow=20=E8=A7=84=E5=88=99=E5=BC=95=E6=93=8E=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++++ ruoyi-common/pom.xml | 1 + ruoyi-common/ruoyi-common-bom/pom.xml | 7 ++++ ruoyi-common/ruoyi-common-liteflow/pom.xml | 31 ++++++++++++++ .../component/AlwaysFalseComponent.java | 19 +++++++++ .../component/AlwaysTrueComponent.java | 19 +++++++++ .../component/ContextRequiredComponent.java | 22 ++++++++++ .../liteflow/component/FailComponent.java | 40 +++++++++++++++++++ .../liteflow/component/NoopComponent.java | 19 +++++++++ .../liteflow/core/FailMessageProvider.java | 17 ++++++++ .../common/liteflow/utils/LiteFlowUtils.java | 35 ++++++++++++++++ 11 files changed, 218 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-liteflow/pom.xml create mode 100644 ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysFalseComponent.java create mode 100644 ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysTrueComponent.java create mode 100644 ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/ContextRequiredComponent.java create mode 100644 ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/FailComponent.java create mode 100644 ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/NoopComponent.java create mode 100644 ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/core/FailMessageProvider.java create mode 100644 ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/utils/LiteFlowUtils.java diff --git a/pom.xml b/pom.xml index a97b61698..0b910d34b 100644 --- a/pom.xml +++ b/pom.xml @@ -63,6 +63,7 @@ 3.3.5 1.8.8 + 2.16.0 2.6.6 @@ -358,6 +359,13 @@ ${warm-flow.version} + + + com.yomahub + liteflow-spring-boot-starter + ${liteflow.version} + + org.dromara.mica-mqtt diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 2d1faa988..7db451d40 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -37,6 +37,7 @@ ruoyi-common-json ruoyi-common-encrypt ruoyi-common-push + ruoyi-common-liteflow ruoyi-common-mqtt ruoyi-common-ai ruoyi-common-mcp diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 0e3d528ce..d111ab800 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -159,6 +159,13 @@ ${revision} + + + org.dromara + ruoyi-common-liteflow + ${revision} + + org.dromara diff --git a/ruoyi-common/ruoyi-common-liteflow/pom.xml b/ruoyi-common/ruoyi-common-liteflow/pom.xml new file mode 100644 index 000000000..fc598aa27 --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/pom.xml @@ -0,0 +1,31 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-liteflow + + + ruoyi-common-liteflow LiteFlow规则编排模块 + + + + + + org.dromara + ruoyi-common-core + + + + + com.yomahub + liteflow-spring-boot-starter + + + diff --git a/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysFalseComponent.java b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysFalseComponent.java new file mode 100644 index 000000000..be31e1508 --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysFalseComponent.java @@ -0,0 +1,19 @@ +package org.dromara.common.liteflow.component; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; + +/** + * LiteFlow 恒为 false 的条件节点。 + * + * @author Lion Li + */ +@LiteflowComponent("alwaysFalse") +public class AlwaysFalseComponent extends NodeBooleanComponent { + + @Override + public boolean processBoolean() { + return false; + } + +} diff --git a/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysTrueComponent.java b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysTrueComponent.java new file mode 100644 index 000000000..a923a5195 --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/AlwaysTrueComponent.java @@ -0,0 +1,19 @@ +package org.dromara.common.liteflow.component; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; + +/** + * LiteFlow 恒为 true 的条件节点。 + * + * @author Lion Li + */ +@LiteflowComponent("alwaysTrue") +public class AlwaysTrueComponent extends NodeBooleanComponent { + + @Override + public boolean processBoolean() { + return true; + } + +} diff --git a/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/ContextRequiredComponent.java b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/ContextRequiredComponent.java new file mode 100644 index 000000000..c49b2eb30 --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/ContextRequiredComponent.java @@ -0,0 +1,22 @@ +package org.dromara.common.liteflow.component; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import org.dromara.common.core.exception.ServiceException; + +/** + * LiteFlow 上下文必填校验节点。 + * + * @author Lion Li + */ +@LiteflowComponent("contextRequired") +public class ContextRequiredComponent extends NodeComponent { + + @Override + public void process() { + if (getRequestData() == null) { + throw new ServiceException("LiteFlow 上下文不能为空"); + } + } + +} diff --git a/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/FailComponent.java b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/FailComponent.java new file mode 100644 index 000000000..b56780a5f --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/FailComponent.java @@ -0,0 +1,40 @@ +package org.dromara.common.liteflow.component; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.liteflow.core.FailMessageProvider; + +/** + * LiteFlow 失败节点,用于显式表达链路分支不可继续执行。 + * + * @author Lion Li + */ +@LiteflowComponent("fail") +public class FailComponent extends NodeComponent { + + private static final String DEFAULT_MESSAGE = "LiteFlow 链路执行失败"; + + @Override + public void process() { + throw new ServiceException(getFailMessage()); + } + + /** + * 优先从上下文读取业务失败提示,未提供时使用默认提示。 + * + * @return 失败提示 + */ + private String getFailMessage() { + Object requestData = getRequestData(); + if (requestData instanceof FailMessageProvider provider) { + String message = provider.getFailMessage(); + if (StringUtils.isNotBlank(message)) { + return message; + } + } + return DEFAULT_MESSAGE; + } + +} diff --git a/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/NoopComponent.java b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/NoopComponent.java new file mode 100644 index 000000000..d83519a5b --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/component/NoopComponent.java @@ -0,0 +1,19 @@ +package org.dromara.common.liteflow.component; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; + +/** + * LiteFlow 空节点,用于显式表达无需处理的分支。 + * + * @author Lion Li + */ +@LiteflowComponent("noop") +public class NoopComponent extends NodeComponent { + + @Override + public void process() { + // no-op + } + +} diff --git a/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/core/FailMessageProvider.java b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/core/FailMessageProvider.java new file mode 100644 index 000000000..1e79c2d62 --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/core/FailMessageProvider.java @@ -0,0 +1,17 @@ +package org.dromara.common.liteflow.core; + +/** + * LiteFlow 失败提示提供者。 + * + * @author Lion Li + */ +public interface FailMessageProvider { + + /** + * 获取公共失败节点抛出的业务提示。 + * + * @return 失败提示 + */ + String getFailMessage(); + +} diff --git a/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/utils/LiteFlowUtils.java b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/utils/LiteFlowUtils.java new file mode 100644 index 000000000..61f0f334e --- /dev/null +++ b/ruoyi-common/ruoyi-common-liteflow/src/main/java/org/dromara/common/liteflow/utils/LiteFlowUtils.java @@ -0,0 +1,35 @@ +package org.dromara.common.liteflow.utils; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; + +/** + * LiteFlow 执行工具。 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LiteFlowUtils { + + /** + * 执行 LiteFlow 链路,并按业务异常语义透传失败原因。 + * + * @param chainId 链路标识 + * @param context 链路上下文 + */ + public static void execute(String chainId, Object context) { + LiteflowResponse response = SpringUtils.getBean(FlowExecutor.class).execute2Resp(chainId, context); + if (!response.isSuccess()) { + Exception cause = response.getCause(); + if (cause instanceof RuntimeException runtimeException) { + throw runtimeException; + } + throw new ServiceException(cause != null ? cause.getMessage() : response.getMessage()); + } + } + +}