【Activiti实战-实战一】和你谈谈关口中的排他网关(ExclusiveGateway)

【相关概念】

流程关口: 主要是用于在流程中控制顺序流的分支和汇合, 在BPMN规范中规定了关口可以消耗执行流或者产生执行流。
排他关口(ExclusiveGateway): 根据所给定的流程参数按照输出流的顺序一个一个计算,当条件计算结果为true的时候,会继续执行当前网关中符合条件的输出流。需要注意的是:当线路中存在多个顺序流且计算结果都为true的时候,则会选择第一个在流程文件中定义的输出流。而如果不存在相应的顺序流为true,则流程会抛出异常。
ps:可以将该关口看作是一个if...elseif...else语句的执行,所以排他网关也会存在相应的default flow

【流程图的绘制】

在这里插入图片描述
给费用报销审批这个用户任务填写相关的任务办理人在这里插入图片描述
给对应的流添加相对应的条件
部门经理审批,费用≥500&&费用≤1000 在这里插入图片描述
总经理审批 费用大于1000
在这里插入图片描述
财务就不用设计费用的条件,如果不符合上面的条件,就默认执行
在这里插入图片描述
在这里插入图片描述

【代码实现】

资源部署and启动流程实例
	private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

	@Test
	public void createDeploy() {
		Deployment deployment = processEngine.getRepositoryService().createDeployment()
				// 将资源部署到数据库中
				.addClasspathResource("./diagram/exclusiveGateWay.bpmn")
				.addClasspathResource("./diagram/exclusiveGateWay.png").deploy();
		System.out.println("部署Id:" + deployment.getId());
		// 启动流程实例
		ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess");

		System.out.println("流程实例Id: " + processInstance.getId());
		System.out.println("流程定义的ID: " + processInstance.getProcessDefinitionId());

	}
	


查询当前正在执行的任务
	@Test
	public void findTaskList() {
	//用于查询当前在运行的任务
		List<Task> list = processEngine.getTaskService().createTaskQuery().list();
		for (Task task : list) {
			System.out.println("当前任务的ID: " + task.getId());
			System.out.println("当前任务的执行人:  " + task.getAssignee());
			System.out.println("当前任务的名称: " + task.getName());
			System.out.println("当前流程的实例ID: " + task.getProcessInstanceId());
			System.out.println("*************************************");
		}

	}
	

完成审批任务

	@Test
	public void complete() {

		// 任务ID
		String taskId = "xxxx";//这个你根据上一个测试方法得出的任务ID 或者查询act_ru_task
		Map<String, Object> variables = new HashMap<String, Object>();
		
		//赋予当前流程参数的数值 也就是对应的money
		variables.put("money", 1200);
		
		//完成当前的申请任务
		processEngine.getTaskService().complete(taskId, variables);
		//查询下一个任务->审批
		List<Task> list = processEngine.getTaskService().createTaskQuery().list();
		for(Task task :list) {
			System.out.println("当前任务的ID: " + task.getId());
			System.out.println("当前任务的执行人:  " + task.getAssignee());
			System.out.println("当前任务的名称: " + task.getName());
			System.out.println("当前流程的实例ID: " + task.getProcessInstanceId());
			//完成审批
			processEngine.getTaskService().complete(task.getId());
			System.out.println("任务完成:"+task.getId());
			System.out.println("*************************************");
			}

	}

好了 那么我们先一步步test来看

【1】流程部署和启动之后

控制台输出:
在这里插入图片描述
查看数据库中的act_re_deployment、act_re_procdef表变化
在这里插入图片描述
在这里插入图片描述

【查询当前的任务】

在这里插入图片描述
查看数据库中的act_ru_task、act_hi_taskinst表中的变化
在这里插入图片描述
在这里插入图片描述

【完成审批任务】

在这里插入图片描述
已经没有了运行的任务
在这里插入图片描述
查看任务的历史
在这里插入图片描述

总结

经过笔者上面的测试,验证了排他网关的单口执行性,我们通过数据库表中的变化,就可以清楚的看出流程实例的执行过程,也可以通过这里看到排他网关的一个if....elseif....else的特性,至于其他有多个条件顺序流为true的操作烦请各位自己实现,步骤和上面差不多。
最后感谢各位的阅读,喜欢的话记得点个赞

[代码地址]:代码地址,点击此处
【参考文章】

Activiti进阶(七)——排他网关(ExclusiveGateWay)

发布了30 篇原创文章 · 获赞 6 · 访问量 7976

猜你喜欢

转载自blog.csdn.net/weixin_42792088/article/details/104865905