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

2 篇文章 0 订阅
2 篇文章 0 订阅

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

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

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

代码如下:

public Map<String,String> getNextUser(Map<String, String> 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<SequenceFlow> outFlows = flowNode.getOutgoingFlows();
               //循环下一个审批节点
               for (SequenceFlow sequenceFlow : outFlows)
               {
                   FlowElement targetFlow = sequenceFlow.getTargetFlowElement();                          
                        if (targetFlow instanceof EndEvent)// 如果下个审批节点为结束节点,那么跳过该节点
                       {  
                        	continue;
                      }	
                        String name = targetFlow.getName(); 
                        Map<String,String> parms=new HashMap<>();
                		String processId = taskInfo.get("processId");
                        parms.put("name", name);
                        parms.put("procInstId", processId);
                        //该方法为自定义的方法,主要是通过name和processId去对应的表中查询用户的信息
                        Map<String, String> queryUserByProId = activitiDao.queryUserByProId(parms);
                        logger.info("获取到的数据"+queryUserByProId);                                           
               	}
			return taskInfo;
               
	}

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

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

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

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

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

我们可以通过

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

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值