工作流(activiti7)教程-简单的介绍和使用(一)
工作流(activiti7)教程-简单的介绍和使用(二)
目录
工作流:
1.1环境搭建
1.2添加依赖
1.3添加数据库
1.4流程图介绍和使用
1.5部署流程定义
1.6启动流程实例
1.7流程定义查询
1.8任务处理
1.9任务查询
1.10 历史查询
1.11删除流程定义
建好项目后新建activiti.cfg.xml配置文件这个名字是默认名字,加载默认配置文件,修改名字就需要手动代码加载了
本地新建数据库,名字activiti,随便起。。。
4.0.0
com.wsj.activiti
activiti
1.0-SNAPSHOT
org.apache.maven.plugins
maven-compiler-plugin
6
6
1.6.6
1.2.12
org.activiti
activiti-engine
7.0.0.Beta1
org.activiti
activiti-spring
7.0.0.Beta1
org.activiti
activiti-bpmn-model
7.0.0.Beta1
org.activiti
activiti-bpmn-converter
7.0.0.Beta1
org.activiti
activiti-json-converter
7.0.0.Beta1
org.activiti
activiti-bpmn-layout
7.0.0.Beta1
org.activiti.cloud
activiti-cloud-services-api
7.0.0.Beta1
mysql
mysql-connector-java
5.1.40
junit
junit
4.12
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.mybatis
mybatis
3.4.5
commons-dbcp
commons-dbcp
1.4
commons-io
commons-io
2.0
org.activiti
activiti-spring-boot-starter-basic
5.22.0
compile
alfresco
Activiti Releases
https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/
true
两种;
一:拷贝源码中的数据库
二:代码动态生成(本教程采用方式)
@Test
public void creatSql() {
//动态创建数据库
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
}
运行后生成了数据库。。。。
第一部分:保存了流程图和流程部署定义的数据,每个流程图都存储,待会下边不熟流程会介绍
其中act_re开头代表的Repository,仓库的意思。说白了就是存储实实在在的流程图的相关信息和数据。。
第二部分 act_hi开头。。。history 历史记录。。。各种历史记录。。
第三部分。。act_ru runtime 运行时的数据,,,(临时数据)流程跑完后就自动删除没有了。。。
现在我们画一个请假流程来介绍:
左侧是每个图标的相关属性,id,名字等,其中有用的是Assignee字段,设置执行人,请假我设置的是张三,经理审批我设置的李四,下边还有其它属性,有多个用户,用户组(比如需要一个项目组的人执行任务),监听器(对任务的监听)等常用操作。这些也都可以通过代码来配置。
画完流程图,就需要部署了,也就是保存到数据库。。。
现在执行以下代码来部署流程定义
第一步先配置流程引擎对象获取。默认拿到流程引擎对象,全局对象,其它所有操作都需要它
ProcessEngine pe;
@Before
public void init(){
//默认方式拿到流程引擎,配置文件名字必须是"activiti.cfg.xml。。
pe = ProcessEngines.getDefaultProcessEngine();
System.out.println("初始化了");
}
@Test
public void test1() {
//部署流程,把画好的流程部署到数据库
DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("diagram/pro1.bpmn");
deploymentBuilder.addClasspathResource("diagram/pro1.png");
Deployment deployment = deploymentBuilder.deploy();
System.out.println(deployment.getId());
}
控制台打印
刚才说了,流程部署后相关的数据库会在act_re和上面一个个byte数据库存储数据,现在查看。。。
控制台打印的id就是上图表的id,部署id 存储流程的id。和数据。。整个路程的id....
byte表存储流程图和png图片
1.6启动流程实例
部署后就可以启动流程了,,
先查询下流程数据然后根据id启动流程
@Test
public void test2() {
// 部署查询对象----查询部署表act_re_deployment,也就是流程列表。。
ProcessDefinitionQuery query = pe.getRepositoryService()
.createProcessDefinitionQuery();
// query.orderByDeploymenTime().desc();
query.latestVersion();
List list = query.list();
for (ProcessDefinition processDefinition : list) {
System.out.println(processDefinition.getId()+"-------"+processDefinition.getName());
}
}
@Test
public void test3() {
//开启流程
String processDefinitionId = "qjlc:1:4";
ProcessInstance pi = pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
// ProcessInstance pi = pe.getRuntimeService().startProcessInstanceByKey(); //多种方式请求
System.out.println(pi.getId());
}
查询流程列表,,,可以看到查询到id和数据库的存储的数据一一对应
根据id启动流程
启动后可以看到有一个2051的id。。。现在去查询数据库。。。
流程实例初始化历史表
当前运行的任务表,现在流程启动的了,到请假申请了。。。
当前任务的执行人信息
执行表,,流程里面画了两个任务,一个请假,一个审批
流程定义历史表,启动流程后走了开始和第一个流程,所以存储了两条数据。。。这里存储的是整个流程所有节点的历史数据
任务历史表,当前走到了第一个任务。。。所以只有一条。。。
刚才已经查询了一下列表。。。。。参考上面代码
流程启动了。到第一个任务了,也就是张三请假。。所以需要张三来处理下,也就是提交请假申请。。
@Test
public void test4() {
//查询指派人下的任务
TaskQuery taskQuery = pe.getTaskService().createTaskQuery();
// String assignee = "张三"; 指定人就是当前人下的任务,不指定人就是所有任务
// taskQuery.taskAssignee(assignee);
taskQuery.orderByTaskCreateTime().desc();
List list = taskQuery.list();
for (Task task : list) {
String id = task.getId();
String name = task.getName();
String assignee2 = task.getAssignee();
System.out.println(id + "---" + name + "----" + assignee2);
}
}
@Test
public void test5() {
//执行任务
String taskId = "2505";
pe.getTaskService().complete(taskId);
}
先查询任务列表
更具查询的id执行任务。。
这样张三的流程就处理完了,目前任务到了李四审批那里
上面已经写了,这里再写一次李四的信息
先查询列表,发下变成了李四了。。然后执行。。这样整个任务就执行结束了。。。。
任务跑完了。。。这样act_ru的表数据都没有了。。。
这个表存储的漱所有节点信息,上面有介绍。。。开始-任务-结束都有
任务历史记录,,只有两个任务。。。
流程定义,真个过程就是一个流程图。。所以就一条数据。。。。
@Test
public void testHistoric01(){
HistoryService historyService = pe.getHistoryService();
HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery();
// query.processInstanceId("2501");可以根据id筛选。。
List list = query.list();
for(HistoricActivityInstance ai :list){
System.out.println(ai.getActivityId());
System.out.println(ai.getActivityName());
System.out.println(ai.getProcessDefinitionId());
System.out.println(ai.getProcessInstanceId());
System.out.println("==============================");
}
}
查询的是act_hi_actinst 表。。查询出四个节点的数据。。。
@Test
public void deleteDeployment() {
// 流程部署id
String deploymentId = "1";
// 通过流程引擎获取repositoryService
RepositoryService repositoryService =pe.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
// repositoryService.deleteDeployment(deploymentId, true);
}
部署流程的时候id为1.。根据act_re_deployment表删除,这样其他表的数据也会全部删除。。。就不截图数据库了。。表已经清空了。。。
代码地址;https://github.com/itwsj/activitidemo