实现功能:

1.并行,所有人审批通过时,节点结束,流程运转到下一个节点;

2.并行,所有人中有一个人审批通过,节点结束,流程运转到下一个节点;

3.串行,所有人审批通过,节点结束,流程运转到下一个节点;

4.动态配置。


1.并行,所有人审批通过时,节点结束,流程运转到下一个节点

1.1 流程定义配置

flowable 会签 changeState flowable 会签 节点_启动流程

多实例类型:<multiInstanceLoopCharacteristics isSequential="false"> 并行的配置

完成条件(多实例):${nrOfCompletedInstances/nrOfInstances >= 1} 表示审批通过的总数大于等于实例总数

1.nrOfInstances:实例总数。

2.nrOfCompletedInstances:当前已完成的实例,nr是number单词缩写 。

3.loopCounter:表示特定实例的在循环的索引值。可以使用activiti的elementIndexVariable属性修改loopCounter的变量名。

4.nrOfActiveInstances:当前活动的,比如,还没完成的,实例数量。 对于串执行的多实例,值一直为1。

可以通过execution.getVariable(x)方法获得这些变量。

分配用户:流程任务处理人

基数(多实例):<loopCardinality>10</loopCardinality> 实例总数,实例总数应与分配用户的流程处理人数一致。

1.2 部署并启动流程,查看数据库的变化

select * from ACT_RU_TASK where PROC_INST_ID_='160005';

flowable 会签 changeState flowable 会签 节点_数据库_02

SELECT * FROM ACT_RU_IDENTITYLINK T
LEFT JOIN ACT_RU_TASK T1 ON T.TASK_ID_=T1.ID_
where T.TYPE_ = 'candidate'
AND T1.PROC_INST_ID_='160005';

ACT_RU_IDENTITYLINK权限表中,确实把分配的用户设置进去了

flowable 会签 changeState flowable 会签 节点_启动流程_03

select * from ACT_RU_VARIABLE where PROC_INST_ID_='160005';

flowable 会签 changeState flowable 会签 节点_启动流程_04

问题:查询用户待办任务,一个用户会有10个待办,此问题如何解决?

1.3 完成一个任务,查看数据库变化

select * from ACT_RU_TASK where PROC_INST_ID_='160005';

完成了一个任务,还有9个任务

flowable 会签 changeState flowable 会签 节点_启动流程_05

select * from ACT_RU_VARIABLE where PROC_INST_ID_='160005';

活动实例-1,忆完成实例+1

flowable 会签 changeState flowable 会签 节点_启动流程_06

1.4 全部完成任务,查询任务表,任务多实例节点的任务没有了,流程运转到下一个节点。

问题:分配用户为2人(用户1,用户2),基数(多实例)设置为10,那么用户1有10个待办任务、用户2也有10个待办任务。用户1完成的任务数+用户2完成的任务数>=10,任务多实例节点完成。

与实际想要的实现的需求不符,如何能做到并行时,分配用户2人,此2人都必须且有一个待办,分别完成后,任务多实例节点完成?

2.并行,所有人中有一个人审批通过,节点结束,流程运转到下一个节点

只需把完成条件(多实例)改为:${nrOfCompletedInstances/nrOfInstances > 0},其他跟1一样。

3.串行,所有人审批通过,节点结束,流程运转到下一个节点

3.1 配置

flowable 会签 changeState flowable 会签 节点_数据库_07

3.2 启动流程,查看数据库数据的变化

select * from ACT_RU_TASK where PROC_INST_ID_='165005';

串行时,只会创建一个任务

flowable 会签 changeState flowable 会签 节点_多实例_08

SELECT * FROM ACT_RU_IDENTITYLINK T
LEFT JOIN ACT_RU_TASK T1 ON T.TASK_ID_=T1.ID_
where T.TYPE_ = 'candidate'
AND T1.PROC_INST_ID_='165005';

ACT_RU_IDENTITYLINK权限表中,把分配的用户设置进去了,此时用户1、用户2分别有一个待办任务

flowable 会签 changeState flowable 会签 节点_多实例_09

select * from ACT_RU_VARIABLE where PROC_INST_ID_='165005';

串行时,nrOfActiveInstances值一直为1

flowable 会签 changeState flowable 会签 节点_多实例_10

3.3 完成两次任务后,任务多实例节点结束,流程运转到下一节点

问题:用户1完成一次任务,查询待办,还会有待办,又完成一次任务。任务多实例节点就结束了。这里的串行,是不是表示,完成的任务次数等于定义的基数(多实例),就表示完成任务多实例节点。

跟想要的效果不一致,如何实现串行时,分配的用户按顺序全部完成后,任务多实例节点才完成?

4.动态配置

4.1 流程文档配置

flowable 会签 changeState flowable 会签 节点_多实例_11

参数说明:

activiti:assignee="${assignee}"

activiti:elementVariable="assignee" 多实例任务依赖上面的配置${assignee}

activiti:collection="assigneeList" 

三个参数结合决定了,当前节点的处理人来自assigneeList集合,注意这里是集合信息而不是字符串,所以程序的运行时候变量的赋值

Map<String, Object> vars = new HashMap<>();
String[] v = { "1", "2"};
vars.put("assigneeList", Arrays.asList(v));
String processDefinitionKey = "Multi-instance";
ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey(processDefinitionKey,vars);

4.2 启动流程,查询数据库数据的变化

select * from ACT_RU_TASK where PROC_INST_ID_='172511';

分别给用户1、用户2分配是任务

flowable 会签 changeState flowable 会签 节点_数据库_12

4.3 完成任务

用户1、用户2分配完成任务,任务多实例节点结束,流程运转到下一节点。

问题:动态配置,需要传递处理人。在项目实际应用中,只需要在启动流程时把处理人集合传递进来,后续完成任务不需要再传递。能否做到流程文件定义时,按分配的用户和用户组,动态的给流程传递处理人?

问题:任务多实例,如何进行审批不通过的处理?