原项目中用到了工作流引擎,使用若依框架开发,
原二开使用项目:https://gitee.com/y_project/RuoYi-Vue
基于activiti7地址:https://gitee.com/smell2/ruoyi-vue-activiti
导入模块到原二开项目中
使用步骤
- admin导入bpmn文件,或者绘制工作流,并激活。
- post为普通员工进入我的审批可以查看所有审批(经销商角色)
- 数据会存入历史表和任务表
- 历史表展现全部任务数据,task会展示对应岗位的相应条数据
- 登录商管账号,进入代办任务
- 进行审批,通过则状态变为“待财务审核”,进入下一节点;不通过则状态变为“审核失败”,流转结束
- 登录财务账号,进入代办任务
- 进行审批,通过则状态变为“审核成功”,流转结束;不通过则状态变为“审核失败”,流转结束
- 经销商可以查看审批,流转完成
注意事项
工作流程菜单在开发工具查看(没有的话需要事先插入db和相关代码),在线绘制进行bpmn格式的流程图,部署流程导入已经存在的bpmn文件,根据流程key,在java中进行声明和调用该key即可正式使用该工作流
后端相关
activiti7相关依赖
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M4</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M4</version>
<type>pom</type>
</dependency>
解决依赖冲突
activiti7新版本会和mybatis和spring security起冲突,如果项目使用shiro等安全框架会有更大的适配问题
原项目有spring security的情况下需加上配置文件属性
main:
allow-bean-definition-overriding: true
activity配置文件属性如下,包括检测流程定义,自动更新和生成db系统表,历史数据级别和使用等
activiti:
check-process-definitions: false
database-schema-update: true
history-level: full
db-history-used: true
db依赖问题或mybatis版本冲突解决方法如下
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
数据源配置,给url加上如下后缀属性
%2B8&nullCatalogMeansCurrent=true
完整url格式如下:
url: jdbc:mysql://localhost:99999/test11111111?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
在使用mysql-connect 8.+以上版本的时候需要添加***nullCatalogMeansCurrent=true***参数,否则在使用mybatis-generator生成表对应的xml等时会扫描整个服务器里面的全部数据库中的表,而不是扫描对应数据库的表。因此mysql会扫描所有的库来找表,如果其他库中有相同名称的表,activiti就以为找到了,本质上这个表在当前数据库中并不存在。
接口
流程部署
可以将bpmn文件放在resource下的processes目录下,activiti启动的时候会自动加载该目录下的bpmn文件,或者通过调用接口方式部署:
-
上传文件部署
@PostMapping("/uploadFileAndDeployment")
public BaseResponse uploadFileAndDeployment(
@RequestParam(“processFile”)MultipartFile processFile,
@RequestParam(value = “processName”,required = false) String processName){String originalFilename = processFile.getOriginalFilename(); String extension = FilenameUtils.getExtension(originalFilename); if (processName != null){ processName = originalFilename; } try { InputStream inputStream = processFile.getInputStream(); Deployment deployment = null; if ("zip".equals(extension)){ // 压缩包部署方式 ZipInputStream zipInputStream = new ZipInputStream(inputStre