当前位置: 首页 > news >正文

关于flowable工作流的研究与初步使用

Flowable工作流的原理可以概括为以下几个步骤:

1. 流程定义:使用BPMN 2.0规范进行流程定义,将业务过程可视化地描述出来。Flowable提供了可视化的流程设计工具,方便用户进行流程定义。

**生成符合BPMN 2.0规范的流程文件的方式有很多,此处列举两种方式:

1.使用Flowable自带的Flowable-UI来生成BPMN文件:

首先下载官方demo代码:https://github.com/flowable/flowable-engine/releases
解压后找到flowable-rest.war和flowable-ui.war两个war包,放到tomcat里面运行起来。
成功运行后,访问本地地址 http://localhost:8080/flowable-ui
在网页中找到“新建流程”,定义好相关名称,就可以开始创建流程了:
在这里插入图片描述
在这里插入图片描述
详细绘制步骤可参考:https://blog.csdn.net/java_mindmap/article/details/135027471
绘制完成后,保存,然后下载,即可获得:

在这里插入图片描述

这样一个bpmn20标准的流程图文件。

2.使用IDEA插件“Flowable BPMN visualizer”来生成BPMN文件:

IDEA插件市场中搜索Flowable BPMN visualizer安装该插件。
在这里插入图片描述

安装完成后,在文档目录下右键新建,即可创建bpmn20标准的流程图文件:
在这里插入图片描述

创建好文件后,右键点击即可对流程进行编辑
在这里插入图片描述

具体操作可参考:https://blog.csdn.net/Demo_00/article/details/135413840

2. 流程部署:将流程定义文件部署到Flowable引擎中,引擎解析流程定义并生成执行实例。

新建一个springBoot项目或者在原有的springBoot项目中引入Flowable框架:

<!-- flowable -->
<dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.7.1</version>
</dependency>

在数据库连接中添加配置:
&nullCatalogMeansCurrent=true
然后将上一步下载的流程图文件放到项目中:
在这里插入图片描述

然后使用代码将流程注册到流程引擎中,即可使用:

@Test
public void deploy(){ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/leave.bpmn20.xml").name("请假流程...").category("请假") // 分类.tenantId("dpb") // 租户id.deploy();System.out.println("deploy.getId() = " + deploy.getId());System.out.println("deploy.getName() = " + deploy.getName());System.out.println("deploy.getCategory() = " + deploy.getCategory());
}

3. 任务分配:根据流程实例的执行情况,将任务分配给相应的参与者。Flowable支持多种任务分配方式,如手动分配、自动分配等。

发起一个流程:

Map<String, Object> map = new HashMap<>();
map.put("day", 5);
map.put("user1", "小明");
ProcessInstance studentLeave = runtimeService.startProcessInstanceByKey("leave", map);
Task task = taskService.createTaskQuery().processInstanceId(studentLeave.getId()).singleResult();
taskService.complete(task.getId());

处理第一阶段流程:

// 领导审批
List<Task> teacherTaskList = taskService.createTaskQuery().taskCandidateGroup("a").list();
Map<String, Object> teacherMap = new HashMap<>();
teacherMap.put("outcome", "通过");
for (Task teacherTask : teacherTaskList) {taskService.complete(teacherTask.getId(), teacherMap);
}

处理第二阶段流程:

List<Task> principalTaskList = taskService.createTaskQuery().taskCandidateGroup("b").list();
Map<String, Object> principalMap = new HashMap<>();
principalMap.put("bosspass", "通过");
for (Task principalTask : principalTaskList) {taskService.complete(principalTask.getId(), principalMap);
}

查询整个流程的流转过程:

List<HistoricActivityInstance> activities = historyService.createHistoricActivityInstanceQuery().processInstanceId(studentLeave.getId()).finished().orderByHistoricActivityInstanceEndTime().asc().list();
for (HistoricActivityInstance activity : activities) {System.out.println(activity.getActivityName());
}

运行结束:

在这里插入图片描述

实际案例

以告警图片识别并下发巡查任务流程为例:
首先设计并导出流程文件:
在这里插入图片描述

