Activity工作流的概念:就是“業(yè)務過程的部分或整體在計算機應用環(huán)境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規(guī)則傳遞文檔、信息或任務的過程自動進行,從而實現某個預期的業(yè)務目標,或者促使此目標的實現”,業(yè)務過程中插入人工的執(zhí)行和干預。
ProcessEngine對象,這是Activity工作的核心。負責生成流程運行時的各種實例及數據、監(jiān)控和管理流程的運行。
一、Activity表設計:
1、資源庫流程規(guī)則表
1)act_re_deployment 部署信息表
2)act_re_model 流程設計模型部署表
3)act_re_procdef 流程定義數據表
2、運行時數據庫表
1)act_ru_execution 運行時流程執(zhí)行實例表
2)act_ru_identitylink 運行時流程人員表,主要存儲任務節(jié)點與參與者的相關信息
3)act_ru_task 運行時任務節(jié)點表
4)act_ru_variable 運行時流程變量數據表
3、歷史數據庫表
1)act_hi_actinst 歷史節(jié)點表
2)act_hi_attachment 歷史附件表
3)act_hi_comment 歷史意見表
4)act_hi_identitylink 歷史流程人員表
5)act_hi_detail 歷史詳情表,提供歷史變量的查詢
6)act_hi_procinst 歷史流程實例表
7)act_hi_taskinst 歷史任務實例表
8)act_hi_varinst 歷史變量表
4、組織機構表
1)act_id_group 用戶組信息表
2)act_id_info 用戶擴展信息表
3)act_id_membership 用戶與用戶組對應信息表
4)act_id_user 用戶信息表
這四張表很常見,基本的組織機構管理,關于用戶認證方面建議還是自己開發(fā)一套,組件自帶的功能太簡單,使用中有很多需求難以滿足
5、通用數據表
1)act_ge_bytearray 二進制數據表
2)act_ge_property 屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄。
二、activiti.cfg.xml(activiti的配置文件)
代碼:【
xmlns:context="//www.springframework.org/schema/context" xmlns:tx="//www.springframework.org/schema/tx"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd
//www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context-2.5.xsd
//www.springframework.org/schema/tx //www.springframework.org/schema/tx/spring-tx-3.0.xsd">
】
三、logging.properties(日志處理)
代碼:【
log4j.rootLogger=INFO, CA
# ConsoleAppender
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
】
四、創(chuàng)建表
【package junit;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;
public class TestActiviti {
/**使用代碼創(chuàng)建工作流需要的張表*/
@Test
public void createTable(){
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
//連接數據庫的配置
processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/W_activiti_01?useUnicode=true&characterEncoding=utf8");
processEngineConfiguration.setJdbcUsername("root");
processEngineConfiguration.setJdbcPassword("");
/**
public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自動創(chuàng)建表,需要表存在
public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先刪除表再創(chuàng)建表
public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自動創(chuàng)建表
*/
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//工作流的核心對象,ProcessEnginee對象
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println("processEngine:"+processEngine);
}
/**使用配置文件創(chuàng)建工作流需要的23張表*/
@Test
public void createTable_2(){
// ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
// //工作流的核心對象,ProcessEnginee對象
// ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml") //
.buildProcessEngine();
System.out.println("processEngine:"+processEngine);
}
}
】
五、HelloWorld
代碼:【package test.a_helloworld;
import java.util.List;
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 HelloWorld {
/** #:獲取流程引擎 */
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/** 1:部署流程定義 */
@Test
public void deploymentProcessDefinition() {// 表【act_re_deployment】
Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對象相關的Service
.createDeployment()// 創(chuàng)建一個部署對象
.name("helloworld入門程序")// 添加部署的名稱
.addClasspathResource("diagrams/helloworld.bpmn")// 從classpath的資源中加載,一次只能加載一個文件
.addClasspathResource("diagrams/helloworld.png")// 從classpath的資源中加載,一次只能加載一個文件
.deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());// 1
System.out.println("部署名稱:" + deployment.getName());// helloworld入門程序
}
/** 2:啟動流程實例 */
@Test
public void startProcessInstance() {// 表【act_hi_procinst/act_ru_execution】
// 流程定義的key
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()// 與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:" + pi.getId());// 流程實例ID 101
System.out.println("流程定義ID:" + pi.getProcessDefinitionId());// 流程定義ID
// helloworld:1:4
}
/** 3:查詢當前人的個人任務 */
@Test
public void findMyPersonalTask() {
String assignee = "張三";
Listlist = processEngine.getTaskService()// 與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()// 創(chuàng)建任務查詢對象
.taskAssignee(assignee)// 指定個人任務查詢,指定辦理人
.list();
if (list != null && list.size() > 0) {
for (Task task : list) {
System.out
.println("###############################################");
System.out.println("任務ID:" + task.getId());
System.out.println("任務名稱:" + task.getName());
System.out.println("任務的創(chuàng)建時間:" + task.getCreateTime());
System.out.println("任務的辦理人:" + task.getAssignee());
System.out.println("流程實例ID:" + task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:" + task.getExecutionId());
System.out.println("流程定義ID:" + task.getProcessDefinitionId());
System.out
.println("###############################################");
}
}
}
/** 4:完成我的任務 */
@Test
public void completeMyPersonalTask() {
// 任務ID
String taskId = "7502";
processEngine.getTaskService()// 與正在執(zhí)行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:" + taskId);
}
}
】
六、ProcessDefinitionTest
代碼:【package test.b_processDefinition;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
public class ProcessDefinitionTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從classpath)*/
@Test
public void deploymentProcessDefinition_classpath(){
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("流程定義")//添加部署的名稱
.addClasspathResource("diagrams/helloworld.bpmn")//從classpath的資源中加載,一次只能加載一個文件
.addClasspathResource("diagrams/helloworld.png")//從classpath的資源中加載,一次只能加載一個文件
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**部署流程定義(從zip)*/
@Test
public void deploymentProcessDefinition_zip(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("流程定義")//添加部署的名稱
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**查詢流程定義*/
@Test
public void findProcessDefinition(){
Listlist = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createProcessDefinitionQuery()//創(chuàng)建一個流程定義的查詢
/**指定查詢條件,where條件*/
// .deploymentId(deploymentId)//使用部署對象ID查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processDefinitionKey(processDefinitionKey)//使用流程定義的key查詢
// .processDefinitionNameLike(processDefinitionNameLike)//使用流程定義的名稱模糊查詢
/**排序*/
.orderByProcessDefinitionVersion().asc()//按照版本的升序排列
// .orderByProcessDefinitionName().desc()//按照流程定義的名稱降序排列
/**返回的結果集*/
.list();//返回一個集合列表,封裝流程定義
// .singleResult();//返回惟一結果集
// .count();//返回結果集數量
// .listPage(firstResult, maxResults);//分頁查詢
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
System.out.println("流程定義ID:"+pd.getId());//流程定義的key+版本+隨機生成數
System.out.println("流程定義的名稱:"+pd.getName());//對應helloworld.bpmn文件中的name屬性值
System.out.println("流程定義的key:"+pd.getKey());//對應helloworld.bpmn文件中的id屬性值
System.out.println("流程定義的版本:"+pd.getVersion());//當流程定義的key值相同的相同下,版本升級,默認1
System.out.println("資源名稱bpmn文件:"+pd.getResourceName());
System.out.println("資源名稱png文件:"+pd.getDiagramResourceName());
System.out.println("部署對象ID:"+pd.getDeploymentId());
System.out.println("#########################################################");
}
}
}
/**刪除流程定義*/
@Test
public void deleteProcessDefinition(){
//使用部署ID,完成刪除
String deploymentId = "601";
/**
* 不帶級聯的刪除
* 只能刪除沒有啟動的流程,如果流程啟動,就會拋出異常
*/
// processEngine.getRepositoryService()//
// .deleteDeployment(deploymentId);
/**
* 級聯刪除
* 不管流程是否啟動,都能可以刪除
*/
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId, true);
System.out.println("刪除成功!");
}
/**查看流程圖
* @throws IOException */
@Test
public void viewPic() throws IOException{
/**將生成圖片放到文件夾下*/
String deploymentId = "801";
//獲取圖片資源名稱
Listlist = processEngine.getRepositoryService()//
.getDeploymentResourceNames(deploymentId);
//定義圖片資源的名稱
String resourceName = "";
if(list!=null && list.size()>0){
for(String name:list){
if(name.indexOf(".png")>=0){
resourceName = name;
}
}
}
//獲取圖片的輸入流
InputStream in = processEngine.getRepositoryService()//
.getResourceAsStream(deploymentId, resourceName);
//將圖片生成到D盤的目錄下
File file = new File("D:/"+resourceName);
//將輸入流的圖片寫到D盤下
FileUtils.copyInputStreamToFile(in, file);
}
/***附加功能:查詢最新版本的流程定義*/
@Test
public void findLastVersionProcessDefinition(){
Listlist = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.orderByProcessDefinitionVersion().asc()//使用流程定義的版本升序排列
.list();
/**
* Map
map集合的key:流程定義的key
map集合的value:流程定義的對象
map集合的特點:當map集合key值相同的情況下,后一次的值將替換前一次的值
*/
Mapmap = new LinkedHashMap();
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
map.put(pd.getKey(), pd);
}
}
ListpdList = new ArrayList(map.values());
if(pdList!=null && pdList.size()>0){
for(ProcessDefinition pd:pdList){
System.out.println("流程定義ID:"+pd.getId());//流程定義的key+版本+隨機生成數
System.out.println("流程定義的名稱:"+pd.getName());//對應helloworld.bpmn文件中的name屬性值
System.out.println("流程定義的key:"+pd.getKey());//對應helloworld.bpmn文件中的id屬性值
System.out.println("流程定義的版本:"+pd.getVersion());//當流程定義的key值相同的相同下,版本升級,默認1
System.out.println("資源名稱bpmn文件:"+pd.getResourceName());
System.out.println("資源名稱png文件:"+pd.getDiagramResourceName());
System.out.println("部署對象ID:"+pd.getDeploymentId());
System.out.println("#########################################################");
}
}
}
/**附加功能:刪除流程定義(刪除key相同的所有不同版本的流程定義)*/
@Test
public void deleteProcessDefinitionByKey(){
//流程定義的key
String processDefinitionKey = "helloworld";
//先使用流程定義的key查詢流程定義,查詢出所有的版本
Listlist = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.processDefinitionKey(processDefinitionKey)//使用流程定義的key查詢
.list();
//遍歷,獲取每個流程定義的部署ID
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
//獲取部署ID
String deploymentId = pd.getDeploymentId();
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId, true);
}
}
}
}
】
七、ProcessInstance
代碼:【
package test.c_processInstance;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;
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 {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從zip)*/
@Test
public void deploymentProcessDefinition_zip(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("流程定義")//添加部署的名稱
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程實例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:"+pi.getId());//流程實例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "王五";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()//創(chuàng)建任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實例ID查詢
// .executionId(executionId)//使用執(zhí)行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時間的升序排列
/**返回結果集*/
// .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("任務的創(chuàng)建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "1202";
processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:"+taskId);
}
/**查詢流程狀態(tài)(判斷流程正在執(zhí)行,還是結束)*/
@Test
public void isProcessEnd(){
String processInstanceId = "1001";
ProcessInstance pi = processEngine.getRuntimeService()//表示正在執(zhí)行的流程實例和執(zhí)行對象
.createProcessInstanceQuery()//創(chuàng)建流程實例查詢
.processInstanceId(processInstanceId)//使用流程實例ID查詢
.singleResult();
if(pi==null){
System.out.println("流程已經結束");
}
else{
System.out.println("流程沒有結束");
}
}
/**查詢歷史任務(后面講)*/
@Test
public void findHistoryTask(){
String taskAssignee = "張三";
Listlist = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service
.createHistoricTaskInstanceQuery()//創(chuàng)建歷史任務實例查詢
.taskAssignee(taskAssignee)//指定歷史任務的辦理人
.list();
if(list!=null && list.size()>0){
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
System.out.println("################################");
}
}
}
/**查詢歷史流程實例(后面講)*/
@Test
public void findHistoryProcessInstance(){
String processInstanceId = "1001";
HistoricProcessInstance hpi = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service
.createHistoricProcessInstanceQuery()//創(chuàng)建歷史流程實例查詢
.processInstanceId(processInstanceId)//使用流程實例ID查詢
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}
}
】
八、processVariables
代碼1:【
package test.d_processVariables;
import java.io.Serializable;
public class Person implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6757393795687480331L;
private Integer id;//編號
private String name;//姓名
private String education;
public String getEducation() {
return education;
}
public void setEducation(String education) {
this.education = education;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
】
代碼2:【
package test.d_processVariables;
import java.io.InputStream;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
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.runtime.ProcessInstance;
import org.junit.Test;
public class ProcessVariablesTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/** 部署流程定義(從InputStream) */
@Test
public void deploymentProcessDefinition_inputStream() {
InputStream inputStreambpmn = this.getClass().getResourceAsStream(
"/diagrams/processVariables.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream(
"/diagrams/processVariables.png");
Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對象相關的Service
.createDeployment()// 創(chuàng)建一個部署對象
.name("流程定義")// 添加部署的名稱
.addInputStream("processVariables.bpmn", inputStreambpmn)// 使用資源文件的名稱(要求:與資源文件的名稱要一致),和輸入流完成部署
.addInputStream("processVariables.png", inputStreampng)// 使用資源文件的名稱(要求:與資源文件的名稱要一致),和輸入流完成部署
.deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());//
System.out.println("部署名稱:" + deployment.getName());//
}
/** 啟動流程實例 */
@Test
public void startProcessInstance() {
// 流程定義的key
String processDefinitionKey = "processVariables";
ProcessInstance pi = processEngine.getRuntimeService()// 與正在執(zhí)行的流程實例和執(zhí)行對象相關的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 setVariables() {
/** 與任務(正在執(zhí)行) */
TaskService taskService = processEngine.getTaskService();
// 任務ID
String taskId = "7502";
/** 一:設置流程變量,使用基本數據類型 */
// taskService.setVariableLocal(taskId, "請假天數", 5);//與任務ID綁定
// taskService.setVariable(taskId, "請假日期", new Date());
// taskService.setVariable(taskId, "請假原因", "回家探親,一起吃個飯");
/** 二:設置流程變量,使用javabean類型 */
/**
* 當一個javabean(實現序列號)放置到流程變量中,要求javabean的屬性不能再發(fā)生變化 * 如果發(fā)生變化,再獲取的時候,拋出異常
*
* 解決方案:在Person對象中添加: private static final long serialVersionUID =
* 6757393795687480331L; 同時實現Serializable
* */
Person p = new Person();
p.setId(20);
p.setName("翠花");
taskService.setVariable(taskId, "人員信息(添加固定版本)", p);
System.out.println("設置流程變量成功!");
}
/** 獲取流程變量 */
@Test
public void getVariables() {
/** 與任務(正在執(zhí)行) */
TaskService taskService = processEngine.getTaskService();
// 任務ID
String taskId = "5002";
/** 一:獲取流程變量,使用基本數據類型 */
// Integer days = (Integer) taskService.getVariable(taskId, "請假天數");
// Date date = (Date) taskService.getVariable(taskId, "請假日期");
// String resean = (String) taskService.getVariable(taskId, "請假原因");
// System.out.println("請假天數:"+days);
// System.out.println("請假日期:"+date);
// System.out.println("請假原因:"+resean);
/** 二:獲取流程變量,使用javabean類型 */
Person p = (Person) taskService.getVariable(taskId, "人員信息(添加固定版本)");
System.out.println(p.getId() + " " + p.getName());
}
/** 模擬設置和獲取流程變量的場景 */
public void setAndGetVariables() {
/** 與流程實例,執(zhí)行對象(正在執(zhí)行) */
RuntimeService runtimeService = processEngine.getRuntimeService();
/** 與任務(正在執(zhí)行) */
TaskService taskService = processEngine.getTaskService();
/** 設置流程變量 */
// runtimeService.setVariable(executionId, variableName,
// value)//表示使用執(zhí)行對象ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值)
// runtimeService.setVariables(executionId,
// variables)//表示使用執(zhí)行對象ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值)
// taskService.setVariable(taskId, variableName,
// value)//表示使用任務ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值)
// taskService.setVariables(taskId,
// variables)//表示使用任務ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值)
// runtimeService.startProcessInstanceByKey(processDefinitionKey,
// variables);//啟動流程實例的同時,可以設置流程變量,用Map集合
// taskService.complete(taskId, variables)//完成任務的同時,設置流程變量,用Map集合
/** 獲取流程變量 */
// runtimeService.getVariable(executionId,
// variableName);//使用執(zhí)行對象ID和流程變量的名稱,獲取流程變量的值
// runtimeService.getVariables(executionId);//使用執(zhí)行對象ID,獲取所有的流程變量,將流程變量放置到Map集合中,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值
// runtimeService.getVariables(executionId,
// variableNames);//使用執(zhí)行對象ID,獲取流程變量的值,通過設置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map集合中
// taskService.getVariable(taskId,
// variableName);//使用任務ID和流程變量的名稱,獲取流程變量的值
// taskService.getVariables(taskId);//使用任務ID,獲取所有的流程變量,將流程變量放置到Map集合中,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值
// taskService.getVariables(taskId,
// variableNames);//使用任務ID,獲取流程變量的值,通過設置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map集合中
}
/** 完成我的任務 */
@Test
public void completeMyPersonalTask() {
// 任務ID
String taskId = "2402";
processEngine.getTaskService()// 與正在執(zhí)行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:" + taskId);
}
/** 查詢流程變量的歷史表 */
@Test
public void findHistoryProcessVariables() {
Listlist = processEngine.getHistoryService()//
.createHistoricVariableInstanceQuery()// 創(chuàng)建一個歷史的流程變量查詢對象
.variableName("請假天數").list();
if (list != null && list.size() > 0) {
for (HistoricVariableInstance hvi : list) {
System.out.println(hvi.getId() + " "
+ hvi.getProcessInstanceId() + " "
+ hvi.getVariableName() + " "
+ hvi.getVariableTypeName() + " " + hvi.getValue());
System.out
.println("###############################################");
}
}
}
}
】
九、HistoryQuery
代碼:【
package test.e_historyQuery;
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.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.junit.Test;
public class HistoryQueryTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**查詢歷史流程實例*/
@Test
public void findHistoryProcessInstance(){
String processInstanceId = "2101";
HistoricProcessInstance hpi = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service
.createHistoricProcessInstanceQuery()//創(chuàng)建歷史流程實例查詢
.processInstanceId(processInstanceId)//使用流程實例ID查詢
.orderByProcessInstanceStartTime().asc()
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}
/**查詢歷史活動*/
@Test
public void findHistoryActiviti(){
String processInstanceId = "2101";
Listlist = processEngine.getHistoryService()//
.createHistoricActivityInstanceQuery()//創(chuàng)建歷史活動實例的查詢
.processInstanceId(processInstanceId)//
.orderByHistoricActivityInstanceStartTime().asc()//
.list();
if(list!=null && list.size()>0){
for(HistoricActivityInstance hai:list){
System.out.println(hai.getId()+" "+hai.getProcessInstanceId()+" "+hai.getActivityType()+" "+hai.getStartTime()+" "+hai.getEndTime()+" "+hai.getDurationInMillis());
System.out.println("#####################");
}
}
}
/**查詢歷史任務*/
@Test
public void findHistoryTask(){
String processInstanceId = "2101";
Listlist = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service
.createHistoricTaskInstanceQuery()//創(chuàng)建歷史任務實例查詢
.processInstanceId(processInstanceId)//
.orderByHistoricTaskInstanceStartTime().asc()
.list();
if(list!=null && list.size()>0){
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
System.out.println("################################");
}
}
}
/**查詢歷史流程變量*/
@Test
public void findHistoryProcessVariables(){
String processInstanceId = "2101";
Listlist = processEngine.getHistoryService()//
.createHistoricVariableInstanceQuery()//創(chuàng)建一個歷史的流程變量查詢對象
.processInstanceId(processInstanceId)//
.list();
if(list!=null && list.size()>0){
for(HistoricVariableInstance hvi:list){
System.out.println(hvi.getId()+" "+hvi.getProcessInstanceId()+" "+hvi.getVariableName()+" "+hvi.getVariableTypeName()+" "+hvi.getValue());
System.out.println("###############################################");
}
}
}
}
】
十、SequenceFlow
代碼:【
package test.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()//創(chuàng)建一個部署對象
.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()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:"+pi.getId());//流程實例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "趙六";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()//創(chuàng)建任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實例ID查詢
// .executionId(executionId)//使用執(zhí)行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時間的升序排列
/**返回結果集*/
// .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("任務的創(chuàng)建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "3103";
//完成任務的同時,設置流程變量,使用流程變量用來指定完成任務后,下一個連線,對應sequenceFlow.bpmn文件中${message=='不重要'}
Mapvariables = new HashMap();
variables.put("message", "重要");
processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.complete(taskId,variables);
System.out.println("完成任務:任務ID:"+taskId);
}
}
】
十一、ExclusiveGateWay
代碼:【
package test.g_exclusiveGateWay;
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 ExclusiveGateWayTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("exclusiveGateWay.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("exclusiveGateWay.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("排他網關")//添加部署的名稱
.addInputStream("exclusiveGateWay.bpmn", inputStreamBpmn)//
.addInputStream("exclusiveGateWay.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程實例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "exclusiveGateWay";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:"+pi.getId());//流程實例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "王小五";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()//創(chuàng)建任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實例ID查詢
// .executionId(executionId)//使用執(zhí)行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時間的升序排列
/**返回結果集*/
// .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("任務的創(chuàng)建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "3904";
//完成任務的同時,設置流程變量,使用流程變量用來指定完成任務后,下一個連線,對應exclusiveGateWay.bpmn文件中${money>1000}
Mapvariables = new HashMap();
variables.put("money", 200);
processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.complete(taskId,variables);
System.out.println("完成任務:任務ID:"+taskId);
}
}
】
十二、ParallelGateWay
代碼:【
package test.h_parallelGateWay;
import java.io.InputStream;
import java.util.List;
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 ParallelGateWayTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("parallelGateWay.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("parallelGateWay.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("并行網關")//添加部署的名稱
.addInputStream("parallelGateWay.bpmn", inputStreamBpmn)//
.addInputStream("parallelGateWay.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程實例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "parallelGateWay";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:"+pi.getId());//流程實例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "商家";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()//創(chuàng)建任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實例ID查詢
// .executionId(executionId)//使用執(zhí)行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時間的升序排列
/**返回結果集*/
// .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("任務的創(chuàng)建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "4302";
processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:"+taskId);
}
}
】
十三、Start
代碼:【
package test.i_start;
import java.io.InputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
public class StartTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("start.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("start.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("開始活動")//添加部署的名稱
.addInputStream("start.bpmn", inputStreamBpmn)//
.addInputStream("start.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程實例+判斷流程是否結束+查詢歷史*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "start";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:"+pi.getId());//流程實例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
/**判斷流程是否結束,查詢正在執(zhí)行的執(zhí)行對象表*/
ProcessInstance rpi = processEngine.getRuntimeService()//
.createProcessInstanceQuery()//創(chuàng)建流程實例查詢對象
.processInstanceId(pi.getId())
.singleResult();
//說明流程實例結束了
if(rpi==null){
/**查詢歷史,獲取流程的相關信息*/
HistoricProcessInstance hpi = processEngine.getHistoryService()//
.createHistoricProcessInstanceQuery()//
.processInstanceId(pi.getId())//使用流程實例ID查詢
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}
}
}
】
十四、ReceiveTask
代碼:【
import java.io.InputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
public class ReceiveTaskTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("接收活動任務")//添加部署的名稱
.addInputStream("receiveTask.bpmn", inputStreamBpmn)//
.addInputStream("receiveTask.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程實例+設置流程變量+獲取流程變量+向后執(zhí)行一步*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "receiveTask";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:"+pi.getId());//流程實例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
/**查詢執(zhí)行對象ID*/
Execution execution1 = processEngine.getRuntimeService()//
.createExecutionQuery()//創(chuàng)建執(zhí)行對象查詢
.processInstanceId(pi.getId())//使用流程實例ID查詢
.activityId("receivetask1")//當前活動的id,對應receiveTask.bpmn文件中的活動節(jié)點id的屬性值
.singleResult();
/**使用流程變量設置當日銷售額,用來傳遞業(yè)務參數*/
processEngine.getRuntimeService()//
.setVariable(execution1.getId(), "匯總當日銷售額", 21000);
/**向后執(zhí)行一步,如果流程處于等待狀態(tài),使得流程繼續(xù)執(zhí)行*/
processEngine.getRuntimeService()
.signal(execution1.getId());
/**查詢執(zhí)行對象ID*/
Execution execution2 = processEngine.getRuntimeService()//
.createExecutionQuery()//創(chuàng)建執(zhí)行對象查詢
.processInstanceId(pi.getId())//使用流程實例ID查詢
.activityId("receivetask2")//當前活動的id,對應receiveTask.bpmn文件中的活動節(jié)點id的屬性值
.singleResult();
/**從流程變量中獲取匯總當日銷售額的值*/
Integer value = (Integer)processEngine.getRuntimeService()//
.getVariable(execution2.getId(), "匯總當日銷售額");
System.out.println("給老板發(fā)送短信:金額是:"+value);
/**向后執(zhí)行一步,如果流程處于等待狀態(tài),使得流程繼續(xù)執(zhí)行*/
processEngine.getRuntimeService()
.signal(execution2.getId());
}
}
】
十五、Task
代碼:【
package test.k_personalTask;
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 TaskTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("任務")//添加部署的名稱
.addInputStream("task.bpmn", inputStreamBpmn)//
.addInputStream("task.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程實例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "task";
/**啟動流程實例的同時,設置流程變量,使用流程變量用來指定任務的辦理人,對應task.pbmn文件中#{userID}*/
Mapvariables = new HashMap();
variables.put("userID", "周芷若");
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的key啟動流程實例,key對應helloworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
System.out.println("流程實例ID:"+pi.getId());//流程實例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "周芷若";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()//創(chuàng)建任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實例ID查詢
// .executionId(executionId)//使用執(zhí)行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時間的升序排列
/**返回結果集*/
// .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("任務的創(chuàng)建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "5505";
processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:"+taskId);
}
}
】
十六、group
代碼:【
package test.l_group;
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.history.HistoricIdentityLink;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class TaskTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
.createDeployment()//創(chuàng)建一個部署對象
.name("任務")//添加部署的名稱
.addInputStream("task.bpmn", inputStreamBpmn)//
.addInputStream("task.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動流程實例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "task";
/**啟動流程實例的同時,設置流程變量,使用流程變量用來指定任務的辦理人,對應task.pbmn文件中#{userIDs}*/
Mapvariables = new HashMap();
variables.put("userIDs", "大大,中中,小小");
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實例和執(zhí)行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的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 = "小A";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()//創(chuàng)建任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時間的升序排列
/**返回結果集*/
.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("任務的創(chuàng)建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**查詢當前人的組任務*/
@Test
public void findMyGroupTask(){
String candidateUser = "大大";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.createTaskQuery()//創(chuàng)建任務查詢對象
/**查詢條件(where部分)*/
.taskCandidateUser(candidateUser)//組任務的辦理人查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時間的升序排列
/**返回結果集*/
.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("任務的創(chuàng)建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "6905";
processEngine.getTaskService()//與正在執(zhí)行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:"+taskId);
}
/**查詢正在執(zhí)行的任務辦理人表*/
@Test
public void findRunPersonTask(){
//任務ID
String taskId = "6204";
Listlist = processEngine.getTaskService()//
.getIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
for(IdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
}
}
}
/**查詢歷史任務的辦理人表*/
@Test
public void findHistoryPersonTask(){
//流程實例ID
String processInstanceId = "6201";
Listlist = processEngine.getHistoryService()//
.getHistoricIdentityLinksForProcessInstance(processInstanceId);
if(list!=null && list.size()>0){
for(HistoricIdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
}
}
}
/**拾取任務,將組任務分給個人任務,指定任務的辦理人字段*/
@Test
public void claim(){
//將組任務分配給個人任務
//任務ID
String taskId = "6905";
//分配的個人任務(可以是組任務中的成員,也可以是非組任務的成員)
String userId = "大大";
processEngine.getTaskService()//
.claim(taskId, userId);
}
/**將個人任務回退到組任務,前提,之前一定是個組任務*/
@Test
public void setAssigee(){
//任務ID
String taskId = "6204";
processEngine.getTaskService()//
.setAssignee(taskId, null);
}
/**向組任務中添加成員*/
@Test
public void addGroupUser(){
//任務ID
String taskId = "6204";
//成員辦理人
String userId = "大H";
processEngine.getTaskService()//
.addCandidateUser(taskId, userId);
}
/**從組任務中刪除成員*/
@Test
public void deleteGroupUser(){
//任務ID
String taskId = "6204";
//成員辦理人
String userId = "小B";
processEngine.getTaskService()//
.deleteCandidateUser(taskId, userId);
}
}
】
工作流activiti eclipse 插件不自動生成png
步驟:
window
——> preferences
——>activiti
——>save
——>選中create process definition image when saving the diagram