activiti 当前任务的下一个节点

8人阅读 评论(0) 收藏 举报
分类:
/**
     * 
     * @Description (下一个任务节点信息)
     * @author feizhou
     * @Date 2018年4月13日下午5:40:23
     * @version 1.0.0
     * @param activityImpl
     *            流程节点信息
     * @param activityId
     *            当前流程节点Id信息
     * @param variables
     *            流程变量
     * @param processInstanceId
     *            流程实例ID
     * @return
     */
    public TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId,
            Map<String, Object> variables, String processInstanceId) {

        PvmActivity ac = null;

        // 如果遍历节点为用户任务并且节点不是当前节点信息
        if ("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())) {
            // 获取该节点下一个节点信息
            TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior())
                    .getTaskDefinition();
            return taskDefinition;

        } else if (!"endEvent".equals(activityImpl.getProperty("type"))) {
            // 当前节点是不结束节点的情况

            // 获取节点所有流向线路信息
            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 (outTransitionsTemp.size() == 1) {
                        return nextTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), activityId,
                                variables, processInstanceId);
                    } else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息

                        ActivityImpl nextActivityImpl = getNextActivityImplByLineCondition(outTransitionsTemp,
                                variables);
                        return nextTaskDefinition(nextActivityImpl, activityId, variables, processInstanceId);

                    }
                } else if ("userTask".equals(ac.getProperty("type"))) {// 下一个节点是用户任务
                    Boolean currenLineConditionResule = getCurrenLineConditionResule(tr, variables);
                    if (currenLineConditionResule) {
                        return ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior())
                                .getTaskDefinition();
                    }
                }

            }
        }
        return null;
    }
/**
     * 
     * @Description (判断当前流程线是否满足流程参数条件)
     * @author feizhou
     * @Date 2018年4月13日下午6:32:16
     * @version 1.0.0
     * @param outTransition
     * @param variables
     * @return
     */
    public Boolean getCurrenLineConditionResule(PvmTransition outTransition, Map<String, Object> variables) {

        boolean stringtoBoolean = true;
        Object conStr = outTransition.getProperty("conditionText"); // 获取线路判断条件信息
        // s: ${money>1000 or price >12}
        // variables (money=1100)
        // variables (price=100)
        // 去掉${和}
        String ElStr = "";
        if (conStr != null) {// 有条件
            ElStr = String.valueOf(conStr);
            ElStr = ElStr.substring(2, ElStr.length() - 1);
            try {
                stringtoBoolean = StringUtil.StringtoBoolean(ElStr, variables);
            } catch (ScriptException e) {
                e.printStackTrace();
            }
            return stringtoBoolean;
        } else {// 没有条件
            return stringtoBoolean;
        }
    }
/**
     * 
     * @Description (如果是排他网关判断,获取排他网关对应的用户任务节点)
     * @author feizhou
     * @Date 2018年4月13日下午4:41:55
     * @version 1.0.0
     * @param outTransitionsTemp
     * @param variables
     * @return
     */
    public ActivityImpl getNextActivityImplByLineCondition(List<PvmTransition> outTransitionsTemp,
            Map<String, Object> variables) {

        for (PvmTransition tr1 : outTransitionsTemp) {
            Object conStr = tr1.getProperty("conditionText"); // 获取线路判断条件信息
            // s: ${money>1000 or price >12}
            // variables (money=1100)
            // variables (price=100)
            // 去掉${和}
            String ElStr = "";
            if (conStr != null) {// 有条件
                ElStr = String.valueOf(conStr);
                ElStr = ElStr.substring(2, ElStr.length() - 1);
                try {
                    boolean stringtoBoolean = StringUtil.StringtoBoolean(ElStr, variables);
                    if (stringtoBoolean) {
                        return (ActivityImpl) tr1.getDestination();
                    }
                } catch (ScriptException e) {
                    continue;
                }
            } else {// 没有条件
                return (ActivityImpl) tr1.getDestination();
            }
        }
        return null;
    }
/**
 * 
 * @Description (字符串表达式计算逻辑值)
 * @author feizhou
 * @Date 2018年4月13日下午2:30:28  
 * @version 1.0.0
 * @param str
 * @param var
 * @return
 * @throws ScriptException
 */
