2019-06-09

<pre>

/**

* 获取下一个用户任务信息 

* @param String taskId    任务Id信息 

* @return  下一个用户任务用户组信息 

* @throws Exception

*/ 

public TaskDefinition getNextTaskInfo(String taskId) throws Exception { 

    ProcessDefinitionEntity processDefinitionEntity = null; 

    String id = null; 

    TaskDefinition task = null; 

    //获取流程实例Id信息 

    String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId(); 

    //获取流程发布Id信息 

    String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId(); 

    processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) 

            .getDeployedProcessDefinition(definitionId); 

    ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); 

    //当前流程节点Id信息 

    String activitiId = execution.getActivityId();   

    //获取流程所有节点信息 

    List<ActivityImpl> activitiList = processDefinitionEntity.getActivities(); 

    //遍历所有节点信息 

    for(ActivityImpl activityImpl : activitiList){     

        id = activityImpl.getId();   

        if (activitiId.equals(id)) {

            //获取下一个节点信息 

            task = nextTaskDefinition(activityImpl, activityImpl.getId(), null, processInstanceId);

            break;

        }

    } 

    return task; 

} 

/** 

* 下一个任务节点信息, 

* 

* 如果下一个节点为用户任务则直接返回, 

* 

* 如果下一个节点为排他网关, 获取排他网关Id信息, 根据排他网关Id信息和execution获取流程实例排他网关Id为key的变量值, 

* 根据变量值分别执行排他网关后线路中的el表达式, 并找到el表达式通过的线路后的用户任务

* @param ActivityImpl activityImpl    流程节点信息 

* @param String activityId            当前流程节点Id信息 

* @param String elString              排他网关顺序流线段判断条件

* @param String processInstanceId      流程实例Id信息 

* @return 

*/   

private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString, String processInstanceId){ 

    PvmActivity ac = null;

    Object s = null;

    // 如果遍历节点为用户任务并且节点不是当前节点信息

    if ("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())) {

        // 获取该节点下一个节点信息

        TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior())

                .getTaskDefinition();

        return taskDefinition;

    } else {

        // 获取节点所有流向线路信息

        List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();

        List<PvmTransition> outTransitionsTemp = null;

        for (PvmTransition tr : outTransitions) {

            ac = tr.getDestination(); // 获取线路的终点节点

            // 如果流向线路为排他网关

            if ("exclusiveGateway".equals(ac.getProperty("type"))) {

                outTransitionsTemp = ac.getOutgoingTransitions();

                // 如果网关路线判断条件为空信息

                if (StringUtils.isEmpty(elString)) {

                    // 获取流程启动时设置的网关判断条件信息

                    elString = getGatewayCondition(ac.getId(), processInstanceId);

                }

                // 如果排他网关只有一条线路信息

                if (outTransitionsTemp.size() == 1) {

                    return nextTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), activityId,

                            elString, processInstanceId);

                } else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息

                    for (PvmTransition tr1 : outTransitionsTemp) {

                        s = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息

                        // 判断el表达式是否成立

                        if (isCondition(ac.getId(), StringUtils.trim(s.toString()), elString)) {

                            return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,

                                    processInstanceId);

                        }

                    }

                }

            } else if ("userTask".equals(ac.getProperty("type"))) {

                return ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition();

            } else {

            }

        }

        return null;

    }

} 

/**

* 查询流程启动时设置排他网关判断条件信息 

* @param String gatewayId          排他网关Id信息, 流程启动时设置网关路线判断条件key为网关Id信息 

* @param String processInstanceId  流程实例Id信息 

* @return

*/ 

public String getGatewayCondition(String gatewayId, String processInstanceId) { 

    Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();

    Object object= runtimeService.getVariable(execution.getId(), gatewayId);

    return object==null? "":object.toString(); 

} 

/**

* 根据key和value判断el表达式是否通过信息 

* @param String key    el表达式key信息 

* @param String el    el表达式信息 

* @param String value  el表达式传入值信息 

* @return

*/ 

public boolean isCondition(String key, String el, String value) { 

    ExpressionFactory factory = new ExpressionFactoryImpl();   

    SimpleContext context = new SimpleContext();   

    context.setVariable(key, factory.createValueExpression(value, String.class));   

    ValueExpression e = factory.createValueExpression(context, el, boolean.class);   

    return (Boolean) e.getValue(context); 

} 

</pre>

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

推荐阅读更多精彩内容

  • 晏起,无语,想打人!为什么那么多瞌睡? 准备分享内容,先看着书,思路还没理清,准备了些内容。不想失信于人又想做到完...
    Ailsa_a73a阅读 150评论 0 1
  • 一、学习与实践 1.付出不亚于任何人的努力 2.要谦虚,不要骄傲 3.要每天反省 4.活着,就要感谢 5.积善行,...
    015058阅读 143评论 0 1
  • 白木林阅读 78评论 0 0
  • 《我的故事里没有你》 ——羅紅 沉寂的夜思绪不定 冰冷的幻觉为你一意孤行 ...
    西风不解阅读 145评论 0 4
  • 1. 林志玲的信息让我觉得内心有种失去感,仿佛她就是自己曾经的爱人,而不想听到她的消息,却又被迫每天都能收到她的消...
    向上是种力阅读 204评论 0 0