SpringBoot整合activiti7学生请假示例

参考博客:https://blog.csdn.net/weixin_44096448/article/details/103613377?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.baidujsUnder6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.baidujsUnder6

Java版本:1.8

SpringBoot版本<version>2.4.4</version>(SpringBoot和Activit7最好都用最新版本)

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.1</version>
        </dependency>

        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.9.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>7.0.0.Beta3</version>
        </dependency>

配置文件

server:
  port: 8080
spring:
  #Activiti property configuration
  activiti:
    database-schema-update: true
    history-level: full
    db-history-used: true
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://localhost:3306/activiti?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

安装actibpm插件

把编码设置成UTF8 

-Dfile.encoding=UTF-8

构建流程文件

 

 

 复制一份刚刚构建的流程文件,并将后缀名改为bpmn20.xml,打开后将报错的xmlns加上文件顶部的xmln约束

生成png文件,保存下来放到一起

接口

package com.example.mindsa.controller;

import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestController
@Slf4j
public class TestController {
    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    /**
     * 项目启动部署请假流程引擎。
     */
    @PostConstruct
    public void prepare() {
        // 创建一个部署对象
        Deployment deployment = repositoryService.createDeployment()
                .name("请假流程")
                .addClasspathResource("qbhs_bpmn20.xml")
                .addClasspathResource("qbhs.png")
                .deploy();
        log.info("部署ID:" + deployment.getId());
        log.info("部署名称:" + deployment.getName());
    }

    @ApiOperation("发起流程")
    @PostMapping("startProcess")
    public void startProcess(@RequestParam String student, @RequestParam String teacher) {
        String processDefinitionKey = "test01";
        Map<String, Object> map = new HashMap<>();

        //使用UEL 表达式设置

        // 学生填写申请单    Assignee:${student}
        map.put("student", student);

        // 班主任审批    Assignee:${teacher}
        map.put("teacher", teacher);

        ProcessInstance instance = runtimeService.startProcessInstanceByKey(processDefinitionKey, map);

        log.info("流程实例ID:" + instance.getId());
        log.info("流程定义ID:" + instance.getProcessDefinitionId());
    }

    @ApiOperation("任务查询")
    @PostMapping("searchTask")
    public List<String> searchTask() {
        //流程启动后,各各任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
        List<Task> list = taskService.createTaskQuery()
                //流程实例key
                .processDefinitionKey("test01")
                //查询谁的任务
                //.taskAssignee("")
                .list();
        List<String> idList = new ArrayList<String>();

        for (Task task : list) {
            idList.add(task.getId());
            log.info("任务ID:" + task.getId());
            log.info("任务名称:" + task.getName());
            log.info("任务的创建时间:" + task.getCreateTime());
            log.info("任务的办理人:" + task.getAssignee());
            log.info("流程实例ID:" + task.getProcessInstanceId());
            log.info("执行对象ID:" + task.getExecutionId());
            log.info("流程定义ID:" + task.getProcessDefinitionId());
        }
        return idList;

    }

    @ApiOperation("任务处理")
    @PostMapping("disposeTask")
    public void disposeTask(List<String> list) {
        for (String id : list) {
            // 任务id
            taskService.complete(id);
            System.out.println("处理任务id:" + id);
        }
    }
}

如果启动报错找不到act_ge_property表的话就在数据库连接加上

&nullCatalogMeansCurrent=true

例如

jdbc:mysql://localhost:3306/activiti?characterEncoding=UTF-8&nullCatalogMeansCurrent=true&serverTimezone=GMT&useSSL=fals

结尾、扫一扫下方微信名片即可+博主徽信哦 ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓  ↓↓↓

