依赖:

新建springBoot项目时勾选activiti,或者在已建立的springBoot项目添加以下依赖:

<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>6.0.0</version>
</dependency>

配置:

数据源和activiti配置:

server:port: 8081spring:datasource:url: jdbc:mysql://localhost:3306/act5?useSSL=truedriver-class-name: com.mysql.jdbc.Driverusername: rootpassword: root# activiti default configurationactiviti:database-schema-update: truecheck-process-definitions: trueprocess-definition-location-prefix: classpath:/processes/
#    process-definition-location-suffixes:
#      - **.bpmn
#      - **.bpmn20.xmlhistory-level: full

在activiti的默认配置中,process-definition-location-prefix 是指定activiti流程描述文件的前缀(即路径),启动时,activiti就会去寻找此路径下的流程描述文件,并且自动部署;suffix 是一个String数组,表示描述文件的默认后缀名,默认以上两种。

springMVC配置:

package com.yawn.config;import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.config.annotation.*;/*** Created by yawn on 2017/8/5.*/
@EnableWebMvc
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");super.addResourceHandlers(registry);}@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/index");registry.addViewController("/user");registry.addRedirectViewController("/","/templates/login.html");
//        registry.addStatusController("/403", HttpStatus.FORBIDDEN);super.addViewControllers(registry);}
}

这里配置静态资源和直接访问的页面:在本示例项目中,添加了thymeleaf依赖解析视图,主要采用异步方式获取数据,通过angularJS进行前端数据的处理和展示。

使用activiti:

配置了数据源和activiti后,启动项目,activiti 的各个服务组件就已经被加入到spring容器中了,所以就可以直接注入使用了。如果在未自动配置的spring环境中,可以使用通过指定bean的init-method来配置activiti的服务组件。

案例:

以以下请假流程为例:

