package com.ljw.processInstance;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
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 ProcessInstanceTest {
/**
* 流程实例,任务,执行对象
* 对应数据库表
* act_ru_execution 正在执行的执行对象表(ID_ 执行对象ID,PROC_INST_ID流程实例ID,)
* act_hi_procinst 流程实例的历史表
* act_ru_task 正在执行的任务表(只有节点是UserTask的时候,该表中存在数据)
* act_hi_taskinst 任务历史表(只有节点是UserTask的时候,该表中存在数据)
* act_hi_actinst 所有活动节点的历史表 结论:
* 1,如果是单例流程(没有分支),那么流程ID和执行对象ID是相同的 2,一个流程流程实例只有一个,执行对象可以存在多个(从开始到结束就是一个流程实例)
*
* 总结
* 1,Excuteion 执行对象
* 按流程定义的规则执行一次的过程
* 对应的表:
* act_ru_execution 正执行的信息
* act_hi_procinst 已经执行完的历史流程实例信息
* act_hi_taskinst 存放历史所有完成的活动
* 2,ProcessInstance 流程实例
* 特定流程从开始到结束的那个最大的分支,一个执行流程中,流程实例只有一个
*
* 注意
* (1)如果是单例流程,执行对象ID就是流程对象ID
* (2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID不相同
* (3)一个流程中,流程实例只有一个,执行对象可以存在多个
*
* 3,Task 任务
* 执行到某任务环节时生成的任务信息
* 对应表
* act_ru_task 正在执行的任务信息
* act_hi_taskinst 已经执行完的历史任务信息
*
*/
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 部署流程定义(classpath)
@Test
public void deploymentProcessDefinition_classpath() {
Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的sevices
.createDeployment()// 创建一个部署对象
.name("流程定义")// 添加部署名称
.addClasspathResource("diagrams/helloworld.bpmn")// 从classpath的资源中加载,一次只能加载一个文件
.addClasspathResource("diagrams/helloworld.png").deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());
System.out.println("部署名称" + deployment.getName());
}
// 启动流程实例
@Test
public void deploymentProcessInstance() {
String key = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程是咧和执行对象相关的services
.startProcessInstanceByKey(key);// 使用流程定义的key启动流程实例key对呀的helloworld.bnpm文件里的id的属性值
System.out.println("流程实例ID:" + pi.getId());
System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
}
// 查询当前人的个人任务
@Test
public void findMyPersonalTask() {
String assingnee = "王五";
List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的services
.createTaskQuery()// 创建任务查询对象
/** 查询条件(where部分) */
.taskAssignee(assingnee)// 指定个人任务查询,指定
// .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());
}
}
}
// 完成我的任务
@Test
public void completeMyPersonalTask() {
// 任务ID
String taskId = "32502";
processEngine.getTaskService()// 与正在执行的任务管理相关的services
.complete(taskId);
System.out.println("任务完成,任务ID:" + taskId);
}
/**
* 查询流程状态(判断流程正在执行、结束)
*/
@Test
public void isProcessEnd() {
String processInstanceId = "32502";
ProcessInstance pi = processEngine.getRuntimeService()// 表示正在执行的流程实例和执行对象
.createProcessInstanceQuery()// 创建一个流程实例查询
.processInstanceId(processInstanceId)// 使用哪个流程实例ID查询
.singleResult();
if (pi == null) {
System.out.println("流程已经结束");
} else {
System.out.println("流程没有结束");
}
}
/**
* 查询历史任务
*/
@Test
public void fingHistoryTask() {
String taskAssignee = "张三";
List<HistoricTaskInstance> list = processEngine.getHistoryService()// 与历史数据(历史表)相关的services
.createHistoricTaskInstanceQuery()// 创建历史任务实例查询
.taskAssignee(taskAssignee)// 指定历史任务的办理人
.list();
if (list != null && list.size() > 0) {
for (HistoricTaskInstance historicTaskInstance : list) {
System.out.println(historicTaskInstance.getId() + " " + historicTaskInstance.getName() + " "
+ historicTaskInstance.getProcessInstanceId() + " " + historicTaskInstance.getStartTime()
+ " " + historicTaskInstance.getEndTime() + " " + historicTaskInstance.getDurationInMillis());
System.out.println("##########################################################");
}
}
}
/** 查询历史流程实例 */
@Test
public void findHistoryProcessInstance() {
String processInstanceId = "27501";
HistoricProcessInstance hpi = processEngine.getHistoryService()// 与历史数据(历史表)相关的services
.createHistoricProcessInstanceQuery()// 创建历史流程实例查询
.processInstanceId(processInstanceId)// 使用流程实例ID查询
.singleResult();
System.out.println(hpi.getId() + " " + hpi.getProcessDefinitionId() + " " + hpi.getStartTime() + " "
+ hpi.getEndTime() + " " + hpi.getDurationInMillis());
}
}