流程设计可以分为3类:

1. 一般流程
2. 待条件流程
3. 会签流程

一、首先是一般流程,只有一条线的流程很简单。如下图。

activiti遍历 java activiti复杂流程_bpmn


设计器中节点的属性也不需要配置,保存退出之后,直接对该流程进行流程配置,即可走通一个完整的流程。

二、带条件的流程会稍微复杂一点。如下图。

activiti遍历 java activiti复杂流程_java_02


1、设置监听器

首先我在 【开始】 节点加了一个执行监听器,监听节点的开始执行事件,使用委托表达式的方式调用。

该监听器的目的是为了注入之后流转条件所需的变量值。

如下图。

activiti遍历 java activiti复杂流程_activiti_03


我在除了默认流程线的其他流程线上设置的流转条件样式是:

${user.departmentId == ‘1302088232433639424’}

意思是只要当前节点用户的部门 id 等于某个值的时候,走这条路线。

接下来我们看看监听器的代码要如何写,该如何注入流程中所需要的各种变量。

监听器的代码:

@Component
public class MyExecutionListener implements ExecutionListener {
    @Override
    public void notify(DelegateExecution delegateExecution) {

        // 获取关联业务表ID变量(启动流程代码里已存入tableId,此处直接获取即可)
        String tableId = (String) delegateExecution.getVariable("tableId");
        log.info(tableId);
        LeaveService leaveService = SpringUtil.getBean(LeaveService.class);
        SecurityUtil securityUtil = SpringUtil.getBean(SecurityUtil.class);
        Leave leave = leaveService.get(tableId);
        delegateExecution.setVariable("user", securityUtil.getCurrUser());
    }
}

使用@Component注解将该监听器注入Spring,使Activiti可以用委托表达式调用到。
自定义的执行监听器必须要实现ExecutionListener接口,并且实现notify()方法。
在notify()方法中,我们可以拿到DelegateExecution对象。这个对象可以让我们操作Activiti引擎里的一些东西。
调用delegateExecution.setVariable()方法,用于设置流程流转中所需要的参数。所有在流程中设置的参数都存储在act_ru_variable这张表中。获取参数可以用delegateExecution.getVariable()方法。可以看到,在代码中我设置了一个名叫user的实体变量参数,这个参数在后面设置条件的时候会用到。
设置代码是:

delegateExecution.setVariable("user", securityUtil.getCurrUser());

另外,有一点需要注意的是,在监听器中直接使用注解的方式获取Bean是获取不到的。
如下代码,securityUtil获取到的值为null:
@Resource
SecurityUtil securityUtil;

所以需要使用getBean()方法来手动获取所需要的Bean:
SecurityUtil securityUtil = SpringUtil.getBean(SecurityUtil.class);

2、互斥网关
接下来是互斥网关。
互斥网关只能选择其中一条路线前进,而选择哪一条路取决于输出路线上的条件决定。也就是说从互斥网关输出的路线上都是需要设置条件的:

  1. 如果只有一条路线满足条件,则走这一条路
  2. 如果有多条路线满足条件,则选择定义在流程文件中靠前的那条路线。
  3. 如果没有路线满足条件,则会抛出异常。

注:互斥网关最好设置都设置一条【默认流转】,在所有条件都不符合的情况下走默认路线,防止流程抛出异常。【默认流转】设置只需要在属性配置栏中勾选这一项配置就行。

点击选择其中一条路线,会看到地下属性配置栏中有一条【流转条件】一项,需要在其中配置好流转条件。返回值必须为true或false。

流转条件用UEL表达式进行编写。(这里有需要去提前了解一下EL表达式)

activiti遍历 java activiti复杂流程_监听器_04

三、会签流程,会签主要涉及到多实例的配置。如下图。

activiti遍历 java activiti复杂流程_java_05

第二步设置监听和互斥条件和上面条件流程的一样,这里就不说了。

会签主要用到【多实例】的有关配置:

多实例类型配置成: Parallel(并行),表示走到这个节点的时候,多个实例同时进行。
集合(多实例)使用表达式 ${userList}

userList参数同样在【开始】节点设置的执行监听器中注入,注意,集合的类型只能传 List 。集合内有多少个元素就会生成多少个实例任务。
元素变量(多实例:)使用表达式 ${userItem}
集合中每一个元素的变量,可作为流程变量使用,这里虽然我设置了,但是没有用到。

完成条件(多实例): 我设置的是${nrOfCompletedInstances/nrOfInstances >= 1}
表示当 完成实例 >= 实例总数 的时候,实例结束。nrOfCompletedInstances和nrOfInstances都是内置变量,不需要在监听器中进行手动设置,可以直接使用。

集合的参数userList需要在监听器中注入,是一个存着用户Id的数组:

List<String> userList = Arrays.asList("252250660836216832", "252250288939864065");
delegateExecution.setVariable("userList", userList);

【总结】: 以上就是我在使用流程设计过程中遇到的一些问题,这些流程还可以进行调优等等,例如申请后直接跳过本人申请的任务,驳回流程,多点审批,时间任务设定,自动派单等。还有涉及到后端的处理方法。有时间再更新其它模块吧,就这样。以上。