com.xingshang.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
System.out.println("流程定义ID: " + pi.getProcessDefinitionId());
//流程定义ID
}
/**
* 查询当前人的个人任务
*/
@Test
public void findMyPersonalTask(){
String assignee = "习大大"
;
List<Task> list = processEngine.getTaskService()
//与正在执行的任务管理相关的Sercice
.createTaskQuery()
//创建任务查询对象
.taskAssignee(assignee)
//指定个人任务查询,指定办理人
.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(){
String taskId = "1603"
;
//完成任务的同时,使用流程变量,使用流程变量来指定完成任务后,下一个连线,对应sequenceFlow.bpmn文件中${message==‘不重要‘}
Map<String, Object> variables =
new HashMap<String, Object>
();
// variables.put("message", "不重要");
variables.put("message", "重要");
//信息重要与不重要会选择两条不同的分支来运行,即对应的流程不一样
processEngine.getTaskService()
//与正在执行的任务管理相关的Sercice
.complete(taskId, variables);
System.out.println("任务完成: 任务Id: " +
taskId);
}
}
四、数据库表的查询顺序
#部署对象和流程定义相关的表
#select * from act_re_deployment #部署对象表
#select * from act_re_procdef #流程定义表
#select * from act_ge_bytearray #资源文件表
#select * from act_ge_property #主键生成策略表
##################################################
#部署实例,执行对象,任务
#select * from act_ru_execution #正在执行的执行对象表
#select * from act_hi_procinst #流程实例的历史表
#select * from act_ru_task #正在执行的任务表(只有节点是UserTask的时候,该表中存在数据)
#select * from act_hi_taskinst #任务历史表(只有节点是UserTask的时候,该表中存在数据)
#select * from act_hi_actinst #所有活动节点的历史表
###################################################
#流程变量
#select * from act_ru_variable #正在执行的流程变量表
#select * from act_hi_varinst #历史的流程变量表
五、总结
1.一个活动中可以指定一个或多个SequenceFlow(Start中有一个,End中没有)
*开始活动中有一个SequenceFlow
*结束活动中没有SequenceFlow
*其他活动中有1条或多条SequenceFlow
2.如果只有一个,则可以不使用流程变量设置codition的名称
如果有多个,则需要使用流程变量设置codition的名称,message表示流程变量的名称,
‘不重要’表示流程变量的值,${}中间的内容使用boolean类型的表达式,用来判断应该执行的连线
3.如果将流程图放置在和Java类相同的路径,则需配置
activiti--6-------------------------------------连线(一般数据库表的查询顺序)
标签:个人 let list 执行 ini resource 分享图片 == bytearray