Flowable并行网关的使用

并行网关

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

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

业务功能

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

流程图

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

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

流条件设置

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

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

代码实现

import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class ParallelController {
    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    /**
     * 创建流程实例
     */
    @GetMapping("/createInstance/{username}/{day}")
    public String createInstance(@PathVariable String username, @PathVariable Integer day) {
        // 创建流程要携带的参数
        Map<String, Object> variables = new HashMap<>();
        variables.put("people", username); // 报销申请人
        variables.put("reason", "有事情"); // 报销原因
        variables.put("day", day); // 请假天数
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("请假流程", variables);
        // 输出相关的流程实例信息
        System.out.println("流程实例的ID:" + processInstance.getId());// 流程实例的Id --> 5001
        System.out.println("流程创建成功");
        return username + "创建流程实例成功";
    }

    /**
     * 组长同意
     */
    @GetMapping("/agree/headman/{username}")
    public String completeTaskZZ(@PathVariable String username) {
        List<Task> l = taskService.createTaskQuery()
                .processDefinitionKey("请假流程")
                .taskAssignee(username)
                .list();
        Task task = l.get(0);
        Map<String, Object> variable = new HashMap<>();
        variable.put("zzAgree", true);
        System.out.println("组长同意");
        // 完成任务
        taskService.complete(task.getId(), variable);
        return username + "同意";
    }

    /**
     * 项目组长同意
     */
    @GetMapping("/agree/manager/{username}")
    public String completeTaskJL(@PathVariable String username) {
        List<Task> l = taskService.createTaskQuery()
                .processDefinitionKey("请假流程")
                .taskAssignee(username)
                .list();
        Task task = l.get(0);
        Map<String, Object> variable = new HashMap<>();
        variable.put("projectZZAgree", true);
        System.out.println("项目组长同意");
        // 完成任务
        taskService.complete(task.getId(), variable);
        return username + "同意";
    }

    /**
     * 部门经理同意
     */
    @GetMapping("/agree/boss/{username}")
    public String completeTask(@PathVariable String username) {
        List<Task> l = taskService.createTaskQuery()
                .processDefinitionKey("请假流程")
                .taskAssignee(username)
                .list();
        Task task = l.get(0);
        Map<String, Object> variable = new HashMap<>();
        variable.put("bmAgree", true);
        System.out.println("部门经理同意");
        // 完成任务
        taskService.complete(task.getId(), variable);
        return username + "同意";
    }

    /**
     * 组长拒绝
     */
    @GetMapping("/reject/headman/{username}")
    public String rejectTask(@PathVariable String username) {
        List<Task> l = taskService.createTaskQuery()
                .processDefinitionKey("请假流程")
                .taskAssignee(username)
                .list();
        Task task = l.get(0);
        Map<String, Object> variable = new HashMap<>();
        variable.put("zzAgree", false);
        System.out.println("组长拒绝");
        // 完成任务
        taskService.complete(task.getId(), variable);
        return username + "拒绝";
    }

    /**
     * 项目组长拒绝
     */
    @GetMapping("/reject/manager/{username}")
    public String rejectTaskJL(@PathVariable String username) {
        List<Task> l = taskService.createTaskQuery()
                .processDefinitionKey("请假流程")
                .taskAssignee(username)
                .list();
        Task task = l.get(0);
        Map<String, Object> variable = new HashMap<>();
        variable.put("projectZZAgree", false);
        System.out.println("项目组长拒绝");
        // 完成任务
        taskService.complete(task.getId(), variable);
        return username + "拒绝";
    }

    /**
     * 部门经理拒绝
     */
    @GetMapping("/reject/boss/{username}")
    public String rejectTaskLB(@PathVariable String username) {
        List<Task> l = taskService.createTaskQuery()
                .processDefinitionKey("请假流程")
                .taskAssignee(username)
                .list();
        Task task = l.get(0);
        Map<String, Object> variable = new HashMap<>();
        System.out.println("部门经理拒绝");
        variable.put("bmAgree", false);
        // 完成任务
        taskService.complete(task.getId(), variable);
        return username + "拒绝";
    }
}

测试

创建流程实例

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

输出结果

流程实例的ID:7557
流程创建成功
组长同意
项目组长拒绝
部门经理同意
发送拒绝邮件
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
并行网关Flowable工作流引擎中的一个重要组件,用于同时执行多个并发的执行流。它可以将一个执行流分岔成多个同时执行的执行流,并将多个执行流合并为一个执行流。与其他网关不同的是,并行网关不会解析流条件,即使顺序流中定义了流条件,也会被忽略。并行网关可以同时具有分岔和合并两种行为,允许多个执行流到达该网关时被合并,然后再随机分岔为多个执行流。因此,并行网关在处理多个并发执行流时非常灵活和强大。 同时,包含网关也可以充当并行网关的角色。包含网关是排他网关并行网关的结合体,可以选择多于一条顺序流,并且在执行流中具有分岔和合并的行为。当包含网关作为并行网关使用时,它遵循并行网关的特性,既有分岔行为也有合并行为。与并行网关不同的是,包含网关还可以解析流条件,并根据条件选择不同的顺序流进行执行。因此,包含网关在流程中的使用非常灵活,既可以用作排他网关,也可以用作并行网关。 总结来说,Flowable中的并行网关是一个同时执行多个并发执行流的组件,可以实现分岔和合并的行为,而包含网关则是排他网关并行网关的结合体,既可以充当排他网关,也可以充当并行网关。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙域、白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值