Activiti流程框架_项目实战01关联业务

读Activiti有感

  网上挺多关于activiti基于junit4的测试实例,通过实例测试,我们可以方便地了解到activiti是如何通过Api控制27张表(以act_开头的表)的CURD,但是在结合项目的使用过程中,你就会发现,这些测试实例其实都较为肤浅,只适合在认知阶段和测试阶段帮助用户理解activiti的API使用方法和确保流程模型在执行过程中的准确性,而真正用在项目开发中时,就会感觉到比较鸡肋。刚巧最近有个项目需求,要求在原有的springBoot项目中嵌入审批流程,所以该篇之后的篇幅都会结合项目进行讲解Activiti,那么难免在项目的开展中会碰到了一些棘手的困难,在给出解决方案之前,先提出几个问题:
1、业务表如何与流程进行关联;
2、有一张业务表tableA,因为项目较为紧急,tableA中的数据在审批流程未开发出来前,就已经由人为地插入有效的业务数据,这时候有什么办法在不改变tableA表结构的前提下,将业务表和流程进行关联;
3、多业务如何与流程进行关联;
4、如何在一个业务申请模块中统一管理所有业务申请入口,以及它们的申请进度情况查询;
5、流程表单包括内置表单、外置表单、普通表单,那么项目的表单使用更倾向于哪类表单,为什么?如何使用?
6、简单的业务如何从流程模型中获取用户任务表单的输出线上名称,用于作为用户任务表单的控制按钮名称?
7、如何使用一个controller(Spring MVC框架)管理所有的业务流程的申请转向;
8、流程进度情况图如何生成;
9、用户任务的办理人一般情况下,是通过动态生成的,那么什么时候生成较为合适?怎么生成?是赋值给assignee,还是candidateUsers,又或者candidateGroup呢?
10、当流程到达某个用户任务节点时,如何通过邮件通知领导审批呢?
  以上是我在流程业务的开发过程中,针对新手总结的一些比较抽象的存在问题,当然这只是问题中的一部分,在开发的过程中还会遇到各种意想不到的问题,但是只要我们静下心来,多思考,终会得到解决的办法。在之后的篇幅中我会结合实际项目,对以上的问题给出实际方案(当然方案不止一种,希望有幸拜读的朋友,能够结合自己的经验给出点评,给出新的方案)。

关联业务

  上篇中介绍了springBoot项目整合Activiti时出现的一些问题,这篇作为实际应用的开篇,我们先来聊聊怎么在流程中关联业务,翻开27张表(act_*)你会发现act_ru_execution、act_hi_procinst这两张表中都有一列名叫business_Key_,可以知道activiti在设计之初就已经为我们考虑到关联业务的问题,专门提供相关列来存储业务关联信息,以act_ru_execution表为例:
在这里插入图片描述
  既然底层已有表提供了对业务关联的支持,那么在activiti的Api中同样会提供相应的方法帮助实现业务和流程关联,那么通常就会想在流程的哪个节点阶段关联业务会更加合理呢?当然从相关Api方法中我们可以得出答案,那就是在启动流程的同时关联业务;具体实现业务管理的Api方法有:
在这里插入图片描述
  在这么多启动流程相关的Api中,比较常用在项目中的是红色标注的两个方法startProcessInstanceById(启动指定版本)和startProcessInstanceByKey(启动Key的最新版,更为常用),在它们的参数列表中包含了字符串类型的businessKey是用于传入业务的唯一标识,那么businessKey应该怎样构造呢?下面将给出你想要的答案哦;

业务存储和businessKey构造的关系

在这里插入图片描述
  这里考虑到业务的存储方式有两种(纯属个人在项目中开发的总结);

  • 第一种模式,采用一张业务状态表与多个业务表关联,它们是属于一对一的关系,所以业务状态表可以和多张业务表共同使用相同的唯一标识Id作为主键,而这个Id可以由业务状态表在插入数据的时候由Mybatis自动生成,见下图,然后再将生成的Id结合业务字段插入到业务表中进行关联,在这种情况下构建businessKey时,可以使用“业务名称:ID”或者“ID”模式;
    在这里插入图片描述
//方法一、commonBusienssService是所有业务Service的父接口
String simpleName=commonBusinessService.getSimpleName();
String businessKey=simpleName+":"+id;
//方法二、String businessKey=id;
  • 第二种模式,将业务状态作为字段插入到各个业务表中,那么这个时候的业务ID是在各业务表在插入数据时由Mybatis自动生成,这种情况下,我建议businessKey采用“业务名称:ID”模式,因为这种情况下各个业务表的ID之间是存在重复的情况,所有加上业务名称可以保证唯一性,方便我们在查流程表时,容易识别流程实例具体是同那张业务关联;
      由于我在流程开发的过程中,业务表已经创建,为了不去修改原有的业务表,我采用了第一种存储模式,这时候就需要自己另外创建一张业务状态表(该表在统一管理业务申请时,也能体现出作用)进行业务关联,在业务状态表的创建语句中可以看出我并没有给出业务的启动日期start_time和结束日期end_time列,因为这两列可以从流程表act_hi_procinst中关联获取;
CREATE TABLE tb_mfgportal_business_status (
  id                NUMBER        NOT NULL, --业务状态Id
  business_name     VARCHAR2(100) NULL, --业务名称
  current_node_name VARCHAR2(100) NULL, --当前节点名称
  status            VARCHAR2(10)  NULL, --状态 0:初始化,1:审核中,2:退回中,3:撤销申请,4:通过申请
  operator          VARCHAR2(20)  NULL, --当前节点的办理人员
  employee_no       VARCHAR2(20)  NULL  --业务的发起人
)

act_hi_procinst:
在这里插入图片描述
最后,采用businessKey=”业务状态Id”的形式进行流程与业务关联;

//启动流程
runtimeService.startProcessInstanceByKey(processDefinitionKey, new Integer(bs.getId()).toString(), variables);

到此,我们在解决业务关联的问题中,同时也给出了问题2、3、4的答案;
问题2:创建业务状态表,让业务状态表作为中间表与流程关联;
问题3:业务的存储方式决定了businessKey的构造方式;
问题4:直接通过查询业务状态表来获取所有申请业务的进度情况;

总结

1、 在项目开发的过程中,流程都是与业务关联的,不能独立存在;
2、 关联业务的businessKey构造原则:保持唯一性;
(注:更多有关activiti的项目开发内容请等下次更新,欢迎点评,共同进步哦!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值