在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; }