背景

客户生产系统有张表存储流程bpmn文件,由于某些原因,更新程序找不到,因此只能连接数据库直接更新字段,数据库是oracle数据库,字段类型是blob。

PL/SQL Developer

一开始通过PL/SQL Developer工具进行编辑,bpmn文件使用UTF-8编码,但是在工具中查看是乱码,因此不能直接编辑

Read the rest of this entry

,

背景

某项目流程使用activiti开发,现需要开发一个流程预测的功能,流程预测,也称流程预跑,是指用户在发起流程或者执行审批动作时希望看到流程后续流转的节点,方便用户跟踪流程。Activiti本身不提供流程预测的功能,实际上流程在运行时每一个变量的变化,比如审批结果,表单数据等,都会影响流程的走向,而这些变化是无法进行预见的,所以流程预测的前提条件就是,我们需要假设一些变量的值,比较典型的就是审批结果,我们需要假设审批结果都是通过的,基于这个前提,我们才能完成一个可以提供参考价值的预测数据。

实现

如果要看懂本文,你必须对activiti开发有基本的了解,对一些基本的概念熟悉,建议先阅读之前发表的Activiti教程

流程模型

这边准备了一个简单的报销流程模型示例

Read the rest of this entry

,

加签

加签是指当前节点审批完后需要额外再加一个审批人进行审批,额外加的审批用户审批完后流程流转到下一节点。比如正常审批流程为A->B->C,如果B执行了加签动作,那么流程就变为A->B-->D-->C,节点D就是加进来的。

医学上有个万能药叫做安慰剂,没有任何药物作用,可能就是一颗糖果,但患者并不知道,但因患者对医生信任、患者叫自我暗示以及对某种药物疗效的期望等而起到镇痛、镇蘸或缓解症状的作用。为什么提到这个呢,因为加签的方案就是一个安慰剂方案,用户感知到加签是从审批历史里感知的,在做加签操作时,审批历史里面记录了加签的动作,但是后台执行了重新分配(reassign)的操作将当前流程重新分配给另外一个人,达到加签的效果,所以加签就一行代码

taskService.setAssignee(task.getTaskId(), user);

这样可能会有以问题

Read the rest of this entry

, ,

介绍

回退操作是指,将流程退回到上一个节点,基本思路是通过审批历史服务HistoryService找到审批审批的上一节点,然后跟通用拒绝操作类似,将流程拨回到该节点,要注意的一个问题是,如果碰到并行审批,在并行线上回退应该回退到哪里呢?

如图,如果审批顺序为主管审批->上级领导审批->董事长审批,这时候总监审批执行回退操作,应该回退到哪个节点呢,显然不是董事长,因为这是两个并行互不干扰的审批,正常应该回退到主管审批这里,所以回退操作应该是基于execution的回退。如果你对ecxecution不了解,你可以查看之前的文章SpringBoot Activiti6系列教程(六)-Execution说明

因此,方案就是找到该execution的上个审批节点将流程回退到该节点。

Read the rest of this entry

, ,

通用拒绝

从这章开始,就正式进入activiti的实战开发,使用activiti实现各种审批动作,包括一些中国式流程操作,比如回退,征询等,这些操作activiti的标准功能是没有的,但因为activiti不算复杂,也比较灵活,因此可以通过一些技巧或者变通的方法实现,这章就讨论通用拒绝的实现。为什么叫通用拒绝,因为在activiti里,正常的拒绝都是通过连接线加条件判断实现,你可以定义一个变量如outcome,拒绝的时候给这个变量赋值REJECT,在连接线上设置条件表达式从而实现拒绝操作。如图:

项目经理拒绝到发起人的表达式为${outcome=='REJECT'},在流程里设置好变量就能实现拒绝操作:

taskService.setVariable(taskId, "outcome", "approve");
taskService.complete(taskId);

这种拒绝实现方式优点是简单,标准支持,灵活性强,能够从任意节点拒绝回任意节点,但缺点也是明显的

Read the rest of this entry

, ,

上一篇文章,我们探究了execution的运行机制,activiti里变量的作用域就是通过execution实现,activiti里变量按作用域有以下几种

  • 执行变量(variable)
  • 本地变量(LocalVariable)
  • 临时变量(TransVariable)

执行变量作用域在execution上,本地变量作用域在task上,临时变量不存储数据库,流程进入等待节点(比如UserTask)变量自动清除。

需要使用变量的是RuntimeServiceTaskService,本文主要对这两个service中变量的使用做详细说明,避免在不了解变量使用范围的情况下,错误的使用变量,导致流程出错。

Read the rest of this entry

, ,

在activiti中有几个概念经常用,但文档也没有讲的很清楚,如果不理解,有可能会误用。本文就详细探讨以下几个概念

  • deployment(部署)
  • instance(实例)
  • execution(执行)
  • task(任务)

deployment(部署)

我们在前面章节讲过,bpmn流程模型文件需要通过RepositoryService进行发布,相同名称的流程模型重新部署后会升一个版本,但并不影响之前的流程,还未结束的流程还是会按照发起时候的版本走。因此deployment就表示一次资源的部署,资源类型不一定是bpmn文件,可以是任意文件。上传的资源元信息保存在ACT_RE_DEPLOYMENT中,资源内容以二进制形式保存在表ACT_GE_BYTEARRAY中,两张表通过DEPLOYMENT_ID字段关联

Read the rest of this entry

, ,

介绍

Activiti api设计的非常友好,使用的过程中也是学习到了api设计的一些技巧,有时间也会整理下,activit api主要是分两大块
  • Service
  • Query

Service负责执行动作,Query负责执行查询,也就是涉及到数据的增、删、改由Service负责,涉及到数据的由Query负责,在spring boot中,Service可以通过注入获取,Query可以通过相应的Service获取,所有的Service都可以通过ProcessEngine获取。

Service

activiti有8个service管理着activiti所有的资源

  • TaskService-对用户任务进行操作和查询
  • RepositoryService-对activiti资源进行操作,比如部署文件,附件
  • RuntimeService-运行时服务,可以对运行时流程进行修改,如增加变量,移除变量等
  • IdentityService-身份认证服务,对用户,用户组,用户角色进行操作
  • HistoryService-历史记录服务,对审批历史进行操作
  • FormService-表单服务,操作表单数据
  • DynamicBpmnService-通过该服务,可以动态修改流程
  • ManagementService-管理服务,查看当前activiti系统信息,不会在应用里用到,一般用于管理系统里

Read the rest of this entry

, ,

说明

上一章节中,介绍了如何基于bpmn2.0的xml文件发起流程和获取待办,其中流程文件和代码打包在一起,但实际项目中很少会把流程文件和代码一起打包部署,这样的话,每次流程更新或者发布新流程都需要重新部署应用,因此我们制定了以下部署方案:

  • 提供流程部署接口,可以通过上传流程文件对流程进行部署。
  • 如果流程文件没有发生变化,不做新的部署,防止因为重新部署导致版本号上升。

资源部署

activit部署资源文件需要通过RepositoryService创建一个deployment,通过该deployment进行资源的部署,不单单是bpmn流程文件,activiti可以部署任何文件。

上传资源到activiti

Read the rest of this entry

, ,

BPMN建模

在前面两节,我们介绍了如何部署activiti三个应用以及如何使用第三方数据库,如果你还没阅读前两章也不影响本文的阅读,如果有兴趣了解下,可以点击以下链接

从本章开始,就正式开始activiti程序开发,我们先从一个最简单的activiti流程开发,流程图如下:

流程很简单,发起后,由管理员admin审批,然后结束。

bpmn源文件代码如下

Read the rest of this entry

, ,