zhaojinyu 1 bulan lalu
melakukan
d58198856a
42 mengubah file dengan 2935 tambahan dan 0 penghapusan
  1. 8 0
      .idea/.gitignore
  2. 19 0
      .idea/compiler.xml
  3. 9 0
      .idea/encodings.xml
  4. 20 0
      .idea/jarRepositories.xml
  5. 12 0
      .idea/misc.xml
  6. 4 0
      .idea/vcs.xml
  7. 22 0
      Dockerfile
  8. 295 0
      README.md
  9. TEMPAT SAMPAH
      allatori/class-winter-core-enhance-2.9.4.jar
  10. TEMPAT SAMPAH
      allatori/class-winter-maven-plugin-enhance-2.9.4.jar
  11. 37 0
      allatori/class-winter-maven-plugin-pom.xml
  12. 203 0
      jnpf-workflow-admin/pom.xml
  13. 18 0
      jnpf-workflow-admin/src/main/java/jnpf/JnpfFlowableApplication.java
  14. 89 0
      jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/controller/DefinitionController.java
  15. 77 0
      jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/controller/InstanceController.java
  16. 298 0
      jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/controller/TaskController.java
  17. 61 0
      jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/handle/GlobalExceptionHandler.java
  18. 96 0
      jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/result/Result.java
  19. 101 0
      jnpf-workflow-admin/src/main/resources/application-dev.yml
  20. 101 0
      jnpf-workflow-admin/src/main/resources/application-preview.yml
  21. 101 0
      jnpf-workflow-admin/src/main/resources/application-prod.yml
  22. 101 0
      jnpf-workflow-admin/src/main/resources/application-test.yml
  23. 24 0
      jnpf-workflow-admin/src/main/resources/application.yml
  24. 339 0
      jnpf-workflow-admin/src/main/resources/logback-spring.xml
  25. 101 0
      jnpf-workflow-admin/target/classes/application-dev.yml
  26. 101 0
      jnpf-workflow-admin/target/classes/application-preview.yml
  27. 101 0
      jnpf-workflow-admin/target/classes/application-prod.yml
  28. 101 0
      jnpf-workflow-admin/target/classes/application-test.yml
  29. 24 0
      jnpf-workflow-admin/target/classes/application.yml
  30. TEMPAT SAMPAH
      jnpf-workflow-admin/target/classes/jnpf/JnpfFlowableApplication.class
  31. TEMPAT SAMPAH
      jnpf-workflow-admin/target/classes/jnpf/workflow/admin/controller/DefinitionController.class
  32. TEMPAT SAMPAH
      jnpf-workflow-admin/target/classes/jnpf/workflow/admin/controller/InstanceController.class
  33. TEMPAT SAMPAH
      jnpf-workflow-admin/target/classes/jnpf/workflow/admin/controller/TaskController.class
  34. TEMPAT SAMPAH
      jnpf-workflow-admin/target/classes/jnpf/workflow/admin/handle/GlobalExceptionHandler.class
  35. TEMPAT SAMPAH
      jnpf-workflow-admin/target/classes/jnpf/workflow/admin/result/Result.class
  36. 339 0
      jnpf-workflow-admin/target/classes/logback-spring.xml
  37. TEMPAT SAMPAH
      jnpf-workflow-admin/target/jnpf-workflow-admin-1.0.0-RELEASE.jar
  38. TEMPAT SAMPAH
      jnpf-workflow-admin/target/jnpf-workflow-admin-1.0.0-RELEASE.jar.original
  39. 3 0
      jnpf-workflow-admin/target/maven-archiver/pom.properties
  40. 6 0
      jnpf-workflow-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
  41. 6 0
      jnpf-workflow-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
  42. 118 0
      pom.xml

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 19 - 0
.idea/compiler.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="jnpf-workflow-admin" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="jnpf-workflow" options="-parameters" />
+      <module name="jnpf-workflow-admin" options="-parameters" />
+    </option>
+  </component>
+</project>

+ 9 - 0
.idea/encodings.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/jnpf-workflow-admin/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/jnpf-workflow-admin/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 20 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://127.0.0.1:9999/repository/maven-public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>

+ 12 - 0
.idea/misc.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK" />
+</project>

+ 4 - 0
.idea/vcs.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings" defaultProject="true" />
+</project>

