Activiti7 M4 会签,网关驳回流程(一)

背景

  • 最近在研究Activiti6/7流程引擎能支持哪些具体业务功能,为此写了一个流程来验证功能。

验证功能

  • 使用bpmnjs绘制流程图
  • 使用多人会签节点
  • 使用开始/结束/完成监等听器
  • 排他网关

流程图如下

image.png

环境支持

  • Activiti7 M4
  • JDK 11
  • MySql 5.7
  • SpringBoot 2.2.6
  • Mybatis-plus 3.4.0
  • Swagger 2.9.2

流程图节点介绍

开始节点

  • 开始节点名称编写和节点名称设置如下图

image.png

  • 设置开始节点监听器

image.png

  • 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);
    }
}
复制代码

自评节点

image.png

总监节点

  • 总监节点是一个多人会签节点
  • 总监会签节点业务场景如下
    • 只要有一个人驳回整个会签节点结束回到自评节点
    • 总监节点的会签人员必须所有人同意后才能走向网关节点

总监会签节点如下图

image.png

  • 完成条件解读
    • nrOfCompletedInstances 当前节点完成人数
    • nrOfInstances 节点完成需要的中人数
    • nrOfCompletedInstances/nrOfInstances 当前节点完成总人数除以需要完成任务的总人数的结果为1 时,流程就可以走向网关节点
${nrOfCompletedInstances/nrOfInstances==1}
复制代码

image.png

总监节点执行监听器

  • start监听器(现在弃用)

image.png

总监节点任务监听器

  • create监听器(现在弃用)

image.png

Java的create监听器位置:com.bci.internal.engine.bcibpmengine.listener.TkListener6

  • complete监听器

image.png

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");
           }
       }
   }
复制代码

总监网关节点

  • 网关节点名称如下图

image.png

  • 网关节点判断表达式

image.png

总监节点

  • 如图

image.png

总监节点监听器

  • complete监听器

image.png

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");
    }
}
复制代码

总经理网关节点

如图

image.png

总经理网关节点表达式

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享