有了上一节的基础,这节主要讲如何创建一个学生请假流程、部署、运行流程实例、查看任务、执行任务、判断流程实例状态、历史任务(实例)查询、历史活动节点查询
记住,一个正在执行的流程,他的流程定义id无论到哪一个环节都是一样的,流程实例id也是无论到了哪一个环节都是一样,变得是任务id
先在resources-disgrams下面创建一个学生请假流程设计图,
绘制流程设计图
学生委派人设置为张三,班长为李四,班主任为王五
流程图设计好后,现在开始创建一个学生请假的类
package com.java.activiti.flow;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;import org.activiti.engine.history.HistoricActivityInstance;import org.activiti.engine.history.HistoricTaskInstance;import org.activiti.engine.repository.Deployment;import org.activiti.engine.runtime.ProcessInstance;import org.activiti.engine.task.Task;import org.junit.Test;public class StudentLeaveProcess {
/** * 获取默认流程引擎实例,会自动读取avtiviti.cfg.xml文件 * */ private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
//部署流程定义,把数据写到数据库中去,这种是通过classpath加载方式部署
@Test public void deploy() { Deployment deployment = processEngine.getRepositoryService() // 获取部署相关的service; .createDeployment() // 创建部署 .addClasspathResource("diagrams/StudentLeaveProcess.bpmn") // 加载资源文件 .addClasspathResource("diagrams/StudentLeaveProcess.png") // 加载资源文件 .name("学生请假流程") // 流程名字 .deploy(); // 部署System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署Name:" + deployment.getName()); } /** * 启动流程实例,一个正在执行的流程,无论到了哪一个节点,他的流程实例id都是一样的 * */ @Test public void start() { ProcessInstance pi = processEngine.getRuntimeService() //运行service .startProcessInstanceByKey("studentLeaveProcess"); //流程定义表里面的key System.out.println("流程实例id:"+pi.getId()); System.out.println("流程定义id:"+pi.getProcessDefinitionId()); } /** * 查看任务,查看某个人的任务 * */ @Test public void findTask() { List<Task> taskList = processEngine.getTaskService() //任务相关的service .createTaskQuery() //创建任务查询S .taskAssignee("张三") //指定某个人有没有任务 .list(); 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()); } }/**
* 执行任务,执行的id是任务的id,张三执行完后,在任务表中已经没有了张三,有的是李四(班长),因为已经流到了下一个节点,上面那个方法查张三是查不到的 * 任务执行完,运行时的表全部清空 * */ @Test public void complete() { processEngine.getTaskService() //任务相关 .complete("47502"); } /** * 判断流程实例状态(正在你执行或者已经执行结束),判断某一个流程实例状态 */ @Test public void processState() { ProcessInstance pi = processEngine.getRuntimeService() //获取运行时service .createProcessInstanceQuery() //创建执行对象 .processInstanceId("42501") //用流程实例id查询 .singleResult(); if(pi!=null) { System.out.println("流程正在执行"); }else { System.out.println("流程已经结束"); } } /** * 历史流程任务查询 */ @Test public void historyTaskList() { List<HistoricTaskInstance> list = processEngine.getHistoryService() //历史相关的service .createHistoricTaskInstanceQuery() //创建历史任务实例查询 .processInstanceId("42501") //用流程实例id查询 .finished() //查已经完成流程的历史任务 .list(); for (HistoricTaskInstance hti : list) { System.out.println("委派人:"+hti.getAssignee()); System.out.println("历史任务id:"+hti.getId()); System.out.println("历史流程名称:"+hti.getName()); System.out.println("历史流程实例id:"+hti.getProcessInstanceId()); System.out.println("历史流程名称:"+hti.getProcessInstanceId()); System.out.println("历史流程开始时间:"+hti.getStartTime()); System.out.println("历史流程开始时间:"+hti.getEndTime()); System.out.println("================="); } } /** * 历史活动节点查询,开发之中这个用的最多,针对是某一个完整的过程 */ @Test public void historyAcInstanceList() { List<HistoricActivityInstance> list = processEngine.getHistoryService() //历史相关的接口 .createHistoricActivityInstanceQuery() //创建历史活动实例查询 .processInstanceId("42501") //指定流程实例id .finished() .list(); for (HistoricActivityInstance hisac : list) { System.out.println("办理人:"+hisac.getAssignee()); System.out.println("活动id:"+hisac.getId()); System.out.println("活动流程名称:"+hisac.getActivityName()); System.out.println("活动流程实例id:"+hisac.getProcessInstanceId()); System.out.println("活动流程开始时间:"+hisac.getStartTime()); System.out.println("活动流程结束时间:"+hisac.getEndTime()); System.out.println("================="); } }}