package com.example;
import java.io.Reader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
/**
* 测试流程
* @author 20150205
*
*/
public class TestActiviti {
/**
* RepositoryService 管理流程定义
RuntimeService 执行管理,包括启动、推进、删除流程实例等操作
TaskService 任务管理
HistoryService 历史管理(执行完的数据的管理)
IdentityService 组织机构管理
FormService 一个可选服务,任务表单管理
*/
/**
*
*/
ProcessEngine processEngine = null;
RepositoryService repositoryService = null;
RuntimeService runtimeService = null;
TaskService taskService = null;
@Before
public void init() {
//加载spring配置文件,创建 ProcessEngine
processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
.buildProcessEngine();
repositoryService = processEngine.getRepositoryService();
runtimeService = processEngine.getRuntimeService();
taskService = processEngine.getTaskService();
}
/**
* 部署流程定义加载test.bpmn文件
*/
@Test
public void deploy(){
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagrams/qingjia.bpmn")
.name("请假流程")
.category("办公类别")
//.tenantId("租户1")
.deploy();
String id = deployment.getId();
//级联删除,不管流程是否启动
//repositoryService.deleteDeployment(id, true);
System.out.println("***************部署流程定义完成***************" + id);
}
public void deployStr() throws Exception {
XMLInputFactory factory = XMLInputFactory.newFactory();
Reader reader = new StringReader("bpmnxml字符串");
XMLStreamReader streamReader = factory.createXMLStreamReader(reader);
BpmnXMLConverter converter = new BpmnXMLConverter();
BpmnModel bpmnModel = converter.convertToBpmnModel(streamReader);
Deployment deployment = repositoryService.createDeployment()//创建Deployment对象
.name("")
.category("")
.tenantId("000000")
.addBpmnModel("", bpmnModel)
.deploy();//部署
//字符串
// String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>";
//
// deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
// .createDeployment()//创建部署对象
// .addString("helloworld.bpmn",text)
// .deploy();//完成部署
}
@Test
public void selectP() {
//获取到流程查询对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//查询所有流程定义
List<ProcessDefinition> list = processDefinitionQuery.list();
//查询所有流程定义最新的流程,最新的版本
Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();
List<ProcessDefinition> list1 = repositoryService.createProcessDefinitionQuery().orderByProcessDefinitionVersion().asc().list();
for (ProcessDefinition processDefinition : list1) {
//留最新的key
map.put(processDefinition.getKey(), processDefinition);
}
System.out.println("查询流程模板");
}
//查询正在执行的流程实例,判断流程是否结束
public void selectProcessInstance() {
ProcessInstance singleResult = runtimeService.createProcessInstanceQuery()
.processInstanceId("processInstanceId")
.singleResult();
if(singleResult==null) {
//流程已结束
}
}
/**
* 启动一个请假流程
*/
@Test
public void start() {
for(int i = 0 ; i < 1; i++){
//根据KEY默认安装流程版本启动流程
String processId = runtimeService.startProcessInstanceByKey("qingjiaid").getId();
System.out.println("***************启动第" + i + "个请假流程完成***************" + processId);
}
//流程执行对象表act_ru_execution
//一个流程只有一个流程实例
//多个流程对象对应一个流程示例,比如流程中有分支和聚合
}
/**
* 设置流程变量和任务变量
*
*/
@Test
public void setVariable() {
//runtimeService.setVariables(executionId, variables);
//taskService.setVariables(taskId, variables);
//启动流程时设置流程变量
//runtimeService.startProcessInstanceByKey(processDefinitionKey, variables)
//taskService.complete(taskId, variables);
Map<String, Object> variables = new HashMap<String, Object>();
//可以覆盖,覆盖修改
variables.put("请假天数", 4);
variables.put("请假原因","事假");
taskService.setVariables("2504", variables);
//存放对象时,对象必须序列化并且不能修改,否者反序列化时会出错,比如保存变量后,对象添加一个新属性,解决:必须有一个序列化版本ID
//taskService.setVariableLocal("taskId", "variableName", new Person());
//Local 是和任务ID关联,当前任务结束后,act_ru_variable表就不存在了,下一个任务获取不到了,历史表里有act_hi_varinst
//taskService.setVariablesLocal(taskId, variables);
System.out.println("设置任务变量");
Map<String, Object> variables1 = taskService.getVariables("2504");
System.out.println("获取任务变量"+variables1.toString());
Map<String, Object> variables2 = runtimeService.getVariables("2501");
System.out.println("获取流程变量"+variables2.toString());
//历史流程变量
// List<HistoricVariableInstance> list = processEngine.getHistoryService()//
// .createHistoricVariableInstanceQuery() // 创建一个历史的流程变量查询对象
// .variableName("请假天数").list();
}
//查询具体任务
@Test
public void selectTask() {
List<Task> tasks = taskService.createTaskQuery().taskAssignee("张三").list();
for (Task task : tasks) {
System.out.println("" + task.getName() + ",id:" + task.getId());//任务的name与id
System.out.println(task.getAssignee());//任务拥有者
System.out.println(task.getProcessInstanceId());//流程实例id
System.out.println(task.getProcessDefinitionId());//流程定义id
taskService.complete(task.getId());//完成任务
}
}
/**
* 查询组任务
*/
@Test
public void selectGroupTask() {
//act_ru_identitylink
//TYPE_ participant个人任务,组任务
//candidate 张三,李四
List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("张三").list();
//查询正在执行任务办理人
List<IdentityLink> IdentityLinks = taskService.getIdentityLinksForTask("taskId");
for (IdentityLink identityLink : IdentityLinks) {
//identityLink.getUserId()
//identityLink.getType()
System.out.println();
}
//将组任务分配给某个人(可以是组内的人,也可以不是)
//拾取任务
//taskService.claim("taskId", "userId");
//将个人任务回退到组任务,前提,之前也是一个组任务
//taskService.setAssignee("taskId", null);
//向组任务中添加成员
//taskService.addCandidateUser("taskId", "userId");
//taskService.deleteCandidateUser("taskId", "userId");
}
}