类型一:在过程添加监听器
应用于在2节点有多人处理,其中所有人同意则结束流程,任意一人拒绝后,流程返回1节点的情景
此时我们在A线上设置监听器,事件选为end,如图
代码如下:
@Service(value="上方图片中的Delegate expression") public class AirSignListenerService implements ExecutionListener { private static final long serialVersionUID = 1L; @Autowired private ActTaskService actTaskService; @Autowired private AirTaskInfoDao airTaskInfoDao; @Override public void notify(DelegateExecution execution){ String executionId = execution.getId(); //流程实例id String procInsId = execution.getProcessInstanceId(); // 总共同意的人 int signCount = Integer.parseInt( execution.getEngineServices() .getRuntimeService().getVariable( executionId , "signCount" ).toString() ); // 总共会签的人数 List list = ( List ) execution.getEngineServices().getRuntimeService() .getVariable( executionId , "user_list" ); int signSize = list.size(); if(signCount == signSize){ System.out.println("全部同意" ); execution.getEngineServices() .getRuntimeService().setVariable( executionId , "pass","1" ); AirTaskInfo airTaskInfo = airTaskInfoDao.getByProcInsId(procInsId); airTaskInfo.setFormState(TestTaskInfo.FORM_STATE_04); airTaskInfo.setTestStage(TestTaskInfo.TEST_FINISH); airTaskInfoDao.updateTestStageAndFormState(airTaskInfo); }else { System.out.println("有人不同意" ); execution.getEngineServices() .getRuntimeService().setVariable( executionId , "pass","0" ); } } }
这里的signCount用于记录同意的人数,与选定的全部人数相比,若少于全部人数说明有人拒绝,若相等说明全部同意,此时给pass重新赋值
流程中需有以下方法统计
public void procParam(String taskId,Map<String, Object> vars,String param){ List<Task> taskResultList = taskService.createTaskQuery().taskId(taskId) .list(); // 当前executionId String currentExecutionId = taskResultList.get(0).getExecutionId(); // 当前签署总数 if(null == runtimeService.getVariable(currentExecutionId, param)){ runtimeService.setVariable(currentExecutionId, param, "0"); } System.out.println("------------------------==="+runtimeService.getVariable(currentExecutionId, param).toString()); String currentSignCount = StringUtils.defaultString(runtimeService .getVariable(currentExecutionId, param).toString(), "0"); if ( "1".equals(vars.get("pass")) ) { // 签署数+1 runtimeService.setVariable(currentExecutionId, param, Integer.parseInt(currentSignCount) + 1); } }
类型二:在节点设置监听器
可应用于流程节点完成后自动执行操作,例如一个流程结束后自动触发另一个流程
在流程的结束节点设置监听,事件为end,操作同类型一
@Service(value = "同类型一") public class startTestReadyProcessListener implements ExecutionListener { @Autowired private ActTaskService actTaskService; @Override public void notify(DelegateExecution execution) throws Exception { String executionId = execution.getId(); String procInsId = execution.getProcessInstanceId(); //获取流程中所有变量 Map<String, Object> variables = execution.getEngineServices().getRuntimeService().getVariables(executionId); String key = (String)variables.get("key"); String testTaskId = (String)variables.get("testTaskId"); //判断是否为终止流程操作 if(StringUtils.isBlank(key)){ actTaskService.startProcess(ActUtils.PD_NE_FORM_TEST_READY[0], ActUtils.PD_NE_FORM_TEST_READY[1], testTaskId, "流程", variables,"",ActUtils.PD_NE_FORM_TEST_READY[2],ActUtils.PD_NE_FORM_TEST_READY[3]); }else{ if("1".equals(key)){ actTaskService.startProcess(ActUtils.PD_NE_FORM_TEST_EXECUTE[0], ActUtils.PD_NE_FORM_TEST_EXECUTE[1], testTaskId, "流程", variables,"",ActUtils.PD_NE_FORM_TEST_EXECUTE[2],ActUtils.PD_NE_FORM_TEST_EXECUTE[3]); }else if("2".equals(key)){ } } } }