SpringBoot集合工作流(WorkFlow)Flowable

发布时间 2023-10-30 00:36:48作者: 3DG

在我不久前做的一个项目中,需要完成一个审批模块,选用了flowable。

以下就是flowable简单的使用流程介绍

流程

一,引入依赖

<!--flowable依赖-->
       <dependency>
           <groupId>org.flowable</groupId>
           <artifactId>flowable-spring-boot-starter</artifactId>
           <version>6.7.2</version>
       </dependency>

二,创建流程图

此处使用到了IDEA的一个插件 Flowable BPMN visualizer

创建bpmn20.xml文件

 

利用插件绘制流程图

右键点击bpmn20.xml文件

绘制流程图

右键选择自己所需

绘制完成之后,bpmn20.xml文件内容就会自己生成了Wow Amazing! ! !

Controller

package com.cn.pioneer.controller;
​
import com.baomidou.mybatisplus.extension.api.R;
import com.cn.pioneer.util.ResultVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
​
import org.flowable.bpmn.model.Task;
import org.flowable.engine.*;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
​
/**
 * @author 3DG
 * @Description 请假审批控制器
 * @date 2023/10/19 11:32
 */
@RestController
@RequestMapping("/leave")
@Slf4j
@Api(value = "请假审批 API 接口", tags = "请假审批 API 接口")
public class LeaveController {
    @Autowired
    private RuntimeService runtimeService;
    //启动流程实例通过RuntimeServiced对象
    @Autowired
    private TaskService taskService;
​
    //流程引擎
​
    /**
     * 创建流程
     */
​
    /**
     * 创建请假审批
     * @param LeaveID
     * @param LeaveName
     * @param LeaveDays
     * @param LeaveReason
     * @return
     */
    @PostMapping("add")
    @ApiOperation("创建请假审批流程")
    public ResultVo <String>addLeave(@RequestBody Integer LeaveID, String LeaveName, Integer LeaveDays, String LeaveReason){
        //获取assigne的取值
        Map<String,Object> map = new HashMap<>();
        map.put("leaveID",LeaveID);
        map.put("leaveName",LeaveName);
        map.put("leaveDays",LeaveDays);
        map.put("leaveReason",LeaveReason);
        //启动流程实例,第一个参数是流程的id
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("LeaveID",map);
        
        log.info(map.toString());
        return ResultVo.success("提交成功:"+processInstance.getId());
    }
​
    /**
     * 显示流程图
     */
    /**
     * 查看审批流程
     * @param httpServletResponse
     * @param processID
     * @throws Exception
     */
    @PostMapping("processDiagram")
    @ApiOperation("查看流程")
    public void getProcessDiagram(HttpServletResponse httpServletResponse,String processID)throws Exception{
        ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processID).singleResult();
​
        if (pi ==null){
            return;
        }
        Task task = (Task) taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
        //使用流程实例ID,查询正在执行的对象,返回流程实例对象
        String InstanceID = task.getId();
        List<Execution> executions = runtimeService
                .createExecutionQuery()
                .processInstanceId(InstanceID)
                .list();
    }
​
    /**
     * 审批请假
     */
    @PostMapping("approveLeave")
    @ApiOperation("审批请假")
    public ResultVo<String> approveLeave(String taskId,String approved){
        Task task = (Task) taskService.createTaskQuery().taskId(taskId).singleResult();
        if(task==null){
            return ResultVo.success("流程不存在");
        }
        //设置流程变量
        Map<String,Object> variables=new HashMap<>();
        Boolean approve = approved.equals("1")? true: false;
        //获取assignee的取值
        variables.put("approved",approve);
        taskService.complete(taskId,variables);
        return ResultVo.success("审批是否通过"+approved);
    }
}