+ 22 - 0
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=jnpf-team
+
+# 设置时区
+ENV TZ=Asia/Shanghai
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+# 指定运行时的工作目录
+WORKDIR /data/jnpfsoft/flowApi
+
+# 将构建产物jar包拷贝到运行时目录中
+COPY jnpf-workflow-admin/target/*.jar ./jnpf-flow-admin.jar
+
+# 指定容器内运行端口
+EXPOSE 31000
+
+# 指定容器启动时要运行的命令
+ENTRYPOINT ["/bin/sh","-c","java -javaagent:./jnpf-flow-admin.jar -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom --add-opens java.base/java.lang=ALL-UNNAMED -XX:+DisableAttachMechanism -jar jnpf-flow-admin.jar"]

+ 295 - 0
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)` |
+
+## 二 关联项目
+
+| 项目                 | 分支            | 说明         |
+|--------------------|---------------|------------|
+| jnpf-workflow-core | v1.0.0-stable | 流程引擎基础依赖 |
+
+## 三 Maven私服配置
+
+> 建议使用 Apache Maven 3.6.3 及以上版本<br>以解决依赖无法从公共Maven仓库下载的问题<br>通过官方私服下载依赖完成后,由于IDEA的缓存可能会出现部分报红,重启IDEA即可
+
+打开Maven安装目录中的 `conf/settings.xml` 文件,<br>
+在 `<servers></servers>` 中添加如下内容
+
+```xml
+<server>
+  <id>maven-releases</id>
+  <username>您的账号</username>
+  <password>您的密码</password>
+</server>
+```
+
+在 `<mirrors></mirrors>` 中添加
+
+```xml
+<mirror>
+  <id>maven-snapshots</id>
+  <mirrorOf>*</mirrorOf>
+  <name>maven-snapshots</name>
+  <url>https://repository.jnpfsoft.com/repository/maven-public/</url>
+</mirror>
+```
+
+## 四 开发环境
+
+### 4.1 导入数据库脚本
+
+> 以 MySQL数据库 为例<br>字符集:utf8mb4<br/>排序规则:utf8mb4_general_ci
+
+在MySQL创建 `jnpf_flow` 数据库,并将 `jnpf-database/MySQL/jnpf_flow_init.sql` 导入;
+
+### 4.2 导入依赖
+
+详见 `jnpf-workflow-core` 项目中的 `README.md` 文档说明
+
+### 4.3 项目配置
+
+打开编辑 `jnpf-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 调整运行端口
+> 根据实际需求调整
+
+打开编辑 `jnpf-workflow-admin/src/main/resources/application-dev.yml`(第 2 行)
+
+```yaml
+port: 31000 # 默认运行端口
+```
+
+#### 4.3.3 数据库配置示例
+
+打开编辑 `jnpf-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/jnpf_flow?zeroDateTimeBehavior=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=jnpf_flow;trustServerCertificate=true
+    username: dbuser
+    password: dbpasswd
+```
+
+##### 4.3.3.3 Oracle数据库
+> 必需配置模式名称
+
+```yaml
+flowable:
+  database-schema: JNPF_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: JNPF_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/jnpf_flow
+    username: dbuser
+    password: dbpasswd
+```
+
+**若使用其他模式**
+
+```yaml
+flowable:
+  database-schema: jnpf_flow
+spring:
+  datasource:
+    driver-class-name: org.postgresql.Driver
+    type: org.postgresql.ds.PGSimpleDataSource
+    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+    username: dbuser
+    password: dbpasswd
+```
+
+##### 4.3.3.5 达梦dm8数据库
+> 必需配置模式名称,连接后面需要添加参数 ?compatibleMode=oracle
+
+```yaml
+flowable:
+  database-schema: JNPF_FLOW
+spring:
+  datasource:
+    driver-class-name: dm.jdbc.driver.DmDriver
+    type: dm.jdbc.driver.DmdbDataSource
+    url: jdbc:dm://127.0.0.1:5236/JNPF_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/jnpf_flow
+    username: dbuser
+    password: dbpasswd
+```
+
+**若使用其他模式**
+
+```yaml
+flowable:
+  database-schema: jnpf_flow
+spring:
+  datasource:
+    driver-class-name: org.postgresql.Driver
+    type: org.postgresql.ds.PGSimpleDataSource
+    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+    username: dbuser
+    password: dbpasswd
+```
+
+### 4.4 执行调试或运行
+
+#### 4.4.1 `jnpf-workflow-core` 项目未使用加密
+
+- 在IDEA中, 展开右侧 `Maven` 中 `Profiles` 去除勾选 `encrypted` 选项, 再点击 Maven `刷新` 图标刷新Maven
+- 找到 `jnpf-workflow-admin/src/main/java/jnpf/JnpfFlowableApplication.java`,右击运行即可。
+
+若使用JDK9及以上版本,在IDEA中,打开 `Edit Configurations` VM启动参数添加如下参数:
+
+ ```bash
+ --add-opens java.base/java.lang=ALL-UNNAMED
+ ```
+
+#### 4.4.2 `jnpf-workflow-core` 项目使用加密
+
+- 在IDEA中,展开右侧 `Maven` 中 `Profiles` 勾选 `encrypted` 选项, 再点击Maven `刷新` 图标刷新Maven
+- 在IDEA中,双击右侧 `Maven` 中 `jnpf-workflow` > `clean` 将会自动安装加密打包插件, 并创建创建`jnpf-workflow-admin/target/copylib` 复制依赖包用于下一步运行
+
+**参数说明**:
+
+```bash
+# 打开项目中`jnpf-workflow-admin/target/copylib` 目录, 复制Jar包 `jnpf-workflow-common-版本号.jar` 的文件名
+-javaagent:项目存放路径/jnpf-workflow-admin/target/copylib/jnpf-workflow-common-当前版本号.jar(上面复制的文件名)="decryptProjectPathPrefix=jnpf-workflow-common___jnpf-workflow-flowable"
+```
+
+- 在IDEA中,打开 `Edit Configurations` VM启动参数添加如下参数
+
+若使用 JDK8 运行,需要替换下方命令示例中的Jar包路径
+
+ ``` bash
+-XX:+DisableAttachMechanism
+-javaagent:D:/Projects/IdeaProjects/jnpf-workflow-boot/jnpf-workflow-admin/target/copylib/jnpf-workflow-common-1.0.0-RELEASE.jar="decryptProjectPathPrefix=jnpf-workflow-common___jnpf-workflow-flowable"
+ ```
+
+若使用JDK 9及以上版本,需要替换下方命令示例中的Jar包路径
+
+ ``` bash
+--add-opens java.base/java.lang=ALL-UNNAMED
+-XX:+DisableAttachMechanism
+-javaagent:D:/Projects/IdeaProjects/jnpf-workflow-boot/jnpf-workflow-admin/target/copylib/jnpf-workflow-common-1.0.0-RELEASE.jar="decryptProjectPathPrefix=jnpf-workflow-common___jnpf-workflow-flowable"
+ ```
+
+### 4.5 专业版用户
+> 专业版用户无 `jnpf-workflow-core` 项目
+
+若使用 `JDK 8/11` 开发
+
+- 首先全局搜索 `jakarta.` 批量替换为 `javax.`,
+- 在本项目根目录打开 `pom.xml` 文件,注释第 92 行,解除注释第 94 行;
+
+## 五 项目发布
+
+### 5.1 `jnpf-workflow-core` 项目未使用加密
+
+- 在IDEA中, 展开右侧 `Maven` 中 `Profiles` 去除勾选 `encrypted` 选项, 再点击Maven `刷新` 图标刷新Maven
+- 在IDEA中,双击右侧Maven中 `jnpf-workflow` > `Lifecycle` > `clean` 清理项目
+- 在IDEA中,双击右侧Maven中 `jnpf-workflow` > `Lifecycle` > `package` 打包项目
+- 打开 `jnpf-workflow/jnpf-workflow-admin/target`,将 `jnpf-workflow-admin-1.0.0-RELEASE.jar` 上传至服务器
+
+### 5.2 `jnpf-workflow-core` 项目使用加密
+- 在IDEA中, 展开右侧 `Maven` 中 `Profiles` 勾选 `encrypted` 选项, 再点击Maven `刷新` 图标刷新Maven
+- 在IDEA中,双击右侧 `Maven` > `jnpf-workflow` > `clean` 将会自动安装加密打包插件
+- 在IDEA中,双击右侧 `Maven` > `jnpf-workflow` > `Lifecycle` > `package` 打包项目
+- 打开 `jnpf-workflow/jnpf-workflow-admin/target`,将 `jnpf-workflow-admin-1.0.0-RELEASE.jar` 上传至服务器
+- 启动命令
+
+若使用 JDK/JRE 8 运行
+
+```bash
+java -javaagent:./jnpf-workflow-admin-1.0.0-RELEASE.jar -XX:+DisableAttachMechanism -jar jnpf-workflow-admin-1.0.0-RELEASE.jar
+ ```
+
+若使用 JDK/JRE 9及以上版本运行
+
+```bash
+java -javaagent:./jnpf-workflow-admin-1.0.0-RELEASE.jar --add-opens java.base/java.lang=ALL-UNNAMED -XX:+DisableAttachMechanism -jar jnpf-workflow-admin-1.0.0-RELEASE.jar
+ ```

TEMPAT SAMPAH
allatori/class-winter-core-enhance-2.9.4.jar


TEMPAT SAMPAH
allatori/class-winter-maven-plugin-enhance-2.9.4.jar


+ 37 - 0
allatori/class-winter-maven-plugin-pom.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.0</modelVersion>
+
+    <groupId>com.idea-aedi</groupId>
+    <artifactId>class-winter-maven-plugin</artifactId>
+    <version>enhance-2.9.4</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.idea-aedi</groupId>
+            <artifactId>class-winter-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>3.8.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.maven.plugin-tools</groupId>
+            <artifactId>maven-plugin-annotations</artifactId>
+            <version>3.6.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+            <version>2.2.1</version>
+        </dependency>
+    </dependencies>
+</project>

+ 203 - 0
jnpf-workflow-admin/pom.xml

@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<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">
+    <parent>
+        <artifactId>jnpf-workflow</artifactId>
+        <groupId>com.jnpf</groupId>
+        <version>1.0.0-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+
+    <artifactId>jnpf-workflow-admin</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+        </dependency>
+
+        <!-- Oracle-->
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.oracle.database.nls</groupId>
+            <artifactId>orai18n</artifactId>
+        </dependency>
+        <!-- dm -->
+        <dependency>
+            <groupId>com.dameng</groupId>
+            <artifactId>DmJdbcDriver18</artifactId>
+        </dependency>
+        <!-- sqlserver -->
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+        </dependency>
+        <!--PostGre-->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+        <!--GaussDB-->
+        <!--<dependency>
+            <groupId>org.opengauss</groupId>
+            <artifactId>opengauss-jdbc</artifactId>
+        </dependency>-->
+        <!--HighgoDB-->
+        <!--<dependency>
+            <groupId>com.highgo</groupId>
+            <artifactId>hgdb-pgjdbc</artifactId>
+        </dependency>-->
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>flowable</id>
+            <activation>
+                <jdk>[,]</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>com.jnpf</groupId>
+                    <artifactId>jnpf-workflow-flowable${jnpf.workflow.core.jdk.version}</artifactId>
+                    <version>${project.version}</version>
+                </dependency>
+            </dependencies>
+        </profile>
+        <!--<profile>
+            <id>activiti</id>
+            <dependencies>
+                <dependency>
+                    <groupId>com.jnpf</groupId>
+                    <artifactId>jnpf-workflow-activiti</artifactId>
+                    <version>1.0.0-RELEASE</version>
+                </dependency>
+            </dependencies>
+        </profile>-->
+
+        <profile>
+            <!--JAR包加密-->
+            <id>encrypted</id>
+            <build>
+                <plugins>
+                    <!--安装加密打包插件-->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-install-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>install-core</id>
+                                <phase>clean</phase>
+                                <configuration>
+                                    <file>${project.basedir}/../allatori/class-winter-core-${class-winter-maven-plugin.version}.jar</file>
+                                    <repositoryLayout>default</repositoryLayout>
+                                    <groupId>com.idea-aedi</groupId>
+                                    <artifactId>class-winter-core</artifactId>
+                                    <version>${class-winter-maven-plugin.version}</version>
+                                    <packaging>jar</packaging>
+                                    <generatePom>true</generatePom>
+                                </configuration>
+                                <goals>
+                                    <goal>install-file</goal>
+                                </goals>
+                            </execution>
+                            <execution>
+                                <id>install-maven</id>
+                                <phase>clean</phase>
+                                <configuration>
+                                    <file>${project.basedir}/../allatori/class-winter-maven-plugin-${class-winter-maven-plugin.version}.jar</file>
+                                    <repositoryLayout>default</repositoryLayout>
+                                    <groupId>com.idea-aedi</groupId>
+                                    <artifactId>class-winter-maven-plugin</artifactId>
+                                    <version>${class-winter-maven-plugin.version}</version>
+                                    <packaging>jar</packaging>
+                                    <generatePom>false</generatePom>
+                                    <pomFile>${project.basedir}/../allatori/class-winter-maven-plugin-pom.xml</pomFile>
+                                </configuration>
+                                <goals>
+                                    <goal>install-file</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <!--复制驱动包-->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>copy-dependencies</id>
+                                <phase>clean</phase>
+                                <goals>
+                                    <goal>copy-dependencies</goal>
+                                </goals>
+                                <configuration>
+                                    <includeGroupIds>com.jnpf</includeGroupIds>
+                                    <includeArtifactIds>jnpf-workflow-common${jnpf.workflow.core.jdk.version}</includeArtifactIds>
+                                    <outputDirectory>${project.build.directory}/copylib</outputDirectory>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>com.idea-aedi</groupId>
+                        <artifactId>class-winter-maven-plugin</artifactId>
+                        <!-- 相关配置 -->
+                        <configuration>
+                            <!--设置不存在的包表示此项目不加密-->
+                            <includePrefix>jnpf.noexists</includePrefix>
+                            <!--直接覆盖原文件-->
+                            <finalName>${build.finalName}</finalName>
+                            <!--项目中包含的已经加密的包-->
+                            <alreadyProtectedLibs>jnpf-workflow-common${jnpf.workflow.core.jdk.version}-${project.version}.jar,jnpf-workflow-flowable${jnpf.workflow.core.jdk.version}-${project.version}.jar</alreadyProtectedLibs>
+                            <!--检查启动参数-->
+                            <jvmArgCheck>-XX:+DisableAttachMechanism</jvmArgCheck>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>class-winter</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>jnpf.JnpfFlowableApplication</mainClass>
+                    <layout>ZIP</layout>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 18 - 0
jnpf-workflow-admin/src/main/java/jnpf/JnpfFlowableApplication.java

@@ -0,0 +1,18 @@
+package jnpf;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 启动类
+ *
+ * @author JNPF Flowable@YinMai Info. Co., Ltd
+ * @version 1.0.0
+ * @since 2024/4/2 17:55
+ **/
+@SpringBootApplication
+public class JnpfFlowableApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(JnpfFlowableApplication.class, args);
+    }
+}

