如果我们有如下流程图需要执行,包含子流程,该怎么让每个节点领取任务呢?
当我们发起流程的时候子流程是有多实例的,所以我们需要在流程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_,需求查询表格才能知道。