activiti7实战教材(二)子流程任务的领取

  • Post author:
  • Post category:其他


如果我们有如下流程图需要执行,包含子流程,该怎么让每个节点领取任务呢?

当我们发起流程的时候子流程是有多实例的,所以我们需要在流程bpmn文件中有这样一句话。如下代码第三行,代表是一个多实例,实例的集合存在deptList里面,当发起子流程的时候,子流程通过循环deptList集合,循环出的单个对象名称是dept,有多少各dept就有多少个子流程。

    <bpmn2:subProcess id="Activity_17b9hl2">
      <bpmn2:incoming>Flow_0i6moug</bpmn2:incoming>
      <bpmn2:outgoing>Flow_1ehcjfv</bpmn2:outgoing>
      <bpmn2:multiInstanceLoopCharacteristics activiti:collection="${deptList}" activiti:elementVariable="dept" />
      <bpmn2:startEvent id="Event_1h1iil1" name="开始">

发起流程的时候需要传递这个集合变量

//发起流程
processRuntime.start(ProcessPayloadBuilder
        .start()
        .withProcessDefinitionKey("***")
        .withBusinessKey(businessId)
        .withName("***流程")
        .withVariable("taskOver",false)
        .withVariable("postCode","***")
        .withVariable("deptList",deptList)
        .build());

deptList中存储的就是所有需要进行子流程的部门。

所有节点我们可以根据部门和岗位来确定任务领取人。

第一个节点和第二节点的部门就是

<bpmn2:multiInstanceLoopCharacteristics activiti:collection=”${deptList}” activiti:elementVariable=”dept” />里面的dept。

第三节点和第四节点的部门是B部门的id。

关键是从第三节点驳回到第一节点的时候如何确定部门。不能从当前登陆人的部门来获取,因为我们当前登陆人是B部门,要驳回到A部门,这里的A部门是一个代称,因为有很多的子流程,所以有A1部门,A2部门……

B部门是固定的,但是你如何确定自己驳回的是A1部门,而不是A2部门呢?

这里就需要用到刚开始的发起流程的时候的流程变量deptList。发起流程的时候是deptList,但是进入子流程的时候,就迭代出dept,这是我们在bpmn文件中定义了的。

我们通过从activiti流程变量服务中取出当前数据的部门,进行精准定位。


核心代码如下:

String dept= (String) taskService.getVariable(taskId, "dept");

调用服务taskService,taskId是当前任务的id,是activiti工作流自动生成的,dept是我们在bpmn中定义的元素变量。


如果不调用服务,我们可以自己写sql进行查询。

<select id="selectDeptidByTASKID" parameterType="String" resultType="String">
    select TEXT_ from ACT_RU_VARIABLE where TASK_ID_=#{taskid} and NAME_=#{name_}
</select>

其中taskid就是当前任务的id,name就是我们定义的变量名字,也就是dept。最后得出来的结果是当前数据的部门。当然如果我们存的是string类型,就是获取TEXT_,如果是其他类型就不是获取TEXT_,需求查询表格才能知道。



版权声明:本文为weixin_55988085原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。