文章目录

  • 一、流程操作
    • 1 流程定义
      • 1.2 概述
      • 1.3 bpmn文件
      • 1.4 生成.png图片文件
        • 1.4.1 修改文件后缀为xml
        • 1.4.2 使用designer设计器打开.xml文件
        • 1.4.3 查看打开的文件
        • 1.4.4 解决中文乱码
        • 1.4.5 导出为图片文件
    • 2 流程定义部署
      • 2.1 概述
      • 2.2 单个文件部署方式
      • 2.3 压缩包部署方式
      • 2.4 操作数据表
    • 3 启动流程实例
    • 4 任务查询
    • 5 流程任务处理
    • 6 流程定义信息查询
    • 7 流程删除
    • .8 流程资源下载
    • 9 流程历史信息的查看

以下内容均为黑马课程的学习笔记
视频链接: https://www.bilibili.com/video/BV1H54y167gf?p=106&spm_id_from=333.337.top_right_bar_window_history.content.click

一、流程操作

1 流程定义

1.2 概述

流程定义是线下按照bpmn2.0标准去描述 业务流程,通常使用idea中的插件对业务流程进行建模。

使用idea下的designer设计器绘制流程,并会生成两个文件:.bpmn和.png

1.3 bpmn文件

使用activiti-desinger设计业务流程,会生成.bpmn文件,上面我们已经创建好了bpmn文件

BPMN 2.0根节点是definitions节点。 这个元素中,可以定义多个流程定义(不过我们建议每个文件只包含一个流程定义, 可以简化开发过程中的维护难度)。 注意,definitions元素 最少也要包含xmlns 和 targetNamespace的声明。 targetNamespace可以是任意值,它用来对流程实例进行分类。

流程定义部分:定义了流程每个结点的描述及结点之间的流程流转。

流程布局定义:定义流程每个结点在流程图上的位置坐标等信息。

1.4 生成.png图片文件

IDEA工具中的操作方式

1.4.1 修改文件后缀为xml

首先将evection.bpmn文件改名为evection.xml,如下图:

evection.xml修改前的bpmn文件,效果如下:

1.4.2 使用designer设计器打开.xml文件

在evection.xml文件上面,点右键并选择Diagrams菜单,再选择Show BPMN2.0 Designer…

1.4.3 查看打开的文件

打开后,却出现乱码,如图:

1.4.4 解决中文乱码

1、打开Settings,找到File Encodings,把encoding的选项都选择UTF-8

2、打开IDEA安装路径,找到如下的安装目录

根据自己所安装的版本来决定,我使用的是64位的idea,所以在idea64.exe.vmoptions文件的最后一行追加一条命令: -Dfile.encoding=UTF-8

如下所示:

一定注意,不要有空格,否则重启IDEA时会打不开,然后 重启IDEA。

如果以上方法已经做完,还出现乱码,就再修改一个文件,并在文件的末尾添加: -Dfile.encoding=UTF-8,然后重启idea,如图:

最后重新在evection.xml文件上面,点右键并选择Diagrams菜单,再选择Show BPMN2.0 Designer…,看到生成图片,如图:

到此,解决乱码问题

1.4.5 导出为图片文件

点击Export To File的小图标,打开如下窗口,注意填写文件名及扩展名,选择好保存图片的位置:

然后,我们把png文件拷贝到resources下的bpmn目录,并且把evection.xml改名为evection.bpmn。

2 流程定义部署

2.1 概述

将上面在设计器中定义的流程部署到activiti数据库中,就是流程定义部署。

通过调用activiti的api将流程定义的bpmn和png两个文件一个一个添加部署到activiti中,也可以将两个文件打成zip包进行部署。

2.2 单个文件部署方式

分别将bpmn文件和png图片文件部署。

