springboot集成flowable创建请假流程实例

  springboot如何集成flowable,如何部署flowable在线编辑器画bpm图以及bpm图的画法,我在上一篇博客中写了,这里直接上代码(源码地址:晚安/flowable_holiday (gitee.com))。 

  这是我画的请假流程bpm图。

  然会到代码部分。

  首先,先写一个config类,避免生成的bpm图中文乱码。

package com.example.config;

import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.spring.boot.EngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;


@Configuration
public class FlowableConfig implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration> {
    @Override
    public void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) {
        springProcessEngineConfiguration.setActivityFontName("宋体");
        springProcessEngineConfiguration.setLabelFontName("宋体");
        springProcessEngineConfiguration.setAnnotationFontName("宋体");
    }
}

  由于我在画bpm图的时候,给“经理审批”节点和“老板审批”节点设置了监听器。所以接下来写监听器类

  • 经理审批节点监听器。指定任务受理人为“领导”。
    package com.example.listen;
    
    import org.flowable.engine.delegate.TaskListener;
    import org.flowable.task.service.delegate.DelegateTask;
    
    public class ManagerTaskHandler implements TaskListener {
        
        @Override
        public void notify(DelegateTask delegateTask) {
            delegateTask.setAssignee("领导");
            System.out.println("执行监听器————————————————————————————————————");
        }
    }
    
  • 老板审批节点监听器。指定任务受理人为“老板”。
    package com.example.listen;
    
    import org.flowable.engine.delegate.TaskListener;
    import org.flowable.task.service.delegate.DelegateTask;
    
    public class BossTaskHandler implements TaskListener {
    
        @Override
        public void notify(DelegateTask delegateTask) {
            delegateTask.setAssignee("老板");
        }
    }
    

  接下来到controller。

  • 发起请假流程。这里要说明一下,只有在上一个节点完成任务后,流程才会执行到下一个节点。所以这里在发起流程后,就手动完成了任务,让流程进行到下一个节点。
    /**
     * 发起请假
     *
     * @param userId    用户Id
     * @param days     请假天数
     * @param descption 描述
     */ 
