若依框架SpringBoot+Activiti工作流的使用

这篇具有很好参考价值的文章主要介绍了若依框架SpringBoot+Activiti工作流的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用简介:本技术点主要是针对类审批的业务流程的建模,可以有:任务发布(即流程开始)到一级一级的审批到最终结束(即流程结束)一整套完备的模型

1、idea下载activiti插件

  1. ider以前版本下载actiBPM,但是新版ider这个插件已经被淘汰,已经被下面这个替代

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

2、单独起一个activiti服务

3、添加依赖在activiti服务中:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
   <groupId>org.activiti</groupId>
   <artifactId>activiti-spring-boot-starter</artifactId>
   <version>7.0.0.Beta2</version>
</dependency>
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>2.0.0</version>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
</dependency>

4、添加配置

我这里的服务结构:

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

a、activiti.cfg.xml的配置(直接粘,需要修改为自己的数据库):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
                   http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
   <!-- 默认id对应的值 为processEngineConfiguration -->
   <!-- processEngine Activiti的流程引擎 -->
   <bean id="processEngineConfiguration"
         class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
       <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
       <property name="jdbcUrl" value="jdbc:mysql://*****:3306/activiti"/>
       <property name="jdbcUsername" value="root"/>
       <property name="jdbcPassword" value="*****"/>
       <!-- activiti数据库表处理策略 不存在就创建表-->
       <property name="databaseSchemaUpdate" value="true"/>
   </bean>
</beans>

配置讲解:

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

b、添加log4j的配置(无需修改,直接粘):

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\XX\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n

  1. 创建流程图文件:

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

在创建好的文件中任意位置右键,选择 View BPMN Diagram,打开可视化界面(流程定义的界面

若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

任意右键选择定义流程:

若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

 若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

解决图片乱码问题

1.打开 IDEA 安装路径,找到如下的安装目录

若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

追加一条命令: -Dfile.encoding=UTF-8
如下所示

若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

至此activiti的准备工作结束,一下是代码部分:

一、demo代码示例:
public class TestCreateTable {
   /**
    * 生成 activiti的数据库表
    */
   @Test
   public void testCreateDbTable() {
       //使用classpath下的activiti.cfg.xml中的配置创建processEngine
       //如果使用默认则需要上面activiti.cfg.xml配置
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       System.out.println(processEngine);
   }

   //部署
   @Test
   public void test01() {
       //1、创建ProcessEngine
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       //2、得到RepositoryService实例
       RepositoryService repositoryService = processEngine.getRepositoryService();
       //3、使用RepositoryService进行部署
       Deployment deploy = repositoryService.createDeployment().addClasspathResource("bpmn/chuchai.bpmn20.xml")
               .addClasspathResource("bpmn/diagram.png")
               .name("团购申请v1.0")
               .deploy();
       //4、输出部署信息
       System.out.println("部署id"+deploy.getId());
       System.out.println("部署的任务名称:"+deploy.getName());
   }

   //启动流程
   @Test
   public void testDeploy() {
       //1.创建ProcessEngine对象
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       //创建TaskService
       TaskService taskService = processEngine.getTaskService();

       Map<String, Object> variables = new HashMap<>();
       //张三就是在bpmnAssignee配置的参数
       variables.put("张三", "aaa");
       //3.创建流程实例  流程定义的key需要知道 holiday
       ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine()
               .getRuntimeService()
               .startProcessInstanceByKey("chuchai", variables);
       Task tmp = taskService.createTaskQuery()
               .processInstanceId(processInstance.getProcessInstanceId()).singleResult();
       tmp.setAssignee("张三");
       //完成此节点。由下一节点审批。完成后act_ru_task会创建一条由下节点审批的数据
       taskService.complete(tmp.getId(),variables);
       //4.输出实例的相关信息
       System.out.println( "流程部署ID" + processInstance.getDeploymentId() );
       System.out.println( "流程定义ID" + processInstance.getProcessDefinitionId());
       System.out.println( "流程实例ID" + processInstance.getId() );
       System.out.println( "活动ID" + processInstance.getActivityId() );
   }


   @Test
   //查询任务
   public void test(){
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       //创建TaskService
       TaskService taskService = processEngine.getTaskService();
       //根据流程key 和 任务负责人 查询任务
       List<Task> list = taskService.createTaskQuery()
               .processDefinitionKey("chuchai") //流程Key
               .taskAssignee("张三")//只查询该任务负责人的任务
               .list();

       for (Task task : list) {
           System.out.println("流程实例id" + task.getProcessInstanceId());
           System.out.println("任务id" + task.getId());
           System.out.println("任务负责人:" + task.getAssignee());
           System.out.println("任务名称:" + task.getName());
       }

   }

   //审批流程
   @Test
   public void test1(){
       //1.创建ProcessEngine对象
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       //创建TaskService
       TaskService taskService = processEngine.getTaskService();
       //根据角色信息获取自己的待办
       List<Task> T = taskService.createTaskQuery().taskAssignee("zs").list();
       if(!ObjectUtils.isEmpty(T)) {
           for (Task item : T) {
               Map<String, Object> variables = new HashMap<>();
               variables.put("张三", "zs");
               variables.put("isSuccess", true);
               item.setAssignee("李四");
               //增加审批备注
               taskService.addComment(item.getId(),item.getProcessInstanceId(),"部门经理同意");
               //完成此次审批。由下节点审批
               taskService.complete(item.getId(), variables);
           }
       }
   }

   // 结束流程
   @Test
   public void test02() {
       //1.创建ProcessEngine对象
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       //        创建TaskService
       TaskService taskService = processEngine.getTaskService();
       //act_re_execution id
       String taskId = "42503";
       //        任务负责人
       String assingee = "李四";
       Task task = taskService.createTaskQuery()
               .taskId(taskId)
               .taskAssignee(assingee)
               .singleResult();
       if (task != null) {
           HashMap<String, Object> map = new HashMap<>();
           map.put("agree", 1);
           taskService.complete(taskId, map);

           System.out.println("完成任务");
       }

   }
}

二、项目代码示例:controller层代码(这里是运用到项目中的代码)


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

   @Autowired
   private IActivitiService iActivitiService;
   //生成25张表
   @GetMapping
   public Result getTables(){
       log.info("开始生成表................................................................");
       Result result = iActivitiService.getTable();
       return result;
   }

   //流程部署
   @GetMapping("/bushu")
   public Result bushu(){
       log.info("部署 ");
       return Result.success("ok");

   }

   //查询个人待执行的任务
   @GetMapping("/list")
   public Result list(){
       log.info("查询个人待执行的任务");
       Result result = iActivitiService.list();
       return result;
   }

   //结束
   @GetMapping("/complete")
   public Result complete(){
       log.info("结束");
       Result result = iActivitiService.complete();
       return result;
   }
}