<think>好的,我现在需要帮助用户了解如何在Spring Boot项目中集成和使用Activiti工作流引擎。用户要求提供教程、示例代码和最佳实践。首先,我应该回顾已有的知识,并查看提供的引用内容,确保回答准确。 首先,根据引用[1],ActivitiSpring整合需要配置pom.xml文件,引入相关依赖。引用[4]中的示例代码展示了Spring Boot的配置,包括数据库连接和Activiti的配置参数。引用[5]提到了一个完整的Spring Boot和Vue项目,集成了在线编辑器和工作流功能,这可能涉及流程定义的位置和权限设置。 接下来,我需要组织回答的结构。用户可能需要步骤式的指导,所以分成几个部分:环境准备、配置、流程定义、服务层实现、最佳实践和相关问题。 在环境准备部分,需要列出必要的依赖,比如Spring Boot Starter、Activiti Spring Boot Starter,以及数据库驱动,如MySQL。同时,要确保用户知道在pom.xml中添加这些依赖。 然后是配置部分,根据引用[4]的YAML配置示例,需要说明如何配置数据源和Activiti参数,比如database-schema-update和process-definition-location-prefix。这些参数的作用需要解释清楚,例如自动创建表结构和指定流程文件的位置。 流程定义部分需要指导用户如何创建BPMN文件,可能使用在线设计器或插件。引用[5]提到在线流程编辑器,可能需要引用这一点,并建议用户使用Activiti提供的工具来设计流程图。 服务层实现部分,需要展示如何启动流程实例和查询任务。示例代码可以参考标准的Activiti API调用,比如使用RuntimeService和TaskService。同时,提醒用户处理事务管理,可能需要使用@Transactional注解。 最佳实践部分需要结合引用内容。例如,流程版本管理(引用[4]中的database-schema-update),流程监控(引用[5]的流程图跟踪),表单集成(引用[5]的表单关联),以及扩展性(引用[3]的REST API配置)。同时,权限控制(引用[5]的工作流权限设置)也是重要的一环。 相关问题部分要根据用户可能的问题生成,比如性能优化、表单集成方式、REST API整合、版本控制等,这些在引用中都有涉及。例如,引用[3]讨论了REST API的配置,引用[5]提到了表单集成,引用[4]涉及版本控制。 需要注意所有数学表达式使用$...$,但在这个问题中可能较少涉及数学内容,不过如果有变量或代码中的符号,需要正确使用。例如,数据库URL中的变量可能需要用代码块而非数学格式。 最后,确保回答引用正确的来源,比如引用[4]中的配置代码,引用[5]中的功能说明,引用[3]的REST API配置步骤。引用标识要自然添加在相关段落末尾。 需要检查是否所有引用都被正确使用,没有遗漏关键点。例如,数据库配置、流程定义位置、版本管理、REST API整合等都是用户可能需要的关键信息。同时,示例代码要准确,配置参数要正确,比如history-level设置成full,这样记录完整的审批历史。 可能还需要提醒用户关于事务管理和生产环境中的注意事项,比如不要使用database-schema-update: true在生产环境,而是使用更严格的策略。此外,流程文件的存放位置和权限控制也是实际开发中需要注意的地方。 总结来说,回答需要结构清晰,分步骤说明整合过程,提供示例代码和配置,引用相关的最佳实践,并生成相关问题引导用户进一步学习。</think>以下是在Spring Boot项目中集成Activiti工作流引擎的完整指南,包含配置示例、代码实现和最佳实践: ### 一、环境准备与基础配置 1. **添加依赖** ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 2. **配置数据源与参数**(引用[4]) ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/activiti_db driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root activiti: database-schema-update: true # 自动创建/更新表结构 check-process-definitions: true process-definition-location-prefix: classpath:/processes/ history-level: full # 记录完整历史 ``` ### 二、流程定义开发 1. **创建BPMN流程图** ```xml <!-- src/main/resources/processes/leave-approval.bpmn20.xml --> <process id="leaveApproval" name="请假审批流程"> <startEvent id="start"/> <userTask id="leaderAudit" name="直属领导审批"/> <exclusiveGateway id="decisionGateway"/> <sequenceFlow sourceRef="start" targetRef="leaderAudit"/> <sequenceFlow sourceRef="leaderAudit" targetRef="decisionGateway"/> <!-- 其他节点... --> </process> ``` 2. **使用在线设计器**(引用[5]) 通过`/activiti-app`路径访问Activiti自带的Web流程设计器,支持可视化流程配置和权限设置 ### 三、服务层实现 ```java @Service public class LeaveService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Transactional public String startProcess(LeaveRequest request) { Map<String, Object> variables = new HashMap<>(); variables.put("days", request.getDays()); ProcessInstance instance = runtimeService.startProcessInstanceByKey( "leaveApproval", variables); return instance.getId(); } public List<Task> getUserTasks(String userId) { return taskService.createTaskQuery() .taskCandidateUser(userId) .list(); } } ``` ### 四、最佳实践 1. **流程版本管理**(引用[4]) - 通过`activiti:database-schema-update`控制数据库更新策略 - 生产环境建议设置为`false`,使用FlyDB或Liquibase管理数据库变更 2. **流程监控与跟踪**(引用[5]) ```java // 获取流程实例历史记录 HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery(); List<HistoricProcessInstance> instances = query.processInstanceId(instanceId).list(); ``` 3. **表单集成方案**(引用[5]) - 使用动态表单或外置表单系统 - 通过`<activiti:formProperty>`绑定业务数据 - 支持驳回任意节点、会签/或签等高级功能 4. **扩展性设计**(引用[3]) ```java // 配置REST API支持 @Bean public RestResponseFactory restResponseFactory() { return new RestResponseFactory(); } ``` ### 五、调试与部署 1. **启动时自动部署流程**(引用[4]) ```yaml activiti: check-process-definitions: true process-definition-location-prefix: classpath:/processes/ ``` 2. **访问管理控制台** 通过`/activiti-admin`路径访问管理界面,支持流程监控和任务管理
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值