在计算机尚未普及时,许多工作流程采用手工传递纸张表单的方式,一级一级审批签字,工作效率非常低下,对于数据统计以及生成报表的功能,需要经过大量的手工操作才能实现。随着电脑的普及,这些工作的参与者只需要在电脑的系统中填入工作内容,系统就会按照定义好的流程自动执行,各级审批者可以得到工作的信息并作出相应的审批和管理操作,数据统计和报表的生成均由系统代为完成,这样大大提高了工作效率,在这种背景下,各种的工作流应用以及中间件应运而生。
Activiti的好处是简化了数据库的存储方式,对于一个步骤繁琐的工作流程,使用Activiti之后程序员可以不用关注工作流中每一步所对应的流程变量的存储,不用单独开很多表结构去存储工作流每一步所对应的流程变量。缺点是因为所有的历史流程变量数据全部存在一张表中,一旦业务需求发生变更则需要做一些表连接去查询数据。实际工程项目中使用较多的查询包括用户待办任务查询、已办任务查询、所有经手任务查询、流程信息跟踪查询等等。现将部分复杂查询的实现过程记录如下:
1、待办任务查询
业务场景:
1.用户A可以受理一个案件(即启动工作流)
2.在启动工作流时用户A需要填写一张表,其数据会保存进历史流程变量表里,此时用户A有一个 待办任务T
3.用户A点击“待办任务”菜单, 获得用户A名下所有的待办任务列表以及相关联的流程变量
4.用户A可以办理 待办任务T,页面需要回显 待办任务T对应的表单,即用户A启动流程时填写过的表单
5.用户A检查自己填写过的字段,若发现有问题的字段可以修改该字段的内容,并点击保存结束该步骤
6.此时用户A的 已办任务列表应该更新为最新的流程变量内容,工作流进行到下一步,由后面用户继续完成
用到的表
- ACT_RU_TASK(运行时任务)
- ACT_RE_PROCDEF(已部署的流程定义)
- ACT_HI_VARINST(历史的流程运行中的变量信息)
思路:
(1)每一个流程都有唯一的标识符,保存在ACT_RE_PROCDEF表的ID_字段里,比如劳动监察执法流程的ID_即为KEY_case:1:630005,其中,key_case为事先定义好的流程标识符。利用这个ID可以查询出该流程正在运行的任务有哪些
(2)因为同一份流程变量在开始节点和工作流UserTask1节点保存了两份,并且后一份流程变量可能更新前面的流程变量,所以需要取到最新的流程变量,根据ACT_HI_VARINST表ID_字段增加的特点,取ID_大的那一份流程变量即可(考虑使用PARTITION BY)
(3)根据PROC_INST_ID_将任务节点与任务节点对应的流程变量关联起来,需要查询几个字段就需要做几次连接
以测试员工1为例,查询测试员工1的待办任务对应的SQL语句如下:
select
f.*,
p.NAME_ PNAME_,
p.DGRM_RESOURCE_NAME_,
case_id.TEXT_ CASE_ID_,
case_type.TEXT_ CASE_TYPE_,
tsr.TEXT_ TSR_,
btsdw.TEXT_ BTSDW_,
phone.TEXT_ PHONE_,
ssjd.TEXT_ SSJD_
from
ACT_RU_TASK f
left join
ACT_RE_PROCDEF p
on