• 图文详细介绍:使用IDEA通过插件创建流程图解决Activiti工作流部署审批等操作


    前言

    本文主要将如何使用IDEA借助插件创建流程图,并且使用代码部署执行审批

    本次的工作流采用的是Activiti,案例是参考黑马程序教学视频员的案例

    下载插件

    需要两个插件 下载完插件必须重启!

    jboss jbmp主要用来bpmn和xml以及png进行文件格式转换和识别

    camuda bpmn主要用于画流程模板图,提供各种流程符号

    在这里插入图片描述
    在这里插入图片描述

    创建流程图

    首先在resource下创建一个bpmn目录,将来存放全部的流程图

    在这里插入图片描述

    新建一个出差的工作流模板
    [图片]

    创建出来是这样的xml文件
    [图片]

    右键进行图画编辑
    [图片]

    然后就可以进行设计流程图了

    设计流程图

    首先右键新建一个开始节点
    [图片]

    右键空白区域,修改id为myEvection
    [图片]

    修改这个流程模板的名称 也就是修改name
    在这里插入图片描述

    然后新建一个用户任务
    在这里插入图片描述

    点击用户任务给它设置任务名称,也就是对应任务的Name的值
    在这里插入图片描述

    设置用户指定负责人,这里为zhangsan ,也就是对应任务的Assignee选项
    在这里插入图片描述

    这两步骤的意思是指:创建了一个任务,任务名称叫创建出差申请,由张三负责审批

    下面继续创建一个流程节点(用户任务),步骤和上面相似

    最后需要创建一个结束任务
    在这里插入图片描述

    就是这样的 大概流程为 流程发起->zhangsan->jerry->jack->rose->流程结束
    在这里插入图片描述

    我们需要用把它连起来,也就是使用流向(箭头),一定要连直了,不然会串通不起来的,我下面这个就是错误示范
    在这里插入图片描述

    正确示范如下 所有的节点和曲线都要通过肉眼去连接,是个细心活
    在这里插入图片描述

    到这里使用流程设计器把整个流程设计好了

    注意:连线的时候尽量连直了,把图放大了再连会比较好连,不然会有问题!

    在这里插入图片描述

    生成PNG文件

    现在我们设计的流程模板只是一个bpmn文件,接下来生成png文件

    把我们生成都bpmn文件放在桌面上

    在这里插入图片描述
    然后修改后缀为xml文件
    在这里插入图片描述
    然后进行png图片转化,这样就清晰明了多了
    在这里插入图片描述
    导出到桌面
    在这里插入图片描述

    在这里插入图片描述
    然后查看,不知道为什么,步骤是反的。。。 我仔细检查了好几遍都没发现问题,应该是版本的问题,或者谁知道可以告诉我

    在这里插入图片描述

    由于上面那个png有问题,我又发现了一种导出流程图的方式

    直接在编辑流程图的地方右键空白处,直接导出png到本地,这次的没有问题
    在这里插入图片描述

    创建Activiti数据库

    建议参考以下链接 之前写过就不啰嗦了

    或者翻我之前的文章

    https://blog.csdn.net/weixin_46713508/article/details/125511574?spm=1001.2014.3001.5502

    流程部署

    现在一个流程我们已经定义好了,接下来就进行部署,把数据持久化到数据库中

    首先先创建一个测试类

    package com.wyh.test;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.RepositoryService;
    import org.activiti.engine.repository.Deployment;
    import org.junit.Test;
    
    /**
     * @program: Activiti01
     * @description: 测试流程部署
     * @author: 魏一鹤
     * @createDate: 2022-07-04 23:27
     **/
    
    public class ActivitiDemo   {
    
        //测试流程部署
        @Test
        public void testDeployment(){
            // 1.创建ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            // 2.使用ProcessEngine得到操作数据库的服务(RepositoryService)
            RepositoryService repositoryService = processEngine.getRepositoryService();
            // 3.使用RepositoryService进行流程部署,定义一个流程的名字,把bpmn文件和png文件部署到数据库里
            Deployment deploy = repositoryService.createDeployment()
                    .name("出差申请流程")//流程名称
                    .addClasspathResource("bpmn/evection.bpmn") //资源文件 bpmn配置文件
                    .addClasspathResource("bpmn/evection.png") //资源文件 png流程图
                    .disableSchemaValidation()//禁止校验文件
                    .deploy();
            // 4.输出部署信息
            System.out.println("流程部署的ID:"+deploy.getId());
            System.out.println("流程部署的名字:"+deploy.getName());
        }
    }
    
    • 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

    直接运行
    在这里插入图片描述

    通过日志我们可以发现已经部署流程到数据库里了

    在这里插入图片描述

    开启流程实例

    package com.wyh.test;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.RepositoryService;
    import org.activiti.engine.RuntimeService;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.junit.Test;
    
    /**
     * @program: Activiti01
     * @description: 测试流程部署
     * @author: 魏一鹤
     * @createDate: 2022-07-04 23:27
     **/
    
    public class ActivitiDemo   {
        // 启动流程实例
        @Test
        public void testStartProcess() {
            // 1.创建ProcessEngine
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            // 2.获取RuntimeService
            RuntimeService runtimeService = processEngine.getRuntimeService();
            // 3.根据流程定义的id启动流程
            ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection");
            // 4.输出内容
            System.out.println("流程定义ID = " + instance.getProcessDefinitionId());
            System.out.println("流程实例ID = " + instance.getId());
            System.out.println("当前活动的ID = " + instance.getActivityId());
        }
    }
    
    • 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

    在这里插入图片描述
    这样就成功启动流程实例了

    完成个人任务

    zhangsan查询出个人任务后,完成个人任务,让流程进行到下一步

    // 根据任务id完成个人任务
    @Test
    public void testCompletTask(){
        // 1 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2 获取service
        TaskService taskService = processEngine.getTaskService();
        // 3 根据任务id查询任务
        taskService.complete("2505");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    数据库里面act_ru_task里面的负责人就从当前的zhangsan换成下一个jerry了
    在这里插入图片描述
    任务历史,完成的任务会记录在act_hi_taskinst
    在这里插入图片描述
    完成完整的出差申请

    改造下代码,首先jerry进行审批

    // 根据任务id完成个人任务
    @Test
    public void testCompletTask(){
        // 1 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2 获取service
        TaskService taskService = processEngine.getTaskService();
        // 3 获取jerry在myEvection中对应的任务 我们已知只有一个任务 可使用singleResult获取一个结果集
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") // 流程的key
                .taskAssignee("jerry")   // 要查询的负责人
                .singleResult();// 因为可能有多个待办  所以是一个集合
    
        System.out.println("流程实例ID:"+task.getProcessInstanceId());
        System.out.println("任务ID:"+task.getId());
        System.out.println("任务负责人:"+task.getAssignee());
        System.out.println("任务名称:"+task.getName());
    
         // 4 获取jerry的完成任务
        taskService.complete(task.getId());
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    下一步换成jack,记录到历史表,没有问题
    在这里插入图片描述
    在这里插入图片描述
    然后是完成jack以及rose的任务,代码基本一样,只需要修改当前审批人,最终代码

    // 根据任务id完成个人任务
    @Test
    public void testCompletTask(){
        // 1 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2 获取service
        TaskService taskService = processEngine.getTaskService();
    
        // 3 获取zhangsan在myEvection中对应的任务 我们已知只有一个任务 可使用singleResult获取一个结果集
        //Task task = taskService.createTaskQuery()
        //        .processDefinitionKey("myEvection") // 流程的key
        //        .taskAssignee("jerry")   // 要查询的负责人
        //        .singleResult();// 因为可能有多个待办  所以是一个集合
        //
         3 获取jerry在myEvection中对应的任务 我们已知只有一个任务 可使用singleResult获取一个结果集
        //Task task = taskService.createTaskQuery()
        //        .processDefinitionKey("myEvection") // 流程的key
        //        .taskAssignee("jerry")   // 要查询的负责人
        //        .singleResult();// 因为可能有多个待办  所以是一个集合
    
        // 3 获取jack在myEvection中对应的任务 我们已知只有一个任务 可使用singleResult获取一个结果集
        //Task task = taskService.createTaskQuery()
        //        .processDefinitionKey("myEvection") // 流程的key
        //        .taskAssignee("jack")   // 要查询的负责人
        //        .singleResult();// 因为可能有多个待办  所以是一个集合
        //
        //System.out.println("流程实例ID:"+task.getProcessInstanceId());
        //System.out.println("任务ID:"+task.getId());
        //System.out.println("任务负责人:"+task.getAssignee());
        //System.out.println("任务名称:"+task.getName());
    
        // 3 获取rose在myEvection中对应的任务 我们已知只有一个任务 可使用singleResult获取一个结果集
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") // 流程的key
                .taskAssignee("rose")   // 要查询的负责人
                .singleResult();// 因为可能有多个待办  所以是一个集合
    
         // 4 获取jerry的完成任务
        taskService.complete(task.getId());
    
    
    }
    
    • 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

    整个出差申请审批完了,发现act_ru_task表里面没有数据了,因为rose(财务审批)是流程中的最后一个任务了,他做完了以后任务表里面就没有任务了

    在这里插入图片描述
    历史表里面全部记录了整个流程

    在这里插入图片描述

    总结

    至此,整个流程就通过Java代码的方式完成了,总结一下,根据不同的操作通过不同的服务实现,查询个人任务和完成个人任务都是通过流程实例的key和当前操作人来查询的

  • 相关阅读:
    机器学习 面试/笔试题(更新中)
    二叉搜索树相关题目总结(一) 力扣 Python
    Python—argparse模块
    git(代码冲突解决(客户端操作和命令行操作))
    概念解析 | 揭秘视觉与语言交叉模型:CLIP和BLIP的介绍
    WEB核心【记录网站登录人数,记录用户名案例】Cookie技术实现
    区块链积分系统:革新支付安全与用户体验的未来
    LeetCode经典算法题 no.118杨辉三角
    Android开发第二步(全屏嵌套H5页面)
    怎样用好LinkedIn领英平台开发客户?
  • 原文地址:https://blog.csdn.net/weixin_46713508/article/details/126415281