最新公告
  • 新注册用户请前往个人中心绑定邮箱以便接收相关凭证邮件!!!点击前往个人中心
  • Activiti 开发案例之多实例并行子流程

    概念
    Activiti 提供了两种基于子流程的实现:
    • 一种是内嵌子流程:子流程元素 <subProcess>内嵌在主流程元素 <process>之内,只能在该流程中使用该子流程,外部是无法访问到的。这种子流程一般作为局部通用逻辑处理,或者因为特定业务需要,使得比较复杂的单个主流程设计清晰直观。
    • 另一种是调用子流程:首先实现一个流程,在另一个流程中可以调用该流程,通常可以定义一些通用的流程作为这种调用子流程,供其他多个流程定义复用。这种子流程使用 <callActivity>元素来进行调用,间接地嵌入到主流程中,用起来比较方便。

    流程图

    以上是一个公司内部合同评审的内嵌子流程流程图,一个合同的通过是需要经过多个部门的层层审核,最终才得以通过。
    • 销售发起合同评审流程
    • 进入子流程,各个部门根据实际情况进行多级审批
    • 各个部门审批通过,流程结束

    生成子流程

    XML部分代码

    1. /**
    2. * 博客 https://blog.52itstyle.vip
    3. */
    4. <subProcess id="subprocess" name="合同评审">
    5. <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee">
    6. <completionCondition>${nrOfCompletedInstances/nrOfInstances==1}</completionCondition>
    7. </multiInstanceLoopCharacteristics>
    8. <!--省略相关任务节点代码-->
    9. </subProcess>
    • collection:存放集合,集合中可以存任意值,工作流会根据你集合里的值个数,去生成对应的子流程,这里我们存放一级审批的用户ID。
    • elementVariable:节点流程变量,用于在流程图中代替集合中表示当前子流程的变量,对应子流程中第一个任务节点的变量名。
    • completionCondition:完成条件,这里写的表达式如果满足即可流转到下一步。

    发起

    成功发起之后,系统会自动生成集合数量的任务(子流程),然后在每个子流程中设置与业务流程相关的局部变量。
    1. /**
    2. */
    3. Map<String,Object> variables =newHashMap<>();
    4. //4个部门审核,生成4个流程,集合中获取并存放的是一级评审人
    5. List<String> assigneeList=Arrays.asList(newString[]{"1","2","3","4"});
    6. variables.put("assigneeList", assigneeList);
    7. ProcessInstancein= runtimeService.startProcessInstanceByKey("contract_review", variables);
    8. List<Task> list = taskService.createTaskQuery().processInstanceId(in.getId()).list();
    9. System.out.println("任务数量:"+list.size());
    10. list.forEach(task ->{
    11. /**
    12. * 模拟几级审批(正式环境要从配置或者数据库读取),因为这里要清楚每个部门走几级审批逻辑
    13. * 变量存放到每个任务节点的全局任务变量中
    14. */
    15. Random r =newRandom();//创建随机种子,Random对象
    16. int rank = r.nextInt(3)+1;
    17. System.out.println("任务ID:"+task.getId());
    18. System.out.println("指派人ID:"+task.getAssignee());
    19. taskService.setVariableLocal(task.getId(),"rank",rank);
    20. });

    审核

    这里只说几个比较重要的点,大家可以根据自身业务场景处理。
    1. /**
    2. *
    3. */
    4. //获取当前任务
    5. Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    6. //获取当前任务Code
    7. String taskCode = task.getTaskDefinitionKey();
    8. //获取当前任务流转唯一ID
    9. String executionId = task.getExecutionId();
    10. //获取当前子流程任务变量
    11. Object rank = taskService.getVariableLocal(task.getId(),"rank");
    12. //认领任务
    13. variables.put("approve",rank);
    14. taskService.claim(taskId, userId);
    15. taskService.complete(taskId, variables);
    16. //这里要判断当前子流程是一级审批、如果是二级审批或者三级审批还需要获取下级任务节点
    17. task = taskService.createTaskQuery().executionId(executionId).active().singleResult();
    18. //指派任务
    19. taskService.addCandidateUser(task.getId(),reviewUserId);

    小结

    子流程的概念用途还是比较广泛的,基本上企业内部涉及到多部门合作的流程都有可能用到,这里需要注意的是,由于业务类型不同,每个子流程的相关逻辑判断也可能不同,这就需要在每个子流程中存储流程变量,用于各级流程逻辑判断。
    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » Activiti 开发案例之多实例并行子流程

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    参与讨论

    • 155会员总数(位)
    • 3735资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 382稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级