+ 89 - 0
jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/controller/DefinitionController.java

@@ -0,0 +1,89 @@
+package jnpf.workflow.admin.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import jnpf.workflow.admin.result.Result;
+import jnpf.workflow.common.exception.ResultCode;
+import jnpf.workflow.common.model.fo.DefinitionDeleteFo;
+import jnpf.workflow.common.model.fo.DefinitionDeployFo;
+import jnpf.workflow.common.model.vo.DefinitionVo;
+import jnpf.workflow.common.model.vo.DeploymentVo;
+import jnpf.workflow.common.service.IDefinitionService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 流程定义控制层
+ *
+ * @author JNPF Flowable@YinMai Info. Co., Ltd
+ * @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<DeploymentVo>}
+     * @since 2024/4/7 13:39
+     **/
+    @Operation(summary = "deploy", description = "部署流程定义")
+    @PostMapping("/deploy")
+    public Result<DeploymentVo> 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<List<DefinitionVo>>}
+     * @since 2024/4/7 13:39
+     **/
+    @Operation(summary = "list", description = "列表查询流程定义")
+    @GetMapping("/list")
+    public Result<List<DefinitionVo>> list() {
+        return Result.success(definitionService.listDefinition());
+    }
+
+    /**
+     * 删除流程定义
+     *
+     * @param fo {@link DefinitionDeleteFo}
+     * @return {@link Result<Boolean>}
+     * @since 2024/4/7 13:39
+     **/
+    @Operation(summary = "delete", description = "删除流程定义")
+    @DeleteMapping
+    public Result<Boolean> 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));
+    }
+}

