Activiti02流程基本功能使用
主要分为一下几个步骤:
1.画图
2.部署流程-把图的信息转入到数据表格中
3.创建流程实例-开始一个流程-实际发起了一个流程
4.执行任务:获取任务+完成任务
1.画图
画了一个简单的流程图,图形文件名称是:qj01.bpmn id:myProcess_1
流程: 请假(qingjia)--->审批(shenpi)--->结束
指定了这一步骤的名称和执行人 Assignee:dcc 执行人时dcc
指定了第二步的名称和执行人 Assignee:jcc 执行人时jcc
2.部署流程
2.1方法1
(本地测试可以用下,实际项目不使用)
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //流程定义
@Test
public void deploy(){
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment de = repositoryService.createDeployment().addClasspathResource("bpmn/qj01.bpmn").name("qj").deploy(); //这里name里面传入中文,到act_re_deployment表可能出现乱码
System.out.println("部署id"+de.getId()); /*
流程定义:
流程部署表 re_deployment
流程定义表 re_procdef
资源信息表 ge_bytearray
*/
}
addClasspathResource("bpmn/qj01.bpmn"),这里文件是bpmn图形文件的路径
执行,在数据库中查看,影响到3张数据表格:流程部署表 re_deployment 流程定义表 re_procdef 资源信息表 ge_bytearray
2.2方法2:上传压缩文件的方式
2.2.1第一步:把bpmnt图形文件压缩成zip文件
2.2.2编码
这里我省略了上传zip文件的过程,直接从本地读取的
@Test
public void deploy2() throws FileNotFoundException {
RepositoryService repositoryService = processEngine.getRepositoryService();
InputStream in = new FileInputStream("C:\\Users\\Administrator\\IdeaProjects\\jsnhcopy\\src\\main\\resources\\bpmn\\qj01.zip"); //zip文件路径
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deploy = repositoryService.createDeployment().addZipInputStream(zipInputStream).name("qjlc").deploy(); System.out.println("部署id"+deploy.getId()); /*
流程定义:
流程部署表 re_deployment
流程定义表 re_procdef
资源信息表 ge_bytearray
*/
}
2.3中文乱码问题
存在中文的时候,出现乱码,尝试了各种方法,都没有生效
1)idea安装目录下两个文件加入配置:-Dfile.encoding=UTF-8,没有用
2)配置idea,无效
file-setting-editor-fileencoding
3)pom文件加入配置,无效
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.1.4.RELEASE</spring.version>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
最后没有办法,只能不用中文
3.创建流程实例-启动流程
//启动流程实例
@Test
public void run(){
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance myProcess_1 = runtimeService.startProcessInstanceByKey("myProcess_1");//表re_procdef里面的key字段 System.out.println("实例id"+myProcess_1.getId());
System.out.println("流程定义id"+myProcess_1.getProcessDefinitionId()); /*
启动流程实例
运行时任务表:ru_task
运行时流程执行表:ru_execution
运行时执行主体信息表:ru_identitylink
*/
}
其中 myProcess_1的值是有图形的id决定的。会成为表act_re_procdef里面的KEY_的值,这个属性用来标识流程。相同的KEY_的流程表示同一流程的不同版本。默认启动的是同一流程的最新版本
执行,影响到三张表 运行时任务表:ru_task 运行时流程执行表:ru_execution 运行时执行主体信息表:ru_identitylink,此时一个流程被发起,有了任务act_ru_task
除了使用KEY_来创建流程实例,还可以通过流程的id等其它属性来创建流程实例 runtimeService.startProcessInstanceById(1)
4.执行任务
4.1获取任务
@Test
public void findtask(){
//获取任务
TaskService taskService = processEngine.getTaskService();
List<Task> task_list = taskService.createTaskQuery().taskAssignee("dcc").list();//查询dcc的任务
task_list.stream().forEach((x)->{
System.out.println("任务id"+x.getId());
System.out.println("任务名称"+x.getName());
});
这里是通过任务执行人来获取的任务,获取的是dcc的任务。这里获取到id为25005的任务
4.2完成任务
@Test
public void complete() { TaskService taskService = processEngine.getTaskService();
taskService.complete("25005");
System.out.println("完成任务"); /*
任务id2505
完成任务id2505
*/
/*
完成任务:
ru的几张表的数据清楚了
历史相关表:
历史任务表:hi_taskinst
历史流程实例表:hi_procinst
历史流程参与者表:hi_identitylink
历史活动节点表:hi_actinst
*/
}
这里通过任务id来完成任务
在完成了这个任务后,流程就走到了审批流程,表中ru_task表中id为25005任务没有了,出现了一个新的任务-审批
上面执行,完成了第一个步骤-请假,再依照上面,获取任务-完成任务,完成第二个步骤-审批,整个流程就走完了。
流程走完后,此时act_ru_的几张表的数据会清空,历史信息进入历史表,涉及到一下四张表
历史任务表:hi_taskinst
历史流程实例表:hi_procinst
历史流程参与者表:hi_identitylink
历史活动节点表:hi_actinst
5.流程的CRUD
5.1新增
新增一个流程也就是流程部署,也就是上面标题2的内容
5.2修改
流程本身是不能修改的。只能通过发布新的版本的流程来实现。
这个属性,也就是表act_re_procdef的KEY_属性值,相同表示同一流程,版本号增加。
如下图,我共画了3张图,重复发布,总共发布了7次,但是没修改id,流程的KEY_是相同的,都是"myProcess_1",所以KEY_值相同,版本号增加。如果此时通过KEY_来创建流程实例,默认是创建的最新版本的流程实例。
5.3删除
不建议删除
5.4查询
可以通过多个条件去查询KEy_ 、id等
@Test
public void query(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
ProcessDefinitionQuery processDefinitionQuery = processEngine.getRepositoryService().createProcessDefinitionQuery();
List<ProcessDefinition> myProcess_1 = processDefinitionQuery.processDefinitionKey("myProcess_1").list();
if(!myProcess_1.isEmpty()){
myProcess_1.stream().forEach(x->{
System.out.println(x.getKey());
System.out.println(x.getId());
});
}
}
6.历史的查询
6.1查询历史任务
可以通过多种条件查询 id、时间等
@Test
public void queryHi(){
HistoricTaskInstanceQuery historicTaskInstanceQuery = processEngine.getHistoryService().createHistoricTaskInstanceQuery();
List<HistoricTaskInstance> myProcess_11 = historicTaskInstanceQuery.processDefinitionKey("myProcess_1").list(); if(!myProcess_11.isEmpty()){
myProcess_11.stream().forEach(x->{
System.out.println(x.getName());
System.out.println(x.getId());
});
}
}
7.查询流程实例
可以通过多个条件查询,KEY_、id、name等
@Test
public void queryDeployVo(){
ProcessInstanceQuery processInstanceQuery = processEngine.getRuntimeService().createProcessInstanceQuery();
List<ProcessInstance> myProcess_1 = processInstanceQuery.processDefinitionKey("myProcess_1").list(); if(!myProcess_1.isEmpty()){
myProcess_1.stream().forEach(x->{
System.out.println(x.getName());
System.out.println(x.getId());
});
}
}
8.流程中的参数传递
8.1基本说明
这里的参数是指创建流程实例-执行任务中的参数传递。支持的数据类型包括基本数据类型、序列化对象
参数分为两类:任务节点本地变量和全局流程实例变量,前者在流程的指定节点有效,后者整个流程实例过程有效,一般使用后面的
8.2实例
8.2.1流程图
8.2.2部署流程
@Test
public void deploy(){
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment de = repositoryService.createDeployment().addClasspathResource("bpmn/qj01.bpmn").name("qj").deploy(); }
8.2.3启动一个流程实例并传递参数
@Test
public void run(){
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> pa = new HashMap<>();
pa.put("start","qidong");
ProcessInstance myProcess_1 = runtimeService.startProcessInstanceByKey("myid2",pa);//表re_procdef里面的key字段 }
这里传递了一个名为start的参数
8.2.4执行任务
先创建一个对象PoTe,序列化,这样子就可以作为参数传递
public class PoTe implements Serializable { //需要序列化 private String username; private String password; public PoTe() {
} public PoTe(String username, String password) {
this.username = username;
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return "PoTe{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
执行请假任务
@Test
public void complete() { TaskService taskService = processEngine.getTaskService(); Object start = taskService.getVariable("40006", "start");
System.out.println("启动变量"+start); //启动变量qidong taskService.setVariable("40006","username","hahaha");
taskService.setVariable("40006","password","123");
taskService.setVariable("40006","po",new PoTe("hahaha","123"));
/*
Map<String,Object> pa = new HashMap<>();
pa.put("username","hahaha");
pa.put("password","123");
pa.put("po",new PoTe("hahaha","123"));
taskService.setVariables("25005",pa);
*/ taskService.complete("40006");
System.out.println("完成任务"); }
获取到了前面添加的名称为start的变量。并且又添加了三个变量
执行审批任务
@Test
public void complete2() { TaskService taskService = processEngine.getTaskService(); String username = taskService.getVariable("42507", "username", String.class);
String password = taskService.getVariable("42507", "password", String.class);
String start = taskService.getVariable("42507", "start", String.class);
PoTe po = taskService.getVariable("42507", "po", PoTe.class);
System.out.println(username); //hahaha
System.out.println(password); //123
System.out.println(start); //qidong
System.out.println(po); //PoTe{username='hahaha', password='123'}
Map<String, VariableInstance> variableInstances = taskService.getVariableInstances("42507");
variableInstances.keySet().stream().forEach(x->{
VariableInstance variableInstance = variableInstances.get(x);
System.out.println(variableInstance.toString());
//VariableInstanceEntity[id=42502, name=password, type=string, textValue=123]
//VariableInstanceEntity[id=40002, name=start, type=string, textValue=qidong]
//VariableInstanceEntity[id=42501, name=username, type=string, textValue=hahaha]
//VariableInstanceEntity[id=42504, name=po, type=serializable, byteArrayValueId=42503]
});
taskService.complete("42507");
System.out.println("完成任务 42507"); }
这里获取到了start等4个参数。流程结束。
9.流程不同的分支走向-连线中的表达式
9.1画图
图的文件名:qj02.bpmn 图的id:myid3
这里的流程是:
请假(qjia)--->部门审批(shenpi)--->天数小于等于5->流程结束
--->天数大于5->领导审批(shenpi2)->流程结束
在这条连线设置了条件表达式:days>5
这里连线添加了条件:day<=5
9.2部署流程
//流程定义
@Test
public void deploy(){
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment de = repositoryService.createDeployment().addClasspathResource("bpmn/qj02.bpmn").name("qj").deploy();
System.out.println("部署id"+de.getId()); }
9.3创建流程实例
@Test
public void run(){
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> pa = new HashMap<>();
pa.put("start","qidong"); ProcessInstance myProcess_1 = runtimeService.startProcessInstanceByKey("myid3",pa);//表re_procdef里面的key字段 System.out.println("实例id"+myProcess_1.getId());
System.out.println("流程定义id"+myProcess_1.getProcessDefinitionId()); }
9.4.执行任务
9.4.1第一个任务-请假
此时任务表,有一个任务,id为67507,执行人时dcc,也就是请假这一步
执行任务
@Test
public void complete() { TaskService taskService = processEngine.getTaskService();
taskService.setVariable("67507","days",3);
taskService.complete("67507"); System.out.println("完成任务");
}
注意,这里传递了一个参数days为3
9.4.2第二个任务-部门审批
上面任务执行完成后,再看任务表。有一个任务,id为70002,执行人为jcc,也就是走到了第一个审批
@Test
public void complete2() {
TaskService taskService = processEngine.getTaskService();
taskService.complete("70002");
}
执行任务,执行完成后,发现任务表为空,整个流程完成了,因为day为3,所以没有走第二个审批
下面我们把days换做6
9.5创建流程实例
@Test
public void run(){
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> pa = new HashMap<>();
pa.put("start","qidong");
ProcessInstance myProcess_1 = runtimeService.startProcessInstanceByKey("myid3",pa);//表re_procdef里面的key字段
}
9.6执行任务
9.6.1第一个任务-请假
任务表有一个任务,id为75007,执行人为dcc,也就是第一步-请假
@Test
public void complete() {
TaskService taskService = processEngine.getTaskService();
taskService.setVariable("85006","days",6);
taskService.complete("85006");
System.out.println("完成任务");
}
注意,这里传递的days的参数是6
9.6.2第二个任务-部门审批
@Test
public void complete2() {
TaskService taskService = processEngine.getTaskService();
taskService.complete("87503");
System.out.println("完成任务");
}
9.6.3第三个任务-领导审批
@Test
public void complete2() {
TaskService taskService = processEngine.getTaskService();
taskService.complete("90002");
System.out.println("完成任务");
}
执行后,任务表没有任务了,流程走完了
10条件表达式
activiti支持两个UEL表达式:UEL-value和UEL-method
11.网关
11.1排他网关
几条不同的线,只走其中一条线
11.1.1画图
图形名称:qj03.bpmn 图形id:myid4
流程: 请假(qjia)--->请假天数<=5天--->部门审批(shenpi)--->结束
--->请假天数>5天--->领导审批(shenpi2)--->结束
11.1.2代码测试
和上面的代码差不多,我这里就不贴出来了。先测试3天,再测试6天。发现3天时,是部门审批,6天时,是领导审批
11.2并行网关
并行网关是指,几条线都需要执行通过,才能往下走
11.2.1画图
图名:qj04.bpmn id:myid6
流程: 请假(qjia)--->部门审批(shenpi1)+领导审批(shenpi2)--->老板审批(shenpi3)--->结束
这里部门审批和领导审批都需要审批,这里就没有设计条件表达式了,因为都要去审批
11.2.1部署流程
@Test
public void deploy(){
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment de = repositoryService.createDeployment().addClasspathResource("bpmn/qj04.bpmn").name("qj").deploy();
System.out.println("部署id"+de.getId());
}
11.2.2创建流程实例
@Test
public void run(){
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> pa = new HashMap<>();
ProcessInstance myProcess_1 = runtimeService.startProcessInstanceByKey("myid6",pa);//表re_procdef里面的key字段
}
11.2.3执行任务
11.2.3.1第一步任务-请假
有一个任务 请假(qjia)
执行任务
@Test
public void complete2() {
TaskService taskService = processEngine.getTaskService();
taskService.complete("107505");
System.out.println("完成任务");
}
11.2.3.2第二步-部门审批(shenpi)+领导审批(shenpi2)
上面完成后,任务里面有两个,分别是部门审批(shenpi)和领导审批(shenpi2)
先执行一个审批,随便先执行哪一个都可以
@Test
public void complete2() {
TaskService taskService = processEngine.getTaskService();
taskService.complete("110004");
System.out.println("完成任务");
}
一个审批完成后,发现第三步审批任务还没有,任务里面还剩下一个领导审批
继续执行领导审批
@Test
public void complete2() {
TaskService taskService = processEngine.getTaskService();
taskService.complete("110007");
System.out.println("完成任务");
}
11.2.3.3第三步-老板审批(shenpi3)
上面2个审批都执行完后,任务里面出现了老板审批(shenpi3)的任务
执行
@Test
public void complete2() {
TaskService taskService = processEngine.getTaskService();
taskService.complete("115003");
System.out.println("完成任务");
}
执行完成后,没有任务了,流程执行完
12.任务分配
前面我们画图的时候,每一步任务由谁执行,都是固定写死的,现在我们使用表达式
写死的:
表达式:
12.1画图
图形bpmn文件名称:qj05.bpmn id:myid11
流程:员工(employee)请假--->部门领导审批(leader)--->结束
12.2部署流程
//流程定义
@Test
public void deploy(){
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment de = repositoryService.createDeployment().addClasspathResource("bpmn/qj05.bpmn").name("qj").deploy();
System.out.println("部署id"+de.getId());
}
12.3启动流程实例
//启动流程实例
@Test
public void run(){
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String,Object> pa = new HashMap<>();
pa.put("employee","ddd");
ProcessInstance myProcess_1 = runtimeService.startProcessInstanceByKey("myid10",pa);//表re_procdef里面的key字段
}
启动流程的时候,设置哪些人可以请假,这里设置ddd可以请假
此时有任务,执行人就是ddd
12.4执行任务
12.4.1第一步-请假
ddd可以获取到任务,并执行
获取
@Test
public void findtask(){
//获取任务
TaskService taskService = processEngine.getTaskService();
List<Task> task_list = taskService.createTaskQuery().taskAssignee("ddd").list();//查询dcc的任务
}
执行,执行时指定由谁来审批,这里指定的是jjj
@Test
public void complete() {
TaskService taskService = processEngine.getTaskService();
taskService.setVariable("150006","leader","jjj");
taskService.complete("150006");
System.out.println("完成任务");
}
12.4.2第二步-审批
jjj获取任务并执行
@Test
public void findtask(){
//获取任务
TaskService taskService = processEngine.getTaskService();
List<Task> task_list = taskService.createTaskQuery().taskAssignee("jjj").list();//查询dcc的任务
}
执行
@Test
public void complete() {
TaskService taskService = processEngine.getTaskService();
taskService.setVariable("152503","leader","jjj");
taskService.complete("152503");
System.out.println("完成任务");
}
流程走完了,任务没有了
Activiti02流程基本功能使用的更多相关文章
- H3 BPM让天下没有难用的流程之功能介绍
H3 BPM10.0功能地图如下: 图:H3 BPM 功能地图 一.流程引擎 H3 BPM 流程引擎遵循WFMC 标准的工作流引擎技术,设计可运行的流程和表单,实现工作任务在人与人.人与系统.系统 ...
- PHP实现流程管理功能
核心逻辑:流程管理,在各种系统中扮演很重要的地位,可以把设定好的流程放入系统中,规定好几个节点,只要所有节点都通过,就可以通过. 建立四张数据库表: 1.我们首先做一个新建流程页面 flow.php, ...
- 金蝶EAS——我的EAS报销流程怎么能让另一个人看到呢?即如何设置流程传阅功能?设置“代理报销”
代理的话只能看到被代理人能看到的流程.设置"代理报销":应用--财务会计--费用管理--代理报销 选择报销人公司--"他人代理我报销"--选择报销人(zhaof ...
- 使用gitflow流程完成功能时报错
报错 fatal: could not read Username for 'https://github.com': ······ 原因 使用https方式的时候 在https url 里面没有用户 ...
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
- H3 BPM让天下没有难用的流程之技术特性
一.集成性 H3 BPM可以与其它系统进行多个层面的集成,满足企业的针对不同系统的集成需求. 图:多种集成维度 Ø 用户集成 可与企业现有系统进行组织架构同步或调用,也可以直接与AD 进行集成. ...
- django博客功能实现——标签功能
标签功能添加流程 0.功能概括 标签作为文章中的分类标记,会显示出该文章是关于哪一方面的文章,比如是关于python的还是关于django的. 当我们点击该标签的时候,会出现该博客中所有属于该标签的文 ...
- F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)
Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回.传阅.转交,都可以非常方便快捷地实现,管理员 ...
- 知方可补不足~用CDC功能来对数据库变更进行捕捉
回到目录 如果我们希望监视一个数据表的变化,在sql2008之前的版本里,在数据库端可能想到的只有触发器,或者在程序端通过监视自己的insert,update,delete来实现相应的功能,这种实现无 ...
- 纯JS Web在线可拖拽的流程设计器
F2工作流引擎之-纯JS Web在线可拖拽的流程设计器 Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回. ...
随机推荐
- 嵌入式-C语言基础:数组得初始化
#include<stdio.h> int main() { int a[10]; int size=sizeof(a)/sizeof(a[0]);//计算数组得大小 for(int i= ...
- 【网络】博客网站搭建之Typecho(命令版)
目录 前言 个人博客系统筛选 内网穿透 安装nginx 安装PHP 安装mysql Typecho 环境安装 参考 安装typecho Nginx与PHP进行连接配置&指定博客路径 验证 配置 ...
- zephyr的GPIOTE驱动开发记录——基于nordic的NCS
简介: 本次测试了zephyr的中断驱动方式(GPIOTE),在这可以去看zephyr的官方文档对zephyr的中断定义,连接如下,Interrupts - Zephyr Project Docume ...
- 2022春每日一题:Day 33
题目:[USACO 6.1.3] Cow XOR 没找到这题具体网址,这个题就是求最大异或区间(总长度尽量小,右端点尽量大) 嗯很显然一个[l,r]的异或和=s[r]s[l-1],那么现在有了优秀的n ...
- 基于Spring-AOP的自定义分片工具
作者:陈昌浩 1 背景 随着数据量的增长,发现系统在与其他系统交互时,批量接口会出现超时现象,发现原批量接口在实现时,没有做分片处理,当数据过大时或超过其他系统阈值时,就会出现错误.由于与其他系统交互 ...
- c++题目:数迷
c++题目:数迷 题目 [题目描述] 给出含有N×N个格子的正方形表格,要求每个格子都填上一个个位数(范围1-N),使得每行.每列以及同一斜线上的数字都不同.部分格子已经填好数字.求满足题意的方案数. ...
- day31 1 tomcat介绍与创建web项目 & 2 继承HttpServlet类、配置webxml全局配置文件 & 3 servlet生命周期 & 4 请求对象HttpServletRequest与响应对象HttpServletResponse
Servlet Java Servlet是运行在Web服务器或应用服务器上的程序,作为客户端(Web浏览器或其他HTTP客户端)和服务端(HTTP服务器上的数据库或应用程序)之间的中间层. 使用Ser ...
- day09 常用工具类&包装类&集合——List、Set
day09 常用工具类 java.lang.Math数值运算 基本数值运算,如初等函数.对数.平方根和三角函数 //最大最小值 Math.max(12, 21); Math.min(2, 3); // ...
- 《MySQL必知必会》知识汇总一
一.使用MYSQL 展示所有数据库 show databases; 选择数据库 use crashcourse; 展示该数据库中所有的表 show tables; 还可以展示表列的shema约束 sh ...
- Burp Suite
Burp Suite proxy代理 1.首先在浏览器中设置代理配置 火狐浏览器先点击右上角三个杠--选项--常规--网络设置 2.打开Burp Suite进行抓包 Proxy代理--options中 ...