Activiti系列(二)--审批流程

来源:互联网 发布:荣新it培训 编辑:程序博客网 时间:2024/05/06 04:34

上一篇文章中,我们介绍了Activiti最简单的流程,但是,我们知道,一般来讲,审批一定有同意和不同意的区别,我们在这篇博客中做一个简单的Demo.


代码:


当然上一篇博客中已经配置了基本的Activiti.cfg.xml和log4j.properties文件,这次,我们都不说这些了。


先看目录:



一、suquenceFlow.bpmn



节点审批【部门经理】中设置,跟上一篇博客中没有什么区别,我们给它的Assignee为“赵六”,第二个几点审批【总经理】,我们给它的Assignee为“田七”。


然后,我们看图中的两条线:



我们看连线1设置:首先写上“不重要”,这里面的连线1:



这个并不重要,就是写不写都没有关系,主要是这一步:



我们在写的时候,一定要注意格式不能错。


同样的连线二:




最后,我们要给它的process起名字,点击空白处:



二、SequenceFlowTest.java类


这样,图画好了,我们就看一下我们SequenceFlowTest.java类:



<span style="font-size:18px;">package cn.itcast.f_sequenceFlow;import java.io.InputStream;import java.util.HashMap;import java.util.List;import java.util.Map;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.activiti.engine.repository.Deployment;import org.activiti.engine.runtime.ProcessInstance;import org.activiti.engine.task.Task;import org.junit.Test;public class SequenceFlowTest {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定义(从inputStream)*/@Testpublic void deploymentProcessDefinition_inputStream(){InputStream inputStreamBpmn = this.getClass().getResourceAsStream("sequenceFlow.bpmn");InputStream inputStreamPng = this.getClass().getResourceAsStream("sequenceFlow.png");Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service.createDeployment()//创建一个部署对象.name("连线")//添加部署的名称.addInputStream("sequenceFlow.bpmn", inputStreamBpmn)//.addInputStream("sequenceFlow.png", inputStreamPng)//.deploy();//完成部署System.out.println("部署ID:"+deployment.getId());//System.out.println("部署名称:"+deployment.getName());//}/**启动流程实例*/@Testpublic void startProcessInstance(){//流程定义的keyString processDefinitionKey = "sequenceFlow";ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动System.out.println("流程实例ID:"+pi.getId());//流程实例ID    101System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID   helloworld:1:4}/**查询当前人的个人任务*/@Testpublic void findMyPersonalTask(){String assignee = "赵六";List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service.createTaskQuery()//创建任务查询对象/**查询条件(where部分)*/.taskAssignee(assignee)//指定个人任务查询,指定办理人//.taskCandidateUser(candidateUser)//组任务的办理人查询//.processDefinitionId(processDefinitionId)//使用流程定义ID查询//.processInstanceId(processInstanceId)//使用流程实例ID查询//.executionId(executionId)//使用执行对象ID查询/**排序*/.orderByTaskCreateTime().asc()//使用创建时间的升序排列/**返回结果集*///.singleResult()//返回惟一结果集//.count()//返回结果集的数量//.listPage(firstResult, maxResults);//分页查询.list();//返回列表if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("执行对象ID:"+task.getExecutionId());System.out.println("流程定义ID:"+task.getProcessDefinitionId());System.out.println("########################################################");}}}/**完成我的任务*/@Testpublic void completeMyPersonalTask(){//任务IDString taskId = "3103";//完成任务的同时,设置流程变量,使用流程变量用来指定完成任务后,下一个连线,对应sequenceFlow.bpmn文件中${message=='不重要'}Map<String, Object> variables = new HashMap<String, Object>();variables.put("message", "重要");processEngine.getTaskService()//与正在执行的任务管理相关的Service.complete(taskId,variables);System.out.println("完成任务:任务ID:"+taskId);}}</span>

注:


第一个方法、第二个方法、第三个方法,如果大家看了上一篇博客,应该不用说,我们看最后一个方法:completeMyPersonalTask()


这个方法中,我们processEngine.getTaskService()启动了task之后,我们给了它一个map,map中放入了“message”,这个一定要跟,我们连线1或者连线2中的${message=='不重要'}里面的message一样,网址后,给message赋值,这里其实大家都能猜到了,如果是,“重要”那将会发送给审批【总经理】,如果为“不重要”将会直接结束。







1 0
原创粉丝点击