写在前面:从《库表与服务》这篇中的‘服务’可以看出来,processEngine是核心关键 通过流程引擎创建出对应需要的服务。从使用RepositoryService部署流程 可以创建模型并转化成部署文件进行部署,部署完成启动后 可以使用RuntimeService查看运行状态的示例,接下来任务的流程可以使用TaskService进行任务的签收 办理 指派。最后 可以使用HistoryService查看所有以往的流程实例 任务等信息。
环境:springboot2 ,activi6,mysql 5.7
项目地址:
码云: https://gitee.com/belonghuang/activiti-test
github: https://github.com/Blankwhiter/activiti-test
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.3.RELEASEversion>
<relativePath/>
parent>
<groupId>com.examplegroupId>
<artifactId>activiti-testartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>activiti-testname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
<version>2.0.3.RELEASEversion>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.ruijcgroupId>
<artifactId>spring-boot-starter-mybatisartifactId>
<version>3.2.2version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.10version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.43version>
dependency>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-spring-boot-starter-basicartifactId>
<version>6.0.0version>
dependency>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-json-converterartifactId>
<version>6.0.0version>
dependency>
<dependency>
<groupId>org.apache.xmlgraphicsgroupId>
<artifactId>batik-transcoderartifactId>
<version>1.7version>
dependency>
<dependency>
<groupId>org.apache.xmlgraphicsgroupId>
<artifactId>batik-codecartifactId>
<version>1.7version>
dependency>
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>4.1.5version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<includeSystemScope>trueincludeSystemScope>
configuration>
plugin>
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.3.5version>
<configuration>
<configurationFile>src/main/resources/generator/mybatis_generator_config.xml
configurationFile>
<verbose>trueverbose>
<overwrite>trueoverwrite>
configuration>
<executions>
<execution>
<id>Generate MyBatis Artifactsid>
<phase>deployphase>
<goals>
<goal>generategoal>
goals>
execution>
executions>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.43version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.4version>
dependency>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.5version>
dependency>
dependencies>
plugin>
plugins>
build>
project>
server.port=8083
#访问的静态资源
spring.mvc.view.prefix=classpath:/static/
#数据库连接
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/act?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
spring.datasource.username=root
spring.datasource.password=111111
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filter.commons-log.connection-logger-name=stat,wall,log4j
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connect-properties.=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.use-global-data-source-stat=true
#druid 登陆配置
spring.datasource.druid.web-stat-filter.enabled=false
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
#mybatis 配置
mybatis.mapper-locations=classpath:mappers/*Mapper.xml
mybatis.type-aliases-package=com.example.activititest.po
mybatis.check-config-location=true
mybatis.config-location=classpath:mybatis-config.xml
# activiti 自动部署验证设置:true-开启(默认)、false-关闭
spring.activiti.check-process-definitions=false
# activiti 当自动检查 并更新数据库接表不存在则进行创建
spring.activiti.database-schema-update=true
#监控地址端口
management.server.port=7000
#springboot2.0之后,在Http环境下将默认的endpoint只设置为info和health,要想开启其他的监控功能,需要手动配置
management.endpoints.web.exposure.include=*
#请求连接前缀 默认是/actuator
management.endpoints.web.base-path=/actuator
import org.activiti.spring.boot.SecurityAutoConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 配置mybatis扫描包 去除exclude = SecurityAutoConfiguration.class ,
* org.activiti.spring.boot.SecurityAutoConfiguration会导致
* Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
*/
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@MapperScan(basePackages = "com.example.activititest.dao")
public class ActivitiTestApplication {
public static void main(String[] args) {
SpringApplication.run(ActivitiTestApplication.class, args);
}
}
此步骤 请从源码中拷贝。
需要注意的是
1.activiti-test\src\main\resources\static\editor-app\app-cfg.js 配置请求的根路径
2.activiti-test\src\main\resources\static\editor-app\configuration\url-config.js 配置了 模型json,获得模具集合,保存模型
其他代码将不再赘述,如有问题,请再评论区写在疑问。
1.流程图展示:
注:此图是使用Idea中的actiBPM插件
2.示例请假流程说明:员工发起流程,经有人事(group:affair)进行审核: 如审核不通过,则结束流程,否则审核通过则判断审核天数 :如天数小于等于3天交予经理(group:manager)审批 而后结束流程,超过三天 则交予总经理(group:president)审核 而后结束流程。
注:角色后面跟的group是对应每个角色的分组标识。用于查看待签任务时候,查看属于自己组别的可签收的任务
测试ActivitiDefineController下的deploy方法 经测试可以看到返回部署成功
测试ActivitiDefineController下的list方法 经测试可以看到返回列表数据
测试ActivitiDefineController下的viewProcessImage方法 经测试可以看到返回定义的流程图
测试ActivitiDefineController下的startProcessInstanceById方法 经测试可以看到返回成功(这里方便测试将assignee-‘当前用户’,由前台传入,后面将不再赘述。 读者可将用户id做为assignee,此文为了直观使用名称作为assignee)
注:流程图人事不同意那条线 单词是错误的。供后面在线流程编辑器进行修改使用。
测试ActivitTaskController下的claimList方法 经测试可以看到返回列表数据
注:这里多说一句可以看到catalog这里是null,可以开始在流程部署文件中直接定义,这样流程定义等就可以按照catelog进行查找了。
测试ActivitTaskController下的claim方法 经测试可以看到返回成功
注:这是签收列表中就没有这一条记录,数据往待办任务走
测试ActivitTaskController下的todoList方法 经测试可以看到返回列表数据
测试ActivitTaskController下的complete方法 经测试可以看到返回成功(需要注意这里人事需要进行审批,审批通过才会有后面的流程即需要传参agree=‘yes’, agress=‘yes’, days=3)
注:这里是将 不同意那条线的判断参数错将agree写成agress 此处留下一个伏笔将会用到模型转换并使用流程设计器进行修改(此处暂不赘述),完成该任务,待办列表中就没有了该条记录,数据将往后一个流程经理审批进行签收,读者也可以将days大于3,数据将往总经理审批。
测试ActivitTaskController下的claimList方法 经测试可以看到返回列表数据
测试ActivitTaskController下的claim方法 经测试可以看到返回成功
测试ActivitTaskController下的todoList方法 经测试可以看到返回列表数据
测试ActivitTaskController下的complete方法 经测试可以看到返回成功
测试ActivitTaskController下的sentList方法 经测试可以看到返回列表数据
注:可以看到流程开始时间 结束时间 流程全部时间等信息
测试ActivitTaskController下的finishList方法 经测试可以看到返回列表数据(这里以赵四为例)
测试ActivitTaskController下的viewProgressPathImage方法 经测试可以看到返回流程轨迹图
测试ActivitiDefineController下的convertToModel方法 经测试可以看到返回成功
测试ActivitModelController下的list方法 经测试可以看到返回列表数据
打开浏览器http://localhost:8083/modeler.html?modelId=2503 (这里涉及到ActivitiVisualController的方法,请看源码此处不再赘述)
注:修改后保存,而后进行部署。
测试ActivitModelController下的deploy方法 经测试可以看到返回成功
测试ActivitiDefineController下的list方法 经测试可以看到返回列表数据
写在最后:读者也可以用ActivitModelController中的save方法创建出模型,而后使用在线流程设计器画出流程部署,效果跟官网的样例是一样的。