Service层代码:


@Service
@Repository
@Slf4j
public class ActivitiServiceImpl implements IActivitiService {

   @Autowired
   public IActivitiMapper iActivitiMapper;

   @Override
   public Result getTable() {
       //使用classpath下的activiti.cfg.xml中的配置创建processEngine
       //如果使用默认则需要上面activiti.cfg.xml配置
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       return Result.success("生成表成功");
   }

   @Override
   public Result bushu() {
       //1、创建ProcessEngine
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       //2、得到RepositoryService实例
       RepositoryService repositoryService = processEngine.getRepositoryService();
       //3、使用RepositoryService进行部署
       Deployment deploy = repositoryService.createDeployment().addClasspathResource("activiti/groupactiviti.bpmn20.xml")
               .addClasspathResource("activiti/groupactiviti.png")
               .name("团购申请审批")
               .deploy();
       //4、输出部署信息
       log.info("部署id"+deploy.getId());
       log.info("部署的任务名称:"+deploy.getName());

       //5、启动流程定义       根据流程定义的id启动流程                           key:act_re_procdef中的KEY
       //创建TaskService
       TaskService taskService = processEngine.getTaskService();

       Map<String, Object> variables = new HashMap<>();
       String username = SecurityUtils.getLoginUser().getSysUser().getUserName();
//        String username = "admin";
       //user就是在bpmnAssignee配置的参数
       variables.put("admin", username);
       //3.创建流程实例  流程定义的key需要知道 holiday
       ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine()
               .getRuntimeService()
               .startProcessInstanceByKey("groupactiviti", variables);
       System.out.println(processInstance+"=============================================");
       Task tmp = taskService.createTaskQuery()
               .processInstanceId(processInstance.getProcessInstanceId()).singleResult();
       tmp.setAssignee("ry");
       //完成此节点。由下一节点审批。完成后act_ru_task会创建一条由下节点审批的数据
       taskService.complete(tmp.getId(),variables);
       //4.输出实例的相关信息
       log.info("流程部署ID" + processInstance.getDeploymentId() );
       log.info("流程定义ID" + processInstance.getProcessDefinitionId());
       log.info("流程实例ID" + processInstance.getId());
       log.info("活动ID" + processInstance.getActivityId());
       return Result.success(true,"申请已提交");
   }

