三亩地.
  • 首页
  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验
  • 实战教程
  • 编程思维
  • 资讯中心
  • 关于我们

资讯详情

深入了解每一个知识点

  • 首页
  • /
  • 资讯中心
  • /
  • 文章详情

activiti7与项目集成(一)

📅 2026/7/21 22:14:26 👁️ 阅读次数 📝 编程学习
activiti7与项目集成(一)

activiti7与项目集成(一)

activiti7在项目中的结合应用

activiti7作为流程管理的一个工具在项目里为审批这一环节提供了很大的助力。
首先,在后端的pom.xml中引入相关依赖
image
图中的第一个依赖是流程图生成器,不需要我们做额外的操作,即可根据.xml和.bpmn文件完成流程图,下面就是activiti7的依赖,由于activiti7中自带mybatis会和我们本身项目中的mybatis冲突,所以需要按如图所示的方式排除。

部署与流程定义与前端的数据显示结合

首先是部署与流程定义,一个部署对应一个流程定义,image
这是一个完成后的样板图,在流程文件中可以看到我们使用的流程模板(.xml或是.bpmn),接着在后端进行部署与流程定义再使用刚才的流程图生成器就可以拿到写好的流程图。
首先是流程定义部署,左上的那个按钮,点击后出现如图所示的界面image
可以选择流程类型,比如请假,或是申报报表之类的,然后文件就是.xml或是.bpmn,描述信息根据需求完成即可,这是前端的提供给用户的部分,放到后端就需要我们在业务层完成合理化验证,部署,流程定义这些部分了
对于合理化验证需要先判空,然后对文件的大小和尾缀进行闲置

if(file == null || file.getSize() == 0 ||bpmnType == null){
throw new RuntimeException("非法参数");
}
if (file.getSize() > 1024 * 1024 * 5){
throw new RuntimeException("文件不能大于5M");
}
String fileName = file.getOriginalFilename();
String extension = FilenameUtils.getExtension(fileName);
if(!("xml".equalsIgnoreCase(extension) || "bpmn".equalsIgnoreCase(extension))){
throw new RuntimeException("文件必须为xml或是bpmn格式");
}
这里使用到了对文件名字处理的工具类,验证完成后开始进行部署和流程定义,这里使用到了repositoryService我们需要@AutoWired引进,然后

Deployment deploy = repositoryService.createDeployment()
.addInputStream(fileName, file.getInputStream())
.deploy();
通过用户传进来的输入流也就是对应的文件来进行部署,方法具体需要的东西直接去api里看就好了,部署之后进行流程定义

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(deploy.getId())
.singleResult();
在部署之后,是肯定能拿到部署id的这里面可以有很多种进行流程定义的方式,这里选择id,因为是一个部署一个流程定义所以返回singleResult(单个结果),然后再把页面需要的内容通过指定的实体封装后response给前端就可以了

将.xml或.bpmn返回给前端以及生成对应的流程图

首先,这是一个文件类型的数据,在用户传给后端之后就存在了act_ge_bytearray这张表里,以如图所示的方式存储着
image
在上面的前端界面可以看到我们需要将这个传来的流程文件显示在前端,这里就使用到了流的方式来完成相关业务,用户传来一个输入流(包含id与type(下面会讲到)),我们完成相关业务后以输出流的方式返回给前端,中间使用IoUtils.copy将两者同步。

InputStream inputStream = busBpmnInfoService.readResource(id ,type);
OutputStream outputStream = response.getOutputStream();
IOUtils.copy(inputStream,outputStream);
在业务层面,合理化验证是一定的,然后这里操作是这样的,如果前端传来的type是.xml说明是流程文件,只需要去数据库中把数据查出来返回去就可以了,如果不是,就需要进行流程图的绘制然后返回给前端

if(id == null || type == null){
throw new RuntimeException("非法参数");
}
BusBpmnInfo busBpmnInfo = busBpmnInfoMapper.selectById(id);
if (busBpmnInfo == null){
throw new RuntimeException("非法参数");
}
String processDefinitionKey = busBpmnInfo.getProcessDefinitionKey();
//查询流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey)
.latestVersion()
.singleResult();

String deploymentId = processDefinition.getDeploymentId();
String resourceName = processDefinition.getResourceName();
if("xml".equalsIgnoreCase(type)){
InputStream i = repositoryService.getResourceAsStream(deploymentId, resourceName);
return i;
}else{
DefaultProcessDiagramGenerator defaultProcessDiagramGenerator = new DefaultProcessDiagramGenerator();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
InputStream inputStream = defaultProcessDiagramGenerator.generateDiagram(bpmnModel, Collections.emptyList(), Collections.emptyList(), "宋体", "宋体", "宋体");
return inputStream;
这里面的方法并不常见,所以需要的参数我们都采用通过api的方式进行查看,这样能保证参数不会错误

撤销

撤销就是根据id进行删除,但是要注意的是,在我们进行部署与流程定义之后,就不单单是我们这个界面对应的表改变了,部署表,流程定义表,甚至是存储通过数据的bytearray表都改变了,所以需要进行级联删除,也就是将cascade设为true,这样才能保证删的彻底,然后因为每次定义同一类型的流程时会出现多个版本,所以需要进行遍历删除,最后在删除业务信息表就可以了

//1.参数合理化校验
if(id == null){
throw new RuntimeException("非法参数");
}
//2.查出流程定义
BusBpmnInfo busBpmnInfo = busBpmnInfoMapper.selectById(id);
if(busBpmnInfo ==null){
throw new RuntimeException("非法参数");
}
String processDefinitionKey = busBpmnInfo.getProcessDefinitionKey();
List list = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey)
.list();
for(ProcessDefinition processDefinition : list){
//3.删除流程定义,级联删除流程实例
repositoryService.deleteDeployment(processDefinition.getDeploymentId(),true);
}
//4.删除业务信息表,
return busBpmnInfoMapper.deleteById(id);

编程学习 技术分享 实战经验

相关新闻

计算机毕业设计之游乐场管理系统

2026/7/21 22:14:26

济南浪琴手表回收地址公示 - 米諾

2026/7/21 22:14:26

Anki终极指南:如何用智能间隔重复系统轻松记住一切

2026/7/21 22:13:54

最新新闻

2026年超精密滤油机十大厂家怎么选 实用选型指南 - 品牌优推

2026/7/22 1:10:03

哈尔滨甲醛检测公司怎么选:只做检测不除醛的专业CMA资质实验室——国慷测研CMA甲醛检测及公共卫生检测 - CMA甲醛检测中心

2026/7/22 1:10:03

潜江预制化粪池制造商选购要点及本地适配方案全指南 - 热点品牌推荐

2026/7/22 1:10:03

深入解析TI C2000 eHRPWM:从MEP原理到多模块同步实战

2026/7/22 1:10:03

什么AI工具可以写小说?2026实测10款工具横评:从免费通用到专业工作台,一篇说透

2026/7/22 1:10:03

让飞牛NAS多一个AI管家:Hermes常驻运行、微信调用与远程管理

2026/7/22 1:09:30

日新闻

【finetuning】Cohere自定义重排序器案例分析

2026/7/22 0:00:07

远程团队的异步代码评审流程:从阻塞式等待到并行化改进的全记录

2026/7/22 0:00:30

071、STM32Cube.AI工具链介绍与安装

2026/7/22 0:00:30

周新闻

SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径

2026/7/21 11:37:58

如何高效管理云文件:蓝奏云客户端深度使用指南

2026/7/21 1:56:01

什么是PCTFE?医药高端包装的“防潮王牌“材料

2026/7/21 13:56:00

月新闻

[C++]内存管理:串顺序存储的内存回收

2026/7/21 22:22:44

足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建

2026/7/21 22:20:43

抖音内容监控助手:告别手动刷新,让优质内容主动找你

2026/7/21 22:43:42

分类目录

  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验

热门标签

JavaScript Python Java 前端开发 后端开发 算法 数据结构 项目实战

关于三亩地

三亩地是一个专注于编程学习的平台,以真实学习日记为载体,分享编程学习经验、项目实操技巧和高效学习方法。

快速链接

学习日记

项目实战

学习方法

资讯中心

联系方式

邮箱:contact@mfbz.cn

微信:sanmudi_code

QQ 群:123456789

© 2026 三亩地 编程学习日记 版权所有 | mfbz.cn