zoukankan      html  css  js  c++  java
  • Activiti 设置会签

    前些天在群里聊工作流和Activiti,群里有人分享了自己的工作流引擎开源项目,大伙纷纷问这问那(比如为什么突然自己搞个process engine、有没有eclipse plugin、能不能绘制流程图等等)。

    现实生活中的工作流程,我们也经常碰到需要会签的情况,支持会签是很必要的。
    正好有两个人问道:支持会签吗? 也有人也问道:什么是会签?

    如果从process engine的角度上讲呢?
    可以说一个task节点下有多个task instance。
    而不是一个从task节点执行到多个task节点(这样就是ParallelGateway了)。

    如何让一个Task节点创建出多个instance?官网是这样说的:

    To make an activity multi-instance, the activity xml element must have a multiInstanceLoopCharacteristics child element.


    既然是创建多个实例,我们就需要用一个集合去存放。
    我们可以在multiInstanceLoopCharacteristics标签中加入一个attribute —— activiti:collection=""。
    该attribute的值是当前流程实例的变量名,也就是启动该引擎实例时传入的Map的key。
    而这个Map的value必须是java.util.List类型的。但我们无需在意这个List的泛型是什么。
    假如泛型是String的话,act_ru_variable中变量的TYPE_字段值是string。
    也许我可以让泛型是Map,那么该变量的TYPE_字段值是serialize,仅此而已。
    本文中activiti:collection="assigneeList"

    我们在数据库里记录了这个集合,但我们也需要记录这个记录中的每一个元素。
    记录每一个元素时他们的名字应该是什么?
    我们可以用activiti:elementVariable="" 比如我设置:

        activiti:elementVariable="assignee"
    


    假设我们现在要的效果是:有三个人可以会签,但只要两个人签署便可通过。
    我们需要设置特定的条件来结束当前这个task。
    这时我们需要在multiInstanceLoopCharacteristics下增加一个子节点——completionCondition
    比如我是这样设置的:

        <completionCondition>
            ${signCount >= 2 }
        </completionCondition>
    


    好了,这样就是整个Task的定义了。(事实上我完全可以不用signCount实现这个效果。)

    <userTask id="counterTask_1" name="COUNTERTASK">
        <multiInstanceLoopCharacteristics
            isSequential="false"
            activiti:collection="assigneeList"
            activiti:elementVariable="assignee">
            <completionCondition>${signCount >= 2 }</completionCondition>
        </multiInstanceLoopCharacteristics>
    </userTask>
    

    部署后的结果如下: 

    此处省略部署流程的操作,我们来看一下如何申请该流程。
    如下我在页面中定义了三个审核人员:

    <label>
        <input type="checkbox" name="assigneeList" value="kim"/>kim
    </label>
    <label>
        <input type="checkbox" name="assigneeList" value="jin"/>jin
    </label>
    <label>
        <input type="checkbox" name="assigneeList" value="king"/>king
    </label>
    


    然后在java中接收并start:

    private String[] assigneeList;
    Map<String, Object> processInstVar = new HashMap<String, Object>();
    //必须是List
    processInstVar.put("assigneeList", Arrays.asList(assigneeList));
    processInstVar.put("signCount", 0);
    runtimeService.startProcessInstanceById(processId, processInstVar);
    


    启动结果如下:

     


    然后是执行,method只接收一个taskId:

    List<Task> taskResultList = taskService.createTaskQuery().taskId(taskId)
                    .list();
    //当前executionId
    String currentExecutionId = taskResultList.get(0).getExecutionId();
    //当前签署总数
    String currentSignCount = StringUtils.defaultString(runtimeService
            .getVariable(currentExecutionId, "signCount").toString(), "0");
    //签署数+1
    runtimeService.setVariable(currentExecutionId, "signCount",
            Integer.parseInt(currentSignCount) + 1);
    
    //完成
    taskService.complete(taskId);
    


    我们执行了刚才创建的三个实例之一,结果是:


    再执行一次,会签节点的实例已经不存在于actrutask表了,因为我设置的是“有两个人签署便通过”。
    如下图,当前task已经不是会签的task了,相关的变量也消失不见了。
     


    最后说我之前为什么说道‘事实上我完全可以不用signCount实现这个效果’,因为我们有:

    所以我完全没有必要自己去定义一个变量去记录执行了多少次

  • 相关阅读:
    java 线程状态和转化
    初学Spring
    unittest --- 单元测试
    Python单例模式的两种实现方式
    python records操作数据库
    数据可视化之——matplotlib基础学习
    python使用list维护成一个队列
    Python将list列表维护成一个栈
    Python使用rsa模块实现非对称加密与解密
    python +OpenCV实现rtmp视频流媒体的播放
  • 原文地址:https://www.cnblogs.com/jinkora/p/4369687.html
Copyright © 2011-2022 走看看