   //个人待执行任务
   @Override
   public Result list() {
       ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
       TaskService taskService = defaultProcessEngine.getTaskService();
       // 查询当前登录人的任务 进行完成
       String username= SecurityUtils.getLoginUser().getSysUser().getUserName();
       System.out.println("当前登录人"+username);

       if (username == null){
           throw new CheckedException("当前登录人为空");
       }
       List<Task> task = taskService.createTaskQuery()
               .processDefinitionKey("groupactiviti")
               .taskAssignee(username)
               .list();
       System.out.println("==================="+task);
       if(!ObjectUtils.isEmpty(task)) {
           for (Task item : task) {
               Map<String, Object> variables = new HashMap<>();
               if (username.equals("ry")){
                   variables.put("ry", username);
                   variables.put("isSuccess", true);
                   item.setAssignee("aaa");
                   //增加审批备注
                   taskService.addComment(item.getId(),item.getProcessInstanceId(),"部门经理已同意");
                   //完成此次审批。由下节点审批  act_hi_taskinst会修改时间
                   taskService.complete(item.getId(), variables);
               }
               if (username.equals("aaa")){
                   variables.put("aaa", username);
                   variables.put("isSuccess", true);
                   item.setAssignee("aaa");
                   //增加审批备注
                   taskService.addComment(item.getId(),item.getProcessInstanceId(),"财务已同意");
                   //完成此次审批。由下节点审批  act_hi_taskinst会修改时间
                   taskService.complete(item.getId(), variables);
               }
           }
       }
       return Result.success(true,"审核成功");
   }

   // 结束
   @Override
   public Result complete() {
       //1.创建ProcessEngine对象
       ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
       //创建TaskService
       TaskService taskService = processEngine.getTaskService();
       // 获取当前登录人 判断是admin才结束任务
       String username = SecurityUtils.getLoginUser().getSysUser().getUserName();
//        String username = "aaa";
       if (username == null) {
           throw new CheckedException("当前登录人为空");
       }
       if (username.equals("aaa")) {
           //act_re_execution 任务id
           Task task = taskService.createTaskQuery()
                   .processDefinitionKey("groupactiviti")
                   .taskAssignee(username)
                   .singleResult();
           if (task != null) {
               HashMap<String, Object> map = new HashMap<>();
               map.put("agree", 1);
               taskService.complete(task.getId(), map);
               System.out.println("完成任务");
           }
       }
       return Result.success(true,"审核成功");
   }

}

定义远程调用remote供别的服务调用

结构:

若依框架SpringBoot+Activiti工作流的使用,spring boot,后端,java

  1. ActivitiRemoteFallback代码:



/**
* activiti服务降级处理
*
* @author 
*/
@Component
public class ActivitiRemoteFallback implements FallbackFactory<ActivitiRemoteService>
{
   private static final Logger log = LoggerFactory.getLogger(ActivitiRemoteFallback.class);

   @Override
   public ActivitiRemoteService create(Throwable cause) {
       log.error("工作流调用失败:{}", cause.getMessage());
       return new ActivitiRemoteService(){


           @Override
           public Result getTables() {
               return null;
           }

           @Override
           public Result bushu() {
               return Result.error("远程调用工作流部署失败");
           }

           @Override
           public Result list() {
               return Result.error("远程调用工作流审核失败");
           }

           @Override
           public Result complete() {
               return Result.error("远程调用工作流结束审核失败");
           }
       };
   }
}

  1. ActivitiRemoteService代码:



/**
* 用户服务
*
* @author bawei
*/
@FeignClient(contextId = "rctivitiRemoteService",
       value = ServiceNameConstants.****自己的文件名,
       fallbackFactory = ActivitiRemoteFallback.class,path = "/activiti")
