activity初探(基于kft-activiti-demo的一个小例子)

简介: 最近老板心血来潮要搞基于activiti的工作流,没办法,只能现学,看了两周,一个小总结。 前提准备: - eclipse安装acidity-designer插件 - 了解bpmn2.0基本知识 - 下载activiti,跑一跑其中demo - 下载咖啡兔中的kft-activiti-demo基于kft-activiti-demo 中的leave-f

最近老板心血来潮要搞基于activiti的工作流,没办法,只能现学,看了两周,一个小总结。 前提准备:
- eclipse安装acidity-designer插件
- 了解bpmn2.0基本知识
- 下载activiti,跑一跑其中demo
- 下载咖啡兔中的kft-activiti-demo


基于kft-activiti-demo 中的leave-formkey改造,主要是为了学习bpmn流程图表制作,发布流程,对应的api,相关数据库表,顺便复习下springmvc。

  1. Bpmn流程图表制作

前提熟悉基本的bpmn2.0规范,熟悉eclipse插件acitviti-desinger使用。画出流程如下:
这里写图片描述

对应图表和每个控件属性如下:(task控件中的general选项主要定义id和name,可随意填写,故没有展示)

图表:
这里写图片描述
注意id取值,这里的id就是在启动流程时根据该id获取实例,如下:

repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave-formkey")。

此id可以重复使用。因为后面要将该实例部署到kft-activiti-demo的外置表单流程中,而kft-activiti-demo中外置表单流程里一些调用sql是写死的,所以为了方便,这里直接用该id就行

Start:
这里写图片描述

注意initiator:
其作用设置一个变量名称,可以是任意的字符串,变量applyUserId保存申请用户的ID
在需要设置申请用户才能办理的任务上设置activiti:initiator
对应用户手册上两个关键函数

identityService.setAuthenticatedUserId("kafeitu")//设置当前的用户ID,而且这行代码需和activiti:initiator配合使用
runtimeService.startProcessInstanceByKey("leave")//启动流程,判断有没有activiti:initiator属性,如果有把属性activiti:initiator的值作为一个变量添加到流程实例中

班主任审批:
这里写图片描述

书记审批:
这里写图片描述

上面两个task中都定义了一个外置表单,实际上就是一个html文件,在流程流转到当前task时引擎会自动加载对应的外置表单。因为业务逻辑一样,所以这里直接copy了kft-activiti-demo 中的leave-formkey activiti diagram中的申请、审核表单。

两个task分别定义了一个candidate group name,实际上就是角色身份,就是说只要用户身份中包含teacher,schoolmaster就能签收办理该task。对应初始化sql:

insert into ACT_ID_GROUP values ('teacher', 1, '老师', 'assignment');
insert into ACT_ID_GROUP values ('schoolmaster', 1, '书记', 'assignment');

此外,还需要给用户分配group,为了方便,这里将当前用户公用一个身份,对应sql:

insert into ACT_ID_MEMBERSHIP values ('leaderuser', 'teacher');
insert into ACT_ID_MEMBERSHIP values ('leaderuser', 'schoolmaster');

上面的ACT_ID_GROUP和ACT_ID_MEMBERSHIP都是activiti自带的表,分别表示group定义和用户所属group的关系。这个在后面的数据库表中将详细介绍。

至于怎么执行sql,这里就不详细说了,kft-activiti-demo中sql目录下有h2,mysql,oracle对应的数据初始化脚本,可以把上面的数据插入其中,在首次初始化时执行,也可通过命令行或者其他工具一条条插入。

顺序流:
这里只有两条标准顺序流
同意:
这里写图片描述

注意其中的deptLeaderPass,这是在上一个班主任审批外置form中定义的一个是否同意的变量。

不同意:
这里写图片描述

End:
缺省值
这里写图片描述

最后项目生成文件:
这里写图片描述

2. 打包&部署

打包:
将上面5个文件,即bpmn文件和对应的png及相关form打包成zip,直接用eclipse自带的打包:
Export->archive file->选择保存路径->(注意option中选择save in zip format)
部署:项目启动后:
这里写图片描述

