前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【第十八篇】Flowable之多人会签

【第十八篇】Flowable之多人会签

作者头像
用户4919348
发布2022-04-13 15:41:28
3.9K0
发布2022-04-13 15:41:28
举报
文章被收录于专栏:波波烤鸭

一、多人会签

1.流程图绘制

  多人会签是指一个任务需要多个人来处理,案例讲解

在这里插入图片描述
在这里插入图片描述

完整的xml内容

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
    <process id="myProcess" name="My process" isExecutable="true">
        <startEvent id="startevent1" name="Start"></startEvent>
        <userTask id="usertask1" name="User Task">
            <extensionElements>
                <activiti:taskListener event="create" expression="${mulitiInstanceTaskListener.completeListener(execution)}"></activiti:taskListener>
            </extensionElements>
            <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="persons" activiti:elementVariable="person">
                <loopCardinality>3</loopCardinality>
                <completionCondition>${mulitiInstanceCompleteTask.completeTask(execution)}</completionCondition>
            </multiInstanceLoopCharacteristics>
        </userTask>
        <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
        <endEvent id="endevent1" name="End"></endEvent>
        <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
        <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
            <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="420.0" y="310.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
                <omgdc:Bounds height="55.0" width="105.0" x="700.0" y="300.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="950.0" y="310.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
                <omgdi:waypoint x="455.0" y="327.0"></omgdi:waypoint>
                <omgdi:waypoint x="700.0" y="327.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
                <omgdi:waypoint x="805.0" y="327.0"></omgdi:waypoint>
                <omgdi:waypoint x="950.0" y="327.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

2. 流程说明

1.在用户任务节点绑定了一个监听器,监听create行为,该监听器我们是通过UEL表达式来实现的,mulitiInstanceTaskListener是我们注入到Spring容器中的对象

在这里插入图片描述
在这里插入图片描述

对应的监听的代码如下:

代码语言:javascript
复制
@Component("mulitiInstanceTaskListener")
public class MulitiInstanceTaskListener implements Serializable {
    
    public void completeListener(DelegateExecution execution){
        System.out.println("任务:"+execution.getId());
        System.out.println("persons:" + execution.getVariable("persons"));
        System.out.println("person" + execution.getVariable("person"));
    }
}

2.在Multi instance中的配置

  • Loop cardinality:设置为3表示只循环3次,也就是三个人会签
  • Collection:表示要循环的集合,我们给的是persons,后面需要在流程变量中赋值
  • Element variable:表示循环的变量
  • Completion condition:表示任务结束的条件,也就是多人会签的结束条件,在此处我们用的是UEL表达式,mulitiInstanceCompleteTask表示的是我们注入到Spring容器中的对象
在这里插入图片描述
在这里插入图片描述

mulitiInstanceCompleteTask对象的完整代码为:

代码语言:javascript
复制
@Component("mulitiInstanceCompleteTask")
public class MulitiInstanceCompleteTask implements Serializable {
    /**
     * 完成任务是需要触发的方法
     * @param execution
     * @return
     *     false 表示会签任务还没有结束
     *     true 表示会签任务结束了
     */
    public boolean completeTask(DelegateExecution execution) {
        System.out.println("总的会签任务数量:" + execution.getVariable("nrOfInstances")
                + "当前获取的会签任务数量:" + execution.getVariable("nrOfActiveInstances")
                + " - " + "已经完成的会签任务数量:" + execution.getVariable("nrOfCompletedInstances"));
        //有一个人同意就通过
        Boolean flag = (Boolean) execution.getVariable("flag");
        System.out.println("当前意见:"+flag);
        return flag;
    }
}

上面的三个变量是Flowable中自带的可用变量

  1. nrOfInstances:该会签环节中总共有多少个实例
  2. nrOfActiveInstances:当前活动的实例的数量,即还没有完成的实例数量。
  3. nrOfCompletedInstances:已经完成的实例的数量

3.案例演示

3.1 部署流程

代码语言:javascript
复制
    /**
     * Deploy
     */
    @Test
    void testDeploy() throws Exception {
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("会签案例.bpmn20.xml")
                .name("会签案例")
                .deploy();
        System.out.println("deploy.getId() = " + deploy.getId());
        System.out.println("deploy.getName() = " + deploy.getName());
        System.out.println("部署开始的时间:" + new Date());
        //TimeUnit.MINUTES.sleep(3);
    }

3.2 启动流程

  在启动流程实例的时候,我们需要设置相关的参数,在流程定义的时候设置的persons在此处我们就需要设置了,设置为Arrays.asList(“张三”,“李四”,“王五”,“赵六”),这里设置了4个元素,在流程定义里定义了3个,表示只会循环3次,启动流程后,在Task中可以看到只有3个任务

代码语言:javascript
复制
    @Test
    void startFlow() throws Exception{
        Map<String,Object> map = new HashMap<>();
        // 设置多人会签的数据
        map.put("persons", Arrays.asList("张三","李四","王五","赵六"));
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("myProcess:1:ba1518fc-b22d-11ec-9313-c03c59ad2248",map);
    }
在这里插入图片描述
在这里插入图片描述

同时控制也有对应的输出,触发了Task的创建事件

在这里插入图片描述
在这里插入图片描述

3.3 会签处理任务

  启动流程后我们发下在Task中产生了3条任务,我们先通过TaskService来完成其中一个任务,设置一个标志flag为false,来控制会签还没有结束,同时Task中另外两个任务还在

代码语言:javascript
复制
    @Test
    void completeTask1(){
        Map<String,Object> map = new HashMap<>();
        map.put("flag",false);
        taskService.complete("71337501-b22e-11ec-a534-c03c59ad2248",map);
        System.out.println("complete ....");
    }
在这里插入图片描述
在这里插入图片描述

当任务执行完成时会同步触发会签完成表达式中对象方法。有如下的输出

在这里插入图片描述
在这里插入图片描述

同时Task表中的记录还有两条

在这里插入图片描述
在这里插入图片描述

然后当我们在完成一个任务,这时设置flag为true,会发现在这个多人处理中,最多3个人处理在第二个人处理后就结束了

代码语言:javascript
复制
    @Test
    void completeTask1(){
        Map<String,Object> map = new HashMap<>();
        map.put("flag",true); // 设置为true 结束多人会签
        taskService.complete("713570d4-b22e-11ec-a534-c03c59ad2248",map);
        System.out.println("complete ....");
    }
在这里插入图片描述
在这里插入图片描述

同时来看看表结构中的记录,发现没有了

在这里插入图片描述
在这里插入图片描述

搞定~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/04/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、多人会签
    • 1.流程图绘制
      • 2. 流程说明
        • 3.案例演示
          • 3.1 部署流程
          • 3.2 启动流程
          • 3.3 会签处理任务
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档