mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-11-02 13:31:49 +08:00
update 更新warm-flow2.0
This commit is contained in:
parent
9227f626a3
commit
56b73f0432
6
pom.xml
6
pom.xml
@ -62,7 +62,7 @@
|
|||||||
<!-- SMS 配置 -->
|
<!-- SMS 配置 -->
|
||||||
<sms4j.version>3.3.5</sms4j.version>
|
<sms4j.version>3.3.5</sms4j.version>
|
||||||
<!-- 工作流配置 -->
|
<!-- 工作流配置 -->
|
||||||
<warm-flow.version>1.8.9</warm-flow.version>
|
<warm-flow.version>2.0.0</warm-flow.version>
|
||||||
<liteflow.version>2.16.2.1</liteflow.version>
|
<liteflow.version>2.16.2.1</liteflow.version>
|
||||||
<!-- mqtt客户端 -->
|
<!-- mqtt客户端 -->
|
||||||
<mica-mqtt.version>2.6.12</mica-mqtt.version>
|
<mica-mqtt.version>2.6.12</mica-mqtt.version>
|
||||||
@ -357,13 +357,13 @@
|
|||||||
|
|
||||||
<!-- Warm-Flow国产工作流引擎, 在线文档:http://warm-flow.cn/ -->
|
<!-- Warm-Flow国产工作流引擎, 在线文档:http://warm-flow.cn/ -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.warm</groupId>
|
<groupId>io.github.sgs98</groupId>
|
||||||
<artifactId>warm-flow-mybatis-plus-sb4-starter</artifactId>
|
<artifactId>warm-flow-mybatis-plus-sb4-starter</artifactId>
|
||||||
<version>${warm-flow.version}</version>
|
<version>${warm-flow.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- Warm-Flow UI 插件 -->
|
<!-- Warm-Flow UI 插件 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.warm</groupId>
|
<groupId>io.github.sgs98</groupId>
|
||||||
<artifactId>warm-flow-plugin-ui-sb-web</artifactId>
|
<artifactId>warm-flow-plugin-ui-sb-web</artifactId>
|
||||||
<version>${warm-flow.version}</version>
|
<version>${warm-flow.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|||||||
@ -86,13 +86,13 @@
|
|||||||
|
|
||||||
<!-- Warm-Flow 工作流引擎 -->
|
<!-- Warm-Flow 工作流引擎 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.warm</groupId>
|
<groupId>io.github.sgs98</groupId>
|
||||||
<artifactId>warm-flow-mybatis-plus-sb4-starter</artifactId>
|
<artifactId>warm-flow-mybatis-plus-sb4-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Warm-Flow UI 插件 -->
|
<!-- Warm-Flow UI 插件 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara.warm</groupId>
|
<groupId>io.github.sgs98</groupId>
|
||||||
<artifactId>warm-flow-plugin-ui-sb-web</artifactId>
|
<artifactId>warm-flow-plugin-ui-sb-web</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
package org.dromara.workflow.domain.context;
|
package org.dromara.workflow.domain.context;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.dromara.warm.flow.core.dto.FlowParams;
|
|
||||||
import org.dromara.warm.flow.core.entity.Instance;
|
import org.dromara.warm.flow.core.entity.Instance;
|
||||||
import org.dromara.warm.flow.orm.entity.FlowTask;
|
import org.dromara.warm.flow.orm.entity.FlowTask;
|
||||||
import org.dromara.workflow.domain.bo.CompleteTaskBo;
|
import org.dromara.workflow.domain.bo.CompleteTaskBo;
|
||||||
@ -31,11 +30,6 @@ public class CompleteTaskContext {
|
|||||||
*/
|
*/
|
||||||
private Instance instance;
|
private Instance instance;
|
||||||
|
|
||||||
/**
|
|
||||||
* Warm-Flow 办理参数,由参数构建节点生成并供执行、自动审批节点复用。
|
|
||||||
*/
|
|
||||||
private FlowParams flowParams;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程实例是否开启自动审批,由参数构建节点从实例变量中解析。
|
* 流程实例是否开启自动审批,由参数构建节点从实例变量中解析。
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package org.dromara.workflow.domain.context;
|
package org.dromara.workflow.domain.context;
|
||||||
|
|
||||||
import lombok.Data;
|
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.core.entity.Task;
|
||||||
import org.dromara.warm.flow.orm.entity.FlowNode;
|
import org.dromara.warm.flow.orm.entity.FlowNode;
|
||||||
import org.dromara.workflow.common.enums.TaskOperationEnum;
|
import org.dromara.workflow.common.enums.TaskOperationEnum;
|
||||||
@ -33,9 +33,14 @@ public class TaskOperationContext {
|
|||||||
private TaskOperationEnum operation;
|
private TaskOperationEnum operation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Warm-Flow 操作参数。
|
* 当前任务操作者。
|
||||||
*/
|
*/
|
||||||
private FlowParams flowParams;
|
private OperatorContext operator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前操作说明。
|
||||||
|
*/
|
||||||
|
private String message;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当前任务。
|
* 当前任务。
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import org.dromara.common.core.utils.StreamUtils;
|
|||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.system.api.domain.UserDTO;
|
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.warm.flow.core.handler.PermissionHandler;
|
||||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||||
import org.dromara.workflow.service.IFlwTaskAssigneeService;
|
import org.dromara.workflow.service.IFlwTaskAssigneeService;
|
||||||
@ -32,7 +31,7 @@ public class WorkflowPermissionHandler implements PermissionHandler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 办理人权限标识,比如用户,角色,部门等,用于校验是否有权限办理任务
|
* 办理人权限标识,比如用户,角色,部门等,用于校验是否有权限办理任务
|
||||||
* 后续在{@link FlowParams#getPermissionFlag} 中获取
|
* 后续在流程上下文中获取。
|
||||||
* 返回当前用户权限集合
|
* 返回当前用户权限集合
|
||||||
*
|
*
|
||||||
* @return 当前用户权限集合
|
* @return 当前用户权限集合
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import org.dromara.common.core.utils.StreamUtils;
|
|||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.system.api.UserService;
|
import org.dromara.system.api.UserService;
|
||||||
import org.dromara.warm.flow.core.FlowEngine;
|
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.Definition;
|
||||||
import org.dromara.warm.flow.core.entity.Instance;
|
import org.dromara.warm.flow.core.entity.Instance;
|
||||||
import org.dromara.warm.flow.core.entity.Task;
|
import org.dromara.warm.flow.core.entity.Task;
|
||||||
@ -110,20 +110,20 @@ public class WorkflowGlobalListener implements GlobalListener {
|
|||||||
public void assignment(ListenerVariable listenerVariable) {
|
public void assignment(ListenerVariable listenerVariable) {
|
||||||
Map<String, Object> variable = listenerVariable.getVariable();
|
Map<String, Object> variable = listenerVariable.getVariable();
|
||||||
List<Task> nextTasks = listenerVariable.getNextTasks();
|
List<Task> nextTasks = listenerVariable.getNextTasks();
|
||||||
FlowParams flowParams = listenerVariable.getFlowParams();
|
WorkflowContext workflowContext = listenerVariable.getContext();
|
||||||
Definition definition = listenerVariable.getDefinition();
|
Definition definition = listenerVariable.getDefinition();
|
||||||
Instance instance = listenerVariable.getInstance();
|
Instance instance = listenerVariable.getInstance();
|
||||||
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
|
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
|
||||||
String hisStatus = flowParams != null ? flowParams.getHisStatus() : null;
|
String taskStatus = workflowContext != null ? workflowContext.getTaskStatus() : null;
|
||||||
|
|
||||||
for (Task flowTask : nextTasks) {
|
for (Task flowTask : nextTasks) {
|
||||||
String nodeCode = flowTask.getNodeCode();
|
String nodeCode = flowTask.getNodeCode();
|
||||||
|
|
||||||
// 处理办理或退回时指定办理人的情况
|
// 处理办理或退回时指定办理人的情况
|
||||||
if (TaskStatusEnum.PASS.getStatus().equals(hisStatus)) {
|
if (TaskStatusEnum.PASS.getStatus().equals(taskStatus)) {
|
||||||
processTaskPermission(variable, flowTask, hisStatus);
|
processTaskPermission(variable, flowTask, taskStatus);
|
||||||
} else if (TaskStatusEnum.BACK.getStatus().equals(hisStatus)) {
|
} else if (TaskStatusEnum.BACK.getStatus().equals(taskStatus)) {
|
||||||
processTaskPermission(variable, flowTask, hisStatus);
|
processTaskPermission(variable, flowTask, taskStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果是申请节点,则把启动人添加到办理人
|
// 如果是申请节点,则把启动人添加到办理人
|
||||||
@ -183,16 +183,16 @@ public class WorkflowGlobalListener implements GlobalListener {
|
|||||||
Task task = listenerVariable.getTask();
|
Task task = listenerVariable.getTask();
|
||||||
List<Task> nextTasks = listenerVariable.getNextTasks();
|
List<Task> nextTasks = listenerVariable.getNextTasks();
|
||||||
Map<String, Object> params = new HashMap<>();
|
Map<String, Object> params = new HashMap<>();
|
||||||
FlowParams flowParams = listenerVariable.getFlowParams();
|
WorkflowContext workflowContext = listenerVariable.getContext();
|
||||||
Map<String, Object> variable = new HashMap<>();
|
Map<String, Object> 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());
|
params.put("message", workflowContext.getMessage());
|
||||||
variable = flowParams.getVariable();
|
variable = workflowContext.getVariables();
|
||||||
}
|
}
|
||||||
//申请人提交事件
|
//申请人提交事件
|
||||||
Boolean submit = MapUtil.getBool(variable, FlowConstant.SUBMIT);
|
Boolean submit = MapUtil.getBool(variable, FlowConstant.SUBMIT);
|
||||||
@ -224,11 +224,11 @@ public class WorkflowGlobalListener implements GlobalListener {
|
|||||||
flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, nextTask, params);
|
flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, nextTask, params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ObjectUtil.isNull(flowParams)) {
|
if (ObjectUtil.isNull(workflowContext)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 只有办理或者退回的时候才执行消息通知和抄送
|
// 只有办理或者退回的时候才执行消息通知和抄送
|
||||||
if (!TaskStatusEnum.isPassOrBack(flowParams.getHisStatus())) {
|
if (!TaskStatusEnum.isPassOrBack(workflowContext.getTaskStatus())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ObjectUtil.isNull(variable)) {
|
if (ObjectUtil.isNull(variable)) {
|
||||||
@ -246,7 +246,7 @@ public class WorkflowGlobalListener implements GlobalListener {
|
|||||||
});
|
});
|
||||||
String notice = MapUtil.getStr(variable, FlowConstant.MESSAGE_NOTICE);
|
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));
|
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 definition 流程定义
|
||||||
* @param nextTasks 后续任务列表
|
* @param nextTasks 后续任务列表
|
||||||
* @return 是否发送待办消息
|
* @return 是否发送待办消息
|
||||||
*/
|
*/
|
||||||
private boolean shouldSendTaskMessage(FlowParams flowParams, Definition definition, List<Task> nextTasks) {
|
private boolean shouldSendTaskMessage(WorkflowContext workflowContext, Definition definition, List<Task> nextTasks) {
|
||||||
if (flowParams == null || !TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) {
|
if (workflowContext == null || !TaskStatusEnum.BACK.getStatus().equals(workflowContext.getTaskStatus())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (CollUtil.isEmpty(nextTasks) || nextTasks.size() != 1) {
|
if (CollUtil.isEmpty(nextTasks) || nextTasks.size() != 1) {
|
||||||
|
|||||||
@ -10,12 +10,13 @@ import org.dromara.common.core.utils.StringUtils;
|
|||||||
import org.dromara.common.mybatis.core.query.QueryBuilder;
|
import org.dromara.common.mybatis.core.query.QueryBuilder;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.warm.flow.core.FlowEngine;
|
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.entity.User;
|
||||||
import org.dromara.warm.flow.core.service.TaskService;
|
|
||||||
import org.dromara.warm.flow.orm.entity.FlowTask;
|
import org.dromara.warm.flow.orm.entity.FlowTask;
|
||||||
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
|
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
|
||||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||||
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.context.CompleteTaskContext;
|
import org.dromara.workflow.domain.context.CompleteTaskContext;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -36,24 +37,22 @@ import static org.dromara.workflow.common.constant.FlowConstant.*;
|
|||||||
@LiteflowComponent("completeAutoPass")
|
@LiteflowComponent("completeAutoPass")
|
||||||
public class CompleteAutoPassComponent extends NodeComponent {
|
public class CompleteAutoPassComponent extends NodeComponent {
|
||||||
|
|
||||||
private final TaskService taskService;
|
|
||||||
private final FlowTaskMapper flowTaskMapper;
|
private final FlowTaskMapper flowTaskMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process() {
|
public void process() {
|
||||||
CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
|
CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
|
||||||
FlowTask flowTask = context.getFlowTask();
|
FlowTask flowTask = context.getFlowTask();
|
||||||
autoPass(flowTask.getId(), context.getFlowParams(), flowTask.getInstanceId());
|
autoPass(flowTask.getId(), flowTask.getInstanceId());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 递归跳过当前处理人的后续任务。
|
* 递归跳过当前处理人的后续任务。
|
||||||
*
|
*
|
||||||
* @param taskId 本轮已处理任务 id,用于避免重复跳过同一任务
|
* @param taskId 本轮已处理任务 id,用于避免重复跳过同一任务
|
||||||
* @param flowParams 当前办理参数,会在自动审批时覆盖为自动审批消息和空抄送变量
|
|
||||||
* @param instanceId 流程实例 id
|
* @param instanceId 流程实例 id
|
||||||
*/
|
*/
|
||||||
private void autoPass(Long taskId, FlowParams flowParams, Long instanceId) {
|
private void autoPass(Long taskId, Long instanceId) {
|
||||||
List<FlowTask> flowTaskList = selectByInstId(instanceId);
|
List<FlowTask> flowTaskList = selectByInstId(instanceId);
|
||||||
if (CollUtil.isEmpty(flowTaskList)) {
|
if (CollUtil.isEmpty(flowTaskList)) {
|
||||||
return;
|
return;
|
||||||
@ -74,15 +73,15 @@ public class CompleteAutoPassComponent extends NodeComponent {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 自动审批不继承人工办理时的抄送和消息通知,避免重复发送业务消息。
|
// 自动审批不继承人工办理时的抄送和消息通知,避免重复发送业务消息。
|
||||||
flowParams
|
CompleteCommand command = new CompleteCommand();
|
||||||
.message("流程引擎自动审批!")
|
command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
|
||||||
.variable(Map.of(
|
command.setTaskId(task.getId());
|
||||||
SUBMIT, false,
|
command.setMessage("流程引擎自动审批!");
|
||||||
FLOW_COPY_LIST, Collections.emptyList(),
|
command.setVariables(Map.of(SUBMIT, false, FLOW_COPY_LIST, Collections.emptyList(), MESSAGE_NOTICE, StringUtils.EMPTY));
|
||||||
MESSAGE_NOTICE, StringUtils.EMPTY));
|
command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
|
||||||
taskService.skip(task.getId(), flowParams);
|
FlowEngine.workflow().complete(command);
|
||||||
// 跳过后可能生成新的后续任务,继续扫描直到当前登录人不再有可自动办理任务。
|
// 跳过后可能生成新的后续任务,继续扫描直到当前登录人不再有可自动办理任务。
|
||||||
autoPass(task.getId(), flowParams, instanceId);
|
autoPass(task.getId(), instanceId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,9 +5,9 @@ import com.yomahub.liteflow.annotation.LiteflowComponent;
|
|||||||
import com.yomahub.liteflow.core.NodeComponent;
|
import com.yomahub.liteflow.core.NodeComponent;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.enums.BusinessStatusEnum;
|
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||||
import org.dromara.warm.flow.core.dto.FlowParams;
|
import org.dromara.warm.flow.core.FlowEngine;
|
||||||
import org.dromara.warm.flow.core.enums.SkipType;
|
import org.dromara.warm.flow.core.workflow.command.CompleteCommand;
|
||||||
import org.dromara.warm.flow.core.service.TaskService;
|
import org.dromara.warm.flow.core.workflow.context.OperatorContext;
|
||||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.bo.CompleteTaskBo;
|
import org.dromara.workflow.domain.bo.CompleteTaskBo;
|
||||||
@ -27,28 +27,23 @@ import static org.dromara.workflow.common.constant.FlowConstant.*;
|
|||||||
@LiteflowComponent("completeExecute")
|
@LiteflowComponent("completeExecute")
|
||||||
public class CompleteExecuteComponent extends NodeComponent {
|
public class CompleteExecuteComponent extends NodeComponent {
|
||||||
|
|
||||||
private final TaskService taskService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process() {
|
public void process() {
|
||||||
CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
|
CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
|
||||||
CompleteTaskBo completeTaskBo = context.getCompleteTaskBo();
|
CompleteTaskBo completeTaskBo = context.getCompleteTaskBo();
|
||||||
Map<String, Object> variables = completeTaskBo.getVariables();
|
Map<String, Object> variables = completeTaskBo.getVariables();
|
||||||
FlowParams flowParams = FlowParams.build()
|
CompleteCommand command = new CompleteCommand();
|
||||||
.handler(completeTaskBo.getHandler())
|
OperatorContext operator = new OperatorContext(completeTaskBo.getHandler());
|
||||||
.variable(variables)
|
operator.setIgnore(Convert.toBool(variables.getOrDefault(VAR_IGNORE, false)));
|
||||||
.ignore(Convert.toBool(variables.getOrDefault(VAR_IGNORE, false)))
|
command.setOperator(operator);
|
||||||
.ignoreDepute(Convert.toBool(variables.getOrDefault(VAR_IGNORE_DEPUTE, false)))
|
command.setTaskId(context.getFlowTask().getId());
|
||||||
.ignoreCooperate(Convert.toBool(variables.getOrDefault(VAR_IGNORE_COOPERATE, false)))
|
command.setVariables(variables);
|
||||||
.skipType(SkipType.PASS.getKey())
|
command.setMessage(completeTaskBo.getMessage());
|
||||||
.message(completeTaskBo.getMessage())
|
command.setExt(completeTaskBo.getFileId());
|
||||||
.flowStatus(BusinessStatusEnum.WAITING.getStatus())
|
command.setFlowStatus(BusinessStatusEnum.WAITING.getStatus());
|
||||||
.hisStatus(TaskStatusEnum.PASS.getStatus())
|
command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
|
||||||
.hisTaskExt(completeTaskBo.getFileId());
|
|
||||||
|
|
||||||
context.setFlowParams(flowParams);
|
|
||||||
context.setAutoPass(Convert.toBool(context.getInstance().getVariableMap().getOrDefault(AUTO_PASS, false)));
|
context.setAutoPass(Convert.toBool(context.getInstance().getVariableMap().getOrDefault(AUTO_PASS, false)));
|
||||||
taskService.skip(context.getFlowTask().getId(), flowParams);
|
FlowEngine.workflow().complete(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,12 @@ package org.dromara.workflow.liteflow.operation;
|
|||||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||||
import com.yomahub.liteflow.core.NodeComponent;
|
import com.yomahub.liteflow.core.NodeComponent;
|
||||||
import lombok.RequiredArgsConstructor;
|
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.ConditionalOnEnable;
|
||||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.context.TaskOperationContext;
|
import org.dromara.workflow.domain.context.TaskOperationContext;
|
||||||
@ -18,29 +23,49 @@ import org.dromara.workflow.domain.context.TaskOperationContext;
|
|||||||
@LiteflowComponent("taskOpExecute")
|
@LiteflowComponent("taskOpExecute")
|
||||||
public class TaskOpExecuteComponent extends NodeComponent {
|
public class TaskOpExecuteComponent extends NodeComponent {
|
||||||
|
|
||||||
private final TaskService taskService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process() {
|
public void process() {
|
||||||
TaskOperationContext context = getContextBean(TaskOperationContext.class);
|
TaskOperationContext context = getContextBean(TaskOperationContext.class);
|
||||||
Long taskId = context.getTaskOperationBo().getTaskId();
|
Long taskId = context.getTaskOperationBo().getTaskId();
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
|
OperatorContext operator = context.getOperator();
|
||||||
|
String message = context.getMessage();
|
||||||
switch (context.getOperation()) {
|
switch (context.getOperation()) {
|
||||||
case DELEGATE_TASK -> {
|
case DELEGATE_TASK -> {
|
||||||
context.getFlowParams().hisStatus(TaskStatusEnum.DEPUTE.getStatus());
|
DelegateCommand command = new DelegateCommand();
|
||||||
result = taskService.depute(taskId, context.getFlowParams());
|
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 -> {
|
case TRANSFER_TASK -> {
|
||||||
context.getFlowParams().hisStatus(TaskStatusEnum.TRANSFER.getStatus());
|
TransferCommand command = new TransferCommand();
|
||||||
result = taskService.transfer(taskId, context.getFlowParams());
|
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 -> {
|
case ADD_SIGNATURE -> {
|
||||||
context.getFlowParams().hisStatus(TaskStatusEnum.SIGN.getStatus());
|
AddSignerCommand command = new AddSignerCommand();
|
||||||
result = taskService.addSignature(taskId, context.getFlowParams());
|
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 -> {
|
case REDUCTION_SIGNATURE -> {
|
||||||
context.getFlowParams().hisStatus(TaskStatusEnum.SIGN_OFF.getStatus());
|
RemoveSignerCommand command = new RemoveSignerCommand();
|
||||||
result = taskService.reductionSignature(taskId, context.getFlowParams());
|
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);
|
context.setResult(result);
|
||||||
|
|||||||
@ -8,14 +8,12 @@ import org.dromara.common.core.utils.ValidatorUtils;
|
|||||||
import org.dromara.common.core.validate.AddGroup;
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
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.ConditionalOnEnable;
|
||||||
import org.dromara.workflow.common.enums.TaskOperationEnum;
|
import org.dromara.workflow.common.enums.TaskOperationEnum;
|
||||||
import org.dromara.workflow.domain.bo.TaskOperationBo;
|
import org.dromara.workflow.domain.bo.TaskOperationBo;
|
||||||
import org.dromara.workflow.domain.context.TaskOperationContext;
|
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);
|
case ADD_SIGNATURE, REDUCTION_SIGNATURE -> ValidatorUtils.validate(bo, EditGroup.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
FlowParams flowParams = FlowParams.build().message(bo.getMessage());
|
OperatorContext operator = new OperatorContext(LoginHelper.getUserIdStr());
|
||||||
if (LoginHelper.isSuperAdmin()) {
|
operator.setIgnore(LoginHelper.isSuperAdmin());
|
||||||
flowParams.ignore(true);
|
context.setOperator(operator);
|
||||||
}
|
context.setMessage(bo.getMessage());
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,14 +6,17 @@ import com.yomahub.liteflow.core.NodeComponent;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.enums.BusinessStatusEnum;
|
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
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.Instance;
|
||||||
import org.dromara.warm.flow.core.entity.Task;
|
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.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.warm.flow.orm.entity.FlowTask;
|
||||||
import org.dromara.workflow.api.domain.StartProcessReturnDTO;
|
import org.dromara.workflow.api.domain.StartProcessReturnDTO;
|
||||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||||
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.FlowInstanceBizExt;
|
import org.dromara.workflow.domain.FlowInstanceBizExt;
|
||||||
import org.dromara.workflow.domain.context.StartProcessContext;
|
import org.dromara.workflow.domain.context.StartProcessContext;
|
||||||
import org.dromara.workflow.mapper.FlwInstanceBizExtMapper;
|
import org.dromara.workflow.mapper.FlwInstanceBizExtMapper;
|
||||||
@ -30,19 +33,21 @@ import java.util.List;
|
|||||||
@LiteflowComponent("startExecute")
|
@LiteflowComponent("startExecute")
|
||||||
public class StartExecuteComponent extends NodeComponent {
|
public class StartExecuteComponent extends NodeComponent {
|
||||||
|
|
||||||
private final InsService insService;
|
|
||||||
private final TaskService taskService;
|
private final TaskService taskService;
|
||||||
private final FlwInstanceBizExtMapper flwInstanceBizExtMapper;
|
private final FlwInstanceBizExtMapper flwInstanceBizExtMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process() {
|
public void process() {
|
||||||
StartProcessContext context = getContextBean(StartProcessContext.class);
|
StartProcessContext context = getContextBean(StartProcessContext.class);
|
||||||
FlowParams flowParams = FlowParams.build()
|
StartCommand command = new StartCommand();
|
||||||
.handler(context.getStartProcessBo().getHandler())
|
command.setBusinessId(context.getBusinessId());
|
||||||
.flowCode(context.getStartProcessBo().getFlowCode())
|
command.setFlowCode(context.getStartProcessBo().getFlowCode());
|
||||||
.variable(context.getVariables())
|
command.setOperator(new OperatorContext(context.getStartProcessBo().getHandler()));
|
||||||
.flowStatus(BusinessStatusEnum.DRAFT.getStatus());
|
command.setVariables(context.getVariables());
|
||||||
Instance instance = insService.start(context.getBusinessId(), flowParams);
|
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);
|
context.setInstance(instance);
|
||||||
saveBizExt(context, instance);
|
saveBizExt(context, instance);
|
||||||
|
|
||||||
|
|||||||
@ -20,8 +20,11 @@ import org.dromara.common.mybatis.core.query.LambdaJoinQueryBuilder;
|
|||||||
import org.dromara.common.mybatis.core.query.QueryBuilder;
|
import org.dromara.common.mybatis.core.query.QueryBuilder;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.warm.flow.core.FlowEngine;
|
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.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.Definition;
|
||||||
import org.dromara.warm.flow.core.entity.Instance;
|
import org.dromara.warm.flow.core.entity.Instance;
|
||||||
import org.dromara.warm.flow.core.entity.Task;
|
import org.dromara.warm.flow.core.entity.Task;
|
||||||
@ -267,13 +270,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
|||||||
throw new ServiceException("权限不足,无法撤销流程!");
|
throw new ServiceException("权限不足,无法撤销流程!");
|
||||||
}
|
}
|
||||||
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
|
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
|
||||||
FlowParams flowParams = FlowParams.build()
|
RevokeCommand command = new RevokeCommand();
|
||||||
.message(bo.message())
|
command.setOperator(new OperatorContext(userIdStr));
|
||||||
.flowStatus(BusinessStatusEnum.CANCEL.getStatus())
|
command.getOperator().setIgnore(true);
|
||||||
.hisStatus(BusinessStatusEnum.CANCEL.getStatus())
|
command.setInstanceId(instance.getId());
|
||||||
.handler(userIdStr)
|
command.setMessage(bo.message());
|
||||||
.ignore(true);
|
command.setFlowStatus(BusinessStatusEnum.CANCEL.getStatus());
|
||||||
taskService.revoke(instance.getId(), flowParams);
|
command.setTaskStatus(BusinessStatusEnum.CANCEL.getStatus());
|
||||||
|
FlowEngine.workflow().revoke(command);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,12 +456,14 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
|||||||
if (instance != null) {
|
if (instance != null) {
|
||||||
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
|
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
|
||||||
}
|
}
|
||||||
FlowParams flowParams = FlowParams.build()
|
TerminateCommand command = new TerminateCommand();
|
||||||
.message(bo.comment())
|
command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
|
||||||
.flowStatus(BusinessStatusEnum.INVALID.getStatus())
|
command.getOperator().setIgnore(true);
|
||||||
.hisStatus(TaskStatusEnum.INVALID.getStatus())
|
command.setInstanceId(bo.id());
|
||||||
.ignore(true);
|
command.setMessage(bo.comment());
|
||||||
taskService.terminationByInsId(bo.id(), flowParams);
|
command.setFlowStatus(BusinessStatusEnum.INVALID.getStatus());
|
||||||
|
command.setTaskStatus(TaskStatusEnum.INVALID.getStatus());
|
||||||
|
FlowEngine.workflow().terminate(command);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,9 +23,12 @@ import org.dromara.common.satoken.utils.LoginHelper;
|
|||||||
import org.dromara.system.api.UserService;
|
import org.dromara.system.api.UserService;
|
||||||
import org.dromara.system.api.domain.UserDTO;
|
import org.dromara.system.api.domain.UserDTO;
|
||||||
import org.dromara.warm.flow.core.FlowEngine;
|
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.constant.ExceptionCons;
|
||||||
import org.dromara.warm.flow.core.dto.FlowCombine;
|
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.entity.*;
|
||||||
import org.dromara.warm.flow.core.enums.NodeType;
|
import org.dromara.warm.flow.core.enums.NodeType;
|
||||||
import org.dromara.warm.flow.core.enums.SkipType;
|
import org.dromara.warm.flow.core.enums.SkipType;
|
||||||
@ -161,12 +164,12 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
long taskId = IdGeneratorUtil.nextLongId();
|
long taskId = IdGeneratorUtil.nextLongId();
|
||||||
task.setId(taskId);
|
task.setId(taskId);
|
||||||
task.setNodeName("【抄送】" + task.getNodeName());
|
task.setNodeName("【抄送】" + task.getNodeName());
|
||||||
Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() - 1000);
|
// 抄送记录展示在触发抄送的办理记录之前,历史列表按更新时间倒序排列。
|
||||||
FlowParams flowParams = FlowParams.build()
|
Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() + 1000);
|
||||||
.skipType(SkipType.NONE.getKey())
|
WorkflowContext workflowContext = new WorkflowContext();
|
||||||
.hisStatus(TaskStatusEnum.COPY.getStatus())
|
workflowContext.setTaskStatus(TaskStatusEnum.COPY.getStatus());
|
||||||
.message("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getNickName));
|
workflowContext.setMessage("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getNickName));
|
||||||
HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, flowParams);
|
HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, workflowContext, SkipType.NONE.getKey());
|
||||||
hisTask.setCreateTime(updateTime);
|
hisTask.setCreateTime(updateTime);
|
||||||
hisTask.setUpdateTime(updateTime);
|
hisTask.setUpdateTime(updateTime);
|
||||||
hisTaskService.save(hisTask);
|
hisTaskService.save(hisTask);
|
||||||
@ -315,15 +318,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
variable.put(MESSAGE_TYPE, messageType);
|
variable.put(MESSAGE_TYPE, messageType);
|
||||||
variable.put(MESSAGE_NOTICE, notice);
|
variable.put(MESSAGE_NOTICE, notice);
|
||||||
|
|
||||||
FlowParams flowParams = FlowParams.build()
|
RejectCommand command = new RejectCommand();
|
||||||
.nodeCode(bo.getNodeCode())
|
command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
|
||||||
.variable(variable)
|
command.setTaskId(task.getId());
|
||||||
.message(message)
|
command.setTargetNodeCode(bo.getNodeCode());
|
||||||
.skipType(SkipType.REJECT.getKey())
|
command.setVariables(variable);
|
||||||
.flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus())
|
command.setMessage(message);
|
||||||
.hisStatus(TaskStatusEnum.BACK.getStatus())
|
command.setExt(bo.getFileId());
|
||||||
.hisTaskExt(bo.getFileId());
|
command.setFlowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus());
|
||||||
taskService.skip(task.getId(), flowParams);
|
command.setTaskStatus(TaskStatusEnum.BACK.getStatus());
|
||||||
|
FlowEngine.workflow().reject(command);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -479,11 +483,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
if (ObjectUtil.isNotNull(instance)) {
|
if (ObjectUtil.isNotNull(instance)) {
|
||||||
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
|
BusinessStatusEnum.checkInvalidStatus(instance.getFlowStatus());
|
||||||
}
|
}
|
||||||
FlowParams flowParams = FlowParams.build()
|
TerminateCommand command = new TerminateCommand();
|
||||||
.message(bo.comment())
|
command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
|
||||||
.flowStatus(BusinessStatusEnum.TERMINATION.getStatus())
|
command.setTaskId(taskId);
|
||||||
.hisStatus(TaskStatusEnum.TERMINATION.getStatus());
|
command.setMessage(bo.comment());
|
||||||
taskService.termination(taskId, flowParams);
|
command.setFlowStatus(BusinessStatusEnum.TERMINATION.getStatus());
|
||||||
|
command.setTaskStatus(TaskStatusEnum.TERMINATION.getStatus());
|
||||||
|
FlowEngine.workflow().terminate(command);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -587,9 +593,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType()));
|
nextFlowNodes = StreamUtils.filter(nextFlowNodes, node -> NodeType.BETWEEN.getKey().equals(node.getNodeType()));
|
||||||
if (CollUtil.isNotEmpty(nextNodeList)) {
|
if (CollUtil.isNotEmpty(nextNodeList)) {
|
||||||
//构建以下节点数据
|
//构建以下节点数据
|
||||||
List<Task> buildNextTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, FlowParams.build()));
|
List<Task> 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) {
|
for (FlowNode flowNode : nextFlowNodes) {
|
||||||
StreamUtils.findFirst(buildNextTaskList, t -> t.getNodeCode().equals(flowNode.getNodeCode()))
|
StreamUtils.findFirst(buildNextTaskList, t -> t.getNodeCode().equals(flowNode.getNodeCode()))
|
||||||
.ifPresent(first -> {
|
.ifPresent(first -> {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user