Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
guns-vip
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
chenjunxiong
guns-vip
Commits
098eee7d
Commit
098eee7d
authored
Dec 02, 2017
by
naan1993
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
集成flowable并配置flowable
parent
feaa67ec
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
461 additions
and
5 deletions
+461
-5
guns-admin/pom.xml
+17
-0
guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
+2
-2
guns-admin/src/main/java/com/stylefeng/guns/config/FlowableConfig.java
+49
-0
guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsFlowableProperties.java
+57
-0
guns-admin/src/main/resources/application.yml
+8
-3
guns-admin/src/main/resources/processes/holiday-request.bpmn20.xml
+52
-0
guns-admin/src/test/java/com/stylefeng/guns/flowable/CallExternalSystemDelegate.java
+16
-0
guns-admin/src/test/java/com/stylefeng/guns/flowable/FlowableDbInitTest.java
+27
-0
guns-admin/src/test/java/com/stylefeng/guns/flowable/FlowableTest.java
+175
-0
guns-admin/src/test/resources/holiday-request.bpmn20.xml
+52
-0
guns-parent/pom.xml
+6
-0
No files found.
guns-admin/pom.xml
View file @
098eee7d
...
...
@@ -19,6 +19,23 @@
<description>
guns 的spring boot版本
</description>
<dependencies>
<!--flowable-->
<dependency>
<groupId>
org.flowable
</groupId>
<artifactId>
flowable-spring-boot-starter-basic
</artifactId>
<exclusions>
<exclusion>
<artifactId>
mybatis
</artifactId>
<groupId>
org.mybatis
</groupId>
</exclusion>
<exclusion>
<artifactId>
activation
</artifactId>
<groupId>
javax.activation
</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>
com.stylefeng
</groupId>
<artifactId>
guns-core
</artifactId>
...
...
guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
View file @
098eee7d
...
...
@@ -16,7 +16,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
* @Date 2017/5/21 12:06
*/
@SpringBootApplication
public
class
GunsApplication
extends
WebMvcConfigurerAdapter
{
public
class
GunsApplication
extends
WebMvcConfigurerAdapter
{
protected
final
static
Logger
logger
=
LoggerFactory
.
getLogger
(
GunsApplication
.
class
);
...
...
@@ -28,7 +28,7 @@ public class GunsApplication extends WebMvcConfigurerAdapter{
*/
@Override
public
void
addResourceHandlers
(
ResourceHandlerRegistry
registry
)
{
if
(
gunsProperties
.
getSwaggerOpen
())
{
if
(
gunsProperties
.
getSwaggerOpen
())
{
registry
.
addResourceHandler
(
"swagger-ui.html"
).
addResourceLocations
(
"classpath:/META-INF/resources/"
);
registry
.
addResourceHandler
(
"/webjars/**"
).
addResourceLocations
(
"classpath:/META-INF/resources/webjars/"
);
}
...
...
guns-admin/src/main/java/com/stylefeng/guns/config/FlowableConfig.java
0 → 100644
View file @
098eee7d
package
com
.
stylefeng
.
guns
.
config
;
import
com.alibaba.druid.pool.DruidDataSource
;
import
com.stylefeng.guns.config.properties.GunsFlowableProperties
;
import
com.stylefeng.guns.core.datasource.DruidProperties
;
import
org.flowable.spring.SpringAsyncExecutor
;
import
org.flowable.spring.SpringProcessEngineConfiguration
;
import
org.flowable.spring.boot.AbstractProcessEngineAutoConfiguration
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.transaction.PlatformTransactionManager
;
import
java.io.IOException
;
/**
* 工作流配置
*
* @author fengshuonan
* @date 2017-12-02 22:28
*/
@Configuration
public
class
FlowableConfig
extends
AbstractProcessEngineAutoConfiguration
{
@Autowired
DruidProperties
druidProperties
;
@Autowired
GunsFlowableProperties
gunsFlowableProperties
;
/**
* flowable单独的数据源
*/
private
DruidDataSource
flowableDataSource
()
{
DruidDataSource
dataSource
=
new
DruidDataSource
();
druidProperties
.
config
(
dataSource
);
gunsFlowableProperties
.
config
(
dataSource
);
return
dataSource
;
}
@Bean
public
SpringProcessEngineConfiguration
springProcessEngineConfiguration
(
PlatformTransactionManager
transactionManager
,
SpringAsyncExecutor
springAsyncExecutor
)
throws
IOException
{
return
this
.
baseSpringProcessEngineConfiguration
(
flowableDataSource
(),
transactionManager
,
springAsyncExecutor
);
}
}
guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsFlowableProperties.java
0 → 100644
View file @
098eee7d
package
com
.
stylefeng
.
guns
.
config
.
properties
;
import
com.alibaba.druid.pool.DruidDataSource
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.context.annotation.Configuration
;
/**
* flow的配置
*
* @author fengshuonan
* @date 2017-12-02 23:18
*/
@Configuration
@ConfigurationProperties
(
prefix
=
GunsFlowableProperties
.
GUNS_FLOWABLE_DATASOURCE
)
public
class
GunsFlowableProperties
{
public
static
final
String
GUNS_FLOWABLE_DATASOURCE
=
"guns.flowable.datasource"
;
//默认多数据源的链接
private
String
url
=
"jdbc:mysql://127.0.0.1:3306/guns_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"
;
//默认多数据源的数据库账号
private
String
username
=
"root"
;
//默认多数据源的数据库密码
private
String
password
=
"root"
;
public
void
config
(
DruidDataSource
dataSource
)
{
dataSource
.
setUrl
(
url
);
dataSource
.
setUsername
(
username
);
dataSource
.
setPassword
(
password
);
}
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
public
String
getUsername
()
{
return
username
;
}
public
void
setUsername
(
String
username
)
{
this
.
username
=
username
;
}
public
String
getPassword
()
{
return
password
;
}
public
void
setPassword
(
String
password
)
{
this
.
password
=
password
;
}
}
guns-admin/src/main/resources/application.yml
View file @
098eee7d
...
...
@@ -8,7 +8,7 @@ guns:
kaptcha-open
:
false
#是否开启登录时验证码 (true/false)
session-open
:
false
#是否开启session超时验证(受影响的类SessionTimeoutInterceptor) (true/false)
#file-upload-path: d:/tmp #文件上传目录(不配置的话为java.io.tmpdir目录)
muti-datasource-open
:
fals
e
#是否开启多数据源(true/false)
muti-datasource-open
:
tru
e
#是否开启多数据源(true/false)
spring-session-open
:
false
#是否开启spring session,如果是多机环境需要开启(true/false)
session-invalidate-time
:
1800
#session失效时间(只在单机环境下生效,多机环境在SpringSessionConfig类中配置) 单位:秒
session-validation-interval
:
900
#多久检测一次失效的session(只在单机环境下生效) 单位:秒
...
...
@@ -80,11 +80,16 @@ spring:
password
:
root
filters
:
log4j,wall,mergeStat
#多数据源
#多数据源
(flowabe的和业务的)
guns
:
flowable
:
datasource
:
url
:
jdbc:mysql://127.0.0.1:3306/guns_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
username
:
root
password
:
root
muti-datasource
:
default-dataSource-name
:
dataSourceGuns
#默认的数据源名称
url
:
jdbc:mysql://127.0.0.1:3306/
biz
?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
url
:
jdbc:mysql://127.0.0.1:3306/
guns_flowable
?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
username
:
root
password
:
root
...
...
guns-admin/src/main/resources/processes/holiday-request.bpmn20.xml
0 → 100644
View file @
098eee7d
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns=
"http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:flowable=
"http://flowable.org/bpmn"
typeLanguage=
"http://www.w3.org/2001/XMLSchema"
expressionLanguage=
"http://www.w3.org/1999/XPath"
targetNamespace=
"http://www.flowable.org/processdef"
>
<process
id=
"holidayRequest"
name=
"Holiday Request"
isExecutable=
"true"
>
<startEvent
id=
"startEvent"
/>
<sequenceFlow
sourceRef=
"startEvent"
targetRef=
"approveTask"
/>
<userTask
id=
"approveTask"
name=
"Approve or reject request"
flowable:candidateGroups=
"managers"
/>
<sequenceFlow
sourceRef=
"approveTask"
targetRef=
"decision"
/>
<exclusiveGateway
id=
"decision"
/>
<sequenceFlow
sourceRef=
"decision"
targetRef=
"externalSystemCall"
>
<conditionExpression
xsi:type=
"tFormalExpression"
>
<![CDATA[
${approved}
]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow
sourceRef=
"decision"
targetRef=
"sendRejectionMail"
>
<conditionExpression
xsi:type=
"tFormalExpression"
>
<![CDATA[
${!approved}
]]>
</conditionExpression>
</sequenceFlow>
<serviceTask
id=
"externalSystemCall"
name=
"Enter holidays in external system"
flowable:class=
"com.stylefeng.guns.flowable.CallExternalSystemDelegate"
/>
<sequenceFlow
sourceRef=
"externalSystemCall"
targetRef=
"holidayApprovedTask"
/>
<userTask
id=
"holidayApprovedTask"
name=
"Holiday approved"
flowable:assignee=
"${employee}"
/>
<sequenceFlow
sourceRef=
"holidayApprovedTask"
targetRef=
"approveEnd"
/>
<serviceTask
id=
"sendRejectionMail"
name=
"Send out rejection email"
flowable:class=
"org.flowable.SendRejectionMail"
/>
<sequenceFlow
sourceRef=
"sendRejectionMail"
targetRef=
"rejectEnd"
/>
<endEvent
id=
"approveEnd"
/>
<endEvent
id=
"rejectEnd"
/>
</process>
</definitions>
\ No newline at end of file
guns-admin/src/test/java/com/stylefeng/guns/flowable/CallExternalSystemDelegate.java
0 → 100644
View file @
098eee7d
package
com
.
stylefeng
.
guns
.
flowable
;
import
org.flowable.engine.delegate.DelegateExecution
;
import
org.flowable.engine.delegate.JavaDelegate
;
/**
* @author fengshuonan
* @date 2017-12-02 20:57
*/
public
class
CallExternalSystemDelegate
implements
JavaDelegate
{
@Override
public
void
execute
(
DelegateExecution
delegateExecution
)
{
System
.
out
.
println
(
"Calling the external system for employee "
+
delegateExecution
.
getVariable
(
"employee"
));
}
}
guns-admin/src/test/java/com/stylefeng/guns/flowable/FlowableDbInitTest.java
0 → 100644
View file @
098eee7d
package
com
.
stylefeng
.
guns
.
flowable
;
import
org.flowable.engine.ProcessEngine
;
import
org.flowable.engine.ProcessEngineConfiguration
;
import
org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration
;
import
org.junit.Test
;
/**
* 初始化flowable数据库(执行前需要先在数据库创建这个数据库,下面以数据库名flowable为例)
*
* @author fengshuonan
* @date 2017-12-02 20:32
*/
public
class
FlowableDbInitTest
{
@Test
public
void
init
()
{
ProcessEngineConfiguration
cfg
=
new
StandaloneProcessEngineConfiguration
()
.
setJdbcUrl
(
"jdbc:mysql://127.0.0.1:3306/flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"
)
.
setJdbcUsername
(
"root"
)
.
setJdbcPassword
(
"root"
)
.
setJdbcDriver
(
"com.mysql.jdbc.Driver"
)
.
setDatabaseSchemaUpdate
(
ProcessEngineConfiguration
.
DB_SCHEMA_UPDATE_TRUE
);
ProcessEngine
processEngine
=
cfg
.
buildProcessEngine
();
}
}
guns-admin/src/test/java/com/stylefeng/guns/flowable/FlowableTest.java
0 → 100644
View file @
098eee7d
package
com
.
stylefeng
.
guns
.
flowable
;
import
org.flowable.engine.*
;
import
org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration
;
import
org.flowable.engine.repository.Deployment
;
import
org.flowable.engine.repository.ProcessDefinition
;
import
org.flowable.engine.runtime.ProcessInstance
;
import
org.flowable.task.api.Task
;
import
org.flowable.task.api.TaskQuery
;
import
org.junit.Before
;
import
org.junit.Test
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Scanner
;
/**
* 工作流的业务测试
*
* @author fengshuonan
* @date 2017-12-02 20:37
*/
public
class
FlowableTest
{
ProcessEngine
processEngine
;
@Before
public
void
init
()
{
ProcessEngineConfiguration
cfg
=
new
StandaloneProcessEngineConfiguration
()
.
setJdbcUrl
(
"jdbc:mysql://127.0.0.1:3306/flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"
)
.
setJdbcUsername
(
"root"
)
.
setJdbcPassword
(
"root"
)
.
setJdbcDriver
(
"com.mysql.jdbc.Driver"
)
.
setDatabaseSchemaUpdate
(
ProcessEngineConfiguration
.
DB_SCHEMA_UPDATE_TRUE
);
processEngine
=
cfg
.
buildProcessEngine
();
}
/**
* 发布流程
*/
@Test
public
void
deploy
()
{
RepositoryService
repositoryService
=
processEngine
.
getRepositoryService
();
Deployment
deployment
=
repositoryService
.
createDeployment
()
.
addClasspathResource
(
"holiday-request.bpmn20.xml"
)
.
deploy
();
ProcessDefinition
processDefinition
=
repositoryService
.
createProcessDefinitionQuery
()
.
deploymentId
(
deployment
.
getId
())
.
singleResult
();
System
.
out
.
println
(
"Found process definition : "
+
processDefinition
.
getName
());
}
/**
* 启动流程
*/
@Test
public
void
start
()
{
ProcessInstance
processInstance
=
processEngine
.
getRuntimeService
().
startProcessInstanceByKey
(
"holidayRequest"
);
System
.
out
.
println
(
"pid = "
+
processInstance
.
getId
());
System
.
out
.
println
(
"activityId = "
+
processInstance
.
getActivityId
());
System
.
out
.
println
(
"getProcessDefinitionId = "
+
processInstance
.
getProcessDefinitionId
());
}
/**
* 查看流程定义
*/
@Test
public
void
queryProcess
()
{
List
<
ProcessDefinition
>
list
=
processEngine
.
getRepositoryService
()
.
createProcessDefinitionQuery
()
.
list
();
for
(
ProcessDefinition
processDefinition
:
list
)
{
System
.
out
.
println
(
"id = "
+
processDefinition
.
getId
());
System
.
out
.
println
(
"getDeploymentId = "
+
processDefinition
.
getDeploymentId
());
System
.
out
.
println
(
"getTenantId = "
+
processDefinition
.
getTenantId
());
System
.
out
.
println
(
"name = "
+
processDefinition
.
getName
());
System
.
out
.
println
(
"key = "
+
processDefinition
.
getKey
());
System
.
out
.
println
(
"version = "
+
processDefinition
.
getVersion
());
System
.
out
.
println
(
"resourceName = "
+
processDefinition
.
getResourceName
());
}
}
/**
* 删除流程定义
*/
@Test
public
void
delProcess
()
{
processEngine
.
getRepositoryService
().
deleteDeployment
(
"22501"
,
true
);
processEngine
.
getRepositoryService
().
deleteDeployment
(
"25001"
,
true
);
System
.
out
.
println
(
"删除成功"
);
}
/**
* 查看任务
*/
@Test
public
void
queryMyTask
()
{
String
name
=
"fsn"
;
TaskQuery
taskQuery
=
processEngine
.
getTaskService
().
createTaskQuery
().
taskAssignee
(
name
);
List
<
Task
>
list
=
taskQuery
.
list
();
for
(
Task
task
:
list
)
{
System
.
out
.
println
(
"name = "
+
task
.
getName
());
}
System
.
out
.
println
(
"查询完毕!"
);
}
public
static
void
main
(
String
[]
args
)
{
ProcessEngineConfiguration
cfg
=
new
StandaloneProcessEngineConfiguration
()
.
setJdbcUrl
(
"jdbc:mysql://127.0.0.1:3306/flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"
)
.
setJdbcUsername
(
"root"
)
.
setJdbcPassword
(
"root"
)
.
setJdbcDriver
(
"com.mysql.jdbc.Driver"
)
.
setDatabaseSchemaUpdate
(
ProcessEngineConfiguration
.
DB_SCHEMA_UPDATE_TRUE
);
ProcessEngine
processEngine
=
cfg
.
buildProcessEngine
();
RepositoryService
repositoryService
=
processEngine
.
getRepositoryService
();
Deployment
deployment
=
repositoryService
.
createDeployment
()
.
addClasspathResource
(
"holiday-request.bpmn20.xml"
)
.
deploy
();
ProcessDefinition
processDefinition
=
repositoryService
.
createProcessDefinitionQuery
()
.
deploymentId
(
deployment
.
getId
())
.
singleResult
();
System
.
out
.
println
(
"Found process definition : "
+
processDefinition
.
getName
());
Scanner
scanner
=
new
Scanner
(
System
.
in
);
System
.
out
.
println
(
"Who are you?"
);
String
employee
=
scanner
.
nextLine
();
System
.
out
.
println
(
"How many holidays do you want to request?"
);
Integer
nrOfHolidays
=
Integer
.
valueOf
(
scanner
.
nextLine
());
System
.
out
.
println
(
"Why do you need them?"
);
String
description
=
scanner
.
nextLine
();
RuntimeService
runtimeService
=
processEngine
.
getRuntimeService
();
Map
<
String
,
Object
>
variables
=
new
HashMap
<
String
,
Object
>();
variables
.
put
(
"employee"
,
employee
);
variables
.
put
(
"nrOfHolidays"
,
nrOfHolidays
);
variables
.
put
(
"description"
,
description
);
ProcessInstance
processInstance
=
runtimeService
.
startProcessInstanceByKey
(
"holidayRequest"
,
variables
);
TaskService
taskService
=
processEngine
.
getTaskService
();
List
<
Task
>
tasks
=
taskService
.
createTaskQuery
().
taskCandidateGroup
(
"managers"
).
list
();
System
.
out
.
println
(
"You have "
+
tasks
.
size
()
+
" tasks:"
);
for
(
int
i
=
0
;
i
<
tasks
.
size
();
i
++)
{
System
.
out
.
println
((
i
+
1
)
+
") "
+
tasks
.
get
(
i
).
getName
());
}
System
.
out
.
println
(
"Which task would you like to complete?"
);
int
taskIndex
=
Integer
.
valueOf
(
scanner
.
nextLine
());
Task
task
=
tasks
.
get
(
taskIndex
-
1
);
Map
<
String
,
Object
>
processVariables
=
taskService
.
getVariables
(
task
.
getId
());
System
.
out
.
println
(
processVariables
.
get
(
"employee"
)
+
" wants "
+
processVariables
.
get
(
"nrOfHolidays"
)
+
" of holidays. Do you approve this?"
);
boolean
approved
=
scanner
.
nextLine
().
toLowerCase
().
equals
(
"y"
);
variables
=
new
HashMap
<
String
,
Object
>();
variables
.
put
(
"approved"
,
approved
);
taskService
.
complete
(
task
.
getId
(),
variables
);
}
}
guns-admin/src/test/resources/holiday-request.bpmn20.xml
0 → 100644
View file @
098eee7d
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns=
"http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:flowable=
"http://flowable.org/bpmn"
typeLanguage=
"http://www.w3.org/2001/XMLSchema"
expressionLanguage=
"http://www.w3.org/1999/XPath"
targetNamespace=
"http://www.flowable.org/processdef"
>
<process
id=
"holidayRequest"
name=
"Holiday Request"
isExecutable=
"true"
>
<startEvent
id=
"startEvent"
/>
<sequenceFlow
sourceRef=
"startEvent"
targetRef=
"approveTask"
/>
<userTask
id=
"approveTask"
name=
"Approve or reject request"
flowable:candidateGroups=
"managers"
/>
<sequenceFlow
sourceRef=
"approveTask"
targetRef=
"decision"
/>
<exclusiveGateway
id=
"decision"
/>
<sequenceFlow
sourceRef=
"decision"
targetRef=
"externalSystemCall"
>
<conditionExpression
xsi:type=
"tFormalExpression"
>
<![CDATA[
${approved}
]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow
sourceRef=
"decision"
targetRef=
"sendRejectionMail"
>
<conditionExpression
xsi:type=
"tFormalExpression"
>
<![CDATA[
${!approved}
]]>
</conditionExpression>
</sequenceFlow>
<serviceTask
id=
"externalSystemCall"
name=
"Enter holidays in external system"
flowable:class=
"com.stylefeng.guns.flowable.CallExternalSystemDelegate"
/>
<sequenceFlow
sourceRef=
"externalSystemCall"
targetRef=
"holidayApprovedTask"
/>
<userTask
id=
"holidayApprovedTask"
name=
"Holiday approved"
flowable:assignee=
"${employee}"
/>
<sequenceFlow
sourceRef=
"holidayApprovedTask"
targetRef=
"approveEnd"
/>
<serviceTask
id=
"sendRejectionMail"
name=
"Send out rejection email"
flowable:class=
"org.flowable.SendRejectionMail"
/>
<sequenceFlow
sourceRef=
"sendRejectionMail"
targetRef=
"rejectEnd"
/>
<endEvent
id=
"approveEnd"
/>
<endEvent
id=
"rejectEnd"
/>
</process>
</definitions>
\ No newline at end of file
guns-parent/pom.xml
View file @
098eee7d
...
...
@@ -41,10 +41,16 @@
<ehcache.core.version>
2.6.11
</ehcache.core.version>
<mysql-connector-java.version>
5.1.38
</mysql-connector-java.version>
<jwt.version>
0.7.0
</jwt.version>
<flowable.version>
6.2.0
</flowable.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>
org.flowable
</groupId>
<artifactId>
flowable-spring-boot-starter-basic
</artifactId>
<version>
${flowable.version}
</version>
</dependency>
<!--guns-->
<dependency>
<groupId>
com.stylefeng
</groupId>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment