1、前言
如果有小伙伴来看本博客,那么说明你至少知道工作流是什么东西,多余的空闲之语就略过了,我们直接进入正题。
本博客大致会分为五篇,将围绕我做的一个项目来开展(公司项目无法共享代码),参考技术:闲鹿工作流
① 基础集成和一些注意事项(本篇);
② 部分概念和在线使用技巧;
③ 代办、已办集成
④高级技巧之监听器、会签
⑤ 个人思考(重要)
2、技术选型
就我浅显的认知,目前比较简单、出名的工作流技术有两种:Activiti
和 flowable
,因为我现在的项目主要是去年一个项目的重构,当时采用的Activiti
,所以本次依旧选择了Activiti
。当然,这并不是说flowable
不好,相反,最近flowable
还挺出名的,最起码flowable
的页面比Activiti
好看,下面放两张图片对比下:
Activiti
flowable
我没有特别区了解使用过
flowable
,所以不多做评论,但是这个ui确实比Activiti
好看的多,如果新项目可以试试flowable
。参考项目:
RuoYi-flowable
3、SpringBoot集成Activiti6.0
因为我们之前的项目是SpringBoot单体项目(参考:闲鹿工作流单体版),现在重构为SpringBoot + Vue前后端分离版本(参考:闲鹿工作流分离版)。因此,本文会介绍单体 + 分离两种集成方式以供大家参考(如有区别之处,会以红色字标出,不标的默认为一样的)。
3.1 maven依赖
<activiti.version>6.0.0</activiti.version>
<xmlgraphics.version>1.7</xmlgraphics.version>
<!-- activiti工作流 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-rest-api</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- xml 图像类库 -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-codec</artifactId>
<version>${xmlgraphics.version}</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-css</artifactId>
<version>${xmlgraphics.version}</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svg-dom</artifactId>
<version>${xmlgraphics.version}</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svggen</artifactId>
<version>${xmlgraphics.version}</version>
</dependency>
无论是单体版还是前后端分离,依赖均按照上面的,但是分离版项目打包实现的时候有依赖冲突的错误
,解决办法:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-rest-api</artifactId>
<exclusions>
<exclusion>
<artifactId>jsr250-api</artifactId>
<groupId>javax.annotation</groupId>
</exclusion>
</exclusions>
</dependency>
3.2 参数配置
spring:
# activiti配置
activiti:
# 数据表生成(需要就改为true,或者不设置,默认为true)
database-schema-update: true
check-process-definitions: false
#关闭验证自动部署 # 检测身份信息表是否存在
db-identity-used: false
rest-api-enabled: true
rest-api-servlet-name: activiti-swagger-document
SpringProcessEngineConfiguration:
activityFontName: 宋体
labelFontName: 宋体
dataSource: datasource
# 日志配置
logging:
level:
org.springframework: warn
# 日志配置(如果需要了解activiti数据库执行情况,建议打印SQL执行情况)
# org.activiti.engine.impl.persistence.entity: trace
3.3 集成Activiti前端绘图组件
3.3.1 静态资源下载
百度网盘下载静态文件:
链接:https://pan.baidu.com/s/1DeGKAF2unWgLAjjwasAOvA?pwd=bndd
提取码:bndd
里面包含了单体未修改、单体修改后静态资源(修改点参考一下描述)、分离版(直接使用就行)
3.3.2 资源文件作用
静态资源放置的位置不需要过度纠结,只要能读取到就行。js主要使用 AngularJs ,不熟悉 的小伙伴谨慎操作。
1、diagram-viewer
该文件夹下主要包括绘图以及activiti流程图显示的组件,基本不需要修改。
2、editor-app
该文件夹下主要控制右下部分的配置区域,我们我项目仅在原生的功能下修改了两个地方:
(1) 汉化: editor-app -> i18n -> zh-CN.json
(2) 指派用户和用户组的界面:原生是通过表达式的方式来指定任务执行人/组,这样不是很友好,所以 简单修改了选择界面,用户可以 通过选择系统内用户/组来指定执行人,比较直观。
修改的文件:
以下内容主要针对于单体版,分离版已经修改好了
`editor-app ->configuration -> properties-> assignment-popup.html`,这个文件原本就 有,只是将输入框修改点击弹窗显示
`editor-app ->configuration -> properties-> assignment-popup-popup.html`,这个文件 是选择代理人和候选人使用的
`editor-app ->configuration -> properties-> assignment-candidateGroup.html`,这个 文件是选择候选组使用的
`editor-app ->configuration -> properties-assignment-controller.js`,这个文件是上面 三个HTML的js,这里也是最需要修改的地方,因为每个项目的接口地址是不一样的,分别修改 179 行、211行、280行 三个地方修改接口( 190行、221行、287行 三个地方有字段对应,如果不同需 要修改)
这个修改点将在第二篇中仔细说明,暂时不做过多解释。
3、modeler.html
这个是该组件的主页,不需要修改
4、stencilset.json
组件配置json,非常重要,不建议修改,本项目仅修改 11 行 title (流程标识)空字符串为一个 默认标识。
至于该json文件放置的位置,网上主要有两种情况:一是放在resources根目录下,另一种是放在editorapp平级。该文件放置的位置关键在于读取文件接口配置的位置:
@RestController
public class StencilsetRestResource {
@RequestMapping(value = "/modeler/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
public @ResponseBody String getStencilset() {
InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");
try {
return IoUtil.readUtf8(stencilsetStream);
} catch (Exception e) {
throw new ActivitiException("Error while loading stencil set", e);
}
}
}
注意:
1、接口处配置 produces = “application/json;charset=utf-8”,可避免返回乱码;
2、如json文件不在根目录下,读取文件地址需要修改,比如改为:static/stencilset.json;
3、接口地址不要随意修改,需参照 editor -> configuration -> url-config.js 28行 getStencilSet()方法里的路径
3.4 集成常见问题解决
3.4.1 控制台循环报循环依赖错误或者启动后出现了校验页面(非自身登录页)
解决办法
:Application启动类上加注解
- 单体版
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
SecurityAutoConfiguration.class,
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
> 第二个排除全路径为:org.activiti.spring.boot.SecurityAutoConfiguration.class,如找不到,就改为 全路径
- 分离版
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class})
全路径:org.activiti.spring.boot.SecurityAutoConfiguration.class;org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class
3.4.2 控制台报错缺少某张表
这问题是很多小伙伴最初都会犯得,原由在于很多小伙伴都会在网上去在Activiti的SQL导入,这样可能产生的问题:
①少了某张表
;②表名大小写的问题
解决办法
:application.yml
文件开启表自动生成:spring.activiti.database-schema-update: true
3.4.3 控制台process问题
解决办法
:application.yml
加上配置 spring.activiti.check-process-definitions: false
#关闭验证自动部 署
3.4.4 流程图中文乱码问题
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer {
@Autowired
private ICustomProcessDiagramGenerator customProcessDiagramGenerator;
/**
* 解決工作流生成图片乱码问题
*
* @param processEngineConfiguration 参数
*/
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setAnnotationFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
processEngineConfiguration.setProcessDiagramGenerator(customProcessDiagramGenerator);
}
}
3.4.5 at org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate
解决办法
:act_ge_property
表默认值不能删除