package com.itheima.test;import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;public class ActivitiDemo {/*** 部署流程定义*/@Testpublic void testDeployment(){//        1、创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、得到RepositoryService实例RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用RepositoryService进行部署Deployment deployment = repositoryService.createDeployment().addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源.addClasspathResource("bpmn/evection.png")  // 添加png资源.name("出差申请流程").deploy();
//        4、输出部署信息System.out.println("流程部署id:" + deployment.getId());System.out.println("流程部署名称:" + deployment.getName());}
}

执行此操作后activiti会将上边代码中指定的bpm文件和图片文件保存在activiti数据库。

2.3 压缩包部署方式

将evection.bpmn和evection.png压缩成zip包。

@Testpublic void deployProcessByZip() {// 定义zip输入流InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip");ZipInputStream zipInputStream = new ZipInputStream(inputStream);// 获取repositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();// 流程部署Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();System.out.println("流程部署id:" + deployment.getId());System.out.println("流程部署名称:" + deployment.getName());}

执行此操作后activiti会将上边代码中指定的bpm文件和图片文件保存在activiti数据库。

2.4 操作数据表

流程定义部署后操作activiti的3张表如下:

act_re_deployment 流程定义部署表,每部署一次增加一条记录

act_re_procdef 流程定义表,部署每个新的流程定义都会在这张表中增加一条记录

act_ge_bytearray 流程资源表

接下来我们来看看,写入了什么数据:

SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息

结果:

SELECT * FROM act_re_procdef #流程定义表,记录流程定义信息

结果:

注意,KEY 这个字段是用来唯一识别不同流程的关键字

SELECT * FROM act_ge_bytearray #资源表

结果:

注意:

act_re_deployment和act_re_procdef一对多关系,一次部署在流程部署表生成一条记录,但一次部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在act_ge_bytearray会存在两个资源记录,bpmn和png。

建议:一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定义信息。

3 启动流程实例

流程定义部署在activiti后就可以通过工作流管理业务流程了,也就是说上边部署的出差申请流程可以使用了。

针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于java类与java对象的关系,类定义好后需要new创建一个对象使用,当然可以new多个对象。对于请出差申请流程,张三发起一个出差申请单需要启动一个流程实例,出差申请单发起一个出差单也需要启动一个流程实例。

代码如下:

    /*** 启动流程实例*/@Testpublic void testStartProcess(){//        1、创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RunTimeServiceRuntimeService runtimeService = processEngine.getRuntimeService();
//        3、根据流程定义Id启动流程ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myEvection");
//        输出内容System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());System.out.println("流程实例id:" + processInstance.getId());System.out.println("当前活动Id:" + processInstance.getActivityId());}

输出内容如下:

操作数据表

act_hi_actinst 流程实例执行历史

act_hi_identitylink 流程的参与用户历史信息

act_hi_procinst 流程实例历史信息

act_hi_taskinst 流程任务历史信息

act_ru_execution 流程执行信息

act_ru_identitylink 流程的参与用户信息

act_ru_task 任务信息

4 任务查询

流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。

/*** 查询当前个人待执行的任务*/@Testpublic void testFindPersonalTaskList() {//        任务负责人String assignee = "zhangsan";ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        创建TaskServiceTaskService taskService = processEngine.getTaskService();
//        根据流程key 和 任务负责人 查询任务List<Task> list = taskService.createTaskQuery().processDefinitionKey("myEvection") //流程Key.taskAssignee(assignee)//只查询该任务负责人的任务.list();for (Task task : list) {System.out.println("流程实例id:" + task.getProcessInstanceId());System.out.println("任务id:" + task.getId());System.out.println("任务负责人:" + task.getAssignee());System.out.println("任务名称:" + task.getName());}}

输出结果如下:

流程实例id:2501
任务id:2505
任务负责人:zhangsan
任务名称:创建出差申请

5 流程任务处理

任务负责人查询待办任务,选择任务进行处理,完成任务。

// 完成任务@Testpublic void completTask(){//        获取引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskServiceTaskService taskService = processEngine.getTaskService();//        根据流程key 和 任务的负责人 查询任务
//        返回一个任务对象Task task = taskService.createTaskQuery().processDefinitionKey("myEvection") //流程Key.taskAssignee("zhangsan")  //要查询的负责人.singleResult();//        完成任务,参数:任务idtaskService.complete(task.getId());}

6 流程定义信息查询

查询流程相关信息,包含流程定义,流程部署,流程定义版本

    /*** 查询流程定义*/@Testpublic void queryProcessDefinition(){//        获取引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        repositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();
//        得到ProcessDefinitionQuery 对象ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//          查询出当前所有的流程定义
//          条件:processDefinitionKey =evection
//          orderByProcessDefinitionVersion 按照版本排序
//        desc倒叙
//        list 返回集合List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection").orderByProcessDefinitionVersion().desc().list();
//      输出流程定义信息for (ProcessDefinition processDefinition : definitionList) {System.out.println("流程定义 id="+processDefinition.getId());System.out.println("流程定义 name="+processDefinition.getName());System.out.println("流程定义 key="+processDefinition.getKey());System.out.println("流程定义 Version="+processDefinition.getVersion());System.out.println("流程部署ID ="+processDefinition.getDeploymentId());}}

输出结果:

流程定义id:myEvection:1:4
流程定义名称:出差申请单
流程定义key:myEvection
流程定义版本:1

7 流程删除

public void deleteDeployment() {// 流程部署idString deploymentId = "1";ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 通过流程引擎获取repositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();//删除流程定义,如果该流程定义已有流程实例启动则删除时出错repositoryService.deleteDeployment(deploymentId);//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程//repositoryService.deleteDeployment(deploymentId, true);}

说明:

  1.   使用repositoryService删除流程定义,历史表信息不会被删除
    
  2.   如果该流程定义下没有正在运行的流程,则可以用普通删除。
    

如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关记录全部删除。

先删除没有完成流程节点,最后就可以完全删除流程定义信息

项目开发中级联删除操作一般只开放给超级管理员使用.

.8 流程资源下载

现在我们的流程资源文件已经上传到数据库了,如果其他用户想要查看这些资源文件,可以从数据库中把资源文件下载到本地。

解决方案有:

1、jdbc对blob类型,clob类型数据读取出来,保存到文件目录

2、使用activiti的api来实现

使用commons-io.jar 解决IO的操作

引入commons-io依赖包

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>

通过流程定义对象获取流程定义资源,获取bpmn和png

import org.apache.commons.io.IOUtils;@Testpublic void deleteDeployment(){//        获取引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取repositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();
//        根据部署id 删除部署信息,如果想要级联删除,可以添加第二个参数,truerepositoryService.deleteDeployment("1");}public void  queryBpmnFile() throws IOException {//        1、得到引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取repositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();
//        3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myEvection").singleResult();
//        4、通过流程定义信息,得到部署IDString deploymentId = processDefinition.getDeploymentId();
//        5、通过repositoryService的方法,实现读取图片信息和bpmn信息
//        png图片的流InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//        bpmn文件的流InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//        6、构造OutputStream流File file_png = new File("d:/evectionflow01.png");File file_bpmn = new File("d:/evectionflow01.bpmn");FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);FileOutputStream pngOut = new FileOutputStream(file_png);
//        7、输入流,输出流的转换IOUtils.copy(pngInput,pngOut);IOUtils.copy(bpmnInput,bpmnOut);
//        8、关闭流pngOut.close();bpmnOut.close();pngInput.close();bpmnInput.close();}

说明:

  1.   deploymentId为流程部署ID
    
  2.   resource_name为act_ge_bytearray表中NAME_列的值
    
  3.   使用repositoryService的getDeploymentResourceNames方法可以获取指定部署下得所有文件的名称
    
  4.   使用repositoryService的getResourceAsStream方法传入部署ID和资源图片名称可以获取部署下指定名称文件的输入流
    

最后的将输入流中的图片资源进行输出。

9 流程历史信息的查看

即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在activiti的act_hi_*相关的表中。所以我们还是可以查询流程执行的历史信息,可以通过HistoryService来查看相关的历史记录。

    /*** 查看历史信息*/@Testpublic void findHistoryInfo(){//      获取引擎ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取HistoryServiceHistoryService historyService = processEngine.getHistoryService();
//        获取 actinst表的查询对象HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//        查询 actinst表,条件:根据 InstanceId 查询
//        instanceQuery.processInstanceId("2501");
//        查询 actinst表,条件:根据 DefinitionId 查询instanceQuery.processDefinitionId("myEvection:1:4");
//        增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//        查询所有内容List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
//        输出for (HistoricActivityInstance hi : activityInstanceList) {System.out.println(hi.getActivityId());System.out.println(hi.getActivityName());System.out.println(hi.getProcessDefinitionId());System.out.println(hi.getProcessInstanceId());System.out.println("<==========================>");}}

Activiti流程操作相关推荐

  1. 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d的扩展(一)

     题外话: 最近在忙公司的云项目空闲时间不是很多,所以很久没来更新,今天补上一篇! 回顾: 前几篇介绍了一下设计器的界面和Draw2d基础知识,这篇讲解一下本设计器如何扩展Draw2d. 进入主题 ...

  2. 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d的扩展(三)

    题外话: 最近在忙公司的云项目空闲时间不是很多,所以很久没来更新,今天补上一篇! 回顾: 前几篇介绍了一下设计器的界面和Draw2d基础知识,这篇讲解一下本设计器如何扩展Draw2d. 进入主题: 先 ...

  3. Activiti 流程部署方式 activi 动态部署(高级源码篇)

    Activiti 流程部署方式 activi 动态部署 目录 概 述 第一种方法: 设计流程引擎: 相关工具如下: 分析: 小结: 参考资料和推荐阅读 LD is tigger forever,CG ...

  4. 【activiti】activiti流程引擎配置类

    activiti流程引擎配置类 1.流程引擎配置类 流程引擎的配置类:ProcessEngineConfiguration,通过ProcessEngineConfiguration可以创建工作流引擎P ...

  5. Activiti——流程变量(六)

    Activiti--流程变量 转自:http://lib.csdn.net/article/java/66665?knId=268 流程变量在整个工作流中扮演很重要的作用.例如:请假流程中有请假天数. ...

  6. 一次完整的Loadrunner基本流程操作

    Loadrunner基本流程操作 准备条件: 一.安装loadrunner 二.破解loadrunner (注:本次使用lr11版本可以兼容的IE浏览器版本为IE6–IE8:所以不要让IE进行更新) ...

  7. Spring中部署Activiti流程定义的三种姿势

    摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍. 本文分享自华为云社区<项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势>,作者:攻 ...

  8. 工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46646565 ***************************************** ...

  9. Flowable工作流之核心流程操作的本质

    目录 1. 前言 2. 捋清三个概念 2.1. 流程定义 2.2. 流程实例 2.3. 执行实例 3. 流程启动方式 4. `Flowable` 完整流程操作 4.1. 流程部署 4.1.1. 部署实 ...

最新文章

  1. python跟易语言那个写辅助_易语言写练练看辅助
  2. nRF905 - 系列示意图
  3. tnsnames.ora无法保存的问题
  4. 人民日报“权威认证”吃鸡装备哪家强,不服来辩!
  5. Ehab and another construction problem(水题)
  6. UBUNtu·E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法
  7. 想捧金饭碗? 修炼这25项技能就够了!
  8. 微软武汉.NET俱乐部八月活动
  9. 人工神经网络算法原理和应用
  10. python seek_Python 文件操作seek()函数
  11. 推荐系统系列教程之十五:一网打尽协同过滤、矩阵分解和线性模型
  12. 恒生Pb系统与讯投PB系统、PTrade交易系统比较
  13. 《Java就业培训教程》_张孝祥_书内源码_08
  14. 手把手教你快速构建自定义分类器
  15. [Hello World教程] 使用HBuilder和Uni-app 生成一个简单的微信小程序DEMO
  16. java svg等值线_带有颜色填充的等值线画法研究
  17. HDU 4699 Editor (对顶栈)
  18. edi许可证和ICP区别
  19. Echarts使用二:全国地图与各省市地图联动
  20. 分享99个中国风ppt,总有一款适合你

热门文章

  1. STL库中的优先队列
  2. View UI Plus (iview)表格单选实现教程
  3. VC++ OLE DB 读写数据库
  4. LeetCode 391. 完美矩形(扫描线) / 318. 最大单词长度乘积 / 563. 二叉树的坡度
  5. python中怎么调整代码字体格式,pythondocx如何在文本和制表符之间分别更改字体大小...
  6. Pixhawk精准着陆之IRLock配置
  7. SQLServer DAC连接
  8. error LNK2005: _DllMain@12 already defined in xxx 的应对
  9. 2021年5月程序员工资统计,平均14926元。996程序员被当成外国人
  10. 如何编辑出一篇漂亮的微信公众号文章