启动流程到完成所有任务之间的数据库变化(简略版)
(1)部署后:
act_re_deployment表中会有一条部署记录,记录这次部署的基本信息。
act_ge_bytearray表中有两条记录,记录的是本次上传的bpmn文件和对应的图片文件,与act_re_deployment表的外键关联。
act_re_procdef表中有一条记录,记录的是该bpmn文件包含的基本信息,与act_re_deployment表外键关联。
(2)启动流程后:
act_ru_execution表中插入一条记录,记录流程定义的执行实例,与流程定义的id外键关联。
act_ru_task插入一条记录,记录的是第一个任务的信息,也就是开始执行第一个任务。与act_ru_execution表(执行表)execution_id(流程执行id)和proc_inst_id(流程实例id)关联。
act_hi_procinst表插入一条记录,记录本次执行实例的历史记录。
act_hi_taskinst表插入一条记录,记录本次执行任务的历史记录。
(3)任务节点完成后:
act_ru_variable表中插入变量信息,包含本次流程的执行(execution)、实例(procinst)两个id外键(注意:taskService.setVariable和taskService.setVariableLocal方法的区别:前者设置的是全局变量,整个流程都可以用,后者在任务节点完成后相关变量就会删除)
act_ru_task表中原来的任务节点记录被删除,插入新的节点记录。
act_ru_execution表中的记录并没有删除,而是将正在执行的任务变成新的用户任务。
act_hi_varinst和act_hi_taskinst插入历史记录。
(4)流程完成后:
act_ru_task、act_ru_execution、act_ru_variable表全被清空
什么是会签?
在流程业务管理中,任务通常是由一个人去处理的,而多个人同时处理一个任务,称之为会签任务。
会签的种类?
(1) 按数量通过:达到一定数量的通过表决后,会签通过。
(2) 按比例通过:达到一定比例的通过表决后,会签通过。
(3) 一票否决:只要有一个表决是否定的,会签否决。
(4) 一票通过:只要有一个表决通过的,会签通过。
Activiti实现会签?
Activiti实现会签是基于多实例任务,将节点设置成多实例,主要通过在UserTask节点的属性上配置。
UserTask节点属性
Multil instance:(多实例)有以下几个属性
Sequential:执行顺序,必选项。true:多实例顺序执行。false:多实例并行。
loop cardinality:循环基数(实例数量),可选项。可填整数,表示会签的人数。
Collection:集合,可选项。会签人数的集合list,与loop cardinality二选一。
Element variable:元素变量。选择Collection时必选,为collection集合每次遍历的元素。
Completion condition:完成条件,可选项。
会签环节中设计的几个默认流程变量
(1) nrOfInstances(numberOfInstances):会签中总共的实例数
(2) nrOfCompletedInstances:已经完成的实例数量
(3) nrOfActiviteInstances:当前还没有完成的实例数量
Completion condition,完成条件表达式
${nrOfInstances == nrOfCompletedInstances} 表示所有人员审批完成后会签结束。
${ nrOfCompletedInstances == 1}表示一个人完成审批,该会签就结束。
Activiti会签有个特性,比如设置一个人完成后会签结束,那么其他人的代办任务都会消失。
任务监听:为了更好的实现会签可以结合监听功能处理,非必选项。
监听种类:
Java class,其他不说
监听的触发条件:
(1) create:任务创建的时候触发监听
(2) Assignment:设置受理人的时候触发监听
(3) Complete:任务完成的时候触发监听(每个受理人完成时都会触发)
(4) All:以上三种事件都会触发监听
监听实现:
监听的类需要实现TaskListener接口,重写notify方法
添加监听
会签人员完成任务后(Complete),需要统计该任务的审批结果,判断最终该会签是通过还是拒绝
Activiti串行和并行的区别:
并行:审批人同时收到任务,可以同时处理,不受各自的影响。
串行:一人完成后再由另一个人处理,每个任务依赖于上一个任务完成。
读取bpmn.xml文件获取BpmnModel对象的方法:
(1)InputStream读取xml文件字节流:常用两种方式:1.FileInputStream(new File())2.ByteArrayInputStream(Byte[]);
(2)创建XMLStreamReader对象:
通过XMLInputFactory对象创建:XMLInputFactory.newInstance().createXMLStreamReader(InputStream);
(3)创建BpmnModel对象:
通过BpmnXMLConverter对象:new BpmnXMLConverter.converterToBpmnModel(XMLStreamReader);