当前位置:首页 > 单片机 > 架构师社区
[导读]“ 程序员是块砖,哪里需要哪里搬。 ” 公司内部的OA系统最近要升级改造,由于人手不够就把我借调过去了,但说真的我还没做过这方面的功能,第一次接触工作流的开发,还是有点好奇是个怎样的流程。 项目主要用 Springboot + Flowable 重构原有的工作流程,Flo

程序员是块砖,哪里需要哪里搬。

公司内部的OA系统最近要升级改造,由于人手不够就把我借调过去了,但说真的我还没做过这方面的功能,第一次接触工作流的开发,还是有点好奇是个怎样的流程。

项目主要用 Springboot+ Flowable重构原有的工作流程,Flowable是个用 Java语言写的轻量级工作流引擎,上手比较简单开发效率也挺高的,一起学习下这个框架。

官方地址:https://www.flowable.org/docs/userguide/index.html,分享的只是简单应用,深入研究还得看官方文档。

Flowable 核心依赖

 <dependency> <groupId>org.flowablegroupId> <artifactId>flowable-spring-boot-starterartifactId> <version>6.3.0version> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-jdbcartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.mybatis.spring.bootgroupId> <artifactId>mybatis-spring-boot-starterartifactId> <version>1.3.2version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <scope>runtimescope> dependency> 

流程设计

工作流开发的核心是任务流程的设计,Flowable官方建议采用业界标准BPMN2.0的 XML来描述需要定义的工作流。

我们需要在 resource目录下创建 processes路径,存放相关的 XML流程配置文件。Flowable框架会默认加载此目录下的工作流文件并解析 XML,并将解析后的流程配置信息持久化到数据库。

真是没想到,Springboot + Flowable 开发工作流会这么简单!

Flowable是依赖于数据库的,但它并不需要我们手动的创建表,而是在程序第一次启动时,自动的向MySQL中创建它所需要的一系列表。

spring:
  datasource:
    url: jdbc:mysql://47.93.6.5:3306/order?serverTimezone=UTC username: root
    password: 123455 
真是没想到,Springboot + Flowable 开发工作流会这么简单!

看到项目启动成功一共生成了60个表,数量还是比较多的,建议使用专门的数据库存在这些工作流表。

真是没想到,Springboot + Flowable 开发工作流会这么简单!

举个栗子:假如一个请假流程,需要经理审核通过,请假才能生效,如果他驳回流程结束。

真是没想到,Springboot + Flowable 开发工作流会这么简单!

接下来我们用 XML翻译下上边的请假流程图,整体非常简单只要够细心就行了,一起看看每个标签都是什么含义。

"1.0" encoding="UTF-8"?>"http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
    "Leave" name="LeaveProcess" isExecutable="true">
        "leaveTask" name="请假" flowable:assignee="${leaveTask}"/>
        "managerTask" name="经理审核"/>
        "managerJudgeTask"/>
        "endLeave" name="结束"/>
        "startLeave" name="开始"/>
        "modeFlow" sourceRef="leaveTask" targetRef="managerTask"/>
        "flowStart" sourceRef="startLeave" targetRef="leaveTask"/>
        "jugdeFlow" sourceRef="managerTask" targetRef="managerJudgeTask"/>
        "endLeave2"/>
        "flowEnd" name="通过" sourceRef="managerJudgeTask" targetRef="endLeave">
            "tFormalExpression">
                '通过'}]]>"rejectFlow" name="驳回" sourceRef="managerJudgeTask" targetRef="endLeave2">
            "tFormalExpression">
                '驳回'}]]>"BPMNDiagram_process">
        "Leave" id="BPMNPlane_process">
            "leaveTask" id="BPMNShape_leaveTask">
                "79.99999999999999" width="100.0" x="304.60807973558974" y="122.00000000000001"/>"managerTask" id="BPMNShape_managerTask">
                "80.0" width="100.0" x="465.0" y="122.0"/>"managerJudgeTask" id="BPMNShape_managerJudgeTask">
                "40.0" width="40.0" x="611.5" y="142.0"/>"endLeave" id="BPMNShape_endLeave">
                "28.0" width="28.0" x="696.5" y="148.0"/>"startLeave" id="BPMNShape_startLeave">
                "30.0" width="30.0" x="213.2256558149128" y="147.0"/>"endLeave2" id="BPMNShape_endLeave2">
                "28.0" width="28.0" x="617.5" y="73.32098285753572"/>"flowEnd" id="BPMNEdge_flowEnd">
                "651.1217948717949" y="162.37820512820514"/>
                "696.5002839785394" y="162.0891701657418"/>"rejectFlow" id="BPMNEdge_rejectFlow">
                "631.866093577786" y="142.36609357778607" />
                "631.5931090276993" y="101.32067323657485" />"modeFlow" id="BPMNEdge_modeFlow">
                "404.60807973558974" y="162.0" />
                "465.0" y="162.0" />"flowStart" id="BPMNEdge_flowStart">
                "243.2256558149128" y="162.0" />
                "304.60807973558974" y="162.0" />"jugdeFlow" id="BPMNEdge_jugdeFlow">
                "565.0" y="162.21367521367523" />
                "611.9141630901288" y="162.41416309012877" />

