Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程
以下流程图以员工请假为例:
大致流程:开始-->员工(zhangsan)申请休假-->由部门经理(lisi)审批-->由总经理(wangwu)审批-->结束
1 每一个流程都必须有一个开始和结束
2 每一步都是由单个用户操作的,所以选择userTask
3 最后使用连线连起来
注意:
最好设置保存文件的时候同事保存图片(window-preferences-Activiti(前期安装了activiti插件)-saveActions-勾选Create proces defi...)
设置每个节点的属性的时候要调出properties窗口,选中哪个节点就修改的是哪个节点的属性
点击流程空白处则修改的是文件的属性,每一个bpmn文件都必须有id、name、namespace
单个节点如员工节点中General中 id一般会有默认值,name可以自定义修改
main config中如果是单人任务就再Assignee中填写(这里写死,可以写成动态的)
其他节点的General和main config也是一样
流程图最终:
dd
bpmn文件也可以用xml打开(右键open with xml editor),里面明确表明任务属性及任务之间的关系,
节点所在的坐标,这些属性都会存数据库中
通过单元测试的方法实现请假流程(当然数据都是写死的目前)
这里我用的springboot的单元测试方法,这里放一下用到的maven依赖,只是目前用到的
<properties>
<java.version>1.8</java.version>
<activiti.version>5.22.0</activiti.version>
<postgresql.version>42.2.5</postgresql.version>
</properties>
<dependencies>
<!-- Postgresql 数据库-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
<!-- Activiti -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-explorer</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<artifactId>vaadin</artifactId>
<groupId>com.vaadin</groupId>
</exclusion>
<exclusion>
<artifactId>dcharts-widget</artifactId>
<groupId>org.vaadin.addons</groupId>
</exclusion>
<exclusion>
<artifactId>activiti-simple-workflow</artifactId>
<groupId>org.activiti</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.eweb4j</groupId>
<artifactId>fel</artifactId>
<version>0.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- <exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions> -->
</dependency>
</dependencies>
activiti工作流中 最核心的对象ProcessEngine(流程引擎),通过这个对象获取到流程中的其他对象,
如定义对象,流程实例对象,任务对象等
大致思路,创建流程引擎-->部署流程定义-->启动流程实例-->查询当前个人任务-->完成个人任务
package com.zrzrno.activiti;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ActivitiApplicationTests {
ProcessEngine engine = intProcessEngine();
// 创建工作流引擎
private static final ProcessEngine intProcessEngine() { // 数据库连接
ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration();
engineConfiguration.setJdbcDriver("org.postgresql.Driver");
engineConfiguration.setJdbcUrl(
"jdbc:postgresql://localhost:5432/activiti5?useUnicode=true&characterEncoding=utf-8&useSSL=false");
engineConfiguration.setJdbcUsername("postgres");
engineConfiguration.setJdbcPassword("qq245700"); // 设置自动创建数据库表
engineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine engine = engineConfiguration.buildProcessEngine();
return engine;
}
// 部署流程定义
@Test
public void deployProcess() {
Deployment deployment = engine.getRepositoryService()// 与流程定义和部署对象相关的service
.createDeployment()// 创建一个部署对象
.addClasspathResource("diagrams/helloworld.bpmn")// 从classpath中加载,一次只能加载一个-bpmn文件
.addClasspathResource("diagrams/helloworld.png")// 从classpath中加载,一次只能加载一个-png文件
.deploy();
System.out.println("deployment:" + deployment);
}
//启动流程实例
@Test
public void startProcessInstance() {
String processDefinitionKey="helloworld";//
ProcessInstance instance=engine.getRuntimeService() //正在执行的流程实例和执行对象相关的service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动实例,key对应bpmn文件最外层的id的值
System.out.println(instance.getId());//流程实例id
System.out.println(instance.getProcessDefinitionId());//流程定义id
}
// 查询当前个人任务
@Test
public void getMyTask() {
String assignee="zhangsan";
List<Task> tList=engine.getTaskService()
.createTaskQuery()
.taskAssignee(assignee)
.list();
if(tList!=null && tList.size()>0) {
for(Task task:tList){
System.out.println("任务id:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("流程办理人:"+task.getAssignee());
}
}
}
// 完成个人任务
@Test
public void completeMyTask() {
String taskId="20004";
engine.getTaskService()
.complete(taskId);
System.out.println("任务完成,任务id为:"+taskId);
}
}
一旦某个节点的个人完成了任务,那么再次查询个人任务的时候这个任务就查不到了,注意
张三完成了任务,那么张三就查询不到个人任务了,任务环节到李四那里,那么李四就可以查询到个人任务
到最后总经理王五也完成任务
此时他们都不查询到个人任务了