Activiti7 驳回任务

简介: Activiti7 驳回任务

Activiti7 驳回任务

下面操作在多分支情况下没有做详细判断,使用需注意.

操作说明

  1. 通过执行实例id获取bpmnModel
  2. 通过历史记录找到上一条任务并找到任务定义
  3. 通过任务定义找到上一个任务入口
  4. 设置当前执行实例的当前节点,并执行流程引擎计算下一节点.
package com.meijm.activiti.common.flow;
import cn.hutool.core.collection.CollectionUtil;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.delegate.event.ActivitiEventDispatcher;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.HistoricTaskInstanceQueryImpl;
import org.activiti.engine.impl.HistoricTaskInstanceQueryProperty;
import org.activiti.engine.impl.cmd.DeleteProcessInstanceCmd;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.HistoricTaskInstanceEntityManager;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.task.IdentityLinkType;
import java.util.List;
import java.util.Map;
public class RejectTask implements Command<Void> {
    private String taskId;
    private String rejectReason;
    private Map<String, Object> variables;
    public RejectTask(String taskId, Map<String, Object> variables, String rejectReason) {
        this.taskId = taskId;
        this.variables = variables;
        this.rejectReason = rejectReason;
    }
    @Override
    public Void execute(CommandContext commandContext) {
        TaskEntity task = commandContext.getTaskEntityManager().findById(taskId);
        HistoricTaskInstanceEntityManager historicTaskInstanceEntityManager = commandContext.getHistoricTaskInstanceEntityManager();
        HistoricTaskInstanceQueryImpl historicTaskInstanceQuery = new HistoricTaskInstanceQueryImpl();
        historicTaskInstanceQuery.processInstanceId(task.getProcessInstanceId());
        historicTaskInstanceQuery.orderBy(HistoricTaskInstanceQueryProperty.START).desc();
        List<HistoricTaskInstance> htiList = historicTaskInstanceEntityManager.findHistoricTaskInstancesByQueryCriteria(historicTaskInstanceQuery);
        if (CollectionUtil.isEmpty(htiList) || htiList.size() < 2) {
            DeleteProcessInstanceCmd cmd = new DeleteProcessInstanceCmd(task.getProcessInstanceId(), rejectReason);
            cmd.execute(commandContext);
        } else {
            // list里的第二条代表上一个任务
            HistoricTaskInstance lastTask = htiList.get(1);
            String processDefinitionId = lastTask.getProcessDefinitionId();
            BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
            // 得到上个节点的开始位置
            FlowNode lastFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(lastTask.getTaskDefinitionKey());
            FlowElement begin = lastFlowNode.getIncomingFlows().get(0).getSourceFlowElement();
            commandContext.getProcessEngineConfiguration().getListenerNotificationHelper().executeTaskListeners(task, TaskListener.EVENTNAME_COMPLETE);
            if (Authentication.getAuthenticatedUserId() != null && task.getProcessInstanceId() != null) {
                ExecutionEntity processInstanceEntity = commandContext.getExecutionEntityManager().findById(task.getProcessInstanceId());
                commandContext.getIdentityLinkEntityManager().involveUser(processInstanceEntity, Authentication.getAuthenticatedUserId(), IdentityLinkType.PARTICIPANT);
            }
            ActivitiEventDispatcher eventDispatcher = Context.getProcessEngineConfiguration().getEventDispatcher();
            if (eventDispatcher.isEnabled()) {
                eventDispatcher.dispatchEvent(ActivitiEventBuilder.createEntityWithVariablesEvent(ActivitiEventType.TASK_COMPLETED, task, variables, false));
            }
            task.setVariables(variables);
            commandContext.getTaskEntityManager().deleteTask(task, rejectReason, false, false);
            ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findById(task.getExecutionId());
            executionEntity.setCurrentFlowElement(begin);
            commandContext.getAgenda().planTakeOutgoingSequenceFlowsOperation(executionEntity, true);
        }
        return null;
    }
}

源文件位置

com.meijm.activiti.common.flow.RejectTask

地址:https://gitee.com/MeiJM/spring-cram/tree/master/activiti

参考资料

https://segmentfault.com/a/1190000013952695

目录
相关文章
工作流(Activiti 6.0)之自由驳回任务实现
工作流版本使用6.0,参数为任务id(task中主键),目标节点ID(比如userTask1),以及业务主键信息(businessKey)。
|
安全 Java 关系型数据库
Spring boot整合Activiti7
Spring boot整合Activiti7
4016 0
Spring boot整合Activiti7
|
存储 XML JSON
Activiti 7 核心数据库表概览及流程生命周期中的作用
Activiti 7 工作流引擎通过约25张核心数据库表实现流程定义、运行时状态、历史记录与身份数据的存储。表名以ACT_开头,后跟标识用途的字母组合(如RE表示Repository静态信息,RU表示Runtime动态数据)。流程启动时在运行时表登记数据,任务执行中更新关联信息,结束时清理运行时记录并完善历史记录。各表分工明确且逻辑紧密关联,确保高效运行与完整留痕的平衡。掌握这些表的作用和关联有助于深入理解Activiti底层原理及进行高级应用开发。
1102 0
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
12919 125
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
35644 1
|
存储 Java API
SpringBoot整合Flowable【02】- 整合初体验
本文介绍了如何基于Flowable 6.8.1版本搭建工作流项目。首先,根据JDK和Spring Boot版本选择合适的Flowable版本(7.0以下)。接着,通过创建Spring Boot项目并配置依赖,包括Flowable核心依赖、数据库连接等。然后,建立数据库并配置数据源,确保Flowable能自动生成所需的表结构。最后,启动项目测试,确认Flowable成功创建了79张表。文中还简要介绍了这些表的分类和常用表的作用,帮助初学者理解Flowable的工作原理。
3743 0
SpringBoot整合Flowable【02】- 整合初体验
|
存储 API
Activiti七大接口,28张表详解
Activiti七大接口,28张表详解
1052 0
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
4233 8
|
前端开发 Java API
SpringBoot整合Flowable【07】- 驳回节点任务
本文通过绩效流程的业务场景,详细介绍了如何在Flowable工作流引擎中实现任务驳回功能。具体步骤包括:获取目标任务节点和当前任务节点信息,进行必要的判空和逻辑校验,调用API完成节点回退,并清理相关脏数据(如历史任务和变量)。最后通过测试验证了驳回功能的正确性,确保流程能够成功回退到指定节点并清除中间产生的冗余数据。此功能在实际业务中非常有用,能够满足上级驳回自评等需求。
2861 0
SpringBoot整合Flowable【07】- 驳回节点任务
activiti 会签多实例任务,设置为候选组或个人任务的总结
activiti 会签多实例任务,设置为候选组或个人任务的总结
1663 0
activiti 会签多实例任务,设置为候选组或个人任务的总结