右上角点击部署流程:
这里写图片描述
选中打包的zip,点击submit

3.后台跟踪及相关数据库表

为了方便了解后台的流程,这里将每一步调用的文件及方法列出,并列出涉及的表:

3. 1.部署

/
*
部署函数
*/
me.kafeitu.demo.activiti.web.workflow.ActivitiController.java
public String deploy()
其中两个重要方法:
Deployment deployment = repositoryService.createDeployment().addZipInputStream(zip).deploy();
 List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list();

其实就是部署和列取部署的流程定义,具体函数定义可参见,下载activiti安装包中说明:
activiti-5.18.0/activiti-5.18.0/docs/javadocs/index.html
涉及表:
ACT_RE_PROCDEF(流程定义表)
ACT_RE_DEPLOYMENT(部署信息表)

3. 2.列出流程(外置表单类型)
这里写图片描述

/*
列出所有外置表单
*/
Me.kafeitu.demo.activiti.web.form.formkey.FormKeyController.java //方法所在路径
public ModelAndView processDefinitionList()
关键方法:
 ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave-formkey").active().orderByDeploymentId().desc();

涉及表:
ACT_RE_PROCDEF(流程定义表)

3. 3.启动具体流程


/*
启动实例,读取启动环节的外置表单
*/
Me.kafeitu.demo.activiti.web.form.formkey.FormKeyController.java
public Object findStartForm()
关键函数:
Object startForm = formService.getRenderedStartForm(processDefinitionId);
//根据实例id获取表单

此时弹出渲染的表单:
这里写图片描述

填写内容后,点击“启动流程”

/**
     * 读取启动流程的表单字段
     */
Me.kafeitu.demo.activiti.web.form.formkey.FormKeyController.java
 public String submitStartFormAndStartProcessInstance()

相关表:
ACT_RU_EXECUTION(执行中流程执行)
ACT_RU_VARIABLE(实时变量)
ACT_HI_VARINST(历史变量信息)
ACT_RU_IDENTITYLINK(身份联系)
ACT_HI_IDENTITYLINK(历史身份信息)
ACT_HI_PROCINST(历史流程实例信息)核心表
ACT_HI_ACTINST(活动实例信息)
ACT_HI_DETAIL(历史详细信息)

以上是该步骤涉及的重要表,还有一些表未列出,可以在程序执行的debug信息中了解到更为详尽的细节,包括sql语句,后面为了节省页面时间,也不再将列出想关表。每张表结构及信息可自行百度之。

3. 4.查看当前任务

   /**
     * task列表
     *
     * @param model
     * @return
     */
Me.kafeitu.demo.activiti.web.form.formkey.FormKeyController.java
public ModelAndView taskList()
关键函数:
根据定义的签收人或者候选group中获取满足当前用户的当前任务
 NativeTaskQuery query = taskService.createNativeTaskQuery().sql(sql)
                .parameter("processDefinitionKey", "leave-formkey").parameter("suspensionState", SuspensionState.ACTIVE.getStateCode())
                .parameter("userId", user.getId());

这里可以在函数中看看sql的具体写法。

3. 5.任务签收

 /**
     * 签收任务
     */
Me.kafeitu.demo.activiti.web.form.formkey.FormKeyController.java
public String claim()
关键函数:
taskService.claim(taskId, userId);//用户签收任务,言简意赅

3. 6.任务办理

  /**
     * 读取Task的表单
     */
Me.kafeitu.demo.activiti.web.form.formkey.FormKeyController.java
public Object findTaskForm()
关键函数:
Object renderedTaskForm = formService.getRenderedTaskForm(taskId);//读取当前task的外置表单

此时弹出渲染的表单:

这里写图片描述
执行完毕后:
这里写图片描述
这里写图片描述

当前任务变成了书记审批,因为当前用户兼顾“老师”,“书记”身份。
此后的签收办理环节同前面“班主任审核”环节类似。