1. 开始流程并“申请请假”(员工)

    private static final String PROCESS_DEFINE_KEY = "vacationProcess";public Object startVac(String userName, Vacation vac) {identityService.setAuthenticatedUserId(userName);// 开始流程ProcessInstance vacationInstance = runtimeService.startProcessInstanceByKey(PROCESS_DEFINE_KEY);// 查询当前任务Task currentTask = taskService.createTaskQuery().processInstanceId(vacationInstance.getId()).singleResult();// 申明任务taskService.claim(currentTask.getId(), userName);Map<String, Object> vars = new HashMap<>(4);vars.put("applyUser", userName);vars.put("days", vac.getDays());vars.put("reason", vac.getReason());// 完成任务taskService.complete(currentTask.getId(), vars);return true;}

在此方法中,Vaction 是申请时的具体信息,在完成“申请请假”任务时,可以将这些信息设置成参数。

2. 审批请假(老板)

(1)查询需要自己审批的请假

    public Object myAudit(String userName) {List<Task> taskList = taskService.createTaskQuery().taskCandidateUser(userName).orderByTaskCreateTime().desc().list();
//        / 多此一举 taskList中包含了以下内容(用户的任务中包含了所在用户组的任务)
//        Group group = identityService.createGroupQuery().groupMember(userName).singleResult();
//        List<Task> list = taskService.createTaskQuery().taskCandidateGroup(group.getId()).list();
//        taskList.addAll(list);List<VacTask> vacTaskList = new ArrayList<>();for (Task task : taskList) {VacTask vacTask = new VacTask();vacTask.setId(task.getId());vacTask.setName(task.getName());vacTask.setCreateTime(task.getCreateTime());String instanceId = task.getProcessInstanceId();ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();Vacation vac = getVac(instance);vacTask.setVac(vac);vacTaskList.add(vacTask);}return vacTaskList;}private Vacation getVac(ProcessInstance instance) {Integer days = runtimeService.getVariable(instance.getId(), "days", Integer.class);String reason = runtimeService.getVariable(instance.getId(), "reason", String.class);Vacation vac = new Vacation();vac.setApplyUser(instance.getStartUserId());vac.setDays(days);vac.setReason(reason);Date startTime = instance.getStartTime(); // activiti 6 才有vac.setApplyTime(startTime);vac.setApplyStatus(instance.isEnded() ? "申请结束" : "等待审批");return vac;}
package com.yawn.entity;import java.util.Date;/*** @author Created by yawn on 2018-01-09 14:31*/
public class VacTask {private String id;private String name;private Vacation vac;private Date createTime;// getter setter ...
}

老板查询自己当前需要审批的任务,并且将任务和参数设置到一个VacTask对象,用于页面的展示。

(2)审批请假

    public Object passAudit(String userName, VacTask vacTask) {String taskId = vacTask.getId();String result = vacTask.getVac().getResult();Map<String, Object> vars = new HashMap<>();vars.put("result", result);vars.put("auditor", userName);vars.put("auditTime", new Date());taskService.claim(taskId, userName);taskService.complete(taskId, vars);return true;}

同理,result是审批的结果,也是在完成审批任务时需要传入的参数;taskId是刚才老板查询到的当前需要自己完成的审批任务ID。(如果流程在这里设置分支,可以通过判断result的值来跳转到不同的任务)

3. 查询记录

由于已完成的请假在数据库runtime表中查不到(runtime表只保存正在进行的流程示例信息),所以需要在history表中查询。

(1) 查询请假记录

    public Object myVacRecord(String userName) {List<HistoricProcessInstance> hisProInstance = historyService.createHistoricProcessInstanceQuery().processDefinitionKey(PROCESS_DEFINE_KEY).startedBy(userName).finished().orderByProcessInstanceEndTime().desc().list();List<Vacation> vacList = new ArrayList<>();for (HistoricProcessInstance hisInstance : hisProInstance) {Vacation vacation = new Vacation();vacation.setApplyUser(hisInstance.getStartUserId());vacation.setApplyTime(hisInstance.getStartTime());vacation.setApplyStatus("申请结束");List<HistoricVariableInstance> varInstanceList = historyService.createHistoricVariableInstanceQuery().processInstanceId(hisInstance.getId()).list();ActivitiUtil.setVars(vacation, varInstanceList);vacList.add(vacation);}return vacList;}

请假记录即查出历史流程实例,再查出关联的历史参数,将历史流程实例和历史参数设置到Vcation对象(VO对象)中去,即可返回,用来展示。

package com.yawn.util;import org.activiti.engine.history.HistoricVariableInstance;import java.lang.reflect.Field;
import java.util.List;/*** activiti中使用得到的工具方法* @author Created by yawn on 2018-01-10 16:32*/
public class ActivitiUtil {/*** 将历史参数列表设置到实体中去* @param entity 实体* @param varInstanceList 历史参数列表*/public static <T> void setVars(T entity, List<HistoricVariableInstance> varInstanceList) {Class<?> tClass = entity.getClass();try {for (HistoricVariableInstance varInstance : varInstanceList) {Field field = tClass.getDeclaredField(varInstance.getVariableName());if (field == null) {continue;}field.setAccessible(true);field.set(entity, varInstance.getValue());}} catch (Exception e) {e.printStackTrace();}}
}

此外,以上是查询历史流程实例和历史参数后,设置VO对象的通用方法:可以根据参数列表中的参数,将与VO对象属性同名的参数设置到VO对象中去。

4. 前端展示和操作

(1)审批列表和审批操作示例

    <div ng-controller="myAudit"><h2 ng-init="myAudit()">待我审核的请假</h2><table border="0"><tr><td>任务名称</td><td>任务时间</td><td>申请人</td><td>申请时间</td><td>天数</td><td>事由</td><td>操作</td></tr><tr ng-repeat="vacTask in vacTaskList"><td>{{vacTask.name}}</td><td>{{vacTask.createTime | date:'yyyy-MM-dd HH:mm:ss'}}</td><td>{{vacTask.vac.applyUser}}</td><td>{{vacTask.vac.applyTime | date:'yyyy-MM-dd HH:mm:ss'}}</td><td>{{vacTask.vac.days}}</td><td>{{vacTask.vac.reason}}</td><td><button type="button" ng-click="passAudit(vacTask.id, 1)">审核通过</button><button type="button" ng-click="passAudit(vacTask.id, 0)">审核拒绝</button></td></tr></table></div>
app.controller("myAudit", function ($scope, $http, $window) {$scope.vacTaskList = [];$scope.myAudit = function () {$http.get("/myAudit").then(function (response) {$scope.vacTaskList = response.data;})};$scope.passAudit = function (taskId, result) {$http.post("/passAudit",{"id": taskId,"vac": {"result": result >= 1 ? "审核通过" : "审核拒绝"}}).then(function (response) {if (response.data === true) {alert("操作成功!");$window.location.reload();} else {alert("操作失败!");}})}
});

以上是一个springBoot 与 activiti 6.0 整合的示例项目的部分代码与说明,完整的项目代码在:

SpringBoot整合Activiti工作流相关推荐

  1. # SpringBoot 整合 Activiti 工作流框架

    SpringBoot 整合 Activiti 工作流框架 Activiti 介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调 ...

  2. Activiti工作流使用之SpringBoot整合Activiti

    Activiti工作流使用之SpringBoot整合Activiti 文章目录 Activiti工作流使用之SpringBoot整合Activiti 一.springboot整合Activiti环境依 ...

  3. Springboot 整合activiti及使用案例

    Springboot整合activiti 6.0 下载源码请点击这里 一 导入依赖 <dependencies><!--Activiti工作流 start--><depe ...

  4. SpringBoot集成activiti工作流

    SpringBoot集成activiti工作流(模拟请假流程) 链接:https://pan.baidu.com/s/10BT_Zertm1WBBrlrdE-QWQ  提取码:zsq6 学习视频地址见 ...

  5. springboot整合activiti报错[processes/]不存在解决方案

    springboot整合activiti时,启动抛异常 nested exception is java.io.FileNotFoundException: class path resource [ ...

  6. Spring整合Activiti工作流

    代码地址如下: http://www.demodashi.com/demo/11911.html 一. 前期准备 安装必要的开发环境 eclipse/intellij+maven 3.5.x + to ...

  7. SpringBoot 整合Activiti(二)——流程审批完整示例

    前两天做了一个SpringBoot整合Activiti的完整示例,功能包括:退回/通过(节点条件).指定办理人.生成流程图.高亮显示已办节点.查询任务列表(办理人)等,下面先简单记录(含完整代码),十 ...

  8. GlobalAuthenticationConfigurerAdapter.class 整合activiti 工作流报错

    package com.byd; import org.springframework.boot.SpringApplication; import org.springframework.boot. ...

  9. Java整合activiti工作流,前端适配vue,流程在线绘制设计器,适配在线表单引擎

    前言 activiti工作流,企业erp.oa.hr.crm等审批系统轻松落地,请假审批demo从流程绘制到审批结束实例. 一.项目形式 springboot+vue+activiti集成了activ ...

最新文章

  1. 安装win下的Anaconda ----针对python3.6.4版本
  2. 【边缘计算】对边缘计算的理解与思考
  3. token要加编码decode吗_NLP中各种各样的编码器
  4. 2010有道难题练习赛2
  5. Python3成员运算符(List元素是否存在)
  6. 【小白的CFD之旅】22 好网格与坏网格
  7. 遥感数据下载——土地利用(覆盖)数据下载
  8. matlab 画三棱柱,教大家几何画板画出三棱柱图形
  9. windows启动时自动运行程序四种方法(登录或不登录都可以的)
  10. git的使用简介 常用命令
  11. pytorch中的nn.Unfold()函数和fold(函数详解
  12. USB加密锁(加密狗)复制和破解Key解密
  13. spring boot 2.5.5 reference chapter 5 生词
  14. 通过access口加vlan标签吗_Access 发送不带标签的报文, 一般与 pc 、 server 相连时使用,端口能属于 3 个 VLAN。_学小易找答案...
  15. 做个乐意为别人撑伞的人
  16. Macbook 上onenote无法在本地新建笔记本
  17. Linux:查看网络信息和网络监控命令。
  18. 干了12年硬件,转芯片原厂FAE,一如既往的打杂背锅
  19. 第 5 届 FEDAY 前端大会的完整 PPT 内容已出炉-站在大牛的肩膀上学习
  20. 什么是装饰器 python_python三大神器===》装饰器

热门文章

  1. 泸州职业技术学院计算机单招试题,2021年泸州职业技术学院单招英语考试模拟试题库...
  2. 称重仪表显示ol怎么解决_衡安称重显示仪表的使用和维护方法
  3. java 文件上传到ftp_JAVA技术实现上传下载文件到FTP服务器(完整)
  4. android 搜狗地图包名,搜狗地图(免费语音导航)
  5. iOS ucloud多图异步上传
  6. tf.gather_nd
  7. window下使用CMUSphinx实现中文识别
  8. python3数字学习
  9. 北汽魔方的智能化解决方案让合资车羡慕
  10. CLion比Visual Studio开发C++程序舒服的多