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