Activiti学习(六)——连线图(SequenceFlow)

时间:2024-04-14 07:56:25

  一、流程图


                                      Activiti学习(六)——连线图(SequenceFlow)

                                                  图1   请假流程


     在上面的流程图中,我们发现和之前不同的是,用户任务【部门经理】审批,下面有两个连线,我们之前的例子都是只有一条连线,那么如果是这种情况的话我们如何进行流程的选择呢?我们这里是用的是通过设置流程变量的方式来对连线的属性进行区分。


     二、设置连线属性


     假如我们对流程有规定,如果事件不重要,流程直接由部门经理审批结束;如果事件重要,部门经理审批之后,还有有总经理进行审批之后才可以结束。那么我们就可以这样这设置我们的连线,首先得选中我们要设置的连线:


    1.为连线命名

     Activiti学习(六)——连线图(SequenceFlow)

     

    2.为连线设置条件

     Activiti学习(六)——连线图(SequenceFlow)


     注意:在这里,message表示流程变量的名称,‘不重要’表示流程变量的值,${}中间的内容要使用boolean类型的表达式,用来判断应该执行的连线。


     三、部署和启动流程


[java] view plain copy
  1. /**部署流程定义+启动流程实例*/  
  2. @Test  
  3. public void deployementAndStartProcess(){  
  4.     //不加斜杠代表从当前类读取资源,加"/"代表从classpath路径下读取文件  
  5.     InputStream inputStreamBpmn = this.getClass().getResourceAsStream("sequenceFlow.bpmn");  
  6.     InputStream inputStreampng = this.getClass().getResourceAsStream("sequenceFlow.png");  
  7.     //部署流程定义  
  8.     Deployment deployment = processEngine.getRepositoryService()  
  9.                 .createDeployment()//创建部署对象  
  10.                 .addInputStream("sequenceFlow.bpmn", inputStreamBpmn)//部署加载资源文件  
  11.                 .addInputStream("sequenceFlow.png", inputStreampng)//  
  12.                 .deploy();  
  13.     System.out.println("部署ID:"+deployment.getId());  
  14.     //启动流程实例  
  15.     ProcessInstance pi = processEngine.getRuntimeService()//  
  16.             .startProcessInstanceByKey("sequenceFlow");//使用流程定义的key的最新版本启动流程  
  17.     System.out.println("流程实例ID:"+pi.getId());  
  18.     System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());  
  19. }  


     执行结果如下:

     Activiti学习(六)——连线图(SequenceFlow)
  

     四、查看个人任务


     根据流程定义,当我们启动流程实例的时候,正在执行的用户任务是【部门经理】审批,我们设置的这个任务的办理人是【赵六】,那么我们接下来查询一下【赵六】的个人任务;


[java] view plain copy
  1. /**查询我的个人任务*/  
  2. @Test  
  3. public void findPersonalTaskList(){  
  4.     //任务办理人  
  5.     String assignee = "赵六";  
  6.     List<Task> list = processEngine.getTaskService()//  
  7.                     .createTaskQuery()//  
  8.                     .taskAssignee(assignee)//个人任务的查询  
  9.                     .list();  
  10.     if(list!=null && list.size()>0){  
  11.         for(Task task:list){  
  12.             System.out.println("任务ID:"+task.getId());  
  13.             System.out.println("任务的办理人:"+task.getAssignee());  
  14.             System.out.println("任务名称:"+task.getName());  
  15.             System.out.println("任务的创建时间:"+task.getCreateTime());  
  16.             System.out.println("流程实例ID:"+task.getProcessInstanceId());  
  17.             System.out.println("#######################################");  
  18.         }  
  19.     }  
  20. }  

     执行结果如下:

     Activiti学习(六)——连线图(SequenceFlow)


     五、完成任务


[java] view plain copy
  1. /**完成任务*/  
  2. @Test  
  3. public void completeTask(){  
  4.     //任务ID  
  5.     String taskId = "2048";  
  6.     //完成任务的同时,设置流程变量,让流程变量判断连线该如何执行  
  7.     Map<String, Object> variables = new HashMap<String, Object>();  
  8.     //其中message对应sequenceFlow.bpmn中的${message=='不重要'},不重要对应流程变量的值  
  9.     variables.put("message""不重要");  
  10.     processEngine.getTaskService()//  
  11.                     .complete(taskId,variables);  
  12.     System.out.println("完成任务:"+taskId);  
  13. }  

     在这里,我们在完成【赵六】的个人任务的同时,设置流程变量,来告诉我们的流程接下来流转到哪里。我们在这个例子中设置的message的值为'不重要',所以流程应该直接结束,不会流程【总经理】审批这一步。