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());
+ }
+ }
+
+}