springBoot集成activite工作流
第一步、首先我们引入Activiti需要的jar包依赖
1.1:在pom.xml文件中引入坐标
第二步、然后在IDEA中下载插件
插件安装及使用流程如下:
2.1:打开idea的**设置**
2.2:点击插件,在商店搜索bpmn,找到“Activiti BPMN visuaizer”,点击右侧install
2.3:下载成功,将插件勾选上,重启idea(不重启插件不生效),
第三步、使用插件构建出自己的流程图(!!!重要的一步)
3.1:项目的resources目录下新建bpmn文件夹(自定义文件夹名称),用来存放构建的流程图文件
3.2:右键点击bpmn文件夹,点击新建,点击 New Activiti BPMN 2.0 file ,输入文件名称
3.3:右键点击你新建的.xml文件,最下方选择View BPMN Diagram
4.选择流程图的不同节点组合在一起形成有头有尾的流程图
4.1:开始节点
4.1.1:空白页面右键选择Start events---->Start event
4.1.2 左键点击Start event节点,下方出现表单信息,添加表单参数
4.2 : 审批节点
4.2.1:右键选择Activities---->User Task
4.2.2: 左键点击User Task 节点,填写下方表单
4.2.3:动态参数设置
4.2.4: 多个审批节点设置
4.3:结束节点
4.3.1:右键选择End events---->End event
4.4:整体流程需要用箭头指明流程流转方向
4.4.1:每个节点进行连线,使流程图看起来更加具体
4.4.2:怎么实现任意节点审批不通过直接结束流程?
4.5 参数介绍,${}用法及含义
四、查看自己配置的流程图文件
五、流程实体类的构建
5.1:流程部署DTO
5.2:流程查询DTO
5.3:流程删除DTO
5.4:流程下载DTO
5.5:流程发起DTO
5.6:流程用户DTO
5.2:完成当前任务DTO
5.2:流程标识key枚举
六、流程接口的构建
6.1Controller层代码
6.2 service层代码
6.3 serviceImpl层代码(service层实现类)
七、根据自己的业务逻辑走流程审批
7.1 :部署流程
7.2 :验证流程是否部署成功
7.3:流程的发起
7.4:流程待审核列表
7.5 流程审批
7.5.1 :提交审核实体类
7.5.2:审核业务
八、注意事项
8.1:排除Activiti7中自带的Security安全框架
8.2:添加配置
8.3:项目启动后数据库手动添加字段
九、表功能介绍及Activiti自带的方法介绍
9.1:数据库表说明
9.2:Activiti自带的方法
9.3:表数据走向
引言:工作中遇到需要
动态审批流程的的业务需求,需要
灵活配置审批人以及至少一级审批节点的审批流程
第一步、首先我们引入Activiti需要的jar包依赖
例如:我的项目使用的是maven管理jar包
1.1:在pom.xml文件中引入坐标
我用的是 activiti7 的版本
第二步、然后在IDEA中下载插件
插件安装及使用流程如下:
2.1:打开idea的设置
2.2:点击插件,在商店搜索bpmn,找到“Activiti BPMN visuaizer”,点击右侧install
2.3:下载成功,将插件勾选上,重启idea(不重启插件不生效),
第三步、使用插件构建出自己的流程图(!!!重要的一步)
3.1:项目的resources目录下新建bpmn文件夹(自定义文件夹名称),用来存放构建的流程图文件
3.2:右键点击bpmn文件夹,点击新建,点击 New Activiti BPMN 2.0 file ,输入文件名称
3.3:右键点击你新建的.xml文件,最下方选择View BPMN Diagram
4.选择流程图的不同节点组合在一起形成有头有尾的流程图
4.1:开始节点
4.1.1:空白页面右键选择Start events---->Start event
4.1.2 左键点击Start event节点,下方出现表单信息,添加表单参数
4.2 : 审批节点
4.2.1:右键选择Activities---->User Task
4.2.2: 左键点击User Task 节点,填写下方表单
Name:审批节点名称 Candidate Users: 审批人 Candidate Groups: 审批组审批角色,用${}表示动态传参 Form property Id: 审批意见 Form property Id: 审批结果,通过或者拒绝
4.2.3:动态参数设置
4.2.4: 多个审批节点设置
根据第一个审批节点的配置,自定义增加自己的审批流程; 例如需要两级审批,就需要配置两个User Task节点,每个节点配置自己的审批人或者审批角色; 有几个审批节点就需要配置几个User Task节点;
4.3:结束节点
4.3.1:右键选择End events---->End event
4.4:整体流程需要用箭头指明流程流转方向
4.4.1:每个节点进行连线,使流程图看起来更加具体
1、点击Start event节点,将出现的箭头拉向一级审批节点; 2、点击一级审核节点,将箭头拉向二级审批节点; 3、点击二级审批节点,将箭头拉向End event节点; 4、一个需要二级审批的流程图基本制作完毕 注意:如果是多级审批节点,需要将最后一步审批之前的每一步都指向End event节点,因为流程节点的任何一步在选择审批不通过的情况下都可以使流程结束
4.4.2:怎么实现任意节点审批不通过直接结束流程?
1.点击一级审批节点连接到二级审批节点的箭头线,下方表单配置项编写EL表达式 ${approverResult == ‘1’}
表示当第一级节点审核结果为 1 的时候流程流转到二级审批节点, 2.点击一级审批节点连接到End event节点的箭头线,下方表单配置项编写EL表达式 ${approverResult == ‘2’},
表示当第一级节点审核结果为 2 的时候流程直接结束
注意:为啥二级审批节点连接到End event节点的箭头线不需要写EL表达式,因为二级审批节点是当前配置的流程图的最后一个审批节点,无论审核结果通过还是拒绝,此流程都会结束
4.5 参数介绍,${}用法及含义
${} 表示动态的参数 ${roleId} :用来接收一级审核人角色 ${roleId_two} :用来接收二级审核人角色 ${approverResult}:用来接收审核结果的参数 ${approverDescribe}:用来接收审核意见的参数 如果需要再审批时填写其他的信息也可以继续自定义添加多个参数,用来接收用户的填写内容
四、查看自己配置的流程图文件
点击这个按钮打开流程图的设计,再次点击可以查看流程图xml文件的配置,实际流程图底层就是用xml文件的标签来控制流程的走向
process 标签的 id=“CheckAuit” 必须是唯一的,每一个流程图都是一个唯一的ID,不可以重复
流程图编辑完成之后可以保存为png类型的图片
至此,流程图的构建完成了,接下来用代码来控制流程发起,流程审核等一系列操作
五、流程实体类的构建
5.1:流程部署DTO
package com.sgcc.zbjgh.activity.entity.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Data
@ApiModel("流程部署DTO")
public class ActivityDeployDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 流程文件
*/
@NotBlank(message = "流程文件不可以为空")
@ApiModelProperty("流程文件")
private String activityFile;
/**
* 流程图片
*/
@NotBlank(message = "流程图片不可以为空")
@ApiModelProperty("流程图片")
private String activityImg;
/**
* 流程key
*/
@NotBlank(message = "流程key不可以为空")
@ApiModelProperty("流程key")
private String activityKey;
/**
* 流程名称
*/
@NotBlank(message = "流程名称不可以为空")
@ApiModelProperty("流程名称")
private String activityName;
}
5.2:流程查询DTO
package com.sgcc.zbjgh.activity.entity.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("流程查询DTO")
public class ActivityQueryDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 流程key
*/
@ApiModelProperty("流程key")
private String activityKey;
}
5.3:流程删除DTO
package com.sgcc.zbjgh.activity.entity.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("流程删除DTO")
public class ActivityDeleteDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 流程key
*/
@ApiModelProperty("流程key")
private String activityKey;
}
5.4:流程下载DTO
package com.sgcc.zbjgh.activity.entity.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Data
@ApiModel("流程下载DTO")
public class ActivityDownloadDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 流程key
*/
@NotBlank(message = "流程key不可为空")
@ApiModelProperty("流程key")
private String activityKey;
/**
* 下载位置
*/
@NotBlank(message = "下载位置不可为空")
@ApiModelProperty("下载位置")
private String location;
}
5.5:流程发起DTO
package com.sgcc.zbjgh.activity.entity.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
@Data
@ApiModel("流程发起DTO")
public class ProcessStartDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 流程key
*/
@ApiModelProperty("流程key")
private String processKey;
/**
* 业务key/id
*/
@ApiModelProperty("业务key/id")
private String businessKey;
/**
* 参数
*/
@ApiModelProperty("参数")
private Map
}
5.6:流程用户DTO
package com.sgcc.zbjgh.activity.entity.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
@ApiModel("流程用户DTO")
public class ActivityUserDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户名称
*/
@ApiModelProperty("用户名称")
private String userName;
/**
* 用户角色--多个
*/
@ApiModelProperty("用户角色--多个")
private List
}
5.2:完成当前任务DTO
package com.sgcc.zbjgh.activity.entity.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
@Data
@ApiModel("完成任务DTO")
public class CompleteTaskDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 任务id
*/
@ApiModelProperty("任务id")
private String taskId;
/**
* 审核结果1通过2不通过
*/
@ApiModelProperty("审核结果1通过2不通过")
private String approverResult;
/**
* 参数
*/
@ApiModelProperty("参数")
private Map
}
5.2:流程标识key枚举
package com.sgcc.zbjgh.enumUtil;
/**
* 枚举
* 流程标识key
*/
public enum ProcessKey {
//专家审批
ExpertAuit,
//考核审批
CheckAuit,
//任务审批
TaskAuit
}
六、流程接口的构建
6.1Controller层代码
package com.sgcc.zbjgh.activity.controller;
import com.sgcc.common.core.domain.R;
import com.sgcc.zbjgh.activity.entity.dto.*;
import com.sgcc.zbjgh.activity.entity.vo.HistoryParamVo;
import com.sgcc.zbjgh.activity.service.IActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author lzn
* 2024/01/11
*/
@Api(tags = "流程API")
@RestController
@RequestMapping(value = "/activity")
public class ActivityController {
@Autowired
private IActivityService iActivityService;
/**
* 流程部署
*/
@ApiOperation(value = "流程部署")
@GetMapping("/deploy")
public R
return iActivityService.deploy(activityDeploy);
}
/**