OA工作流-Activiti(二)
一、管理流定义
1.1设计文档
1.1.1流程图
1.1.2 bpmn文件解析
其中:1,bpmn中的代码是为了给计算机观看的
2,流程图中的jpg文件是为了开发者看的
1.2.部署流程定义--class路径加载
框架流程说明:
1,获取流程引擎对象,创建时会自动加载classpath下的activiti.cfg.xml
2,获取取一个RepositoryService对象(仓库对象),再产生一个配置对象
用来封装部署操作的相关配置。
3,在部署配置对象中设置显示名,上传流程定义规则文件,向数据库表中存放流程定义的规则信息。
4,在这一步进行操作时,操作了三张表
a) act_re_deployment(部署对象表)
存放流程定义的显示名和部署时间,每部署一次增加一条记录
b) act_re_procdef(流程定义表)
存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
注意:当流程定义的key相同的情况下,使用的是版本升级
c) act_ge_bytearray(资源文件表)
此表每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的
1.2.部署流程定义--zip格式文件
说明:将bpmn和png信息压缩一下,放在自己的resource中
1.3查询流程定义
查询的时候,先创建流程定义查询,在框架每步封装了很多的方法供应我们使用。
在封装的这些方法里面,
A. 我们可以进行制定条件查询。(类似于where条件)
processDefinitionId(processDefinitionId)//使用流程定义ID查询
processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
B. 我们可以进行升降序查询。
orderByProcessDefinitionVersion().asc()//按照版本的升序排列
orderByProcessDefinitionName().desc()//按照流程定义的名称降序排列
C.在返回的结果集上(返回指定结果集)--List、对象、数量、分页
list();//返回一个集合列表,封装流程定义
测试结果如下图:
1.4查询流程定义
删除流程定义须知:
A. 首先获得默认的流程引擎,通过流程引擎获取了一个RepositoryService对象(仓库对象)
B.如果该流程定义下没有正在运行的流程,则可以用
普通删除(deleteDeployment(deploymentId))。
如果是有关联的信息,用级联删除(deleteDeployment(deploymentId, true))。
项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用
1.5查询流程定义图--将图片复制到指定文件夹再进行查询
查询流程定义须知:
A. repositoryService的getDeploymentResourceNames查询所有部署文件的名称=
B. repositoryService的getResourceAsStream 两个参数(部署ID、资源图片名称 )
C. FileUtils工具的copyInputStreamToFile方法完成流程流程到文件的拷贝,将资源文件以流的形式输出到指定文件夹下
1.6查询最新版本流程定义:(相当于Update)
思路:
注意:因为Map集合可以在存放值的时候,后面的值将前面的值覆盖掉。
创建流程定义---》使用升序排列仅从排列---》将他遍历后放在Map集合中(map的key存放流程定义的key,map的value存放流程定义的对象)---》用list集合取出map的value--》遍历获取最新版本。
结果:
1.7删除所有Key值相同的流程定义
执行完毕:
数据库里面所有和HelloWorld相同Key的数据都被删除。(因为数据库里面本来就只有HelloWorld的Key值的数据)
二、流程实例、流程对象--执行任务
2.1流程图--形同
2.2部署流程定义--同上(zip)
2.3启动流程定义
2.3.1解释一下流程实例和流程对象:
流程对象:流程实例执行一次
一个流程实例可以有多个流程对象。如图所示:
一个流程中流程实例两个执行对象
2.4查询当前用户的个人任务
在查询部分,根据条件查询:
a.taskAssignee(assignee)//指定个人任务查询,指定办理人b.taskCandidateUser(candidateUser)//组任务的办理人查询
c.processDefinitionId(processDefinitionId)//使用流程定义ID查询
.......
排序部分:orderByTaskCreateTime().asc()//使用创建时间的升序排列
......
返回的结果集部分
singleResult()//返回惟一结果集
count()//返回结果集的数量
list();//返回列表
就2.3而言,启动程序后只有张三可以看到,仅仅执行“张三”便可以查到信息
查询其他人则无法看到当前信息。
2.5任务处理
分别执行,在五张表里面查看相应的变化。
2.6查询流程状态
判断依据:通过流程任务表,不为空则任务依旧在,为空则任务结束
2.7查询历史任务和流程实例
三、流程变量
3.1 流程图
3.2 流程变量定义:
流程变量:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。
流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)
变量的实际问题:
3.3部署启动(启动不再演示)
3.3.1InputStream进行部署
3.3.2读取工程文件的三种方式:
3.4设置流程变量
3.4.1设置流程变量
3.4.2获取流程变量
注意:设置流程变量==设置流程变量(方法的使用)
a. runtimeService.setVariable(executionId, variableName, value)//表示使用执行对象ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
b. runtimeService.setVariables(executionId, variables)//表示使用执行对象ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
c. taskService.setVariable(taskId, variableName, value)//表示使用任务ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)
d. taskService.setVariables(taskId, variables)//表示使用任务ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)
e. runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用Map集合
f. taskService.complete(taskId, variables)//完成任务的同时,设置流程变量,用Map集合
结果:
3.4.3设置流程变量(采用JavaBean方式)
--固定序列化ID值
当一个javabean(实现序列号)放置到流程变量中,要求javabean的属性不能再发生变化,如果发生变化,再获取的时候,抛出异常,固定ID值则不变
设置流程变量:
获取流程变量:
3.5查询历史流量表
1,创建查询历史的Service
2,根据name值查询
四、查询历史
4.1 act_hi_procinst流程实例表
4.2 查询历史活动
4.3查询历史任务
4.4 查询历史流程变量
欢迎订阅关注公众号(JAVA和人工智能)
获取更多免费书籍、资源、视频资料