Springboot集成Activiti7

导入依赖

<dependencies>
    <!-- 整合Activiti7 -->
    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-spring-boot-starter</artifactId>
      <version>7.1.0.M6</version>
    </dependency>

    <!-- 统一commons-io版本,不然集成Activiti会报错 -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.11.0</version>
    </dependency>


    <!-- 数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.2.5</version>
    </dependency>

    <!-- 数据库驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!-- 不添加会报Bean method 'inMemoryUserDetailsManager' in 'UserDetailsServiceAutoConfiguration' not loaded...错 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

  </dependencies>

创建启动类
平时怎么创就怎么创,没啥特殊的

创建配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://xxx:xxx/xxx?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
    username: xxx
    password: xxx
    druid:
      max-active: 20
      min-idle: 2
      initial-size: 2
  activiti:
    #1.flase:activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
    #2.true:默认值。activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
    #3.create_drop: fiactiviti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
    #4.drop-create:/iactiviti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
    database-schema-update: true
    #activiti7默认不生成历史信思表,开启历史表
    db-history-used: true
    #记录历史等级可配置的历史级别有none,activity,audit,full
    #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
    #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
    #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit/history的默认值。
    #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
    history-level: full
    check-process-definitions: true
    # 流程文件默认存放路径classpath*:**/processes/
#    process-definition-location-prefix: classpath*:**/processes/
    # 流程文件默认文件后缀 **.bpmn20.xml", "**.bpmn"
#    process-definition-location-suffixes: **.bpmn20.xml", "**.bpmn"

这里需要注意的是在数据库路径后面要加上&nullCatalogMeansCurrent=true,不然启动又会报错
三步一个坑!!

创建bpmn流程图

没必要搞得像其他帖子一样,翻墙下一个actbpmn插件,或者是下个前端页面来画,在线的bpmn编辑网站一堆啊
以下两个都不错
https://demo.bpmn.io/
https://bpmn.52itstyle.vip/

在线画完直接浏览器下载到本地,还能同时下载svg图
在这里插入图片描述

在这里插入图片描述
复制到resouces目录下
记得先创建一个processes文件夹,Activiti默认是去这个文件夹里找bpmn文件的
在这里插入图片描述
下载来的bpmn文件需要修改一点点地方


id是这个流程的名字,可以认为是唯一标识吧,可以自己修改,也可以就用这个也行

启动项目

在这里插入图片描述
一直到最后,如果没有报错,那就是表示万事大吉了
然后去看看数据库
在这里插入图片描述
正好多了25张表

流程测试

@SpringBootTest
@Slf4j
public class ActivitiTest {

  @Autowired
  private RuntimeService runtimeService;

  @Autowired
  private TaskService taskService;

  @Autowired
  private RepositoryService repositoryService;

  @Autowired
  private HistoryService historyService;


  /**
   * 测试流程
   */
  @Test
  public void testStartProcess(){

    // 开启流程 key填的是流程的表示,与bpmn里的id对应
//    String instanceKey = "myProcess_1";
    String instanceKey = "myLeave";
    log.info("开启请假流程...");
    Map<String, Object> startMap = new HashMap<String, Object>();
    startMap.put("userId", "10001");
    ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, startMap);
    log.info("启动流程实例成功:{}", instance);
    log.info("流程实例ID:{}", instance.getId());
    log.info("流程定义ID:{}", instance.getProcessDefinitionId());

    // 获取任务信息
    String instanceId = instance.getId(); // 实例id,从上一步获取
    String leaveDays = "10"; // 请假天数
    String leaveReason = "回家睡觉"; // 请假原因
    Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult();
    if (task == null) {
      log.info("查询到任务为空!");
    }


    // 提交请假申请
    Map<String, Object> workerMap = new HashMap();
    workerMap.put("days", leaveDays);
    workerMap.put("date", new Date());
    workerMap.put("reason", leaveReason);
    taskService.complete(task.getId(), workerMap);
    log.info("执行【提交请假申请】环节,流程推动到【部门经理审批】环节");

    // 部门经理审批 这里需要更新任务,上一步任务已经执行完了
    task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult();
    String days = (String) taskService.getVariable(task.getId(), "days");
    Date date = (Date) taskService.getVariable(task.getId(), "date");
    String reason = (String) taskService.getVariable(task.getId(), "reason");
    String userId = (String) taskService.getVariable(task.getId(), "userId");
    System.out.println("请假人id:  " + userId);
    System.out.println("请假天数:  " + days);
    System.out.println("请假理由:  " + reason);
    System.out.println("请假日期:  " + date.toString());
    String departmentalOpinion = "批了,不用回来了!";
    Map<String, Object> boosMap = new HashMap();
    boosMap.put("departmentalOpinion", departmentalOpinion);
    taskService.complete(task.getId(), boosMap);
    log.info("请假流程结束");
  }
}

执行结果

在这里插入图片描述

当然这里仅仅是简单的例子
简单的通过了
那接下来就是去玩更复杂的例子啦~~

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值