A-A+

Flowable6.4 – 加签和减签

2019年08月11日 技术, 默认 评论 15 条 阅读 19,100 次

趁着旅游归来的短暂休息,了解一下Flowable中的加签和减签操作。主要是以下两个方法来实现:

runtimeService.addMultiInstanceExecution(String activityId, String parentExecutionId, Map<String, Object> executionVariables)

runtimeService.deleteMultiInstanceExecution(String executionId, boolean executionIsCompleted)

依然是先上流程图:

其中会签节点是多实例节点,此流程的关键xml片段如下:

<process id="TestMutiTask" isExecutable="true">
    <startEvent id="Start1" name="开始"></startEvent>
    <userTask id="UserTask1" name="处理"></userTask>
    <sequenceFlow id="sid-D14A5BC6-A61E-461F-AD33-0042E91B8B13" sourceRef="Start1" targetRef="UserTask1"></sequenceFlow>
    <userTask id="UserTask2" name="会签">
      <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="${subProcessHelper.getUserNames()}" flowable:elementVariable="assignee">
        <completionCondition>${subProcessHelper.isComplete(execution)}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <sequenceFlow id="sid-E6847EF6-F54F-409B-AF8B-DCA62ECDC76F" sourceRef="UserTask1" targetRef="UserTask2"></sequenceFlow>
    <userTask id="UserTask3" name="审批"></userTask>
    <sequenceFlow id="sid-AF828B84-DDAA-4056-88C5-9D4F6EA9F725" sourceRef="UserTask2" targetRef="UserTask3"></sequenceFlow>
    <endEvent id="End1" name="结束"></endEvent>
    <sequenceFlow id="sid-C49B6256-0827-4CF5-8A47-5860A107142A" sourceRef="UserTask3" targetRef="End1"></sequenceFlow>
  </process>

subProcessHelper.getUserNames():会返回一个List<String>集合,会签节点会根据此集合的数量生成相对应的实例。

subProcessHelper.isComplete(execution):用来判断会签节点是否完成,这里设置的条件为“已完成数量/总数量>2/3”。

调用加签和减签的方法如下:

     /**
     * 增加流程执行实例
     * @param nodeId
     * @param proInstId
     * @param assigneeStr 以逗号隔开的字符串
     */

    @RequestMapping(value = "addExecution/{nodeId}/{proInstId}/{assignees}")
    public void addExecution(@PathVariable("nodeId") String nodeId,
                             @PathVariable("proInstId") String proInstId,
                             @PathVariable("assignees") String assigneeStr) 
{
        String[] assignees = assigneeStr.split(",");
        for (String assignee : assignees) {
            runtimeService.addMultiInstanceExecution(nodeId, proInstId, Collections.singletonMap("assignee", (Object) assignee));
        }
    }

    /**
     * 删除流程执行实例
     * @param excutionId
     * @param complated 是否完成此流程执行实例
     */

    @RequestMapping(value = "delExecution/{excutionId}/{complated}")
    public void delExecution(@PathVariable("excutionId") String excutionId,
                             @PathVariable("complated") Boolean complated) 
{
        runtimeService.deleteMultiInstanceExecution(excutionId, complated);
    }

启动流程,将流程跳转至会签节点,如下图所示:

act_ru_task
act_ru_execution

此时请求加签方法:

http://localhost:8080/flowabledemo/flow/addExecution/UserTask2/55001/test004

流程会增加一个新的子实例,并且会增加相对应的参数,如下:

act_ru_task
act_ru_execution
act_ru_variable

此时如果请求减签的方法:

http://localhost:8080/flowabledemo/flow/delExecution/55034/0

流程中相对应的Task和Variable会被删除:

act_ru_task

以上,就是本次试验的内容,需要注意的是,在减签时,如果Task正好是该多实例节点中的最后一个,将导致流程无法继续流转。下次可以分析一下源码,看看为何会这样。

有问题的话,欢迎指正和讨论。

觉的不错?可以关注我的公众号↑↑↑

15 条留言  访客:0 条  博主:0 条

  1. 大程

    subProcessHelper.getUserNames()
    subProcessHelper.isComplete(execution)
    的具体代码可以贴一下吗,谢谢大佬

    • 哼哼的泰迪熊
      package com.xnck.demo.activitidemo.helper.impl;

      import com.xnck.demo.activitidemo.helper.SubProcessHelper;
      import org.activiti.engine.delegate.DelegateExecution;

      import java.util.ArrayList;
      import java.util.List;

      public class SubProcessHelperImpl implements SubProcessHelper {

          @Override
          public List<String> getUserNames() {
              List<String> userNames = new ArrayList<>();
              userNames.add("test001");
              userNames.add("test002");
              userNames.add("test003");
              return userNames;
          }

          @Override
          public boolean isComplete(DelegateExecution execution) {
              Integer completeInstCount = (Integer) execution.getVariable("nrOfCompletedInstances");
              Integer instCount = (Integer) execution.getVariable("nrOfInstances");
      //        int agreeCount = 0;
      //        if (null != completeInstCount) {
      //            for (int i = 0; i < completeInstCount; i++) {
      //                Object opinionObj = execution.getVariable("opinion" + (i + 1));
      //                if (null != opinionObj && "agree".equals(opinionObj.toString())) {
      //                    agreeCount++;
      //                }
      //            }
      //            if (((float)instCount / 2) < agreeCount) {
      //                return true;
      //            }
      //        }
      //        return instCount.equals(completeInstCount);
              return completeInstCount > 1;
          }
      }
  2. shang20017

    大佬,subProcessHelper是如何从java中注入到流程里的,我按照你这样写,会报找不到subProcessHelper的异常,我加上Service注解是可以找到的,你是在spring xml配置文件中加的吗

    • 哼哼的泰迪熊

      是的,我在xml文件里面配置了一下

      这块确实写得不太清楚,不好意思

  3. shang20017

    还有一个问题,如果要做特定前加签或者后加签,有实现方式吗?

    • 哼哼的泰迪熊

      这个问题我可以试验一下,不过你的特定前加签和后加签具体指的是什么?在当前的审批人前面或后面增加一个审批人?你的这个节点是并行的还是串行的?

      • 哼哼的泰迪熊

        其实从我个人角度来说,我比较倾向于将节点的办理人和表单信息放到外部作为业务逻辑处理,毕竟这些都是比较定制化的需求,流程引擎只负责流转就好。

  4. qwer

    大佬,当审批的时候是串行,又该怎样加签呢

    • 哼哼的泰迪熊

      我记得串行也是那么加,它会在execution的表中增加一条记录,然后每次complete按顺序去执行。串行其实看成一个接一个的UserTask就可以。

      • libiubiuu

        串行会有BUG

        • 哼哼的泰迪熊

          是什么BUG,我试试看?

  5. lee

    org.flowable.common.engine.api.FlowableException: No multi instance execution found for activity id N4。博主有遇到过这个问题吗在加签的时候

    • 哼哼的泰迪熊

      没有遇到过,最近比较忙,有时间我看下源码试试

  6. 嘿嘿的小胖

    楼主 创立了交流群码? 或者楼主方便加个联系方式一起讨论一下码?

    • 哼哼的泰迪熊

      木有群

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: