SpringBoot集合工作流(WorkFlow)Flowable
在我不久前做的一个项目中,需要完成一个审批模块,选用了flowable。
以下就是flowable简单的使用流程介绍
流程
一,引入依赖
二,创建流程图
此处使用到了IDEA的一个插件 Flowable BPMN visualizer
创建bpmn20.xml文件
利用插件绘制流程图
右键点击bpmn20.xml文件
绘制流程图
右键选择自己所需
绘制完成之后,bpmn20.xml文件内容就会自己生成了Wow Amazing! ! !
Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | <div id= "mCSB_2" class = "mCustomScrollBox mCS-minimal-dark mCSB_vertical_horizontal mCSB_outside" style= "max-height: none;" tabindex= "0" ><div id= "mCSB_2_container" class = "mCSB_container mCS_y_hidden mCS_no_scrollbar_y mCS_x_hidden mCS_no_scrollbar_x" style= "position: relative; top: 0px; left: 0px; width: 100%;" dir= "ltr" ><code-pre class = "code-pre" id= "pre-JDmGcJ" ><code-line class = "line-numbers-rows" ></code-line> package com.cn.pioneer.controller; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> import com.baomidou.mybatisplus.extension.api.R; <code-line class = "line-numbers-rows" ></code-line> import com.cn.pioneer.util.ResultVo; <code-line class = "line-numbers-rows" ></code-line> import io.swagger.annotations.Api; <code-line class = "line-numbers-rows" ></code-line> import io.swagger.annotations.ApiOperation; <code-line class = "line-numbers-rows" ></code-line> import lombok.extern.slf4j.Slf4j; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> import org.flowable.bpmn.model.Task; <code-line class = "line-numbers-rows" ></code-line> import org.flowable.engine.*; <code-line class = "line-numbers-rows" ></code-line> import org.flowable.engine.runtime.Execution; <code-line class = "line-numbers-rows" ></code-line> import org.flowable.engine.runtime.ProcessInstance; <code-line class = "line-numbers-rows" ></code-line> import org.springframework.beans.factory.annotation.Autowired; <code-line class = "line-numbers-rows" ></code-line> import org.springframework.web.bind.annotation.PostMapping; <code-line class = "line-numbers-rows" ></code-line> import org.springframework.web.bind.annotation.RequestBody; <code-line class = "line-numbers-rows" ></code-line> import org.springframework.web.bind.annotation.RequestMapping; <code-line class = "line-numbers-rows" ></code-line> import org.springframework.web.bind.annotation.RestController; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> import javax.servlet.http.HttpServletResponse; <code-line class = "line-numbers-rows" ></code-line> import java.util.HashMap; <code-line class = "line-numbers-rows" ></code-line> import java.util.List; <code-line class = "line-numbers-rows" ></code-line> import java.util.Map; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> /** <code-line class="line-numbers-rows"></code-line> * @author 3DG <code-line class="line-numbers-rows"></code-line> * @Description 请假审批控制器 <code-line class="line-numbers-rows"></code-line> * @date 2023/10/19 11:32 <code-line class="line-numbers-rows"></code-line> */ <code-line class = "line-numbers-rows" ></code-line> @RestController <code-line class = "line-numbers-rows" ></code-line> @RequestMapping ( "/leave" ) <code-line class = "line-numbers-rows" ></code-line> @Slf4j <code-line class = "line-numbers-rows" ></code-line> @Api (value = "请假审批 API 接口" , tags = "请假审批 API 接口" ) <code-line class = "line-numbers-rows" ></code-line> public class LeaveController { <code-line class = "line-numbers-rows" ></code-line> @Autowired <code-line class = "line-numbers-rows" ></code-line> private RuntimeService runtimeService; <code-line class = "line-numbers-rows" ></code-line> //启动流程实例通过RuntimeServiced对象 <code-line class = "line-numbers-rows" ></code-line> @Autowired <code-line class = "line-numbers-rows" ></code-line> private TaskService taskService; <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> //流程引擎 <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> /** <code-line class="line-numbers-rows"></code-line> * 创建流程 <code-line class="line-numbers-rows"></code-line> */ <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> /** <code-line class="line-numbers-rows"></code-line> * 创建请假审批 <code-line class="line-numbers-rows"></code-line> * @param LeaveID <code-line class="line-numbers-rows"></code-line> * @param LeaveName <code-line class="line-numbers-rows"></code-line> * @param LeaveDays <code-line class="line-numbers-rows"></code-line> * @param LeaveReason <code-line class="line-numbers-rows"></code-line> * @return <code-line class="line-numbers-rows"></code-line> */ <code-line class = "line-numbers-rows" ></code-line> @PostMapping ( "add" ) <code-line class = "line-numbers-rows" ></code-line> @ApiOperation ( "创建请假审批流程" ) <code-line class = "line-numbers-rows" ></code-line> public ResultVo <String>addLeave( @RequestBody Integer LeaveID, String LeaveName, Integer LeaveDays, String LeaveReason){ <code-line class = "line-numbers-rows" ></code-line> //获取assigne的取值 <code-line class = "line-numbers-rows" ></code-line> Map<String,Object> map = new HashMap<>(); <code-line class = "line-numbers-rows" ></code-line> map.put( "leaveID" ,LeaveID); <code-line class = "line-numbers-rows" ></code-line> map.put( "leaveName" ,LeaveName); <code-line class = "line-numbers-rows" ></code-line> map.put( "leaveDays" ,LeaveDays); <code-line class = "line-numbers-rows" ></code-line> map.put( "leaveReason" ,LeaveReason); <code-line class = "line-numbers-rows" ></code-line> //启动流程实例,第一个参数是流程的id <code-line class = "line-numbers-rows" ></code-line> ProcessInstance processInstance = runtimeService.startProcessInstanceByKey( "LeaveID" ,map); <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> log.info(map.toString()); <code-line class = "line-numbers-rows" ></code-line> return ResultVo.success( "提交成功:" +processInstance.getId()); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> /** <code-line class="line-numbers-rows"></code-line> * 显示流程图 <code-line class="line-numbers-rows"></code-line> */ <code-line class = "line-numbers-rows" ></code-line> /** <code-line class="line-numbers-rows"></code-line> * 查看审批流程 <code-line class="line-numbers-rows"></code-line> * @param httpServletResponse <code-line class="line-numbers-rows"></code-line> * @param processID <code-line class="line-numbers-rows"></code-line> * @throws Exception <code-line class="line-numbers-rows"></code-line> */ <code-line class = "line-numbers-rows" ></code-line> @PostMapping ( "processDiagram" ) <code-line class = "line-numbers-rows" ></code-line> @ApiOperation ( "查看流程" ) <code-line class = "line-numbers-rows" ></code-line> public void getProcessDiagram(HttpServletResponse httpServletResponse,String processID) throws Exception{ <code-line class = "line-numbers-rows" ></code-line> ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processID).singleResult(); <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> if (pi == null ){ <code-line class = "line-numbers-rows" ></code-line> return ; <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> Task task = (Task) taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); <code-line class = "line-numbers-rows" ></code-line> //使用流程实例ID,查询正在执行的对象,返回流程实例对象 <code-line class = "line-numbers-rows" ></code-line> String InstanceID = task.getId(); <code-line class = "line-numbers-rows" ></code-line> List<Execution> executions = runtimeService <code-line class = "line-numbers-rows" ></code-line> .createExecutionQuery() <code-line class = "line-numbers-rows" ></code-line> .processInstanceId(InstanceID) <code-line class = "line-numbers-rows" ></code-line> .list(); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> <code-line class = "line-numbers-rows" ></code-line> /** <code-line class="line-numbers-rows"></code-line> * 审批请假 <code-line class="line-numbers-rows"></code-line> */ <code-line class = "line-numbers-rows" ></code-line> @PostMapping ( "approveLeave" ) <code-line class = "line-numbers-rows" ></code-line> @ApiOperation ( "审批请假" ) <code-line class = "line-numbers-rows" ></code-line> public ResultVo<String> approveLeave(String taskId,String approved){ <code-line class = "line-numbers-rows" ></code-line> Task task = (Task) taskService.createTaskQuery().taskId(taskId).singleResult(); <code-line class = "line-numbers-rows" ></code-line> if (task== null ){ <code-line class = "line-numbers-rows" ></code-line> return ResultVo.success( "流程不存在" ); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line> //设置流程变量 <code-line class = "line-numbers-rows" ></code-line> Map<String,Object> variables= new HashMap<>(); <code-line class = "line-numbers-rows" ></code-line> Boolean approve = approved.equals( "1" )? true : false ; <code-line class = "line-numbers-rows" ></code-line> //获取assignee的取值 <code-line class = "line-numbers-rows" ></code-line> variables.put( "approved" ,approve); <code-line class = "line-numbers-rows" ></code-line> taskService.complete(taskId,variables); <code-line class = "line-numbers-rows" ></code-line> return ResultVo.success( "审批是否通过" +approved); <code-line class = "line-numbers-rows" ></code-line> } <code-line class = "line-numbers-rows" ></code-line>} </code-pre></div></div><div id= "mCSB_2_scrollbar_vertical" class = "mCSB_scrollTools mCSB_2_scrollbar mCS-minimal-dark mCSB_scrollTools_vertical" style= "display: none;" ><div class = "mCSB_draggerContainer" ><div id= "mCSB_2_dragger_vertical" class = "mCSB_dragger" style= "position: absolute; min-height: 0px; height: 0px; top: 0px;" ><div class = "mCSB_dragger_bar" style= "line-height: 0px;" ></div></div><div class = "mCSB_draggerRail" ></div></div></div><div id= "mCSB_2_scrollbar_horizontal" class = "mCSB_scrollTools mCSB_2_scrollbar mCS-minimal-dark mCSB_scrollTools_horizontal" style= "display: none;" ><div class = "mCSB_draggerContainer" ><div id= "mCSB_2_dragger_horizontal" class = "mCSB_dragger" style= "position: absolute; min-width: 0px; width: 0px; left: 0px;" ><div class = "mCSB_dragger_bar" ></div></div><div class = "mCSB_draggerRail" ></div></div></div> |
__EOF__

本文作者:3DG
本文链接:https://www.cnblogs.com/3-DG/p/17796853.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/3-DG/p/17796853.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?