• Flowable并行网关的使用


    并行网关

    并行网关使用:并行网关开始,创建多个分支,每个分支都要执行,最后再汇聚到并行网关。

    并行网关中不能设置流条件,设置了也被忽略

    业务功能

            用户创建申请流程,先经过组长审批,组长审批未通过就发送拒绝邮件,然后结束,组长审批通过,则有项目组长和部门经理审批,必须二人都同意,才通过,有一人不同意则发送拒绝邮件。

    流程图

    项目组长审批:如果审批通过,则设置参数 projectZZAgree == true,否则设置为false

    部门经理审批:如果审批通过,则设置参数 bmAgree == true,否则设置为false

    流条件设置

    在排它网关结束后面进行流条件判断

    • 流条件中设置${projectZZAgree==true&bmAgree==true} --> 如果两人审批都通过则执行流程
    • 流条件中设置${projectZZAgree==false||bmAgree==false} --> 如果有一人不通过则不执行流程

    代码实现

    1. import org.flowable.engine.RuntimeService;
    2. import org.flowable.engine.TaskService;
    3. import org.flowable.engine.runtime.ProcessInstance;
    4. import org.flowable.task.api.Task;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.PathVariable;
    8. import org.springframework.web.bind.annotation.RestController;
    9. import java.util.HashMap;
    10. import java.util.List;
    11. import java.util.Map;
    12. @RestController
    13. public class ParallelController {
    14. @Autowired
    15. private RuntimeService runtimeService;
    16. @Autowired
    17. private TaskService taskService;
    18. /**
    19. * 创建流程实例
    20. */
    21. @GetMapping("/createInstance/{username}/{day}")
    22. public String createInstance(@PathVariable String username, @PathVariable Integer day) {
    23. // 创建流程要携带的参数
    24. Map variables = new HashMap<>();
    25. variables.put("people", username); // 报销申请人
    26. variables.put("reason", "有事情"); // 报销原因
    27. variables.put("day", day); // 请假天数
    28. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("请假流程", variables);
    29. // 输出相关的流程实例信息
    30. System.out.println("流程实例的ID:" + processInstance.getId());// 流程实例的Id --> 5001
    31. System.out.println("流程创建成功");
    32. return username + "创建流程实例成功";
    33. }
    34. /**
    35. * 组长同意
    36. */
    37. @GetMapping("/agree/headman/{username}")
    38. public String completeTaskZZ(@PathVariable String username) {
    39. List l = taskService.createTaskQuery()
    40. .processDefinitionKey("请假流程")
    41. .taskAssignee(username)
    42. .list();
    43. Task task = l.get(0);
    44. Map variable = new HashMap<>();
    45. variable.put("zzAgree", true);
    46. System.out.println("组长同意");
    47. // 完成任务
    48. taskService.complete(task.getId(), variable);
    49. return username + "同意";
    50. }
    51. /**
    52. * 项目组长同意
    53. */
    54. @GetMapping("/agree/manager/{username}")
    55. public String completeTaskJL(@PathVariable String username) {
    56. List l = taskService.createTaskQuery()
    57. .processDefinitionKey("请假流程")
    58. .taskAssignee(username)
    59. .list();
    60. Task task = l.get(0);
    61. Map variable = new HashMap<>();
    62. variable.put("projectZZAgree", true);
    63. System.out.println("项目组长同意");
    64. // 完成任务
    65. taskService.complete(task.getId(), variable);
    66. return username + "同意";
    67. }
    68. /**
    69. * 部门经理同意
    70. */
    71. @GetMapping("/agree/boss/{username}")
    72. public String completeTask(@PathVariable String username) {
    73. List l = taskService.createTaskQuery()
    74. .processDefinitionKey("请假流程")
    75. .taskAssignee(username)
    76. .list();
    77. Task task = l.get(0);
    78. Map variable = new HashMap<>();
    79. variable.put("bmAgree", true);
    80. System.out.println("部门经理同意");
    81. // 完成任务
    82. taskService.complete(task.getId(), variable);
    83. return username + "同意";
    84. }
    85. /**
    86. * 组长拒绝
    87. */
    88. @GetMapping("/reject/headman/{username}")
    89. public String rejectTask(@PathVariable String username) {
    90. List l = taskService.createTaskQuery()
    91. .processDefinitionKey("请假流程")
    92. .taskAssignee(username)
    93. .list();
    94. Task task = l.get(0);
    95. Map variable = new HashMap<>();
    96. variable.put("zzAgree", false);
    97. System.out.println("组长拒绝");
    98. // 完成任务
    99. taskService.complete(task.getId(), variable);
    100. return username + "拒绝";
    101. }
    102. /**
    103. * 项目组长拒绝
    104. */
    105. @GetMapping("/reject/manager/{username}")
    106. public String rejectTaskJL(@PathVariable String username) {
    107. List l = taskService.createTaskQuery()
    108. .processDefinitionKey("请假流程")
    109. .taskAssignee(username)
    110. .list();
    111. Task task = l.get(0);
    112. Map variable = new HashMap<>();
    113. variable.put("projectZZAgree", false);
    114. System.out.println("项目组长拒绝");
    115. // 完成任务
    116. taskService.complete(task.getId(), variable);
    117. return username + "拒绝";
    118. }
    119. /**
    120. * 部门经理拒绝
    121. */
    122. @GetMapping("/reject/boss/{username}")
    123. public String rejectTaskLB(@PathVariable String username) {
    124. List l = taskService.createTaskQuery()
    125. .processDefinitionKey("请假流程")
    126. .taskAssignee(username)
    127. .list();
    128. Task task = l.get(0);
    129. Map variable = new HashMap<>();
    130. System.out.println("部门经理拒绝");
    131. variable.put("bmAgree", false);
    132. // 完成任务
    133. taskService.complete(task.getId(), variable);
    134. return username + "拒绝";
    135. }
    136. }

    测试

    创建流程实例

    http://localhost:8081/createInstance/%E6%9D%8E%E6%98%BE%E8%B5%AB/3

    组长同意

    http://localhost:8081/agree/headman/%E6%9D%8E%E6%98%BE%E8%B5%AB1%E5%8F%B7

    项目组长拒绝

    ehttp://localhost:8081/reject/manager/%E6%9D%8E%E6%98%BE%E8%B5%AB2%E5%8F%B7

    部门经理同意

    http://localhost:8081/agree/boss/%E6%9D%8E%E6%98%BE%E8%B5%AB3%E5%8F%B7

    输出结果

    1. 流程实例的ID:7557
    2. 流程创建成功
    3. 组长同意
    4. 项目组长拒绝
    5. 部门经理同意
    6. 发送拒绝邮件
  • 相关阅读:
    [MySql]初识数据库与常见基本操作
    Android 移动记账管理系统
    x210项目重新回顾之十七升级到linux4.19.114 +buildroot2018再讨论
    android系统目录结构
    Vue研习录(08)——Vue引入Swiper知识详解及示例分析
    可持久化数据结构(待补)
    停车场无人值守管理系统
    Jenkins权限配置和构建VUE项目
    ALEXNET论文及其复现代码
    镜头相关知识
  • 原文地址:https://blog.csdn.net/m0_56750901/article/details/126705589