在activiti 中我们自定义实现节点满足某个条件时完成节点进行下一个节点
在模型设计器中可以自己定义
-
nrOfInstances:实例总数
-
nrOfActiveInstances:当前活动的,比如,还没完成的,实例数量。 对于顺序执行的多实例,值一直为1。
-
nrOfCompletedInstances:已经完成实例的数目。
可以写成${nrOfCompletedInstances>0} //表示只要有人完成任务就通过该节点
项目中刚开始是这种需求,在不管是并行节点还是顺序节点中只要有一个人审批完成就通过该节点,流转至下一节点,所有我就用了
这个表达式 ${nrOfCompletedInstances>0}
后面客户需求改了。节点中有默认的用户和用户自己添加的用户,对于默认的用户只要一个人审核后并且添加的用户全部要参与审核后才能通过该节点,比如第一个任务A A中有2个系统用户 客户自己加3个用户,客户自己加的3个必须参与审批,默认的用户只需要其中一个, 完成条件3+1=4时才能通过该节点 ,所以上面的表达式就不支持了,于是需要完成条件自定义处理逻辑,添加表达式
${instanceCompleteTaskListener.exec(execution)}
其中instanceCompleteTaskListener 就是bean的id exec 就是这个bean的方法
@Component("instanceCompleteTaskListener")
public class InstanceCompleteTaskListener{
public boolean exec(ExecutionEntity execution){
return true;
}
}
返回true 会结束这个节点并且会将这个节点未完成的任务置于删除状态
返回false 表示节点暂未结束
满足了上面的情景
因为流程图刚开始完成条件是${nrOfCompletedInstances>0} 现在要改成${instanceCompleteTaskListener.exec(execution)} 问题又来了 我们系统流程图有一百多张图 不可能每个节点都去改下这样太浪费时间了而且效率特别低,后面就想办法看能不能写代码替换这个完成条件,然后就找到了方法,因为我用的模型设计器设计的流程图,存储流程时点保存其实数据库存的json字符串的二进制
//根据模型id获取流程信息的字节
byte[] source = repositoryService.getModelEditorSource(modelId);
//转换为utf-8 获取json字符串
String s1 = new String(source, StandardCharsets.UTF_8);
//替换完成条件
String s = s1.replaceAll("nrOfCompletedInstances>0", "instanceCompleteTaskListener.exec(execution)");
//保存
repositoryService.addModelEditorSource(modelId, s.getBytes(StandardCharsets.UTF_8));
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
final byte[] result = outStream.toByteArray();
repositoryService.addModelEditorSourceExtra(modelId, result);
outStream.close();
替换后在重新部署流程就可以了