activiti從入門到絕望
activiti從入門到絕望
廢話不說,直接上手
第一步畫流程圖
流程圖需要一個插件,網上找找如何下
點擊用戶請假,
點擊經理審覈
點擊取消提交連線
提交連線
駁回連線
流程圖差不多就這些了
保存以後把你的流程圖改成.bpmn20.xml格式的文件
配置activiti.cfg.xml,默認加載activiti.cfg.xml,名字改了以後,需要手動加載
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--
public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自動創建表,需要表存在
public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先刪除表再創建表
public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自動創建表
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 連接數據的配置 -->
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="root"></property>
<!-- 沒有表創建表 -->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bgxt</groupId>
<artifactId>Activiti</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>firstdemo</name>
<dependencies>
<!-- BPM引刑 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<!--日誌記錄-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
<!--Mysql數據庫驅動-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<!-- junit測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- file工具類 -->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>``
到這差不多環境搭好了
部署流程並進行測驗
從上往下一個一個的測驗,在流程中,只有當前流程走完以後,纔會到下一流程中去,根據你所畫的流程圖去進行測試
/**加載配置文件創建數據庫表*/
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程(classpath部署)*/
@Test
public void deploymentProcessDefinition_classpath() {
//獲取流程引
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.name("測試流程")//給流程取名
.addClasspathResource("Process2.bpmn20.xml")
.deploy();
System.out.println("部署ID"+deployment.getId());//2501
System.out.println("部署名稱"+deployment.getName());
}
/**啓動流程實例*/
@Test
public void startProcessInstance(){
String processDefinitionKey="Process";
//流程啓動前設置流程變量
Map<String,Object> variables=new HashMap<String,Object>();
variables.put("userid", "張三");//這裏userid user就是我們在流程圖中的${userid},${user}
variables.put("user", "李四");
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println("流程實例ID"+pi.getId());//5001
System.out.println("流程定義ID"+pi.getProcessDefinitionId());//Process:1:2504
}
/**查詢當前人的任務*/
@Test
public void findPenroleTest(){
String assignee="李四";
List<Task> list = processEngine.getTaskService()
.createTaskQuery()
//查詢條件
.taskAssignee(assignee)
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實例ID查詢
// .executionId(executionId)//使用執行對象ID查詢
//排序
.orderByTaskCreateTime().desc()//使用創建時間排序降序
//返回結果集
.list();
// .singleResult()//返回惟一結果集
// .count()//返回結果集的數量
// .listPage(firstResult, maxResults);//分頁查詢
if(list!=null && list.size()>0){
for (Task task : list) {
System.out.println("任務id"+task.getId());//5007
System.out.println("任務名稱"+task.getName());
System.out.println("任務的創建時間"+task.getCreateTime());
System.out.println("任務的辦理人"+task.getAssignee());
System.out.println("流程實例id"+task.getProcessInstanceId());//5001
System.out.println("執行對象ID:" + task.getExecutionId());//5004
System.out.println("流程定義ID:" + task.getProcessDefinitionId());//Process:1:2504
}
}
}
/**完成任務*/
@Test
public void completePersonalTask(){
String taskId="30003";
Map<String, Object> variables=new HashMap<String, Object>();
variables.put("miss","通過");//這裏miss就是我們在連線上設置的${miss=="通過"}
processEngine.getTaskService()
.complete(taskId, variables);
System.out.println("任務完成:任務id"+taskId);
}
/**刪除流程部署*/
@Test
public void deldeployment(){
//獲取流程id
String deploymentId="2501";
//獲取流程倉庫
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.deleteDeployment(deploymentId, true);
}
/**查看流程部署*/
@Test
public void querydeploymentProcess(){
//獲取倉庫服務對象
List<ProcessDefinition> list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()//定義流程查詢對象
.orderByProcessDefinitionVersion().asc()//設置查詢條件
.list();//返回結果集
if(list!=null&&list.size()>0){
for (ProcessDefinition pd : list) {
System.out.println("流程實例id:"+pd.getDeploymentId());
System.out.println("流程定義id:"+pd.getId());//流程定義id
System.out.println("name:"+pd.getName());//流程名稱
System.out.println("Key:"+pd.getKey());
System.out.println("Version:"+pd.getVersion());//版本
System.out.println("ResourceName:"+pd.getResourceName());//加載的流程文件
}
}else{
System.out.println("沒有流程");
}
}
/**查詢歷史流程實例*/
@Test
public void queryHistoric(){
String processDefinitionKey="Process";//部署流程時的key
List<HistoricProcessInstance> list = processEngine.getHistoryService()
.createHistoricProcessInstanceQuery()//創建歷史流程實例查詢
.processDefinitionKey(processDefinitionKey)
//查詢條件
.orderByProcessInstanceStartTime().desc()//按照流程開始時間
.list();
for (HistoricProcessInstance hpi : list) {
System.out.println(hpi.getId());
System.out.println(hpi.getName());
System.out.println(hpi.getProcessDefinitionKey());
System.out.println(hpi.getDeploymentId());
System.out.println(hpi.getStartTime());
System.out.println(hpi.getEndTime());
}
}
/**展示流程圖片
* @throws IOException */
@Test
public void selview() throws IOException{
String deploymentId="15001";//部署ID
RepositoryService repositoryService = processEngine.getRepositoryService();
List<String> namesImg = repositoryService.getDeploymentResourceNames(deploymentId);
String nameimg=null;
for (String name : namesImg) {
if(name.indexOf(".png")>0){
nameimg=name;
}
}
if(nameimg!=null){
System.out.println(nameimg);
//通過部署id和文件名得到文件輸入流
InputStream in = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, nameimg);
File file=new File("e:/"+nameimg);
FileUtils.copyInputStreamToFile(in, file);
}
}