上一篇文章中,我们介绍了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)*/
-
@Test
-
public 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());//
-
}
-
/**启动流程实例*/
-
@Test
-
public void startProcessInstance(){
-
//流程定义的key
-
String processDefinitionKey = "sequenceFlow";
-
ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
-
.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
-
System.out.println("流程实例ID:"+pi.getId());//流程实例ID 101
-
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID helloworld:1:4
-
}
-
/**查询当前人的个人任务*/
-
@Test
-
public 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("########################################################");
-
}
-
}
-
}
-
/**完成我的任务*/
-
@Test
-
public void completeMyPersonalTask(){
-
//任务ID
-
String 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赋值,这里其实大家都能猜到了,如果是,“重要”那将会发送给审批【总经理】,如果为“不重要”将会直接结束。