activiti的网关(GateWay)
在介绍activiti的基础的时候说到了工作流的使用场景之请假,请假的天数不同,可能需要不同的领导签字,本篇文章讲介绍工作流的网关实现这类场景。
activiti中的网关包含以下几种,这里只做下简单的介绍,具体的细节信息可以参考网上资料。
(1)ParallelGeteway:并行网关/异或网关 (多人会签完成,才能启动下一流程)
(2)ExclusiveGateway排他网关(多人之中只能有一个人进行审批,哪个条件为true,则走对应的逻辑)
(3)InclusiveGateway包含网关(集成了并行与排他网关)
(4)EventGateway事件网关(只能连接中间捕获事件)
话不多说,开始案例。步骤还是和我上一篇的文章一样,绘画流程图、配置属性--->部署流程--->启动流程--->执行任务
绘画流程图:相信只要你有点流程图的基础,都能看懂流程走向
配置(重要)
(1)每个节点配置办理人,我这边从上到下,从左到右,分别配置的张三、李四、王二、麻子四个人。
(2)事件到底走哪个分支,这个是需要我们配置的,点击连线,properties下面的main config,找到condition,如图所示,在里面配置条件。注意:这里面是个条件表达式,这个day是可以自行定义的,你也可以取别的参数,在你完成请假申请的时候,传这个参数值就可以了。用专业术语来说,就是配置参数变量的值。
同样的,另外两条线,也需要配置下Condition的值,最后点击空白处,给该流程起个key和name。我这里起的key是applyLeave,就不做截图展示了。
接下来部署流程和启动流程我就一起上代码了。
@Test
public void ExclusiveGateWay(){
//发布流程
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.name("排他网关")
.addClasspathResource("diagrams/exclusiveWay.bpmn")
.addClasspathResource("diagrams/exclusiveWay.png")
.deploy();
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
//启动流程
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey("applyLeave");
}
查询任务
public void MyPersonalTask(){
String assignee = "张三";
List
.createTaskQuery()//创建任务查询对象
/**排序*/
.orderByTaskCreateTime().asc()//使用创建时间的升序排列
/**返回结果集*/
.list();//返回列表
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
}
}
完成任务
@Test
public void completeeTask() {
TaskService taskService = processEngine.getTaskService();
String taskId = "2408"; //这里的id就是我们上一步通过查看任务,获取的任务id
Map
variables.put("day", 7); //这里设置我们刚才配置参数对应的值,这里设置的7,那么应该到总经理审批
Task task = taskService.createTaskQuery()
.taskId(taskId)
.singleResult();
taskService.addComment(taskId, task.getProcessInstanceId(), "7天假期审核通过"); //在这里我们可以对任务添加评论
taskService.complete(taskId, variables);
}
测试:先是张三提交了7天的申请,现在我们来验证接下来是否到总经理审批,通过截图,证明了我们流程中的排他网关是成功的。
并行网关我就不做测试了,感兴趣的朋友可以自己画图配置测试看看,其实通过这篇和上一篇的案例我们可以发现到,工作流只要你流程画好了,配置好了,剩下的都是一样的操作了,部署启动流程,查看任务,完成流程等。
最后做下补充:关于上面提到的变量
在实际过程中,我们常常会运用到变量的配置以及值获取等问题。可以通过runtimeService或者taskService来设置变量和获取变量,变量可以设置一个或者多个。对应的表act_ru_variable:正在执行的流程变量表 ; act_hi_varinst:流程变量历史表
runtimeService.setVariable(executionId, variableName, value)//表示使用执行对象ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
// runtimeService.setVariables(executionId, variables)//表示使用执行对象ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
// taskService.setVariable(taskId, variableName, value)//表示使用任务ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
// taskService.setVariables(taskId, variables)//表示使用任务ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用Map集合
流程变量的赋值:可以在启动流程的时候赋值,也可以在某个节点完成任务的时候赋值,这个都是可以的,具体情况看你的业务需求。
下一篇我们会讲到另一个常用的点-->监听器。