From 25295fee342b20599952d16e88e0244be729b5c2 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: Sat, 27 May 2023 17:21:04 +0800
Subject: [PATCH 001/159] =?UTF-8?q?=E6=B7=BB=E5=8A=A0workflow=E6=A8=A1?=
=?UTF-8?q?=E5=9D=97=EF=BC=8C=E6=B7=BB=E5=8A=A0flowable=E4=BE=9D=E8=B5=96?=
=?UTF-8?q?=EF=BC=8Cyml=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 30 ++++++++
ruoyi-admin/pom.xml | 6 ++
.../src/main/resources/application-dev.yml | 18 +++++
.../src/main/resources/application-prod.yml | 18 +++++
ruoyi-modules/pom.xml | 1 +
ruoyi-modules/ruoyi-workflow/pom.xml | 73 +++++++++++++++++++
.../workflow/controller/package-info.java | 1 +
.../dromara/workflow/domain/package-info.java | 1 +
.../dromara/workflow/mapper/package-info.java | 1 +
.../workflow/service/impl/package-info.java | 1 +
.../workflow/service/package-info.java | 1 +
.../src/main/resources/mapper/package-info.md | 3 +
.../resources/mapper/workflow/package-info.md | 3 +
13 files changed, 157 insertions(+)
create mode 100644 ruoyi-modules/ruoyi-workflow/pom.xml
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/package-info.md
diff --git a/pom.xml b/pom.xml
index 8f9d08bc8..fb909a959 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,6 +57,9 @@
3.11.0
3.0.0
1.3.0
+
+
+ 7.0.0.M1
@@ -311,6 +314,26 @@
${ip2region.version}
+
+
+ org.flowable
+ flowable-spring-boot-starter
+ ${flowable.version}
+
+
+ org.mybatis
+ mybatis
+
+
+
+
+
+
+ org.flowable
+ flowable-image-generator
+ ${flowable.version}
+
+
org.dromara
ruoyi-system
@@ -335,6 +358,13 @@
${revision}
+
+
+ org.dromara
+ ruoyi-workflow
+ ${revision}
+
+
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index af5f23967..70241f0b5 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -65,6 +65,12 @@
ruoyi-demo
+
+
+ org.dromara
+ ruoyi-workflow
+
+
de.codecentric
spring-boot-admin-starter-client
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 92a3640e9..fef1fa054 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -98,6 +98,24 @@ spring:
# 多久检查一次连接的活性
keepaliveTime: 30000
+--- #flowable配置
+flowable:
+ async-executor-activate: false #关闭定时任务JOB
+ # 将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。
+ database-schema-update: true
+ activity-font-name: 宋体
+ label-font-name: 宋体
+ annotation-font-name: 宋体
+ # 关闭各个模块生成表,目前只使用工作流基础表
+ idm:
+ enabled: false
+ cmmn:
+ enabled: false
+ dmn:
+ enabled: false
+ app:
+ enabled: false
+
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data:
redis:
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index e760823ad..fb76f2d82 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -101,6 +101,24 @@ spring:
# 多久检查一次连接的活性
keepaliveTime: 30000
+--- #flowable配置
+flowable:
+ async-executor-activate: false #关闭定时任务JOB
+ # 将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。
+ database-schema-update: false
+ activity-font-name: 宋体
+ label-font-name: 宋体
+ annotation-font-name: 宋体
+ # 关闭各个模块生成表,目前只使用工作流基础表
+ idm:
+ enabled: false
+ cmmn:
+ enabled: false
+ dmn:
+ enabled: false
+ app:
+ enabled: false
+
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data:
redis:
diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml
index 4044916fb..daff497a0 100644
--- a/ruoyi-modules/pom.xml
+++ b/ruoyi-modules/pom.xml
@@ -14,6 +14,7 @@
ruoyi-generator
ruoyi-job
ruoyi-system
+ ruoyi-workflow
ruoyi-modules
diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml
new file mode 100644
index 000000000..f65d7fc6c
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/pom.xml
@@ -0,0 +1,73 @@
+
+
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+ jar
+ ruoyi-workflow
+
+
+ 工作流模块
+
+
+
+ 2.11.0
+ 1.10
+
+
+
+
+
+
+ org.flowable
+ flowable-spring-boot-starter
+
+
+ org.mybatis
+ mybatis
+
+
+
+
+
+
+ org.flowable
+ flowable-image-generator
+
+
+
+
+ org.dromara
+ ruoyi-system
+
+
+
+
+ org.apache.xmlgraphics
+ batik-all
+ ${batik.version}
+
+
+ xalan
+ xalan
+
+
+
+
+
+
+ xerces
+ xercesImpl
+ ${xerces.version}
+
+
+
+
+
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java
new file mode 100644
index 000000000..cf6a7552e
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java
@@ -0,0 +1 @@
+package org.dromara.workflow.controller;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java
new file mode 100644
index 000000000..9cc89e510
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java
@@ -0,0 +1 @@
+package org.dromara.workflow.domain;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/package-info.java
new file mode 100644
index 000000000..580707211
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/package-info.java
@@ -0,0 +1 @@
+package org.dromara.workflow.mapper;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java
new file mode 100644
index 000000000..429bd2904
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java
@@ -0,0 +1 @@
+package org.dromara.workflow.service.impl;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java
new file mode 100644
index 000000000..6e68be40f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java
@@ -0,0 +1 @@
+package org.dromara.workflow.service;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md
new file mode 100644
index 000000000..c938b1e50
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/package-info.md
@@ -0,0 +1,3 @@
+java包使用 `.` 分割 resource 目录使用 `/` 分割
+
+此文件目的 防止文件夹粘连找不到 `xml` 文件
\ No newline at end of file
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/package-info.md b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/package-info.md
new file mode 100644
index 000000000..c938b1e50
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/package-info.md
@@ -0,0 +1,3 @@
+java包使用 `.` 分割 resource 目录使用 `/` 分割
+
+此文件目的 防止文件夹粘连找不到 `xml` 文件
\ No newline at end of file
From 5125dc5af2b570dec5b6c624da25d778f85bbaf8 Mon Sep 17 00:00:00 2001
From: zhongmx
Date: Fri, 2 Jun 2023 17:50:20 +0800
Subject: [PATCH 002/159] =?UTF-8?q?=E3=80=90ADD=E3=80=91=E9=9B=86=E6=88=90?=
=?UTF-8?q?=E5=8E=9F=E7=94=9FFlowable-ui?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-extend/pom.xml | 1 +
ruoyi-extend/ruoyi-flow-ui/.gitignore | 33 ++++
ruoyi-extend/ruoyi-flow-ui/Dockerfile | 16 ++
ruoyi-extend/ruoyi-flow-ui/HELP.md | 10 ++
ruoyi-extend/ruoyi-flow-ui/pom.xml | 137 +++++++++++++++
.../dromara/flow/ui/FlowUiApplication.java | 17 ++
.../flow/ui/config/FlowableIdmConfig.java | 83 +++++++++
.../ui/config/idm/CustomGroupDataManager.java | 165 ++++++++++++++++++
.../ui/config/idm/CustomPasswordEncoder.java | 50 ++++++
.../ui/config/idm/CustomUserDataManager.java | 154 ++++++++++++++++
.../flow/ui/domain/bo/GroupCodeBo.java | 120 +++++++++++++
.../flow/ui/domain/bo/GroupNameBo.java | 121 +++++++++++++
.../flow/ui/domain/bo/GroupQueryBo.java | 38 ++++
.../flow/ui/domain/bo/UserQueryBo.java | 55 ++++++
.../flow/ui/mapper/CustomMybatisMapper.java | 36 ++++
.../src/main/resources/application-dev.yml | 38 ++++
.../src/main/resources/application-prod.yml | 38 ++++
.../src/main/resources/application.yml | 38 ++++
.../src/main/resources/logback-plus.xml | 34 ++++
.../mappers/CustomMybatisXmlMapper.xml | 71 ++++++++
.../flow/ui/RuoyiFlowUiApplicationTests.java | 13 ++
21 files changed, 1268 insertions(+)
create mode 100644 ruoyi-extend/ruoyi-flow-ui/.gitignore
create mode 100644 ruoyi-extend/ruoyi-flow-ui/Dockerfile
create mode 100644 ruoyi-extend/ruoyi-flow-ui/HELP.md
create mode 100644 ruoyi-extend/ruoyi-flow-ui/pom.xml
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/FlowUiApplication.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/FlowableIdmConfig.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomGroupDataManager.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomPasswordEncoder.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomUserDataManager.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupCodeBo.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupNameBo.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupQueryBo.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/UserQueryBo.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/mapper/CustomMybatisMapper.java
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-dev.yml
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-prod.yml
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/application.yml
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/logback-plus.xml
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/main/resources/mappers/CustomMybatisXmlMapper.xml
create mode 100644 ruoyi-extend/ruoyi-flow-ui/src/test/java/org/dromara/flow/ui/RuoyiFlowUiApplicationTests.java
diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml
index ee176e998..d6966e120 100644
--- a/ruoyi-extend/pom.xml
+++ b/ruoyi-extend/pom.xml
@@ -14,6 +14,7 @@
ruoyi-monitor-admin
ruoyi-xxl-job-admin
+ ruoyi-flow-ui
diff --git a/ruoyi-extend/ruoyi-flow-ui/.gitignore b/ruoyi-extend/ruoyi-flow-ui/.gitignore
new file mode 100644
index 000000000..549e00a2a
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/ruoyi-extend/ruoyi-flow-ui/Dockerfile b/ruoyi-extend/ruoyi-flow-ui/Dockerfile
new file mode 100644
index 000000000..448cda7e6
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/Dockerfile
@@ -0,0 +1,16 @@
+FROM anapsix/alpine-java:8_server-jre_unlimited
+
+MAINTAINER zmx
+
+RUN mkdir -p /ruoyi/flow/ui/logs
+
+WORKDIR /ruoyi/flow/ui
+
+ENV TZ=PRC
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+EXPOSE 9205
+
+ADD ./target/ruoyi-flow-ui.jar ./app.jar
+
+ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
diff --git a/ruoyi-extend/ruoyi-flow-ui/HELP.md b/ruoyi-extend/ruoyi-flow-ui/HELP.md
new file mode 100644
index 000000000..5265b3d40
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/HELP.md
@@ -0,0 +1,10 @@
+# Getting Started
+
+### Reference Documentation
+
+For further reference, please consider the following sections:
+
+* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
+* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/reference/html/)
+* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.0/maven-plugin/reference/html/#build-image)
+
diff --git a/ruoyi-extend/ruoyi-flow-ui/pom.xml b/ruoyi-extend/ruoyi-flow-ui/pom.xml
new file mode 100644
index 000000000..1592a2bc6
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/pom.xml
@@ -0,0 +1,137 @@
+
+
+ 4.0.0
+
+ ruoyi-extend
+ org.dromara
+ ${revision}
+
+ ruoyi-flow-ui
+ ruoyi-flow-ui
+ ruoyi-flow-ui
+
+ 2.7.12
+ 2.7.10
+ 2.2.2
+ 6.8.0
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jdbc
+
+
+
+
+ com.mysql
+ mysql-connector-j
+
+
+
+ org.flowable
+ flowable-spring-boot-starter
+ ${flowable.version}
+
+
+
+ org.flowable
+ flowable-spring-boot-starter-ui-idm
+ ${flowable.version}
+
+
+
+ org.flowable
+ flowable-spring-boot-starter-ui-modeler
+ ${flowable.version}
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+
+ commons-collections
+ commons-collections
+ 3.2.2
+
+
+
+
+ org.flowable
+ flowable-spring-boot-starter-ui-task
+ ${flowable.version}
+
+
+
+ org.flowable
+ flowable-spring-boot-starter-ui-admin
+ ${flowable.version}
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-client
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/FlowUiApplication.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/FlowUiApplication.java
new file mode 100644
index 000000000..043ca78fc
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/FlowUiApplication.java
@@ -0,0 +1,17 @@
+package com.dromara.flow.ui;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * flowable-ui启动类
+ * Author: 土豆仙
+ */
+@SpringBootApplication
+public class FlowUiApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(com.dromara.flow.ui.FlowUiApplication.class, args);
+ }
+
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/FlowableIdmConfig.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/FlowableIdmConfig.java
new file mode 100644
index 000000000..a05178b7d
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/FlowableIdmConfig.java
@@ -0,0 +1,83 @@
+package com.dromara.flow.ui.config;
+
+
+import com.dromara.flow.ui.config.idm.CustomGroupDataManager;
+import com.dromara.flow.ui.config.idm.CustomPasswordEncoder;
+import com.dromara.flow.ui.config.idm.CustomUserDataManager;
+import org.flowable.idm.engine.impl.persistence.entity.GroupEntityManager;
+import org.flowable.idm.engine.impl.persistence.entity.GroupEntityManagerImpl;
+import org.flowable.idm.engine.impl.persistence.entity.UserEntityManager;
+import org.flowable.idm.engine.impl.persistence.entity.UserEntityManagerImpl;
+import org.flowable.idm.spring.SpringIdmEngineConfiguration;
+import org.flowable.spring.boot.EngineConfigurationConfigurer;
+import org.flowable.spring.boot.idm.FlowableIdmProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+/**
+ * @Author: 土豆仙
+ * @Date: 2021/9/28 19:30
+ * @Description: 一旦使用视图效率不高,在这注入覆写类
+ */
+@Configuration
+public class FlowableIdmConfig implements EngineConfigurationConfigurer {
+
+ @Autowired
+ private CustomUserDataManager customUserDataManager;
+
+ @Autowired
+ private CustomGroupDataManager customGroupDataManager;
+
+ @Override
+ public void configure(SpringIdmEngineConfiguration configuration) {
+
+ //密码加密器和自建用户体系保持一致
+ CustomPasswordEncoder bc = new CustomPasswordEncoder();
+ configuration.setPasswordEncoder(bc);
+
+ //用户
+ configuration.setUserDataManager(customUserDataManager);
+ UserEntityManager userEntityManager = configuration.getUserEntityManager();
+ if (userEntityManager != null) {
+ UserEntityManagerImpl userEntityManagerImpl = new UserEntityManagerImpl(configuration, customUserDataManager);
+ configuration.setUserEntityManager(userEntityManagerImpl);
+ }
+
+ //用户-组关系
+ /*configuration.setMembershipDataManager(customMembershipDataManager);
+ configuration.setMembershipEntityManager(customMembershipEntityManager);*/
+
+
+ //组
+ configuration.setGroupDataManager(customGroupDataManager);
+ GroupEntityManager groupEntityManager = configuration.getGroupEntityManager();
+ if (groupEntityManager == null) {
+ GroupEntityManagerImpl groupEntityManagerImpl = new GroupEntityManagerImpl(configuration, customGroupDataManager);
+ configuration.setGroupEntityManager(groupEntityManagerImpl);
+ }
+
+
+ }
+
+
+ @Bean
+ public PasswordEncoder passwordEncoder(FlowableIdmProperties idmProperties) {
+
+ PasswordEncoder encoder = new CustomPasswordEncoder();
+
+ return encoder;
+ }
+
+ /* @Bean
+ public CustomGroupEntityManager customGroupEntityManager(IdmEngineConfiguration configuration) {
+ return new CustomGroupEntityManager(configuration, configuration.getGroupDataManager());
+ }*/
+
+
+ /* @Bean
+ public CustomUserEntityManager customUserEntityManager(IdmEngineConfiguration configuration) {
+ return new CustomUserEntityManager(configuration, new CustomUserDataManager(configuration));
+ }*/
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomGroupDataManager.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomGroupDataManager.java
new file mode 100644
index 000000000..bff43b28d
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomGroupDataManager.java
@@ -0,0 +1,165 @@
+package com.dromara.flow.ui.config.idm;
+
+
+import com.dromara.flow.ui.domain.bo.GroupCodeBo;
+import com.dromara.flow.ui.domain.bo.GroupNameBo;
+import com.dromara.flow.ui.domain.bo.GroupQueryBo;
+import com.dromara.flow.ui.mapper.CustomMybatisMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.ManagementService;
+import org.flowable.engine.impl.cmd.AbstractCustomSqlExecution;
+import org.flowable.idm.api.Group;
+import org.flowable.idm.engine.IdmEngineConfiguration;
+import org.flowable.idm.engine.impl.GroupQueryImpl;
+import org.flowable.idm.engine.impl.persistence.entity.GroupEntity;
+import org.flowable.idm.engine.impl.persistence.entity.GroupEntityImpl;
+import org.flowable.idm.engine.impl.persistence.entity.data.AbstractIdmDataManager;
+import org.flowable.idm.engine.impl.persistence.entity.data.GroupDataManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * @Author: 土豆仙
+ * @Date: 2021/11/12 10:05
+ * @Description: 覆写组查询
+ */
+@Slf4j
+@Component
+public class CustomGroupDataManager extends AbstractIdmDataManager implements GroupDataManager {
+
+
+ public CustomGroupDataManager(IdmEngineConfiguration idmEngineConfiguration) {
+ super(idmEngineConfiguration);
+ }
+
+ @Autowired
+ @Lazy
+ private ManagementService managementService;
+
+ @Override
+ public Class extends GroupEntity> getManagedEntityClass() {
+ return GroupEntityImpl.class;
+ }
+
+ @Override
+ public GroupEntity create() {
+ return new GroupEntityImpl();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List findGroupByQueryCriteria(GroupQueryImpl query) {
+ if (log.isDebugEnabled()) {
+ log.debug("已重写自定义组查询:findGroupByQueryCriteria");
+ }
+ boolean isReturnList = true;
+ GroupQueryBo groupQueryBo = transformQueryParamToGroupDTO(query);
+ if (StringUtils.isNotBlank(query.getId())) {
+ groupQueryBo.setReturnList(false);
+ isReturnList = false;
+ }
+
+ List groups = managementService.executeCustomSql(new AbstractCustomSqlExecution>(CustomMybatisMapper.class) {
+ @Override
+ public List execute(CustomMybatisMapper customMybatisMapper) {
+ return customMybatisMapper.findGroupList(groupQueryBo);
+ }
+ });
+
+ return groups;
+ //return getDbSqlSession().selectList("selectGroupByQueryCriteria", query, getManagedEntityClass());
+ }
+
+ private GroupQueryBo transformQueryParamToGroupDTO(GroupQueryImpl query) {
+ GroupQueryBo groupQueryBo = new GroupQueryBo();
+ //约定 groupId 解析为 部门code.角色code
+ List groupIds = new ArrayList<>();
+ if (StringUtils.isNotEmpty(query.getId())) {
+ groupIds.add(query.getId());
+ }
+ if (CollectionUtils.isNotEmpty(query.getIds())) {
+ groupIds.addAll(query.getIds());
+ }
+ List groupBoList = groupIds.stream()
+ .map(GroupCodeBo::new)
+ .collect(Collectors.toList());
+
+ groupQueryBo.setGroupCodeBos(groupBoList);
+
+ //约定 groupName 解析为 区域name/部门name/角色name
+ groupQueryBo.setGroupNameBo(new GroupNameBo(query.getName()));
+
+
+ //userId
+ List userNames = new ArrayList<>();
+ if (StringUtils.isNotEmpty(query.getUserId())) {
+ userNames.add(query.getUserId());
+ }
+
+ if (CollectionUtils.isNotEmpty(query.getIds())) {
+ userNames.addAll(query.getIds());
+ }
+
+ groupQueryBo.setUserNames(userNames);
+
+ return groupQueryBo;
+ }
+
+ @Override
+ public long findGroupCountByQueryCriteria(GroupQueryImpl query) {
+ if (log.isDebugEnabled()) {
+ log.debug("已重写自定义组查询:findGroupCountByQueryCriteria");
+ }
+ //return (Long) getDbSqlSession().selectOne("selectGroupCountByQueryCriteria", query);
+ List groupByQueryCriteria = findGroupByQueryCriteria(query);
+ return groupByQueryCriteria.size();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List findGroupsByUser(String userId) {
+ if (log.isDebugEnabled()) {
+ log.debug("已重写自定义组查询:findGroupsByUser");
+ }
+ GroupQueryImpl groupQuery = new GroupQueryImpl();
+ groupQuery.groupMember(userId);
+ List groupByQueryCriteria = findGroupByQueryCriteria(groupQuery);
+ return groupByQueryCriteria;
+ //return getDbSqlSession().selectList("selectGroupsByUserId", userId);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public List findGroupsByPrivilegeId(String privilegeId) {
+ if (log.isDebugEnabled()) {
+ log.debug("未重写自定义组查询:findGroupsByPrivilegeId");
+ }
+ return getDbSqlSession().selectList("selectGroupsWithPrivilegeId", privilegeId);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List findGroupsByNativeQuery(Map parameterMap) {
+ if (log.isDebugEnabled()) {
+ log.debug("未重写自定义组查询:findGroupsByNativeQuery");
+ }
+ return getDbSqlSession().selectListWithRawParameter("selectGroupByNativeQuery", parameterMap);
+ }
+
+ @Override
+ public long findGroupCountByNativeQuery(Map parameterMap) {
+ if (log.isDebugEnabled()) {
+ log.debug("未重写自定义组查询:findGroupCountByNativeQuery");
+ }
+ return (Long) getDbSqlSession().selectOne("selectGroupCountByNativeQuery", parameterMap);
+ }
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomPasswordEncoder.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomPasswordEncoder.java
new file mode 100644
index 000000000..477ee8058
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomPasswordEncoder.java
@@ -0,0 +1,50 @@
+package com.dromara.flow.ui.config.idm;
+
+import org.flowable.idm.api.PasswordEncoder;
+import org.flowable.idm.api.PasswordSalt;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+/**
+* @Author: 土豆仙
+* @Date: 2021/11/12 10:04
+* @Description: 密码加密器
+*/
+public class CustomPasswordEncoder implements PasswordEncoder,org.springframework.security.crypto.password.PasswordEncoder {
+ @Override
+ public String encode(CharSequence rawPassword, PasswordSalt passwordSalt) {
+ BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+ return passwordEncoder.encode(rawPassword);
+ }
+
+ /**
+ * 判断密码是否相同
+ *
+ * @param rawPassword 真实密码
+ * @param encodedPassword 加密后字符
+ * @return 结果
+ */
+ @Override
+ public boolean isMatches(CharSequence rawPassword, String encodedPassword, PasswordSalt salt) {
+ /* BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();*/
+ return true;
+ }
+
+
+ @Override
+ public String encode(CharSequence rawPassword) {
+ BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+ return passwordEncoder.encode(rawPassword);
+ }
+
+ @Override
+ public boolean matches(CharSequence rawPassword, String encodedPassword) {
+ /*BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();*/
+ return true;
+ }
+
+ @Override
+ public boolean upgradeEncoding(String encodedPassword) {
+ BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+ return passwordEncoder.upgradeEncoding(encodedPassword);
+ }
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomUserDataManager.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomUserDataManager.java
new file mode 100644
index 000000000..3d9d3126e
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/config/idm/CustomUserDataManager.java
@@ -0,0 +1,154 @@
+package com.dromara.flow.ui.config.idm;
+
+
+import com.dromara.flow.ui.domain.bo.GroupCodeBo;
+import com.dromara.flow.ui.domain.bo.UserQueryBo;
+import com.dromara.flow.ui.mapper.CustomMybatisMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.ManagementService;
+import org.flowable.engine.impl.cmd.AbstractCustomSqlExecution;
+import org.flowable.idm.api.User;
+import org.flowable.idm.engine.IdmEngineConfiguration;
+import org.flowable.idm.engine.impl.UserQueryImpl;
+import org.flowable.idm.engine.impl.persistence.entity.UserEntity;
+import org.flowable.idm.engine.impl.persistence.entity.UserEntityImpl;
+import org.flowable.idm.engine.impl.persistence.entity.data.AbstractIdmDataManager;
+import org.flowable.idm.engine.impl.persistence.entity.data.UserDataManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * @Author: 土豆仙
+ * @Date: 2021/11/12 10:07
+ * @Description: 覆写用户信息查询
+ */
+@Slf4j
+@Component
+public class CustomUserDataManager extends AbstractIdmDataManager implements UserDataManager {
+ public CustomUserDataManager(IdmEngineConfiguration idmEngineConfiguration) {
+ super(idmEngineConfiguration);
+ }
+
+ @Autowired
+ @Lazy
+ private ManagementService managementService;
+
+ @Override
+ public Class extends UserEntity> getManagedEntityClass() {
+ return UserEntityImpl.class;
+ }
+
+ @Override
+ public UserEntity create() {
+ return new UserEntityImpl();
+ }
+
+ /**
+ *
+ * @param query 流程引擎查询参数
+ * @return 流程引擎展示视图
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public List findUserByQueryCriteria(UserQueryImpl query) {
+ if (log.isDebugEnabled()) {
+ log.debug("已重写自定义组查询:findUserByQueryCriteria");
+ }
+ UserQueryBo userQueryBo = transformQueryImplToUserQueryBo(query);
+
+ List users = managementService.executeCustomSql(new AbstractCustomSqlExecution>(CustomMybatisMapper.class) {
+ @Override
+ public List execute(CustomMybatisMapper customMybatisMapper) {
+ return customMybatisMapper.selectUserList(userQueryBo);
+ }
+ });
+
+ return users;
+ }
+
+ private UserQueryBo transformQueryImplToUserQueryBo(UserQueryImpl query) {
+ UserQueryBo userQueryBo = new UserQueryBo();
+
+ //设置userName
+ if (StringUtils.isNotBlank(query.getId())) {
+ userQueryBo.setUserName(query.getId());
+ } else {
+ userQueryBo.setUserName(query.getIdIgnoreCase());
+ }
+
+ userQueryBo.setUserNames(query.getIds());
+
+ //设置nickName
+ if (StringUtils.isNotBlank(query.getFirstName()) || StringUtils.isNotBlank(query.getLastName())) {
+ String nickName = StringUtils.join(query.getFirstName(), query.getLastName());
+ userQueryBo.setNickName(nickName);
+ } else {
+ userQueryBo.setNickName(query.getDisplayName());
+ }
+
+ //设置email
+ userQueryBo.setEmail(query.getEmail());
+ userQueryBo.setEmailLike(query.getEmailLike());
+
+
+ //处理组映射
+ List groupBoList = new ArrayList<>();
+ if (StringUtils.isNotEmpty(query.getGroupId())) {
+ groupBoList.add(new GroupCodeBo(query.getGroupId()));
+ }
+ if (!CollectionUtils.isEmpty(query.getGroupIds())) {
+
+ List collect = query.getGroupIds().stream()
+ .map(GroupCodeBo::new)
+ .collect(Collectors.toList());
+
+ groupBoList.addAll(collect);
+ }
+ userQueryBo.setGroupBoList(groupBoList);
+ return userQueryBo;
+ }
+
+ @Override
+ public long findUserCountByQueryCriteria(UserQueryImpl query) {
+ if (log.isDebugEnabled()) {
+ log.debug("已重写自定义组查询:findUserCountByQueryCriteria");
+ }
+ // return (Long) getDbSqlSession().selectOne("selectUserCountByQueryCriteria", query);
+ return findUserByQueryCriteria(query).size();
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public List findUsersByPrivilegeId(String privilegeId) {
+ if (log.isDebugEnabled()) {
+ log.debug("未重写自定义组查询:findUsersByPrivilegeId");
+ }
+ return getDbSqlSession().selectList("selectUsersWithPrivilegeId", privilegeId);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List findUsersByNativeQuery(Map parameterMap) {
+ if (log.isDebugEnabled()) {
+ log.debug("未重写自定义组查询:findUsersByNativeQuery");
+ }
+ return getDbSqlSession().selectListWithRawParameter("selectUserByNativeQuery", parameterMap);
+ }
+
+ @Override
+ public long findUserCountByNativeQuery(Map parameterMap) {
+ if (log.isDebugEnabled()) {
+ log.debug("未重写自定义组查询:findUserCountByNativeQuery");
+ }
+ return (Long) getDbSqlSession().selectOne("selectUserCountByNativeQuery", parameterMap);
+ }
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupCodeBo.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupCodeBo.java
new file mode 100644
index 000000000..96fbaa3ca
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupCodeBo.java
@@ -0,0 +1,120 @@
+package com.dromara.flow.ui.domain.bo;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import liquibase.repackaged.org.apache.commons.text.StringSubstitutor;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 业务组与流程组转换
+ * Author: 土豆仙
+ */
+@NoArgsConstructor
+public class GroupCodeBo {
+
+ /**
+ * 默认占位符号 代表所有
+ */
+ private static final String STAR = "*";
+
+ /**
+ * 分割符号
+ */
+ private static final String DOT = ".";
+
+ /**
+ * 占位字符串定义 - 后期放入配置中,用于扩展
+ */
+ private static final String PLACEHOLDER_STRING = "${deptCode}.${roleCode}";
+
+ /**
+ * 取 定义中 ${}内的内容
+ */
+ private static final String pattern = "\\$\\{(.*?)}";
+
+ /**
+ * deptCode:* 、roleCode:* ...
+ */
+ private Map codeMap = new HashMap<>();
+
+ /**
+ * deptCode:* 、roleCode:* ...
+ */
+ private static final Map codeMapInit = new HashMap<>();
+
+ /**
+ * deptCode、roleCode ...
+ */
+ private static final List codeList = new ArrayList<>();
+
+ //初始化
+ static {
+ Pattern p = Pattern.compile(pattern);
+ Matcher m = p.matcher(PLACEHOLDER_STRING);
+ while (m.find()) {
+ // ${}和 里面的内容
+ String code = m.group(1);
+ codeList.add(code);
+ codeMapInit.put(code, STAR);
+ }
+ }
+
+
+ public GroupCodeBo(String gourpCode) {
+ transferToBusiness(gourpCode);
+ }
+
+
+ /**
+ * @param gourpCode 流程引擎编码转换(约定)
+ */
+ public void transferToBusiness(String gourpCode) {
+
+ List split = StrUtil.split(gourpCode, DOT);
+ if (CollectionUtil.isNotEmpty(split) && split.size() == codeList.size()) {
+
+ //遍历
+ for (int i = 0; i < codeList.size(); i++) {
+ codeMap.put(codeList.get(i), split.get(i));
+ }
+ }
+ }
+
+
+ /**
+ * @return 组编码
+ */
+ public String getGourpCode() {
+
+ if (MapUtil.isEmpty(codeMap)) {
+ codeMap.putAll(codeMapInit);
+ }
+ StringSubstitutor strSubstitutor = new StringSubstitutor(codeMap);
+
+
+ return strSubstitutor.replace(PLACEHOLDER_STRING);
+ }
+
+
+ /**
+ * @return 编码-值 键值对
+ */
+ public Map getCodeMap() {
+
+ if (MapUtil.isEmpty(codeMap)) {
+ codeMap.putAll(codeMapInit);
+ }
+
+ return codeMap;
+
+ }
+
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupNameBo.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupNameBo.java
new file mode 100644
index 000000000..42b6c6bf0
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupNameBo.java
@@ -0,0 +1,121 @@
+package com.dromara.flow.ui.domain.bo;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import liquibase.repackaged.org.apache.commons.text.StringSubstitutor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 业务组名与流程组转换
+ * Author: 土豆仙
+ */
+@Data
+@NoArgsConstructor
+public class GroupNameBo {
+
+ /**
+ * 默认占位符号 代表所有
+ */
+ private static final String STAR = "*";
+
+ /**
+ * 分割符号
+ */
+ private static final String DOT = ".";
+
+ /**
+ * 占位字符串定义 - 后期放入配置中,用于扩展
+ */
+ private static final String PLACEHOLDER_STRING = "${deptName}.${roleName}";
+
+ /**
+ * 取 定义中 ${}内的内容
+ */
+ private static final String pattern = "\\$\\{(.*?)}";
+
+ /**
+ * deptName:* 、roleName:* ...
+ */
+ private static final Map nameMapInit = new HashMap<>();
+
+ /**
+ * deptName:* 、roleName:* ...
+ */
+ private Map nameMap = new HashMap<>();
+
+ /**
+ * deptName、roleName ...
+ */
+ private static final List nameList = new ArrayList<>();
+
+ //初始化
+ static {
+ Pattern p = Pattern.compile(pattern);
+ Matcher m = p.matcher(PLACEHOLDER_STRING);
+ while (m.find()) {
+ // ${}和 里面的内容
+ String Name = m.group(1);
+ nameList.add(Name);
+ nameMapInit.put(Name, STAR);
+ }
+ }
+
+
+ public GroupNameBo(String gourpName) {
+ transferToBusiness(gourpName);
+ }
+
+
+ /**
+ * @param gourpName 流程引擎编码转换(约定)
+ */
+ public void transferToBusiness(String gourpName) {
+
+ List split = StrUtil.split(gourpName, DOT);
+ if (CollectionUtil.isNotEmpty(split) && split.size() <= nameList.size()) {
+
+ //遍历
+ for (int i = 0; i < split.size(); i++) {
+ nameMap.put(nameList.get(i), split.get(i));
+ }
+ }
+ }
+
+ /**
+ * @return 组名
+ */
+ public String getGourpname() {
+
+ if (MapUtil.isEmpty(nameMap)) {
+ nameMap.putAll(nameMapInit);
+ }
+ StringSubstitutor strSubstitutor = new StringSubstitutor(nameMap);
+
+
+ return strSubstitutor.replace(PLACEHOLDER_STRING);
+ }
+
+
+ /**
+ * @return 名称编码-值 键值对
+ */
+ public Map getnameMap() {
+
+ if (MapUtil.isEmpty(nameMap)) {
+ nameMap.putAll(nameMapInit);
+ }
+
+ return nameMap;
+
+ }
+
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupQueryBo.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupQueryBo.java
new file mode 100644
index 000000000..fb4d0ded0
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/GroupQueryBo.java
@@ -0,0 +1,38 @@
+package com.dromara.flow.ui.domain.bo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 自定义group查询条件
+ * Author: 土豆仙
+ */
+@Data
+public class GroupQueryBo {
+
+
+ //约定 解析为 区域code/部门code/角色code
+ /* protected String id;
+ protected List ids;*/
+
+ private boolean isReturnList = true;
+
+ // private DdrCodeDTO ddrCodeDTO;
+
+ private List groupCodeBos;
+
+ //约定 解析为 区域name/部门name/角色name
+ /* protected String name;
+ protected String nameLike;
+ protected String nameLikeIgnoreCase;*/
+
+ private GroupNameBo groupNameBo;
+
+ /*
+ protected String type;
+ protected String userId;
+ protected List userIds;*/
+
+ protected List userNames;
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/UserQueryBo.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/UserQueryBo.java
new file mode 100644
index 000000000..946263b83
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/domain/bo/UserQueryBo.java
@@ -0,0 +1,55 @@
+package com.dromara.flow.ui.domain.bo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 自定义user查询条件
+ * Author: 土豆仙
+ */
+@Data
+public class UserQueryBo {
+
+ //用户ID -对应账号
+ /* protected String id;
+ protected List ids;
+ protected String idIgnoreCase;*/
+
+ private String userName;
+
+ private List userNames;
+
+ //用户名称
+ /*protected String firstName;
+ protected String firstNameLike;
+ protected String firstNameLikeIgnoreCase;
+ protected String lastName;
+ protected String lastNameLike;
+ protected String lastNameLikeIgnoreCase;
+ protected String fullNameLike;
+ protected String fullNameLikeIgnoreCase;
+ protected String displayName;
+ protected String displayNameLike;
+ protected String displayNameLikeIgnoreCase;*/
+
+ private String nickName;
+
+ //邮箱
+ /*protected String email;
+ protected String emailLike;*/
+
+ private String email;
+
+ private String emailLike;
+
+ //用户组
+ /*protected String groupId;
+ protected List groupIds;*/
+
+ //约定:用户组转换成 区化、部门、角色 最后使用稳定的code值
+ private List groupBoList;
+
+ //租户
+ protected String tenantId;
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/mapper/CustomMybatisMapper.java b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/mapper/CustomMybatisMapper.java
new file mode 100644
index 000000000..ea98b67e9
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/java/com/dromara/flow/ui/mapper/CustomMybatisMapper.java
@@ -0,0 +1,36 @@
+/* Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dromara.flow.ui.mapper;
+
+import com.dromara.flow.ui.domain.bo.GroupQueryBo;
+import com.dromara.flow.ui.domain.bo.UserQueryBo;
+import org.flowable.idm.api.Group;
+import org.flowable.idm.api.User;
+
+import java.util.List;
+
+/**
+ * 自定义mapperSQl
+ * Author: 土豆仙
+ */
+public interface CustomMybatisMapper {
+
+
+ List selectUserList(UserQueryBo userQueryBo);
+
+ /**
+ * @param groupQueryBo
+ * @return (id name)
+ */
+ List findGroupList(GroupQueryBo groupQueryBo);
+}
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-dev.yml
new file mode 100644
index 000000000..431e8a8cc
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-dev.yml
@@ -0,0 +1,38 @@
+--- # 监控配置
+spring.boot.admin.client:
+ # 增加客户端开关
+ enabled: true
+ # 设置 Spring Boot Admin Server 地址
+ url: http://localhost:9090/admin
+ instance:
+ service-host-type: IP
+ username: ruoyi
+ password: 123456
+# Spring配置
+spring:
+ application:
+ name: flow-ui
+ main:
+ allow-bean-definition-overriding: true
+ liquibase:
+ enabled: false
+# jackson:
+# date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+ # 资源信息
+ messages:
+ # 国际化资源文件路径
+ basename: i18n/messages
+ datasource:
+ url: jdbc:mysql://localhost:3306/ry-vue?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true
+ username: root
+ password: 123456
+flowable:
+ databaseSchemaUpdate: true
+# databaseSchema:
+
+# 日志配置
+logging:
+ level:
+ org.flowable.engine.impl.persistence.entity.*: DEBUG
+ org.flowable.task.service.impl.persistence.entity.*: DEBUG # 日志配置
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-prod.yml
new file mode 100644
index 000000000..431e8a8cc
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application-prod.yml
@@ -0,0 +1,38 @@
+--- # 监控配置
+spring.boot.admin.client:
+ # 增加客户端开关
+ enabled: true
+ # 设置 Spring Boot Admin Server 地址
+ url: http://localhost:9090/admin
+ instance:
+ service-host-type: IP
+ username: ruoyi
+ password: 123456
+# Spring配置
+spring:
+ application:
+ name: flow-ui
+ main:
+ allow-bean-definition-overriding: true
+ liquibase:
+ enabled: false
+# jackson:
+# date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+ # 资源信息
+ messages:
+ # 国际化资源文件路径
+ basename: i18n/messages
+ datasource:
+ url: jdbc:mysql://localhost:3306/ry-vue?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true
+ username: root
+ password: 123456
+flowable:
+ databaseSchemaUpdate: true
+# databaseSchema:
+
+# 日志配置
+logging:
+ level:
+ org.flowable.engine.impl.persistence.entity.*: DEBUG
+ org.flowable.task.service.impl.persistence.entity.*: DEBUG # 日志配置
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application.yml b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application.yml
new file mode 100644
index 000000000..f86deaa7f
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/application.yml
@@ -0,0 +1,38 @@
+# 开发环境配置
+server:
+ # 服务器的HTTP端口,默认为8080
+ port: 9205
+ servlet:
+ # 应用的访问路径
+ context-path: /flowable-ui
+ tomcat:
+ # tomcat的URI编码
+ uri-encoding: UTF-8
+ # tomcat最大线程数,默认为200
+ #max-threads: 800
+ # Tomcat启动初始化的线程数,默认值25
+ #min-spare-threads: 30
+flowable:
+ customMybatisXMLMappers:
+ - mappers/CustomMybatisXmlMapper.xml
+ customMybatisMappers:
+ - com.dromara.flow.ui.mapper.CustomMybatisMapper
+--- # Actuator 监控端点的配置项
+management:
+ health:
+ ldap:
+ enabled: false
+ mail:
+ enabled: false
+ endpoints:
+ web:
+ exposure:
+ include: '*'
+ endpoint:
+ health:
+ show-details: ALWAYS
+ logfile:
+ external-file: ./logs/ruoyi-flow-ui.log
+spring:
+ profiles:
+ active: @profiles.active@
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/logback-plus.xml b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/logback-plus.xml
new file mode 100644
index 000000000..589626fd1
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/logback-plus.xml
@@ -0,0 +1,34 @@
+
+
+
+ logback
+
+
+
+
+
+
+ ${console.log.pattern}
+ utf-8
+
+
+
+
+ ${log.path}.log
+
+ ${log.path}.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/main/resources/mappers/CustomMybatisXmlMapper.xml b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/mappers/CustomMybatisXmlMapper.xml
new file mode 100644
index 000000000..088545413
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/main/resources/mappers/CustomMybatisXmlMapper.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-extend/ruoyi-flow-ui/src/test/java/org/dromara/flow/ui/RuoyiFlowUiApplicationTests.java b/ruoyi-extend/ruoyi-flow-ui/src/test/java/org/dromara/flow/ui/RuoyiFlowUiApplicationTests.java
new file mode 100644
index 000000000..cd4c0bcb7
--- /dev/null
+++ b/ruoyi-extend/ruoyi-flow-ui/src/test/java/org/dromara/flow/ui/RuoyiFlowUiApplicationTests.java
@@ -0,0 +1,13 @@
+package org.dromara.flow.ui;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class RuoyiFlowUiApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
From 831b6b850ab1c583146e364a0eb47adfe4374bcc Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: Sat, 3 Jun 2023 21:56:57 +0800
Subject: [PATCH 003/159] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B7=A5=E4=BD=9C?=
=?UTF-8?q?=E6=B5=81=E6=A8=A1=E5=9E=8B=E6=96=B0=E5=A2=9E=EF=BC=8C=E4=BF=AE?=
=?UTF-8?q?=E6=94=B9=EF=BC=8C=E6=9F=A5=E8=AF=A2=EF=BC=8C=E5=88=A0=E9=99=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/org/dromara/DromaraApplication.java | 4 +-
.../src/main/resources/static/stencilset.json | 1998 +++++++++++++++++
ruoyi-modules/ruoyi-workflow/pom.xml | 11 +
.../controller/ActModelController.java | 111 +
.../controller/StencilsetRestResource.java | 40 +
.../workflow/controller/package-info.java | 1 -
.../dromara/workflow/domain/bo/ModelBo.java | 40 +
.../workflow/domain/bo/PageEntity.java | 36 +
.../dromara/workflow/domain/package-info.java | 1 -
.../dromara/workflow/domain/vo/AccountVo.java | 21 +
.../workflow/service/IActModelService.java | 47 +
.../service/impl/ActModelServiceImpl.java | 233 ++
.../workflow/service/impl/package-info.java | 1 -
.../workflow/service/package-info.java | 1 -
.../dromara/workflow/utils/WorkflowUtils.java | 42 +
15 files changed, 2582 insertions(+), 5 deletions(-)
create mode 100644 ruoyi-admin/src/main/resources/static/stencilset.json
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java
delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/PageEntity.java
delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/AccountVo.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java
delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
diff --git a/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java b/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
index 8ef33fe5f..d0611154f 100644
--- a/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
+++ b/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
@@ -10,7 +10,9 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
* @author Lion Li
*/
-@SpringBootApplication
+@SpringBootApplication(exclude = {
+ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
+ org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class})
public class DromaraApplication {
public static void main(String[] args) {
diff --git a/ruoyi-admin/src/main/resources/static/stencilset.json b/ruoyi-admin/src/main/resources/static/stencilset.json
new file mode 100644
index 000000000..e58c64b35
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/static/stencilset.json
@@ -0,0 +1,1998 @@
+{
+ "title" : "流程编辑",
+ "namespace" : "http://b3mn.org/stencilset/bpmn2.0#",
+ "description" : "BPMN 流程编辑",
+ "propertyPackages" : [ {
+ "name" : "process_idpackage",
+ "properties" : [ {
+ "id" : "process_id",
+ "type" : "String",
+ "title" : "\u6d41\u7a0b\u6807\u8bc6",
+ "value" : "process",
+ "description" : "\u5b9a\u4e49\u6d41\u7a0b\u7684\u552f\u4e00\u6807\u8bc6\u7b26.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "overrideidpackage",
+ "properties" : [ {
+ "id" : "overrideid",
+ "type" : "String",
+ "title" : "\u7f16\u53f7",
+ "value" : "",
+ "description" : "\u5143\u7d20\u7684\u552f\u4e00\u6807\u8bc6\u7b26.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "namepackage",
+ "properties" : [ {
+ "id" : "name",
+ "type" : "String",
+ "title" : "\u540d\u79f0",
+ "value" : "",
+ "description" : "BPMN\u5143\u7d20\u7684\u63cf\u8ff0\u6027\u540d\u79f0.",
+ "popular" : true,
+ "refToView" : "text_name"
+ } ]
+ }, {
+ "name" : "documentationpackage",
+ "properties" : [ {
+ "id" : "documentation",
+ "type" : "Text",
+ "title" : "\u8bf4\u660e",
+ "value" : "",
+ "description" : "BPMN\u5143\u7d20\u7684\u63cf\u8ff0\u6027\u540d\u79f0.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "process_authorpackage",
+ "properties" : [ {
+ "id" : "process_author",
+ "type" : "String",
+ "title" : "\u6d41\u7a0b\u4f5c\u8005",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u6d41\u7a0b\u7684\u4f5c\u8005.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "process_versionpackage",
+ "properties" : [ {
+ "id" : "process_version",
+ "type" : "String",
+ "title" : "\u6d41\u7a0b\u7248\u672c\u5b57\u7b26\u4e32 (\u4ec5\u6587\u6863)",
+ "value" : "",
+ "description" : "\u4e3a\u4e86\u6587\u6863\u7684\u7528\u9014\u7684\u7248\u672c\u6807\u8bc6\u7b26.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "process_historylevelpackage",
+ "properties" : [ {
+ "id" : "process_historylevel",
+ "type" : "flowable-processhistorylevel",
+ "title" : "为流程定义设定特定级别",
+ "value" : "",
+ "description" : "为流程定义设定特定级别",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "isexecutablepackage",
+ "properties" : [ {
+ "id" : "isexecutable",
+ "type" : "Boolean",
+ "title" : "可执行的",
+ "value" : "true",
+ "description" : "流程是否可执行",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "process_potentialstarteruserpackage",
+ "properties" : [ {
+ "id" : "process_potentialstarteruser",
+ "type" : "String",
+ "title" : "默认启动用户",
+ "value" : "",
+ "description" : "启动该流程的用户",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "process_potentialstartergrouppackage",
+ "properties" : [ {
+ "id" : "process_potentialstartergroup",
+ "type" : "String",
+ "title" : "默认启动器组",
+ "value" : "",
+ "description" : "启动流程的组?",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "process_namespacepackage",
+ "properties" : [ {
+ "id" : "process_namespace",
+ "type" : "String",
+ "title" : "\u6307\u5411\u547d\u540d\u7a7a\u95f4",
+ "value" : "http://www.flowable.org/processdef",
+ "description" : "\u5b9a\u4e49\u6d41\u7a0b\u7684\u6307\u5411\u547d\u540d\u7a7a\u95f4.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "process_iseagerexecutionfetchpackage",
+ "properties" : [ {
+ "id" : "iseagerexecutionfetch",
+ "type" : "Boolean",
+ "title" : "优先执行",
+ "value" : "false",
+ "description" : "流程定义需要优先执行?",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "asynchronousdefinitionpackage",
+ "properties" : [ {
+ "id" : "asynchronousdefinition",
+ "type" : "Boolean",
+ "title" : "\u5f02\u6b65",
+ "value" : "false",
+ "description" : "\u6d3b\u52a8\u5b9a\u4e49\u4e3a\u5f02\u6b65.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "datapropertiespackage",
+ "properties" : [ {
+ "id" : "dataproperties",
+ "type" : "Complex",
+ "title" : "数据对象",
+ "value" : "",
+ "description" : "定义数据对象的属性",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "exclusivedefinitionpackage",
+ "properties" : [ {
+ "id" : "exclusivedefinition",
+ "type" : "Boolean",
+ "title" : "\u72ec\u5bb6",
+ "value" : "false",
+ "description" : "\u5b9a\u4e49\u6d3b\u52a8\u4e3a\u72ec\u5bb6.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "executionlistenerspackage",
+ "properties" : [ {
+ "id" : "executionlisteners",
+ "type" : "multiplecomplex",
+ "title" : "\u6267\u884c\u76d1\u542c\u5668",
+ "value" : "",
+ "description" : "\u6d3b\u52a8\uff0c\u8fc7\u7a0b\uff0c\u987a\u5e8f\u6d41\uff0c\u5f00\u59cb\u548c\u7ed3\u675f\u4e8b\u4ef6\u7684\u76d1\u542c\u5668.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "tasklistenerspackage",
+ "properties" : [ {
+ "id" : "tasklisteners",
+ "type" : "multiplecomplex",
+ "title" : "\u4efb\u52a1\u76d1\u542c",
+ "value" : "",
+ "description" : "\u76d1\u542c\u7528\u6237\u4efb\u52a1",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "eventlistenerspackage",
+ "properties" : [ {
+ "id" : "eventlisteners",
+ "type" : "multiplecomplex",
+ "title" : "\u4e8b\u4ef6\u76d1\u542c",
+ "value" : "",
+ "description" : "\u76d1\u542c\u6d41\u7a0b\u5f15\u64ce\u7684\u4efb\u4f55\u4e8b\u4ef6. \u4e5f\u53ef\u80fd\u629b\u51fa\u6d88\u606f\u4e8b\u4ef6\u6216\u8005\u9519\u8bef\u4e8b\u4ef6",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "usertaskassignmentpackage",
+ "properties" : [ {
+ "id" : "usertaskassignment",
+ "type" : "Complex",
+ "title" : "\u5206\u914d",
+ "value" : "",
+ "description" : "\u5206\u914d\u5b9a\u4e49\u7528\u6237\u4efb\u52a1",
+ "popular" : true
+ } ]
+ },{
+ "name" : "formpropertiespackage",
+ "properties" : [ {
+ "id" : "formproperties",
+ "type" : "Complex",
+ "title" : "\u8868\u5355\u5c5e\u6027",
+ "value" : "",
+ "description" : "\u7528\u5217\u8868\u7684\u5f62\u5f0f\u5b9a\u4e49\u8868\u5355\u5c5e\u6027",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "formkeydefinitionpackage",
+ "properties" : [ {
+ "id" : "formkeydefinition",
+ "type" : "String",
+ "title" : "\u8868\u5355\u952e(key)",
+ "value" : "",
+ "description" : "\u4e00\u4e2a\u8868\u5355\u7684\u552f\u4e00\u952e.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "duedatedefinitionpackage",
+ "properties" : [ {
+ "id" : "duedatedefinition",
+ "type" : "String",
+ "title" : "\u5230\u671f\u65f6\u95f4",
+ "value" : "",
+ "description" : "\u7528\u6237\u4efb\u52a1\u5230\u671f\u65f6\u95f4.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "prioritydefinitionpackage",
+ "properties" : [ {
+ "id" : "prioritydefinition",
+ "type" : "String",
+ "title" : "\u4f18\u5148\u7ea7",
+ "value" : "",
+ "description" : "\u7528\u6237\u4efb\u52a1\u7684\u4f18\u5148\u7ea7.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "duedatedefinitionpackage",
+ "properties" : [ {
+ "id" : "duedatedefinition",
+ "type" : "String",
+ "title" : "\u5230\u671f\u65f6\u95f4",
+ "value" : "",
+ "description" : "\u7528\u6237\u4efb\u52a1\u5230\u671f\u65f6\u95f4.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "servicetaskclasspackage",
+ "properties" : [ {
+ "id" : "servicetaskclass",
+ "type" : "String",
+ "title" : "\u7c7b",
+ "value" : "",
+ "description" : "\u5b9e\u73b0\u670d\u52a1\u4efb\u52a1\u903b\u8f91\u7684\u7c7b.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "servicetaskexpressionpackage",
+ "properties" : [ {
+ "id" : "servicetaskexpression",
+ "type" : "Text",
+ "title" : "\u8868\u8fbe\u5f0f",
+ "value" : "",
+ "description" : "\u670d\u52a1\u4efb\u52a1\u5b9a\u4e49\u7684\u903b\u8f91\u4e0e\u8868\u8fbe\u5f0f.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "servicetaskdelegateexpressionpackage",
+ "properties" : [ {
+ "id" : "servicetaskdelegateexpression",
+ "type" : "Text",
+ "title" : "\u59d4\u6258\u8868\u8fbe\u5f0f",
+ "value" : "",
+ "description" : "\u670d\u52a1\u4efb\u52a1\u5b9a\u4e49\u7684\u903b\u8f91\u4e0e\u59d4\u6258\u8868\u8fbe\u5f0f.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "servicetaskfieldspackage",
+ "properties" : [ {
+ "id" : "servicetaskfields",
+ "type" : "Complex",
+ "title" : "\u7c7b\u5b57\u6bb5",
+ "value" : "",
+ "description" : "\u6269\u5c55\u5b57\u6bb5",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "servicetaskresultvariablepackage",
+ "properties" : [ {
+ "id" : "servicetaskresultvariable",
+ "type" : "String",
+ "title" : "\u7ed3\u679c\u53d8\u91cf\u540d\u79f0",
+ "value" : "",
+ "description" : "\u7528\u6765\u5b58\u50a8\u670d\u52a1\u4efb\u52a1\u7ed3\u679c\u7684\u53d8\u91cf\u540d.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "servicetaskresultvariablepackage",
+ "properties" : [ {
+ "id" : "servicetaskUseLocalScopeForResultVariable",
+ "type" : "Boolean",
+ "title" : "\u7ed3\u679c\u53d8\u91cf\u540d\u79f0",
+ "value" : "false",
+ "description" : "\u7528\u6765\u5b58\u50a8\u670d\u52a1\u4efb\u52a1\u7ed3\u679c\u7684\u53d8\u91cf\u540d.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "servicetasktriggerablepackage",
+ "properties" : [ {
+ "id" : "servicetasktriggerable",
+ "type" : "Boolean",
+ "title" : "将服务任务设置为可触发的",
+ "value" : "false",
+ "description" : "将服务任务设置为可触发的",
+ "popular" : true
+ } ]
+ }, {
+ "name": "scriptformatpackage",
+ "properties" : [ {
+ "id": "scriptformat",
+ "type": "String",
+ "title": "\u811a\u672c\u683c\u5f0f",
+ "value": "",
+ "description": "\u811a\u672c\u4efb\u52a1\u7684\u811a\u672c\u683c\u5f0f.",
+ "popular": true
+ } ]
+ }, {
+ "name": "scripttextpackage",
+ "properties" : [ {
+ "id": "scripttext",
+ "type": "Text",
+ "title": "\u811a\u672c",
+ "value": "",
+ "description": "\u811a\u672c\u4efb\u52a1\u7684\u811a\u672c\u5185\u5bb9.",
+ "popular": true
+ }
+ ]
+ }, {
+ "name" : "shellcommandpackage",
+ "properties" : [ {
+ "id" : "shellcommand",
+ "type" : "String",
+ "title" : "命令",
+ "value" : "",
+ "description" : "脚本任务命令",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellarg1package",
+ "properties" : [ {
+ "id" : "shellarg1",
+ "type" : "Text",
+ "title" : "参数 1",
+ "value" : "",
+ "description" : "脚本命令的参数 1",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellarg2package",
+ "properties" : [ {
+ "id" : "shellarg2",
+ "type" : "Text",
+ "title" : "参数 2",
+ "value" : "",
+ "description" : "脚本命令参数 2",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellarg3package",
+ "properties" : [ {
+ "id" : "shellarg3",
+ "type" : "Text",
+ "title" : "参数 3",
+ "value" : "",
+ "description" : "脚本命令参数 3",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellarg4package",
+ "properties" : [ {
+ "id" : "shellarg4",
+ "type" : "Text",
+ "title" : "参数 4",
+ "value" : "",
+ "description" : "脚本命令参数 4",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellarg5package",
+ "properties" : [ {
+ "id" : "shellarg5",
+ "type" : "Text",
+ "title" : "参数 5",
+ "value" : "",
+ "description" : "脚本命令参数 5",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellwaitpackage",
+ "properties" : [ {
+ "id" : "shellwait",
+ "type" : "Text",
+ "title" : "等待",
+ "value" : "",
+ "description" : "等待shell命令执行结束的标志",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shelloutputvariablepackage",
+ "properties" : [ {
+ "id" : "shelloutputvariable",
+ "type" : "Text",
+ "title" : "输出参数",
+ "value" : "",
+ "description" : "变量存储shell共用输出",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellerrorcodevariablepackage",
+ "properties" : [ {
+ "id" : "shellerrorcodevariable",
+ "type" : "错误代码变量",
+ "value" : "",
+ "description" : "变量存储shell 命令错误代码",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellredirecterrorpackage",
+ "properties" : [ {
+ "id" : "shellredirecterror",
+ "type" : "Text",
+ "title" : "重定向错误",
+ "value" : "",
+ "description" : "如果true合并错误输出与标准输出",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shellcleanenvpackage",
+ "properties" : [ {
+ "id" : "shellcleanenv",
+ "type" : "Text",
+ "title" : "清除环境",
+ "value" : "",
+ "description" : "清除shell执行环境",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "shelldirectorypackage",
+ "properties" : [ {
+ "id" : "shelldirectory",
+ "type" : "Text",
+ "title" : "目录",
+ "value" : "",
+ "description" : "shell运行目录",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "ruletask_rulespackage",
+ "properties" : [ {
+ "id" : "ruletask_rules",
+ "type" : "String",
+ "title" : "\u89c4\u5219",
+ "value" : "",
+ "description" : "\u89c4\u5219\u4efb\u52a1\u7684\u89c4\u5219.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "ruletask_variables_inputpackage",
+ "properties" : [ {
+ "id" : "ruletask_variables_input",
+ "type" : "String",
+ "title" : "\u8f93\u5165\u53d8\u91cf",
+ "value" : "",
+ "description" : "\u89c4\u5219\u4efb\u52a1\u7684\u8f93\u5165\u53d8\u91cf.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "ruletask_excludepackage",
+ "properties" : [ {
+ "id" : "ruletask_exclude",
+ "type" : "Boolean",
+ "title" : "\u6392\u9664",
+ "value" : "false",
+ "description" : "\u4f5c\u4e3a\u6392\u9664\u4f7f\u7528\u89c4\u5219\u5c5e\u6027.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "ruletask_resultpackage",
+ "properties" : [ {
+ "id" : "ruletask_result",
+ "type" : "String",
+ "title" : "\u8f93\u51fa\u53d8\u91cf",
+ "value" : "",
+ "description" : "\u89c4\u5219\u4efb\u52a1\u7684\u8f93\u51fa\u53d8\u91cf.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "mailtasktopackage",
+ "properties" : [ {
+ "id" : "mailtaskto",
+ "type" : "Text",
+ "title" : "\u63a5\u6536\u4eba",
+ "value" : "",
+ "description" : "\u5982\u679c\u662f\u591a\u4e2a\u6536\u4ef6\u4eba\uff0c\u8bf7\u4ee5\u9017\u53f7\u5206\u9694.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "mailtaskfrompackage",
+ "properties" : [ {
+ "id" : "mailtaskfrom",
+ "type" : "Text",
+ "title" : "\u53d1\u9001\u4eba",
+ "value" : "",
+ "description" : "\u53d1\u4ef6\u4eba\u7684\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u3002\u5982\u679c\u672a\u63d0\u4f9b\uff0c\u4f7f\u7528\u9ed8\u8ba4\u914d\u7f6e\u7684\u53d1\u4ef6\u4eba\u5730\u5740.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "\u4e3b\u9898",
+ "properties" : [ {
+ "id" : "mailtasksubject",
+ "type" : "Text",
+ "title" : "Subject",
+ "value" : "",
+ "description" : "\u90ae\u4ef6\u4e3b\u9898.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "mailtaskccpackage",
+ "properties" : [ {
+ "id" : "mailtaskcc",
+ "type" : "Text",
+ "title" : "\u6284\u9001",
+ "value" : "",
+ "description" : "\u6284\u9001\u6536\u4ef6\u4eba\u5730\u5740. \u5982\u679c\u662f\u591a\u4e2a\u6536\u4ef6\u4eba\uff0c\u8bf7\u4ee5\u9017\u53f7\u5206\u9694",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "mailtaskbccpackage",
+ "properties" : [ {
+ "id" : "mailtaskbcc",
+ "type" : "Text",
+ "title" : "\u5bc6\u4ef6\u6284\u9001",
+ "value" : "",
+ "description" : "u5bc6\u4ef6\u6284\u9001\u6536\u4ef6\u4eba\u5730\u5740. \u5982\u679c\u662f\u591a\u4e2a\u6536\u4ef6\u4eba\uff0c\u8bf7\u4ee5\u9017\u53f7\u5206\u9694",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "mailtasktextpackage",
+ "properties" : [ {
+ "id" : "mailtasktext",
+ "type" : "Text",
+ "title" : "\u5185\u5bb9",
+ "value" : "",
+ "description" : "\u90ae\u4ef6\u5185\u5bb9\uff0c\u53ea\u80fd\u53d1\u9001\u7eaf\u6587\u672c\u3002\u5982\u679c\u9700\u8981\u53d1\u9001\u590d\u6742\u5185\u5bb9\uff0c\u53ef\u4ee5\u7ed3\u5408\u4f7f\u7528HTML\uff0c\u5ba2\u6237\u7aef\u4e0d\u652f\u6301\u590d\u6742\u5185\u5bb9\uff0c\u90ae\u4ef6\u5c06\u88ab\u9000\u56de.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "mailtaskhtmlpackage",
+ "properties" : [ {
+ "id" : "mailtaskhtml",
+ "type" : "Text",
+ "title" : "Html",
+ "value" : "",
+ "description" : "A piece of HTML that is the content of the e-mail.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "mailtaskcharsetpackage",
+ "properties" : [ {
+ "id" : "mailtaskcharset",
+ "type" : "String",
+ "title" : "Html",
+ "value" : "",
+ "description" : "\u4e00\u6bb5HTML\u7684\u90ae\u4ef6\u7684\u5185\u5bb9.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskrequestmethodpackage",
+ "properties" : [ {
+ "id" : "httptaskrequestmethod",
+ "type" : "flowable-http-request-method",
+ "title" : "请求方式",
+ "value" : "",
+ "description" : "请求方式 (例如 - GET,POST,PUT etc).",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskrequesturlpackage",
+ "properties" : [ {
+ "id" : "httptaskrequesturl",
+ "type" : "Text",
+ "title" : "请求地址",
+ "value" : "",
+ "description" : "请求地址 (例如 - http://flowable.org).",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskrequestheaderspackage",
+ "properties" : [ {
+ "id" : "httptaskrequestheaders",
+ "type" : "Text",
+ "title" : "请求头",
+ "value" : "",
+ "description" : "HTTP请求头的分开行 (例如 - Content-Type: application/json).",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskrequestbodypackage",
+ "properties" : [ {
+ "id" : "httptaskrequestbody",
+ "type" : "Text",
+ "title" : "请求体",
+ "value" : "",
+ "description" : "请求体 (例如- ${sampleBody}).",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskrequesttimeoutpackage",
+ "properties" : [ {
+ "id" : "httptaskrequesttimeout",
+ "type" : "String",
+ "title" : "请求超时",
+ "value" : "",
+ "description" : "请求超时以毫秒为单位 (For example - 5000).",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskdisallowredirectspackage",
+ "properties" : [ {
+ "id" : "httptaskdisallowredirects",
+ "type" : "String",
+ "title" : "不允许重定向",
+ "value" : "",
+ "description" : "禁止HTTP重定向的标志。",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskfailstatuscodespackage",
+ "properties" : [ {
+ "id" : "httptaskfailstatuscodes",
+ "type" : "String",
+ "title" : "失败状态码",
+ "value" : "",
+ "description" : "用逗号分隔的HTTP响应状态代码列表,例如 400,5XX.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskhandlestatuscodespackage",
+ "properties" : [ {
+ "id" : "httptaskhandlestatuscodes",
+ "type" : "String",
+ "title" : "处理状态码",
+ "value" : "",
+ "description" : "忽略HTTP响应状态代码列表的逗号, 例如 404,3XX.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskignoreexceptionpackage",
+ "properties" : [ {
+ "id" : "httptaskignoreexception",
+ "type" : "String",
+ "title" : "忽略异常",
+ "value" : "",
+ "description" : "忽略异常的标志",
+ "popular" : true
+ } ]
+ },
+ {
+ "name" : "httptasksaveresponseparameterstransientpackage",
+ "properties" : [ {
+ "id" : "httptasksaveresponseparameterstransient",
+ "type" : "String",
+ "title" : "将响应保存为瞬态变量",
+ "value" : "",
+ "description" : "指示存储响应变量的标志",
+ "popular" : true
+ } ]
+ },
+ {
+ "name" : "httptasksaveresponseasjsonpackage",
+ "properties" : [ {
+ "id" : "httptasksaveresponseasjson",
+ "type" : "String",
+ "title" : "保存响应为JSON",
+ "value" : "",
+ "description" : "指示将响应变量存储为JSON变量而不是字符串的标志",
+ "popular" : true
+ } ]
+ },
+ {
+ "name": "skipexpressionpackage",
+ "properties": [
+ {
+ "id": "skipexpression",
+ "type": "String",
+ "title": "自动跳过",
+ "value": "",
+ "description": "设置自动跳过的条件.",
+ "popular": true
+ }
+ ]
+ }, {
+ "name": "nodetypepackage",
+ "properties": [
+ {
+ "id": "nodetype",
+ "type": "dragon-nodetype-combobox",
+ "title": "节点类型",
+ "value": "",
+ "description": "节点类型",
+ "popular": true,
+ "items": [
+ {
+ "key": "审批中",
+ "value": "applying"
+ },
+ {
+ "key": "不审",
+ "value": "noapprove"
+ },
+ {
+ "key": "协同",
+ "value": "coordination"
+ },
+ {
+ "key": "评审",
+ "value": "review"
+ },
+ {
+ "key": "必审",
+ "value": "bs"
+ },
+ {
+ "key": "普通",
+ "value": ""
+ }
+ ]
+ }
+ ]
+ },{
+ "name": "editdatapackage",
+ "properties": [
+ {
+ "id": "iseditdata",
+ "type": "dragon-nodeeditdata-combobox",
+ "title": "是否可编辑",
+ "value": "",
+ "description": "数据在此节点是否可以编辑",
+ "popular": true,
+ "items":[
+ {
+ "key": "是",
+ "value": "true"
+ },
+ {
+ "key": "否",
+ "value": ""
+ }
+ ]
+ }
+ ]
+ },{
+ "name": "sequenceflowtextxpackage",
+ "properties": [
+ {
+ "id": "sequence_flow_text_x",
+ "type": "String",
+ "title": "线上文字位置",
+ "value": "",
+ "description": "线上文字位置",
+ "popular": true
+ }
+ ]
+ },{
+ "name" : "httptaskresponsevariablenamepackage",
+ "properties" : [ {
+ "id" : "httptaskresponsevariablename",
+ "type" : "String",
+ "title" : "响应变量名",
+ "value" : "",
+ "description" : "定义变量名来存储HTTP响应.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptasksaverequestvariablespackage",
+ "properties" : [ {
+ "id" : "httptasksaverequestvariables",
+ "type" : "String",
+ "title" : "保存请求变量",
+ "value" : "",
+ "description" : "保存请求变量的标志.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptasksaveresponseparameterspackage",
+ "properties" : [ {
+ "id" : "httptasksaveresponseparameters",
+ "type" : "String",
+ "title" : "保存响应状态,标题",
+ "value" : "",
+ "description" : "保存响应状态、标题等的标志.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "httptaskresultvariableprefixpackage",
+ "properties" : [ {
+ "id" : "httptaskresultvariableprefix",
+ "type" : "String",
+ "title" : "结果变量前缀",
+ "value" : "",
+ "description" : "执行变量名称的前缀.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivitycalledelementpackage",
+ "properties" : [ {
+ "id" : "callactivitycalledelement",
+ "type" : "String",
+ "title" : "\u8c03\u7528\u5143\u7d20",
+ "value" : "",
+ "description" : "\u6d41\u7a0b\u5f15\u7528.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivityinparameterspackage",
+ "properties" : [ {
+ "id" : "callactivityinparameters",
+ "type" : "Complex",
+ "title" : "\u8f93\u5165\u53c2\u6570",
+ "value" : "",
+ "description" : "\u5b9a\u5165\u8f93\u51fa\u53c2\u6570",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivityoutparameterspackage",
+ "properties" : [ {
+ "id" : "callactivityoutparameters",
+ "type" : "Complex",
+ "title" : "\u8f93\u51fa\u53c2\u6570",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u8f93\u51fa\u53c2\u6570",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivityinheritvariablespackage",
+ "properties" : [ {
+ "id" : "callactivityinheritvariables",
+ "type" : "Boolean",
+ "title" : "继承子过程中的变量",
+ "value" : "false",
+ "description" : "继承子过程中的父进程变量.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivitysamedeploymentpackage",
+ "properties" : [ {
+ "id" : "callactivitysamedeployment",
+ "type" : "Boolean",
+ "title" : "从相同的部署启动引用的进程.",
+ "value" : "false",
+ "description" : "使用来自相同部署的引用进程.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivityprocessinstancenamepackage",
+ "properties" : [ {
+ "id" : "callactivityprocessinstancename",
+ "type" : "String",
+ "title" : "进程实例名",
+ "value" : "",
+ "description" : "一个解析到子进程实例名称的表达式",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivityinheritbusinesskeypackage",
+ "properties" : [ {
+ "id" : "callactivityinheritbusinesskey",
+ "type" : "Boolean",
+ "title" : "继承业务密钥",
+ "value" : "false",
+ "description" : "从父进程继承业务密钥.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivityuselocalscopeforoutparameterspackage",
+ "properties" : [ {
+ "id" : "callactivityuselocalscopeforoutparameters",
+ "type" : "Boolean",
+ "title" : "使用局部范围进行输出参数",
+ "value" : "false",
+ "description" : "使用局部变量作用域输出参数.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "callactivitybusinesskeypackage",
+ "properties" : [ {
+ "id" : "callactivitybusinesskey",
+ "type" : "String",
+ "title" : "业务密钥表达式",
+ "value" : "",
+ "description" : "解析为子进程实例的业务密钥的表达式",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "cameltaskcamelcontextpackage",
+ "properties" : [ {
+ "id" : "cameltaskcamelcontext",
+ "type" : "String",
+ "title" : "Camel context",
+ "value" : "",
+ "description" : "An optional camel context definition, if left empty the default is used.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "muletaskendpointurlpackage",
+ "properties" : [ {
+ "id" : "muletaskendpointurl",
+ "type" : "String",
+ "title" : "端点URL",
+ "value" : "",
+ "description" : "需要的端点URL将消息发送给Mule.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "muletasklanguagepackage",
+ "properties" : [ {
+ "id" : "muletasklanguage",
+ "type" : "String",
+ "title" : "语言",
+ "value" : "",
+ "description" : "解决负载表达式的语言所需的定义,如Juel.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "muletaskpayloadexpressionpackage",
+ "properties" : [ {
+ "id" : "muletaskpayloadexpression",
+ "type" : "Text",
+ "title" : "有效载荷表达式",
+ "value" : "",
+ "description" : "必需定义效载荷的消息发送给Mule.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "muletaskresultvariablepackage",
+ "properties" : [ {
+ "id" : "muletaskresultvariable",
+ "type" : "String",
+ "title" : "结果变量",
+ "value" : "",
+ "description" : "返回的有效载荷的可选结果变量.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "conditionsequenceflowpackage",
+ "properties" : [ {
+ "id" : "conditionsequenceflow",
+ "type" : "Complex",
+ "title" : "\u6d41\u6761\u4ef6",
+ "value" : "",
+ "description" : "\u987a\u5e8f\u6d41\u7684\u6761\u4ef6",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "defaultflowpackage",
+ "properties" : [ {
+ "id" : "defaultflow",
+ "type" : "Boolean",
+ "title" : "\u9ed8\u8ba4\u6d41",
+ "value" : "false",
+ "description" : "\u5b9a\u4e49\u4f5c\u4e3a\u9ed8\u8ba4\u987a\u5e8f\u6d41",
+ "popular" : true,
+ "refToView" : "default"
+ } ]
+ }, {
+ "name" : "conditionalflowpackage",
+ "properties" : [ {
+ "id" : "conditionalflow",
+ "type" : "Boolean",
+ "title" : "\u6761\u4ef6\u6d41",
+ "value" : "false",
+ "description" : "\u5b9a\u4e49\u987a\u5e8f\u6d41\u7684\u6761\u4ef6",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "timercycledefinitionpackage",
+ "properties" : [ {
+ "id" : "timercycledefinition",
+ "type" : "String",
+ "title" : "\u65f6\u95f4\u5468\u671f\uff08\u4f8b\u5982R3/PT10H\uff09",
+ "value" : "",
+ "description" : "\u5b9a\u4e49ISO-8601\u5468\u671f\u5b9a\u65f6\u5668.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "timerdatedefinitionpackage",
+ "properties" : [ {
+ "id" : "timerdatedefinition",
+ "type" : "String",
+ "title" : "\u91c7\u7528ISO-8601\u65e5\u671f\u65f6\u95f4",
+ "value" : "",
+ "description" : "\u5b9a\u4e49ISO-8601\u65e5\u671f\u5b9a\u65f6\u5668.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "timerdurationdefinitionpackage",
+ "properties" : [ {
+ "id" : "timerdurationdefinition",
+ "type" : "String",
+ "title" : "\u6301\u7eed\u65f6\u95f4\uff08\u4f8b\u5982PT5M\uff09",
+ "value" : "",
+ "description" : "\u5b9a\u4e49ISO-8601\u65f6\u95f4\u5b9a\u65f6\u5668.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "timerenddatedefinitionpackage",
+ "properties" : [ {
+ "id" : "timerenddatedefinition",
+ "type" : "String",
+ "title" : "\u91c7\u7528ISO-8601\u7ed3\u675f\u65e5\u671f\u65f6\u95f4",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u5b9a\u65f6\u5668\u4e0eISO-8601\u6301\u7eed\u65f6\u95f4.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "messagerefpackage",
+ "properties" : [ {
+ "id" : "messageref",
+ "type" : "String",
+ "title" : "\u6d88\u606f\u5f15\u7528",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u6d88\u606f\u540d\u79f0.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "signalrefpackage",
+ "properties" : [ {
+ "id" : "signalref",
+ "type" : "String",
+ "title" : "\u4fe1\u53f7\u5f15\u7528",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u4fe1\u53f7\u540d\u79f0.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "errorrefpackage",
+ "properties" : [ {
+ "id" : "errorref",
+ "type" : "String",
+ "title" : "\u9519\u8bef\u5f15\u7528",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u9519\u8bef\u540d\u79f0.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "cancelactivitypackage",
+ "properties" : [ {
+ "id" : "cancelactivity",
+ "type" : "Boolean",
+ "title" : "\u53d6\u6d88 \u6d3b\u52a8(activity)",
+ "value" : "true",
+ "description" : "\u662f\u5426\u53d6\u6d88\u6d3b\u52a8",
+ "popular" : true,
+ "refToView" : [ "frame", "frame2" ]
+ } ]
+ }, {
+ "name" : "initiatorpackage",
+ "properties" : [ {
+ "id" : "initiator",
+ "type" : "String",
+ "title" : "\u53d1\u8d77\u8005",
+ "value" : "",
+ "description" : "\u6d41\u7a0b\u7684\u53d1\u8d77\u8005.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "textpackage",
+ "properties" : [ {
+ "id" : "text",
+ "type" : "String",
+ "title" : "\u5185\u5bb9",
+ "value" : "",
+ "description" : "\u6587\u672c\u7684\u6587\u5b57\u6ce8\u91ca.",
+ "popular" : true,
+ "refToView" : "text"
+ } ]
+ }, {
+ "name" : "multiinstance_typepackage",
+ "properties" : [ {
+ "id" : "multiinstance_type",
+ "type" : "flowable-multiinstance",
+ "title" : "\u591a\u5b9e\u4f8b\u7c7b\u578b",
+ "value" : "None",
+ "description" : "重复活动执行(并行或顺序)可以通过不同的循环类型来显示",
+ "popular" : true,
+ "refToView" : "multiinstance"
+ } ]
+ }, {
+ "name" : "multiinstance_cardinalitypackage",
+ "properties" : [ {
+ "id" : "multiinstance_cardinality",
+ "type" : "String",
+ "title" : "\u57fa\u6570\uff08\u591a\u5b9e\u4f8b\uff09",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u591a\u5b9e\u4f8b\u7684\u57fa\u6570.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "multiinstance_collectionpackage",
+ "properties" : [ {
+ "id" : "multiinstance_collection",
+ "type" : "String",
+ "title" : "\u91c7\u96c6\uff08\u591a\u5b9e\u4f8b\uff09",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u96c6\u5408\u7684\u591a\u5b9e\u4f8b.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "multiinstance_variablepackage",
+ "properties" : [ {
+ "id" : "multiinstance_variable",
+ "type" : "String",
+ "title" : "\u5143\u7d20\u53d8\u91cf\uff08\u591a\u5b9e\u4f8b\uff09",
+ "value" : "",
+ "description" : "\u591a\u5b9e\u4f8b\u53d8\u91cf\u5b9a\u4e49\u7684\u5143\u7d20.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "multiinstance_conditionpackage",
+ "properties" : [ {
+ "id" : "multiinstance_condition",
+ "type" : "String",
+ "title" : "\u5b8c\u6210\u6761\u4ef6\uff08\u591a\u5b9e\u4f8b\uff09",
+ "value" : "",
+ "description" : "\u5b9a\u4e49\u591a\u5b9e\u4f8b\u7684\u5b8c\u6210\u6761\u4ef6.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "isforcompensationpackage",
+ "properties" : [ {
+ "id" : "isforcompensation",
+ "type" : "Boolean",
+ "title" : "\u8865\u507f",
+ "value" : "false",
+ "description" : "\u4e00\u4e2a\u6807\u5fd7\u6807\u8bc6\u6b64\u6d3b\u52a8\u7684\u76ee\u7684\u662f\u5426\u4e3a\u7684\u8865\u507f\u7684\u76ee\u7684.",
+ "popular" : true,
+ "refToView" : "compensation"
+ } ]
+ }, {
+ "name" : "sequencefloworderpackage",
+ "properties" : [ {
+ "id" : "sequencefloworder",
+ "type" : "Complex",
+ "title" : "\u6d41\u987a\u5e8f",
+ "value" : "",
+ "description" : "\u6d41\u5f00\u59cb\u7684\u987a\u5e8f.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "signaldefinitionspackage",
+ "properties" : [ {
+ "id" : "signaldefinitions",
+ "type" : "multiplecomplex",
+ "title" : "\u4fe1\u53f7\u5b9a\u4e49",
+ "value" : "",
+ "description" : "\u4fe1\u53f7\u5b9a\u4e49",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "messagedefinitionspackage",
+ "properties" : [ {
+ "id" : "messagedefinitions",
+ "type" : "\u6d88\u606f\u5b9a\u4e49",
+ "value" : "",
+ "description" : "\u6d88\u606f\u5b9a\u4e49",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "istransactionpackage",
+ "properties" : [ {
+ "id" : "istransaction",
+ "type" : "Boolean",
+ "title" : "\u662f\u4e00\u4e2a\u5b50\u6d41\u7a0b\u4e8b\u52a1",
+ "value" : "false",
+ "description" : "\u6807\u8bc6\u6b64\u5b50\u8fdb\u7a0b\u662f\u5426\u662f\u4ea4\u6613\u7c7b\u578b\u7684\u6807\u5fd7.",
+ "popular" : true,
+ "refToView" : "border"
+ } ]
+ }, {
+ "name" : "formreferencepackage",
+ "properties" : [ {
+ "id" : "formreference",
+ "type" : "Complex",
+ "title" : "表单引用",
+ "value" : "",
+ "description" : "引用表单",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "terminateAllpackage",
+ "properties" : [ {
+ "id" : "terminateAll",
+ "type" : "Boolean",
+ "title" : "\u7ec8\u6b62\u6240\u6709",
+ "value" : "false",
+ "description" : "\u542f\u7528\u7ec8\u6b62\u6d41\u7a0b\u5b9e\u4f8b",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "decisiontaskdecisiontablereferencepackage",
+ "properties" : [ {
+ "id" : "decisiontaskdecisiontablereference",
+ "type" : "Complex",
+ "title" : "决策表参考",
+ "value" : "",
+ "description" : "设置决策表参考",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "decisiontaskthrowerroronnohitspackage",
+ "properties" : [ {
+ "id" : "decisiontaskthrowerroronnohits",
+ "type" : "Boolean",
+ "title" : "如果没有命中规则,则抛出错误",
+ "value" : "false",
+ "description" : "如果没有命中决策表的规则,结果是否被发现,则会引发错误.",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "interruptingpackage",
+ "properties" : [ {
+ "id" : "interrupting",
+ "type" : "Boolean",
+ "title" : "中断",
+ "value" : "true",
+ "description" : "是否应终止所有父执行?",
+ "popular" : true,
+ "refToView" : [ "frame" ]
+ } ]
+ }, {
+ "name" : "completionconditionpackage",
+ "properties" : [ {
+ "id" : "completioncondition",
+ "type" : "String",
+ "title" : "完成条件",
+ "value" : "",
+ "description" : "子过程的完备性条件",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "orderingpackage",
+ "properties" : [ {
+ "id" : "ordering",
+ "type" : "flowable-ordering",
+ "title" : "排序",
+ "value" : "Parallel",
+ "description" : "AdHoc子过程的排序",
+ "popular" : true
+ } ]
+ }, {
+ "name" : "cancelremaininginstancespackage",
+ "properties" : [ {
+ "id" : "cancelremaininginstances",
+ "type" : "Boolean",
+ "title" : "取消剩余实例",
+ "value" : "true",
+ "description" : "取消AdHoc子进程的剩余实例?",
+ "popular" : true
+ } ]
+ } ],
+ "stencils" : [ {
+ "type" : "node",
+ "id" : "BPMNDiagram",
+ "title" : "BPMN\u56fe\u8868",
+ "description" : "A BPMN 2.0 diagram.",
+ "view" : "\n",
+ "icon" : "diagram.png",
+ "groups" : [ "图解" ],
+ "mayBeRoot" : true,
+ "hide" : true,
+ "propertyPackages" : [ "process_idpackage", "namepackage", "documentationpackage", "process_authorpackage", "process_versionpackage", "process_namespacepackage", "process_historylevelpackage", "isexecutablepackage", "datapropertiespackage", "executionlistenerspackage", "eventlistenerspackage", "signaldefinitionspackage", "messagedefinitionspackage", "process_potentialstarteruserpackage","process_potentialstartergrouppackage", "process_iseagerexecutionfetchpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ ]
+ }, {
+ "type" : "node",
+ "id" : "StartNoneEvent",
+ "title" : "\u5f00\u59cb\u4e8b\u4ef6",
+ "description" : "\u4e0d\u5e26\u5177\u4f53\u7684\u89e6\u53d1\u7684\u5f00\u59cb\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "startevent/none.png",
+ "groups" : [ "\u542f\u52a8\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "initiatorpackage", "formkeydefinitionpackage", "formreferencepackage", "formpropertiespackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "StartTimerEvent",
+ "title" : "\u8ba1\u65f6\u5668\u4e8b\u4ef6",
+ "description" : "\u5e26\u6709\u8ba1\u65f6\u5668\u7684\u89e6\u53d1\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "startevent/timer.png",
+ "groups" : [ "\u542f\u52a8\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "StartSignalEvent",
+ "title" : "\u4fe1\u53f7\u4e8b\u4ef6",
+ "description" : "\u5e26\u6709\u4fe1\u53f7\u7684\u89e6\u53d1\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "startevent/signal.png",
+ "groups" : [ "\u542f\u52a8\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage", "interruptingpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "StartMessageEvent",
+ "title" : "\u6d88\u606f\u4e8b\u4ef6",
+ "description" : "\u5e26\u6709\u6d88\u606f\u7684\u89e6\u53d1\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "startevent/message.png",
+ "groups" : [ "\u542f\u52a8\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "messagerefpackage", "interruptingpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "StartErrorEvent",
+ "title" : "\u9519\u8bef\u4e8b\u4ef6",
+ "description" : "\u6355\u83b7BPMN\u9519\u8bef\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "startevent/error.png",
+ "groups" : [ "\u542f\u52a8\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "errorrefpackage", "interruptingpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "UserTask",
+ "title" : "\u7528\u6237\u4efb\u52a1",
+ "description" : "\u4efb\u52a1\u624b\u52a8\u5206\u914d\u7ed9\u4e00\u4e2a\u7279\u5b9a\u7684\u4eba",
+ "view" : "\n",
+ "icon" : "activity/list/type.user.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "usertaskassignmentpackage", "formkeydefinitionpackage", "formreferencepackage", "duedatedefinitionpackage", "prioritydefinitionpackage", "formpropertiespackage", "tasklistenerspackage", "skipexpressionpackage","nodetypepackage","editdatapackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ServiceTask",
+ "title" : "\u670d\u52a1\u4efb\u52a1",
+ "description" : "\u4e1a\u52a1\u903b\u8f91\u81ea\u52a8\u4efb\u52a1",
+ "view" : "\n",
+ "icon" : "activity/list/type.service.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "servicetasktriggerablepackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "servicetaskclasspackage", "servicetaskexpressionpackage", "servicetaskdelegateexpressionpackage", "servicetaskfieldspackage", "servicetaskresultvariablepackage", "skipexpressionpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ScriptTask",
+ "title" : "\u811a\u672c\u4efb\u52a1",
+ "description" : "\u81ea\u52a8\u811a\u672c\u903b\u8f91\u4efb\u52a1",
+ "view" : "\n",
+ "icon" : "activity/list/type.script.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "scriptformatpackage", "scripttextpackage", "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "BusinessRule",
+ "title" : "\u4e1a\u52a1\u89c4\u5219\u4efb\u52a1",
+ "description" : "\u89c4\u5219\u903b\u8f91\u81ea\u52a8\u4efb\u52a1",
+ "view" : "\n",
+ "icon" : "activity/list/type.business.rule.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "ruletask_rulespackage", "ruletask_variables_inputpackage", "ruletask_excludepackage", "ruletask_resultpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ReceiveTask",
+ "title" : "\u63a5\u6536\u4efb\u52a1",
+ "description" : "\u8be5\u4efb\u52a1\u7b49\u5f85\u63a5\u6536",
+ "view" : "\n",
+ "icon" : "activity/list/type.receive.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ManualTask",
+ "title" : "\u624b\u52a8\u4efb\u52a1",
+ "description" : "\u6ca1\u6709\u903b\u8f91\u7684\u81ea\u52a8\u4efb\u52a1",
+ "view" : "\n",
+ "icon" : "activity/list/type.manual.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "MailTask",
+ "title" : "\u90ae\u4ef6\u4efb\u52a1",
+ "description" : "\u90ae\u4ef6\u4efb\u52a1",
+ "view" : "\n",
+ "icon" : "activity/list/type.send.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "mailtasktopackage", "mailtaskfrompackage", "mailtasksubjectpackage", "mailtaskccpackage", "mailtaskbccpackage", "mailtasktextpackage", "mailtaskhtmlpackage", "mailtaskcharsetpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "CamelTask",
+ "title" : "\u9a7c\u5cf0\u4efb\u52a1",
+ "description" : "\u53d1\u9001\u6d88\u606f\u7ed9\u9a7c\u5cf0\u7684\u4efb\u52a1",
+ "view" : "\n",
+ "icon" : "activity/list/type.camel.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "cameltaskcamelcontextpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "HttpTask",
+ "title" : "HTTP任务",
+ "description" : "一个HTTP任务",
+ "view" : "\n",
+ "icon" : "activity/list/type.http.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "httptaskrequestmethodpackage", "httptaskrequesturlpackage", "httptaskrequestheaderspackage", "httptaskrequestbodypackage", "httptaskrequesttimeoutpackage", "httptaskdisallowredirectspackage", "httptaskfailstatuscodespackage", "httptaskhandlestatuscodespackage", "httptaskignoreexceptionpackage", "httptaskresponsevariablenamepackage", "httptasksaverequestvariablespackage", "httptasksaveresponseparameterspackage", "httptaskresultvariableprefixpackage", "httptasksaveresponseparameterstransientpackage", "httptasksaveresponseasjsonpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "MuleTask",
+ "title" : "Mule 任务",
+ "description" : "发送消息的任务给Mule",
+ "view" : "\n",
+ "icon" : "activity/list/type.mule.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "muletaskendpointurlpackage", "muletasklanguagepackage", "muletaskpayloadexpressionpackage", "muletaskresultvariablepackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "SendTask",
+ "title" : "\u53d1\u9001\u4efb\u52a1",
+ "description" : "\u53d1\u9001\u6d88\u606f\u7684\u4efb\u52a1",
+ "view" : "\n",
+ "icon" : "activity/list/type.send.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "DecisionTask",
+ "title" : "决策任务",
+ "description" : "使用可流动DMN规则引擎的任务",
+ "view" : "\n",
+ "icon" : "activity/list/type.decision.png",
+ "groups" : [ "\u4efb\u52a1" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "decisiontaskdecisiontablereferencepackage", "decisiontaskthrowerroronnohitspackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]
+ },
+ {
+ "type": "node",
+ "id": "ShellTask",
+ "title": "Shell任务",
+ "description": "shell批量逻辑的自动任务",
+ "view": "\n",
+ "icon": "activity/list/type.shell.png",
+ "groups": [
+ "\u4efb\u52a1"
+ ],
+ "propertyPackages": [
+ "overrideidpackage",
+ "namepackage",
+ "documentationpackage",
+ "asynchronousdefinitionpackage",
+ "shellcommandpackage",
+ "shellarg1package",
+ "shellarg2package",
+ "shellarg3package",
+ "shellarg4package",
+ "shellarg5package",
+ "shellwaitpackage",
+ "shelloutputvariablepackage",
+ "shellerrorcodevariablepackage",
+ "shellredirecterrorpackage",
+ "shellcleanenvpackage",
+ "shelldirectorypackage",
+ "exclusivedefinitionpackage",
+ "executionlistenerspackage",
+ "multiinstance_typepackage",
+ "multiinstance_cardinalitypackage",
+ "multiinstance_collectionpackage",
+ "multiinstance_variablepackage",
+ "multiinstance_conditionpackage",
+ "isforcompensationpackage"
+ ],
+ "hiddenPropertyPackages": [],
+ "roles": [
+ "Activity",
+ "sequence_start",
+ "sequence_end",
+ "ActivitiesMorph",
+ "all"
+ ]
+ },{
+ "type" : "node",
+ "id" : "SubProcess",
+ "title" : "\u5b50\u6d41\u7a0b",
+ "description" : "\u5b50\u6d41\u7a0b\u8303\u56f4",
+ "view" : "\n",
+ "icon" : "activity/expanded.subprocess.png",
+ "groups" : [ "子流程" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "datapropertiespackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "istransactionpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ]
+ },{
+ "type" : "node",
+ "id" : "CollapsedSubProcess",
+ "title" : "折叠子过程",
+ "description" : "子过程范围",
+ "view" : "\n",
+ "icon" : "activity/subprocess.png",
+ "groups" : [ "子流程" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "datapropertiespackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "istransactionpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ]
+ },{
+ "type" : "node",
+ "id" : "EventSubProcess",
+ "title" : "事件子流程",
+ "description" : "\u5b50\u6d41\u7a0b\u4e8b\u4ef6\u8303\u56f4",
+ "view" : "\n",
+ "icon" : "activity/event.subprocess.png",
+ "groups" : [ "子流程" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "all", "EventSubProcess" ]
+ }, {
+ "type" : "node",
+ "id" : "CallActivity",
+ "title" : "活动子流程",
+ "description" : "\u547c\u53eb\u6d3b\u52a8",
+ "view" : "\n",
+ "icon" : "activity/task.png",
+ "groups" : [ "子流程" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "callactivitycalledelementpackage", "callactivityinparameterspackage", "callactivityoutparameterspackage", "callactivityinheritvariablespackage", "callactivitysamedeploymentpackage", "callactivityprocessinstancenamepackage", "callactivityinheritbusinesskeypackage", "callactivitybusinesskeypackage", "callactivityuselocalscopeforoutparameterspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ExclusiveGateway",
+ "title" : "\u9ad8\u7ea7\u5206\u652f",
+ "description" : "\u9ad8\u7ea7\u5206\u652f",
+ "view" : "\n\n",
+ "icon" : "gateway/exclusive.databased.png",
+ "groups" : [ "\u7f51\u5173" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "sequencefloworderpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ParallelGateway",
+ "title" : "\u5e76\u884c\u5206\u652f",
+ "description" : "\u5e76\u884c\u5206\u652f\u7528\u6765\u5bf9\u6d41\u7a0b\u4e2d\u7684\u5e76\u53d1\u8fdb\u884c\u5efa\u6a21",
+ "view" : "\n\n",
+ "icon" : "gateway/parallel.png",
+ "groups" : [ "\u7f51\u5173" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "sequencefloworderpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "InclusiveGateway",
+ "title" : "\u5305\u5bb9\u5206\u652f",
+ "description" : "\u5305\u5bb9\u5206\u652f\u53ef\u4ee5\u88ab\u89c6\u4e3a\u662f\u6392\u4ed6\u5206\u652f\u548c\u5e76\u884c\u5206\u652f\u7684\u7ed3\u5408",
+ "view" : "\n\n",
+ "icon" : "gateway/inclusive.png",
+ "groups" : [ "\u7f51\u5173" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "sequencefloworderpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "EventGateway",
+ "title" : "\u4e8b\u4ef6\u5206\u652f",
+ "description" : "\u4e8b\u4ef6\u5206\u652f",
+ "view" : "\n\n",
+ "icon" : "gateway/eventbased.png",
+ "groups" : [ "\u7f51\u5173" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "sequencefloworderpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "BoundaryErrorEvent",
+ "title" : "\u8fb9\u754c\u9519\u8bef\u4e8b\u4ef6",
+ "description" : "\u6355\u83b7BPMN\u9519\u8bef\u8fb9\u754c\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/error.png",
+ "groups" : [ "\u8fb9\u754c\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "errorrefpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]
+ }, {
+ "type" : "node",
+ "id" : "BoundaryTimerEvent",
+ "title" : "\u8fb9\u754c\u5b9a\u65f6\u5668\u4e8b\u4ef6",
+ "description" : "\u5b9a\u65f6\u5668\u89e6\u53d1\u7684\u8fb9\u754c\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/timer.png",
+ "groups" : [ "\u8fb9\u754c\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage", "timerenddatedefinitionpackage", "cancelactivitypackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]
+ }, {
+ "type" : "node",
+ "id" : "BoundarySignalEvent",
+ "title" : "\u8fb9\u754c\u4fe1\u53f7\u4e8b\u4ef6",
+ "description" : "\u4fe1\u53f7\u89e6\u53d1\u7684\u8fb9\u754c\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/signal.png",
+ "groups" : [ "\u8fb9\u754c\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "signalrefpackage", "cancelactivitypackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]
+ }, {
+ "type" : "node",
+ "id" : "BoundaryMessageEvent",
+ "title" : "\u8fb9\u754c\u7ebf\u6d88\u606f\u4e8b\u4ef6",
+ "description" : "\u6d88\u606f\u89e6\u53d1\u7684\u8fb9\u754c\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/message.png",
+ "groups" : [ "\u8fb9\u754c\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "messagerefpackage", "cancelactivitypackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]
+ }, {
+ "type" : "node",
+ "id" : "BoundaryCancelEvent",
+ "title" : "\u8fb9\u754c\u53d6\u6d88\u4e8b\u4ef6",
+ "description" : "\u8fb9\u754c\u53d6\u6d88\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/cancel.png",
+ "groups" : [ "\u8fb9\u754c\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]
+ }, {
+ "type" : "node",
+ "id" : "BoundaryCompensationEvent",
+ "title" : "\u8fb9\u754c\u8865\u507f\u4e8b\u4ef6",
+ "description" : "\u8fb9\u754c\u8865\u507f\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/compensation.png",
+ "groups" : [ "\u8fb9\u754c\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "CatchTimerEvent",
+ "title" : "\u4e2d\u95f4\u5b9a\u65f6\u5668\u6355\u83b7\u4e8b\u4ef6",
+ "description" : "\u5b9a\u65f6\u5668\u89e6\u53d1\u7684\u6355\u83b7\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/timer.png",
+ "groups" : [ "\u4e2d\u95f4\u6355\u83b7\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "CatchSignalEvent",
+ "title" : "\u4e2d\u95f4\u4fe1\u53f7\u6355\u83b7\u4e8b\u4ef6",
+ "description" : "\u4fe1\u53f7\u89e6\u53d1\u7684\u6355\u83b7\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/signal.png",
+ "groups" : [ "\u4e2d\u95f4\u6355\u83b7\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "CatchMessageEvent",
+ "title" : "\u4e2d\u95f4\u6d88\u606f\u6355\u83b7\u4e8b\u4ef6",
+ "description" : "\u6d88\u606f\u89e6\u53d1\u7684\u6355\u83b7\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "catching/message.png",
+ "groups" : [ "\u4e2d\u95f4\u6355\u83b7\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "messagerefpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ThrowNoneEvent",
+ "title" : "\u4e2d\u95f4\u7a7a\u629b\u51fa\u4e8b\u4ef6",
+ "description" : "\u4e2d\u95f4\u6ca1\u6709\u4e00\u4e2a\u5177\u4f53\u7684\u89e6\u53d1\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "throwing/none.png",
+ "groups" : [ "\u4e2d\u95f4\u6355\u83b7\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "ThrowEventsMorph", "sequence_start", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "ThrowSignalEvent",
+ "title" : "\u4e2d\u95f4\u4fe1\u53f7\u629b\u51fa\u4e8b\u4ef6",
+ "description" : "\u4e2d\u95f4\u7684\u4fe1\u53f7\u89e6\u53d1\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "throwing/signal.png",
+ "groups" : [ "\u4e2d\u95f4\u89e6\u53d1\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "ThrowEventsMorph", "sequence_start", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "EndNoneEvent",
+ "title" : "\u7ed3\u675f\u4e8b\u4ef6",
+ "description" : "\u6ca1\u6709\u4e00\u4e2a\u5177\u4f53\u7684\u89e6\u53d1\u7ed3\u675f\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "endevent/none.png",
+ "groups" : [ "\u7ed3\u675f\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "EndEventsMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "EndErrorEvent",
+ "title" : "\u7ed3\u675f\u9519\u8bef\u4e8b\u4ef6",
+ "description" : "\u629b\u51fa\u4e00\u4e2a\u9519\u8bef\u7ed3\u675f\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "endevent/error.png",
+ "groups" : [ "\u7ed3\u675f\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "errorrefpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "EndEventsMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "EndCancelEvent",
+ "title" : "\u7ed3\u675f\u540e\u53d6\u6d88\u4e8b\u4ef6",
+ "description" : "\u7ed3\u675f\u540e\u53d6\u6d88\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "endevent/cancel.png",
+ "groups" : [ "\u7ed3\u675f\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "EndEventsMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "EndTerminateEvent",
+ "title" : "\u7ed3\u675f\u7ec8\u6b62\u4e8b\u4ef6",
+ "description" : "\u7ed3\u675f\u7ec8\u6b62\u4e8b\u4ef6",
+ "view" : "\n",
+ "icon" : "endevent/terminate.png",
+ "groups" : [ "\u7ed3\u675f\u4e8b\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "terminateAllpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "EndEventsMorph", "sequence_end", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "Pool",
+ "title" : "\u6d41\u7a0b\u6c60",
+ "description" : "\u6d41\u7a0b\u5b9a\u4e49\u6c60",
+ "view" : "\n",
+ "icon" : "swimlane/pool.png",
+ "groups" : [ "泳道" ],
+ "layout" : [ {
+ "type" : "layout.bpmn2_0.pool"
+ } ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "process_idpackage", "isexecutablepackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "canContainArtifacts", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "Lane",
+ "title" : "通道",
+ "description" : "建立流程定义的通道",
+ "view" : "\n",
+ "icon" : "swimlane/lane.png",
+ "groups" : [ "泳道" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "PoolChild", "canContainArtifacts", "all" ]
+ }, {
+ "type" : "edge",
+ "id" : "SequenceFlow",
+ "title" : "\u987a\u5e8f\u6d41",
+ "description" : "\u987a\u5e8f\u6d41\u5b9a\u4e49\u6d3b\u52a8\u7684\u6267\u884c\u987a\u5e8f.",
+ "view" : "\r\n",
+ "icon" : "connector/sequenceflow.png",
+ "groups" : [ "\u8fde\u63a5\u5bf9\u8c61" ],
+ "layout" : [ {
+ "type" : "layout.bpmn2_0.sequenceflow"
+ } ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "conditionsequenceflowpackage", "executionlistenerspackage", "defaultflowpackage", "skipexpressionpackage","sequenceflowtextxpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "ConnectingObjectsMorph", "all" ]
+ }, {
+ "type" : "edge",
+ "id" : "MessageFlow",
+ "title" : "\u6d88\u606f\u6d41",
+ "description" : "\u8fde\u63a5\u4e0d\u540c\u6d41\u7a0b\u6c60\u7684\u6d88\u606f\u6d41.",
+ "view" : "\r\n",
+ "icon" : "connector/messageflow.png",
+ "groups" : [ "\u8fde\u63a5\u5bf9\u8c61" ],
+ "layout" : [ {
+ "type" : "layout.bpmn2_0.sequenceflow"
+ } ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "ConnectingObjectsMorph", "all" ]
+ }, {
+ "type" : "edge",
+ "id" : "Association",
+ "title" : "\u8054\u7cfb",
+ "description" : "\u8054\u7cfb\u6587\u672c\u6ce8\u91ca\u4e0e\u5bf9\u8c61.",
+ "view" : "\r\n",
+ "icon" : "connector/association.undirected.png",
+ "groups" : [ "\u8fde\u63a5\u5bf9\u8c61" ],
+ "layout" : [ {
+ "type" : "layout.bpmn2_0.sequenceflow"
+ } ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "ConnectingObjectsMorph", "all" ]
+ }, {
+ "type" : "edge",
+ "id" : "DataAssociation",
+ "title" : "\u6570\u636e\u8054\u7cfb",
+ "description" : "\u8054\u7cfb\u5e26\u6d3b\u52a8\u7684\u5bf9\u8c61.",
+ "view" : "\r\n",
+ "icon" : "connector/association.unidirectional.png",
+ "groups" : [ "\u8fde\u63a5\u5bf9\u8c61" ],
+ "layout" : [ {
+ "type" : "layout.bpmn2_0.sequenceflow"
+ } ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "ConnectingObjectsMorph", "all" ]
+ }, {
+ "type" : "node",
+ "id" : "TextAnnotation",
+ "title" : "\u6587\u672c\u6ce8\u91ca",
+ "description" : "\u8bf4\u660e\u6587\u5b57\u6807\u6ce8\u5143\u7d20.",
+ "view" : "\n",
+ "icon" : "artifact/text.annotation.png",
+ "groups" : [ "\u6784\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "textpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "all" ]
+ }, {
+ "type" : "node",
+ "id" : "DataStore",
+ "title" : "\u6570\u636e\u5b58\u50a8",
+ "description" : "\u6570\u636e\u5b58\u50a8\u7684\u5f15\u7528.",
+ "view" : "\r\n\r\n",
+ "icon" : "dataobject/data.store.png",
+ "groups" : [ "\u6784\u4ef6" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "all" ]
+ }, {
+ "type" : "node",
+ "id" : "AdhocSubProcess",
+ "title" : "特别子流程",
+ "description" : "一个特别子过程",
+ "view" : "\n",
+ "icon" : "activity/adhoc.subprocess.png",
+ "groups" : [ "子流程" ],
+ "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "completionconditionpackage", "orderingpackage", "cancelremaininginstancespackage" ],
+ "hiddenPropertyPackages" : [ ],
+ "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ]
+ } ],
+ "rules" : {
+ "cardinalityRules" : [ {
+ "role" : "Startevents_all",
+ "incomingEdges" : [ {
+ "role" : "SequenceFlow",
+ "maximum" : 0
+ } ]
+ }, {
+ "role" : "Endevents_all",
+ "outgoingEdges" : [ {
+ "role" : "SequenceFlow",
+ "maximum" : 0
+ } ]
+ } ],
+ "connectionRules" : [ {
+ "role" : "SequenceFlow",
+ "connects" : [ {
+ "from" : "sequence_start",
+ "to" : [ "sequence_end" ]
+ } ]
+ }, {
+ "role" : "Association",
+ "connects" : [ {
+ "from" : "sequence_start",
+ "to" : [ "TextAnnotation" ]
+ }, {
+ "from" : "sequence_end",
+ "to" : [ "TextAnnotation" ]
+ }, {
+ "from" : "TextAnnotation",
+ "to" : [ "sequence_end" ]
+ }, {
+ "from" : "BoundaryCompensationEvent",
+ "to" : [ "sequence_end" ]
+ }, {
+ "from" : "TextAnnotation",
+ "to" : [ "sequence_start" ]
+ }, {
+ "from" : "BoundaryCompensationEvent",
+ "to" : [ "sequence_start" ]
+ } ]
+ }, {
+ "role" : "DataAssociation",
+ "connects" : [ {
+ "from" : "sequence_start",
+ "to" : [ "DataStore" ]
+ }, {
+ "from" : "sequence_end",
+ "to" : [ "DataStore" ]
+ }, {
+ "from" : "DataStore",
+ "to" : [ "sequence_end" ]
+ }, {
+ "from" : "DataStore",
+ "to" : [ "sequence_start" ]
+ } ]
+ }, {
+ "role" : "IntermediateEventOnActivityBoundary",
+ "connects" : [ {
+ "from" : "Activity",
+ "to" : [ "IntermediateEventOnActivityBoundary" ]
+ } ]
+ } ],
+ "containmentRules" : [ {
+ "role" : "BPMNDiagram",
+ "contains" : [ "all" ]
+ }, {
+ "role" : "SubProcess",
+ "contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "EventSubProcess", "TextAnnotation", "DataStore" ]
+ }, {
+ "role" : "AdhocSubProcess",
+ "contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "TextAnnotation", "DataStore" ]
+ }, {
+ "role" : "EventSubProcess",
+ "contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "TextAnnotation", "DataStore" ]
+ }, {
+ "role" : "Pool",
+ "contains" : [ "Lane" ]
+ }, {
+ "role" : "Lane",
+ "contains" : [ "sequence_start", "sequence_end", "EventSubProcess", "TextAnnotation", "DataStore" ]
+ } ],
+ "morphingRules" : [ {
+ "role" : "ActivitiesMorph",
+ "baseMorphs" : [ "UserTask" ],
+ "preserveBounds" : true
+ }, {
+ "role" : "GatewaysMorph",
+ "baseMorphs" : [ "ExclusiveGateway" ]
+ }, {
+ "role" : "StartEventsMorph",
+ "baseMorphs" : [ "StartNoneEvent" ]
+ }, {
+ "role" : "EndEventsMorph",
+ "baseMorphs" : [ "StartNoneEvent" ]
+ }, {
+ "role" : "CatchEventsMorph",
+ "baseMorphs" : [ "CatchTimerEvent" ]
+ }, {
+ "role" : "ThrowEventsMorph",
+ "baseMorphs" : [ "ThrowNoneEvent" ]
+ }, {
+ "role" : "BoundaryEventsMorph",
+ "baseMorphs" : [ "ThrowNoneEvent" ]
+ }, {
+ "role" : "BoundaryCompensationEvent",
+ "baseMorphs" : [ "BoundaryCompensationEvent" ]
+ }, {
+ "role" : "TextAnnotation",
+ "baseMorphs" : [ "TextAnnotation" ]
+ }, {
+ "role" : "DataStore",
+ "baseMorphs" : [ "DataStore" ]
+ } ]
+ }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml
index f65d7fc6c..ca167ecc8 100644
--- a/ruoyi-modules/ruoyi-workflow/pom.xml
+++ b/ruoyi-modules/ruoyi-workflow/pom.xml
@@ -35,6 +35,11 @@
+
+ org.flowable
+ flowable-ui-modeler-rest
+ 6.8.0
+
org.flowable
@@ -66,6 +71,12 @@
xercesImpl
${xerces.version}
+
+ org.flowable
+ flowable-json-converter
+ 6.8.0
+ compile
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
new file mode 100644
index 000000000..2bdb9fc8b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
@@ -0,0 +1,111 @@
+package org.dromara.workflow.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.json.utils.JsonUtils;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.workflow.domain.bo.ModelBo;
+import org.dromara.workflow.domain.vo.AccountVo;
+import org.dromara.workflow.service.IActModelService;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.repository.Model;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 模型管理 控制层
+ *
+ * @author may
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/model")
+public class ActModelController extends BaseController {
+
+ private final RepositoryService repositoryService;
+
+ private final IActModelService iActModelService;
+
+
+ @GetMapping("/list")
+ public TableDataInfo getByPage(ModelBo modelBo) {
+ return iActModelService.getByPage(modelBo);
+ }
+
+ /**
+ * 参考官方提供的响应数据
+ * "{\"id\":\"admin\",\"firstName\":\"Test\",\"lastName\":\"Administrator\",\"email\":\"admin@flowable.org\",\"fullName\":\"Test Administrator\",\"groups\":[],\"privileges\":[\"access-idm\",\"access-rest-api\",\"access-task\",\"access-modeler\",\"access-admin\"]}";
+ */
+ @GetMapping("/rest/account")
+ @SaIgnore
+ public String getAccount() {
+
+ AccountVo accountVo = new AccountVo();
+ accountVo.setId("admin");
+ accountVo.setFirstName("");
+ accountVo.setLastName("admin");
+ accountVo.setFullName("admin");
+ return JsonUtils.toJsonString(accountVo);
+ }
+
+ /**
+ * 新增模型
+ *
+ * @param modelBo 模型请求对象
+ */
+ @Log(title = "模型管理", businessType = BusinessType.INSERT)
+ @PostMapping("/rest/models")
+ public R saveNewModel(@RequestBody ModelBo modelBo) {
+ return toAjax(iActModelService.saveNewModel(modelBo));
+ }
+
+ /**
+ * 查询模型
+ *
+ * @param modelId 模型id
+ */
+ @GetMapping("/rest/models/{modelId}/editor/json")
+ @SaIgnore
+ public ObjectNode getModelInfo(@PathVariable String modelId) {
+ return iActModelService.getModelInfo(modelId);
+ }
+
+
+ /**
+ * 编辑模型
+ *
+ * @param modelId 模型id
+ * @param values 模型数据
+ */
+ @SaIgnore
+ @Log(title = "模型管理", businessType = BusinessType.UPDATE)
+ @PostMapping(value = "/rest/models/{modelId}/editor/json")
+ public R editModel(@PathVariable String modelId, @RequestParam MultiValueMap values) {
+ return toAjax(iActModelService.editModel(modelId,values));
+ }
+
+ /**
+ * 删除流程模型
+ *
+ * @param ids 模型id
+ */
+ @Log(title = "模型管理", businessType = BusinessType.DELETE)
+ @RepeatSubmit()
+ @DeleteMapping("/{ids}")
+ @Transactional(rollbackFor = Exception.class)
+ public R delete(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) {
+ for (String id : ids) {
+ repositoryService.deleteModel(id);
+ }
+ return R.ok();
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java
new file mode 100644
index 000000000..c6791cf9a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java
@@ -0,0 +1,40 @@
+/* Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.workflow.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import org.apache.commons.io.IOUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author Tijs Rademakers
+ */
+@RestController
+@RequestMapping("/workflow/model")
+public class StencilsetRestResource {
+
+ @SaIgnore
+ @GetMapping(value="/rest/stencil-sets/editor")
+ public String getStencilset() {
+ InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("static/stencilset.json");
+ try {
+ assert inputStream != null;
+ return IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+ } catch (Exception e) {
+ throw new SecurityException("Error while loading stencil set", e);
+ }
+ }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java
deleted file mode 100644
index cf6a7552e..000000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package org.dromara.workflow.controller;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java
new file mode 100644
index 000000000..0a5ca15bb
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java
@@ -0,0 +1,40 @@
+package org.dromara.workflow.domain.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 模型请求对象
+ *
+ * @author may
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ModelBo extends PageEntity implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 模型名称
+ */
+ @NotBlank(message = "模型名称不能为空", groups = {AddGroup.class})
+ private String name;
+
+ /**
+ * 模型标识key
+ */
+ @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class})
+ private String key;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/PageEntity.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/PageEntity.java
new file mode 100644
index 000000000..10b3236ff
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/PageEntity.java
@@ -0,0 +1,36 @@
+package org.dromara.workflow.domain.bo;
+
+
+/**
+ * 分页参数
+ *
+ * @author may
+ */
+public class PageEntity {
+
+ /**
+ * 当前页码
+ */
+ private Integer pageNum = 0;
+
+ /**
+ * 页容量
+ */
+ private Integer pageSize = 10;
+
+ public Integer getPageNum() {
+ return (pageNum - 1) * pageSize;
+ }
+
+ public void setPageNum(Integer pageNum) {
+ this.pageNum = pageNum;
+ }
+
+ public Integer getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(Integer pageSize) {
+ this.pageSize = pageSize;
+ }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java
deleted file mode 100644
index 9cc89e510..000000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package org.dromara.workflow.domain;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/AccountVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/AccountVo.java
new file mode 100644
index 000000000..825f7c486
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/AccountVo.java
@@ -0,0 +1,21 @@
+package org.dromara.workflow.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 参考官方提供的响应数据
+ *
+ * @author may
+ */
+@Data
+public class AccountVo {
+ private String id;
+ private String firstName;
+ private String lastName;
+ private String email;
+ private String fullName;
+ private List groups;
+ private List privileges;
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java
new file mode 100644
index 000000000..1e74a5331
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java
@@ -0,0 +1,47 @@
+package org.dromara.workflow.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.workflow.domain.bo.ModelBo;
+import org.flowable.engine.repository.Model;
+import org.springframework.util.MultiValueMap;
+
+/**
+ * 模型管理 服务层
+ *
+ * @author may
+ */
+public interface IActModelService {
+ /**
+ * 分页查询模型
+ *
+ * @param modelBo 模型参数
+ * @return 返回分页列表
+ */
+ TableDataInfo getByPage(ModelBo modelBo);
+
+ /**
+ * 新增模型
+ *
+ * @param modelBo 模型请求对象
+ * @return 结果
+ */
+ boolean saveNewModel(ModelBo modelBo);
+
+ /**
+ * 查询模型
+ *
+ * @param modelId 模型id
+ * @return 模型数据
+ */
+ ObjectNode getModelInfo(String modelId);
+
+ /**
+ * 编辑模型
+ *
+ * @param modelId 模型id
+ * @param values 模型数据
+ * @return 结果
+ */
+ boolean editModel(String modelId, MultiValueMap values);
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
new file mode 100644
index 000000000..41515a7d3
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
@@ -0,0 +1,233 @@
+package org.dromara.workflow.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.json.utils.JsonUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.workflow.domain.bo.ModelBo;
+import org.dromara.workflow.service.IActModelService;
+import org.dromara.workflow.utils.WorkflowUtils;
+import org.flowable.bpmn.converter.BpmnXMLConverter;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.editor.constants.ModelDataJsonConstants;
+import org.flowable.editor.language.json.converter.BpmnJsonConverter;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.repository.Model;
+import org.flowable.engine.repository.ModelQuery;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.MultiValueMap;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Objects;
+
+import static org.flowable.editor.constants.ModelDataJsonConstants.*;
+
+/**
+ * 模型管理 服务层实现
+ *
+ * @author may
+ */
+@RequiredArgsConstructor
+@Service
+public class ActModelServiceImpl implements IActModelService {
+
+ private final RepositoryService repositoryService;
+
+ /**
+ * 分页查询模型
+ *
+ * @param modelBo 模型参数
+ * @return 返回分页列表
+ */
+ @Override
+ public TableDataInfo getByPage(ModelBo modelBo) {
+ ModelQuery query = repositoryService.createModelQuery();
+ if (StringUtils.isNotEmpty(modelBo.getName())) {
+ query.modelNameLike("%" + modelBo.getName() + "%");
+ }
+ if (StringUtils.isNotEmpty(modelBo.getKey())) {
+ query.modelKey(modelBo.getKey());
+ }
+ query.orderByLastUpdateTime().desc();
+ //创建时间降序排列
+ query.orderByCreateTime().desc();
+ // 分页查询
+ List modelList = query.listPage(modelBo.getPageNum(), modelBo.getPageSize());
+ if (CollectionUtil.isNotEmpty(modelList)) {
+ modelList.forEach(e -> {
+ boolean isNull = JSONUtil.isNull(JSONUtil.parseObj(e.getMetaInfo()).get(ModelDataJsonConstants.MODEL_DESCRIPTION));
+ if (!isNull) {
+ e.setMetaInfo((String) JSONUtil.parseObj(e.getMetaInfo()).get(ModelDataJsonConstants.MODEL_DESCRIPTION));
+ } else {
+ e.setMetaInfo(StrUtil.EMPTY);
+ }
+ });
+ }
+ // 总记录数
+ long total = query.count();
+ return new TableDataInfo<>(modelList, total);
+ }
+
+ /**
+ * 新增模型
+ *
+ * @param modelBo 模型请求对象
+ * @return 结果
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean saveNewModel(ModelBo modelBo) {
+ try {
+ int version = 0;
+ String key = modelBo.getKey();
+ String name = modelBo.getName();
+ String description = modelBo.getDescription();
+ Model checkModel = repositoryService.createModelQuery().modelKey(key).singleResult();
+ if (ObjectUtil.isNotNull(checkModel)) {
+ throw new ServiceException("模型key已存在!");
+ }
+ // 1. 初始空的模型
+ Model model = repositoryService.newModel();
+ model.setKey(key);
+ model.setName(name);
+ model.setVersion(version);
+ model.setTenantId(LoginHelper.getTenantId());
+ ObjectMapper objectMapper = JsonUtils.getObjectMapper();
+ // 封装模型json对象
+ ObjectNode objectNode = JsonUtils.getObjectMapper().createObjectNode();
+ objectNode.put(MODEL_NAME, name);
+ objectNode.put(MODEL_REVISION, version);
+ objectNode.put(MODEL_DESCRIPTION, description);
+ model.setMetaInfo(objectNode.toString());
+ // 保存初始化的模型基本信息数据
+ repositoryService.saveModel(model);
+ String namespace = "http://b3mn.org/stencilset/bpmn2.0#";
+ // 封装模型对象基础数据json串
+ ObjectNode editorNode = objectMapper.createObjectNode();
+ ObjectNode stencilSetNode = objectMapper.createObjectNode();
+ stencilSetNode.put("namespace", namespace);
+ editorNode.replace("stencilset", stencilSetNode);
+ // 标识key
+ ObjectNode propertiesNode = objectMapper.createObjectNode();
+ propertiesNode.put("process_id", key);
+ propertiesNode.put("name", name);
+ propertiesNode.put("description", description);
+ editorNode.replace("properties", propertiesNode);
+ repositoryService.addModelEditorSource(model.getId(), editorNode.toString().getBytes(StandardCharsets.UTF_8));
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new ServiceException(e.getMessage());
+ }
+ }
+
+ /**
+ * 查询模型
+ *
+ * @param modelId 模型id
+ * @return 模型数据
+ */
+ @Override
+ public ObjectNode getModelInfo(String modelId) {
+ ObjectNode modelNode = null;
+
+ Model model = repositoryService.getModel(modelId);
+ ObjectMapper objectMapper = JsonUtils.getObjectMapper();
+ if (model != null) {
+ try {
+ if (StringUtils.isNotEmpty(model.getMetaInfo())) {
+ modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
+ } else {
+ modelNode = objectMapper.createObjectNode();
+ modelNode.put(MODEL_NAME, model.getName());
+ }
+ modelNode.put(MODEL_ID, model.getId());
+ Integer version = model.getVersion();
+ if (version > 0) {
+ byte[] modelEditorSource = repositoryService.getModelEditorSource(model.getId());
+ ByteArrayInputStream byteArrayInputStream = IoUtil.toStream(modelEditorSource);
+ XMLInputFactory xif = XMLInputFactory.newInstance();
+ XMLStreamReader xtr = xif.createXMLStreamReader(byteArrayInputStream);
+ BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr);
+ BpmnJsonConverter bpmnJsonConverter = new BpmnJsonConverter();
+ ObjectNode jsonNodes = bpmnJsonConverter.convertToJson(bpmnModel);
+ modelNode.put("model", jsonNodes);
+ } else {
+ ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(
+ new String(repositoryService.getModelEditorSource(model.getId()), StandardCharsets.UTF_8));
+ modelNode.put("model", editorJsonNode);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return modelNode;
+ }
+
+ /**
+ * 编辑模型
+ *
+ * @param modelId 模型id
+ * @param values 模型数据
+ * @return 结果
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean editModel(String modelId, MultiValueMap values) {
+ try {
+
+ Model model = repositoryService.getModel(modelId);
+ ObjectMapper objectMapper = JsonUtils.getObjectMapper();
+ ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
+
+ modelJson.put(MODEL_NAME, values.getFirst("name"));
+ modelJson.put(MODEL_DESCRIPTION, values.getFirst("description"));
+ model.setMetaInfo(modelJson.toString());
+ model.setName(values.getFirst("name"));
+ // 每次保存把版本更新+1
+ model.setVersion(model.getVersion() + 1);
+ // 获取唯一标识key
+ String key = objectMapper.readTree(values.getFirst("json_xml")).get("properties").get("process_id").textValue();
+ model.setKey(key);
+
+
+ repositoryService.saveModel(model);
+ byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(values.getFirst("json_xml")).getBytes(StandardCharsets.UTF_8));
+
+ repositoryService.addModelEditorSource(model.getId(), xmlBytes);
+
+ /*InputStream svgStream = new ByteArrayInputStream(values.getFirst("svg_xml").getBytes(StandardCharsets.UTF_8));
+ TranscoderInput input = new TranscoderInput(svgStream);
+
+ PNGTranscoder transcoder = new PNGTranscoder();
+ // Setup output
+ ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+ TranscoderOutput output = new TranscoderOutput(outStream);
+
+ // Do the transformation
+ transcoder.transcode(input, output);
+ final byte[] result = outStream.toByteArray();
+ repositoryService.addModelEditorSourceExtra(model.getId(), result);
+ outStream.close();*/
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new ServiceException(e.getMessage());
+ }
+ }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java
deleted file mode 100644
index 429bd2904..000000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package org.dromara.workflow.service.impl;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java
deleted file mode 100644
index 6e68be40f..000000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package org.dromara.workflow.service;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
new file mode 100644
index 000000000..a4afe1fbc
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
@@ -0,0 +1,42 @@
+package org.dromara.workflow.utils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.dromara.common.json.utils.JsonUtils;
+import org.flowable.bpmn.converter.BpmnXMLConverter;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.editor.language.json.converter.BpmnJsonConverter;
+
+import java.io.IOException;
+
+/**
+ * 工作流工具
+ *
+ * @author may
+ */
+public class WorkflowUtils {
+
+ public WorkflowUtils() {
+ }
+
+ /**
+ * bpmnModel转为xml
+ *
+ * @param jsonBytes json
+ */
+ public static byte[] bpmnJsonToXmlBytes(byte[] jsonBytes) throws IOException {
+ if (jsonBytes == null) {
+ return new byte[0];
+ }
+ //1. json字节码转成 BpmnModel 对象
+ ObjectMapper objectMapper = JsonUtils.getObjectMapper();
+ JsonNode jsonNode = objectMapper.readTree(jsonBytes);
+ BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(jsonNode);
+
+ if (bpmnModel.getProcesses().isEmpty()) {
+ return new byte[0];
+ }
+ //2.将bpmnModel转为xml
+ return new BpmnXMLConverter().convertToXML(bpmnModel);
+ }
+}
From 60cd549337ef5b9b3f0f8842704d2f8ad38a2dc4 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: Sat, 3 Jun 2023 22:01:51 +0800
Subject: [PATCH 004/159] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B?=
=?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A0=A1=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../org/dromara/workflow/controller/ActModelController.java | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
index 2bdb9fc8b..397094dc4 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.validation.constraints.NotEmpty;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.log.annotation.Log;
@@ -18,6 +19,7 @@ import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.Model;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.MultiValueMap;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
@@ -25,6 +27,7 @@ import org.springframework.web.bind.annotation.*;
*
* @author may
*/
+@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/workflow/model")
@@ -63,7 +66,7 @@ public class ActModelController extends BaseController {
*/
@Log(title = "模型管理", businessType = BusinessType.INSERT)
@PostMapping("/rest/models")
- public R saveNewModel(@RequestBody ModelBo modelBo) {
+ public R saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) {
return toAjax(iActModelService.saveNewModel(modelBo));
}
From 9fd84a7076e6070be034cd76b0d57f61cbfff334 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: Sun, 4 Jun 2023 14:11:16 +0800
Subject: [PATCH 005/159] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B?=
=?UTF-8?q?=E7=BC=96=E8=BE=91key=E9=87=8D=E5=A4=8D=E6=A0=A1=E9=AA=8C?=
=?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=A7=9F=E6=88=B7=E6=9F=A5=E8=AF=A2?=
=?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=E5=BF=BD=E7=95=A5token=E6=B3=A8?=
=?UTF-8?q?=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/ActModelController.java | 4 ---
.../controller/StencilsetRestResource.java | 2 --
.../service/impl/ActModelServiceImpl.java | 25 ++++++++++++-------
3 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
index 397094dc4..a537318b5 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
@@ -1,6 +1,5 @@
package org.dromara.workflow.controller;
-import cn.dev33.satoken.annotation.SaIgnore;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.validation.constraints.NotEmpty;
import lombok.RequiredArgsConstructor;
@@ -48,7 +47,6 @@ public class ActModelController extends BaseController {
* "{\"id\":\"admin\",\"firstName\":\"Test\",\"lastName\":\"Administrator\",\"email\":\"admin@flowable.org\",\"fullName\":\"Test Administrator\",\"groups\":[],\"privileges\":[\"access-idm\",\"access-rest-api\",\"access-task\",\"access-modeler\",\"access-admin\"]}";
*/
@GetMapping("/rest/account")
- @SaIgnore
public String getAccount() {
AccountVo accountVo = new AccountVo();
@@ -76,7 +74,6 @@ public class ActModelController extends BaseController {
* @param modelId 模型id
*/
@GetMapping("/rest/models/{modelId}/editor/json")
- @SaIgnore
public ObjectNode getModelInfo(@PathVariable String modelId) {
return iActModelService.getModelInfo(modelId);
}
@@ -88,7 +85,6 @@ public class ActModelController extends BaseController {
* @param modelId 模型id
* @param values 模型数据
*/
- @SaIgnore
@Log(title = "模型管理", businessType = BusinessType.UPDATE)
@PostMapping(value = "/rest/models/{modelId}/editor/json")
public R editModel(@PathVariable String modelId, @RequestParam MultiValueMap values) {
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java
index c6791cf9a..d8da28aa9 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/StencilsetRestResource.java
@@ -12,7 +12,6 @@
*/
package org.dromara.workflow.controller;
-import cn.dev33.satoken.annotation.SaIgnore;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.*;
@@ -26,7 +25,6 @@ import java.nio.charset.StandardCharsets;
@RequestMapping("/workflow/model")
public class StencilsetRestResource {
- @SaIgnore
@GetMapping(value="/rest/stencil-sets/editor")
public String getStencilset() {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("static/stencilset.json");
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
index 41515a7d3..1c9316d14 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
@@ -2,6 +2,7 @@ package org.dromara.workflow.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
@@ -33,6 +34,7 @@ import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;
+import java.util.stream.Collectors;
import static org.flowable.editor.constants.ModelDataJsonConstants.*;
@@ -56,6 +58,7 @@ public class ActModelServiceImpl implements IActModelService {
@Override
public TableDataInfo getByPage(ModelBo modelBo) {
ModelQuery query = repositoryService.createModelQuery();
+ query.modelTenantId(LoginHelper.getTenantId());
if (StringUtils.isNotEmpty(modelBo.getName())) {
query.modelNameLike("%" + modelBo.getName() + "%");
}
@@ -96,7 +99,7 @@ public class ActModelServiceImpl implements IActModelService {
String key = modelBo.getKey();
String name = modelBo.getName();
String description = modelBo.getDescription();
- Model checkModel = repositoryService.createModelQuery().modelKey(key).singleResult();
+ Model checkModel = repositoryService.createModelQuery().modelKey(key).modelTenantId(LoginHelper.getTenantId()).singleResult();
if (ObjectUtil.isNotNull(checkModel)) {
throw new ServiceException("模型key已存在!");
}
@@ -144,8 +147,7 @@ public class ActModelServiceImpl implements IActModelService {
@Override
public ObjectNode getModelInfo(String modelId) {
ObjectNode modelNode = null;
-
- Model model = repositoryService.getModel(modelId);
+ Model model = repositoryService.createModelQuery().modelId(modelId).modelTenantId(LoginHelper.getTenantId()).singleResult();
ObjectMapper objectMapper = JsonUtils.getObjectMapper();
if (model != null) {
try {
@@ -190,25 +192,30 @@ public class ActModelServiceImpl implements IActModelService {
@Transactional(rollbackFor = Exception.class)
public boolean editModel(String modelId, MultiValueMap values) {
try {
-
- Model model = repositoryService.getModel(modelId);
+ Model model = repositoryService.createModelQuery().modelId(modelId).modelTenantId(LoginHelper.getTenantId()).singleResult();
ObjectMapper objectMapper = JsonUtils.getObjectMapper();
ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
modelJson.put(MODEL_NAME, values.getFirst("name"));
modelJson.put(MODEL_DESCRIPTION, values.getFirst("description"));
+ modelJson.put(MODEL_REVISION, model.getVersion() + 1);
model.setMetaInfo(modelJson.toString());
model.setName(values.getFirst("name"));
// 每次保存把版本更新+1
model.setVersion(model.getVersion() + 1);
// 获取唯一标识key
- String key = objectMapper.readTree(values.getFirst("json_xml")).get("properties").get("process_id").textValue();
+ String key = values.getFirst("key");
+ List list = repositoryService.createModelQuery().modelKey(key).modelTenantId(LoginHelper.getTenantId()).list();
+ List modelList = list.stream().filter(e -> !e.getId().equals(model.getId())).collect(Collectors.toList());
+ if (CollectionUtil.isNotEmpty(modelList)) {
+ throw new ServiceException("模型key已存在!");
+ }
model.setKey(key);
-
-
repositoryService.saveModel(model);
byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(values.getFirst("json_xml")).getBytes(StandardCharsets.UTF_8));
-
+ if (ArrayUtil.isEmpty(xmlBytes)) {
+ throw new ServiceException("模型不能为空!");
+ }
repositoryService.addModelEditorSource(model.getId(), xmlBytes);
/*InputStream svgStream = new ByteArrayInputStream(values.getFirst("svg_xml").getBytes(StandardCharsets.UTF_8));
From 1ce0e61aba99fbd104e6a8864d299741fea46eb1 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: Sun, 4 Jun 2023 14:15:06 +0800
Subject: [PATCH 006/159] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=BB=E5=9B=BE?=
=?UTF-8?q?=E8=B4=A6=E6=88=B7=E7=99=BB=E5=BD=95=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../workflow/controller/ActModelController.java | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
index a537318b5..512ad58b5 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
@@ -10,6 +10,7 @@ import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.workflow.domain.bo.ModelBo;
import org.dromara.workflow.domain.vo.AccountVo;
@@ -21,6 +22,8 @@ import org.springframework.util.MultiValueMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import java.util.Objects;
+
/**
* 模型管理 控制层
*
@@ -48,12 +51,11 @@ public class ActModelController extends BaseController {
*/
@GetMapping("/rest/account")
public String getAccount() {
-
AccountVo accountVo = new AccountVo();
- accountVo.setId("admin");
+ accountVo.setId(Objects.requireNonNull(LoginHelper.getUserId()).toString());
accountVo.setFirstName("");
- accountVo.setLastName("admin");
- accountVo.setFullName("admin");
+ accountVo.setLastName(LoginHelper.getUsername());
+ accountVo.setFullName(LoginHelper.getUsername());
return JsonUtils.toJsonString(accountVo);
}
@@ -88,7 +90,7 @@ public class ActModelController extends BaseController {
@Log(title = "模型管理", businessType = BusinessType.UPDATE)
@PostMapping(value = "/rest/models/{modelId}/editor/json")
public R editModel(@PathVariable String modelId, @RequestParam MultiValueMap values) {
- return toAjax(iActModelService.editModel(modelId,values));
+ return toAjax(iActModelService.editModel(modelId, values));
}
/**
From 3a5e34acc7497db30b0ba1d5af806f3c5d109d36 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: Sun, 4 Jun 2023 18:03:40 +0800
Subject: [PATCH 007/159] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B?=
=?UTF-8?q?=E9=83=A8=E7=BD=B2=EF=BC=8C=E5=AF=BC=E5=87=BA=E6=A8=A1=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../{domain/bo => common}/PageEntity.java | 2 +-
.../common/constant/FlowConstant.java | 16 +++
.../controller/ActModelController.java | 31 ++++-
.../dromara/workflow/domain/bo/ModelBo.java | 1 +
.../workflow/service/IActModelService.java | 17 +++
.../service/impl/ActModelServiceImpl.java | 121 +++++++++++++++---
6 files changed, 165 insertions(+), 23 deletions(-)
rename ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/{domain/bo => common}/PageEntity.java (93%)
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/PageEntity.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java
similarity index 93%
rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/PageEntity.java
rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java
index 10b3236ff..f62a66ebc 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/PageEntity.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java
@@ -1,4 +1,4 @@
-package org.dromara.workflow.domain.bo;
+package org.dromara.workflow.common;
/**
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
new file mode 100644
index 000000000..e69e4e79a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
@@ -0,0 +1,16 @@
+package org.dromara.workflow.common.constant;
+
+
+/**
+ * 工作流常量
+ *
+ * @author may
+ */
+public interface FlowConstant {
+
+ /**
+ * 命名空间
+ */
+ String NAMESPACE = "http://b3mn.org/stencilset/bpmn2.0#";
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
index 512ad58b5..06b750a0c 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
@@ -1,6 +1,8 @@
package org.dromara.workflow.controller;
import com.fasterxml.jackson.databind.node.ObjectNode;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
@@ -46,8 +48,7 @@ public class ActModelController extends BaseController {
}
/**
- * 参考官方提供的响应数据
- * "{\"id\":\"admin\",\"firstName\":\"Test\",\"lastName\":\"Administrator\",\"email\":\"admin@flowable.org\",\"fullName\":\"Test Administrator\",\"groups\":[],\"privileges\":[\"access-idm\",\"access-rest-api\",\"access-task\",\"access-modeler\",\"access-admin\"]}";
+ * 设计器登录信息
*/
@GetMapping("/rest/account")
public String getAccount() {
@@ -65,6 +66,7 @@ public class ActModelController extends BaseController {
* @param modelBo 模型请求对象
*/
@Log(title = "模型管理", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
@PostMapping("/rest/models")
public R saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) {
return toAjax(iActModelService.saveNewModel(modelBo));
@@ -88,6 +90,7 @@ public class ActModelController extends BaseController {
* @param values 模型数据
*/
@Log(title = "模型管理", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
@PostMapping(value = "/rest/models/{modelId}/editor/json")
public R editModel(@PathVariable String modelId, @RequestParam MultiValueMap values) {
return toAjax(iActModelService.editModel(modelId, values));
@@ -109,4 +112,28 @@ public class ActModelController extends BaseController {
return R.ok();
}
+ /**
+ * 模型部署
+ *
+ * @param id 模型id
+ */
+ @Log(title = "模型管理", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping("/modelDeploy/{id}")
+ public R deploy(@NotBlank(message = "模型id不能为空") @PathVariable("id") String id) {
+ return toAjax(iActModelService.modelDeploy(id));
+ }
+
+ /**
+ * 导出模型zip压缩包
+ *
+ * @param modelId 模型id
+ * @param response 相应
+ */
+ @GetMapping("/export/zip/{modelId}")
+ public void exportZip(@NotEmpty(message = "模型id不能为空") @PathVariable String modelId,
+ HttpServletResponse response) {
+ iActModelService.exportZip(modelId, response);
+ }
+
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java
index 0a5ca15bb..b89d78a2c 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ModelBo.java
@@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
+import org.dromara.workflow.common.PageEntity;
import java.io.Serial;
import java.io.Serializable;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java
index 1e74a5331..bf9543c14 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActModelService.java
@@ -1,6 +1,7 @@
package org.dromara.workflow.service;
import com.fasterxml.jackson.databind.node.ObjectNode;
+import jakarta.servlet.http.HttpServletResponse;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.workflow.domain.bo.ModelBo;
import org.flowable.engine.repository.Model;
@@ -44,4 +45,20 @@ public interface IActModelService {
* @return 结果
*/
boolean editModel(String modelId, MultiValueMap values);
+
+ /**
+ * 模型部署
+ *
+ * @param id 模型id
+ * @return 结果
+ */
+ boolean modelDeploy(String id);
+
+ /**
+ * 导出模型zip压缩包
+ *
+ * @param modelId 模型id
+ * @param response 相应
+ */
+ void exportZip(String modelId, HttpServletResponse response);
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
index 1c9316d14..020aaa1a3 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
@@ -5,9 +5,11 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.dromara.common.core.exception.ServiceException;
@@ -22,6 +24,7 @@ import org.flowable.bpmn.model.BpmnModel;
import org.flowable.editor.constants.ModelDataJsonConstants;
import org.flowable.editor.language.json.converter.BpmnJsonConverter;
import org.flowable.engine.RepositoryService;
+import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ModelQuery;
import org.springframework.stereotype.Service;
@@ -31,11 +34,15 @@ import org.springframework.util.MultiValueMap;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;
-import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import static org.dromara.workflow.common.constant.FlowConstant.NAMESPACE;
import static org.flowable.editor.constants.ModelDataJsonConstants.*;
/**
@@ -118,11 +125,10 @@ public class ActModelServiceImpl implements IActModelService {
model.setMetaInfo(objectNode.toString());
// 保存初始化的模型基本信息数据
repositoryService.saveModel(model);
- String namespace = "http://b3mn.org/stencilset/bpmn2.0#";
// 封装模型对象基础数据json串
ObjectNode editorNode = objectMapper.createObjectNode();
ObjectNode stencilSetNode = objectMapper.createObjectNode();
- stencilSetNode.put("namespace", namespace);
+ stencilSetNode.put("namespace", NAMESPACE);
editorNode.replace("stencilset", stencilSetNode);
// 标识key
ObjectNode propertiesNode = objectMapper.createObjectNode();
@@ -206,10 +212,9 @@ public class ActModelServiceImpl implements IActModelService {
// 获取唯一标识key
String key = values.getFirst("key");
List list = repositoryService.createModelQuery().modelKey(key).modelTenantId(LoginHelper.getTenantId()).list();
- List modelList = list.stream().filter(e -> !e.getId().equals(model.getId())).collect(Collectors.toList());
- if (CollectionUtil.isNotEmpty(modelList)) {
+ list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> {
throw new ServiceException("模型key已存在!");
- }
+ });
model.setKey(key);
repositoryService.saveModel(model);
byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(values.getFirst("json_xml")).getBytes(StandardCharsets.UTF_8));
@@ -217,24 +222,100 @@ public class ActModelServiceImpl implements IActModelService {
throw new ServiceException("模型不能为空!");
}
repositoryService.addModelEditorSource(model.getId(), xmlBytes);
-
- /*InputStream svgStream = new ByteArrayInputStream(values.getFirst("svg_xml").getBytes(StandardCharsets.UTF_8));
- TranscoderInput input = new TranscoderInput(svgStream);
-
- PNGTranscoder transcoder = new PNGTranscoder();
- // Setup output
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- TranscoderOutput output = new TranscoderOutput(outStream);
-
- // Do the transformation
- transcoder.transcode(input, output);
- final byte[] result = outStream.toByteArray();
- repositoryService.addModelEditorSourceExtra(model.getId(), result);
- outStream.close();*/
return true;
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException(e.getMessage());
}
}
+
+ /**
+ * 模型部署
+ *
+ * @param id 模型id
+ * @return 结果
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean modelDeploy(String id) {
+ try {
+ //查询流程定义模型xml
+ byte[] xmlBytes = repositoryService.getModelEditorSource(id);
+ if (ArrayUtil.isEmpty(xmlBytes)) {
+ throw new ServiceException("模型数据为空,请先设计流程定义模型,再进行部署!");
+ }
+ // 查询模型的基本信息
+ Model model = repositoryService.getModel(id);
+ // xml资源的名称 ,对应act_ge_bytearray表中的name_字段
+ String processName = model.getName() + ".bpmn20.xml";
+ //调用部署相关的api方法进行部署流程定义
+ Deployment deployment = repositoryService.createDeployment()
+ // 部署名称
+ .name(model.getName())
+ // 部署标识key
+ .key(model.getKey())
+ // 部署流程分类
+ .category(model.getCategory())
+ // bpmn20.xml资源
+ .addBytes(processName, xmlBytes)
+ // 租户id
+ .tenantId(LoginHelper.getTenantId())
+ .deploy();
+
+ // 更新 部署id 到流程定义模型数据表中
+ model.setDeploymentId(deployment.getId());
+ repositoryService.saveModel(model);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new ServiceException(e.getMessage());
+ }
+ }
+
+ /**
+ * 导出模型zip压缩包
+ *
+ * @param modelId 模型id
+ * @param response 相应
+ */
+ @Override
+ public void exportZip(String modelId, HttpServletResponse response) {
+ ZipOutputStream zos = null;
+ try {
+ zos = ZipUtil.getZipOutputStream(response.getOutputStream(), StandardCharsets.UTF_8);
+ // 压缩包文件名
+ String zipName = "模型不存在";
+ //查询模型基本信息
+ Model model = repositoryService.getModel(modelId);
+ if (ObjectUtil.isNotNull(model)) {
+ // 查询流程定义模型的json字节码
+ byte[] xmlBytes = repositoryService.getModelEditorSource(modelId);
+ if (ArrayUtil.isEmpty(xmlBytes)) {
+ zipName = "模型数据为空,请先设计流程定义模型,再进行部署!";
+ } else {
+ String fileName = model.getName() + "-" + model.getKey();
+ // 压缩包文件名
+ zipName = fileName + ".zip";
+ // 将xml添加到压缩包中(指定xml文件名:请假流程.bpmn20.xml
+ zos.putNextEntry(new ZipEntry(fileName + ".bpmn20.xml"));
+ zos.write(xmlBytes);
+ }
+ }
+ response.setHeader("Content-Disposition",
+ "attachment; filename=" + URLEncoder.encode(zipName, StandardCharsets.UTF_8) + ".zip");
+ // 刷出响应流
+ response.flushBuffer();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (zos != null) {
+ try {
+ zos.closeEntry();
+ zos.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
}
From d1abc3daa53eb3f0d23f27dd025901771ab73dad Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: Sun, 4 Jun 2023 20:18:22 +0800
Subject: [PATCH 008/159] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=81=E7=A8=8B?=
=?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=88=86=E9=A1=B5=EF=BC=8C=E6=9F=A5=E7=9C=8B?=
=?UTF-8?q?=E5=9B=BE=E7=89=87=EF=BC=8C=E6=9F=A5=E7=9C=8Bxml?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/ActModelController.java | 5 +
.../ActProcessDefinitionController.java | 81 +++++++++
.../domain/bo/ProcessDefinitionBo.java | 31 ++++
.../domain/vo/ProcessDefinitionVo.java | 65 +++++++
.../service/IActProcessDefinitionService.java | 48 +++++
.../impl/ActProcessDefinitionServiceImpl.java | 166 ++++++++++++++++++
6 files changed, 396 insertions(+)
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/ProcessDefinitionBo.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessDefinitionService.java
create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
index 06b750a0c..af2545299 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
@@ -42,6 +42,11 @@ public class ActModelController extends BaseController {
private final IActModelService iActModelService;
+ /**
+ * 分页查询模型
+ *
+ * @param modelBo 模型参数
+ */
@GetMapping("/list")
public TableDataInfo getByPage(ModelBo modelBo) {
return iActModelService.getByPage(modelBo);
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java
new file mode 100644
index 000000000..b83203d83
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java
@@ -0,0 +1,81 @@
+package org.dromara.workflow.controller;
+
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.workflow.domain.bo.ProcessDefinitionBo;
+import org.dromara.workflow.domain.vo.ProcessDefinitionVo;
+import org.dromara.workflow.service.IActProcessDefinitionService;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+
+/**
+ * 流程定义管理 控制层
+ *
+ * @author may
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/processDefinition")
+public class ActProcessDefinitionController extends BaseController {
+
+ private final IActProcessDefinitionService iActProcessDefinitionService;
+
+ /**
+ * 分页查询
+ *
+ * @param processDefinitionBo 参数
+ */
+ @GetMapping("/list")
+ public TableDataInfo getByPage(ProcessDefinitionBo processDefinitionBo) {
+ return iActProcessDefinitionService.getByPage(processDefinitionBo);
+ }
+
+ /**
+ * 查询历史流程定义列表
+ *
+ * @param key 流程定义key
+ */
+ @GetMapping("/getProcessDefinitionListByKey/{key}")
+ public R> getProcessDefinitionList(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) {
+ return R.ok("操作成功", iActProcessDefinitionService.getProcessDefinitionListByKey(key));
+ }
+
+ /**
+ * 查看流程定义图片
+ *
+ * @param processDefinitionId 流程定义id
+ * @param response 响应
+ */
+ @GetMapping("/processDefinitionImage/{processDefinitionId}")
+ public void processDefinitionImage(@PathVariable String processDefinitionId, HttpServletResponse response) {
+ iActProcessDefinitionService.processDefinitionImage(processDefinitionId, response);
+ }
+
+ /**
+ * 查看流程定义xml文件
+ *
+ * @param processDefinitionId 流程定义id
+ */
+ @GetMapping("/processDefinitionXml/{processDefinitionId}")
+ public R