diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ad33869
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,102 @@
+#======================================================================================================================
+#========================================= gitignore的基础用法 =========================================
+#======================================================================================================================
+# 一.基础语法
+# .gitignore配置文件的一些通用技巧 [参考:https://git-scm.com/docs/gitignore]
+# 1.空白行不匹配任何文件,所以可以作为可读性的分隔符,同时两端的空格将会被忽略.
+# 2.使用[#]开头,将会注释掉整行,使其不进行匹配操作,如果需要匹配#开头,可以使用转义字符[\].
+# 3.1匹配模式以[/]结尾,表示想要匹配一个目录及其子文件.(比如[foo/]会匹配foo目录及其下面的路径.)
+# 3.2匹配模式不包含[/],将会全局匹配该文件.
+# 4.通配符
+# [*]: 匹配除[/]以外的任何内容,也就意味着[*]不能跨目录.
+# [?]: 匹配除[/]和[[]以及[]]以外的任何一个字符.
+# [**]: 匹配所有的内容,或者说匹配任意目录下的内容.
+# 示例:
+# 1.[**/foo/bar] 将会匹配所有直接在foo目录下的bar,无论foo处在何处.
+# 2.[foo/**]则表示匹配foo目录下的所有文件和目录.
+# 3.[a/**/b]则可以匹配a/b, a/c/b, a/c/d/b,即此处的[**]可以表示0个或多个.
+# !!! 需要注意的是,除上面示例的用法外,剩余的[**]都是无效的..
+# 5.可以通过前缀[!]来表示不忽略某些文件,比如可以通过[!a]来确保文件a不会被忽略,即时前面已经声明了忽略其父目录,该模式优先级高于普通忽略模式.
+# 二.常用命令
+# 1.git -rm [https://git-scm.com/docs/git-rm]
+# 删除文件索引,或者同时删除文件索引和物理文件.可以使用通配符.
+# 2.git-check-ignore [https://git-scm.com/docs/git-check-ignore]
+# 调试.gitignore文件
+# 三.注意事项
+# 1.如果文件已经被git管理,那么后续添加的忽略模式将不会生效,具体解决方法,参考<<二.常用命令>>.
+
+#=======================================================================================================================
+#============================== java忽略文件 =====================================
+#===================== https://github.com/github/gitignore/blob/master/Java.gitignore ==================
+#=======================================================================================================================
+# 编译后的class文件,忽略所有以[.class]结尾的文件
+*.class
+
+# 日志文件,忽略所有以[.log]结尾的文件.
+*.log
+
+# BlueJ 文件,忽略所有以[.ctxt]结尾的文件.
+*.ctxt
+
+# Mobile Tools for Java (J2ME),忽略[.mtj.tmp/]目录及其子文件.
+.mtj.tmp/
+
+# 打包文件,忽略所有以[.jar]或[.war]或[.nar]或[.ear]或[.zip]或[.tar.gz]或[rar]结尾的文件.
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# 虚拟机崩溃日志,忽略所有以[hs_err_pid]开头的文件.[see http://www.java.com/en/download/help/error_hotspot.xml]
+hs_err_pid*
+#=======================================================================================================================
+#============================== maven忽略文件 ===================================
+#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ==================
+#=======================================================================================================================
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
+!/.mvn/wrapper/maven-wrapper.jar
+#=======================================================================================================================
+#============================== IDE环境忽略文件 ==================================
+#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ==================
+#=======================================================================================================================
+#----------------IDEA-------------
+.idea/*
+.idea/compiler.xml
+.idea/encodings.xml
+.idea/modules.xml
+*.iml
+#=======================================================================================================================
+#============================== other环境忽略文件 ================================
+#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ==================
+#=======================================================================================================================
+*.sw?
+.#*
+*#
+*~
+.classpath
+.project
+.settings/
+bin
+build
+target
+dependency-reduced-pom.xml
+*.sublime-*
+/scratch
+.gradle
+Guardfile
+README.html
+*.iml
+.idea
+._*
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..77e8eae
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,22 @@
+# 基础镜像
+FROM bellsoft/liberica-openjre-rocky:21
+# FROM bellsoft/liberica-openjre-rocky:17
+# FROM bellsoft/liberica-openjre-rocky:11
+# FROM bellsoft/liberica-openjre-rocky:8
+LABEL maintainer=yunzhupaas-team
+
+# 设置时区
+ENV TZ=Asia/Shanghai
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+# 指定运行时的工作目录
+WORKDIR /data/yunzhupaassoft/flowApi
+
+# 将构建产物jar包拷贝到运行时目录中
+COPY yunzhupaas-workflow-admin/target/*.jar ./yunzhupaas-flow-admin.jar
+
+# 指定容器内运行端口
+EXPOSE 31000
+
+# 指定容器启动时要运行的命令
+ENTRYPOINT ["/bin/sh","-c","java -javaagent:./yunzhupaas-flow-admin.jar -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom --add-opens java.base/java.lang=ALL-UNNAMED -XX:+DisableAttachMechanism -jar yunzhupaas-flow-admin.jar"]
diff --git a/README b/README
deleted file mode 100644
index e69de29..0000000
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f85d65e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,295 @@
+> 特别说明:源码、JDK、数据库、Redis等安装或存放路径禁止包含中文、空格、特殊字符等
+
+## 一 环境要求
+
+### 1.1 开发环境
+
+| 类目 | 版本说明或建议 |
+| --- |------------------------|
+| 硬件 | 开发电脑建议使用I3及以上CPU,16G及以上内存 |
+| 操作系统 | Windows 10/11,MacOS |
+| JDK | 默认使用JDK 21,如需要切换JDK 8/11/17版本请参考文档调整代码,推荐使用 `OpenJDK`,如 `Liberica JDK`、`Eclipse Temurin`、`Alibaba Dragonwell`、`BiSheng`等发行版;|
+| Maven | 依赖管理工具,推荐使用 `3.6.3` 及以上版本 |
+| 数据库 | 兼容 `MySQL 5.7.x/8.x`、`SQLServer 2012+`、`Oracle 11g`、`PostgreSQL 12+`、`达梦数据库(DM8)`、`人大金仓数据库(KingbaseES_V8R6)` |
+| IDE | 代码集成开发环境,推荐使用 `IDEA2024` 及以上版本,兼容 `Eclipse`、 `Spring Tool Suite` 等IDE工具 |
+
+### 1.2 运行环境
+
+> 适用于测试或生产环境
+
+| 类目 | 版本说明或建议 |
+| --- |-----------------------------------------------|
+| 服务器配置 | 建议至少在 4C/16G/50G的机器配置下运行; |
+| 操作系统 | 建议使用 `Windows Server 2019` 及以上版本或主流 `Linux` 发行版本,推荐使用 `Linux` 环境;兼容 `统信UOS`,`OpenEuler`,`麒麟服务器版` 等信创环境; |
+| JRE | 默认使用JRE 21,如需要切换JRE 8、11、17版本请参考文档调整代码;推荐使用 `OpenJDK`,如 `Liberica JDK`、`Eclipse Temurin`、`Alibaba Dragonwell`、`BiSheng`等发行版; |
+| 数据库 | 兼容 `MySQL 5.7.x/8.x`、`SQLServer 2012+`、`Oracle 11g`、`PostgreSQL 12+`、`达梦数据库(DM8)`、`人大金仓数据库(KingbaseES_V8R6)` |
+
+## 二 关联项目
+
+| 项目 | 分支 | 说明 |
+|--------------------|---------------|------------|
+| yunzhupaas-workflow-core | v1.0.0-stable | 流程引擎基础依赖 |
+
+## 三 Maven私服配置
+
+> Apache Maven 依赖管理工具,推荐使用 `3.6.3` 及以上版本
解决以下依赖无法从公共Maven仓库下载的问题
+
+打开Maven安装目录中的 `conf/settings.xml` 文件,
+在 `` 中添加如下内容
+
+```xml
+
+ maven-releases
+ admin
+ admin123
+
+```
+
+在 `` 中添加
+
+```xml
+
+ maven-releases
+ *
+ maven-releases
+ https://repository.yunzhupaas.com/repository/maven-public/
+
+```
+
+## 四 开发环境
+
+### 4.1 导入数据库脚本
+
+> 以 MySQL数据库 为例
字符集:utf8mb4
排序规则:utf8mb4_general_ci
+
+在MySQL创建 `yunzhupaas_flow` 数据库,并将 `yunzhupaas-database/MySQL/yunzhupaas_flow_init.sql` 导入;
+
+### 4.2 导入依赖
+
+详见 `yunzhupaas-workflow-core` 项目中的 `README.md` 文档说明
+
+### 4.3 项目配置
+
+打开编辑 `yunzhupaas-workflow-admin/src/main/resources/application.yml`
+
+#### 4.3.1 指定环境配置
+
+环境说明:
+
+- `application-dev.yml` 开发环境(默认)
+- `application-test.yml` 测试环境
+- `application-preview.yml` 预发布环境
+- `application-prod.yml` 生产环境
+
+> 以开发环境为例,根据实际需求修改
+
+```yaml
+# application.yml第 6 行,可选值:dev(开发环境-默认)、test(测试环境)、preview(预生产)、prod(生产环境)
+active: dev
+```
+
+#### 4.3.2 调整运行端口
+> 根据实际需求调整
+
+打开编辑 `yunzhupaas-workflow-admin/src/main/resources/application-dev.yml`(第 2 行)
+
+```yaml
+port: 31000 # 默认运行端口
+```
+
+#### 4.3.3 数据库配置示例
+
+打开编辑 `yunzhupaas-workflow-admin/src/main/resources/application-dev.yml`,修改以下配置
+
+> 注意:
+> - 若使用 `Oracle` 或 `达梦` 数据库必需配置模式名称
+> - 若使用 `PostgreSQL` 和 `人大金仓KingbaseES` 数据库, 默认public模式无需配置模式名称, 若指定模式需要配置模式名称
+> - 若使用 `MySQL` 和 `SQLServer` 无需配置模式名称
+
+##### 4.3.3.1 MySQL数据库
+
+```yaml
+spring:
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ type: com.mysql.cj.jdbc.MysqlDataSource
+ url: jdbc:mysql://127.0.0.1:3306/yunzhupaas_flow?yunzhupaasDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true
+ username: dbuser
+ password: dbpasswd
+```
+
+##### 4.3.3.2 SQLServer数据库
+
+```yaml
+spring:
+ datasource:
+ driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+ type: com.microsoft.sqlserver.jdbc.SQLServerDataSource
+ url: jdbc:sqlserver://127.0.0.1:1433;databaseName=yunzhupaas_flow;trustServerCertificate=true
+ username: dbuser
+ password: dbpasswd
+```
+
+##### 4.3.3.3 Oracle数据库
+> 必需配置模式名称
+
+```yaml
+flowable:
+ database-schema: YUNZHUPAAS_FLOW
+spring:
+ datasource:
+ driver-class-name: oracle.jdbc.OracleDriver
+ type: oracle.jdbc.datasource.impl.OracleDataSource
+ url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
+ username: YUNZHUPAAS_FLOW
+ password: dbpasswd
+```
+
+##### 4.3.3.4 PostgreSQL数据库
+
+**若使用默认 `public` 模式**
+
+```yaml
+spring:
+ datasource:
+ driver-class-name: org.postgresql.Driver
+ type: org.postgresql.ds.PGSimpleDataSource
+ url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+ username: dbuser
+ password: dbpasswd
+```
+
+**若使用其他模式**
+
+```yaml
+flowable:
+ database-schema: yunzhupaas_flow
+spring:
+ datasource:
+ driver-class-name: org.postgresql.Driver
+ type: org.postgresql.ds.PGSimpleDataSource
+ url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+ username: dbuser
+ password: dbpasswd
+```
+
+##### 4.3.3.5 达梦dm8数据库
+> 必需配置模式名称,连接后面需要添加参数 ?compatibleMode=oracle
+
+```yaml
+flowable:
+ database-schema: YUNZHUPAAS_FLOW
+spring:
+ datasource:
+ driver-class-name: dm.jdbc.driver.DmDriver
+ type: dm.jdbc.driver.DmdbDataSource
+ url: jdbc:dm://127.0.0.1:5236/YUNZHUPAAS_FLOW?compatibleMode=oracle
+ username: dbuser
+ password: dbpasswd
+```
+
+##### 4.3.3.6 人大金仓KingbaseES数据库
+
+**若使用默认 `public` 模式**
+
+```yaml
+spring:
+ datasource:
+ driver-class-name: org.postgresql.Driver
+ type: org.postgresql.ds.PGSimpleDataSource
+ url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+ username: dbuser
+ password: dbpasswd
+```
+
+**若使用其他模式**
+
+```yaml
+flowable:
+ database-schema: yunzhupaas_flow
+spring:
+ datasource:
+ driver-class-name: org.postgresql.Driver
+ type: org.postgresql.ds.PGSimpleDataSource
+ url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+ username: dbuser
+ password: dbpasswd
+```
+
+### 4.4 执行调试或运行
+
+#### 4.4.1 `yunzhupaas-workflow-core` 项目未使用加密
+
+- 在IDEA中, 展开右侧 `Maven` 中 `Profiles` 去除勾选 `encrypted` 选项, 再点击 Maven `刷新` 图标刷新Maven
+- 找到 `yunzhupaas-workflow-admin/src/main/java/yunzhupaas/YunzhupaasFlowableApplication.java`,右击运行即可。
+
+若使用JDK9及以上版本,在IDEA中,打开 `Edit Configurations` VM启动参数添加如下参数:
+
+ ```bash
+ --add-opens java.base/java.lang=ALL-UNNAMED
+ ```
+
+#### 4.4.2 `yunzhupaas-workflow-core` 项目使用加密
+
+- 在IDEA中,展开右侧 `Maven` 中 `Profiles` 勾选 `encrypted` 选项, 再点击Maven `刷新` 图标刷新Maven
+- 在IDEA中,双击右侧 `Maven` 中 `yunzhupaas-workflow` > `clean` 将会自动安装加密打包插件, 并创建创建`yunzhupaas-workflow-admin/target/copylib` 复制依赖包用于下一步运行
+
+**参数说明**:
+
+```bash
+# 打开项目中`yunzhupaas-workflow-admin/target/copylib` 目录, 复制Jar包 `yunzhupaas-workflow-common-版本号.jar` 的文件名
+-javaagent:项目存放路径/yunzhupaas-workflow-admin/target/copylib/yunzhupaas-workflow-common-当前版本号.jar(上面复制的文件名)="decryptProjectPathPrefix=yunzhupaas-workflow-common___yunzhupaas-workflow-flowable"
+```
+
+- 在IDEA中,打开 `Edit Configurations` VM启动参数添加如下参数
+
+若使用 JDK8 运行,需要替换下方命令示例中的Jar包路径
+
+ ``` bash
+-XX:+DisableAttachMechanism
+-javaagent:D:/Projects/IdeaProjects/yunzhupaas-workflow-boot/yunzhupaas-workflow-admin/target/copylib/yunzhupaas-workflow-common-1.0.0-RELEASE.jar="decryptProjectPathPrefix=yunzhupaas-workflow-common___yunzhupaas-workflow-flowable"
+ ```
+
+若使用JDK 9及以上版本,需要替换下方命令示例中的Jar包路径
+
+ ``` bash
+--add-opens java.base/java.lang=ALL-UNNAMED
+-XX:+DisableAttachMechanism
+-javaagent:D:/Projects/IdeaProjects/yunzhupaas-workflow-boot/yunzhupaas-workflow-admin/target/copylib/yunzhupaas-workflow-common-1.0.0-RELEASE.jar="decryptProjectPathPrefix=yunzhupaas-workflow-common___yunzhupaas-workflow-flowable"
+ ```
+
+### 4.5 专业版用户
+> 专业版用户无 `yunzhupaas-workflow-core` 项目
+
+若使用 `JDK 8/11` 开发
+
+- 首先全局搜索 `jakarta.` 批量替换为 `javax.`,
+- 在本项目根目录打开 `pom.xml` 文件,注释第 92 行,解除注释第 94 行;
+
+## 五 项目发布
+
+### 5.1 `yunzhupaas-workflow-core` 项目未使用加密
+
+- 在IDEA中, 展开右侧 `Maven` 中 `Profiles` 去除勾选 `encrypted` 选项, 再点击Maven `刷新` 图标刷新Maven
+- 在IDEA中,双击右侧Maven中 `yunzhupaas-workflow` > `Lifecycle` > `clean` 清理项目
+- 在IDEA中,双击右侧Maven中 `yunzhupaas-workflow` > `Lifecycle` > `package` 打包项目
+- 打开 `yunzhupaas-workflow/yunzhupaas-workflow-admin/target`,将 `yunzhupaas-workflow-admin-1.0.0-RELEASE.jar` 上传至服务器
+
+### 5.2 `yunzhupaas-workflow-core` 项目使用加密
+- 在IDEA中, 展开右侧 `Maven` 中 `Profiles` 勾选 `encrypted` 选项, 再点击Maven `刷新` 图标刷新Maven
+- 在IDEA中,双击右侧 `Maven` > `yunzhupaas-workflow` > `clean` 将会自动安装加密打包插件
+- 在IDEA中,双击右侧 `Maven` > `yunzhupaas-workflow` > `Lifecycle` > `package` 打包项目
+- 打开 `yunzhupaas-workflow/yunzhupaas-workflow-admin/target`,将 `yunzhupaas-workflow-admin-1.0.0-RELEASE.jar` 上传至服务器
+- 启动命令
+
+若使用 JDK/JRE 8 运行
+
+```bash
+java -javaagent:./yunzhupaas-workflow-admin-1.0.0-RELEASE.jar -XX:+DisableAttachMechanism -jar yunzhupaas-workflow-admin-1.0.0-RELEASE.jar
+ ```
+
+若使用 JDK/JRE 9及以上版本运行
+
+```bash
+java -javaagent:./yunzhupaas-workflow-admin-1.0.0-RELEASE.jar --add-opens java.base/java.lang=ALL-UNNAMED -XX:+DisableAttachMechanism -jar yunzhupaas-workflow-admin-1.0.0-RELEASE.jar
+ ```
diff --git a/allatori/class-winter-maven-plugin-pom.xml b/allatori/class-winter-maven-plugin-pom.xml
new file mode 100644
index 0000000..b8cef5e
--- /dev/null
+++ b/allatori/class-winter-maven-plugin-pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+ com.idea-aedi
+ class-winter-core
+ enhance-2.9.4
+
+
+
+ com.idea-aedi
+ class-winter-core
+ ${project.version}
+
+
+
+ org.apache.maven
+ maven-plugin-api
+ 3.8.1
+
+
+
+ org.apache.maven.plugin-tools
+ maven-plugin-annotations
+ 3.6.1
+ provided
+
+
+
+ org.apache.maven
+ maven-project
+ 2.2.1
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..1994e9a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,118 @@
+
+
+ 4.0.0
+
+ yunzhupaas-workflow
+ pom
+ 1.0.0-RELEASE
+
+ yunzhupaas-workflow-admin
+
+
+
+ com.yunzhupaas
+ yunzhupaas-workflow-core
+ 1.0.0-RELEASE
+
+
+
+ 2.2
+ 8.3.0
+ 21.9.0.0
+ 8.1.3.140
+ 12.6.1.jre8
+ 42.6.2
+ 6.0.0
+ 42.5.0
+
+
+
+
+
+ com.mysql
+ mysql-connector-j
+ ${mysql.version}
+
+
+ org.yaml
+ snakeyaml
+ ${snakeyaml.version}
+
+
+
+ com.oracle.database.jdbc
+ ojdbc8
+ ${oracle.version}
+
+
+ com.oracle.database.nls
+ orai18n
+ ${oracle.version}
+
+
+
+ com.dameng
+ DmJdbcDriver18
+ ${dm18.version}
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ ${sqlserver.version}
+
+
+
+ org.postgresql
+ postgresql
+ ${postgre.version}
+
+
+
+
+
+
+
+
+
+
+ boot3
+
+ [17,)
+
+
+
+
+
+
+
+
+
+
+ boot2
+
+ (,17)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-workflow-admin/pom.xml b/yunzhupaas-workflow-admin/pom.xml
new file mode 100644
index 0000000..3c71e70
--- /dev/null
+++ b/yunzhupaas-workflow-admin/pom.xml
@@ -0,0 +1,113 @@
+
+
+
+
+ yunzhupaas-workflow
+ com.yunzhupaas
+ 1.0.0-RELEASE
+
+ 4.0.0
+ jar
+
+ yunzhupaas-workflow-admin
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ com.mysql
+ mysql-connector-j
+
+
+
+
+ com.oracle.database.jdbc
+ ojdbc8
+
+
+ com.oracle.database.nls
+ orai18n
+
+
+
+ com.dameng
+ DmJdbcDriver18
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+
+
+
+ org.postgresql
+ postgresql
+
+
+
+
+
+
+
+
+
+ flowable
+
+ [,]
+
+
+
+ com.yunzhupaas
+ yunzhupaas-workflow-flowable${com.yunzhupaas.workflow.core.jdk.version}
+ ${project.version}
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ com.yunzhupaas.FlowableApplication
+ ZIP
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/FlowableApplication.java b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/FlowableApplication.java
new file mode 100644
index 0000000..3415cf5
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/FlowableApplication.java
@@ -0,0 +1,18 @@
+package com.yunzhupaas;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 启动类
+ *
+ * @author YUNZHUPAAS FlowableYUNZHUPAAS开发组
+ * @version 1.0.0
+ * @since 2024/4/2 17:55
+ **/
+@SpringBootApplication
+public class FlowableApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(FlowableApplication.class, args);
+ }
+}
diff --git a/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/DefinitionController.java b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/DefinitionController.java
new file mode 100644
index 0000000..388e53a
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/DefinitionController.java
@@ -0,0 +1,89 @@
+package com.yunzhupaas.workflow.admin.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import com.yunzhupaas.workflow.admin.result.Result;
+import com.yunzhupaas.workflow.common.exception.ResultCode;
+import com.yunzhupaas.workflow.common.model.fo.DefinitionDeleteFo;
+import com.yunzhupaas.workflow.common.model.fo.DefinitionDeployFo;
+import com.yunzhupaas.workflow.common.model.vo.DefinitionVo;
+import com.yunzhupaas.workflow.common.model.vo.DeploymentVo;
+import com.yunzhupaas.workflow.common.service.IDefinitionService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 流程定义控制层
+ *
+ * @author YUNZHUPAAS FlowableYUNZHUPAAS开发组
+ * @version 1.0.0
+ * @since 2024/4/7 10:36
+ */
+@Slf4j
+@Tag(name = "流程定义控制层", description = "DefinitionController")
+@RestController
+@RequestMapping("/api/Flow/definition")
+@RequiredArgsConstructor
+public class DefinitionController {
+ private final IDefinitionService definitionService;
+
+ /**
+ * 部署流程定义
+ *
+ * @param fo {@link DefinitionDeployFo}
+ * @return {@link Result}
+ * @since 2024/4/7 13:39
+ **/
+ @Operation(summary = "deploy", description = "部署流程定义")
+ @PostMapping("/deploy")
+ public Result deploy(@RequestBody @Valid DefinitionDeployFo fo) {
+ DeploymentVo vo = definitionService.deployDefinition(fo);
+ if (null != vo) {
+ return Result.success(vo);
+ }
+ return Result.failed(ResultCode.DEPLOY_FAILURE);
+ }
+
+ /**
+ * 列表查询流程定义
+ *
+ * @return {@link Result>}
+ * @since 2024/4/7 13:39
+ **/
+ @Operation(summary = "list", description = "列表查询流程定义")
+ @GetMapping("/list")
+ public Result> list() {
+ return Result.success(definitionService.listDefinition());
+ }
+
+ /**
+ * 删除流程定义
+ *
+ * @param fo {@link DefinitionDeleteFo}
+ * @return {@link Result}
+ * @since 2024/4/7 13:39
+ **/
+ @Operation(summary = "delete", description = "删除流程定义")
+ @DeleteMapping
+ public Result delete(@Valid DefinitionDeleteFo fo) {
+ if (definitionService.deleteDefinition(fo)) {
+ return Result.success(ResultCode.DELETE_SUCCESS);
+ }
+ return Result.failed(ResultCode.DELETE_FAILURE);
+ }
+
+ /**
+ * 获取流程元素
+ *
+ * @param deploymentId 部署ID
+ */
+ @Operation(summary = "get", description = "获取流程元素")
+ @GetMapping("/{deploymentId}")
+ public Result getStructure(@PathVariable("deploymentId") String deploymentId) {
+ return Result.success(definitionService.getStructure(deploymentId));
+ }
+}
diff --git a/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/InstanceController.java b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/InstanceController.java
new file mode 100644
index 0000000..3841697
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/InstanceController.java
@@ -0,0 +1,77 @@
+package com.yunzhupaas.workflow.admin.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import com.yunzhupaas.workflow.admin.result.Result;
+import com.yunzhupaas.workflow.common.exception.ResultCode;
+import com.yunzhupaas.workflow.common.model.fo.InstanceDeleteFo;
+import com.yunzhupaas.workflow.common.model.fo.InstanceStartFo;
+import com.yunzhupaas.workflow.common.model.vo.HistoricInstanceVo;
+import com.yunzhupaas.workflow.common.model.vo.InstanceVo;
+import com.yunzhupaas.workflow.common.service.IInstanceService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 流程实例控制层
+ *
+ * @author YUNZHUPAAS FlowableYUNZHUPAAS开发组
+ * @version 1.0.0
+ * @since 2024/4/7 16:29
+ */
+@Slf4j
+@Tag(name = "流程实例控制层", description = "InstanceController")
+@RestController
+@RequestMapping("/api/Flow/instance")
+@RequiredArgsConstructor
+public class InstanceController {
+ private final IInstanceService instanceService;
+
+ /**
+ * 启动流程实例
+ *
+ * @param fo {@link InstanceStartFo}
+ * @return {@link Result}
+ * @since 2024/4/7 17:35
+ **/
+ @Operation(summary = "start", description = "启动流程实例")
+ @PostMapping("/start")
+ public Result start(@RequestBody @Valid InstanceStartFo fo) {
+ InstanceVo vo = instanceService.startById(fo);
+ if (null != vo) {
+ return Result.success(vo);
+ }
+ return Result.failed(ResultCode.START_FAILURE);
+ }
+
+ /**
+ * 获取流程实例
+ *
+ * @param instanceId {@link String}
+ * @return {@link Result}
+ * @since 2024/4/7 18:17
+ **/
+ @Operation(summary = "get", description = "获取流程实例")
+ @GetMapping("/{instanceId}")
+ public Result getInstance(@PathVariable("instanceId") String instanceId) {
+ return Result.success(instanceService.getHistoricProcessInstance(instanceId));
+ }
+
+ /**
+ * 删除流程实例
+ *
+ * @param fo {@link InstanceDeleteFo}
+ * @return {@link Result}
+ * @since 2024/4/7 17:35
+ **/
+ @Operation(summary = "delete", description = "删除流程实例")
+ @DeleteMapping
+ public Result delete(InstanceDeleteFo fo) {
+ if (instanceService.deleteInstance(fo)) {
+ return Result.success(ResultCode.DELETE_SUCCESS);
+ }
+ return Result.failed(ResultCode.DELETE_FAILURE);
+ }
+}
diff --git a/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/TaskController.java b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/TaskController.java
new file mode 100644
index 0000000..93dbc71
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/controller/TaskController.java
@@ -0,0 +1,298 @@
+package com.yunzhupaas.workflow.admin.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import com.yunzhupaas.workflow.admin.result.Result;
+import com.yunzhupaas.workflow.common.exception.ResultCode;
+import com.yunzhupaas.workflow.common.model.fo.*;
+import com.yunzhupaas.workflow.common.model.vo.HistoricNodeVo;
+import com.yunzhupaas.workflow.common.model.vo.NodeElementVo;
+import com.yunzhupaas.workflow.common.model.vo.TaskVo;
+import com.yunzhupaas.workflow.common.service.ITaskService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 流程任务控制层
+ *
+ * @author YUNZHUPAAS FlowableYUNZHUPAAS开发组
+ * @version 1.0.0
+ * @since 2024/4/8 14:17
+ */
+@Slf4j
+@Tag(name = "流程任务控制层", description = "TaskController")
+@RestController
+@RequestMapping("/api/Flow/task")
+@RequiredArgsConstructor
+public class TaskController {
+ private final ITaskService taskService;
+
+ /**
+ * 根据流程实例ID获取任务
+ *
+ * @param instanceId {@link String}
+ * @return {@link Result>}
+ * @since 2024/4/8 15:10
+ **/
+ @Operation(summary = "list", description = "根据流程实例ID获取任务")
+ @GetMapping("/list/{instanceId}")
+ public Result> list(@PathVariable("instanceId") String instanceId) {
+ return Result.success(taskService.getTask(instanceId));
+ }
+
+ /**
+ * 完成任务
+ *
+ * @param fo {@link TaskCompleteFo}
+ * @return {@link Result}
+ * @since 2024/4/8 15:10
+ **/
+ @Operation(summary = "complete", description = "完成任务")
+ @PostMapping("/complete")
+ public Result complete(@RequestBody @Valid TaskCompleteFo fo) {
+ if (taskService.complete(fo)) {
+ return Result.success(ResultCode.COMPLETE_SUCCESS);
+ }
+ return Result.failed(ResultCode.COMPLETE_FAILURE);
+ }
+
+ /**
+ * 单节点跳转多节点
+ *
+ * @param fo {@link MoveSingleToMultiFo}
+ * @return {@link Result}
+ * @since 2024/4/10 10:30
+ **/
+ @Operation(summary = "moveSingleToMulti", description = "单节点跳转多节点")
+ @PostMapping("/move/single/to/multi")
+ public Result moveSingleToMulti(@RequestBody @Valid MoveSingleToMultiFo fo) {
+ if (taskService.moveSingleToMulti(fo)) {
+ return Result.success(ResultCode.JUMP_SUCCESS);
+ }
+ return Result.failed(ResultCode.JUMP_FAILURE);
+ }
+
+ /**
+ * 多节点跳转单节点
+ *
+ * @param fo {@link MoveMultiToSingleFo}
+ * @return {@link Result}
+ * @since 2024/4/10 10:30
+ **/
+ @Operation(summary = "moveMultiToSingle", description = "多节点跳转单节点")
+ @PostMapping("/move/multi/to/single")
+ public Result moveMultiToSingle(@RequestBody @Valid MoveMultiToSingleFo fo) {
+ if (taskService.moveMultiToSingle(fo)) {
+ return Result.success(ResultCode.JUMP_SUCCESS);
+ }
+ return Result.failed(ResultCode.JUMP_FAILURE);
+ }
+
+ /**
+ * 节点跳转
+ *
+ * @param fo {@link JumpFo}
+ * @return {@link Result}
+ * @since 2024/4/10 11:50
+ **/
+ @Operation(summary = "jump", description = "节点跳转")
+ @PostMapping("/jump")
+ public Result jump(@RequestBody JumpFo fo) {
+ if (taskService.jump(fo)) {
+ return Result.success(ResultCode.JUMP_SUCCESS);
+ }
+ return Result.failed(ResultCode.JUMP_FAILURE);
+ }
+
+ /**
+ * 获取可回退的节点ID
+ *
+ * @param taskId {@link String}
+ * @return {@link Result>}
+ * @since 2024/4/8 16:03
+ **/
+ @Operation(summary = "fallbacks", description = "获取可回退的节点ID")
+ @GetMapping("/fallbacks/{taskId}")
+ public Result> fallbacks(@PathVariable("taskId") String taskId) {
+ return Result.success(taskService.getFallbacks(taskId));
+ }
+
+ /**
+ * 退回
+ *
+ * @param fo {@link TaskBackFo}
+ * @return {@link Result>}
+ * @since 2024/4/9 9:27
+ **/
+ @Operation(summary = "back", description = "退回")
+ @PostMapping("/back")
+ public Result> back(@RequestBody @Valid TaskBackFo fo) {
+ return Result.success(taskService.back(fo));
+ }
+
+ /**
+ * 获取上一级任务节点ID集合
+ *
+ * @param fo {@link TaskPrevFo}
+ * @return {@link Result>}
+ * @since 2024/4/9 9:27
+ **/
+ @Operation(summary = "get", description = "获取上一级任务节点ID集合")
+ @GetMapping("/prev")
+ public Result> getPrev(TaskPrevFo fo) {
+ return Result.success(taskService.getPrevUserTask(fo));
+ }
+
+ /**
+ * 获取下一级任务节点集合
+ *
+ * @param fo {@link TaskNextFo}
+ * @return {@link Result>}
+ * @since 2024/4/9 9:27
+ **/
+ @Operation(summary = "get", description = "获取下一级任务节点集合")
+ @GetMapping("/next")
+ public Result> getNext(TaskNextFo fo) {
+ return Result.success(taskService.getNextUserTask(fo));
+ }
+
+ /**
+ * 撤回
+ *
+ * @param taskId {@link String}
+ * @return {@link Result}
+ * @since 2024/4/9 11:08
+ **/
+ @Operation(summary = "retract", description = "撤回")
+ @PostMapping("/retract/{taskId}")
+ public Result retract(@PathVariable("taskId") String taskId) {
+ if (taskService.retract(taskId)) {
+ return Result.success(ResultCode.RETRACT_SUCCESS);
+ }
+ return Result.failed(ResultCode.RETRACT_FAILURE);
+ }
+
+ /**
+ * 获取出线Key集合(若出线的出口为网关,则一并获取网关的出线)
+ *
+ * @param fo {@link TaskOutgoingFo}
+ * @return {@link Result>}
+ * @since 2024/4/9 11:08
+ **/
+ @Operation(summary = "outgoingFlows", description = "获取出线Key集合(若出线的出口为网关,则一并获取网关的出线)")
+ @GetMapping("/outgoing/flows")
+ public Result> getOutgoingFlows(TaskOutgoingFo fo) {
+ return Result.success(taskService.getOutgoingFlows(fo));
+ }
+
+ /**
+ * 获取完成的节点Key
+ *
+ * @param instanceId {@link String}
+ * @return {@link Result>}
+ * @since 2024/4/9 13:54
+ **/
+ @Operation(summary = "get", description = "获取完成的节点Key")
+ @GetMapping("/finished/keys/{instanceId}")
+ public Result> getKeysOfFinished(@PathVariable("instanceId") String instanceId) {
+ return Result.success(taskService.getKeysOfFinished(instanceId));
+ }
+
+ /**
+ * 获取进线的Key
+ *
+ * @param taskId {@link String}
+ * @return {@link Result>}
+ * @since 2024/4/9 13:58
+ **/
+ @Operation(summary = "get", description = "获取进线的Key")
+ @GetMapping("/incoming/flows/{taskId}")
+ public Result> getIncomingFlows(@PathVariable("taskId") String taskId) {
+ return Result.success(taskService.getIncomingFlows(taskId));
+ }
+
+ /**
+ * 获取线之后的任务节点
+ *
+ * @param fo {@link FlowTargetTaskFo}
+ * @return {@link Result}
+ * @since 2024/4/17 17:48
+ **/
+ @Operation(summary = "get", description = "获取线之后的任务节点")
+ @GetMapping("/flow/target")
+ public Result> getTaskKeyAfterFlow(FlowTargetTaskFo fo) {
+ return Result.success(taskService.getTaskKeyAfterFlow(fo));
+ }
+
+ /**
+ * 获取未经过的节点
+ *
+ * @param instanceId {@link String}
+ * @return {@link Result>}
+ * @since 2024/4/29 10:08
+ **/
+ @Operation(summary = "get", description = "获取未经过的节点")
+ @GetMapping("/tobe/pass/{instanceId}")
+ public Result> getToBePass(@PathVariable("instanceId") String instanceId) {
+ return Result.success(taskService.getToBePass(instanceId));
+ }
+
+ /**
+ * 获取节点的后续节点
+ *
+ * @param fo 参数
+ */
+ @Operation(summary = "get", description = "获取节点的后续节点")
+ @PostMapping("/after")
+ public Result> getAfter(@RequestBody TaskAfterFo fo) {
+ return Result.success(taskService.getAfter(fo));
+ }
+
+ /**
+ * 异常补偿
+ *
+ * @param fo 参数
+ */
+ @Operation(summary = "compensate", description = "异常补偿")
+ @PostMapping("/compensate")
+ public Result> compensate(@RequestBody CompensateFo fo) {
+ return Result.success(taskService.compensate(fo));
+ }
+
+ /**
+ * 获取历史节点
+ *
+ * @param instanceId 实例主键
+ */
+ @Operation(summary = "historic", description = "获取历史节点")
+ @GetMapping("/historic/{instanceId}")
+ public Result> getHistoric(@PathVariable("instanceId") String instanceId) {
+ return Result.success(taskService.getHistoric(instanceId));
+ }
+
+ /**
+ * 获取历史结束节点
+ *
+ * @param instanceId 实例主键
+ */
+ @Operation(summary = "historicEnd", description = "获取历史结束节点")
+ @GetMapping("/historic/end/{instanceId}")
+ public Result> getHistoricEnd(@PathVariable("instanceId") String instanceId) {
+ return Result.success(taskService.getHistoricEnd(instanceId));
+ }
+
+ /**
+ * 获取元素信息
+ *
+ * @param model 参数
+ */
+ @Operation(summary = "elementInfo", description = "获取元素信息")
+ @GetMapping("/element/info")
+ public Result getElementInfo(InfoModel model) {
+ return Result.success(taskService.getElementInfo(model));
+ }
+}
diff --git a/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/handle/GlobalExceptionHandler.java b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/handle/GlobalExceptionHandler.java
new file mode 100644
index 0000000..219df00
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/handle/GlobalExceptionHandler.java
@@ -0,0 +1,61 @@
+package com.yunzhupaas.workflow.admin.handle;
+
+import jakarta.servlet.http.HttpServletRequest;
+import com.yunzhupaas.workflow.admin.result.Result;
+import com.yunzhupaas.workflow.common.exception.BizException;
+import com.yunzhupaas.workflow.common.exception.ResultCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.support.DefaultMessageSourceResolvable;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 全局异常处理
+ *
+ * @author YUNZHUPAAS FlowableYUNZHUPAAS开发组
+ * @version 1.0.0
+ * @since 2024/4/3 15:33
+ */
+@Slf4j
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+ @ExceptionHandler(BindException.class)
+ public Result> bindExceptionHandler(BindException e) {
+ log.error("接口校验失败!原因是:{}", e.getMessage(), e);
+ List fieldErrors = e.getBindingResult().getFieldErrors();
+ List collect = fieldErrors.stream()
+ .map(DefaultMessageSourceResolvable::getDefaultMessage)
+ .collect(Collectors.toList());
+ String msg = String.join(",", collect);
+ return Result.failed(ResultCode.REQUEST_PARAM_IS_NULL, msg);
+ }
+
+ /**
+ * 处理空指针的异常
+ */
+ @ExceptionHandler(value = NullPointerException.class)
+ public Result> exceptionHandler(HttpServletRequest req, NullPointerException e) {
+ log.error("发生空指针异常!原因是:{}", e.getMessage(), e);
+ return Result.failed(ResultCode.SYSTEM_EXECUTION_ERROR);
+ }
+
+ /**
+ * 处理自定义异常
+ */
+ @ExceptionHandler(value = BizException.class)
+ public Result> exceptionHandler(HttpServletRequest req, BizException e) {
+ log.error("BizException!原因是:{}", e.getMessage(), e);
+ return Result.failed(e.getResultCode(), e.getMessage());
+ }
+
+ @ExceptionHandler(Exception.class)
+ public Result> exceptionHandler(HttpServletRequest req, Exception e) {
+ log.error("未知异常!原因是:{}", e.getMessage(), e);
+ return Result.failed(e.getMessage());
+ }
+}
diff --git a/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/result/Result.java b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/result/Result.java
new file mode 100644
index 0000000..7eeff12
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/java/com/yunzhupaas/workflow/admin/result/Result.java
@@ -0,0 +1,96 @@
+package com.yunzhupaas.workflow.admin.result;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.yunzhupaas.workflow.common.exception.ResultCode;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 统一返回结果类
+ *
+ * @author YUNZHUPAAS FlowableYUNZHUPAAS开发组
+ * @version 1.0.0
+ * @since 2024/4/3 15:00
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Result implements Serializable {
+ private Boolean success;
+ private String code;
+ private String msg;
+ private T data;
+
+ public static Result result(Boolean success, String code, String msg, T data) {
+ Result result = new Result<>();
+ result.setSuccess(success);
+ result.setCode(code);
+ result.setMsg(msg);
+ result.setData(data);
+ return result;
+ }
+
+ public static Result result(Boolean success, ResultCode resultCode, T data) {
+ return result(success, resultCode.getCode(), resultCode.getMsg(), data);
+ }
+
+ public static boolean isSuccess(Result result) {
+ return result != null && ResultCode.SUCCESS.getCode().equals(result.getCode());
+ }
+
+ public static Result success() {
+ return result(true, ResultCode.SUCCESS, null);
+ }
+
+ public static Result success(T data) {
+ return result(true, ResultCode.SUCCESS, data);
+ }
+
+ public static Result success(ResultCode resultCode, T data) {
+ return result(true, resultCode, data);
+ }
+
+ public static Result success(ResultCode resultCode) {
+ return result(true, resultCode, null);
+ }
+
+ public static Result success(String code, String msg, T data) {
+ return result(true, code, msg, data);
+ }
+
+ public static Result success(String msg) {
+ return result(true, ResultCode.SUCCESS.getCode(), msg, null);
+ }
+
+ public static Result failed() {
+ return result(false, ResultCode.FAILURE.getCode(), ResultCode.FAILURE.getMsg(), null);
+ }
+
+ public static Result failed(T data) {
+ return result(false, ResultCode.FAILURE.getCode(), ResultCode.FAILURE.getMsg(), data);
+ }
+
+ public static Result failed(String msg) {
+ return result(false, ResultCode.FAILURE.getCode(), msg, null);
+ }
+
+ public static Result failed(String msg, T data) {
+ return result(false, ResultCode.FAILURE.getCode(), msg, data);
+ }
+
+ public static Result failed(ResultCode resultCode) {
+ return result(false, resultCode.getCode(), resultCode.getMsg(), null);
+ }
+
+ public static Result failed(ResultCode resultCode, T data) {
+ return result(false, resultCode.getCode(), resultCode.getMsg(), data);
+ }
+
+ public static Result failed(ResultCode resultCode, String msg) {
+ return result(false, resultCode.getCode(), msg, null);
+ }
+
+ public static Result failed(ResultCode resultCode, String msg, T data) {
+ return result(false, resultCode.getCode(), msg, data);
+ }
+}
diff --git a/yunzhupaas-workflow-admin/src/main/resources/application-dev.yml b/yunzhupaas-workflow-admin/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..2741d69
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/resources/application-dev.yml
@@ -0,0 +1,101 @@
+server:
+ port: 31000
+
+logging:
+ level:
+ root: info
+ org.flowable.engine.impl.persistence.entity.*: debug
+ org.flowable.task.service.impl.persistence.entity.*: debug
+
+# 注意:
+# 若使用 Oracle 或 达梦 数据库必需配置模式名称
+# 若使用 PostgreSQL 和 人大金仓KingbaseES 数据库, 默认public模式无需配置模式名称, 若指定模式需要配置模式名称
+# 若使用 MySQL 和 SQLServer 无需配置模式名称
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+
+# ===================== 1 若使用MySQL数据库-Start =====================
+spring:
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ type: com.mysql.cj.jdbc.MysqlDataSource
+ url: jdbc:mysql://mysql.szlecheng.cn:13306/jnpfsoft_flow?yunzhupaasDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
+ username: jnpfsoft_flow
+ password: C6J7BiD2bskYAwtZ
+# ===================== 1 若使用MySQL数据库-End =======================
+# ===================== 2 若使用SQLServer数据库-Start =====================
+#spring:
+# datasource:
+# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+# type: com.microsoft.sqlserver.jdbc.SQLServerDataSource
+# url: jdbc:sqlserver://127.0.0.1:1433;databaseName=yunzhupaas_flow;trustServerCertificate=true
+# username: sa
+# password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: oracle.jdbc.OracleDriver
+# type: oracle.jdbc.datasource.impl.OracleDataSource
+# url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
+# username: YUNZHUPAAS_FLOW
+# password: dbpasswd
+# ===================== 3 若使用Oracle数据库-End =======================
+# ===================== 4 若使用PostgreSQL数据库-Start =====================
+# ========== 4.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: dm.jdbc.driver.DmDriver
+# type: dm.jdbc.driver.DmdbDataSource
+# # 连接后面需要添加参数 ?compatibleMode=oracle
+# url: jdbc:dm://127.0.0.1:5236/YUNZHUPAAS_FLOW?compatibleMode=oracle
+# username: dbuser
+# password: dbpasswd
+# ===================== 5 若使用达梦dm8数据库-End =======================
+# ===================== 6 若使用人大金仓KingbaseES数据库-Start =====================
+# ========== 6.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================
diff --git a/yunzhupaas-workflow-admin/src/main/resources/application-preview.yml b/yunzhupaas-workflow-admin/src/main/resources/application-preview.yml
new file mode 100644
index 0000000..5e6b7d4
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/resources/application-preview.yml
@@ -0,0 +1,101 @@
+server:
+ port: 31000
+
+logging:
+ level:
+ root: info
+ org.flowable.engine.impl.persistence.entity.*: debug
+ org.flowable.task.service.impl.persistence.entity.*: debug
+
+# 注意:
+# 若使用 Oracle 或 达梦 数据库必需配置模式名称
+# 若使用 PostgreSQL 和 人大金仓KingbaseES 数据库, 默认public模式无需配置模式名称, 若指定模式需要配置模式名称
+# 若使用 MySQL 和 SQLServer 无需配置模式名称
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+
+# ===================== 1 若使用MySQL数据库-Start =====================
+spring:
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ type: com.mysql.cj.jdbc.MysqlDataSource
+ url: jdbc:mysql://127.0.0.1:3306/yunzhupaas_flow?yunzhupaasDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true
+ username: root
+ password: 123456
+# ===================== 1 若使用MySQL数据库-End =======================
+# ===================== 2 若使用SQLServer数据库-Start =====================
+#spring:
+# datasource:
+# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+# type: com.microsoft.sqlserver.jdbc.SQLServerDataSource
+# url: jdbc:sqlserver://127.0.0.1:1433;databaseName=yunzhupaas_flow;trustServerCertificate=true
+# username: sa
+# password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: oracle.jdbc.OracleDriver
+# type: oracle.jdbc.datasource.impl.OracleDataSource
+# url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
+# username: YUNZHUPAAS_FLOW
+# password: dbpasswd
+# ===================== 3 若使用Oracle数据库-End =======================
+# ===================== 4 若使用PostgreSQL数据库-Start =====================
+# ========== 4.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: dm.jdbc.driver.DmDriver
+# type: dm.jdbc.driver.DmdbDataSource
+# # 连接后面需要添加参数 ?compatibleMode=oracle
+# url: jdbc:dm://127.0.0.1:5236/YUNZHUPAAS_FLOW?compatibleMode=oracle
+# username: dbuser
+# password: dbpasswd
+# ===================== 5 若使用达梦dm8数据库-End =======================
+# ===================== 6 若使用人大金仓KingbaseES数据库-Start =====================
+# ========== 6.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================
diff --git a/yunzhupaas-workflow-admin/src/main/resources/application-prod.yml b/yunzhupaas-workflow-admin/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..5e6b7d4
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/resources/application-prod.yml
@@ -0,0 +1,101 @@
+server:
+ port: 31000
+
+logging:
+ level:
+ root: info
+ org.flowable.engine.impl.persistence.entity.*: debug
+ org.flowable.task.service.impl.persistence.entity.*: debug
+
+# 注意:
+# 若使用 Oracle 或 达梦 数据库必需配置模式名称
+# 若使用 PostgreSQL 和 人大金仓KingbaseES 数据库, 默认public模式无需配置模式名称, 若指定模式需要配置模式名称
+# 若使用 MySQL 和 SQLServer 无需配置模式名称
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+
+# ===================== 1 若使用MySQL数据库-Start =====================
+spring:
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ type: com.mysql.cj.jdbc.MysqlDataSource
+ url: jdbc:mysql://127.0.0.1:3306/yunzhupaas_flow?yunzhupaasDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true
+ username: root
+ password: 123456
+# ===================== 1 若使用MySQL数据库-End =======================
+# ===================== 2 若使用SQLServer数据库-Start =====================
+#spring:
+# datasource:
+# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+# type: com.microsoft.sqlserver.jdbc.SQLServerDataSource
+# url: jdbc:sqlserver://127.0.0.1:1433;databaseName=yunzhupaas_flow;trustServerCertificate=true
+# username: sa
+# password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: oracle.jdbc.OracleDriver
+# type: oracle.jdbc.datasource.impl.OracleDataSource
+# url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
+# username: YUNZHUPAAS_FLOW
+# password: dbpasswd
+# ===================== 3 若使用Oracle数据库-End =======================
+# ===================== 4 若使用PostgreSQL数据库-Start =====================
+# ========== 4.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: dm.jdbc.driver.DmDriver
+# type: dm.jdbc.driver.DmdbDataSource
+# # 连接后面需要添加参数 ?compatibleMode=oracle
+# url: jdbc:dm://127.0.0.1:5236/YUNZHUPAAS_FLOW?compatibleMode=oracle
+# username: dbuser
+# password: dbpasswd
+# ===================== 5 若使用达梦dm8数据库-End =======================
+# ===================== 6 若使用人大金仓KingbaseES数据库-Start =====================
+# ========== 6.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================
diff --git a/yunzhupaas-workflow-admin/src/main/resources/application-test.yml b/yunzhupaas-workflow-admin/src/main/resources/application-test.yml
new file mode 100644
index 0000000..5e6b7d4
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/resources/application-test.yml
@@ -0,0 +1,101 @@
+server:
+ port: 31000
+
+logging:
+ level:
+ root: info
+ org.flowable.engine.impl.persistence.entity.*: debug
+ org.flowable.task.service.impl.persistence.entity.*: debug
+
+# 注意:
+# 若使用 Oracle 或 达梦 数据库必需配置模式名称
+# 若使用 PostgreSQL 和 人大金仓KingbaseES 数据库, 默认public模式无需配置模式名称, 若指定模式需要配置模式名称
+# 若使用 MySQL 和 SQLServer 无需配置模式名称
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+
+# ===================== 1 若使用MySQL数据库-Start =====================
+spring:
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ type: com.mysql.cj.jdbc.MysqlDataSource
+ url: jdbc:mysql://127.0.0.1:3306/yunzhupaas_flow?yunzhupaasDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true
+ username: root
+ password: 123456
+# ===================== 1 若使用MySQL数据库-End =======================
+# ===================== 2 若使用SQLServer数据库-Start =====================
+#spring:
+# datasource:
+# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+# type: com.microsoft.sqlserver.jdbc.SQLServerDataSource
+# url: jdbc:sqlserver://127.0.0.1:1433;databaseName=yunzhupaas_flow;trustServerCertificate=true
+# username: sa
+# password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: oracle.jdbc.OracleDriver
+# type: oracle.jdbc.datasource.impl.OracleDataSource
+# url: jdbc:oracle:thin:@127.0.0.1:1521:ORCL
+# username: YUNZHUPAAS_FLOW
+# password: dbpasswd
+# ===================== 3 若使用Oracle数据库-End =======================
+# ===================== 4 若使用PostgreSQL数据库-Start =====================
+# ========== 4.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+# database-schema: YUNZHUPAAS_FLOW
+#spring:
+# datasource:
+# driver-class-name: dm.jdbc.driver.DmDriver
+# type: dm.jdbc.driver.DmdbDataSource
+# # 连接后面需要添加参数 ?compatibleMode=oracle
+# url: jdbc:dm://127.0.0.1:5236/YUNZHUPAAS_FLOW?compatibleMode=oracle
+# username: dbuser
+# password: dbpasswd
+# ===================== 5 若使用达梦dm8数据库-End =======================
+# ===================== 6 若使用人大金仓KingbaseES数据库-Start =====================
+# ========== 6.1 若使用默认public模式-Start ==========
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+# database-schema: yunzhupaas_flow
+#spring:
+# datasource:
+# driver-class-name: org.postgresql.Driver
+# type: org.postgresql.ds.PGSimpleDataSource
+# url: jdbc:postgresql://127.0.0.1:5432/yunzhupaas_flow
+# username: dbuser
+# password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================
diff --git a/yunzhupaas-workflow-admin/src/main/resources/application.yml b/yunzhupaas-workflow-admin/src/main/resources/application.yml
new file mode 100644
index 0000000..ccf90f6
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/resources/application.yml
@@ -0,0 +1,24 @@
+spring:
+ application:
+ name: yunzhupaas-workflow
+ profiles:
+ # 指定环境配置 dev(开发环境-默认)、test(测试环境)、preview(预生产)、prod(生产环境)
+ active: dev
+ main:
+ allow-bean-definition-overriding: true
+ allow-circular-references: true
+
+logging:
+ config: classpath:logback-spring.xml
+springdoc:
+ default-flat-param-object: true
+ api-docs:
+ enabled: true
+
+#SpringDoc增强
+#knife4j:
+# basic: #接口文档访问鉴权
+# enable: true
+# username: yunzhupaas
+# password: 123456
+# enable: true
diff --git a/yunzhupaas-workflow-admin/src/main/resources/logback-spring.xml b/yunzhupaas-workflow-admin/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..1136fd7
--- /dev/null
+++ b/yunzhupaas-workflow-admin/src/main/resources/logback-spring.xml
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_error.log
+
+
+
+
+
+ ${LOG_PATH}/error/%d{yyyy-MM-dd,aux}/log-error-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+
+ 10MB
+
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ error
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_info.log
+
+
+
+
+
+ ${LOG_PATH}/info/%d{yyyy-MM-dd,aux}/log-info-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+
+ 10MB
+
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ info
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_warn.log
+
+
+
+
+
+ ${LOG_PATH}/warn/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+
+ 10MB
+
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ warn
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_debug.log
+
+
+
+
+
+ ${LOG_PATH}/debug/%d{yyyy-MM-dd,aux}/log-debug-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+
+ 10MB
+
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ debug
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_total.log
+
+
+
+
+
+ ${LOG_PATH}/total/%d{yyyy-MM-dd,aux}/log-total-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+
+ 10MB
+
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+
+
+
+
+ ${LOG_PATH}/log_release.log
+
+
+
+
+
+ ${LOG_PATH}/release/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log
+
+ 7
+
+
+
+ 10MB
+
+
+
+
+ true
+
+
+
+ ${FILE_LOG_PATTERN}
+ utf-8
+
+
+
+
+ ${LOG_LEVEL}
+ ACCEPT
+ DENY
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+ 0
+ 256
+
+
+
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+ utf-8
+
+
+
+
+
+
+ 0
+ 256
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+