+ 77 - 0
jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/controller/InstanceController.java

@@ -0,0 +1,77 @@
+package jnpf.workflow.admin.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import jnpf.workflow.admin.result.Result;
+import jnpf.workflow.common.exception.ResultCode;
+import jnpf.workflow.common.model.fo.InstanceDeleteFo;
+import jnpf.workflow.common.model.fo.InstanceStartFo;
+import jnpf.workflow.common.model.vo.HistoricInstanceVo;
+import jnpf.workflow.common.model.vo.InstanceVo;
+import jnpf.workflow.common.service.IInstanceService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 流程实例控制层
+ *
+ * @author JNPF Flowable@YinMai Info. Co., Ltd
+ * @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<InstanceVo>}
+     * @since 2024/4/7 17:35
+     **/
+    @Operation(summary = "start", description = "启动流程实例")
+    @PostMapping("/start")
+    public Result<InstanceVo> 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<HistoricInstanceVo>}
+     * @since 2024/4/7 18:17
+     **/
+    @Operation(summary = "get", description = "获取流程实例")
+    @GetMapping("/{instanceId}")
+    public Result<HistoricInstanceVo> getInstance(@PathVariable("instanceId") String instanceId) {
+        return Result.success(instanceService.getHistoricProcessInstance(instanceId));
+    }
+
+    /**
+     * 删除流程实例
+     *
+     * @param fo {@link InstanceDeleteFo}
+     * @return {@link Result<Boolean>}
+     * @since 2024/4/7 17:35
+     **/
+    @Operation(summary = "delete", description = "删除流程实例")
+    @DeleteMapping
+    public Result<Boolean> delete(InstanceDeleteFo fo) {
+        if (instanceService.deleteInstance(fo)) {
+            return Result.success(ResultCode.DELETE_SUCCESS);
+        }
+        return Result.failed(ResultCode.DELETE_FAILURE);
+    }
+}

+ 298 - 0
jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/controller/TaskController.java

@@ -0,0 +1,298 @@
+package jnpf.workflow.admin.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import jnpf.workflow.admin.result.Result;
+import jnpf.workflow.common.exception.ResultCode;
+import jnpf.workflow.common.model.fo.*;
+import jnpf.workflow.common.model.vo.HistoricNodeVo;
+import jnpf.workflow.common.model.vo.NodeElementVo;
+import jnpf.workflow.common.model.vo.TaskVo;
+import jnpf.workflow.common.service.ITaskService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 流程任务控制层
+ *
+ * @author JNPF Flowable@YinMai Info. Co., Ltd
+ * @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<List<TaskVo>>}
+     * @since 2024/4/8 15:10
+     **/
+    @Operation(summary = "list", description = "根据流程实例ID获取任务")
+    @GetMapping("/list/{instanceId}")
+    public Result<List<TaskVo>> list(@PathVariable("instanceId") String instanceId) {
+        return Result.success(taskService.getTask(instanceId));
+    }
+
+    /**
+     * 完成任务
+     *
+     * @param fo {@link TaskCompleteFo}
+     * @return {@link Result<Boolean>}
+     * @since 2024/4/8 15:10
+     **/
+    @Operation(summary = "complete", description = "完成任务")
+    @PostMapping("/complete")
+    public Result<Boolean> 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<Boolean>}
+     * @since 2024/4/10 10:30
+     **/
+    @Operation(summary = "moveSingleToMulti", description = "单节点跳转多节点")
+    @PostMapping("/move/single/to/multi")
+    public Result<Boolean> 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<Boolean>}
+     * @since 2024/4/10 10:30
+     **/
+    @Operation(summary = "moveMultiToSingle", description = "多节点跳转单节点")
+    @PostMapping("/move/multi/to/single")
+    public Result<Boolean> 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<Boolean>}
+     * @since 2024/4/10 11:50
+     **/
+    @Operation(summary = "jump", description = "节点跳转")
+    @PostMapping("/jump")
+    public Result<Boolean> 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<List<String>>}
+     * @since 2024/4/8 16:03
+     **/
+    @Operation(summary = "fallbacks", description = "获取可回退的节点ID")
+    @GetMapping("/fallbacks/{taskId}")
+    public Result<List<String>> fallbacks(@PathVariable("taskId") String taskId) {
+        return Result.success(taskService.getFallbacks(taskId));
+    }
+
+    /**
+     * 退回
+     *
+     * @param fo {@link TaskBackFo}
+     * @return {@link Result<List<String>>}
+     * @since 2024/4/9 9:27
+     **/
+    @Operation(summary = "back", description = "退回")
+    @PostMapping("/back")
+    public Result<List<String>> back(@RequestBody @Valid TaskBackFo fo) {
+        return Result.success(taskService.back(fo));
+    }
+
+    /**
+     * 获取上一级任务节点ID集合
+     *
+     * @param fo {@link TaskPrevFo}
+     * @return {@link Result<List<String>>}
+     * @since 2024/4/9 9:27
+     **/
+    @Operation(summary = "get", description = "获取上一级任务节点ID集合")
+    @GetMapping("/prev")
+    public Result<List<String>> getPrev(TaskPrevFo fo) {
+        return Result.success(taskService.getPrevUserTask(fo));
+    }
+
+    /**
+     * 获取下一级任务节点集合
+     *
+     * @param fo {@link TaskNextFo}
+     * @return {@link Result<List< NodeElementVo >>}
+     * @since 2024/4/9 9:27
+     **/
+    @Operation(summary = "get", description = "获取下一级任务节点集合")
+    @GetMapping("/next")
+    public Result<List<NodeElementVo>> getNext(TaskNextFo fo) {
+        return Result.success(taskService.getNextUserTask(fo));
+    }
+
+    /**
+     * 撤回
+     *
+     * @param taskId {@link String}
+     * @return {@link Result<Boolean>}
+     * @since 2024/4/9 11:08
+     **/
+    @Operation(summary = "retract", description = "撤回")
+    @PostMapping("/retract/{taskId}")
+    public Result<Boolean> 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<List<String>>}
+     * @since 2024/4/9 11:08
+     **/
+    @Operation(summary = "outgoingFlows", description = "获取出线Key集合(若出线的出口为网关,则一并获取网关的出线)")
+    @GetMapping("/outgoing/flows")
+    public Result<List<String>> getOutgoingFlows(TaskOutgoingFo fo) {
+        return Result.success(taskService.getOutgoingFlows(fo));
+    }
+
+    /**
+     * 获取完成的节点Key
+     *
+     * @param instanceId {@link String}
+     * @return {@link Result<List<String>>}
+     * @since 2024/4/9 13:54
+     **/
+    @Operation(summary = "get", description = "获取完成的节点Key")
+    @GetMapping("/finished/keys/{instanceId}")
+    public Result<List<String>> getKeysOfFinished(@PathVariable("instanceId") String instanceId) {
+        return Result.success(taskService.getKeysOfFinished(instanceId));
+    }
+
+    /**
+     * 获取进线的Key
+     *
+     * @param taskId {@link String}
+     * @return {@link Result<List<String>>}
+     * @since 2024/4/9 13:58
+     **/
+    @Operation(summary = "get", description = "获取进线的Key")
+    @GetMapping("/incoming/flows/{taskId}")
+    public Result<List<String>> getIncomingFlows(@PathVariable("taskId") String taskId) {
+        return Result.success(taskService.getIncomingFlows(taskId));
+    }
+
+    /**
+     * 获取线之后的任务节点
+     *
+     * @param fo {@link FlowTargetTaskFo}
+     * @return {@link Result<String>}
+     * @since 2024/4/17 17:48
+     **/
+    @Operation(summary = "get", description = "获取线之后的任务节点")
+    @GetMapping("/flow/target")
+    public Result<List<String>> getTaskKeyAfterFlow(FlowTargetTaskFo fo) {
+        return Result.success(taskService.getTaskKeyAfterFlow(fo));
+    }
+
+    /**
+     * 获取未经过的节点
+     *
+     * @param instanceId {@link String}
+     * @return {@link Result<List<String>>}
+     * @since 2024/4/29 10:08
+     **/
+    @Operation(summary = "get", description = "获取未经过的节点")
+    @GetMapping("/tobe/pass/{instanceId}")
+    public Result<List<String>> getToBePass(@PathVariable("instanceId") String instanceId) {
+        return Result.success(taskService.getToBePass(instanceId));
+    }
+
+    /**
+     * 获取节点的后续节点
+     *
+     * @param fo 参数
+     */
+    @Operation(summary = "get", description = "获取节点的后续节点")
+    @PostMapping("/after")
+    public Result<List<String>> getAfter(@RequestBody TaskAfterFo fo) {
+        return Result.success(taskService.getAfter(fo));
+    }
+
+    /**
+     * 异常补偿
+     *
+     * @param fo 参数
+     */
+    @Operation(summary = "compensate", description = "异常补偿")
+    @PostMapping("/compensate")
+    public Result<List<TaskVo>> compensate(@RequestBody CompensateFo fo) {
+        return Result.success(taskService.compensate(fo));
+    }
+
+    /**
+     * 获取历史节点
+     *
+     * @param instanceId 实例主键
+     */
+    @Operation(summary = "historic", description = "获取历史节点")
+    @GetMapping("/historic/{instanceId}")
+    public Result<List<HistoricNodeVo>> getHistoric(@PathVariable("instanceId") String instanceId) {
+        return Result.success(taskService.getHistoric(instanceId));
+    }
+
+    /**
+     * 获取历史结束节点
+     *
+     * @param instanceId 实例主键
+     */
+    @Operation(summary = "historicEnd", description = "获取历史结束节点")
+    @GetMapping("/historic/end/{instanceId}")
+    public Result<List<String>> 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));
+    }
+}

