【Activiti工作流】8.流程实例,任务,执行对象控制流程的执行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013517797/article/details/63687082
我们之前讲过了流程的定义,启动,查看和删除,以及升级版本,接下来当流程
正式启动成功之后,我们就要学习流程实例/任务的执行了。

1,流程实例/任务的执行
(1)启动流程实例
(这里前提是大家部署好了流程)
/**
 * 启动流程
 * 当流程到达一个节点时,会在act_ru_execution表中产生1条数据
 * 如果当节点是用户任务节点,这时会在act_ru_task表中产生1条数据
 * */
@Test
public void startProcess() throws Exception{
	//按照流程定义的id启动:Helloworld:1:4 (只启动此版本流程,最高版本是HelloWorld:2:704)
	//runtimeService.startProcessInstanceById(processDefinitionId);
	//使用流程定义的key启动流程,默认会启动最高版本的流程
	String processDefinitionkey="HelloWorld";//流程定义的key就是HelloWorld
	RuntimeService runtimeService=processEngine.getRuntimeService();
	//获取流程实例对象
	ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionkey);
	System.out.println("pid:"+processInstance.getId());
	System.out.println("activitiId::"+processInstance.getActivityId());
	System.out.println("pdid:"+processInstance.getProcessDefinitionId());
}
我们执行一下,结果:



此时数据库中act_ru_execution表中产生一条新的数据:

act_ru_execution表是正在执行的执行对象表。
其中ID_是执行对象ID,PROC_INST_ID是流程实例ID。


结论:如果是单例流程(没有分支和聚合),那么流程实例ID
和执行对象ID是相同的。


有正在执行的,就有之前的历史,之前流程执行的历史,
我们在act_hi_procinst表中查看历史数据:



可以看到,我们之前有一个走完的流程的信息在历史表中存储,
那是我们Version为1的HelloWorld流程,第二个就是我们现在刚刚
创建的流程,可以看到开始时间和开始节点信息,由于流程没有结束,
所以还没有存储流程结束时间和流程结束节点的信息。


结论:一个流程实例只有一个,但是执行对象可以存在多个。
(存在于不是单例流程,而包含分支和聚合的流程)



2.任务信息
例如张三开始申请请假,那么张三填写完请假申请,点击提交之后,
目前此时张三就有一个待办事项,就是张三向上一级提交请假信息。
此时我们数据库中act_ru_task表中就有该数据:



办过的流程事务是有历史信息的,历史表为act_hi_taskinst:



还有一张表act_hi_actinst,是存放所有活动节点的历史表,包括任务和节点信息:



3.查询个人当前任务
通过上面的讲解,我们可以明白之前我们查询个人待办事项的代码:
/**查询当前的个人任务(实际就是查询act_ru_task表)*/
@Test
public void findMyPersonalTask(){
	String assignee="张三";
	//获取事务Service
	TaskService taskService=processEngine.getTaskService();
	List<Task> taskList=taskService.createTaskQuery()//创建任务查询对象
			   .taskAssignee(assignee)//指定个人任务查询,指定办理人
			   .list();//获取该办理人下的事务列表
	
	if(taskList!=null&&taskList.size()>0){
		for(Task task:taskList){
			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(){
	String taskId="804";//上一次我们查询的任务ID就是804
	TaskService taskService=processEngine.getTaskService();
	taskService.complete(taskId);//完成taskId对应的任务
	System.out.println("完成ID为"+taskId+"的任务");
	
}
执行完804的任务,就完成了张三的任务

此时流程走到了部门经理李四那里:

执行上面的findMyPersonalTask()方法,将assignee换为李四,此时查询到:

跟数据库中的信息一样。


此时我们的流程历史信息走了三步:

接下来执行李四的任务

任务此时到总经理王五那里:

执行上面的findMyPersonalTask()方法,将assignee换为王五,此时查询到:

跟数据库中的信息一样。


接下来执行王五的任务:

此时流程走完,任务表中已经没有了信息:



查看流程信息表,也有了结束的时间:



查看任务历史表,可以看到三个任务的办理历史信息:



我们的流程历史表中,也存入了所有流程信息:



总结:
流程实例,执行对象,任务:
act_ru_execution 正在执行的执行对象表
act_hi_procinst 流程实例的历史表
act_tu_task 正在执行的任务表(只有节点是UserTask的时候,该表粗存在数据)
act_hi_taskinst 任务历史表(只有节点是UserTask的时候,该表存在数据)

act_hiactinst 所有活动节点的历史表

转载请注明出处:http://blog.csdn.net/acmman/article/details/63687082

猜你喜欢

转载自blog.csdn.net/u013517797/article/details/63687082