public static boolean StringtoBoolean(String str, Map<String,Object> var) throws ScriptException {
     ScriptEngineManager manager = new ScriptEngineManager();
     ScriptEngine engine = manager.getEngineByName("js");
     Set<String> keys = var.keySet();
     for (String key : keys) {
         engine.put(key,var.get(key));
    }
     str= str.replaceAll(" or ", " || ").replaceAll(" and ", " && ");
     Object result = engine.eval(str);
    return Boolean.parseBoolean(String.valueOf(result));

}
查看评论

activiti根据当前节点获取下一个UseTask节点

以前写过一篇文章activiti根据当前节点获取下一个节点信息,当时的需求只是需要获取下一个节点而已,并没有要求获得什么类型的节点,所以下一个节点可能是任何节点,在最近的项目中的需求是根据当前的节点获...
  • chenfengdejuanlian
  • chenfengdejuanlian
  • 2017-08-10 17:15:23
  • 5353

activiti拿取 当前任务的下一个节点

在实际的工作流业务开发中, 当用户完成当前用户任务时, 需要指定下一个用户任务的审核人。此时我们需要获取下一个节点的一些信息, 来确定下一个用户任务的审核人有哪些。            ...
  • java_dotar_01
  • java_dotar_01
  • 2017-06-12 17:11:59
  • 2248

activiti根据当前节点获取下一步任务节点

思路:根据当前节点的ID获取,当前节点所连线的所有终点节点。 递归调用当前方法。得到想要的TaskDefinition 直接上代码。 /** * 根据与流程定义key获取当前节点的下一个任务节点 * ...
  • java_Xianfeng
  • java_Xianfeng
  • 2015-01-14 15:43:59
  • 3491

activiti根据当前节点获取下一个节点信息

在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图 当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可...
  • chenfengdejuanlian
  • chenfengdejuanlian
  • 2017-05-04 14:50:07
  • 7648

activiti--完成当前任务,动态指定下一级执行者

最近在做一个工作流审批的项目,类似与申请一个请假,但是在完成任务的时候需要动态指定下一级人物,在最开始了解的时候,书上都是直接根据taskId来完成,后来终于实现了这个动态指定下一级处理人的功能。 ...
  • lovemenghaibin
  • lovemenghaibin
  • 2016-03-26 21:49:35
  • 13234

activiti 如何获取下一步节点

ACTIVITI相对于JBPM来说,比较年轻,用的人少,中文方面的资料更少,我根据网上到处找得资料以及看官方文档总结出来了代码,非常不容易啊。废话不多说,直接上代码吧: 首先是根据流程ID获...
  • superdog007
  • superdog007
  • 2014-05-04 18:30:51
  • 14865

Activiti获得下一个节点

用PvmTransition表示箭头的类。而这些类是从 List list = ActivityImpl.getOutgoingTransitions() ; 从任务id获得指向外面的连接线 ...
  • lan12334321234
  • lan12334321234
  • 2017-04-11 11:00:05
  • 470

Activiti获取当前任务后续路径,动态生成执行路径按钮

需求:我们要在人工任务操作界面,动态生成后续路径选择按钮,选择对应按钮执行相应路径流程 实现方式: 流程定义路径处条件如下图所示: nextbrach等于对应路径id,用于前台选择对应路...
  • qq8618
  • qq8618
  • 2017-09-01 15:55:46
  • 390

Activiti工作流节点的自由跳转

最近在搞openwebflow的工作流节点自由跳转功能,在网上看了一些资料,感觉不是很好,总结原因如下: 直接手动调用SqlSession的操作,感觉会漏掉一些重要的初始化操作(如:启动...
  • junlong750
  • junlong750
  • 2016-03-16 15:32:00
  • 1120

activiti工作流获取下一节点实例

第一个方法getTaskDefinitionList用于包装下面两个方法: /** * * @author: Longjun * @Description: 根据实例编号获取下一个任务...
  • junlong750
  • junlong750
  • 2016-03-18 18:23:28
  • 4967
    activiti
    activiti学习
    个人资料
    持之以恒
    等级:
    访问量: 19万+
    积分: 6616
    排名: 4510
    博客专栏
    最新评论