Flowable 实现【选择下一步流程审核人】

Stella981
• 阅读 1568

原理:

  1. 在流程表单数据正式提交审核前,将流程表单数据 formData 及流程执行实例 ExecutionEntity 传递给接口
  2. 接口在流程定义取得当前节点信息并循环查找出线 SequenceFlow 还需要注意遇到网关时应该怎样处理
  3. 使用变量执行出线 SequenceFlow 条件(类似完成提交任务操作)
  4. 找出第一个用户任务UserTask 根据这个UserTask中信息,我们就能拿到流程审核人了
  5. 最重要的一点,在第三点中使用变量去执行条件的时候,变量会被持久化至数据库中,所以我们一定要在事务中进行操作,操作完成后回滚清空当前事务,避免数据紊乱

项目完整源码链接

以下是全部代码,此逻辑仅供参考

package com.nutzfw.core.plugin.flowable.cmd;

import org.apache.commons.collections.CollectionUtils;
import org.flowable.bpmn.model.*;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.util.condition.ConditionUtil;

import java.util.List;
import java.util.Map;

/**
 * @author huchuc@vip.qq.com
 * @date: 2019/7/9
 * 使用示例,一定要放到事务中,否则变量会入库,导致数据紊乱
 * try {
 * Trans.begin();
 * UserTask userTask = managementService.executeCommand(new FindNextUserTaskNodeCmd(execution, bpmnModel, vars));
 * System.out.println(userTask.getId());
 * } finally {
 * Trans.clear(true);
 * }
 */
public class FindNextUserTaskNodeCmd implements Command<UserTask> {

    private final ExecutionEntity execution;
    private final BpmnModel bpmnModel;
    private Map<String, Object> vars;
    /**
     * 返回下一用户节点
     */
    private UserTask nextUserTask;

    /**
     * @param execution 当前执行实例
     * @param bpmnModel 当前执行实例的模型
     * @param vars      参与计算流程条件的变量
     */
    public FindNextUserTaskNodeCmd(ExecutionEntity execution, BpmnModel bpmnModel, Map<String, Object> vars) {
        this.execution = execution;
        this.bpmnModel = bpmnModel;
        this.vars = vars;
    }

    /**
     * @param execution 当前执行实例
     * @param bpmnModel 当前执行实例的模型
     */
    public FindNextUserTaskNodeCmd(ExecutionEntity execution, BpmnModel bpmnModel) {
        this.execution = execution;
        this.bpmnModel = bpmnModel;
    }

    @Override
    public UserTask execute(CommandContext commandContext) {
        execution.setVariables(vars);
        FlowElement currentNode = bpmnModel.getFlowElement(execution.getActivityId());
        List<SequenceFlow> outgoingFlows = ((FlowNode) currentNode).getOutgoingFlows();
        if (CollectionUtils.isNotEmpty(outgoingFlows)) {
            this.findNextUserTaskNode(outgoingFlows, execution);
        }
        return nextUserTask;
    }


    void findNextUserTaskNode(List<SequenceFlow> outgoingFlows, ExecutionEntity execution) {
        sw:
        for (SequenceFlow outgoingFlow : outgoingFlows) {
            if (ConditionUtil.hasTrueCondition(outgoingFlow, execution)) {
                if (outgoingFlow.getTargetFlowElement() instanceof ExclusiveGateway) {
                    //只有排他网关才继续
                    ExclusiveGateway exclusiveGateway = (ExclusiveGateway) outgoingFlow.getTargetFlowElement();
                    findNextUserTaskNode(exclusiveGateway.getOutgoingFlows(), execution);
                } else if (outgoingFlow.getTargetFlowElement() instanceof UserTask) {
                    nextUserTask = (UserTask) outgoingFlow.getTargetFlowElement();
                    //找到第一个符合条件的userTask就跳出循环
                    break sw;
                }
            }
        }
    }
}
点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Git学习
已有项目添加到Git操作流程:1.在一个目录下执行gitinit,会将当前目录创建为git仓库gitinit2.执行gitadd.把当前目录下所有文件添加到仓库gitadd.3.把添加的文件提交到本地仓库gitcommitm'Firstcommit'4.添加remote及验证remote。
Wesley13 Wesley13
3年前
Java Activiti6.0 spring5 SSM 工作流引擎 审批流程 java项目框架
1.模型管理:web在线流程设计器、预览流程xml、导出xml、部署流程2.流程管理:导入导出流程资源文件、查看流程图、根据流程实例反射出流程模型、激活挂起3.运行中流程:查看流程信息、当前任务节点、当前流程图、作废暂停流程、指派待办人4.历史的流程:查看流程信息、流程用时、流程状态、查看任务发起人信息5.待办任务:查看本人个人任务以及
Stella981 Stella981
3年前
Flowable论坛提问记录
1\.ExclusiveGateway之后的SequenceFlow同时配置了skipexpress和conditionexpression,流程如何走?https://forum.flowable.org/t/questionaboutskipexpressionofsequenceflowoutgoingfromexc
Wesley13 Wesley13
3年前
Activiti的流程配置
在使用activiti做流程引擎的时候,某些节点的执行人是固定的,但是有些节点的执行人不是固定的,为了进一步的简化用户操作,我们可以将固定执行人的任务节点预先配置好,这样在启动流程的时候用户配置的节点就会进一步的得到简化。废话不多说,数据库的表结构如下:!(https://static.oschina.net/uploads/space/2016
Stella981 Stella981
3年前
PHP+Ajax实现文章心情投票功能实例
一个PHPAjax实现文章心情投票功能实例,可以学习了解实现投票的基本流程:通过ajax获取心情图标及柱状图相关数据,当用户点击其中的一个心情图标时,向Ajax.php发送请求,PHP验证用户cookie防止重复提交,然后将mysql中对应的数据心情字段内容加_1,成功后返回前端页面,并更新柱状图和统计数据。__!(https://img.suca
Wesley13 Wesley13
3年前
JEPLUS工作流之判断流程——JEPLUS软件快速开发平台
JEPLUS工作流之判断流程判断流程就是可以在流程过程根据一定得条件来判断,当达到某一个条件时执行后面得流程,当达成另外一个条件时执行另外得流程。一、效果展示!image.png(http://www.jestq.com/JE/data/upload/ckeditor/201807/153128952135201
Stella981 Stella981
3年前
Flask 【第十篇】自定义Form组件
一、wtforms源码流程1、实例化流程分析源码流程1.执行type的__call__方法,读取字段到静态字段cls._unbound_fields中;meta类读取到cls._wtforms_meta中2.执行构造方法a.循环cls.
Stella981 Stella981
3年前
Acitiviti简单扩展(只适用内部管理系统)
使用activiti开源框架,并进行部分扩展          表设计:           1、流程与业务关联:                  扩展业务编码定义表(ACT\_BUS\_TYPE),业务开发人员通过业务编码来调用对应流程           2、流程审核权限:  
Stella981 Stella981
3年前
Django 表单处理流程
Django的表单处理:视图获取请求,执行所需的任何操作,包括从模型中读取数据,然后生成并返回HTML页面(从模板中),我们传递一个包含要显示的数据的上下文。使事情变得更复杂的是,服务器还需要能够处理用户提供的数据,并在出现任何错误时,重新显示页面。下面显示了Django如何处理表单请求的流程图,从对包含表单的页面的请求开始(以绿色显示):!(