其实就是把流程图的各种线条逻辑,用不同的XML标签描绘出来了。

:表示一个完整的工作流

:对工作流的描述

:工作流中起点位置(开始)

:工作流中结束位置(结束)

:代表一个任务审核节点(组长、经理等角色)

:逻辑判断节点,相当于流程图中的菱形框

:链接各个节点的线条,sourceRef属性表示线的起始节点,targetRef属性表示线指向的节点。

上边这一大坨XML是不是看着超级麻烦,要是有自动生成工具就好了,我发现IDEA自带设计工具,但实在是太难用了。真是没想到,Springboot + Flowable 开发工作流会这么简单!

作为一个面向百度编程的程序员,别的不行上网找答案的能力还是可以的,既然我都觉得写XML麻烦,那么想来官方肯定也想到了,说不定有现成的工具,逛了一圈官网https://www.flowable.org/downloads.html,居然真的找到了。

github下载地址:https://github.com/flowable/flowable-engine/releases/download/flowable-6.4.0/flowable-6.4.0.zip,下载速度那是相当感人,而且这个工具需要自己安装.......

真是没想到,Springboot + Flowable 开发工作流会这么简单!又找了个在线编辑的工具:http://www.learun.cn:8090/home_online.htm,各种折腾~,设计完流程后,直接复制自动生成的代码即可。真是没想到,Springboot + Flowable 开发工作流会这么简单!

流程审批

流程设计完后剩下的就是对工作流的审批和生成流程图。

首先启动一个请假的流程,以员工ID staffId作为唯一标识,XML文件中会接收变量 leaveTask,Flowable内部会进行数据库持久化,并返回一个流程Id processId,用它可以查询工作流的整体情况,任务Id task为员工具体的请假任务。

注意:一个请假流程 processId中可以包含多个请假任务 taskId。

/**
     * @author xiaofu
     * @description 启动流程
     * @date 2020/8/26 17:36
     */ @RequestMapping(value = "startLeaveProcess")
    @ResponseBody
    public String startLeaveProcess(String staffId) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("leaveTask", staffId);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("Leave", map);
        StringBuilder sb = new StringBuilder();
        sb.append("创建请假流程 processId:" + processInstance.getId());
        Listtasks = taskService.createTaskQuery().taskAssignee(staffId).orderByTaskCreateTime().desc().list(); for (Task task : tasks) {
            sb.append("任务taskId:" + task.getId());
        } return sb.toString();
    }

用启动流程时返回的 processId看一下一下当前的流程图

http://localhost:4000/leave/createProcessDiagramPic?processId=37513 
真是没想到,Springboot + Flowable 开发工作流会这么简单!

接下来将请假申请进行驳回 ,传入相应的 taskId后执行驳回,再看看整个工作流的效果。

http://localhost:4000/leave/rejectTask?taskId=10086 
/**
     * @param taskId
     * @author xinzhifu
     * @description 驳回
     * @date 2020/8/27 14:30
     */ @ResponseBody
    @RequestMapping(value = "rejectTask")
    public String rejectTask(String taskId) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("checkResult", "驳回");
        taskService.complete(taskId, map); return "申请审核驳回~";
    }

看到整个请假流程在经理审核这成功阻断了。

http://localhost:4000/leave/createProcessDiagramPic?processId=37513 
真是没想到,Springboot + Flowable 开发工作流会这么简单!

总结

开发工作流一般多用在OA系统等传统项目中,我也是第一次尝试做此类功能,收获还是蛮多的,技术栈又压进了一个知识点。今天分享的是个超级简单的demo,因为也是刚开始接触,等我用的贼溜的时候,再给小伙伴们做更成熟更深入的分享。

demo的github地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-work-flowable


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