+ 61 - 0
jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/handle/GlobalExceptionHandler.java

@@ -0,0 +1,61 @@
+package jnpf.workflow.admin.handle;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jnpf.workflow.admin.result.Result;
+import jnpf.workflow.common.exception.BizException;
+import jnpf.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 JNPF Flowable@YinMai Info. Co., Ltd
+ * @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<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
+        List<String> 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());
+    }
+}

+ 96 - 0
jnpf-workflow-admin/src/main/java/jnpf/workflow/admin/result/Result.java

@@ -0,0 +1,96 @@
+package jnpf.workflow.admin.result;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import jnpf.workflow.common.exception.ResultCode;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 统一返回结果类
+ *
+ * @author JNPF Flowable@YinMai Info. Co., Ltd
+ * @version 1.0.0
+ * @since 2024/4/3 15:00
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Result<T> implements Serializable {
+    private Boolean success;
+    private String code;
+    private String msg;
+    private T data;
+
+    public static <T> Result<T> result(Boolean success, String code, String msg, T data) {
+        Result<T> result = new Result<>();
+        result.setSuccess(success);
+        result.setCode(code);
+        result.setMsg(msg);
+        result.setData(data);
+        return result;
+    }
+
+    public static <T> Result<T> result(Boolean success, ResultCode resultCode, T data) {
+        return result(success, resultCode.getCode(), resultCode.getMsg(), data);
+    }
+
+    public static <T> boolean isSuccess(Result<T> result) {
+        return result != null && ResultCode.SUCCESS.getCode().equals(result.getCode());
+    }
+
+    public static <T> Result<T> success() {
+        return result(true, ResultCode.SUCCESS, null);
+    }
+
+    public static <T> Result<T> success(T data) {
+        return result(true, ResultCode.SUCCESS, data);
+    }
+
+    public static <T> Result<T> success(ResultCode resultCode, T data) {
+        return result(true, resultCode, data);
+    }
+
+    public static <T> Result<T> success(ResultCode resultCode) {
+        return result(true, resultCode, null);
+    }
+
+    public static <T> Result<T> success(String code, String msg, T data) {
+        return result(true, code, msg, data);
+    }
+
+    public static <T> Result<T> success(String msg) {
+        return result(true, ResultCode.SUCCESS.getCode(), msg, null);
+    }
+
+    public static <T> Result<T> failed() {
+        return result(false, ResultCode.FAILURE.getCode(), ResultCode.FAILURE.getMsg(), null);
+    }
+
+    public static <T> Result<T> failed(T data) {
+        return result(false, ResultCode.FAILURE.getCode(), ResultCode.FAILURE.getMsg(), data);
+    }
+
+    public static <T> Result<T> failed(String msg) {
+        return result(false, ResultCode.FAILURE.getCode(), msg, null);
+    }
+
+    public static <T> Result<T> failed(String msg, T data) {
+        return result(false, ResultCode.FAILURE.getCode(), msg, data);
+    }
+
+    public static <T> Result<T> failed(ResultCode resultCode) {
+        return result(false, resultCode.getCode(), resultCode.getMsg(), null);
+    }
+
+    public static <T> Result<T> failed(ResultCode resultCode, T data) {
+        return result(false, resultCode.getCode(), resultCode.getMsg(), data);
+    }
+
+    public static <T> Result<T> failed(ResultCode resultCode, String msg) {
+        return result(false, resultCode.getCode(), msg, null);
+    }
+
+    public static <T> Result<T> failed(ResultCode resultCode, String msg, T data) {
+        return result(false, resultCode.getCode(), msg, data);
+    }
+}

