Activiti7报表引擎入门版权声明
原创Activiti7 工作流引擎入门
做课目的
1.适用人群: 普通人
不是每个人都能进入互联网工厂 BATJ
普通人、省会城市、软件公司、银行、政府都是如此。
2.适用项目:OA CRM ERP 系统
差旅报销流程和休假流程
3.课程特点:说人
快速启动工作流
(salvio修订版)欢迎支持
第一章 工作流相关术语
1.工作流简介
工作流(Workflow),是通过计算机管理业务流程自动化。它涉及“根据一些预定义的规则在多个参与者之间自动交付文档、信息或任务的过程,以实现期望的业务目标,或为实现该目标做出贡献”。
企业OA:
请假----“Intranet系统----“小李填写申请表7天----“团队领导同意----》CTO同意------人事部长同意。-----》结束
专业公司会这样做。OA CRM ERP: 金蝶、用友
2.工作流系统
软件系统具有工作流功能。我们称之为工作流系统。工作流在系统中的功能是什么?它是为了使系统的业务流程的管理自动化,因此工作流是基于业务流程的,因此软件系统的核心基本上是系统的业务过程,而工作流仅协助管理业务流程。即使没有工作流,业务系统也可以开发和运行,但有了工作流可以更好地管理业务流程,提高系统的可扩展性。
1、 适用行业
消费品行业、制造业、电信服务业、银行、证券和保险等金融服务业、物流服务业、物业服务业、财产管理、大中型进出口贸易公司、政府机构、研究机构和教育服务业等。,特别是大型跨国企业和集团公司。
2、 具体应用
- 关键业务流程:订单、报价处理、合同审查、客户呼叫处理、供应链管理等。
- 行政管理类:差旅申请、加班申请、请假申请、汽车申请、各种办公用品申请、采购申请、每日周报等原本人工转移的行政表格。
- 人事管理:员工培训安排、绩效考核、岗位变更处理、员工档案信息管理等。kpi
- 财务相关类别:付款申请、应收款项处理、日常报销处理、差旅报销、预算和计划申请等。
- 客户服务:客户信息管理、客户投诉、请求处理、售后服务管理等。
- 特殊服务类别:ISO 系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等任务通过表单分步手工流程完成,可应用于工作流软件中自动、标准化实施。
三、 工作流实施
注:介绍信。 档案管理部,信息管理,上级专业:图片和信息档案
在出现特殊的工作流引擎之前,为了实现过程控制,通常使用状态字段的值来跟踪过程中的更改。通过这种方式,不使用角色的用户可以确定记录是否由状态字段的值显示。
对于具有查看权限的记录,当前用户根据其角色确定审批是否合格。如果合格,则在状态字段中设置一个值以表示合格;当然,如果不合格,请设置一个值来表示不合格。
缺点 :
这是最原始的方式。虽然过程控制是通过状态字段实现的,但当我们的过程发生变化时,以这种方式编写的代码也需要进行调整。
想看历史发展的记录,怎么办?
那么,是否有一种专业的方法来实施工作流管理?在业务流程发生变化后,我们的程序可以不加更改地进行更改。如果能够达到这种效果,那么我们业务系统的适应性将大大提高。
四、 工作流实现原理分析
在业务流程更改后,我们的业务系统代码不能更改,我们如何做到这一点?此时,我们将分析原理。
具体分析过程如下图所示:
文字版
第二章 Activiti7 概述
一、Activiti 介绍
Alfresco 软件在 2010 年 5 月 17 日宣布 Activiti 业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任,Tom Baeyens 就是原来 jbpm 建筑师,以及 jbpm 当然是一个非常著名的工作流引擎 activiti 它也是一个工作流引擎。
Activiti 是工作流引擎, activiti 可以使用专门的建模语言提取业务系统中的复杂业务流程(BPMN2.0)根据预定义的流程执行业务系统,业务系统的业务流程由 activiti 管理,减少业务系统因流程变化而产生的工作量,从而升级系统,从而提高系统的鲁棒性,同时也降低了系统开发和维护的成本。
经验丰富的版本 5.X 6.X 不再维护。
当前最新版本:Activiti7.3.0
多个工作流引擎的比较
1. Activiti
Alfresco软件开发,基于JBPM4,后并入OMG当前最高版本。activiti 7。Activiti5在版本发布时,核心团队发生了相对较大的变化(辞职),activiti6开发团队在新版本中删除了。PVM,纳入了DMN,重构XML解析,BUG更多,目前主要团队致力于activiti7。 5&6官员们已经宣布,他们不会维持这一计划。
2. Flowable
基于activiti6最新的开源版本是flowable6,开发团队来自activiti分开,修理人群activiti6的bug并在此基础上发展DMN支持,BPEL支持等等。与开源版本相比,其商业版本将更加强大。
3. Camunda
基于activiti5,因此其保留PVM,最新版本Camunda7开发团队也来自activiti拆分、发展轨迹和flowable同样,也有商业版。
4. JFlow
前身ccFlow,国内工作流引擎由济南盖洛普公司开发和维护。它专注于中国式的业务流程。因为是国产软件,中国文化比较深厚,业务开发也比较人性化。国内仍有许多开源工作流引擎,JFlow这是比较完美的功能之一activiti,该流程更为中文,支持自定义流程跳转、签名等。其他国内工作流未列出。
1、 BPM**
BPM(Business Process Management)即业务流程管理,是以标准化建设的端到端业务流程卓越为中心,以不断提高组织的业务绩效为目的的系统化方法、通用的业务管理教育等。 EMBA、MBA等均将 BPM 包括。
企业流程管理主要是企业内部的改革,改变企业职能管理组织重叠、中间层级、流程不闭环,使组织不重叠、业务不重复,以缩短流程周期、节约运营资金、提高企业效率的作用。
以下两种人员加薪流程相比,哪一种更有效?
流程一:
流程二:
第二种情况更有效:3部门经理可以在天内处理休假。不要打扰总经理。
2、 BPM 软件
BPM 软件是一种业务方法和解决方案,可根据企业业务环境的变化,促进人员之间、人员与系统之间以及系统之间的集成和调整。 IT 工具。 通常以 Internet 该方法实现了信息传输、数据同步、业务监控和企业业务流程的持续升级和优化,从而实现跨应用、跨部门、跨合作伙伴和跨客户的企业运营。通过 BPM 该软件对企业内外业务流程的整个生命周期进行建模、自动化、管理、监控和优化,从而降低成本并显著提高利润。
BPM 软件在企业中广泛使用,无论在哪里都有业务流程。 BPM 软件管理,如企业人事办公室管理、采购流程管理、文件审批流程管理、财务管理。
3、 BPMN
BPMN(Business Process Model And Notation)- 业务流程模型和符号 是由 BPMI(Business Process Management Initiative)使用 BPMN 提供的符号可以创建业务流程。 2004 年 5 月发布了 BPMN1.0 规范.BPMI 于 2005 年 9 月并入 OMG(The Object Management Group 对象管理组织)组织。OMG 于 2011 年 1 月发布 BPMN2.0 最终版本。
具体发展历史如下
BPMN 目前正在 BPM 制造商广泛接受 BPM 标准。Activiti 就是使用 BPMN 2.0 流程建模、流程执行管理,包括许多建模符号,例如:
Event 它由一个圆圈表示,这是流程运行过程中发生的情况。
一个 bpmn 图形示例:
- 填写申请表
- 部门经理审查
- 总经理审查
最后,离开过程结束。
二、Activit 如何使用
大系统:电子商务、社交。在父模块下,微服务小模块具有 activiti 模块,特别是管工作流。
1、 部署 activiti
Activiti 是一个工作流引擎(事实上,是一堆 jar 包 API),业务系统使用情况 activiti 自动化系统业务流程的管理,以便于访问业务系统。(操作)activiti 接口或功能 activiti 环境与业务系统的环境相集成。
2、 流程定义
使用 activiti 流程建模工具(activity-designer)定义业务流程(.bpmn 文件) 。
.bpmn 文件是业务流程定义文件,通过 xml 定义业务流程。
如果您使用其他公司开发的工作引擎,通常会提供可视化建模工具。(Process Designer)用于生成流程定义文件,建模工具操作直观,一般支持图形拖放模式、多窗口用户界面、丰富的流程图形元素、流程元素复制、粘贴、删除等功能。智慧播客关注 Java、.Net 和 Php,网络图形设计工程师培训
3、 流程定义部署
向 activiti 部署业务流程定义(.bpmn 文件)。
使用 activiti 提供的 api 向 activiti 中部署.bpmn 文件
4,启动进程实例(ProcessInstance)
启动流程实例意味着启动业务流程。例如,员工休假流程的部署已完成。如果张三想请假,他可以启动流程实例。如果李思想请假,他也可以启动流程实例。两个过程的执行不会相互影响,就像定义一个过程一样 java 类,实例化两个对象是相同的,部署过程如下 java 类,启动流程实例的方式如下 new 一个 java 对象。
5,用户查询待办任务(Task)
因为现在系统的业务流程已经移交。 activiti 管理,通过 activiti 您可以查询当前流程的执行位置以及当前用户需要处理的任务。这些 activiti帮助我们管理,而不是需要我们在场 sql语句中的where条件指定当前查询的状态值。
6、 用户任务
用户查询待办任务后,就可以办理某个任务,如果这个任务办理完成还需要其它用户办理,比如采购单创建后由部门经理审查,这个过程也是由 activiti 帮助我们完成,不需要我们在代码中硬编码来指定下一个任务句柄。
7、 流程结束
当一项任务完成而没有下一项任务时/节点,此流程实例已完成。
第三章 搭建环境
1.项目环境
父工程 ydl-oa
子模块 ydl-common ydl-bussiness
子模块 activiti-demo
2.发展环境
1、 Java 环境
Jdk1.8 或更高版本
2、 数据库
Mysql 5 及以上版本
本教程使用 8 版本
3、 Web 容器
此项目使用 Tomcat8.5
4、 开发工具
Mysql 客户端连接工具,navicat或其它
文本编辑器 EditPlus 或其它
Java 开发工具:IDEA
三、Activiti 环境
1、 下载 activiti7
Activiti 下载地址:https://activiti.gitbook.io/activiti-7-developers-guide/releases/7.4.0
org.activiti
activiti-dependencies
7.4.0
import
pom
(1)Database :
activiti 操作需要数据库支持。支持的数据库包括:h2, mysql, oracle, postgres, mssql, db2等等,存储目录 activiti 表构建脚本。
(2) Docs
Activiti 帮助文档。
(3) Wars
官方独立样本项目
2、 流程设计器 插件安装
(1)简介
Activiti插件actiBPM在新版的idea 2020中不再支持它,此处提供了一种替代方案。Activiti BPMN visualizer。
(2)安装(设置-插件-搜索 bpmn)
或者在idea插件官方网站:https://plugins.jetbrains.com/
3、 Activiti 支持的数据库
Activiti 的操作需要数据库支持和安装。 activiti 数据库支持以下版本:
- h2:1.3.168
- mysql :5.1.21
- oracle:11.2.0.1.0
- postgres:8.1
- db2:DB2 10.1 using db2jcc4
- mssql:2008 using sqljdbc4
4、创建mysql 数据库
本教程使用 mysql 数据库。
创建 mysql 数据库 activiti(任意名称):
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;
5,表创建方法
通过运行 java 程序创建表格。
(1) 创建 java 工程
使用 idea 创建 maven 的 java 工程。
(2) 加入 maven 从属坐标(jar 包)
首先,你需要 java 加入项目 ProcessEngine 所需要的 jar 套餐,包括:智慧播客聚焦 Java、.Net 和 Php,网络图形设计工程师培训
- activiti-engine-7.0.0.beta1.jar
- activiti 依赖的 jar 包:mybatis、alf4j、log4j 等
- activiti 依赖的 spring 包
- 数据库驱动程序
- 第三方数据连接池 dbcp
- 单元测试 Junit-4.12.jar
我们使用 maven 为了实现项目的构建,应该导入这些。 jar 相应的坐标 pom.xml 文件中。
8
8
1.6.6
1.2.12
7.4.0
7.4.0
8.0.20
1.8
1.6.6
1.2.12
3.4.5
4.12
2.6
1.4
org.activiti
activiti-engine
${activiti.version}
org.activiti
activiti-spring
${activiti.version}
org.activiti
activiti-bpmn-model
${activiti.version}
org.activiti
activiti-bpmn-converter
${activiti.version}
org.activiti
activiti-json-converter
${activiti.version}
org.activiti
activiti-bpmn-layout
${activiti.version}
mysql
mysql-connector-java
${mysql.version}
org.mybatis
mybatis
${mybatis.version}
commons-dbcp
commons-dbcp
${dbcp.version}
commons-io
commons-io
${commonsio.version}
junit
junit
${junit.version}
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
(3) log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=f:actactiviti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m
(4) activiti.cfg.xml
在 classpath 下创建 activiti.cgf.xml 文件:
关于 processEngineConfiguration 中的 databaseSchemaUpdate 参数,通过此参数设计 activiti数据表的处理策略。参数如下:
false(默认):检查数据库表的版本和从属库的版本, 如果版本不匹配,则引发异常。
true: 构建流程引擎时,将执行检查,并在必要时执行更新。 如果表不存在,则创建该表。
create-drop: 当构建过程引擎时创建数据库表, 在流程引擎关闭时删除这些表。
drop-create:在创建表之前删除表。
create: 当构建过程引擎时创建数据库表, 当流程引擎关闭时,这些表不会被删除。
(5) 编写程序
创建 ProcessEngineConfiguration,通过 ProcessEngineConfiguration 创建 ProcessEngine,在创建ProcessEngine 数据库将自动创建。
//创建ProcessEngineConfiguration
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
//通过ProcessEngineConfiguration创建ProcessEngine数据库已创建
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
说明:
1运行上述程序段以完成 activiti 数据库创建,通过更改 activiti.cfg.xml 中 databaseSchemaUpdate 参数实现不同的数据表处理策略。
2、 上 边 的 方法 createProcessEngineConfigurationFromResource 执行时activiti.cfg.xml 在中查找固定名称 processEngineConfiguration 您还可以使用重载方法调用,这是不限定的。 processEngineConfiguration 名称
注意问题:
1、 jdk版本号 55 52
场景:使用18jdk
2、
方案:nullCatalogMeansCurrent=true
此时,我们查看数据库并创建 25 表,结果如下:
(6) 数据库表的命名规则
官方网站地址:https://www.activiti.org/userguide/#creatingDatabaseTable
a,表前缀说明
- act_ge_ 通用数据表,ge是general的缩写
- act_hi_ 历史数据表,hi是history对应的缩写 HistoryService 接口
- act_id_ 身份数据表,id是identity对应的缩写 IdentityService 接口
- act_re_ 过程存储表,re是repository对应的缩写 RepositoryService 用于存储静态数据(如流程部署和流程定义)的接口
- act_ru_ 运行时数据表,ru是runtime对应的缩写 RuntimeService 接口和 TaskService 接口,它存储动态数据,如流程实例和用户任务。
b、Activiti 数据表列表:
表分类
表名
备注说明
一般数据
ACT_GE_BYTEARRAY
定义的流程bpmn和png文件
ACT_GE_PROPERTY
系统相关属性
过程历史记录
ACT_HI_ACTINST
历史流程实例
ACT_HI_ATTACHMENT
历史流程附件
ACT_HI_COMMENT
历史解释信息
ACT_HI_DETAIL
历史流程操作的详细信息
ACT_HI_IDENTITYLINK
流程操作期间用户关系的历史记录
ACT_HI_PROCINST
历史流程实例
ACT_HI_TASKINST
历史任务示例
ACT_HI_VARINST
历史流程实例变量表
用户组表
ACT_ID_GROUP
身份信息-组信息
ACT_ID_INFO
身份信息-信息
ACT_ID_MEMBERSHIP
身份信息-用户和组关系的中间表
ACT_ID_USER
身份信息-用户信息
流程定义表
ACT_RE_DEPLOYMENT
流程定义部署表
ACT_RE_MODEL
模型信息
ACT_RE_PROCDEF
流程定义信息
运行实例表
ACT_RU_EVENT_SUBSCR
运行时事件
ACT_RU_EXECUTION
运行时进程执行实例
ACT_RU_IDENTITYLINK
运行时参与者的用户信息
ACT_RU_JOB
运行时作业
ACT_RU_TASK
运行时任务
ACT_RU_VARIABLE
记录当前流程可用变量的流程运行时刻度,包括 global 和 local
与数据库结合
第四章 Activiti架构
官方网站介绍:https://www.activiti.org/userguide/#chapterApi
引擎 API 是与 Activiti 最常见的交互方式。中心起点是 ProcessEngine
,可以符合 配置部分open in new window 以中所述的各种方式创建。您可以从 ProcessEngine 获取包含工作流/BPM 各种服务的方法。ProcessEngine 服务对象是线程安全的。因此,您可以保留对整个服务器的访问权限。 1 参考资料。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();
DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService();
ProcessEngines.getDefaultProcessEngine()
流程引擎在第一次调用时被初始化和构建,然后总是返回相同的流程引擎。可以使用 ProcessEngines.init()
并正确创建和关闭所有流程引擎 ProcessEngines.destroy()
。
activiti.cfg.xml
ProcessEngines类将扫描所有 activiti-context.xml
文件对于所有人 activiti.cfg.xml
文件,流程引擎将基于 Activiti 构建方式: ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(inputStream).buildProcessEngine()
. 对于所有 activiti-context.xml
文件,流程引擎将 Spring 构建方式:首先创建 Spring 应用程序上下文,然后从该应用程序上下文中获取流程引擎。
所有服务都是无状态的。这意味着您可以轻松地在集群中的多个节点上运行 Activiti,每个节点访问同一个数据库,而不必担心哪台机器实际执行了上一次调用。对任何服务的任何调用都是幂等的,无论它在哪里执行。
获取每个表的相关操作service-dao太好了。activiti的各种service这是为我们写的。
注意 在新版本中,我们可以通过实验发现 IdentityService,FormService 两个 Serivce 全部已删除。所以后来我们为这两个 Service 我也不会解释,但旧版本中仍然有这两个。 Service学生需要知道。
一、activiti.cfg.xml
activiti 的引擎配置文件,包括:ProcessEngineConfiguration 定义、数据源定义、事务管理器等,此文件实际上是 spring 配置文件,以下仅为基本配置 ProcessEngineConfiguration数据来源:
二、ProcessEngineConfiguration :
流程引擎的配置类,通过 ProcessEngineConfiguration 可以创建工作流引擎 ProceccEngine两种常用的方法如下:
1、 StandaloneProcessEngineConfiguration
通过 org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration
Activiti 可以单独运行,使用 ProcessEngine,Activiti 将自己处理事务。
配置文件方法:
通常在 activiti.cfg.xml 配置文件定义了 id 为 processEngineConfiguration 的 bean,将在此处使用 spring 依赖注入以构建引擎。
方法如下:
2、 SpringProcessEngineConfiguration
通过 org.activiti.spring.SpringProcessEngineConfiguration 与 Spring 整合。
创建 spring 与 activiti 集成配置文件:activity-spring.cfg.xml(名称不固定)
3、 创建 processEngineConfiguration
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
1
2
上述代码要求 activiti.cfg.xml 一定有一个 processEngineConfiguration 的 bean您也可以使用以下方法更改 bean 的名字:
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
1
三、ProcessEngine
工作流引擎,相当于门面界面,通过 ProcessEngineConfiguration 创建 processEngine,通过ProcessEngine 创建各个 service 接口。
1,常规创建方法
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine数据库已创建
ProcessEngine processEngine = configuration.buildProcessEngine();
_2简单的创建方法
将 activiti.cfg.xml 文件名和路径是固定的,并且 activiti.cfg.xml 文件中有 processEngineConfiguration 可以使用以下代码创建的配置。 processEngine:
//直接使用工具类 ProcessEngines,使用classpath下的activiti.cfg.xml在中创建配置processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
四、Servcie服务接口
Service它是工作流引擎为工作流部署、执行和管理提供的服务接口。
1、 Service创建方式
通过ProcessEngine创建Service
方法如下:
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
2、 Service总览
service名称
service作用
RepositoryService
activiti资源管理类
RuntimeService
activiti工艺操作管理类
TaskService
activiti任务管理类
HistoryService
activiti管理课程历史
ManagerService
activiti发动机管理类
简单介绍:
RepositoryService
是activiti资源管理类,提供了管理和控制流程发布包和定义的流程操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署过程定义之外,您还可以:查询引擎中的发布包和流程定义。
暂停或激活所有特定流程定义的发布包。 暂停意味着它们不能再执行任何操作,而激活则是相应的反向操作。可以访问各种资源, 或引擎生成的流程图。
获得定义的流程pojo版本, 可用于传递java分析过程而不必经过xml。
RuntimeService
Activiti工艺操作管理类。可以从这个服务类中获取很多关于流程执行相关的信息
TaskService
Activiti任务管理类。可以从这个类中获取任务的信息。
HistoryService
Activiti管理课程历史,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间、每个流程实例的执行路径等。 该服务主要通过查询功能获取这些数据。
ManagementService
Activiti发动机管理类,提供了对 Activiti 流程引擎的管理和维护功能,不用于工作流驱动的应用程序,主要用于 Activiti 系统的日常维护。
第五章 Activiti入门
在本章中,我们将创建Activiti工作流并启动流程。
创建Activiti工作流包括以下步骤:
1,定义过程,BPMN规范使用过程定义工具 流程符号 描述整个过程。
2,部署流程,绘制的流程定义文件,加载到数据库,生成表数据
3,启动流程,使用java用于操作数据库表内容的代码。
1.工艺符号
BPMN 2.0是业务流程建模符号2.0的缩写。
它由Business Process Management Initiative这个非盈利协会成立并继续发展。作为标志,BPMN 2.0是用一些 符号 为了澄清业务流程设计流程图的一组符号规范,它可以提高业务建模时的通信效率。
目前BPMN2.0是最新版本,用于BPM布局和视觉交流的上下文。
接下来,让我们首先了解流程设计中的常见问题。 符号。
BPMN2.0的 基本符合 主要包括:
1、事件 Event
2、活动 Activity
活动是作业或任务的通用术语。活动可以是任务或当前流程的子流程; 其次,您还可以为活动指定不同的类型。常见活动如下:
3、网关 GateWay
网关用于处理决策。需要了解几个常见的网关:
(1)专用网关 (x)
-只选择一条路径。当进程被执行到网关时,它会根据输出流的顺序逐一计算。当条件的计算结果为true继续执行当前网关的输出流程;
如果多行计算 true第一个值是 true 行。如果所有网关计算没有true引擎引发异常。
专用网关需要与条件顺序流结合使用,default 属性指定默认的顺序流,当不满足所有条件时执行该流。
(22) 并行网关 (+)
-将同时选择所有路径
拆分 —— 并行执行所有输出序列流,为每个序列流创建一个并行执行行。
合并 —— 从并行网关分离并执行的所有行都在这里等待,直到所有行都被执行。
(3)非独占网关 (+)
—— 可以同时执行多条线路,也可以在网关上设置条件
拆分 —— 当表达式求值时,计算每行上的表达式true创建一条平行线并继续执行。
合并 —— 从并行网关分离并执行的所有行都在这里等待,直到所有行都被执行。
(4)事件网关 (+)
—— 专门为中间捕获事件设置,允许多个输出流指向多个不同的中间捕获事件。在向事件网关执行进程之后,该进程处于等待状态,需要等待抛出事件,然后才能将等待状态更改为活动状态。
4、流向 Flow
流是连接两个流程节点的连线。常见的流向包括:
二、 Process Designer使用
1、activiti BPMN visualizer 使用
Palette (画板)
在idea您可以通过在中安装插件来使用它,绘图板包括以下节点:
Connection—连接
Event—事件
Task—任务
Gateway—网关
Container—容器
Boundary event-边界事件
Intermediate event- -中间事件
设计完成后保存并生成流程图。.bpmn文件
(11) 新流程(IDEA工具)
首先选择存储图形的目录(选择resources下的bpmn目录),单击菜单:New -> bpmn file,如图:
弹出下图所示的框,输入holiday表示 旅行审批流程:
起完名字holiday之后(默认扩展名为bpmn20.xml),可以看到流程设计页面,如图所示:
右键
鼠标首先单击绘图板的元素以在左侧绘制
(22) 绘图过程
使用滑板绘制过程,通过将图标从右侧拖动到左侧艺术板,最终效果如下:
(3)指定流程定义Key
流程定义key即定义的流程标识,通过properties看法key
(4)指定任务所有者
在properties该视图指定每个任务节点的负责人,例如,负责填写旅行申请的人是 itlils
负责经理审批的人员是 zhuzhu
总负责经理审批的人员是 itnanls
负责财务审批的人员是 weiwei
第六章 流程操作
1.流程定义
1、概述
流程定义根据bpmn2.0要描述的标准 业务流程,通常使用idea插件为业务流程建模。
2、.bpmn文件
使用activiti-desinger设计业务流程.bpmn文件,上面我们已经创建bpmn文件
BPMN 2.0根节点是definitions节点。 在这个元素中,可以定义多个进程定义(尽管我们建议每个文件只包含一个进程定义, 可以简化开发过程中的维护难度)。 注意,definitions元素 至少包括xmlns 和 targetNamespace的声明。 targetNamespace可以是用于对流程实例进行分类的任何值。
流程定义部分:定义流程的每个节点的描述以及节点之间流程的流程。
流程布局定义:定义流程图上流程每个节点的位置坐标等信息。
3、生成.png图片文件
IDEA刀具中的操作模式
2.流程定义部署
1、概述
将上面在设计器中定义的流程部署到activiti在数据库中,它是流程定义部署。
通过调用activiti的api将定义的流程bpmn和png逐个添加两个文件以进行部署activiti,也可以键入这两个文件zip要部署的包。
2单文件部署方法
分别将bpmn文件和png映像文件部署。
package com.ydlclass.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 {
/**
* 部署过程定义
*/
@Test
public void testDeployment(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、使用RepositoryService进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/holiday.bpmn") // 添加bpmn资源
.addClasspathResource("bpmn/holiday.png") // 添加png资源
.name("差旅申请流程")
.deploy();
// 4输出部署信息
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
}
执行此操作后activiti上述代码中指定的bpm文件和图片文件保存在activiti数据库。
3,压缩包部署方法
将holiday.bpmn20.xml和holiday.png压缩成zip包。
@Test
public void deployProcessByZip() {
// 定义zip输入流
InputStream inputStream = this
.getClass()
.getClassLoader()
.getResourceAsStream(
"bpmn/holiday.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
// 获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
// 流程部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
System.out.println("id:" + deployment.getId());
System.out.println("Name:" + deployment.getName());
}
执行此操作后activiti上述代码中指定的bpm文件和图片文件保存在activiti数据库。
4操作数据表
流程定义部署后操作activiti的3下表如下:
act_re_deployment 流程定义部署表,每个部署添加一条记录
act_re_procdef 流程定义表(其中部署了每个新的流程定义)向表中添加了一条记录
act_ge_bytearray 流程资源表
让我们看看写入了哪些数据:
SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息
1
结果:
SELECT * FROM act_re_procdef #过程定义表,记录过程定义信息
1
结果:
注意,KEY 此字段是用于唯一标识不同进程的关键字
[外部链接图片传输失败,源站可能具有防盗链机制,建议保存图片并直接上传。(img-uZemaDPu-1667528089250)(https://www.ydlclass.com/doc21xnv/assets/image-20220912164229052.011f3f42.png)]
SELECT * FROM act_ge_bytearray #资源表
1
结果:
工艺总结:
-
插件 画流程图
bpmn20.xml png
资源文件,记录集成过程的整个节点和信息流。
-
部署
java代码
数据库涉及3张表。deployment 部署记录 procdef记录部署的详细信息 bytearray xml\png资源被放入数据库
-
deployment 和 procdef是一对多的关系
itlils 出差流程
itnanls 出差流程
建议:一次部署一个流程,使部署表和流程定义表具有一对一的关系,便于读取流程部署和流程定义信息。
3.启动流程实例
流程定义部署在activiti后就可以通过工作流管理业务流程了,也就是说上边部署的差旅申请流程可以使用了。
对于这个过程,启动一个过程意味着启动一个新的旅行请求,这相当于java类与java对象之间的关系,在定义类之后,需要new当然,使用创建对象。new多个对象。对于请差旅申请流程,张三发起一个出差申请单需要启动一个流程实例,出差申请单发起一个出差单也需要启动一个流程实例。
代码如下:
/**
* 启动流程实例
*/
@Test
public void testStartProcess(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3根据工艺定义Id启动流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("holiday");
// 输出内容
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.任务查询
流程启动后,任务负责人可以查询需要处理的任务。查询的任务都是用户的待办任务。
/**
* 查询当前个人要执行的任务
*/
@Test
public void testFindPersonalTaskList() {
// 任务负责人
String assignee = "itlils";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
// 根据流程key 和 任务负责人 查询任务
List list = taskService.createTaskQuery()
.processDefinitionKey("holiday") //流程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());
}
}
5.流程任务处理
任务所有者查询待办任务,选择要处理的任务,并完成任务。
// 完成任务
@Test
public void completTask(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取taskService
TaskService taskService = processEngine.getTaskService();
// 根据流程key 和 任务负责人 查询任务
// 返回任务对象
Task task = taskService.createTaskQuery()
.processDefinitionKey("holiday") //流程Key
.taskAssignee("itlils") //查询负责人
.singleResult();
// 完成任务,参数:任务id
taskService.complete(task.getId());
}
6.流程定义信息查询
查询流程信息,包括流程定义、流程部署和流程定义版本
/**
* 查询流程定义
*/
@Test
public void queryProcessDefinition(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 得到ProcessDefinitionQuery 对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 查询所有当前流程定义
// 条件:processDefinitionKey =evection
// orderByProcessDefinitionVersion 按版本排序
// desc倒叙
// list 返回集合
List definitionList = processDefinitionQuery.processDefinitionKey("holiday")
.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("DeploymentId ="+processDefinition.getDeploymentId());
}
}
输出结果:
id=holiday:1:4
name=MyHoliday
key=holiday
Version=1
DeploymentId =1
7.流程删除
public void deleteDeployment() {
// 流程部署id
String deploymentId = "1";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//删除进程定义。如果流程定义已启动流程实例,则在删除过程中会发生错误。
repositoryService.deleteDeployment(deploymentId);
//设置true 级联以删除流程定义,即使流程已启动流程实例,设置false非级别删除方法,如果进程
//repositoryService.deleteDeployment(deploymentId, true);
}
说明:
-
使用repositoryService删除进程定义。不会删除历史记录表信息。
-
如果流程定义下没有正在运行的任务,则可以使用normal删除它们。
如果流程定义下已经有正在运行的流程,请使用正常删除报告错误,并使用级联删除方法删除所有流程和相关记录。
首先删除未完成的流程节点,最后完全删除流程定义信息。
项目开发级联删除操作通常只对超级管理员开放。.
8.流程资源下载
现在,我们的流程资源文件已经上传到数据库,如果其他用户想要查看这些资源文件,他们可以将资源文件从数据库下载到本地。
解决方案包括:
1、jdbc对blob类型,blob读取类型数据并将其保存到文件目录。
2、使用activiti的api来实现
使用commons-io.jar 解决IO的操作
引入commons-io依赖包
commons-io
commons-io
2.6
通过流程定义对象获取流程定义资源,获取bpmn和png
@Test
public void downloadFile() throws IOException {
//创建流程引擎配置文件
ProcessEngineConfiguration configuration
= ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cgf.xml","processEngineConfiguration");
//通过配置文件创建流程
ProcessEngine processEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//1repositoryService 获取相应的数据
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("holiday").singleResult();
String deploymentId = definition.getDeploymentId();
InputStream xmlFileInputStream = repositoryService.getResourceAsStream(deploymentId,definition.getResourceName());
InputStream pngInputStream = repositoryService.getResourceAsStream(deploymentId, definition.getDiagramResourceName());
//2输入输出流并将其放入本地文件夹
FileOutputStream xmlFileOutputStream=new FileOutputStream(new File("e:/holiday.bpmn20.xml"));
FileOutputStream pngFileOutputStream=new FileOutputStream(new File("e:/holiday.png"));
//3工具类将输入流转换为输出流。
IOUtils.copy(xmlFileInputStream,xmlFileOutputStream);
IOUtils.copy(pngInputStream,pngFileOutputStream);
//4关流
pngFileOutputStream.close();
xmlFileOutputStream.close();
pngInputStream.close();
xmlFileInputStream.close();
}
说明:
-
deploymentId为流程部署ID
-
resource_name为act_ge_bytearray表中NAME_列的值
-
使用repositoryService的getDeploymentResourceNames方法获取指定部署下所有文件的名称。
-
使用repositoryService的getResourceAsStream方法传入部署ID并且资源映像名称可以获得正在部署的指定名称文件的输入流。
最后,输出输入流中的图像资源。
视图9.流程历史信息
即使删除了流程定义,流程执行的历史信息仍存储在activiti的act_hi_*相关表格。因此,我们仍然可以通过HistoryService查看相关历史记录。
/**
* 查看历史信息
*/
@Test
public void findHistoryInfo(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
// 获取 actinst表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
// 查询 actinst表,条件:根据 InstanceId 查询
// instanceQuery.processInstanceId("2503");
// 查询 actinst表,条件:根据 DefinitionId 查询
instanceQuery.processDefinitionId("holiday:1:4");
// 添加排序操作,orderByHistoricActivityInstanceStartTime 按开始时间排序 asc 升序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
// 查询所有内容
List 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("<======
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除