springboot整合activiti工作流引擎demo源碼


1、添加activiti相關依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>activiti</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activiti</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <activiti.version>5.22.0</activiti.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.jackson</groupId>
                    <artifactId>jackson-core-asl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-jdbc</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-orm</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>mybatis</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>activation</artifactId>
                    <groupId>javax.activation</groupId>
                </exclusion>
            </exclusions>

        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <!-- Activiti 流程圖 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-common-rest</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- Activiti 在線設計 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-modeler</artifactId>
            <version>5.22.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-web</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-config</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-core</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-crypto</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-security-web</artifactId>
                    <groupId>org.springframework.security</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-webmvc</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>activation</artifactId>
                    <groupId>javax.activation</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-io</artifactId>
                    <groupId>commons-io</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>



    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、application.properties相關配置

server.port=9091

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti?allowPublicKeyRetrieval=true&useSSL=FALSE&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCunrrent=true
spring.datasource.username=root
spring.datasource.password=123123
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
spring.jpa.properties.hibernate.show_sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.activiti.check-process-definitions=false

3、啟動Application

 

package com.example.activiti;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com")
@EnableAutoConfiguration(exclude = {org.activiti.spring.boot.SecurityAutoConfiguration.class})
public class ActivitiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActivitiApplication.class, args);
    }

}
application 啟動類

4、controller

package com.example.activiti.controller;

import com.example.activiti.service.ActivityConsumerService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileNotFoundException;
import java.util.List;

/**
 * @Author: zhengyixin
 * @Description:
 * @Date: 2021/4/14 下午 04:01
 */

@RestController
@RequestMapping("/activiti")
public class ActivitiController {

    @Autowired
    private ActivityConsumerService  activityConsumerService;

    /**
     * 注冊流程
     * @return
     */
    @RequestMapping("/createDeployment")
    public Boolean createDeployment() throws FileNotFoundException {
        return activityConsumerService.createDeployment();
    }

    /**
     * 啟動流程
     * @return
     */
    @RequestMapping("/startActivityDemo")
    public Boolean startActivityDemo(@RequestParam(name = "key") String key){
        return activityConsumerService.startActivityDemo(key);
    }

    /**
     * 獲取待辦
     * @return
     */
    @RequestMapping("/getTaskList")
    public List<Task> getTaskList(@RequestParam(name="assignee") String assignee){
        return activityConsumerService.getTaskList(assignee);
    }

    /**
     * 提交
     * @param taskId
     * @return
     */
    @RequestMapping("/complete")
    public boolean complete(@RequestParam(name="taskId") String taskId){

        return activityConsumerService.complete(taskId);
    }
    /**
     * 根據流程id直接結束流程
     * @paramru
     * @return
     */
    @RequestMapping("/deleteProcessInstance")
    public boolean deleteProcessInstance(String runId){
        return activityConsumerService.deleteProcessInstance(runId);
    }

}
controller

5、service

package com.example.activiti.service;

import org.activiti.engine.task.Task;

import java.io.FileNotFoundException;
import java.util.List;

/**
 * @Author: zhengyixin
 * @Description:
 * @Date: 2021/4/14 下午 04:03
 */
public interface ActivityConsumerService {
    boolean createDeployment() throws FileNotFoundException;
    boolean startActivityDemo(String key);
    public List<Task> getTaskList(String assignee);
    boolean  complete(String taskId);
    boolean  deleteProcessInstance(String runId);
}
View Code

6、service實現類

package com.example.activiti.service.serviceimpl;

import com.example.activiti.service.ActivityConsumerService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.DeploymentBuilder;

import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.SQLOutput;
import java.util.List;

/**
 * @Author: zhengyixin
 * @Description:
 * @Date: 2021/4/14 下午 04:04
 */
@Service
public class ActivityConsumerServiceImpl implements ActivityConsumerService {
    @Autowired
   private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    ProcessEngine processEngine;

    /**
     * 注冊一個流程
     * @return
     */
    @Override
    public boolean createDeployment() throws FileNotFoundException {

        File bpmnPath=new File("C:/JavaProject/activiti/contract.bpmn");
     /*   builder.addClasspathResource("askformoney.bpmn");
        builder.deploy();*/
        InputStream fis=new FileInputStream(bpmnPath);
        RepositoryService repositoryService=processEngine.getRepositoryService();
        DeploymentBuilder builder=repositoryService.createDeployment();
        builder.addInputStream("contract.bpmn",fis);
        builder.deploy();


        return true;
    }

    /**
     * 查詢當前用戶的待辦事項
     * @param assignee 用戶id
     * @return
     */
    public List<Task> getTaskList(String assignee){
        //獲取待辦的一些信息,這里可以傳入需要查詢的用戶,
        //我這里查詢的所有待辦
        System.out.println(assignee);
        List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
       // List<Task> tasks = taskService.createTaskQuery().list();
        for (Task t:tasks) {
            System.out.println(t.getCreateTime());
            System.out.println(t.getId());
            System.out.println(t.getName());
            System.out.println(t.getProcessInstanceId());
            System.out.println(t.getTaskDefinitionKey());
            System.out.println(t.getParentTaskId());
        }
      return tasks;
    }


    /**
     * 根據流程key開啟一個流程
     * @param key
     * @return
     */
    @Override
    public boolean startActivityDemo(String key) {
      //  ProcessInstance test01 = runtimeService.startProcessInstanceByKey(key);key 是表act_re_procdef的Key字段
        ProcessInstance test01=runtimeService.startProcessInstanceById(key);//表act_re_procdef  ID_字段
        String id = test01.getId();
        System.out.println("流程id="+id);
        /*  */
        /*    String assignee = "abc";*/
        return true;
    }

    /**
     * 根據任務id提交任務
     * @param taskId
     * @return
     */
    @Override
    public boolean  complete(String taskId){
        taskService.complete(taskId);
        return true;
    }

    /**
     * 根據流程id直接結束流程  表act_hi_sctinst的ID_ 或者act_ru_task表的ID_
     * @param runId
     * @return
     */
    @Override
    public boolean  deleteProcessInstance(String runId){
        runtimeService.deleteProcessInstance(runId,"結束");
        return true;
    }


}
View Code

 啟動項目時會自動在數據庫創建26個表

 

7、添加一個流程定義bpmn文件(這里需要在idea上安裝一個actiBPM插件,這個插件在Plugins庫可能檢索不到,需要去idea官網找jar包安裝),bpmn圖要保存在項目根目錄下,不然有可能會報ClassPathResource Not Found 。UserTask節點上的Assignee就是審核人的意思,這個地方有個坑,明明填上去了,關掉bpmn文件之后再次打開值就沒了,目前找到的解決方案是先不關bpmn文件,注冊啟動該流程,assignee就能保存上

 a、注冊流程:請求接口 localhost:9091/activiti/createDeployment  會在act_re_procdef 表生成有一條記錄

 

 

 b、啟動流程:請求接口localhost:9091/activiti/startActivityDemo?key=contract_check:1:4 會在act_ru_task表新增一條記錄,這個表記錄的是當前正在執行的流程實例節點狀態

 

 c、查詢某個審核人的待辦任務:localhost:9091/activiti/getTaskList?assignee=wanghaochuan

 d、提交任務 localhost:9091/activiti/complete?taskId=8

      act_ru_task記錄的數據會跳到下一個節點

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM