activiti工作流引擎入门教程-程序员宅基地

技术标签: 工作流  引擎  Activiti  

activiti简介

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准。
Activiti是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,同时促进Activiti BPM引擎和BPMN 2.0的匹配。

activiti的7大马车

1.RepositoryService:提供一系列管理流程部署和流程定义的API。
2.RuntimeService:在流程运行时对流程实例进行管理与控制。
3.TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
4.IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
5.ManagementService:提供对流程引擎进行管理和维护的服务。
6.HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
7.FormService:表单服务。

activiti应用场景

多人协作的(或者需要动态变动)的业务流程场景。

正文

本文将通过搭建一个简单的请假流程系统来进行讲解。

如你所知,activiti工作流引擎多运用于流程性很强的业务系统。所以运用的第一步是创建.bpmn文件(我称之为activiti认识的流程图)

 

activiti流程图

 

.bpmn文件我们可以通过编辑软件打开

 

,bpmn文件


可以简单的认为就是一个xml文件,activiti去解析这个文件,了解我们到底想干什么事。
画完流程图之后,就是我上面提到的activiti七架马车。它们就是activiti对外提供的接口。通过它们就可以很方便的操作到activiti生产的数据,以及操作它在适当的节点做想让它做的事。

我这边是通过springboot搭建。所以需要把那七大马车注入(也不一定要全部注入),交给spring管理。这样就可以随便用了。
以下是注入马车代码

package com.ysh.activiti.config;

import javax.sql.DataSource;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActivitiConfog {
  @Autowired
  private DataSource dataSource;

  @Bean
  public StandaloneProcessEngineConfiguration processEngineConfiguration() {
      StandaloneProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
      configuration.setDataSource(dataSource);
      >configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
      configuration.setAsyncExecutorActivate(false);
      return configuration;
  }

  @Bean
  public ProcessEngine processEngine() {
      return processEngineConfiguration().buildProcessEngine();
  }

  @Bean
  public RepositoryService repositoryService() {
      return processEngine().getRepositoryService();
  }

  @Bean
  public RuntimeService runtimeService() {
      return processEngine().getRuntimeService();
  }

  @Bean
  public TaskService taskService() {
      return processEngine().getTaskService();
  }
  @Bean
  public HistoryService historyService() {
      return processEngine().getHistoryService();
  }
}

当然我这边并没有注入所有的马车,用到的是时候再加都是可以的。这儿也随带对activiti做了基本的配置。
配置了数据源,自动建表,是否激活AsyncExecutor。刚刚介绍了其他马车,忘了activiti 最重要的ProcessEngine(流程引擎对象),马车都是由它管理。
配置好这些,运行代码就会产生activiti的内置表。

 

activiti内置表

 

上图已act开头的都是,总共28张。每张表含义以及表里的字段含义,我这里就不在累赘,大家网上都能找到资料。我就这点一哈我认为比较重要的表
1.act_ru_execution 执行对象表
2.act_ru_task 用户任务表
3.act_hi_actinst 活动节点历史表
4.act_hi_procinst 流程实例历史表
5.act_hi_taskinst 历史任务表
下面就说怎么去启动一个流程

Deployment deploy = >repositoryService.createDeployment().addClasspathResource("processes/leave.bpmn").deploy();
// 获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
              .deploymentId(deploy.getId()).singleResult();
// 启动流程定义,返回流程实例
ProcessInstance pi = runtimeService.startProcessInstanceById(processDefinition.getId());

到此,入门就算结束了。

搭建的注意点

我搭建时考虑的问题:
1.activiti流程怎么和自己的业务表,如请假详细信息表,审批信息表关联起来?
2.activiti如何知道那些任务该由谁处理?
3.驳回,撤销(目前未搞撤销功能,文章还会持续更新)怎么实现?
解决方式 :
1.问题一,网上说的可以把流程与业务通过activiti的businesss_key关联起来。后来我发现好像这个值一次流程只能设置一次(也有可能是我操作不对),最终我选择了在业务表存储流程实例的id来进行关联。
问题二:指定任务候选人方式解决。指定候选人的时候,我一开始采用监听的方式,因为我这边设计的是某个角色下的人都会有某个流程节点的审批权限,通过监听的方式,我一开始又直接选择监听类,具体操作如下:

 

直接选择监听类

 

发现这种方式不能获取到spring管理的bean。
后面尝试使用expression。这种方式可以获取到bean。由于我要操作数据库查询数据,所以注入了JpaRepository。然后神奇的爆了序列化问题。
最后我选择了传参的方式指定候选人。

 