+ 101 - 0
jnpf-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: JNPF_FLOW
+
+# ===================== 1 若使用MySQL数据库-Start =====================
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.mysql.cj.jdbc.MysqlDataSource
+    url: jdbc:mysql://usky-cloud-mysql:3306/jnpf_flow?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true
+    username: root
+    password: yt123456
+# ===================== 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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 101 - 0
jnpf-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: JNPF_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/jnpf_flow?zeroDateTimeBehavior=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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 101 - 0
jnpf-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: JNPF_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/jnpf_flow?zeroDateTimeBehavior=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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 101 - 0
jnpf-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: JNPF_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/jnpf_flow?zeroDateTimeBehavior=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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 24 - 0
jnpf-workflow-admin/src/main/resources/application.yml

@@ -0,0 +1,24 @@
+spring:
+  application:
+    name: jnpf-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: jnpf
+#    password: 123456
+#  enable: true

+ 339 - 0
jnpf-workflow-admin/src/main/resources/logback-spring.xml

@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <!--日志格式应用spring boot默认的格式,也可以自己更改-->
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <property name="FILE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n" />
+    <springProperty scope="context" name="SERVICE_NAME" source="spring.application.name" defaultValue="jnpf"/>
+
+    <!--定义日志存放的位置,默认存放在项目启动的相对路径的目录-->
+    <springProperty scope="context" name="LOG_PATH" source="log.path" defaultValue="log/${SERVICE_NAME}"/>
+    <!-- 全局日志等级 -->
+    <springProperty scope="context" name="LOG_LEVEL_ROOT" source="log.level.root" defaultValue="INFO"/>
+    <!-- 服务自定义等级 如需自定义服务日志等级 修改下方的【自定义服务名】与nacos上的log.level.自定义服务名=等级 -->
+    <springProperty scope="context" name="LOG_LEVEL" source="log.level.jnpf-boot" defaultValue="${LOG_LEVEL_ROOT}"/>
+
+    <!-- 日志记录器,日期滚动记录,level为 ERROR 日志 -->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_error.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/error/%d{yyyy-MM-dd,aux}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录error级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,level为 INFO 日志 -->
+    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_info.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/info/%d{yyyy-MM-dd,aux}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,level为 WARN 日志 -->
+    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_warn.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/warn/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 日志记录器,日期滚动记录,level为 DEBUG 日志 -->
+    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_debug.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/debug/%d{yyyy-MM-dd,aux}/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,所有日志 -->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_total.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/total/%d{yyyy-MM-dd,aux}/log-total-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,level 根据配置动态输出日志 -->
+    <appender name="FILE_RELEASE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_release.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/release/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>${LOG_LEVEL}</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!-- 异步输出 DEBUG -->
+    <appender name="ASYNC_FILE_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_DEBUG"/>
+    </appender>
+    <!-- 异步输出 INFO -->
+    <appender name="ASYNC_FILE_INFO" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_INFO"/>
+    </appender>
+    <!-- 异步输出 WARN -->
+    <appender name="ASYNC_FILE_WARN" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_WARN"/>
+    </appender>
+    <!-- 异步输出 ERROR -->
+    <appender name="ASYNC_FILE_ERROR" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_ERROR"/>
+    </appender>
+    <!-- 异步输出 ALL -->
+    <appender name="ASYNC_FILE_ALL" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_ALL"/>
+    </appender>
+
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+
+    <!-- 异步输出 控制台 -->
+    <appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="STDOUT"/>
+    </appender>
+
+
+    <!--<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        &lt;!&ndash; 必填:目标:LogStash的 IP:Port &ndash;&gt;
+        <destination>192.168.0.50:50000</destination>
+        &lt;!&ndash; 可选:保持程序存活时间 &ndash;&gt;
+        <keepAliveDuration>5 minutes</keepAliveDuration>
+        &lt;!&ndash; 可选:重连延迟时长 &ndash;&gt;
+        <reconnectionDelay>10 second</reconnectionDelay>
+        &lt;!&ndash; 可选:等待策略 &ndash;&gt;
+        <waitStrategyType>sleeping</waitStrategyType>
+        &lt;!&ndash;  ============ encoder必须配置,有多种可选 ============= &ndash;&gt;
+        &lt;!&ndash; 编码器二:LoggingEventCompositeJsonEncoder &ndash;&gt;
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+            <providers>
+                &lt;!&ndash; 时间戳:时区 &ndash;&gt;
+                <timestamp>
+                    <timeZone>UTC</timeZone>
+                </timestamp>
+                &lt;!&ndash; 模式 &ndash;&gt;
+                <pattern>
+                    <pattern>
+                        {
+                        "severity": "%level",
+                        "service": "${SERVICE_NAME:-}",
+                        "trace": "%X{X-B3-TraceId:-}",
+                        "span": "%X{X-B3-SpanId:-}",
+                        "exportable": "%X{X-Span-Export:-}",
+                        "pid": "${PID:-}",
+                        "thread": "%thread",
+                        "class": "%logger{40}",
+                        "msg": "%message"
+                        &lt;!&ndash;"idx_pre": "elk-original-third-access",&ndash;&gt;
+                        &lt;!&ndash;"json": "#asJson{%message}"  这个asJson可以把对应的字符串作为json对象取出来,这样es可以对json里面的字段索引了&ndash;&gt;
+                        }
+                    </pattern>
+                </pattern>
+            </providers>
+        </encoder>
+    </appender>-->
+
+
+    <root level="${LOG_LEVEL}">
+        <appender-ref ref="ASYNC_STDOUT"/>
+        <appender-ref ref="ASYNC_FILE_ERROR"/>
+        <appender-ref ref="ASYNC_FILE_INFO"/>
+        <appender-ref ref="ASYNC_FILE_WARN"/>
+        <appender-ref ref="ASYNC_FILE_DEBUG"/>
+        <appender-ref ref="ASYNC_FILE_ALL"/>
+        <!--<appender-ref ref="LOGSTASH"/>-->
+    </root>
+
+
+</configuration>

