上一篇文章中,我们介绍了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赋值,这里其实大家都能猜到了,如果是,“重要”那将会发送给审批【总经理】,如果为“不重要”将会直接结束。
1万+

被折叠的 条评论
为什么被折叠?



