activiti 将List<Task>转成json如何做,其中Task为接口

activiti 将List<Task>转成json如何做,其中Task为接口,第1张

Activiti中提供了多实例任务(for-each)将多实例应到到UserTask中可以实现会签功能。

一多实例用户任务的XML表示:

Xml代码

<userTask id="task" name="多实例任务">

<multiInstanceLoopCharacteristics isSequential="false">

<loopDataInputRef>assigneeList</loopDataInputRef>

<inputDataItem name="assignee"></inputDataItem>

<!-- userIdList[user1,user2,user3] -->

<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 06}</completionCondition>

</multiInstanceLoopCharacteristics>

</userTask>

<userTask id="task" name="多实例任务">

<multiInstanceLoopCharacteristics isSequential="false">

<loopDataInputRef>assigneeList</loopDataInputRef>

<inputDataItem name="assignee"></inputDataItem>

<!-- userIdList[user1,user2,user3] -->

<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 06}</completionCondition>

</multiInstanceLoopCharacteristics>

</userTask>

在每个多实例创建后都会有3个变量

nrOfInstances 实例总数

nrOfActiveInstances 当前还没有完成的实例

nrOfCompleteInstances 已经完成的实例个数

multiInstanceLoopCharacteristics 是用了指定用户任务为多实例任务,isSequential

指定多实例是按照并行或者串行的方式进行,如果使用串行方式nrOfActiveInstances 变量始终是1

loopDataInputRef

指定一个流程变量的引用,该变量是一个List,可以在发起或这执行任务之前作为流程变量放到引擎中,该list中的每一个元素将创建一个任务。元素的值通过

inputDataItem 元素的指定的变量来获取

如 在这个实例中 assigneeList =

ArraysasList("liyagn","cooperay","other"); 这会创建3个用户任务,每个用户任务中都有一个 assignee

的变量,来分别得到list中的值。

completionCondition 结束任务的条件,该示例中是任务完成 60% 结束

二给用户任务指定代理人

xml表示:

Xml代码

<userTask id="thisTask2" name="myTask2">

<humanPerformer>

<resourceAssignmentExpression>

<formalExpression>liyang</formalExpression>

</resourceAssignmentExpression>

</humanPerformer>

</userTask>

<userTask id="thisTask2" name="myTask2">

<humanPerformer>

<resourceAssignmentExpression>

<formalExpression>liyang</formalExpression>

</resourceAssignmentExpression>

</humanPerformer>

</userTask>

上面的描述将该用户任务分配给用户 liyang 可以通过

taskServicecreateTaskQuerytaskAssignee("liyang")list();来获取该任务

三通过上面两部 将 用户任务做成了多任务,也可以将 任务分配给指定的代理人,现在只用将上面两个步骤进行结合

在第一步中我们知道变量 assignee 是 会签人员的标识,只需要将指定代理人的地方用表达式来指定 assignee 变量就行了

完整XML:

Xml代码

<userTask id="thisTask2" name="myTask2">

<humanPerformer>

<resourceAssignmentExpression>

<formalExpression>${assignee}</formalExpression>

</resourceAssignmentExpression>

</humanPerformer>

<multiInstanceLoopCharacteristics isSequential="false">

<loopDataInputRef>assigneeList</loopDataInputRef>

<inputDataItem name="assignee"></inputDataItem>

<!-- userIdList[user1,user2,user3] -->

<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 06}</completionCondition>

</multiInstanceLoopCharacteristics>

</userTask><SPAN style="WHITE-SPACE: pre"> </SPAN>

<userTask id="thisTask2" name="myTask2">

<humanPerformer>

<resourceAssignmentExpression>

<formalExpression>${assignee}</formalExpression>

</resourceAssignmentExpression>

</humanPerformer>

<multiInstanceLoopCharacteristics isSequential="false">

<loopDataInputRef>assigneeList</loopDataInputRef>

<inputDataItem name="assignee"></inputDataItem>

<!-- userIdList[user1,user2,user3] -->

<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 06}</completionCondition>

</multiInstanceLoopCharacteristics>

</userTask>

完工。

Activiti Modeler用于保存BPMN规范相关的对象,例如可用于将这些模型转换为相应的流程图对象:

              // 创建一个BPMN模型实例

           BpmnModel bpmnModel = new BpmnModel();

           // 创建流程

           Process process = new Process();

           processsetId("myProcess");

           bpmnModelgetProcesses()add(process);

           // 创建任务

           UserTask task = new UserTask();

           tasksetId("myTask");

           processaddFlowElement(task);

           // 设置任务的图形信息

           GraphicInfo g1 = new GraphicInfo();

           g1setHeight(100);

           g1setWidth(200);

           g1setX(110);

           g1setY(120);

           bpmnModeladdGraphicInfo("myTask", g1);

           // XML转换器,将BPMN模型转换为XML文档

           BpmnXMLConverter converter = new BpmnXMLConverter();

           Systemoutprintln(new String(converterconvertToXML(bpmnModel)));

参考自《疯狂工作流讲义第2版(Activiti6)》。

act_re_model 用于存放流程模型