public interface ActivitiRemoteService {
   //生成25张表
   @GetMapping
   public Result getTables();

   //流程部署
   @GetMapping("/bushu")
   public Result bushu();

   //查询个人待执行的任务
   @GetMapping("/list")
   public Result list();
   //结束
   @GetMapping("/complete")
   public Result complete();
}

  1. org.springframework.boot.autoconfigure.AutoConfiguration.imports配置的代码

最后:在需要使用Activiti的地方直接注入该服务即可文章来源地址https://www.toymoban.com/news/detail-676801.html

到了这里,关于若依框架SpringBoot+Activiti工作流的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合Activiti实现工作流的低代码系统(附源码和配套文档)

    activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工作流表单

    2024年03月15日
    浏览(73)
  • 【业务功能篇38】上篇:Springboot+activiti7 工作流引擎 增加网关组件、Assignment分配权限

    在前面的一篇文章中,简单举例了一个 工单电子流,【业务功能篇36】Springboot+activiti7 工作流引擎_studyday1的博客-CSDN博客仅有一个子任务,这种一般是针对比较简单的一个遗留问题记录场景,今天再介绍一个,相对比较复杂的流程,多个处理,审批节点任务,通过排他网关组

    2024年02月13日
    浏览(44)
  • 【工作流】Activiti工作流简介以及Spring Boot 集成 Activiti7

    什么是工作流? 工作流指通过计算机对业务流程进行自动化管理,实现多个参与者按照预定义的流程去自动执行业务流程。 文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、

    2024年02月08日
    浏览(53)
  • Activiti 工作流简介

    1、什么是工作流         工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。 1.2、工作流系统   

    2024年02月04日
    浏览(51)
  • 【activiti】工作流入门基础概念

    为什么使用activiti 状态--------------------------------------------------引擎engin(业务变动不影响程序的进行) 每个人只能看到个人负责的,流程变更困难 bpmn建模语言 activiti流程步骤 步骤: 1、部署流程 2、定义流程 3、部署流程定义:使用activiti中的API把流程定义存储,在Acitivti执行过

    2024年02月16日
    浏览(39)
  • 模仿Activiti工作流自动建表机制,实现Springboot项目启动后自动创建多表关联的数据库与表的方案

    文/朱季谦 熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励! 在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表。 若要解决这类需求,其实

    2024年01月24日
    浏览(58)
  • 若依低代码平台(带工作流引擎版本)使用记录

    目录 0 平台介绍 1 创建数据库 2 Redis缓存数据库 3 修改配置文件 4 修改maven依赖 5 运行后台 6 运行前端 7 运行效果 带工作流引擎的开源低代码平台并不常有,这是基于若依开发的工作流版本低代码平台,MIT开源协议,前后端分离,前端使用Vue框架,后端SpringBoot。 本文引用的

    2024年02月12日
    浏览(39)
  • 【idea中Activiti BPMN visualizer插件和Camunda Modeler工作流设计器的简单使用】

    1、Idea中的工作流插件Activiti BPMN visualizer Activiti插件actiBPM在新版的idea 2020及以上版本中已经不支持,Activiti BPMN visualizer是一款支持编辑和游览工作流设计图的idea插件,但是它对工作流设计中的网关设计支持并不太友好;下面第4章节我们用到Camunda Modeler软件来协助设计整体工

    2023年04月09日
    浏览(42)
  • 【工作流Activiti7】4、Activiti7 结束/终止流程

    1.  结束/终止 正在运行的流程实例 思路:跟回退一样的思路一样,直接从当前节点跳到结束节点(EndEvent)  补充1:关于BUSINESS_KEY_ BUSINESS_KEY_ 字段是用于将业务系统与Actititi工作流关联的段,通常我们用它来存放业务表的ID,比如:请假ID、报销ID等等。 但是,通常咱

    2024年02月09日
    浏览(51)
  • 【工作流Activiti7】3、Activiti7 回退与会签

    1.  回退(驳回) 回退的思路就是动态更改节点的流向。先遇水搭桥,最后再过河拆桥。 具体操作如下: 取得当前节点的信息 取得当前节点的上一个节点的信息 保存当前节点的流向 新建流向,由当前节点指向上一个节点 将当前节点的流向设置为上面新建的流向 当前节点完

    2023年04月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包