我的编程空间,编程开发者的网络收藏夹
学习永远不晚

flowable工作流--实操篇

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

flowable工作流--实操篇

简单介绍

本文通过申请发工资的业务场景来介绍使用工作流的全流程,包括画流程图,设置属性,以及代码编写
使用工作流大致分为四步
第一步:根据自己的业务画好流程图
第二步:设置流程图的属性和变量,保存模型
第三步:部署画好的流程图(发布)
第四步:根据业务和流程图写一些服务和监听器
这里主要介绍以下几个任务的使用
1.用户任务的分配和提交
2.服务任务的使用
3.中间信号捕捉事件的触发
4.排他网关的使用
5.通过设置流程变量,实现流程的不同流转

一、画流程图

申请发工资流程预览

流程图预览

二、设置流程信息

1.设置流程标识

设置流程的唯一标识为payrollApplication也就是模型KEY,后续部署和启动都会用到
在这里插入图片描述

2.设置流程变量

设置通过的流转条件为${approval==‘pass’}其中approval为变量名称,pass为变量值,工作流会自动解析表达式进行判断
在这里插入图片描述

设置不通过的流转条件为${approval==‘notPass’}
在这里插入图片描述

设置打款成功的流转条件为${payment == ‘success’}
在这里插入图片描述

设置打款失败的流转条件为${payment == ‘fail’}
在这里插入图片描述

3.设置信号定义和信号引用

主要用于接收银行打款处理通知,未通知会一直停留在中间信号接收事件节点上
在这里插入图片描述
在这里插入图片描述
设置信号引用为方才设置的信号定义
在这里插入图片描述

4.设置服务任务的实现类

设置事先写好的服务任务的实现类(下面有实现代码)
在这里插入图片描述

5.用户任务–通过变量设置审批人

设置审批人为${Assignee},通过设置变量Assignee,动态设置审批人
在这里插入图片描述
在这里插入图片描述

三、部署流程

在这里插入图片描述

四、使用流程

1.启动流程

