【相关概念】
流程关口: 主要是用于在流程中控制顺序流的分支和汇合, 在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
的操作烦请各位自己实现,步骤和上面差不多。
最后感谢各位的阅读,喜欢的话记得点个赞