@RequestMapping(value = "/add")
    @ResponseBody
    public String addExpense(String userId, Integer money, String descption) {

        //启动流程
        HashMap<String, Object> map = new HashMap<>();
        map.put("taskUser", userId);
        map.put("days", days);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave-flow", map);
        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        taskService.complete(task.getId());

        return "提交成功.流程Id为:" + processInstance.getId() + "任务id: " + task.getId() ;
    }
  • 其他操作。
        /**
         * 获取审批管理列表
         */
        @RequestMapping(value = "/list")
        @ResponseBody
        public Object list(String userId) {
            List<Task> tasks = taskService.createTaskQuery().taskAssignee(userId).orderByTaskCreateTime().desc().list();
            for (Task task : tasks) {
            }
            System.out.println(tasks.toString());
    
            return tasks.toString();
        }
    
    
        /**
         * 批准
         *
         * @param taskId 任务ID
         */
        @RequestMapping(value = "apply")
        @ResponseBody
        public String apply(String taskId) {
            List<Task> t = taskService.createTaskQuery().list();
            Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    
            //Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    
            if (task == null) {
                throw new RuntimeException("流程不存在");
            }
            //通过审核
            HashMap<String, Object> map = new HashMap<>();
            map.put("result", "同意");
            taskService.complete(taskId, map);
            return "processed ok!";
        }
    
        /**
         * 拒绝
         */
        @ResponseBody
        @RequestMapping(value = "reject")
        public String reject(String taskId) {
            HashMap<String, Object> map = new HashMap<>();
            map.put("result", "驳回");
            taskService.complete(taskId, map);
            return "reject";
        }
    
        /**
         * 生成流程图
         *
         * @param processId 任务ID
         */
        @RequestMapping(value = "processDiagram")
        public void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception {
            List<ProcessInstance> t = runtimeService.createProcessInstanceQuery().list();
            ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
    
    
            //流程走完的不显示图
            if (pi == null) {
                return;
            }
            Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
            //使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
            String InstanceId = task.getProcessInstanceId();
            List<Execution> executions = runtimeService
                    .createExecutionQuery()
                    .processInstanceId(InstanceId)
                    .list();
    
            //得到正在执行的Activity的Id
            List<String> activityIds = new ArrayList<>();
            List<String> flows = new ArrayList<>();
            for (Execution exe : executions) {
                List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
                activityIds.addAll(ids);
            }
    
            //获取流程图
            BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
            ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration();
            ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();
    //        InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0);
            InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, Collections.emptyList(), engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), null, 1.0, false);
            OutputStream out = null;
            byte[] buf = new byte[1024];
            int legth = 0;
            try {
                out = httpServletResponse.getOutputStream();
                while ((legth = in.read(buf)) != -1) {
                    out.write(buf, 0, legth);
                }
            } finally {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            }
        }
    

  测试。

  • 发起流程。可以看到后台打印了监听器中的内容,说明执行了监听器。

  • 获取审批列表。
  • 通过经理审批。taskId可以从act_ru_task表中查看。
  • 查看流程图。
  • 老板驳回请求。
  • 再次查看流程图。可以看到驳回请求后,又回到申请人节点。 

  • 如果老板也通过的话,整个流程就结束了。

       整个流程到这里就演示完了。当时在学的时候,流程卡在第一个节点不往下执行,最后发现只有上一个节点任务完成,才会到下一个节点,发起人节点要手动完成任务。其实在实际开发中,当发起人提交表单时,任务也就完成了,流程会接着往下执行。

  最后补充一下个人认为比较重要的几个表:

  act_ru_execution:运行流程实例表。发起的运行中流程可以在此表中看到。

  act_ru_task:运行时任务表。可以查看运行的任务id和任务执行到哪个节点。

  act_re_procdef:已经发布定义的流程可以在此表中看到。

  act_id_user:用户信息表。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 集成 Flowable 是一种在应用程序中使用 Flowable 流程引擎的方法。您可以使用 Spring Boot 自动配置和启动 Flowable 引擎,并通过使用 FlowableJava API 进行定制。 为了集成 Flowable,您需要添加 Flowable 的依赖,并在 Spring Boot 应用程序中配置 Flowable 的数据源和流程引擎。您可以使用 Flowable 提供的数据库表创建数据库,并在启动时加载流程定义。 进行完这些步骤后,您就可以在您的应用程序中使用 Flowable流程引擎了。您可以创建和启动流程实例,处理任务,并使用 Flowable 的 API 进行定制。 ### 回答2: 前置知识: 了解JavaSpringSpringBoot、Maven等相关技术;了解BPMN2.0规范,对Flowable工作流框架有基本了解。 什么是Flowable Flowable是一个轻量级开源的工作流管理框架,实现了BPMN2.0规范,并支持多种数据库。Flowable提供了完整的工作流引擎功能,包括流程定义、流程部署、流程实例、任务管理、历史数据等。 为什么选择SpringBoot集成Flowable SpringBootSpring框架的一种快速开发框架,它提供了许多开箱即用的功能,可以让我们更加专注于业务逻辑的实现上。同时,SpringBoot也提供了一种快速集成其他框架的方式,可以让我们在项目中轻松地集成Flowable工作流框架。 如何集成Flowable 以下是将Flowable集成SpringBoot项目中的步骤: 1. 引入Flowable依赖 ```xml <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.6.0</version> </dependency> ``` 2. 配置数据库 Flowable支持多种数据库,我们需要在application.properties文件中配置相关的数据源信息: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/flowable?characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=123456 ``` 3. 配置流程引擎 在SpringBoot项目启动时,会自动创建一个流程引擎,可以在application.properties文件中对其进行配置: ```properties flowable.checkProcessDefinitions=false flowable.async.executorActivate=false flowable.database-schema-update=true ``` 4. 创建流程定义 Flowable通过BPMN2.0规范来定义流程,可以使用Flowable Modeler来设计并导出BPMN2.0文件,然后通过REST API来部署流程定义。 5. 调用REST API 将流程定义部署到Flowable后,我们可以使用REST API来启动流程实例、查询任务等。 6. 编写业务逻辑 在SpringBoot项目中,我们可以通过调用Flowable提供的Java API来编写与工作流相关的业务逻辑,例如启动流程实例、完成任务等。 总结 SpringBoot提供了一种快速集成Flowable工作流框架的方式,通过引入依赖、配置数据库、配置流程引擎、创建流程定义、调用REST API、编写业务逻辑等步骤,实现了将Flowable工作流框架集成SpringBoot项目中的目的。通过这种方式,我们可以更加轻松地实现工作流相关的功能,提高项目开发效率。 ### 回答3: Spring Boot 是一种用于构建单独可执行 Spring 应用程序的框架。Flowable 是一种流程引擎,它支持 BPMN 2.0 标准,可以将流程描述转换成可运行的流程实例Spring BootFlowable 结合使用,可以使开发人员快速构建基于 BPMN 2.0 标准的流程应用程序。下面是集成 Spring BootFlowable 的过程: 1. 添加 Flowable 依赖 在 pom.xml 文件中添加 Flowable 相关依赖: ``` <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.6.0</version> </dependency> ``` 2. 配置 Flowable 在 application.yml 文件中添加 Flowable 相关配置: ``` flowable: database-schema-update: true servlet: enabled: true context-path: /flowable ``` 这里的配置表示: - 执行数据库结构更新:database-schema-update - 开启 Flowable servlet:servlet.enabled - 设置 Flowable servlet 路径:servlet.context-path 3. 添加流程定义 通过 Flowable Modeler 工具绘制 BPMN 流程图,并将其导入到 Spring Boot 项目中。可以将 BPMN 文件放置在 Flowable 的 classpath 下。如果是使用 Eclipse 开发,可以将 BPMN 文件放置在 src/main/resources/processes 目录下。 4. 部署流程定义 通过在 Spring Boot 应用程序中添加以下代码,可以部署流程定义: ``` @Autowired private RepositoryService repositoryService; public void deployProcessDefinition() { Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/myprocess.bpmn") .deploy(); } ``` 此代码会读取 BPMN 文件并将流程定义部署到 Flowable 中。 5. 运行流程实例 为了启动流程实例,需要调用 RuntimeService 的 startProcessInstanceByKey 方法并传递流程实例的 key。下面是一个示例代码: ``` @Autowired private RuntimeService runtimeService; public void startProcessInstance() { Map<String, Object> variables = new HashMap<>(); variables.put("variable1", "value1"); variables.put("variable2", "value2"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myprocess", variables); } ``` 这些代码将启动名为 myprocess 的流程实例,并设置两个流程变量。 以上是 Spring Boot 集成 Flowable 的基本流程。开发人员可以根据自己的业务需求,使用 Flowable 提供的 API 进一步实现自己的业务逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值