启动流程实例并跟业务ID关联,并设置流程变量
1.processDefinitionKey 要启动的流程模型KEY (本次演示场景为payrollApplication)
2.businessKey 业务标识,跟流程进行关联,不需要可不填
3.variables 流程变量,启动流程时设置的变量,类型为Map,JSONObject也可以,不需要可不填 (本次场景是通过变量动态设置的代理人,所以需要在启动时设置变量Assignee,值为审批人ID,否则用户任务会因为没有指定处理人而报错)

     public string startProcessByBusinessKey(String processDefinitionKey, String businessKey , Map<String,Object> variables) {        // 启动流程实例        ProcessInstance instance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);        logger.debug("流程实例ID:{},流程定义ID:{},业务标识:{}", instance.getId(), instance.getProcessDefinitionId(), businessKey);        return instance.getId();    }

2.用户任务(财务审批)

businessKey为启动时设置的业务标识,不需要可不填
userId为启动流程时设置的流程变量Assignee的值
approval为审批结果值为pass或者notPass

    public String completeTaskByUserIdAndBusinessKey(String businessKey, String userId, String approval) {        // 获取流程实例ID        String processInstanceId = null;        // 需要处理的任务ID        String taskId = null;        // 查询该用户的所有任务        List<Task> taskList = taskService.createTaskQuery().taskAssignee(userId).orderByTaskCreateTime().desc().list();        if (null == taskList || taskList.isEmpty()) {            return "该用户没有分配任务!";        }                if (StringUtils.isBlank(businessKey)) {            // 有可能存在多个任务,实际需要根据业务特殊处理            taskId = taskList.get(0).getId();            // 获取流程实例ID            processInstanceId = taskList.get(0).getProcessInstanceId();        }else {            // 根据业务ID查找任务ID            for (Task task : taskList) {                // 获取流程实例ID                processInstanceId = task.getProcessInstanceId();                if (StringUtils.isNotBlank(processInstanceId)) {                    // 获取流程实例                    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();                    // 流程实例                    if (null == processInstance) {                        return "未查询到正在运行的流程实例!";                    }                    // 流程实例关联的业务ID                    String processInstanceBusinessKey = processInstance.getBusinessKey();                    // 流程实例关联的业务ID和该用户的业务ID                    if (StringUtils.isNotBlank(processInstanceBusinessKey) && StringUtils.equals(processInstanceBusinessKey, businessKey)) {                        taskId = task.getId();                        break;                    }                }            }        }        if (StringUtils.isBlank(taskId)) {            return "未查询到关联该业务的任务!";        }                // 设置变量 设置流条件,告诉工作流下一步的流转节点 审批通过或未通过        JSONObject variables = new JSONObject();        variables.put("approval", approval);        runtimeService.setVariables(processInstanceId, variables);        // 提交任务        taskService.complete(taskId, null);        return "提交任务成功";    }

3.服务任务(银行处理)

BankPaymentTask 实现类必须实现JavaDelegate接口,工作流才会识别到

public class BankPaymentTask implements JavaDelegate, Serializable {    @Autowired    public RuntimeService runtimeService;    public static BankPaymentTask bankPaymentTask;    @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作    public void init() {        bankPaymentTask= this;        bankPaymentTask.runtimeService = this.runtimeService;    }    @Override    public void execute(DelegateExecution execution) {        // 获取流程实例变量        Map<String, Object> variables = runtimeService.getVariables(execution.getProcessInstanceId());        if (variables == null || variables.isEmpty()) {            log.error("variables不能为空!");            return;        }        if (variables.get("businessKey") == null) {            log.error("businessKey不能为空!");            return;        }                // 配合流程变量,使用http调用其他服务完成银行转账的操作        // JSONObject result = RestTemplateUtil.postForObject(paymentUrl, params, JSONObject.class);        // 设置流程变量JSONObject variables = new JSONObject();        variables.put("xxx", "xxx");        runtimeService.setVariables(execution.getProcessInstanceId(), variables);    }

4.中间信号捕获事件(等待银行处理结果回调)

工作流执行到当前节点会暂停,待银行打款操作结果回调之后,触发中间信号捕获事件信号,根据打款结果设置流程变量值,完成流程流转

        public String callback(String businessKey, String signaler, String payment) {        // 根据业务标识查询正在运行的流程实例        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessKey).singleResult();        if (processInstance == null) {            return "没有正在进行的任务!";        }        // 流程实例ID        String processInstanceId = processInstance.getId();        // 查找是否有等待触发的信号        // 流程执行流 流程执行流和流程实例的关系:流程执行流表示流程实例中具体地执行路径,流程实例是一次工作流业务的数据实体        Execution executions = runtimeService.createExecutionQuery().processInstanceId(processInstanceId)                .signalEventSubscriptionName(signaler).singleResult();        if (executions == null) {            return "未查询到该信号事件!";        }        logger.debug("executionsId:{},processInstanceId:{}", executions.getId(), processInstanceId);        // 设置变量 设置流条件,告诉工作流下一步的流转节点JSONObject variables = new JSONObject();// payment为success或者fail        variables.put("payment", payment);        runtimeService.setVariables(processInstanceId, variables);        // 发送触发信号        runtimeService.signalEventReceived(signaler, executions.getId());        return "触发信号接收成功";    }

来源地址:https://blog.csdn.net/weixin_43948460/article/details/128970508

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

flowable工作流--实操篇

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

flowable工作流--实操篇

flowable 简单介绍一、画流程图申请发工资流程预览 二、设置流程信息1.设置流程标识2.设置流程变量3.设置信号定义和信号引用4.设置服务任务的实现类5.用户任务--通过变量设置审批人 三、部署流程四、使用流程1.
2023-08-21

怎么用Springboot+Flowable快速实现工作流的开发

这篇文章主要介绍了怎么用Springboot+Flowable快速实现工作流的开发的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Springboot+Flowable快速实现工作流的开发文章都会有所收获,
2023-06-29

JBPM工作流基本操作

JBPM(Java Business Process Model)是一个用于创建、执行和管理工作流的开源框架。下面是一些JBPM工作流的基本操作:1. 创建流程定义: 使用JBPM提供的建模工具,如JBPM Designer或Eclipse
2023-09-21

企业软件工作流学习开发实用篇

不久前,公司采购了一套OA系统,我们主要就是想工作流用起来,把公司制度流程化。而我个人经过一个月的学习对于工作流也有了一定的理解,知道工作流由表单和流程引擎组成。而表单是数据的载体,数据通过流程引擎进行审批流转。但是在使用过程中我也遇到了很
2023-06-03

我的前端开发工作流 - 环境篇

有人说过程序员和码农的本质区别就是程序员会不断探索提高生产力的方法。思维模式的转变是提高生产力的最好方式,但打磨我们的工具也是十分有意义的事,本文将从开发环境,自动化开发,开发工具等几个方面针对前端开发效率的提升和代码质量的提高来展开讨论。
2023-01-31

Java流式操作之Collectors工具类操作指南

Collectors是Collector的工具类,类中提供了很多流收集、归约、分组、分区等方法,方便我们直接使用,下面这篇文章主要给大家介绍了关于Java流式操作之Collectors工具类操作的相关资料,需要的朋友可以参考下
2023-05-18

Python操作lxml库实战之Xpath篇

XPath是一门在XML文档中查找信息的语言,下面这篇文章主要给大家介绍了关于Python操作lxml库实战之Xpath篇的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
2022-12-23

使用SpringBoot整合Activiti6工作流的操作方法

这篇文章主要介绍了使用SpringBoot整合Activiti6工作流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

jbpm工作流怎么实现

1. 安装JBPM:首先需要安装JBPM,可以通过官方网站下载JBPM安装包,然后按照说明进行安装。2. 创建工作流:使用JBPM设计器创建工作流。JBPM设计器是一个Web应用程序,可以通过浏览器访问。使用设计器可以创建、编辑和部署工作流
2023-06-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录