+ 101 - 0
jnpf-workflow-admin/target/classes/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: JNPF_FLOW
+
+# ===================== 1 若使用MySQL数据库-Start =====================
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.mysql.cj.jdbc.MysqlDataSource
+    url: jdbc:mysql://usky-cloud-mysql:3306/jnpf_flow?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true
+    username: root
+    password: yt123456
+# ===================== 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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 101 - 0
jnpf-workflow-admin/target/classes/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: JNPF_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/jnpf_flow?zeroDateTimeBehavior=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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 101 - 0
jnpf-workflow-admin/target/classes/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: JNPF_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/jnpf_flow?zeroDateTimeBehavior=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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 101 - 0
jnpf-workflow-admin/target/classes/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: JNPF_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/jnpf_flow?zeroDateTimeBehavior=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=jnpf_flow;trustServerCertificate=true
+#    username: sa
+#    password: 123456
+# ===================== 2 若使用SQLServer数据库-End =======================
+# ===================== 3 若使用Oracle数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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: JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.1 若使用默认public模式-End ==========
+# ========== 4.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 4.2 若使用其他模式-End ==========
+# ===================== 4 若使用PostgreSQL数据库-End =======================
+# ===================== 5 若使用达梦dm8数据库-Start =====================
+#flowable:
+#  database-schema: JNPF_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/JNPF_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/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.1 若使用默认public模式-End ==========
+# ========== 6.2 若使用其他模式-Start ==========
+#flowable:
+#  database-schema: jnpf_flow
+#spring:
+#  datasource:
+#    driver-class-name: org.postgresql.Driver
+#    type: org.postgresql.ds.PGSimpleDataSource
+#    url: jdbc:postgresql://127.0.0.1:5432/jnpf_flow
+#    username: dbuser
+#    password: dbpasswd
+# ========== 6.2 若使用其他模式-End ==========
+# ===================== 6 若使用人大金仓KingbaseES数据库-End =======================

+ 24 - 0
jnpf-workflow-admin/target/classes/application.yml

@@ -0,0 +1,24 @@
+spring:
+  application:
+    name: jnpf-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: jnpf
+#    password: 123456
+#  enable: true

TEMPAT SAMPAH
jnpf-workflow-admin/target/classes/jnpf/JnpfFlowableApplication.class


TEMPAT SAMPAH
jnpf-workflow-admin/target/classes/jnpf/workflow/admin/controller/DefinitionController.class


TEMPAT SAMPAH
jnpf-workflow-admin/target/classes/jnpf/workflow/admin/controller/InstanceController.class


TEMPAT SAMPAH
jnpf-workflow-admin/target/classes/jnpf/workflow/admin/controller/TaskController.class


TEMPAT SAMPAH
jnpf-workflow-admin/target/classes/jnpf/workflow/admin/handle/GlobalExceptionHandler.class


TEMPAT SAMPAH
jnpf-workflow-admin/target/classes/jnpf/workflow/admin/result/Result.class


+ 339 - 0
jnpf-workflow-admin/target/classes/logback-spring.xml

@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <!--日志格式应用spring boot默认的格式,也可以自己更改-->
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <property name="FILE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n" />
+    <springProperty scope="context" name="SERVICE_NAME" source="spring.application.name" defaultValue="jnpf"/>
+
+    <!--定义日志存放的位置,默认存放在项目启动的相对路径的目录-->
+    <springProperty scope="context" name="LOG_PATH" source="log.path" defaultValue="log/${SERVICE_NAME}"/>
+    <!-- 全局日志等级 -->
+    <springProperty scope="context" name="LOG_LEVEL_ROOT" source="log.level.root" defaultValue="INFO"/>
+    <!-- 服务自定义等级 如需自定义服务日志等级 修改下方的【自定义服务名】与nacos上的log.level.自定义服务名=等级 -->
+    <springProperty scope="context" name="LOG_LEVEL" source="log.level.jnpf-boot" defaultValue="${LOG_LEVEL_ROOT}"/>
+
+    <!-- 日志记录器,日期滚动记录,level为 ERROR 日志 -->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_error.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/error/%d{yyyy-MM-dd,aux}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录error级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,level为 INFO 日志 -->
+    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_info.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/info/%d{yyyy-MM-dd,aux}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,level为 WARN 日志 -->
+    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_warn.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/warn/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 日志记录器,日期滚动记录,level为 DEBUG 日志 -->
+    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_debug.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/debug/%d{yyyy-MM-dd,aux}/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,所有日志 -->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_total.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/total/%d{yyyy-MM-dd,aux}/log-total-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录,level 根据配置动态输出日志 -->
+    <appender name="FILE_RELEASE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/log_release.log</file>
+
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!-- 归档的日志文件的路径,%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/release/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--日志最大的历史7天-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+            命名日志文件,例如log-error-2013-12-21.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>${LOG_LEVEL}</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!-- 异步输出 DEBUG -->
+    <appender name="ASYNC_FILE_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_DEBUG"/>
+    </appender>
+    <!-- 异步输出 INFO -->
+    <appender name="ASYNC_FILE_INFO" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_INFO"/>
+    </appender>
+    <!-- 异步输出 WARN -->
+    <appender name="ASYNC_FILE_WARN" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_WARN"/>
+    </appender>
+    <!-- 异步输出 ERROR -->
+    <appender name="ASYNC_FILE_ERROR" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_ERROR"/>
+    </appender>
+    <!-- 异步输出 ALL -->
+    <appender name="ASYNC_FILE_ALL" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_ALL"/>
+    </appender>
+
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+
+    <!-- 异步输出 控制台 -->
+    <appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="STDOUT"/>
+    </appender>
+
+
+    <!--<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        &lt;!&ndash; 必填:目标:LogStash的 IP:Port &ndash;&gt;
+        <destination>192.168.0.50:50000</destination>
+        &lt;!&ndash; 可选:保持程序存活时间 &ndash;&gt;
+        <keepAliveDuration>5 minutes</keepAliveDuration>
+        &lt;!&ndash; 可选:重连延迟时长 &ndash;&gt;
+        <reconnectionDelay>10 second</reconnectionDelay>
+        &lt;!&ndash; 可选:等待策略 &ndash;&gt;
+        <waitStrategyType>sleeping</waitStrategyType>
+        &lt;!&ndash;  ============ encoder必须配置,有多种可选 ============= &ndash;&gt;
+        &lt;!&ndash; 编码器二:LoggingEventCompositeJsonEncoder &ndash;&gt;
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+            <providers>
+                &lt;!&ndash; 时间戳:时区 &ndash;&gt;
+                <timestamp>
+                    <timeZone>UTC</timeZone>
+                </timestamp>
+                &lt;!&ndash; 模式 &ndash;&gt;
+                <pattern>
+                    <pattern>
+                        {
+                        "severity": "%level",
+                        "service": "${SERVICE_NAME:-}",
+                        "trace": "%X{X-B3-TraceId:-}",
+                        "span": "%X{X-B3-SpanId:-}",
+                        "exportable": "%X{X-Span-Export:-}",
+                        "pid": "${PID:-}",
+                        "thread": "%thread",
+                        "class": "%logger{40}",
+                        "msg": "%message"
+                        &lt;!&ndash;"idx_pre": "elk-original-third-access",&ndash;&gt;
+                        &lt;!&ndash;"json": "#asJson{%message}"  这个asJson可以把对应的字符串作为json对象取出来,这样es可以对json里面的字段索引了&ndash;&gt;
+                        }
+                    </pattern>
+                </pattern>
+            </providers>
+        </encoder>
+    </appender>-->
+
+
+    <root level="${LOG_LEVEL}">
+        <appender-ref ref="ASYNC_STDOUT"/>
+        <appender-ref ref="ASYNC_FILE_ERROR"/>
+        <appender-ref ref="ASYNC_FILE_INFO"/>
+        <appender-ref ref="ASYNC_FILE_WARN"/>
+        <appender-ref ref="ASYNC_FILE_DEBUG"/>
+        <appender-ref ref="ASYNC_FILE_ALL"/>
+        <!--<appender-ref ref="LOGSTASH"/>-->
+    </root>
+
+
+</configuration>

