activit6.0 根据当前节点信息获取下一步的审批人信息

  背景:公司内部oa系统进行审批,需要集成极光推送,这样的话,需要在审批的时候,通过当前节点,查找出下一个需要审批人的信息,在网上查看了很多资料,大多都是activit版本对不上,还有就是提供的代码不完整,思路也不清晰,下面为个人解决这个问题提供的一个办法

首先我们要先分析使用的流程图,由于我们公司审批业务比较简单,所以我们用的是自定义的通用模板如下所示:

activit6.0 根据当前节点信息获取下一步的审批人信息_第1张图片

具体思路是:通过获取到当前的节点,然后获取下一步可能走到的任何节点,之后就需要判断具体那个节点进行什么样的操作,由于我们这个工作流程图比较简单,所以任何一个节点的下一个只有两种情况,所以我只需判断是否是结束的节点就可以得到下一步的操作节点,

代码如下:

public Map getNextUser(Map taskInfo){
		String procInstanceId = taskInfo.get("processId");
		Task task =taskService.createTaskQuery().processInstanceId(procInstanceId).singleResult();
        ExecutionEntity ee = (ExecutionEntity) runtimeService.createExecutionQuery()
        .executionId(task.getExecutionId()).singleResult();
               // 当前审批节点
               String crruentActivityId = ee.getActivityId();
               BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
               FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(crruentActivityId);
               // 输出连线
               List outFlows = flowNode.getOutgoingFlows();
               //循环下一个审批节点
               for (SequenceFlow sequenceFlow : outFlows)
               {
                   FlowElement targetFlow = sequenceFlow.getTargetFlowElement();                          
                        if (targetFlow instanceof EndEvent)// 如果下个审批节点为结束节点,那么跳过该节点
                       {  
                        	continue;
                      }	
                        String name = targetFlow.getName(); 
                        Map parms=new HashMap<>();
                		String processId = taskInfo.get("processId");
                        parms.put("name", name);
                        parms.put("procInstId", processId);
                        //该方法为自定义的方法,主要是通过name和processId去对应的表中查询用户的信息
                        Map queryUserByProId = activitiDao.queryUserByProId(parms);
                        logger.info("获取到的数据"+queryUserByProId);                                           
               	}
			return taskInfo;
               
	}

代码中的taskService和runtimeService和repositoryService 是直接在ServiceImpl中注入的

activit6.0 根据当前节点信息获取下一步的审批人信息_第2张图片

另外传递的参数Map,里面必须要有processId,代码中的activitiDao.queryUserByProId();为自定义的方法,主要是通过获取到的name和processid去对应的表中查询用户信息,由于我做的推送目前只需要传递用户的id和推送消息,所以在这边就只查询我所使用的信息具体的sql如下:

activit6.0 根据当前节点信息获取下一步的审批人信息_第3张图片

这一步我卡了好长时间,因为对activiti表结构不是特别熟悉,后来了解到,我们没开启一个任务实例

runtimeService.startProcessInstanceByKey(参数),会在对应的表中插入数据,先介绍两张表

ACT_RU_EXECUTION  运行时流程执行实例表
act_ru_variable    运行时流程变量数据表
act_hi_varinst     历史变量表

我们可以通过

BUSINESS_KEY_(就是bussinessId) 去ACT_RU_EXECUTION表中查询到processID,如果有的话就不用查询这一步了,直接使用上面的sql,就可以查询下一个审批人的姓名和id,我的这个方法是用户在审批的时候调用的,具体调用的位置可以根据具体的情况定义。

 

 

你可能感兴趣的:(activity,java,工作流)