ZPY博客

Activiti7获取节点的完成状态

在activiti中框架是没有提供获取节点完成状态相关的方法的,但是实际在项目中又有这样的需求,那么我们应该如何取得节点的完成状态呢?

首先,我们是可以通过流程图来获取到所有节点的信息的,那么问题是我们知道了节点的id,如何状态这个节点下的任务是否是完成状态?所以我们需要获取到当前节点下的所有任务。OK,假设现在我们已经拿到了该节点下的所有任务信息,那么问题就相当于已经解决了,如何节点下的所有任务都已经完成,那么节点的状态就是完成,如果有一个任务未完成,那么节点的状态就是进行中。这里主要需要分两种情况来获取节点下的任务,因为有的节点 是多实例节点,获取任务时需要根据executionId来获取实例的个数和完成个数,这两个是内置的参数,只对多实例节点有效。如果是单实例节点那就简单了,直接根据节点id来获取HistoricActivityInstance对象,然后判断完成时间是否为空即可。

大致代码如下:

/**
     * 取得当前节点的状态(已完成/进行中/未开始)
     *
     * @param flowElement
     * @return
     */
    public static String getFlowElementStatus(FlowElement flowElement, String executionId) {
        Activity activity = (Activity) flowElement;
        MultiInstanceLoopCharacteristics loopCharacteristics = activity.getLoopCharacteristics();
        if (loopCharacteristics == null) {
            // 节点为单实例的场合
            UserTask userTask = (UserTask) flowElement;
//            getTaskStatus();
        } else {
            // 节点为多实例的场合
            // 获取完成任务实例数量
            Integer nrOfCompletedInstances = (Integer) activitiUtil.runtimeService.getVariable(executionId, "nrOfCompletedInstances");
            // 获取会签总实例数量
            Integer numberOfInstances = (Integer) activitiUtil.runtimeService.getVariable(executionId, "numberOfInstances");

            if(nrOfCompletedInstances.equals(numberOfInstances)){
                // 已完成
            } else{
                // 进行中
            }
        }
        return null;
    }