栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

activity多实例节点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

activity多实例节点

文章目录
  • 前言
  • 一、创建多实例
    • 1.创建节点
  • 一、多实例并行
    • 1.启动流程后,数据库数据效果图
    • 2.审核,数据库数据变化效果图
    • 3.如何判断多实例节点再审核一个人就结束
  • 二、多实例串行
    • 1.启动流程后,数据库数据效果图
    • 2.审核后,数据库数据变化效果图


前言

多实例节点,就是节点需要多个人审核,也是我们常说的会签。它又分为串行与并行,串行是多个人按一定顺序审核,第一个审核通过了,再到另一个人。并行就是多个人可以同时审核且不要求顺序,谁先审核都可以。最后按一定的完成率,结束多实例节点任务。


一、创建多实例

多实例节点创建成功后,流程自动生成变量(不需要我们提供):
1.nrOfInstances 该会签环节中总共有多少个实例
2.nrOfActiveInstances 当前活动的实例的数量,即还没有完成的实例数量。
3.nrOfCompletedInstances 已经完成的实例的数量

备注:setLoopCardinality为0是,默认跳过节点

1.创建节点
public static UserTask createMultiInstanceTask(String id) {
        UserTask userTask = new UserTask();
        userTask.setId(id);
        userTask.setName("#{taskName}");
        userTask.setAssignee("${assign}");
        userTask.setBehavior(createUserTaskBehavior(userTask));

        //多实例节点配置方式
        //loopCounter:表示特定实例的在循环的索引值。可以使用activiti的elementIndexVariable属性修改loopCounter的变量名
        MultiInstanceLoopCharacteristics m = new MultiInstanceLoopCharacteristics();
        //false时,表示的并行执行,即该节点下的多条任务可以同时执行;//true是串行,逐个任务执行
        m.setSequential(false);
        //elementVariable:流程变量,和上方的setAssignee结合
        m.setElementVariable("assign");
        m.setLoopCardinality("${nrOfOrders-nrOfCancellations}");任务数
        // 审核人参数,注意:因为命名问题,导致找不到官方对应的参数名,这个参数对应官方页面Collection
        m.setInputDataItem("assignList");
        //完成条件。这个也可以用m.setCompletionCondition("${complete}");不一定用内置参数
        m.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances >0.5 }");
        userTask.setLoopCharacteristics(m);
        
        return userTask;
    }
一、多实例并行

特点:提供多少审核人,就产生多少个任务节点。

以下提供例子,提供3个审核人,完成率>50%就结束节点任务,
通过数据库表参看数据变化,对多实例并行有个直观的认识:

1.启动流程后,数据库数据效果图

任务表(act_ru_task):

参数表(act_ru_variable):

2.审核,数据库数据变化效果图

用户multiUser2审核后,它在任务表中被删除(看ASSIGNEE_内容),如下数据变化

参数表(act_ru_variable):

主要变化就是:nrOfActiveInstances-1,nrOfCompletedInstances+1
当其中2个人完成审核,节点就结束了,因为满足了完成率

3.如何判断多实例节点再审核一个人就结束
// 当前节点完成状态
private boolean currentNodeCompletedStatus(BpmnModel model, Task task) {
        FlowNode flowNode = (FlowNode) model.getMainProcess().getFlowElement(task.getTaskDefinitionKey());
        if (!(flowNode.getBehavior() instanceof MultiInstanceActivityBehavior)) return true;

        ParallelMultiInstanceBehavior behavior = (ParallelMultiInstanceBehavior) flowNode.getBehavior();
        if (Objects.isNull(behavior) || Objects.isNull(behavior.getCompletionConditionExpression())) {
            log.error("多实例行为为空,且比例为空");
            BusinessException.throwConstraintException("多实例行为为空,且比例为空");
        }

        Map map = runtimeService.getVariables(task.getExecutionId());
        int completedInstance = MapUtils.getIntValue(map, "nrOfCompletedInstances");
        // nrOfCompletedInstances+1,如果达到完成率,说明节点即将完成
        map.put("nrOfCompletedInstances", completedInstance + 1);

        // 放入el表达式计算
        boolean isEnd = conditionExpressionBoolean(behavior.getCompletionConditionExpression().getExpressionText(), map);
        log.debug("当前节点[{}/{}]为多实例发放, 是否为最后一个人审核:{}", flowNode.getId(), flowNode.getName(), isEnd ? "是" : "否");

        return isEnd;
    }
二、多实例串行

特点:提供审核人顺序,决定他们审核顺序。第一个人审核通过了,才到第二个人,以此类推到完成。

以下提供例子,提供3个审核人,完成率>50%就结束节点任务,
通过数据库表参看数据变化,对多实例并行有个直观的认识:

1.启动流程后,数据库数据效果图

任务表(act_ru_task):

参数表(act_ru_variable):

跟并行相比,这里assign只有一个用户;

2.审核后,数据库数据变化效果图

用户multiUser1审核后,就进入下一个审核multiUser2,如下数据变化

参数表(act_ru_variable):

主要变化就是:nrOfActiveInstances-1,nrOfCompletedInstances+1
当2个人完成审核,节点就结束了,因为满足了完成率


如果你对工作流感兴趣,想了解更多,请点击
Java工作流管理系统(activity6.0)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866251.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号