flowable会签


1、会签

会签的意思是,在流程任务管理中,任务通常是由一个人或者多个人同时去处理的,这种任务叫做会签任务。类似于并行网关。

2、会签类型

按数量通过:达到一定数量的处理后,会签通过

按比例通过:达到一定比例的处理后,会签通过

一票否决:只有一个人不同意时,会签通过

一票通过:只有一个同意时,会签通过

Flowable实现会签是基于多实例任务的,将节点设置成多实例,通过在userTask节点的属性配置。

3、多实例类型

可以选择并行会签(parallel)顺序会签(sequential),其中并行会签的意思是 多个人同时执行任务。顺序会签是按顺序执行任务。

flowable多实例会签如何在java flowable多人会签_List

4、集合多实例

flowable多实例会签如何在java flowable多人会签_flowable_02

会签人员的集合变量,可以随意命名。

5、元素变量多实例

flowable多实例会签如何在java flowable多人会签_xml_03

循环集合多实例集合的变量名,可以随意命名。注意没有${}

// 类似于这样的
for (String assignee : userList) {
  
}
6、分配用户

flowable多实例会签如何在java flowable多人会签_List_04

分配用户的变量名称和元素变量的名称需要保持一致

7、完成条件多实例

默认流程变量:

nrOfInstances:会签中总共的实例数量

nrOfCompletedInstances:已经完成的实例数量

nrOfActiviteInstances:当前活动的实例数量,即还未完成的实例数量

所以该项可设置,例如:

${nrOfInstances == nrOfCompletedInstances}:表示所有人都需要完成任务会签才结束

${nrOfCompletedInstances == 1}:表示一个人完成任务,会签结束

其他条件可以一次类推实现

8、demo

这里设置的完成条件:${nrOfCompletedInstances == 2},即2个人完成任务后,会签结束。

flowable多实例会签如何在java flowable多人会签_多实例_05

<?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:flowable="http://flowable.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.flowable.org/processdef">
  <process id="会签" name="会签" isExecutable="true">
    <startEvent id="sid-5D778986-A0DE-4D4E-9B67-BEF2C4366998" flowable:formFieldValidation="true"></startEvent>
    <userTask id="sid-CA82212E-61D4-488D-BC8B-05D92CD1EE67" flowable:assignee="${assignee}" flowable:formFieldValidation="true">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="${userList}" flowable:elementVariable="assignee">
        <completionCondition>${nrOfCompletedInstances == 2}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <sequenceFlow id="sid-FFB112DA-5E2E-4786-8648-92CD5D07A96F" sourceRef="sid-5D778986-A0DE-4D4E-9B67-BEF2C4366998" targetRef="sid-CA82212E-61D4-488D-BC8B-05D92CD1EE67"></sequenceFlow>
    <endEvent id="sid-A14D3EA7-7E7C-4B6F-9F74-898FB7A7A2AD"></endEvent>
    <sequenceFlow id="sid-E01B5521-5658-4AD4-8E6A-1790F1DBABCB" sourceRef="sid-CA82212E-61D4-488D-BC8B-05D92CD1EE67" targetRef="sid-A14D3EA7-7E7C-4B6F-9F74-898FB7A7A2AD"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_会签">
    <bpmndi:BPMNPlane bpmnElement="会签" id="BPMNPlane_会签">
      <bpmndi:BPMNShape bpmnElement="sid-5D778986-A0DE-4D4E-9B67-BEF2C4366998" id="BPMNShape_sid-5D778986-A0DE-4D4E-9B67-BEF2C4366998">
        <omgdc:Bounds height="30.0" width="30.0" x="178.00000737607468" y="185.00000149011612"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-CA82212E-61D4-488D-BC8B-05D92CD1EE67" id="BPMNShape_sid-CA82212E-61D4-488D-BC8B-05D92CD1EE67">
        <omgdc:Bounds height="80.0" width="100.0" x="315.0" y="160.00000149011612"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-A14D3EA7-7E7C-4B6F-9F74-898FB7A7A2AD" id="BPMNShape_sid-A14D3EA7-7E7C-4B6F-9F74-898FB7A7A2AD">
        <omgdc:Bounds height="28.0" width="28.0" x="555.0" y="186.00000149011612"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-E01B5521-5658-4AD4-8E6A-1790F1DBABCB" id="BPMNEdge_sid-E01B5521-5658-4AD4-8E6A-1790F1DBABCB">
        <omgdi:waypoint x="414.94999999992945" y="200.00000149011612"></omgdi:waypoint>
        <omgdi:waypoint x="555.0" y="200.00000149011612"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-FFB112DA-5E2E-4786-8648-92CD5D07A96F" id="BPMNEdge_sid-FFB112DA-5E2E-4786-8648-92CD5D07A96F">
        <omgdi:waypoint x="207.95000675825347" y="200.00000149011612"></omgdi:waypoint>
        <omgdi:waypoint x="314.99999999983766" y="200.00000149011612"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

部署并启动流程:

/**
     * 部署流程
     */
    @Test
    public void deployment() {
        //获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取RepositoryService部署流程
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment().name("会签流程").addClasspathResource("会签.bpmn20.xml").deploy();
        System.out.println(deploy.getId());
    }

    /**
     * 启动流程定义
     */
    @Test
    public void startProcess() {
        //获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取RuntimeService启动流程
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //启动流程定义时需要配置集合多实例,会签人员的集合变量userList
        Map<String, Object> variables = new HashMap<>();
        variables.put("userList", Arrays.asList("张三","李四 ", "王五"));

        //参数是act_re_procdef表的主键
        runtimeService.startProcessInstanceById("会签:1:102504", variables);
    }

成功启动后,act_ru_task表中,会签的流程会有三条任务,因为userList变量集合只设置了三个人

flowable多实例会签如何在java flowable多人会签_List_06

完成流程:

先完成一条任务

/**
     * 完成任务
     */
    @Test
    public void completeTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        TaskService taskService = processEngine.getTaskService();

        //为了方便,直接去库里找到该数据
        taskService.complete("105019");
    }

完成成功后流程并不会往下一个节点走,任务表里还有两个任务,因为设置的完成条件:${nrOfCompletedInstances == 2},需要2个人完成任务后,会签才结束。

flowable多实例会签如何在java flowable多人会签_xml_07

再完成一条任务:

/**
     * 完成任务
     */
    @Test
    public void completeTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        TaskService taskService = processEngine.getTaskService();

        //为了方便,直接去库里找到该数据
        taskService.complete("105024");
    }

完成后,再查看act_ru_task表,已经没有当前任务数据了,因为已经满足会签任务结束的条件,按照流程的设计,流程执行到下一个节点,也就是结束节点。

然后,更多的实例情况,可以自行设置会签任务的完成条件来测试