TEMPAT SAMPAH
jnpf-workflow-admin/target/jnpf-workflow-admin-1.0.0-RELEASE.jar


TEMPAT SAMPAH
jnpf-workflow-admin/target/jnpf-workflow-admin-1.0.0-RELEASE.jar.original


+ 3 - 0
jnpf-workflow-admin/target/maven-archiver/pom.properties

@@ -0,0 +1,3 @@
+artifactId=jnpf-workflow-admin
+groupId=com.jnpf
+version=1.0.0-RELEASE

+ 6 - 0
jnpf-workflow-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst

@@ -0,0 +1,6 @@
+jnpf\workflow\admin\controller\InstanceController.class
+jnpf\JnpfFlowableApplication.class
+jnpf\workflow\admin\controller\TaskController.class
+jnpf\workflow\admin\result\Result.class
+jnpf\workflow\admin\controller\DefinitionController.class
+jnpf\workflow\admin\handle\GlobalExceptionHandler.class

+ 6 - 0
jnpf-workflow-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst

@@ -0,0 +1,6 @@
+C:\Users\zhaojinyu\Desktop\USKY\jnpf6.0\jnpf-workflow-v6x\jnpf-workflow-admin\src\main\java\jnpf\JnpfFlowableApplication.java
+C:\Users\zhaojinyu\Desktop\USKY\jnpf6.0\jnpf-workflow-v6x\jnpf-workflow-admin\src\main\java\jnpf\workflow\admin\controller\DefinitionController.java
+C:\Users\zhaojinyu\Desktop\USKY\jnpf6.0\jnpf-workflow-v6x\jnpf-workflow-admin\src\main\java\jnpf\workflow\admin\controller\InstanceController.java
+C:\Users\zhaojinyu\Desktop\USKY\jnpf6.0\jnpf-workflow-v6x\jnpf-workflow-admin\src\main\java\jnpf\workflow\admin\controller\TaskController.java
+C:\Users\zhaojinyu\Desktop\USKY\jnpf6.0\jnpf-workflow-v6x\jnpf-workflow-admin\src\main\java\jnpf\workflow\admin\handle\GlobalExceptionHandler.java
+C:\Users\zhaojinyu\Desktop\USKY\jnpf6.0\jnpf-workflow-v6x\jnpf-workflow-admin\src\main\java\jnpf\workflow\admin\result\Result.java

+ 118 - 0
pom.xml

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.0</modelVersion>
+
+    <artifactId>jnpf-workflow</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0.0-RELEASE</version>
+    <modules>
+        <module>jnpf-workflow-admin</module>
+    </modules>
+
+    <parent>
+        <groupId>com.jnpf</groupId>
+        <artifactId>jnpf-workflow-core</artifactId>
+        <version>1.0.0-RELEASE</version>
+    </parent>
+
+    <properties>
+        <snakeyaml.version>2.2</snakeyaml.version>
+        <mysql.version>8.3.0</mysql.version>
+        <oracle.version>21.9.0.0</oracle.version>
+        <dm18.version>8.1.3.140</dm18.version>
+        <sqlserver.version>12.6.1.jre8</sqlserver.version>
+        <postgre.version>42.6.2</postgre.version>
+        <gaussdb.version>6.0.0</gaussdb.version>
+        <highgo.version>42.5.0</highgo.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.mysql</groupId>
+                <artifactId>mysql-connector-j</artifactId>
+                <version>${mysql.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.yaml</groupId>
+                <artifactId>snakeyaml</artifactId>
+                <version>${snakeyaml.version}</version>
+            </dependency>
+            <!-- Oracle-->
+            <dependency>
+                <groupId>com.oracle.database.jdbc</groupId>
+                <artifactId>ojdbc8</artifactId>
+                <version>${oracle.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.oracle.database.nls</groupId>
+                <artifactId>orai18n</artifactId>
+                <version>${oracle.version}</version>
+            </dependency>
+            <!-- dm -->
+            <dependency>
+                <groupId>com.dameng</groupId>
+                <artifactId>DmJdbcDriver18</artifactId>
+                <version>${dm18.version}</version>
+            </dependency>
+            <!--sqlserver-->
+            <dependency>
+                <groupId>com.microsoft.sqlserver</groupId>
+                <artifactId>mssql-jdbc</artifactId>
+                <version>${sqlserver.version}</version>
+            </dependency>
+            <!--PostGre-->
+            <dependency>
+                <groupId>org.postgresql</groupId>
+                <artifactId>postgresql</artifactId>
+                <version>${postgre.version}</version>
+            </dependency>
+            <!--GaussDB-->
+            <!--<dependency>
+                <groupId>org.opengauss</groupId>
+                <artifactId>opengauss-jdbc</artifactId>
+                <version>${gaussdb.version}</version>
+            </dependency>-->
+            <!--HighgoDB-->
+            <!--<dependency>
+                <groupId>com.highgo</groupId>
+                <artifactId>hgdb-pgjdbc</artifactId>
+                <version>${highgo.version}</version>
+            </dependency>-->
+        </dependencies>
+    </dependencyManagement>
+
+    <profiles>
+        <profile>
+            <id>boot3</id>
+            <activation>
+                <jdk>[17,)</jdk>
+            </activation>
+            <properties>
+                <jnpf.workflow.core.jdk.version></jnpf.workflow.core.jdk.version>
+            </properties>
+            <dependencyManagement>
+                <dependencies>
+                </dependencies>
+            </dependencyManagement>
+        </profile>
+        <profile>
+            <id>boot2</id>
+            <activation>
+                <jdk>(,17)</jdk>
+            </activation>
+            <properties>
+                <jnpf.workflow.core.jdk.version></jnpf.workflow.core.jdk.version>
+                <!--若使用JDK8,且无jnpf-workflow-core项目源码, 注释上方版本定义, 删除下方注释, 切换JDK8版本依赖-->
+<!--                <jnpf.workflow.core.jdk.version>-jdk8</jnpf.workflow.core.jdk.version>-->
+            </properties>
+            <dependencyManagement>
+                <dependencies>
+                </dependencies>
+            </dependencyManagement>
+        </profile>
+    </profiles>
+
+</project>