flowable多任务实现会签、或签

1简介

做工作流,基本会遇到会签、或签的需求。而flowable是通过多任务方式来实现的

2主要实现方式

在流程运行到任务节点时不是按照默认规则只生成一条任务记录,而是根据需要同时生成多条任务记录,甚至生成的多条任务都能分别对应到指定的各个审批人。而不再需要领取。这种就叫多任务

要实现多任务,则需要对 需要的任务节点需要做相关处理

下面介绍了解到两种方式处理

2.1 xml方式

此种方式是直接通过在xml的相应节点来定义多任务,这种官方有大量的xml 例子

【官方】多任务的xml

使用flowable 官方的套件来配置多任务的交互见面大概如下(图片来源于网上):

[图片上传失败...(image-211f1c-1666348348264)]

最终对应到实际的核心xml详细如下 (下面xml不严格对应上图)

    <bpmn2:userTask id="Activity_1g65lke" name="审批啊14" flowable:assignee="${assignee}" flowable:candidateGroups="2317,2347" flowable:category="CHECK">
      <bpmn2:extensionElements>
        <flowable:executionListener class="***.listens.MultiInstanceListen" event="start" />

      </bpmn2:extensionElements>
      <bpmn2:incoming>Flow_1666168081285</bpmn2:incoming>
      <bpmn2:outgoing>Flow_03sldqb</bpmn2:outgoing>

      <bpmn2:multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee">
        <bpmn2:extensionElements>
          
        </bpmn2:extensionElements>
        <bpmn2:completionCondition>${nrOfCompletedInstances>=1}</bpmn2:completionCondition>
      </bpmn2:multiInstanceLoopCharacteristics>

    </bpmn2:userTask>

如果你不是用的官方的UI来生成的xml, 那么你的自己想办法也需要构造出上面的xml

2.2 java类后端处理

此种方式是我在调研时看到的,我并未尝试过,不太切合我们的需求,但是也是一种方式

此种方式就是运行到相应节点,后端通过调用api来生成多任务所需要的一切

这边就不放核心代码了,直接可以点击网友已经做好的整理

3 核心参数解释

上面应该能看到我们需要配置一些东西才能支持多任务。这里详细说下相关参数及重要点

3.1 相关参数

  1. isSequential: 表示并行,还是顺序。(xml跟配图可能有出入)

  2. loop cardinality:循环基数。可选项。可以直接填整数,表示会签、或签的人数 - (会创建基数个任务实例)

    使用该参数只能保证生成相应的任务,但是生成的任务没有assign

    该参数跟下面 collection 二选一就行

  3. flowable:collection: 此种方式是表示的会签、或签的具体人。这里xml只需要约定好固定的格式 即可。比如 flowable:collection="assigneeList"

  4. flowable:elementVariable: 元素变量, 这里xml只需要约定好固定的格式 即可 flowable:elementVariable="assignee"

  5. completionCondition:完成条件。这个条件控制着这里是会签、或签如何才能算完成。

    1. nrOfCompletedInstances: 完成的任务实例数
    2. nrOfInstances: 总共生成的任务实例数(根据会签、或签指定的人数生成相应的任务数)

    参考配置

    当是或签时,直接固定配置: ${nrOfCompletedInstances>=1} 即可

    当是会签时,固定配置: ${nrOfCompletedInstances==nrOfInstances} 即可

3.2 重要点

  1. 在会签、或签节点增加 multiInstanceLoopCharacteristics 相应的标签

  2. 指定生成的任务数。这里更建议使用 collection。 因为它可以相关配置做到 给生成的任务实例时就有assign

  3. 任务标签上属性 flowable:assignee="${assignee}" 必须固定这么指定,否则创建的多任务记录里面 assign还是没值

    属性assignee 取 Element varible的值,比如Element varible设置为assignee,Assignents就设置为${assignee}

  4. 如果节点是审批节点,那么一定需要在用户任务节点 的 extensionElements下添加 监听器

4 collection 赋值

4.1 使用原因

首先我们为什么要使用 collection 再次简单说下,通过上面的配置,当指定了 collection 的流程变量后,在引擎自动生成多任务时每个任务的assign都有值了。就不再需要增加业务逻辑处理(遍历多任务后然后拿到审批人,依次给每个任务塞 处理人)

4.2 如何赋值

做下来觉得最难的地方就是 collection 赋值的问题。思路线索很多,但是都存在问题

4.2.1 官方

首先说还是说官方的例子 点击查看MultiInstanceTest

里面竟然是通过在发起流程就指定了审批人。这种也太DEMO了点。审批人即使是配置时固定的人,在开始发起流程就有知道审批人,那么就需要去解析xml, 找到相应节点的审批人。这种一开始只被我用来做最后的打算

官方还给出另一种表达式方案 点击查看multiinstancemodel.bpmn

    <endEvent id="sid-194696BA-1A7D-47D7-95A9-A77390D25048"></endEvent>
    <userTask id="userTask1" name="User task 1" flowable:async="true" flowable:exclusive="false">
      <multiInstanceLoopCharacteristics isSequential="false" flowable:elementVariable="participant">
        <extensionElements>
          <flowable:collection flowable:class="org.flowable.engine.test.bpmn.multiinstance.JSONCollectionHandler">
            <flowable:string>
              <![CDATA[[
                   {
                     "principalType" : "User",
                     "role" : "PotentialOwner",
                     "principal" : "wfuser1",
                     "version" : 1
                   },
                   {
                     "principalType" : "User",
                     "role" : "PotentialOwner",
                     "principal" : "wfuser2",
                     "version" : 1
                   }
                 ]]]>
            </flowable:string>
          </flowable:collection>
        </extensionElements>
      </multiInstanceLoopCharacteristics>
    </userTask>

然后这种方式我是各种尝试,但是在流程走到该节点就出现解析不成功问题

最后我也查到了这种方式的来源是这篇帖子 Multi-instance collection syntax proposal 有更感兴趣的可以去看看

4.2.2 事件

在尝试使用上面方式失败后,我开始尝试用监听事件的方式来赋值collection 。

我尝试过 FlowableEngineEventType.ACTIVITY_STARTED 事件 , FlowableEngineEventType.TASK_CREATED 事件

但是发现都不行,他们都是在多任务已经创建完后才会执行相关的事件方法。这个时候已经生成的多个任务,但是它们的assign都是空的

4.2.3 执行监听器

我在网上查询方案,终于在一篇文中 activiti多实例设置(会签/或签) 看到能在任务创建前赋值collection 的可能。

然后我根据这个信息查到配置执行监听器最终做到在正确时机给 collection 赋值

首先,需要在xml需要添加监听器 (完整可以看看上面的xml)

<flowable:executionListener class="***.listens.MultiInstanceListen" event="start" />

然后看看实现

/**
 *  多任务监听,主要是把 多人任务xml设置的集合给填充掉
 */
@Component
@Slf4j
public class MultiInstanceListen implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        FlowElement element = execution.getCurrentFlowElement();
        if (element instanceof UserTask) {
            UserTask userTask = (UserTask) element;
            List<String> candidateGroups = userTask.getCandidateGroups();
            // 设置 setVariableLocal 会导致找不到 assigneeList 变量
            execution.setVariable("assigneeList", candidateGroups);
        }
    }
}

通过此方式,就会在创建多任务之前执行该监听器,从而让 assigneeList 集合存放在流程变量中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343