将流程注册到系统中:

	@Testpublic void deployImg(){ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/img.bpmn20.xml").name("告警图片审核巡查流程...").category("告警") // 分类.tenantId("dpb") // 租户id.deploy();System.out.println("deploy.getId() = " + deploy.getId());System.out.println("deploy.getName() = " + deploy.getName());System.out.println("deploy.getCategory() = " + deploy.getCategory());}

模拟巡查任务流转过程:

@Testvoid TestImg() {// 发起请假Map<String, Object> map = new HashMap<>();map.put("img", "https://obs-dzwlproject.obs.cn-south-1.myhuaweicloud.com/group/GX0153/20210526104731.png");map.put("robot", "xxlJob");map.put("robotFlow", "通过");ProcessInstance studentLeave = runtimeService.startProcessInstanceByKey("task", map);Task task = taskService.createTaskQuery().processInstanceId(studentLeave.getId()).singleResult();taskService.complete(task.getId());// 运营中心审核List<Task> teacherTaskList = taskService.createTaskQuery().taskCandidateGroup("server").list();Map<String, Object> teacherMap = new HashMap<>();teacherMap.put("serverFlow", "通过");for (Task teacherTask : teacherTaskList) {taskService.complete(teacherTask.getId(), teacherMap);}// 市级管理分配任务--指派给张三List<Task> principalTaskList = taskService.createTaskQuery().taskCandidateGroup("manager").list();Map<String, Object> principalMap = new HashMap<>();principalMap.put("managerPassFlow", "通过");principalMap.put("user", "张三");for (Task principalTask : principalTaskList) {taskService.complete(principalTask.getId(), principalMap);}// 开始巡查任务---张三发现不是自己区域的任务List<Task> userTaskList = taskService.createTaskQuery().taskCandidateUser("张三").list();Map<String, Object> userMap = new HashMap<>();userMap.put("userBackFlow", "转办");for (Task userTask : userTaskList) {taskService.complete(userTask.getId(), userMap);}// 市级管理分配任务--重新指派给李四List<Task> principalTaskList1 = taskService.createTaskQuery().taskCandidateGroup("manager").list();Map<String, Object> principalMap1 = new HashMap<>();principalMap1.put("managerPassFlow", "通过");principalMap1.put("user", "李四");for (Task principalTask : principalTaskList1) {taskService.complete(principalTask.getId(), principalMap1);}// 开始巡查任务---李四巡查任务List<Task> userTaskList1 = taskService.createTaskQuery().taskCandidateUser("李四").list();Map<String, Object> userMap1 = new HashMap<>();userMap1.put("userBackFlow", "巡查");for (Task userTask : userTaskList1) {//获取违规图片地址String img = (String) taskService.getVariable(userTask.getId(), "img");System.out.println("巡查员获取违规图片地址:"+img);taskService.complete(userTask.getId(), userMap1);}// 查看历史List<HistoricActivityInstance> activities = historyService.createHistoricActivityInstanceQuery().processInstanceId(studentLeave.getId()).finished().orderByHistoricActivityInstanceEndTime().asc().list();for (HistoricActivityInstance activity : activities) {System.out.println(activity.getActivityName());}}

执行完成,打印当前流程执行记录:
在这里插入图片描述

相关文章:

  • ​​​​​​​今日github AI科技工具汇总(20250415更新)
  • MODBUS RTU time_out实现
  • LLM中的N-Gram、TF-IDF和Word embedding
  • 从“数据孤岛”到“万物互联”,PLC组网重构工控边界
  • STM32 HAL库 DAC生成正弦波
  • 返工成本高,如何优化验收流程
  • MyBatis SqlSessionFactory 批量执行实战
  • Transformer编程题目,结合RTX 3060显卡性能和市场主流技术
  • 【差分隐私相关概念】瑞丽差分隐私(RDP)命题10
  • 每日算法(双指针算法)(Day 1)
  • docker多架构镜像构建
  • 大模型面经 | 请你介绍一下ReAct(Reasoning and Acting)?
  • FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现
  • 《白龙马购销存》软件分享
  • ElasticSearch中常用的数据类型
  • lustre共享存储是免费的吗
  • 案例:塔能科技驱动河南某市政照明智慧升级
  • 郑州工程技术学院党委书记甘勇一行莅临埃文科技调研交流
  • 适用于 HAL 的 AIDL
  • 第二十讲:SHAP 值与模型可解释性详解(附案例) [特殊字符]
  • 双拥主题歌曲MV:爱我人民,爱我军
  • 国家发改委党组在《人民日报》发表署名文章:新时代新征程民营经济发展前景广阔大有可为
  • 第六次“太空会师”,神舟二十号3名航天员顺利进驻中国空间站
  • 大卫·第艾维瑞谈历史学与社会理论③丨尼古拉斯·卢曼与历史研究
  • 商标乱象调查:“120W”充电器功率仅12W,120W为商标名
  • 云南大理州洱源县发生4.8级地震,震源深度10千米