变量指定候选人


3.驳回:使用排他网关实现,只需要指定通过条件

流程线指定条件


由于代码量还是有点多,后面我code review之后(现在写的还是有点糙)会放到github上。有兴趣的朋友可以持续关注。

系统展示

系统用户角色表设计

 

系统角色划分

 

用户的信息

 

用户与角色关系

 

当然大家从名字也能大致猜出对应角色。

 

系统登录页

 

普通员工登录界面

 

发布申请

 

填写之后

 

查看流程

 

通过上文流程图,可以知道请假不大于五天都是部门经理审批。
上文的黑色,表示已经提交到经理审核,但是经理还未处理。

 

申请6天

 

大于五天,总监审批

 

部门经理yshManager审批

 

部门经理YshManager2审批


同一个任务,身为部门经理的人都能进行审批。说明传参的方式制定审核人事没有问题的。

部门经理yshManager2审批之后的流程


我这边审核任务设置的是一个人审批过后,就算审批通过,不需要所有人审批通过。当时一个部门经理审批过后,其他部门经理就不能审核这个任务,同时我这边也设计的是无法再进行查看这个请假任务具体情况。
人事审核同理。

人事顺利审批

 

一次性走完流程的流程进度

 

审批拒绝


我就不挨着截图了,直接展示一个多次遭拒绝的情况截图。

image.png

 

这儿就是多次审批遭拒,然后重新申请的情况。这儿就会有一个问题,我开始申请请假是6天。被总监拒绝。我改为5天,被人力资源拒绝。后面改3天,审批通过。由于我申请审批一直是操作的同一条申请请假数据。导致前面的数据记录丢失。(bug后续更新解决)

结语

我对activiti也是刚接触的小白。如有不正确之处,请不吝赐教。后面还会持续更新。有兴趣的朋友可以持续关注。



作者:帅哥哥写代码
链接:https://www.jianshu.com/p/972613558ba1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/GarfieldEr007/article/details/104603402

智能推荐

Python 实现C、C++程序注释英文翻译插件_针对c语言注释进行翻译-程序员宅基地

文章浏览阅读760次。Python 实现C、C++程序注释英文翻译插件。3.此文缺少访问超时等待续翻译代码段,暂时没空添加。2.安装核心功能包translators。1.参数3个,源文件、目标文件、翻译模式。4.编写正则表达式分析文本内容。3.编写文本输入输出函数。6.Keil实践提示。_针对c语言注释进行翻译

环形子数组的最大和-程序员宅基地

文章浏览阅读418次,点赞10次,收藏7次。至此,我们可以使用以上方法求解出环形数组的最大子数组和。特别需要注意的是,本题要求子数组不能为空,我们需要在代码中做出相应的调整。第一种情况的求解方法与求解普通数组的最大子数组和方法完全相同,读者可以参考53号题目的题解:最大子序和。求解普通数组的最大子数组和是求解环形数组的最大子数组和问题的子集。从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3。的最大前缀和,将它们相加更新答案。数组和枚举后缀的时间复杂度为。最多只能包含固定缓冲区。构成最大子数组和的子数组为。构成最大子数组和的子数组为。

Flutter溢出滚动_flutter 超出滚动-程序员宅基地

文章浏览阅读4.8k次。外部再加层SingleChildScrollView属性this.scrollDirection = Axis.vertical,//滚动的方向,垂直或水平this.reverse = false,// 是否反转,如果是垂直滚动的话,reverse默认为false,表示先看上面。如果reverse为true,则先看底部。this.padding,// 内边距bool primary,// 是否使用默认的controllerthis.physics,this.controller,//可以控制初_flutter 超出滚动

我的世界服务器换披风的网站,minecraft我的世界局域网换皮肤和披风-程序员宅基地

文章浏览阅读3.7k次。minecraft很多人不知道皮肤和披风怎么换,装了mod也没用,皮肤有人说必须要正版,也是胡扯。那该怎么换呢?下面是学习啦小编收集整理的minecraft我的世界局域网换皮肤和披风,希望对大家有帮助~~minecraft我的世界局域网换皮肤和披风工具/原料minecraft电脑版skinme方法/步骤1进入http://www.skinme.cc/#./mod_index?&_suid=..._minecraft披风网站

python按钮虚化_深度学习与图像处理之:人像背景虚化-程序员宅基地

