flowable工作流--实操篇

这篇具有很好参考价值的文章主要介绍了flowable工作流--实操篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单介绍

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

一、画流程图

申请发工资流程预览

flowable工作流--实操篇

二、设置流程信息

1.设置流程标识

设置流程的唯一标识为payrollApplication也就是模型KEY,后续部署和启动都会用到
flowable工作流--实操篇

2.设置流程变量

设置通过的流转条件为${approval==‘pass’}其中approval为变量名称,pass为变量值,工作流会自动解析表达式进行判断
flowable工作流--实操篇

设置不通过的流转条件为${approval==‘notPass’}
flowable工作流--实操篇

设置打款成功的流转条件为${payment == ‘success’}
flowable工作流--实操篇

设置打款失败的流转条件为${payment == ‘fail’}
flowable工作流--实操篇

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

主要用于接收银行打款处理通知,未通知会一直停留在中间信号接收事件节点上
flowable工作流--实操篇
flowable工作流--实操篇
设置信号引用为方才设置的信号定义
flowable工作流--实操篇

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

设置事先写好的服务任务的实现类(下面有实现代码)
flowable工作流--实操篇

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

设置审批人为${Assignee},通过设置变量Assignee,动态设置审批人
flowable工作流--实操篇
flowable工作流--实操篇

三、部署流程

flowable工作流--实操篇

四、使用流程

1.启动流程

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

 	/**
     * 启动流程实例并跟业务ID关联,并设置流程变量
     * @param processDefinitionKey 流程模型KEY
     * @param businessKey 业务ID跟流程进行关联
     * @param variables 流程变量
     * @return 流程实例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

/**
     * 提交用户任务
     * @param businessKey 业务ID
     * @param userId 用户任务处理人ID
     * @param approval 审批结果
     * @return
     */
    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.中间信号捕获事件(等待银行处理结果回调)

工作流执行到当前节点会暂停,待银行打款操作结果回调之后,触发中间信号捕获事件信号,根据打款结果设置流程变量值,完成流程流转文章来源地址https://www.toymoban.com/news/detail-504646.html

    /**
     * 发送触发信号并设置变量
     * @param businessKey 业务ID
     * @param signaler 信号
     * @param payment 银行操作结果
     * @return
     */
    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 "触发信号接收成功";
    }

到了这里,关于flowable工作流--实操篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flowable工作流入门&完整SpringBoot案例

    工作流(Workflow),是指对于一项业务,按照规定的流程,逐级传递、申请、执行等,并且受到了严格控制的一种业务过程。 BPM(Business Process Management)是指对于某项业务的整个生命周期进行全面管理的一种模式,最核心的内容包括了工作流、决策、交互等。在这些管理过程

    2024年02月12日
    浏览(31)
  • 【学习笔记】Flowable - 01 - 工作流 快速上手

    JDK8 Flowable6 (6.3 or 6.7.2) Postgresql (MySQL同样支持) 波哥:2023年Flowable详细讲解 波哥:2022年Flowable教程-基础篇 Flowable BPMN 用户手册 中文 官方网站 官方github源码 IDEA低版本提供一个BPMN解析插件: 但是并没有很好的支持流程的绘制。 存在几个工具: 古老的Eclipse(太老的不推荐 官

    2024年01月19日
    浏览(30)
  • Spring Boot 中动态创建 Flowable 工作流

    在 Spring Boot 中动态创建 Flowable 工作流可以通过以下步骤实现: 1. 创建 Flowable 配置:首先,您需要在 Spring Boot 应用程序中配置 Flowable。您可以使用 Spring Boot 的配置文件或注解来配置 Flowable。 2. 创建工作流定义:接下来,您需要创建工作流定义。您可以使用 Flowable 的 API 来

    2024年02月10日
    浏览(27)
  • Vue+LogicFlow+Flowable 前端+后端实现工作流

    前端使用LogicFlow框架绘制流程图,可以导出为xml工作流标准格式数据,通过xml文件传递到后端进行Flowable流程注册,并保存到数据库中。 如需添加承办人的话,需要在LogicFlow导出文件的基础上手动添加 xmlns:flowable=\\\"http://flowable.org/bpmn\\\" flowable插件,不然后台无法识别 flowable:ca

    2024年02月04日
    浏览(30)
  • 若依(RuoYi-Vue)+Flowable工作流前后端整合教程

    此教程适合若依前后端分离项目,其他项目可以在扩展列表中进行查找。 近期公司里需要对很久以前的RuoYi-Vue前后端分离项目扩展出flowable的功能,当然这个重任也是落在了我的身上(不然也不会有这篇文章),然后我在官网看到了RuoYi-Vue-Flowable这个项目,按照文档提供的迁

    2023年04月21日
    浏览(41)
  • Github Flow工作流简单介绍(以部署为中心的开发模式)

    前言 这篇文章主要介绍Github Flow的理念,以下内容来源于《Github入门与实践》。 Github Flow是以部署为中心的开发模式,通过简单的规则,持续高速且安全地进行部署。而Gitflow则是以发布为中心的分支管理模型,它提供了一种更灵活的方式来管理代码库中的更改。可以参考《

    2024年02月15日
    浏览(26)
  • 工作流Flowable入门教程:flowableUI的安装使用,RepositoryService、RuntimeService、TaskService、HistoryService的使用

    Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。这个章节将用一个可以在你自己的开发环境中使用的例

    2024年01月18日
    浏览(34)
  • WPF应用框架中工作流模块的介绍

    在前面的随笔,我对我们开发的审批工作流做了不少的介绍,其中有包括WInform的、Vue+Element、Bootstrap Asp.net的,在各个框架上,我们都尽量争取界面能够一致化,以便客户能够在不同的前端上有相同的用户体验,并结合不同的前端特点,做了一些优化处理,本篇随笔对WPF应用

    2024年02月05日
    浏览(33)
  • Unity & PS Linear Workflow - Unity 和 PS 的线性工作流实践 - 简单配置示例

    因为 新的 Unity 项目人物走写实PBR风格 所以铁定基于 Linear Workflow 比基于 Gamma Workflow 的渲染效果更好 但是 Linear Workflow 下对 美术工作流不太友好,下面就实验并总结一些方案的优缺点 供大家选取 先看看不同 Color Space 下的 PBR 选择差异有多大 在 Unity Linear Color Space 渲染质量接

    2023年04月08日
    浏览(27)
  • 【idea中Activiti BPMN visualizer插件和Camunda Modeler工作流设计器的简单使用】

    1、Idea中的工作流插件Activiti BPMN visualizer Activiti插件actiBPM在新版的idea 2020及以上版本中已经不支持,Activiti BPMN visualizer是一款支持编辑和游览工作流设计图的idea插件,但是它对工作流设计中的网关设计支持并不太友好;下面第4章节我们用到Camunda Modeler软件来协助设计整体工

    2023年04月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包