3. 7.结束环节

/**
     * 办理任务,提交task的并保存form
     */
Me.kafeitu.demo.activiti.web.form.formkey.FormKeyController.java
public String completeTask()
关键函数:
identityService.setAuthenticatedUserId(user.getId());//最后环节将任务交给提交任务的用户
formService.submitTaskFormData(taskId, formProperties);
相关文章
|
调度 弹性计算 存储
拆解超算上云的障碍,阿里云用了这三招|E-HPC如何改变云超算?
2019年阿里云上海峰会,由阿里云资深技术专家何万青带来以“阿里云超算E-HPC平台”为题的演讲。本文内容包括了HPC概念及发展趋势,面向“大计算”设计的弹性基础设施,客户应用云上优化,着重介绍了E-HPC自动伸缩,闲时计算方案与混合云,数据全流程可视化以及HPC工作流与数据迁移等。
2161 0
|
搜索推荐 API 数据处理
什么是无代码?哪些人适合通过无代码来开发自己的业务系统
无代码是一种无需编程知识即可构建应用的方法。用户通过拖拽组件并设置参数,即可搭建功能完备的应用系统。其核心特点是普适性和包容性,降低了技术门槛,提供了直观界面,能快速响应需求变化,同时降低成本并具有一定的可扩展性。无代码适合一线业务人员、中小企业及专业技术人员使用,但在高度定制化、复杂逻辑处理或深度系统集成方面仍需传统开发。以草料二维码为例,无代码平台提供活码、表单、计划管理等功能,助力快速搭建各类应用系统,使每个人都能成为开发者。
|
Kubernetes 负载均衡 Cloud Native
从零开始入门 K8s | 理解 CNI 和 CNI 插件
网络架构是 K8s 中较为复杂的方面之一。K8s 网络模型本身对某些特定的网络功能有着一定的要求,因此,业界已经有了不少的网络方案来满足特定的环境和要求。CNI 意为容器网络的 API 接口,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。在本文中,作者将带领大家理解典型网络插件地工作原理、掌握 CNI 插件的使用。
从零开始入门 K8s | 理解 CNI 和 CNI 插件
|
网络协议 网络架构
网络划分的方法
一个A类IP地址是指,在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为7位,主机标识的长度为24位,A类网络地址数量较少,可以用于主机数达1600多万台的大型网络。
|
机器学习/深度学习 并行计算 Ubuntu
GPU配置太麻烦?来试试Docker一键配置GPU深度学习开发环境吧
docker环境无需安装cuda、cuDNN,docker镜像安装完毕后,就都好了,一键部署好之后,可以随意迁移,再也不用环境发愁了。
1453 1
|
C语言
《C语言<程序改错题练习合集(1)>》
《C语言<程序改错题练习合集(1)>》
1092 0
《C语言<程序改错题练习合集(1)>》
|
监控 安全 网络协议
Windows运行命令大全
运行命令即DOS命令,主要是面向[DOS](https://baike.baidu.com/item/DOS)操作系统的,以命令行的形式,靠输入命令来进行人机对话,并通过命令的形式把指令传给计算机,以实现对计算机的操作。DOS命令主要包括内部命令、外部命令和批处理命令。所有受支持的 Windows 版本(服务器和客户端)都具有内置的一组 Win32 控制台命令
|
Java 程序员 Python
Python 变量的命名规范
混乱或错误的命名不仅让我们对代码难以理解,更糟糕的是,会误导我们的思维,导致对代码的理解完全错误。相反,良好的命名,则可以让我们的代码非常容易读懂,也能向读者正确表达事物以及逻辑的本质,从而使得代码的可维护性就大大增强,读命名好的文章是非常流畅的,会有一种享受的感觉
|
JSON NoSQL Java
快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)
快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)
快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)
|
JavaScript API C++
实践:使用vue-cli搭建一个Vue3-TS的uni-app工程化项目模板(中)
实践:使用vue-cli搭建一个Vue3-TS的uni-app工程化项目模板(中)