act_re_procdef 用于存放流程定义

act_re_deployment 用于存放流程部署

act_ge_bytearray 用于存放各种二进制文件信息(包括流程模型的json,流程定义的xml以及他们各自对应的预览图以及流程进行中的数组参数)

act_re_procdef中会记录该流程定义所对应的部署id

同时,act_ge_bytearray中会记录流程定义所对应的xml和预览图(通过bytearray表中的deploymentId来记录),NAME字段会明确写出是xml还是预览图

也会记录流程模型所对应的json和预览图(act_re_model表中,EDITOR_SOURCE_VALUE_ID_记录的是json,EDITOR_SOURCE_EXTRA_VALUE_ID_记录的是预览图,都对应是act_ge_bytearray表中的ID)

execution是流程实例中的执行器,会有不止一个。

首先要说明,execution和task是两个独立的概念。

每一个节点正在进行的时候,必然会有一个execution停留在这个节点上,但是未必会有task

只有task类节点(如UserTask/EmailTask等等)会生成task(进行中的task存在act_ru_task表中),所以用task是否存在来判断该节点是否在进行是不妥当的。

但是task类节点通常会阻塞,等待人为调用接口来让其流转(最典型的就是UserTask),所以流转的接口才需要传入task。

这时候,task会进入act_hi_taskinst表中。

0首先一个流程实例启动,必然会有一个根execution(我们后面称为exec0)

1随后,exec0会生成一个子exec1并放置于流程图的开始节点(可以在act_ru_execution表中找到,父子execution使用表中的PARENT_ID_进行关联)。

2接着,exec1会根据流程图向前走。如果遇到并行网关,则会分裂。这里假设并行网关有两条支线,则会分裂出一个exec2

exec1和exec2分别走向并行网关的两条支线。最后在并行网关会合时,exec2被销毁。exec1继续复用,走下面的流程。

3根据流程图的不同,execution会分裂出若干个同级/子exection。例如上文提到的并行网关,以及后面要讲解的“调用活动”(callActivity)

下面有一个callActivity对应的例子图,可以参考。

未完待续

在流程资源文件中,每一个节点元素在activiti中都有对应的元素属性承载类,比如,UserTask任务节点,它的元素属性承载类为UserTask,相同,startEvent开始节点的元素承载类为StartEvent,在bpmn流程文件进行解析时,也是将xml文档中每个元素解析为对应的承载类,从而进行组装成一个BmpnModel模型,我们可以直接由activiti将bpmn xml文件解析为一个实例模型(下图所示),也可以完成通过自定义手动创建模型。

关于模型校验器更多细节可查看 activiti源码剖析之BpmnModel模型校验器

公司业务需求要求显示流程图的执行的线路高亮

然后就开始了漫长的复制粘贴之旅

因为activiti不会对走过Flow进行记录,只对活动做记录,基本思路就是通过historyService可以获取到所有的HistoricActivityInstance,然后通过活动顺序再获取到执行过的flowId

但是这里有一个巨坑,这个HistoricActivityInstance是无序的,里面并没有字段可以对其进行排序,网上有很多文章说是用开始时间进行排序

但这是根本就是扯淡,开始时间根本不能排序,因为很多活动都是一瞬间完成的,开始时间是完全相同的,比如开始事件和第一个活动,比如排他网关和执行的下一个活动,所以根本无法排序,同理结束时间也无法进行排序。

还有很多文章写了很复杂的算法来获取到执行过的线路,但是都是没有用,不是少了就是多了。

最后仔细的研究了HistoricActivityInstance这个类,发现其实是有规律的,那就是一个活动结束的时间是和下一个执行的活动的开始时间,如果当前Activity的结束时间和下一个Activity的开始时间相等两个活动中间的Flow就走过,知道原理就好办了。

添加流程变量

1、在启动流程实例时,可以添加流程变量。

1) 在启动流程实例时,通过重载startProcessInstanceByKey的方法可以加载流程变量。

2) 第二个参数要求是Map<String ,Object>类型,可以添加多个流程变量。

3) 这段代码执行完,会在数据库表act_ru_variable中添加两行记录。

2、在办理任务时,任务办理完成后,要传递一些信息到系统中。这个时候可以利用TaskService这个类来添加流程实例。public void setVar() throws Exception { String processInstanceId = "1901"; Task task =taskServicecreateTaskQuery()taskAssignee("manager")processInstanceId(processInstanceId )singleResult();// String taskId / 在办理过程中设

说明:

1) 利用setVariables方法在任务办理过程中添加一批流程变量。

2) 利用setVariable方法在任务办理过程中添加一个流程变量。

3) TaskService有一个重载 complete方法

3、执行流程实例时直接在Execution上设置流程变量

获取流程变量可以通过runTimeService的方法来获取流程变量。

说明:流程变量是从act_ru_variable这个表中读出来的。

以上就是关于activiti 将List<Task>转成json如何做,其中Task为接口全部的内容,包括:activiti 将List<Task>转成json如何做,其中Task为接口、如何使用activiti modeler、activiti要点纪要等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9635542.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存