文章浏览阅读457次。简单实现思路:对图像内容进行分割,提取人像对图像背景进行模糊化处理将人像和背景重新合成在这里,使用DeepLabV3模型对图像内容进行分割并提取人像,实现的代码如下:import numpy as npimport tensorflow as tfimport cv2from deeplabmodel import *def create_pascal_label_colormap():color..._python 图像处理 深度学习

随便推点

Hadoop FS 常用命令详解_hadoop fs mkdir-程序员宅基地

文章浏览阅读5.1k次。1、概述Hadoop文件系统(FS)提供了各种shell命令,与shell命令类似,可用于同分布式文件系统(HDFS)进行交互,以管理HDFS集群中的文件和数据。2、Hadoop FS常用命令(1)创建目录用法:hadoop fs -mkdir <paths>示例:创建单个目录:hadoop fs -mkdir /home/myfile/dir1创建多目录:hadoop fs -mkdir /home/myfile/dir1 /home/myfile/dir2(2._hadoop fs mkdir

int gd = DETECT, 显示错误未定义标识符”DETECT“-程序员宅基地

文章浏览阅读1.1k次。DETECT是一个在graphics.h头文件中定义的常量,用于在初始化图形模式时指定使用自动检测功能。你在使用DETECT之前没有包含graphics.h头文件或者在编译时graphics.h文件没有找到,因此导致编译器无法识别DETECT标识符,出现了“未定义标识符”的错误提示。你需要在使用DETECT之前包含graphics.h头文件,例如:#include <graphics...._未定义标识符detect

00-C语言语法_00,,c-程序员宅基地

文章浏览阅读830次。C语言语法变量变量对应这内存中的一段内存。 从内存的角度看变量,变量包括:内存地址(变量首地址)、变量名、变量类型(即变量大小)、变量值等。关键字auto自动变量:是函数的参数 ,和 在函数体内定义的局部变量。函数的形参及代码块中定义的变量都属于auto变量,这是C语言中应用最广的一种变量,这类变量是栈分配的,是动态分配存储空间的。举函数形参为例,当调用该函数时,为形参分配存储空间,当函数调用结束时,系统就自动释放这些存储空间。对**代码块中定义的变量(包含函数中定义的变量),当执行到_00,,c

【数理知识】极坐标与笛卡尔坐标转换_笛卡尔转极坐标-程序员宅基地

文章浏览阅读1.7w次,点赞12次,收藏32次。极坐标与笛卡尔坐标极坐标与笛卡尔坐标笛卡尔坐标系极坐标系转换笛卡尔坐标转换为极坐标极坐标转换为笛卡尔坐标但如果 X 和 Y 是负数呢?总结极坐标与笛卡尔坐标笛卡尔坐标系极坐标系转换从一个系统转换到另一系统,我们用这个三角形:笛卡尔坐标转换为极坐标当我们知道一点的笛卡尔坐标 (x,y)(x,y)(x,y) 想转换成极坐标 (r,θ)(r,θ)(r,θ),我们需要解一个有两条已知边的直角三角形。例子: (12,5) 的极坐标是什么?用勾股定理去计算长的一边(斜边):r2=122+52r=_笛卡尔转极坐标

cfdpost导出图片_科学网—去除 cfd post 输出eps文件中的莫名其妙的点 - 姚程的博文...-程序员宅基地

文章浏览阅读557次。用cfd post 输出eps格式图片时,会莫名其妙地出现一些点,比如,原本要输出一条曲线,但是多了下面这个点。怎么办?辛亏eps文件可以编辑!!!先保留上面的那条线,输出test1.eps然后把线隐藏,再输出test2.eps然后用notepad++把两个eps文件都打开。使用compare插件,比较这两个文本。会发现,test1.eps中多出了一些命令其中有这么几行数据,是以v或者vc结尾的。..._cfdpost导出图片关闭水印

pmw.php,加速调光频率 PWM实现精准LED调光-程序员宅基地

文章浏览阅读707次。无论是经由降压、升压、降压/升压或线性稳压器驱动,连接每一个驱动电路最常见的线程就是须要控制光的输出。现今仅有很少数的应用只需要开和关的简单功能,绝大多数都需要从0~100%去微调光度。目前,针对光度控制方面,主要的两种解决方案为线性调节LED的电流(模拟调光)或在肉眼无法察觉的高频下,让驱动电流从0到目标电流值之间来回切换(数字调光)。利用脉冲宽度调变(PWM)来设定循环和工作周期可能是实现数字..._.xp pwma1wdpjppwm1ptgp7pgdppp0mpwpg邓文747778547146009977ggdppwppgg1ppp