背景
- 最近在研究Activiti6/7流程引擎能支持哪些具体业务功能,为此写了一个流程来验证功能。
验证功能
- 使用bpmnjs绘制流程图
- 使用多人会签节点
- 使用开始/结束/完成监等听器
- 排他网关
流程图如下
环境支持
- Activiti7 M4
- JDK 11
- MySql 5.7
- SpringBoot 2.2.6
- Mybatis-plus 3.4.0
- Swagger 2.9.2
流程图节点介绍
开始节点
- 开始节点名称编写和节点名称设置如下图
- 设置开始节点监听器
- Java ExecutionListener监听器如下
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 多实例监听
*
* @author
* @since 2021/3/25 0025
*/
public class MultInstancesStartListener implements ExecutionListener {
private static final Logger LOGGER = LoggerFactory.getLogger(MultInstancesStartListener.class);
@Override
public void notify(DelegateExecution execution) {
String instanceVariable = (String) execution.getVariable("instanceVariable");
execution.setVariable("assigneeSelf", instanceVariable);
LOGGER.info("instanceVariable = {}", instanceVariable);
}
}
复制代码
自评节点
总监节点
- 总监节点是一个多人会签节点
- 总监会签节点业务场景如下
- 只要有一个人驳回整个会签节点结束回到自评节点
- 总监节点的会签人员必须所有人同意后才能走向网关节点
总监会签节点如下图
- 完成条件解读
- nrOfCompletedInstances 当前节点完成人数
- nrOfInstances 节点完成需要的中人数
- nrOfCompletedInstances/nrOfInstances 当前节点完成总人数除以需要完成任务的总人数的结果为1 时,流程就可以走向网关节点
${nrOfCompletedInstances/nrOfInstances==1}
复制代码
总监节点执行监听器
- start监听器(现在弃用)
总监节点任务监听器
- create监听器(现在弃用)
Java的create监听器位置:com.bci.internal.engine.bcibpmengine.listener.TkListener6
- complete监听器
Java的create监听器位置:com.bci.internal.engine.bcibpmengine.listener.SignListener
java代码如下
package com.bci.internal.engine.bcibpmengine.listener;
import com.bci.internal.engine.bcibpmengine.utils.ConstantUtils;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Objects;
/**
* 会签监听器
*
* @author
* @since 2021/4/10 0010
*/
public class SignListener implements TaskListener {
private static final Logger LOGGER = LoggerFactory.getLogger(SignListener.class);
@Override
public void notify(DelegateTask delegateTask) {
//获取执行id
String exId = delegateTask.getExecutionId();
/* 获取任务id和任务名称 */
String taskId = delegateTask.getId();
String name = delegateTask.getName();
//获取流程参数pass,会签人员完成自己的审批任务时会添加流程参数pass,false为拒绝,true为同意
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = engine.getRuntimeService();
Integer pass = (Integer) runtimeService.getVariable(exId, ConstantUtils.PASS);
Integer countResult = (Integer) runtimeService.getVariable(exId, ConstantUtils.COUNT_RESULT);
/* 获取已经完成人数,所有审批人数 */
Integer complete = (Integer) runtimeService.getVariable(exId, "nrOfCompletedInstances");
Integer all = (Integer) runtimeService.getVariable(exId, "nrOfInstances");
if (Objects.equals(pass, 1) && (countResult == 0)) {
/* 只要有一个人不通过将则总监节点全部不通过返回【自评】节点 */
runtimeService.setVariable(exId, "nrOfCompletedInstances", all);
runtimeService.setVariable(exId, "result", "N");
} else if (Objects.equals(pass, 0) && (countResult == 0)) {
/* 说明都完成了并且没有人拒绝将流程跳转到【总经理】节点 */
if ((complete + 1) / all == 1) {
runtimeService.setVariable(exId, "result", "Y");
}
}
}
复制代码
总监网关节点
- 网关节点名称如下图
- 网关节点判断表达式
总监节点
- 如图
总监节点监听器
- complete监听器
Java的complete监听器位置:com.bci.internal.engine.bcibpmengine.listener.TkListener5
Java代码如下
package com.bci.internal.engine.bcibpmengine.listener;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 任务监听器
*
* @author
* @since 2021/3/21 0021
*/
public class TkListener5 implements TaskListener {
private static final Logger LOGGER = LoggerFactory.getLogger(TkListener5.class);
@Override
public void notify(DelegateTask delegateTask) {
LOGGER.info("执行人2:{}", delegateTask.getVariable("assigneeSelf"));
// 根据用户名查询查询出上级领导
delegateTask.setAssignee("salaboy");
}
}
复制代码
总经理网关节点
如图
总经理网关节点表达式
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END