在介绍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<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service .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<String, Object> variables = new HashMap<String, Object>(); 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集合
流程变量的赋值:可以在启动流程的时候赋值,也可以在某个节点完成任务的时候赋值,这个都是可以的,具体情况看你的业务需求。
下一篇我们会讲到另一个常用的点-->监听器。