From 56b73f04325bdd44b043b24f90ed79e777438e02 Mon Sep 17 00:00:00 2001
From: may <1742057357@qq.com>
Date: Sun, 4 Oct 2026 11:32:16 +0800
Subject: [PATCH 1/2] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0warm-flow2.0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 6 +--
ruoyi-modules/ruoyi-workflow/pom.xml | 4 +-
.../domain/context/CompleteTaskContext.java | 6 ---
.../domain/context/TaskOperationContext.java | 11 ++--
.../handler/WorkflowPermissionHandler.java | 3 +-
.../listener/WorkflowGlobalListener.java | 38 ++++++-------
.../complete/CompleteAutoPassComponent.java | 27 +++++-----
.../complete/CompleteExecuteComponent.java | 33 +++++-------
.../operation/TaskOpExecuteComponent.java | 47 ++++++++++++----
.../operation/TaskOpPrepareComponent.java | 18 ++-----
.../liteflow/start/StartExecuteComponent.java | 23 ++++----
.../service/impl/FlwInstanceServiceImpl.java | 34 +++++++-----
.../service/impl/FlwTaskServiceImpl.java | 53 +++++++++++--------
13 files changed, 165 insertions(+), 138 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0d18cf3df..fdce2d8be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
3.3.5
- 1.8.9
+ 2.0.0
2.16.2.1
2.6.12
@@ -357,13 +357,13 @@
- org.dromara.warm
+ io.github.sgs98
warm-flow-mybatis-plus-sb4-starter
${warm-flow.version}
- org.dromara.warm
+ io.github.sgs98
warm-flow-plugin-ui-sb-web
${warm-flow.version}
diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml
index 814de3e96..23e2e2675 100644
--- a/ruoyi-modules/ruoyi-workflow/pom.xml
+++ b/ruoyi-modules/ruoyi-workflow/pom.xml
@@ -86,13 +86,13 @@
- org.dromara.warm
+ io.github.sgs98
warm-flow-mybatis-plus-sb4-starter
- org.dromara.warm
+ io.github.sgs98
warm-flow-plugin-ui-sb-web
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java
index c6f56a003..741e9edd5 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java
@@ -1,7 +1,6 @@
package org.dromara.workflow.domain.context;
import lombok.Data;
-import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.domain.bo.CompleteTaskBo;
@@ -31,11 +30,6 @@ public class CompleteTaskContext {
*/
private Instance instance;
- /**
- * Warm-Flow 办理参数,由参数构建节点生成并供执行、自动审批节点复用。
- */
- private FlowParams flowParams;
-
/**
* 流程实例是否开启自动审批,由参数构建节点从实例变量中解析。
*/
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java
index 73fa2de4c..0cb7cc246 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/TaskOperationContext.java
@@ -1,7 +1,7 @@
package org.dromara.workflow.domain.context;
import lombok.Data;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.workflow.common.enums.TaskOperationEnum;
@@ -33,9 +33,14 @@ public class TaskOperationContext {
private TaskOperationEnum operation;
/**
- * Warm-Flow 操作参数。
+ * 当前任务操作者。
*/
- private FlowParams flowParams;
+ private OperatorContext operator;
+
+ /**
+ * 当前操作说明。
+ */
+ private String message;
/**
* 当前任务。
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
index bebd4740c..30e3df6cc 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
@@ -8,7 +8,6 @@ import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.domain.UserDTO;
-import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.handler.PermissionHandler;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
@@ -32,7 +31,7 @@ public class WorkflowPermissionHandler implements PermissionHandler {
/**
* 办理人权限标识,比如用户,角色,部门等,用于校验是否有权限办理任务
- * 后续在{@link FlowParams#getPermissionFlag} 中获取
+ * 后续在流程上下文中获取。
* 返回当前用户权限集合
*
* @return 当前用户权限集合
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
index ab958035e..a4422990e 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
@@ -13,7 +13,7 @@ import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.system.api.UserService;
import org.dromara.warm.flow.core.FlowEngine;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.workflow.context.WorkflowContext;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task;
@@ -110,20 +110,20 @@ public class WorkflowGlobalListener implements GlobalListener {
public void assignment(ListenerVariable listenerVariable) {
Map variable = listenerVariable.getVariable();
List nextTasks = listenerVariable.getNextTasks();
- FlowParams flowParams = listenerVariable.getFlowParams();
+ WorkflowContext workflowContext = listenerVariable.getContext();
Definition definition = listenerVariable.getDefinition();
Instance instance = listenerVariable.getInstance();
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
- String hisStatus = flowParams != null ? flowParams.getHisStatus() : null;
+ String taskStatus = workflowContext != null ? workflowContext.getTaskStatus() : null;
for (Task flowTask : nextTasks) {
String nodeCode = flowTask.getNodeCode();
// 处理办理或退回时指定办理人的情况
- if (TaskStatusEnum.PASS.getStatus().equals(hisStatus)) {
- processTaskPermission(variable, flowTask, hisStatus);
- } else if (TaskStatusEnum.BACK.getStatus().equals(hisStatus)) {
- processTaskPermission(variable, flowTask, hisStatus);
+ if (TaskStatusEnum.PASS.getStatus().equals(taskStatus)) {
+ processTaskPermission(variable, flowTask, taskStatus);
+ } else if (TaskStatusEnum.BACK.getStatus().equals(taskStatus)) {
+ processTaskPermission(variable, flowTask, taskStatus);
}
// 如果是申请节点,则把启动人添加到办理人
@@ -183,16 +183,16 @@ public class WorkflowGlobalListener implements GlobalListener {
Task task = listenerVariable.getTask();
List nextTasks = listenerVariable.getNextTasks();
Map params = new HashMap<>();
- FlowParams flowParams = listenerVariable.getFlowParams();
+ WorkflowContext workflowContext = listenerVariable.getContext();
Map variable = new HashMap<>();
- if (ObjectUtil.isNotNull(flowParams)) {
+ if (ObjectUtil.isNotNull(workflowContext)) {
// 历史任务扩展(通常为附件)
- params.put("hisTaskExt", flowParams.getHisTaskExt());
+ params.put("hisTaskExt", workflowContext.getExt());
// 办理人
- params.put("handler", flowParams.getHandler());
+ params.put("handler", workflowContext.getHandler());
// 办理意见
- params.put("message", flowParams.getMessage());
- variable = flowParams.getVariable();
+ params.put("message", workflowContext.getMessage());
+ variable = workflowContext.getVariables();
}
//申请人提交事件
Boolean submit = MapUtil.getBool(variable, FlowConstant.SUBMIT);
@@ -224,11 +224,11 @@ public class WorkflowGlobalListener implements GlobalListener {
flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, nextTask, params);
}
}
- if (ObjectUtil.isNull(flowParams)) {
+ if (ObjectUtil.isNull(workflowContext)) {
return;
}
// 只有办理或者退回的时候才执行消息通知和抄送
- if (!TaskStatusEnum.isPassOrBack(flowParams.getHisStatus())) {
+ if (!TaskStatusEnum.isPassOrBack(workflowContext.getTaskStatus())) {
return;
}
if (ObjectUtil.isNull(variable)) {
@@ -246,7 +246,7 @@ public class WorkflowGlobalListener implements GlobalListener {
});
String notice = MapUtil.getStr(variable, FlowConstant.MESSAGE_NOTICE);
// 退回到申请人时只保留“已退回”结果消息,避免再追加一条“新的待办”形成重复提醒。
- if (shouldSendTaskMessage(flowParams, definition, nextTasks)) {
+ if (shouldSendTaskMessage(workflowContext, definition, nextTasks)) {
SpringUtils.context().publishEvent(new WorkflowTaskMessageEvent(definition.getFlowName(), instance.getId(), messageType, notice));
}
}
@@ -261,13 +261,13 @@ public class WorkflowGlobalListener implements GlobalListener {
/**
* 判断是否需要发送后续待办消息。
*
- * @param flowParams 流程参数
+ * @param workflowContext 流程执行上下文
* @param definition 流程定义
* @param nextTasks 后续任务列表
* @return 是否发送待办消息
*/
- private boolean shouldSendTaskMessage(FlowParams flowParams, Definition definition, List nextTasks) {
- if (flowParams == null || !TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) {
+ private boolean shouldSendTaskMessage(WorkflowContext workflowContext, Definition definition, List nextTasks) {
+ if (workflowContext == null || !TaskStatusEnum.BACK.getStatus().equals(workflowContext.getTaskStatus())) {
return true;
}
if (CollUtil.isEmpty(nextTasks) || nextTasks.size() != 1) {
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java
index cb21570f0..7768e3677 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java
@@ -10,12 +10,13 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.query.QueryBuilder;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.FlowEngine;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.workflow.command.CompleteCommand;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.warm.flow.core.entity.User;
-import org.dromara.warm.flow.core.service.TaskService;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.ConditionalOnEnable;
+import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.context.CompleteTaskContext;
import java.util.Collections;
@@ -36,24 +37,22 @@ import static org.dromara.workflow.common.constant.FlowConstant.*;
@LiteflowComponent("completeAutoPass")
public class CompleteAutoPassComponent extends NodeComponent {
- private final TaskService taskService;
private final FlowTaskMapper flowTaskMapper;
@Override
public void process() {
CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
FlowTask flowTask = context.getFlowTask();
- autoPass(flowTask.getId(), context.getFlowParams(), flowTask.getInstanceId());
+ autoPass(flowTask.getId(), flowTask.getInstanceId());
}
/**
* 递归跳过当前处理人的后续任务。
*
* @param taskId 本轮已处理任务 id,用于避免重复跳过同一任务
- * @param flowParams 当前办理参数,会在自动审批时覆盖为自动审批消息和空抄送变量
* @param instanceId 流程实例 id
*/
- private void autoPass(Long taskId, FlowParams flowParams, Long instanceId) {
+ private void autoPass(Long taskId, Long instanceId) {
List flowTaskList = selectByInstId(instanceId);
if (CollUtil.isEmpty(flowTaskList)) {
return;
@@ -74,15 +73,15 @@ public class CompleteAutoPassComponent extends NodeComponent {
continue;
}
// 自动审批不继承人工办理时的抄送和消息通知,避免重复发送业务消息。
- flowParams
- .message("流程引擎自动审批!")
- .variable(Map.of(
- SUBMIT, false,
- FLOW_COPY_LIST, Collections.emptyList(),
- MESSAGE_NOTICE, StringUtils.EMPTY));
- taskService.skip(task.getId(), flowParams);
+ CompleteCommand command = new CompleteCommand();
+ command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
+ command.setTaskId(task.getId());
+ command.setMessage("流程引擎自动审批!");
+ command.setVariables(Map.of(SUBMIT, false, FLOW_COPY_LIST, Collections.emptyList(), MESSAGE_NOTICE, StringUtils.EMPTY));
+ command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
+ FlowEngine.workflow().complete(command);
// 跳过后可能生成新的后续任务,继续扫描直到当前登录人不再有可自动办理任务。
- autoPass(task.getId(), flowParams, instanceId);
+ autoPass(task.getId(), instanceId);
}
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java
index a6cd00dd3..2ecc09b12 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java
@@ -5,9 +5,9 @@ import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.enums.BusinessStatusEnum;
-import org.dromara.warm.flow.core.dto.FlowParams;
-import org.dromara.warm.flow.core.enums.SkipType;
-import org.dromara.warm.flow.core.service.TaskService;
+import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.workflow.command.CompleteCommand;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.CompleteTaskBo;
@@ -27,28 +27,23 @@ import static org.dromara.workflow.common.constant.FlowConstant.*;
@LiteflowComponent("completeExecute")
public class CompleteExecuteComponent extends NodeComponent {
- private final TaskService taskService;
-
@Override
public void process() {
CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
CompleteTaskBo completeTaskBo = context.getCompleteTaskBo();
Map variables = completeTaskBo.getVariables();
- FlowParams flowParams = FlowParams.build()
- .handler(completeTaskBo.getHandler())
- .variable(variables)
- .ignore(Convert.toBool(variables.getOrDefault(VAR_IGNORE, false)))
- .ignoreDepute(Convert.toBool(variables.getOrDefault(VAR_IGNORE_DEPUTE, false)))
- .ignoreCooperate(Convert.toBool(variables.getOrDefault(VAR_IGNORE_COOPERATE, false)))
- .skipType(SkipType.PASS.getKey())
- .message(completeTaskBo.getMessage())
- .flowStatus(BusinessStatusEnum.WAITING.getStatus())
- .hisStatus(TaskStatusEnum.PASS.getStatus())
- .hisTaskExt(completeTaskBo.getFileId());
-
- context.setFlowParams(flowParams);
+ CompleteCommand command = new CompleteCommand();
+ OperatorContext operator = new OperatorContext(completeTaskBo.getHandler());
+ operator.setIgnore(Convert.toBool(variables.getOrDefault(VAR_IGNORE, false)));
+ command.setOperator(operator);
+ command.setTaskId(context.getFlowTask().getId());
+ command.setVariables(variables);
+ command.setMessage(completeTaskBo.getMessage());
+ command.setExt(completeTaskBo.getFileId());
+ command.setFlowStatus(BusinessStatusEnum.WAITING.getStatus());
+ command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
context.setAutoPass(Convert.toBool(context.getInstance().getVariableMap().getOrDefault(AUTO_PASS, false)));
- taskService.skip(context.getFlowTask().getId(), flowParams);
+ FlowEngine.workflow().complete(command);
}
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java
index dc2b77825..7ec6d6f57 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java
@@ -3,7 +3,12 @@ package org.dromara.workflow.liteflow.operation;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import lombok.RequiredArgsConstructor;
-import org.dromara.warm.flow.core.service.TaskService;
+import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.workflow.command.AddSignerCommand;
+import org.dromara.warm.flow.core.workflow.command.DelegateCommand;
+import org.dromara.warm.flow.core.workflow.command.RemoveSignerCommand;
+import org.dromara.warm.flow.core.workflow.command.TransferCommand;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.context.TaskOperationContext;
@@ -18,29 +23,49 @@ import org.dromara.workflow.domain.context.TaskOperationContext;
@LiteflowComponent("taskOpExecute")
public class TaskOpExecuteComponent extends NodeComponent {
- private final TaskService taskService;
-
@Override
public void process() {
TaskOperationContext context = getContextBean(TaskOperationContext.class);
Long taskId = context.getTaskOperationBo().getTaskId();
boolean result = false;
+ OperatorContext operator = context.getOperator();
+ String message = context.getMessage();
switch (context.getOperation()) {
case DELEGATE_TASK -> {
- context.getFlowParams().hisStatus(TaskStatusEnum.DEPUTE.getStatus());
- result = taskService.depute(taskId, context.getFlowParams());
+ DelegateCommand command = new DelegateCommand();
+ command.setOperator(operator);
+ command.setTaskId(taskId);
+ command.setTargetHandler(context.getTaskOperationBo().getUserId());
+ command.setMessage(message);
+ command.setTaskStatus(TaskStatusEnum.DEPUTE.getStatus());
+ result = FlowEngine.workflow().delegate(command).isSuccess();
}
case TRANSFER_TASK -> {
- context.getFlowParams().hisStatus(TaskStatusEnum.TRANSFER.getStatus());
- result = taskService.transfer(taskId, context.getFlowParams());
+ TransferCommand command = new TransferCommand();
+ command.setOperator(operator);
+ command.setTaskId(taskId);
+ command.setTargetHandler(context.getTaskOperationBo().getUserId());
+ command.setMessage(message);
+ command.setTaskStatus(TaskStatusEnum.TRANSFER.getStatus());
+ result = FlowEngine.workflow().transfer(command).isSuccess();
}
case ADD_SIGNATURE -> {
- context.getFlowParams().hisStatus(TaskStatusEnum.SIGN.getStatus());
- result = taskService.addSignature(taskId, context.getFlowParams());
+ AddSignerCommand command = new AddSignerCommand();
+ command.setOperator(operator);
+ command.setTaskId(taskId);
+ command.setTargetHandlers(context.getTaskOperationBo().getUserIds());
+ command.setMessage(message);
+ command.setTaskStatus(TaskStatusEnum.SIGN.getStatus());
+ result = FlowEngine.workflow().addSigner(command).isSuccess();
}
case REDUCTION_SIGNATURE -> {
- context.getFlowParams().hisStatus(TaskStatusEnum.SIGN_OFF.getStatus());
- result = taskService.reductionSignature(taskId, context.getFlowParams());
+ RemoveSignerCommand command = new RemoveSignerCommand();
+ command.setOperator(operator);
+ command.setTaskId(taskId);
+ command.setTargetHandlers(context.getTaskOperationBo().getUserIds());
+ command.setMessage(message);
+ command.setTaskStatus(TaskStatusEnum.SIGN_OFF.getStatus());
+ result = FlowEngine.workflow().removeSigner(command).isSuccess();
}
}
context.setResult(result);
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java
index 4cfc0d6a2..aca3c6871 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpPrepareComponent.java
@@ -8,14 +8,12 @@ import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.TaskOperationEnum;
import org.dromara.workflow.domain.bo.TaskOperationBo;
import org.dromara.workflow.domain.context.TaskOperationContext;
-import java.util.Collections;
-
/**
* 准备任务操作参数。
*
@@ -42,16 +40,10 @@ public class TaskOpPrepareComponent extends NodeComponent {
case ADD_SIGNATURE, REDUCTION_SIGNATURE -> ValidatorUtils.validate(bo, EditGroup.class);
}
- FlowParams flowParams = FlowParams.build().message(bo.getMessage());
- if (LoginHelper.isSuperAdmin()) {
- flowParams.ignore(true);
- }
- switch (op) {
- case DELEGATE_TASK, TRANSFER_TASK -> flowParams.addHandlers(Collections.singletonList(bo.getUserId()));
- case ADD_SIGNATURE -> flowParams.addHandlers(bo.getUserIds());
- case REDUCTION_SIGNATURE -> flowParams.reductionHandlers(bo.getUserIds());
- }
- context.setFlowParams(flowParams);
+ OperatorContext operator = new OperatorContext(LoginHelper.getUserIdStr());
+ operator.setIgnore(LoginHelper.isSuperAdmin());
+ context.setOperator(operator);
+ context.setMessage(bo.getMessage());
}
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java
index eacbcee8b..7adb8de0f 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java
@@ -6,14 +6,17 @@ import com.yomahub.liteflow.core.NodeComponent;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task;
-import org.dromara.warm.flow.core.service.InsService;
import org.dromara.warm.flow.core.service.TaskService;
+import org.dromara.warm.flow.core.workflow.command.StartCommand;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
+import org.dromara.warm.flow.core.workflow.result.WorkflowResult;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.api.domain.StartProcessReturnDTO;
import org.dromara.workflow.common.ConditionalOnEnable;
+import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.FlowInstanceBizExt;
import org.dromara.workflow.domain.context.StartProcessContext;
import org.dromara.workflow.mapper.FlwInstanceBizExtMapper;
@@ -30,19 +33,21 @@ import java.util.List;
@LiteflowComponent("startExecute")
public class StartExecuteComponent extends NodeComponent {
- private final InsService insService;
private final TaskService taskService;
private final FlwInstanceBizExtMapper flwInstanceBizExtMapper;
@Override
public void process() {
StartProcessContext context = getContextBean(StartProcessContext.class);
- FlowParams flowParams = FlowParams.build()
- .handler(context.getStartProcessBo().getHandler())
- .flowCode(context.getStartProcessBo().getFlowCode())
- .variable(context.getVariables())
- .flowStatus(BusinessStatusEnum.DRAFT.getStatus());
- Instance instance = insService.start(context.getBusinessId(), flowParams);
+ StartCommand command = new StartCommand();
+ command.setBusinessId(context.getBusinessId());
+ command.setFlowCode(context.getStartProcessBo().getFlowCode());
+ command.setOperator(new OperatorContext(context.getStartProcessBo().getHandler()));
+ command.setVariables(context.getVariables());
+ command.setFlowStatus(BusinessStatusEnum.DRAFT.getStatus());
+ command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
+ WorkflowResult result = FlowEngine.workflow().start(command);
+ Instance instance = FlowEngine.insService().getById(result.getInstanceId());
context.setInstance(instance);
saveBizExt(context, instance);
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
index 8a6972e70..22e2578af 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
@@ -20,8 +20,11 @@ import org.dromara.common.mybatis.core.query.LambdaJoinQueryBuilder;
import org.dromara.common.mybatis.core.query.QueryBuilder;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.workflow.command.RevokeCommand;
+import org.dromara.warm.flow.core.workflow.command.TerminateCommand;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.warm.flow.core.constant.ExceptionCons;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.workflow.context.WorkflowContext;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task;
@@ -267,13 +270,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
throw new ServiceException("权限不足,无法撤销流程!");
}
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
- FlowParams flowParams = FlowParams.build()
- .message(bo.message())
- .flowStatus(BusinessStatusEnum.CANCEL.getStatus())
- .hisStatus(BusinessStatusEnum.CANCEL.getStatus())
- .handler(userIdStr)
- .ignore(true);
- taskService.revoke(instance.getId(), flowParams);
+ RevokeCommand command = new RevokeCommand();
+ command.setOperator(new OperatorContext(userIdStr));
+ command.getOperator().setIgnore(true);
+ command.setInstanceId(instance.getId());
+ command.setMessage(bo.message());
+ command.setFlowStatus(BusinessStatusEnum.CANCEL.getStatus());
+ command.setTaskStatus(BusinessStatusEnum.CANCEL.getStatus());
+ FlowEngine.workflow().revoke(command);
return true;
}
@@ -452,12 +456,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
if (instance != null) {
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
}
- FlowParams flowParams = FlowParams.build()
- .message(bo.comment())
- .flowStatus(BusinessStatusEnum.INVALID.getStatus())
- .hisStatus(TaskStatusEnum.INVALID.getStatus())
- .ignore(true);
- taskService.terminationByInsId(bo.id(), flowParams);
+ TerminateCommand command = new TerminateCommand();
+ command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
+ command.getOperator().setIgnore(true);
+ command.setInstanceId(bo.id());
+ command.setMessage(bo.comment());
+ command.setFlowStatus(BusinessStatusEnum.INVALID.getStatus());
+ command.setTaskStatus(TaskStatusEnum.INVALID.getStatus());
+ FlowEngine.workflow().terminate(command);
return true;
}
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
index ea378a981..0854a07c6 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
@@ -23,9 +23,12 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.UserService;
import org.dromara.system.api.domain.UserDTO;
import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.workflow.command.RejectCommand;
+import org.dromara.warm.flow.core.workflow.command.TerminateCommand;
+import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.warm.flow.core.constant.ExceptionCons;
import org.dromara.warm.flow.core.dto.FlowCombine;
-import org.dromara.warm.flow.core.dto.FlowParams;
+import org.dromara.warm.flow.core.workflow.context.WorkflowContext;
import org.dromara.warm.flow.core.entity.*;
import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.SkipType;
@@ -161,12 +164,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
long taskId = IdGeneratorUtil.nextLongId();
task.setId(taskId);
task.setNodeName("【抄送】" + task.getNodeName());
- Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() - 1000);
- FlowParams flowParams = FlowParams.build()
- .skipType(SkipType.NONE.getKey())
- .hisStatus(TaskStatusEnum.COPY.getStatus())
- .message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getNickName));
- HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams);
+ // 抄送记录展示在触发抄送的办理记录之前,历史列表按更新时间倒序排列。
+ Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() + 1000);
+ WorkflowContext workflowContext = new WorkflowContext();
+ workflowContext.setTaskStatus(TaskStatusEnum.COPY.getStatus());
+ workflowContext.setMessage("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getNickName));
+ HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, workflowContext, SkipType.NONE.getKey());
hisTask.setCreateTime(updateTime);
hisTask.setUpdateTime(updateTime);
hisTaskService.save(hisTask);
@@ -315,15 +318,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
variable.put(MESSAGE_TYPE, messageType);
variable.put(MESSAGE_NOTICE, notice);
- FlowParams flowParams = FlowParams.build()
- .nodeCode(bo.getNodeCode())
- .variable(variable)
- .message(message)
- .skipType(SkipType.REJECT.getKey())
- .flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus())
- .hisStatus(TaskStatusEnum.BACK.getStatus())
- .hisTaskExt(bo.getFileId());
- taskService.skip(task.getId(), flowParams);
+ RejectCommand command = new RejectCommand();
+ command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
+ command.setTaskId(task.getId());
+ command.setTargetNodeCode(bo.getNodeCode());
+ command.setVariables(variable);
+ command.setMessage(message);
+ command.setExt(bo.getFileId());
+ command.setFlowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus());
+ command.setTaskStatus(TaskStatusEnum.BACK.getStatus());
+ FlowEngine.workflow().reject(command);
return true;
}
@@ -479,11 +483,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (ObjectUtil.isNotNull(instance)) {
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
}
- FlowParams flowParams = FlowParams.build()
- .message(bo.comment())
- .flowStatus(BusinessStatusEnum.TERMINATION.getStatus())
- .hisStatus(TaskStatusEnum.TERMINATION.getStatus());
- taskService.termination(taskId, flowParams);
+ TerminateCommand command = new TerminateCommand();
+ command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
+ command.setTaskId(taskId);
+ command.setMessage(bo.comment());
+ command.setFlowStatus(BusinessStatusEnum.TERMINATION.getStatus());
+ command.setTaskStatus(TaskStatusEnum.TERMINATION.getStatus());
+ FlowEngine.workflow().terminate(command);
return true;
}
@@ -587,9 +593,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType()));
if (CollUtil.isNotEmpty(nextNodeList)) {
//构建以下节点数据
- List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build()));
+ List buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance
+ , definition, new WorkflowContext(), SkipType.PASS.getKey()));
//办理人变量替换
- ExpressionUtil.evalVariable(buildNextTaskList, FlowParams.build().variable(mergeVariable));
+ ExpressionUtil.evalVariable(buildNextTaskList, mergeVariable, null, false);
for (FlowNode flowNode : nextFlowNodes) {
StreamUtils.findFirst(buildNextTaskList, t -> t.getNodeCode().equals(flowNode.getNodeCode()))
.ifPresent(first -> {
From 1e9815a0d5393e664ac7433201ed00073fb75a99 Mon Sep 17 00:00:00 2001
From: xy <455640711@qq.com>
Date: Fri, 9 Oct 2026 13:38:00 +0800
Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20downloadCode=20?=
=?UTF-8?q?=E4=B8=A4=E4=B8=AA=E9=87=8D=E8=BD=BD=20ZipOutputStream=20?=
=?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=97=B6=E6=9C=AA=E5=85=B3=E9=97=AD=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dromara/gen/service/GenTableServiceImpl.java | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java
index bfd5ff909..27a9a609c 100644
--- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java
+++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java
@@ -341,8 +341,11 @@ public class GenTableServiceImpl implements IGenTableService {
public byte[] downloadCode(Long tableId) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
- writeCodeToZip(tableId, zip);
- IoUtil.close(zip);
+ try {
+ writeCodeToZip(tableId, zip);
+ } finally {
+ IoUtil.close(zip);
+ }
return outputStream.toByteArray();
}
@@ -408,10 +411,13 @@ public class GenTableServiceImpl implements IGenTableService {
public byte[] downloadCode(String[] tableIds) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
- for (String tableId : tableIds) {
- writeCodeToZip(Long.parseLong(tableId), zip);
+ try {
+ for (String tableId : tableIds) {
+ writeCodeToZip(Long.parseLong(tableId), zip);
+ }
+ } finally {
+ IoUtil.close(zip);
}
- IoUtil.close(zip);
return outputStream.toByteArray();
}