Activiti7报表引擎入门版权声明

原创
小哥 3年前 (2022-12-26) 阅读数 91 #大杂烩

Activiti7 工作流引擎入门

做课目的

1.适用人群: 普通人

不是每个人都能进入互联网工厂 BATJ

普通人、省会城市、软件公司、银行、政府都是如此。

2.适用项目:OA CRM ERP 系统

差旅报销流程和休假流程

3.课程特点:说人

快速启动工作流

(salvio修订版)欢迎支持

第一章 工作流相关术语

1.工作流简介

工作流(Workflow),是通过计算机管理业务流程自动化。它涉及“根据一些预定义的规则在多个参与者之间自动交付文档、信息或任务的过程,以实现期望的业务目标,或为实现该目标做出贡献”。

企业OA:

请假----“Intranet系统----“小李填写申请表7天----“团队领导同意----》CTO同意------人事部长同意。-----》结束

专业公司会这样做。OA CRM ERP: 金蝶、用友

2.工作流系统

软件系统具有工作流功能。我们称之为工作流系统。工作流在系统中的功能是什么?它是为了使系统的业务流程的管理自动化,因此工作流是基于业务流程的,因此软件系统的核心基本上是系统的业务过程,而工作流仅协助管理业务流程。即使没有工作流,业务系统也可以开发和运行,但有了工作流可以更好地管理业务流程,提高系统的可扩展性。

1、 适用行业

消费品行业、制造业、电信服务业、银行、证券和保险等金融服务业、物流服务业、物业服务业、财产管理、大中型进出口贸易公司、政府机构、研究机构和教育服务业等。,特别是大型跨国企业和集团公司。

2、 具体应用

  1. 关键业务流程:订单、报价处理、合同审查、客户呼叫处理、供应链管理等。
  2. 行政管理类:差旅申请、加班申请、请假申请、汽车申请、各种办公用品申请、采购申请、每日周报等原本人工转移的行政表格。
  3. 人事管理:员工培训安排、绩效考核、岗位变更处理、员工档案信息管理等。kpi
  4. 财务相关类别:付款申请、应收款项处理、日常报销处理、差旅报销、预算和计划申请等。
  5. 客户服务:客户信息管理、客户投诉、请求处理、售后服务管理等。
  6. 特殊服务类别:ISO 系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等任务通过表单分步手工流程完成,可应用于工作流软件中自动、标准化实施。

三、 工作流实施

注:介绍信。 档案管理部,信息管理,上级专业:图片和信息档案

在出现特殊的工作流引擎之前,为了实现过程控制,通常使用状态字段的值来跟踪过程中的更改。通过这种方式,不使用角色的用户可以确定记录是否由状态字段的值显示。

对于具有查看权限的记录,当前用户根据其角色确定审批是否合格。如果合格,则在状态字段中设置一个值以表示合格;当然,如果不合格,请设置一个值来表示不合格。

缺点

这是最原始的方式。虽然过程控制是通过状态字段实现的,但当我们的过程发生变化时,以这种方式编写的代码也需要进行调整。

想看历史发展的记录,怎么办?

那么,是否有一种专业的方法来实施工作流管理?在业务流程发生变化后,我们的程序可以不加更改地进行更改。如果能够达到这种效果,那么我们业务系统的适应性将大大提高。

四、 工作流实现原理分析

在业务流程更改后,我们的业务系统代码不能更改,我们如何做到这一点?此时,我们将分析原理。

具体分析过程如下图所示:

文字版

第二章 Activiti7 概述

一、Activiti 介绍

Alfresco 软件在 2010 年 5 月 17 日宣布 Activiti 业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任,Tom Baeyens 就是原来 jbpm 建筑师,以及 jbpm 当然是一个非常著名的工作流引擎 activiti 它也是一个工作流引擎。

Activiti 是工作流引擎, activiti 可以使用专门的建模语言提取业务系统中的复杂业务流程(BPMN2.0)根据预定义的流程执行业务系统,业务系统的业务流程由 activiti 管理,减少业务系统因流程变化而产生的工作量,从而升级系统,从而提高系统的鲁棒性,同时也降低了系统开发和维护的成本。

官方网站:https://www.activiti.org

经验丰富的版本 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,网络图形设计工程师培训

  1. activiti-engine-7.0.0.beta1.jar
  2. activiti 依赖的 jar 包:mybatis、alf4j、log4j 等
  3. activiti 依赖的 spring 包
  4. 数据库驱动程序
  5. 第三方数据连接池 dbcp
  6. 单元测试 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

https://www.ydlclass.com/doc21xnv/other/activiti/#%E4%BA%8C%E3%80%81activit-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

(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

结果:

工艺总结:

  1. 插件 画流程图

    bpmn20.xml png

    资源文件,记录集成过程的整个节点和信息流。

  2. 部署

    java代码

    数据库涉及3张表。deployment 部署记录 procdef记录部署的详细信息 bytearray xml\png资源被放入数据库

  3. 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);
    }

说明:

  1. 使用repositoryService删除进程定义。不会删除历史记录表信息。

  2. 如果流程定义下没有正在运行的任务,则可以使用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();
    }

说明:

  1. deploymentId为流程部署ID

  2. resource_name为act_ge_bytearray表中NAME_列的值

  3. 使用repositoryService的getDeploymentResourceNames方法获取指定部署下所有文件的名称。

  4. 使用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("<======
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除